pax_global_header00006660000000000000000000000064126420475360014523gustar00rootroot0000000000000052 comment=c869cf4d23235e0f6d3bf01e562003de601a5f48 navit-0.5.0+dfsg.1/000077500000000000000000000000001264204753600137245ustar00rootroot00000000000000navit-0.5.0+dfsg.1/.gitignore000066400000000000000000000000431264204753600157110ustar00rootroot00000000000000/.gitk-tmp.* /CMakeLists.txt.user* navit-0.5.0+dfsg.1/AUTHORS000066400000000000000000000005221264204753600147730ustar00rootroot00000000000000Michael Farmbauer Martin Schaller Pierre Grandin Alexander Atanasov And all the Navit Team members and contributors. See http://wiki.navit-project.org/index.php/Navit_project_members_and_contributors for the full list! navit-0.5.0+dfsg.1/CMakeLists.txt000077500000000000000000000705061264204753600164770ustar00rootroot00000000000000set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.navitproject.navit") set(MACOSX_BUNDLE_BUNDLE_NAME "Navit") message(STATUS "Building with CMake V${CMAKE_VERSION}") project(navit C) # Workaround for CMake issue 8345 / 9220, see http://trac.navit-project.org/ticket/1041 if(DEFINED CMAKE_CXX_COMPILER AND CMAKE_CXX_COMPILER MATCHES "^$") set(CMAKE_CXX_COMPILER CMAKE_CXX_COMPILER-NOTFOUND) endif(DEFINED CMAKE_CXX_COMPILER AND CMAKE_CXX_COMPILER MATCHES "^$") if (NOT DISABLE_CXX) enable_language(CXX OPTIONAL) endif(NOT DISABLE_CXX) cmake_minimum_required(VERSION 2.6 FATAL_ERROR) set(NAVIT_VERSION_MAJOR "0") set(NAVIT_VERSION_MINOR "5") set(NAVIT_VERSION_PATCH "0") set(PACKAGE_VERSION "${NAVIT_VERSION_MAJOR}.${NAVIT_VERSION_MINOR}.${NAVIT_VERSION_PATCH}") set(PACKAGE_NAME "navit-git") set(PACKAGE "navit") set(PACKAGE_STRING "${PACKAGE} ${PACKAGE_VERSION}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") include("${PROJECT_SOURCE_DIR}/cmake/navit_macros.cmake") IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) # install path set(BIN_DIR bin) set(SHARE_DIR share/navit) set(LOCALE_DIR share/locale) set(IMAGE_DIR share/navit/xpm) set(MAN_DIR share/man/man1) # LIB_DIR IF(UNIX AND NOT ANDROID AND NOT APPLE) IF (NOT LIBDIR) MESSAGE(STATUS "LIBDIR variable is not defined. It will be autodetected now.") MESSAGE(STATUS "You can set it manually with -DLIBDIR=") # check 64 bit IF (CMAKE_SIZEOF_VOID_P EQUAL 4) SET(LIB_DIR lib) MESSAGE(STATUS " LIB_DIR (highest subdirectory if LIBDIR) is set to '${LIB_DIR}'") ELSE (CMAKE_SIZEOF_VOID_P EQUAL 4) SET(LIB_DIR lib64) MESSAGE(STATUS " LIB_DIR (highest subdirectory if LIBDIR) is set to '${LIB_DIR}'") ENDIF (CMAKE_SIZEOF_VOID_P EQUAL 4) ELSE (NOT LIBDIR) GET_FILENAME_COMPONENT (LIB_DIR ${LIBDIR} NAME) MESSAGE(STATUS " LIB_DIR (highest subdirectory if LIBDIR) is set to '${LIB_DIR}'") ENDIF (NOT LIBDIR) ELSE (UNIX AND NOT ANDROID AND NOT APPLE) SET(LIB_DIR lib) ENDIF (UNIX AND NOT ANDROID AND NOT APPLE) foreach(EXTRA_MODULE ${EXTRA_MODULES}) add_module(${EXTRA_MODULE} "extra module specified" TRUE) endforeach() if (EXTRA_LIBS) list(APPEND NAVIT_LIBS ${EXTRA_LIBS}) endif(EXTRA_LIBS) if (EXTRA_INCLUDES) include_directories(${EXTRA_INCLUDES}) endif(EXTRA_INCLUDES) if (EXTRA_LIBDIR) link_directories(${EXTRA_LIBDIR}) endif(EXTRA_LIBDIR) ### Detect environment add_plugin(support/ezxml "native Glib found" FALSE) add_plugin(support/glib "native Glib found" FALSE) add_plugin(support/zlib "native zlib found" FALSE) add_plugin(support/libpng "native libpng found" FALSE) add_plugin(support/wordexp "native wordexp found" FALSE) add_plugin(support/gettext_intl "native libintl found" FALSE) add_module(font/freetype "freetype not found" FALSE) add_module(graphics/android "FreeType library not found" FALSE) add_module(graphics/gd "FreeType library not found" FALSE) add_module(graphics/gtk_drawing_area "FreeType library not found" FALSE) add_module(graphics/opengl "FreeType library not found" FALSE) add_module(graphics/sdl "Required library not found" FALSE) add_module(graphics/qt_qpainter "Qt libraries not found" FALSE) add_module(gui/qml "Qt Declarative not found" FALSE) add_module(gui/gtk "GTK libs not found" FALSE) add_module(vehicle/gpsd "gpsd lib not found" FALSE) add_module(vehicle/gypsy "gypsy lib not found" FALSE) add_module(vehicle/maemo "Default" FALSE) add_module(binding/win32 "Default" FALSE) add_module(binding/dbus "dbus-glib-1 not found" FALSE) add_module(binding/python "python libraries not found" FALSE) add_module(speech/dbus "dbus-glib-1 not found" FALSE) add_module(speech/cmdline "neither system() nor CreateProcess() found" FALSE) add_module(vehicle/gpsd_dbus "dbus-glib-1 not found" FALSE) add_module(speech/speech_dispatcher "speech_dispatcher lib not found" FALSE) add_module(autoload/osso "Default" FALSE) add_module(map/garmin "Garmin library not found" FALSE) add_feature(USE_NATIVE_LANGUAGE_SUPPORT "Gettext not found and not on Windows" FALSE) set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_SOURCE_DIR}/cpack.cmake") set(CPACK_PACKAGE_VENDOR "Navit team") set(CPACK_PACKAGE_VERSION_MAJOR ${NAVIT_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${NAVIT_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH "${NAVIT_VERSION_PATCH}") set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/GPL-2") set(CPACK_NSIS_PACKAGE_NAME "Navit ${PACKAGE_VERSION}") set(CPACK_PACKAGE_FILE_NAME ${PACKAGE}) set(CPACK_PACKAGE_EXECUTABLES "navit;Navit") set(CPACK_NSIS_HELP_LINK "http://www.navit-project.org/?page=contact") set(CPACK_NSIS_URL_INFO_ABOUT "http://www.navit-project.org") if(WIN32) add_feature(USE_NSIS "makensis not found" FALSE) FIND_PROGRAM(NSIS_EXECUTABLE NAMES makensis makensis.exe) if(NSIS_EXECUTABLE) set_with_reason(USE_NSIS "makensis found" TRUE) endif(NSIS_EXECUTABLE) set(CPACK_GENERATOR ZIP) if(USE_NSIS) list(APPEND CPACK_GENERATOR NSIS) endif(USE_NSIS) set(CPACK_PACKAGE_INSTALL_DIRECTORY Navit) endif(WIN32) INCLUDE (CPack) INCLUDE (CheckIncludeFiles) INCLUDE (CheckLibraryExists) INCLUDE (CheckFunctionExists) INCLUDE (CheckSymbolExists) find_package(Glib) find_package(Gmodule) find_package(ZLIB) find_package(Freetype) find_package(SDL) find_package(SDL_ttf) find_package(SDL_image) find_package(OpenGL) find_package(GLUT) find_package(GTK2 2.6 COMPONENTS gtk) find_package(Gettext) find_package(PNG) find_package(DBusGLib) find_package(PythonLibs) find_package(OpenSSL) find_package(Threads) libfind_pkg_check_modules(FONTCONFIG fontconfig) #Qt detection if (NOT DISABLE_QT) # Unfortunately, CMake seems to ignore the "OPTIONAL_COMPONENTS" flag, # and actually requires all components to be installed. Maybe this can # be fixed later... find_package(Qt4 4.7 COMPONENTS QtCore OPTIONAL_COMPONENTS QtGui QtXml QtDeclarative QtSvg) endif (NOT DISABLE_QT) #pkg-config based detection find_package(PkgConfig) if(PKG_CONFIG_FOUND) pkg_check_modules(LIBLOCATION liblocation) pkg_check_modules(LIBOSSO libosso) # Accept even old versions of libgps, because N810 uses an old version (see #1179). pkg_check_modules(LIBGPS libgps) pkg_check_modules(LIBGPS19 libgps>=2.90) # libgpsd=3.1) pkg_check_modules(LIBGARMIN libgarmin) pkg_check_modules(IMLIB2 imlib2) if(IMLIB2_FOUND) set(HAVE_IMLIB2 1) endif(IMLIB2_FOUND) endif(PKG_CONFIG_FOUND) #Simple checks CHECK_INCLUDE_FILES(wordexp.h HAVE_WORDEXP) CHECK_INCLUDE_FILES(endian.h HAVE_ENDIAN_H) CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H) CHECK_INCLUDE_FILES(byteswap.h HAVE_BYTESWAP_H) CHECK_LIBRARY_EXISTS(gypsy gypsy_control_get_default "" GYPSY_FOUND) CHECK_INCLUDE_FILES(libspeechd.h HAVE_LIBSPEECHD) CHECK_INCLUDE_FILES(sys/socket.h HAVE_SOCKET) CHECK_INCLUDE_FILES(sys/shm.h HAVE_SHMEM) CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF) if (NOT HAVE_SNPRINTF) CHECK_FUNCTION_EXISTS(_snprintf HAVE_DECL__SNPRINTF) if (HAVE_DECL__SNPRINTF) set(HAVE_SNPRINTF 1) endif(HAVE_DECL__SNPRINTF) endif(NOT HAVE_SNPRINTF) CHECK_INCLUDE_FILES(locale.h HAVE_LC_MESSAGES) CHECK_INCLUDE_FILES(libintl.h HAVE_LIBINTL) CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H) CHECK_INCLUDE_FILES(getopt.h HAVE_GETOPT_H) CHECK_INCLUDE_FILES(string.h HAVE_STRING_H) CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) CHECK_SYMBOL_EXISTS(system stdlib.h HAVE_SYSTEM) CHECK_SYMBOL_EXISTS(CreateProcess windows.h HAVE_CREATEPROCESS) CHECK_SYMBOL_EXISTS(stpcpy string.h HAVE_STPCPY) CHECK_FUNCTION_EXISTS(sbrk HAVE_SBRK) CHECK_FUNCTION_EXISTS(getdelim HAVE_GETDELIM) CHECK_FUNCTION_EXISTS(getline HAVE_GETLINE) CHECK_FUNCTION_EXISTS(fsync HAVE_FSYNC) ### Configure build #Required libraries, supplied with navit if (NOT HAVE_LIBINTL) set_with_reason(support/gettext_intl "native libintl missing" TRUE) set(USE_LIBGNUINTL TRUE) else() CHECK_LIBRARY_EXISTS(intl libintl_fprintf "" NEEDS_LIBINTL) if (NEEDS_LIBINTL) list(APPEND NAVIT_LIBS intl) set(INTL_LIBS intl) endif(NEEDS_LIBINTL) endif(NOT HAVE_LIBINTL) if (CMAKE_USE_PTHREADS_INIT) if (NOT ANDROID) list(APPEND NAVIT_LIBS pthread) endif(NOT ANDROID) endif(CMAKE_USE_PTHREADS_INIT) if (Glib_FOUND) set(HAVE_GLIB 1) include_directories(${Glib_INCLUDE_DIRS}) list(APPEND NAVIT_LIBS ${Glib_LIBRARIES}) else(Glib_FOUND) set_with_reason(support/glib "Glib not found" TRUE ${INTL_LIBS}) endif(Glib_FOUND) if (Gmodule_FOUND) set(HAVE_GMODULE 1) include_directories(${Gmodule_INCLUDE_DIRS}) list(APPEND NAVIT_LIBS ${Gmodule_LIBRARIES}) endif(Gmodule_FOUND) if(ZLIB_FOUND) set(HAVE_ZLIB 1) include_directories(${ZLIB_INCLUDE_DIRS}) list(APPEND NAVIT_LIBS ${ZLIB_LIBRARIES}) else(ZLIB_FOUND) message(STATUS "using internal zlib") set_with_reason(support/zlib "native zlib missing" TRUE) endif(ZLIB_FOUND) if(OPENSSL_CRYPTO_LIBRARIES) set(HAVE_LIBCRYPTO 1) include_directories(${OPENSSL_INCLUDE_DIR}) list(APPEND NAVIT_LIBS ${OPENSSL_CRYPTO_LIBRARIES}) endif() if(PNG_FOUND) set(HAVE_PNG 1) include_directories(${PNG_INCLUDE_DIR}) list(APPEND NAVIT_LIBS ${PNG_LIBRARIES}) else(PNG_FOUND) message(STATUS "using internal libpng") set_with_reason(support/libpng "native libpng missing" TRUE) endif(PNG_FOUND) if (NOT HAVE_WORDEXP) message(STATUS "wordexp.h not found. use internal wordexp") set_with_reason(support/wordexp "native wordexp missing" TRUE) endif() if (NOT Glib_FOUND) set_with_reason(support/ezxml "Glib not found" TRUE) endif() if(FREETYPE_FOUND) pkg_check_modules(FRIBIDI fribidi) pkg_check_modules(FRIBIDI2 fribidi>=0.19.0) include_directories(${FREETYPE_INCLUDE_DIRS}) set_with_reason(font/freetype "freetype found" TRUE "${FREETYPE_LIBRARY};${FONTCONFIG_LDFLAGS};${FRIBIDI_LIBRARIES}") else(FREETYPE_FOUND) MESSAGE("No freetype library found, graphics modules may not be available") set_with_reason(graphics/android "FreeType library not found" FALSE) set_with_reason(graphics/gd "FreeType library not found" FALSE) set_with_reason(graphics/gtk_drawing_area "FreeType library not found" FALSE) set_with_reason(graphics/opengl "FreeType library not found" FALSE) set_with_reason(graphics/sdl "FreeType library not found" FALSE) endif(FREETYPE_FOUND) if(FONTCONFIG_FOUND) set(HAVE_FONTCONFIG 1) endif(FONTCONFIG_FOUND) if (QT_FOUND) if (QT_QTCORE_FOUND AND QT_QTGUI_FOUND AND FREETYPE_FOUND) include(${QT_USE_FILE}) set_with_reason(graphics/qt_qpainter "Qt libraries found" TRUE ${QT_LIBRARIES}) if (QT_QTDECLARATIVE_FOUND AND QT_QTXML_FOUND) set_with_reason(gui/qml "Qt Declarative found" TRUE ${QT_LIBRARIES}) endif() if (QT_QTSVG_FOUND) set(HAVE_QT_SVG 1) elseif( USE_SVG AND graphics/qt_qpainter) message( WARNING "QT compiled without SVG support") endif() endif() endif(QT_FOUND) if(GTK2_FOUND) # Include gtk.h with "SYSTEM" to avoid GCC compiler warning for gtkitemfactory.h. include_directories(SYSTEM ${GTK2_GTK_INCLUDE_DIR}) include_directories(${GTK2_INCLUDE_DIRS}) set(HAVE_GTK2 1) set_with_reason(gui/gtk "GTK libs found" TRUE ${GTK2_LIBRARIES}) if(FREETYPE_FOUND) set_with_reason(graphics/gtk_drawing_area "GTK libs found" TRUE ${GTK2_LIBRARIES}) endif(FREETYPE_FOUND) endif(GTK2_FOUND) CHECK_LIBRARY_EXISTS(freeimage FreeImage_Load "" HAVE_FREEIMAGE) if (USE_OPENGLES OR USE_OPENGLES2) CHECK_LIBRARY_EXISTS(EGL eglInitialize "" HAVE_EGL) endif(USE_OPENGLES OR USE_OPENGLES2) if (FREETYPE_FOUND) if (OPENGL_FOUND AND OPENGL_GLU_FOUND AND GLUT_FOUND AND OPENGL_INCLUDE_DIR) message (STATUS "opengl found: ${OPENGL_gl_LIBRARY}") include_directories(${OPENGL_INCLUDE_DIR}) if (USE_OPENGLES2) set(USE_OPENGLES TRUE) set(GRAPHICS_OPENGL_LIBRARY GLESv2 EGL) elseif (USE_OPENGLES) set(GRAPHICS_OPENGL_LIBRARY GLESv1_CM EGL) else() set(GRAPHICS_OPENGL_LIBRARY ${OPENGL_gl_LIBRARY};${OPENGL_glu_LIBRARY};${GLUT_glut_LIBRARY}) endif(USE_OPENGLES2) if (HAVE_FREEIMAGE) list(APPEND GRAPHICS_OPENGL_LIBRARY freeimage) endif(HAVE_FREEIMAGE) set_with_reason(graphics/opengl "Found OpenGL" TRUE ${GRAPHICS_OPENGL_LIBRARY}) else() message (STATUS "opengl not found") endif() else() message (STATUS "no Freetype found") endif(FREETYPE_FOUND) if(SDL_FOUND AND SDLIMAGE_FOUND AND FREETYPE_FOUND) set(SDL_IMAGE 1) if(SDLTTF_FOUND) set(SDL_TTF 1) list(APPEND SDL_LIBRARY ${SDLTTF_LIBRARY}) else(SDLTTF_FOUND) list(APPEND SDL_LIBRARY ${FREETYPE_LIBRARY}) endif(SDLTTF_FOUND) set_with_reason(graphics/sdl "SDL/SDL_image libs found" TRUE ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY}) endif(SDL_FOUND AND SDLIMAGE_FOUND AND FREETYPE_FOUND) if (LIBGPS_FOUND) if (LIBGPS_NEW_FOUND) set(VEHICLE_GPSD_REASON "gpsd lib found") else(LIBGPS_NEW_FOUND) set(VEHICLE_GPSD_REASON "WARNING: old gpsd lib found, buggy if LC_ALL is set") endif(LIBGPS_NEW_FOUND) set_with_reason(vehicle/gpsd ${VEHICLE_GPSD_REASON} TRUE ${LIBGPS_LDFLAGS}) endif(LIBGPS_FOUND) if (GYPSY_FOUND) set_with_reason(vehicle/gypsy "gypsy lib found" TRUE) endif(GYPSY_FOUND) if (LIBGARMIN_FOUND) include_directories(${LIBGARMIN_INCLUDE_DIRS}) set_with_reason(map/garmin "Garmin library found" TRUE ${LIBGARMIN_LDFLAGS}) endif(LIBGARMIN_FOUND) if(DBusGLib_FOUND) include_directories(${DBusGLib_INCLUDE_DIRS}) set_with_reason(binding/dbus "dbus-glib-1 found" TRUE ${DBusGLib_LIBRARIES}) set_with_reason(speech/dbus "dbus-glib-1 found" TRUE ${DBusGLib_LIBRARIES}) set_with_reason(vehicle/gpsd_dbus "dbus-glib-1 found" TRUE ${DBusGLib_LIBRARIES}) endif() if(PYTHONLIBS_FOUND) set_with_reason(binding/python "python libraries [${PYTHONLIBS_VERSION_STRING}] found" TRUE ${PYTHON_LIBRARIES}) endif() if (HAVE_LIBSPEECHD) set_with_reason(speech/speech_dispatcher "speech_dispatcher lib found" TRUE speechd) endif(HAVE_LIBSPEECHD) if (HAVE_SYSTEM) set_with_reason(speech/cmdline "system() call is available" TRUE) endif(HAVE_SYSTEM) if (HAVE_CREATEPROCESS) set_with_reason(speech/cmdline "CreateProcess() call is available" TRUE) endif(HAVE_CREATEPROCESS) if (LIBLOCATION_FOUND) set_with_reason(vehicle/maemo "Maemo location library found" TRUE ${LIBLOCATION_LIBRARIES}) endif(LIBLOCATION_FOUND) if (LIBOSSO_FOUND) set_with_reason(autoload/osso "Maemo osso library found" TRUE ${LIBOSSO_LIBRARIES}) endif(LIBOSSO_FOUND) if (GETTEXT_FOUND) set_with_reason(USE_NATIVE_LANGUAGE_SUPPORT "Gettext found" TRUE) endif(GETTEXT_FOUND) #Independent modules add_module(graphics/null "Default" TRUE) add_module(osd/core "Default" TRUE) add_module(vehicle/demo "Default" TRUE) add_module(vehicle/file "Default" TRUE) add_module(vehicle/null "Default" FALSE) add_module(gui/internal "Default" TRUE) add_module(map/binfile "Default" TRUE) add_module(map/filter "Default" TRUE) if(NOT MSVC) add_module(map/mg "Default" TRUE) endif(NOT MSVC) add_module_plugin(support/shapefile "Default" TRUE) set(map_shapefile_INCLUDES "${CMAKE_SOURCE_DIR}/navit/support/shapefile") #set(map_shapefile_LIBRARY_DIRS "${CMAKE_BINARY_DIR}/navit/support/shapefile") set(map_shapefile_LIBS "support_shapefile") add_module(map/shapefile "Default" TRUE) add_module(map/textfile "Default" TRUE) add_module(map/csv "Default" TRUE) #Modules without test yet add_module(plugin/pedestrian "Default" FALSE) add_module(plugin/j1850 "Default" FALSE) add_module(speech/android "Default" FALSE) add_module(speech/espeak "Default" FALSE) add_module(speech/iphone "Default" FALSE) add_plugin(support/espeak "Default" FALSE) add_module(vehicle/android "Default" FALSE) add_module(vehicle/iphone "Default" FALSE) add_module(vehicle/wince "Default" FALSE) add_module(graphics/cocoa "Default" FALSE) # other features add_feature(USE_PLUGINS "default" TRUE) add_feature(USE_ROUTING "default" TRUE) add_feature(USE_SVG "default" TRUE) add_feature(SVG2PNG "default" TRUE) add_feature(SAMPLE_MAP "default" TRUE) IF(NOT svg2png_scaling) IF(NOT ANDROID) set(svg2png_scaling 0 16 32 48 64 96) ELSE() set(svg2png_scaling -1 24 32 48 64 96 128) ENDIF() ENDIF() IF(NOT svg2png_scaling_flag) IF(NOT ANDROID) set(svg2png_scaling_flag 32) ELSE() set(svg2png_scaling_flag -1 24 32 64 96) ENDIF() ENDIF() IF(NOT svg2png_scaling_nav) IF(NOT ANDROID) set(svg2png_scaling_nav 64) ELSE() set(svg2png_scaling_nav -1 24 32 48 64 96 128) ENDIF() ENDIF() add_feature(DBUS_USE_SYSTEM_BUS "default" FALSE) add_feature(BUILD_MAPTOOL "default" TRUE) add_feature(XSL_PROCESSING "default" TRUE) set(SUPPORTED_XSLT_PROCESSORS "saxonb-xslt;saxon;saxon8;saxon-xslt;xsltproc;transform.exe") find_program(XSLT_PROCESSOR NAMES ${SUPPORTED_XSLT_PROCESSORS}) if(XSLT_PROCESSOR) message(STATUS "Found XSLT processor: ${XSLT_PROCESSOR}") execute_process(COMMAND ${XSLT_PROCESSOR} -snone ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test.xml ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test.xslt RESULT_VARIABLE SAXON_ERROR OUTPUT_QUIET ERROR_QUIET) if (NOT SAXON_ERROR) set (XSLT_PROCESSOR_OPTIONS -snone) endif() # additional parameter is passed to the stylesheet processor as transformation parameter macro(compose_xslt_transform_command CMDVAR XSLT_FILE SRC_XML DEST_XML) if(${XSLT_PROCESSOR} MATCHES "xsltproc") set(${CMDVAR} COMMAND ${XSLT_PROCESSOR} ${XSLT_PROCESSOR_OPTIONS} ${XSLT_FILE} ${SRC_XML} >${DEST_XML}) else() set(${CMDVAR} COMMAND ${XSLT_PROCESSOR} ${XSLT_PROCESSOR_OPTIONS} ${SRC_XML} ${XSLT_FILE} ${ARGN} >${DEST_XML}) endif() endmacro() else() cfg_feature(XSL_PROCESSING "Saxon missing" FALSE) endif(XSLT_PROCESSOR) if (NOT XSL_PROCESSING) message(WARNING "No XSLT processor available. You have to configure " "navit.xml yourself, or install an XSLT processor (supported: " "${SUPPORTED_XSLT_PROCESSORS}).") endif() ### Platform specific settings if(NOT CACHE_SIZE) SET(CACHE_SIZE 1048576) endif(NOT CACHE_SIZE) if(WIN32 OR WINCE) SET(CMAKE_EXECUTABLE_SUFFIX ".exe") add_module(graphics/win32 "Windows detected" TRUE) add_plugin(support/win32 "Windows detected" TRUE) SET(CMAKE_RC_COMPILE_OBJECT " -O coff -I ${CMAKE_CURRENT_SOURCE_DIR}/navit/gui/win32/resources -i -o ") set_with_reason(support/ezxml "Windows detected" TRUE) set_with_reason(speech/espeak "Windows detected" TRUE) set_with_reason(support/espeak "Windows detected" TRUE) set_with_reason(binding/win32 "Windows detected" TRUE) # vehicle_file is broken for windows. use vehicle_wince instead # whicle_wince isn't buildable on non-CE windows ssytems # plugins currently not supported on windows set_with_reason(USE_PLUGINS "win32: currently not supported" FALSE) set(HAVE_API_WIN32_BASE 1) set(EZXML_NOMMAP 1) # Image stuff if(NOT graphics/qt_qpainter) set_with_reason(USE_SVG "win32: SVGs currently not supported" FALSE) else(NOT graphics/qt_qpainter) MESSAGE(STATUS "win32: SVGs may not be supported by every available graphics") endif(NOT graphics/qt_qpainter) set(BIN_DIR bin) set(SHARE_DIR ./) set(LOCALE_DIR locale) set(IMAGE_DIR xpm) if(HAVE_GTK2 AND NOT MSVC) #GTK requires special compile flags add_definitions("-mms-bitfields") endif(HAVE_GTK2 AND NOT MSVC) if(MSVC AND support/espeak) add_definitions(-DPLATFORM_WINDOWS) endif(MSVC AND support/espeak) CHECK_LIBRARY_EXISTS(ws2_32 WSAStartup "" HAVE_WINSOCK) if(HAVE_WINSOCK) list(APPEND NAVIT_LIBS ws2_32) else() CHECK_LIBRARY_EXISTS(ws2 WSAStartup "" HAVE_WINSOCK_2) if(HAVE_WINSOCK_2) set(HAVE_WINSOCK 1) list(APPEND NAVIT_LIBS ws2) endif() endif(HAVE_WINSOCK) if(MSVC) set(HAVE_PRAGMA_PACK 1) add_plugin(support/xgetopt "Windows detected" TRUE) endif(MSVC) set_with_reason(USE_NATIVE_LANGUAGE_SUPPORT "Windows detected" TRUE) enable_language(RC) set(XSLTS "windows;${XSLTS}" CACHE STRING "define a semicolon seperated list of XSLTs to process") endif() if (WIN32 AND NOT WINCE) set(HAVE_API_WIN32 1) set(HAVE_STDINT_H 1) list(APPEND NAVIT_LIBS winmm) endif() if(WINCE) add_plugin(support/libc "wince detected" TRUE) set(HAVE_API_WIN32_CE 1) set(BUILD_MAPTOOL FALSE) # mingw32ce since gcc 4.7.0 needs HAVE_PRAGMA_PACK as __attribute__((packed)) is broken, see gcc bug 52991 set(HAVE_PRAGMA_PACK 1) set_with_reason(vehicle/file "wince: currently broken" FALSE) set_with_reason(vehicle/wince "wince detected" TRUE) endif() if (APPLE OR USE_UIKIT) set_with_reason(vehicle/iphone "apple detected" TRUE) set_with_reason(graphics/cocoa "apple detected" TRUE) if (EXISTS "${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks/VoiceServices.framework") set_with_reason(speech/iphone "apple detected" TRUE) endif() set(BUILD_BUNDLE TRUE CACHE BOOLEAN "build an osx bundle") endif() set(LOCALEDIR "${LOCALE_DIR}/locale") find_program(BZCAT NAMES bzcat) if (SAMPLE_MAP) if(CMAKE_CROSSCOMPILING) cfg_feature(SAMPLE_MAP "downloading binary map because of cross compiling" TRUE) set(DOWNLOAD_SAMPLE_MAP TRUE) elseif(NOT BZCAT) cfg_feature(SAMPLE_MAP "downloading binary map because of missing bzcat" TRUE) set(DOWNLOAD_SAMPLE_MAP TRUE) endif(CMAKE_CROSSCOMPILING) endif(SAMPLE_MAP) if(ANDROID) # for android API 3 compatiblity SET(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,/data/data/org.navitproject.navit/lib/") find_program(ANDROID_LOCATION NAMES android android.bat) find_program(ANT_LOCATION NAMES ant) if (NOT ANT_LOCATION) message_error("Could not find ant. Please install ant and add it to the search path.") else() execute_process(COMMAND ${ANT_LOCATION} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake RESULT_VARIABLE ANT_VERSION_OK OUTPUT_QUIET ERROR_QUIET) if(ANT_VERSION_OK GREATER 0) message(WARNING "Old ant version detected. If you need crash reporter, update to at least ant 1.8") endif() endif() if (NOT ANDROID_LOCATION) message_error( "Could not find 'Android SDK and AVD Manager'. Please install the android sdk and add the /tools directory to the search path.") endif() set(XSLTS "android;${XSLTS}" CACHE STRING "define a semicolon seperated list of XSLTs to process") list(APPEND NAVIT_LIBS log) set(HAVE_API_ANDROID 1) set_with_reason(graphics/android "Android detected" TRUE) set_with_reason(speech/android "Android detected" TRUE) set_with_reason(vehicle/android "Android detected" TRUE) set_with_reason(plugin/pedestrian "Android detected" TRUE) set(SHARED_LIBNAVIT TRUE) add_feature(XPM2PNG "Android detected" TRUE) set(NAVIT_COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS} -fPIC") endif(ANDROID) if(FREETYPE_FOUND AND NOT FONTCONFIG_FOUND) add_subdirectory( "${CMAKE_CURRENT_SOURCE_DIR}/navit/fonts") endif() # Image conversion find_program(IMAGE_CONVERTER NAMES convert) execute_process(COMMAND ${IMAGE_CONVERTER} -list format OUTPUT_VARIABLE CONVERT_FORMATS) if(CONVERT_FORMATS MATCHES ".*XPM[ *][ ]*XPM[ ]*r[w-].*") set(IMAGE_CONVERTER_XPM ${IMAGE_CONVERTER}) endif() set(CMAKE_APPBUNDLE_PATH "") if (SVG2PNG) if (NOT IMAGE_CONVERTER_SVGZ) set (SVG_CONVERTER_PROGS rsvg-convert ksvgtopng ksvgtopng4 inkscape) set (CMAKE_FIND_APPBUNDLE "NEVER") find_program(IMAGE_CONVERTER_SVGZ NAMES ${SVG_CONVERTER_PROGS} PATHS /Applications/Inkscape.app/Contents/Resources/bin) if (NOT IMAGE_CONVERTER_SVGZ) if(CONVERT_FORMATS MATCHES ".*[ ]*SVG[ ]*r[w-].*") set(IMAGE_CONVERTER_SVGZ ${IMAGE_CONVERTER}) endif() endif() endif(NOT IMAGE_CONVERTER_SVGZ) if (NOT IMAGE_CONVERTER_SVG) set(IMAGE_CONVERTER_SVG ${IMAGE_CONVERTER_SVGZ}) endif(NOT IMAGE_CONVERTER_SVG) message(STATUS "SVG2PNG-Converter: ${IMAGE_CONVERTER_SVGZ}") if (NOT IMAGE_CONVERTER_SVGZ) message(WARNING "No SVG2PNG converter found. Please install one of the following tools: ${SVG_CONVERTER_PROGS}, or imagemagick with svg support") set_with_reason(SVG2PNG "no converter found" FALSE) endif(NOT IMAGE_CONVERTER_SVGZ) endif(SVG2PNG) if (XPM2PNG) message(STATUS "XPM2PNG-Converter: ${IMAGE_CONVERTER_XPM}") if (NOT IMAGE_CONVERTER_XPM) message(WARNING "No XPM2PNG converter found. Please install imagemagick with xpm support") set_with_reason(XPM2PNG "no converter found" FALSE) endif(NOT IMAGE_CONVERTER_XPM) endif(XPM2PNG) set(XSLTS ${XSLTS} CACHE STRING "define a semicolon seperated list of XSLTs to process") # Plugins if(USE_PLUGINS) set(MODULE_BUILD_TYPE "MODULE") add_definitions("-fPIC") list(APPEND NAVIT_LIBS dl) else() set(MODULE_BUILD_TYPE "STATIC") endif(USE_PLUGINS) message(STATUS "Use plugins: ${MODULE_BUILD_TYPE}") CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H) CHECK_INCLUDE_FILES ("sys/param.h;sys/mount.h" HAVE_SYS_MOUNT_H) CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H) CHECK_FUNCTION_EXISTS (getcwd HAVE_GETCWD) CHECK_FUNCTION_EXISTS (memalign HAVE_MEMALIGN) CHECK_FUNCTION_EXISTS (valloc HAVE_VALLOC) CHECK_FUNCTION_EXISTS (posix_memalign HAVE_POSIX_MEMALIGN) CHECK_FUNCTION_EXISTS (popen HAVE_POPEN) CHECK_FUNCTION_EXISTS (_atoi64 HAVE__ATOI64) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) # Compile with -Wall -Wextra. We need all the help we can get from the compiler :-). # Disabled warnings: # -Wno-missing-field-initializers: Used a lot, does not seem problematic. # -Wno-unused-parameter: Unfortunately occurs frequently because of # functions implementing the interface of a plugin. # -Wno-sign-compare: We currently just use int almost everywhere. # Unclear if it's really worth correcting. if(CMAKE_COMPILER_IS_GNUCC OR CCMAKE_COMPILER_IS_GNUCXX) set(COMMON_COMPILER_FLAGS "-Wall -Wundef -Wcast-align -Wpointer-arith -Wno-unused-parameter -Wno-sign-compare") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILER_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILER_FLAGS}") # flags not available in old GCC versions, or not for both C and C++ add_compiler_flag_if_available("-Wno-missing-field-initializers") add_compiler_flag_if_available("-Wextra") add_compiler_flag_if_available("-Wmissing-prototypes") add_compiler_flag_if_available("-Wstrict-prototypes ") endif() if (EXTRA_DEFINES) add_definitions("${EXTRA_DEFINES}") endif(EXTRA_DEFINES) if (NOT NAVIT_DEPENDENCY_ERROR) message("\nSummary:\n") set(SUMMARY_COMPONENTS ${ALL_PLUGINS} ${ALL_MODULE_PLUGINS} ${ALL_MODULES}) list(SORT SUMMARY_COMPONENTS) set(LAST_TYPE NONE) foreach ( SUMMARY_COMP ${SUMMARY_COMPONENTS}) # split path to type and name string(REPLACE "/" ";" SUMMARY_COMP_LIST ${SUMMARY_COMP}) list(GET SUMMARY_COMP_LIST 0 SUMMARY_COMP_TYPE) list(LENGTH SUMMARY_COMP_LIST SUMMARY_COMP_LIST_LENGTH) if ( SUMMARY_COMP_LIST_LENGTH GREATER 1 ) list(GET SUMMARY_COMP_LIST 1 SUMMARY_COMP_NAME) else() set(SUMMARY_COMP_NAME ${SUMMARY_COMP}) endif() if ( NOT ${LAST_TYPE} STREQUAL ${SUMMARY_COMP_TYPE}) message("\n--->>> ${SUMMARY_COMP_TYPE}") set(LAST_TYPE ${SUMMARY_COMP_TYPE}) endif() if (${SUMMARY_COMP}) message("Enabled ${SUMMARY_COMP_NAME} ( ${${SUMMARY_COMP}_REASON} )") else() message("Disabled ${SUMMARY_COMP_NAME} ( ${${SUMMARY_COMP}_REASON} )") endif() endforeach() list(SORT ALL_FEATURES) message("\n--->>> Features") foreach ( FEATURE ${ALL_FEATURES}) if ( ${FEATURE} ) message("Enabled ${FEATURE} ( ${${FEATURE}_REASON} )") else() message("Disabled ${FEATURE} ( ${${FEATURE}_REASON} )") endif() endforeach() if (XSL_PROCESSING) if (XSLTS) message("\nProcessing XSLT files: ${XSLTS}") else() message("\nProcessing XSLT files: NONE") endif(XSLTS) message("See navit/xslt for available XSLT files, and put them into " "cache variable 'XSLTS' (without extension .xslt).") endif(XSL_PROCESSING) message("\nTo configure your build use 'cmake -L' to find changeable variables and run cmake again with 'cmake -D = ...'.") endif(NOT NAVIT_DEPENDENCY_ERROR) add_subdirectory (navit) add_subdirectory (man) if (USE_NATIVE_LANGUAGE_SUPPORT) add_subdirectory (po) endif(USE_NATIVE_LANGUAGE_SUPPORT) navit-0.5.0+dfsg.1/COPYING000066400000000000000000000072631264204753600147670ustar00rootroot00000000000000The following files are lincensed under the terms of the GNU General Public License (see GPL-2): navit/tools/gpx2navit_txt/src/utils.c navit/tools/gpx2navit_txt/src/setmeta.c navit/tools/gpx2navit_txt/src/setpath.c navit/tools/gpx2navit_txt/src/emess.h navit/tools/gpx2navit_txt/src/main.c navit/tools/gpx2navit_txt/src/geod_for.c navit/tools/gpx2navit_txt/src/setwpt.c navit/tools/gpx2navit_txt/src/gpx2navit_txt.h navit/tools/gpx2navit_txt/src/geodesic.h navit/tools/gpx2navit_txt/src/geod_set.c navit/tools/gpx2navit_txt/src/errorcode.h navit/tools/gpx2navit_txt/src/geod_inv.c navit/tools/gpx2navit_txt/src/elementControl.c navit/tools/gpx2navit_txt/src/misc.c navit/tools/gpx2navit_txt/src/parser.c navit/tools/gpx2navit_txt/depcomp navit/tools/gpx2navit_txt/config.guess navit/tools/gpx2navit_txt/config.sub navit/tools/gpx2navit_txt/COPYING navit/tools/gpx2navit_txt/missing navit/vehicle/file/vehicle_file.c navit/vehicle/demo/vehicle_demo.c navit/vehicle/gpsd/vehicle_gpsd.c navit/gui/sdl/cegui_keyboard.h navit/gui/sdl/wmcontrol.c navit/gui/sdl/sdl_events.cpp navit/gui/sdl/wmcontrol.h navit/gui/sdl/gui_sdl.h navit/gui/sdl/sdl_events.h navit/gui/sdl/cegui_keyboard.cpp navit/gui/sdl/gui_sdl_window.cpp navit/gui/gtk/gui_gtk.h navit/gui/gtk/gui_gtk_window.c navit/gui/gtk/datawindow.c navit/gui/gtk/destination.c navit/gui/gtk/gui_gtk_statusbar.c navit/gui/gtk/gui_gtk_action.c navit/gui/internal/gui_internal.c navit/graphics/opengl/graphics_opengl.c navit/graphics/gtk_gl_ext/graphics_gtk_gl_ext.c navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c navit/graphics/null/graphics_null.c navit/speech/cmdline/speech_cmdline.c navit/speech/speech_dispatcher/speech_speech_dispatcher.c navit/data/mg/tree.c navit/data/mg/poly.c navit/data/mg/street.c navit/data/mg/town.c navit/data/mg/mg.h navit/data/mg/block.c navit/data/mg/map.c navit/data/textfile/textfile.c navit/data/textfile/textfile.h navit/data/csv/csv.c navit/data/csv/csv.h navit/data/binfile/binfile.c navit/data/garmin_img/garmin_img.c navit/data/garmin/gentypes.c navit/data/garmin/gar2navit.c navit/data/garmin/garmin.c navit/osd/core/osd_core.c navit/binding/python/binding_python.c navit/binding/dbus/binding_dbus.c navit/country.c navit/track.c navit/util.c navit/debug.c navit/route.c navit/param.c navit/menu.c navit/speech.c navit/attr.c navit/transform.c navit/projection.c navit/layout.c navit/cursor.c navit/event.c navit/gui.c navit/osd.c navit/item.c navit/navigation.c navit/graphics.c navit/profile.c navit/popup.c navit/coord.c navit/maptool.c navit/mapset.c navit/plugin.c navit/data_window.c navit/search.c navit/map.c navit/maptype.c navit/file.c navit/vehicle.c navit/navit.c navit/log.c navit/phrase.c navit/main.c navit/xmlconfig.c navit/callback.c contrib/android_build.sh contrib/sjjb_import.pl The following files are lincensed under the terms of the GNU Library General Public License (see LGPL): navit/callback.h navit/country.h navit/track.h navit/item_def.h navit/util.h navit/debug.h navit/point.h navit/route.h navit/param.h navit/zipfile.h navit/menu.h navit/map_data.h navit/speech.h navit/data.h navit/attr.h navit/data_window_int.h navit/transform.h navit/plugin_def.h navit/projection.h navit/layout.h navit/cursor.h navit/color.h navit/destination.h navit/event.h navit/gui.h navit/osd.h navit/item.h navit/navigation.h navit/graphics.h navit/profile.h navit/popup.h navit/types.h navit/coord.h navit/draw_info.h navit/endianess.h navit/map-share.h navit/mapset.h navit/plugin.h navit/data_window.h navit/search.h navit/gtkext.h navit/layer.h navit/map.h navit/maptype.h navit/file.h navit/vehicle.h navit/log.h navit/navit.h navit/phrase.h navit/main.h navit/xmlconfig.h navit/attr_def.h navit-0.5.0+dfsg.1/COPYRIGHT000066400000000000000000000002201264204753600152110ustar00rootroot00000000000000Unless stated otherwise, all files are: Copyright 2005 - 2008 Navit Team (see AUTHORS) and are licensed under the GPLv2 (see GPL-2 and COPYING) navit-0.5.0+dfsg.1/ChangeLog000066400000000000000000000003221264204753600154730ustar00rootroot00000000000000Changes and documentation about Navit can be found in the wiki at: http://wiki.navit-project.org A timeline of opened and closed issue tickets can be found at our trac instance: http://trac.navit-project.org navit-0.5.0+dfsg.1/GPL-2000066400000000000000000000431031264204753600144310ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. navit-0.5.0+dfsg.1/LGPL-2000066400000000000000000000613041264204753600145500ustar00rootroot00000000000000 GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! navit-0.5.0+dfsg.1/Makefile.am000066400000000000000000000012511264204753600157570ustar00rootroot00000000000000ACLOCAL_AMFLAGS= -I m4 include $(top_srcdir)/Makefile.inc SUBDIRS= if USE_NATIVE_LANGUAGE_SUPPORT XCFLAGS=-DINSTALLPREFIX=INSTALLDIR if SUPPORT_WIN32 XCFLAGS+=-DSUBLANG_BENGALI_BANGLADESH=0x03 -DSUBLANG_PUNJABI_PAKISTAN=0x03 -DSUBLANG_ROMANIAN_MOLDOVA=0x03 if SUPPORT_WIN32CE if SHARED_LIBNAVIT XCFLAGS+=-L../navit/support/libc -lsupport_libc AM_MAKEFLAGS=l=l SUBDIRS+=navit/support/libc endif endif endif if SUPPORT_ANDROID XCFLAGS+=-Xcompiler -nostartfiles endif export XCFLAGS SUBDIRS+=intl po man endif SUBDIRS+=navit pkgdoc_DATA = README EXTRA_DIST = README COPYRIGHT LGPL-2 GPL-2 COPYING INSTALL contrib/android_build.sh contrib/sjjb_import.pl DIST_SUBDIRS=intl po navit man navit-0.5.0+dfsg.1/Makefile.inc000066400000000000000000000007461264204753600161430ustar00rootroot00000000000000modulebindingdir=$(pkglibdir)/binding modulemapdir=$(pkglibdir)/map modulefontdir=$(pkglibdir)/font modulegraphicsdir=$(pkglibdir)/graphics moduleguidir=$(pkglibdir)/gui modulespeechdir=$(pkglibdir)/speech moduleosddir=$(pkglibdir)/osd modulevehicledir=$(pkglibdir)/vehicle moduleplugindir=$(pkglibdir)/plugin moduleautoloaddir=$(pkglibdir)/autoload pkgdocdir=$(pkgdatadir) imagedir=$(pkgdatadir)/xpm skinsdir=$(pkgdatadir)/skins fontsdir=$(pkgdatadir)/fonts mapsdir=$(pkgdatadir)/maps navit-0.5.0+dfsg.1/NEWS000066400000000000000000000000001264204753600144110ustar00rootroot00000000000000navit-0.5.0+dfsg.1/README000066400000000000000000000044131264204753600146060ustar00rootroot00000000000000NavIT ===== Navit is a open source (GPL) car navigation system with routing engine. It's modular design is capable of using vector maps of various formats for routing and rendering of the displayed map. It's even possible to use multiple maps at a time. The GTK+ or SDL user interfaces are designed to work well with touch screen displays. Points of Interest of various formats are displayed on the map. The current vehicle position is either read from gpsd or directly from NMEA GPS sensors. The routing engine not only calculates an optimal route to your destination, but also generates directions and even speaks to you. Navit currently speaks over 70 languages! You can help translating via our web based translation page : http://translations.launchpad.net/navit/trunk/+pots/navit For help or more information, please refer to the wiki : http://wiki.navit-project.org If you don't know where to start, we recommend you to read the Interactive Help : http://wiki.navit-project.org/index.php/Interactive_help Maps: ===== The best navigation system is useless without maps. Those three maps are known to work: - OpenStreetMaps : display, routing, but street name search isn't complete (see http://wiki.navit-project.org/index.php/OpenStreetMaps ) - Grosser Reiseplaner and compliant maps : full support (see http://wiki.navit-project.org/index.php/European_maps ) - Garmin maps : display, routing, search is being worked on (see http://wiki.navit-project.org/index.php/Garmin_maps ) GPS Support: ============ Navit read the current vehicle position : - directly from a file - from gpsd (local or remote) - from udp server (friends tracking) (experimental) Routing algorithm ================= NavIt uses a Dijkstra algorithm for routing. The routing starts at the destination by assigning a value to each point directly connected to destination point. The value represents the estimated time needed to pass this distance. Now the point with the lowest value is choosen using the Fibonacci heap and a value is assigned to connected points whos are unevaluated or whos current value ist greater than the new one. The search is repeated until the origin is found. Once the origin is reached, all that needs to be done is to follow the points with the lowest values to the destination. navit-0.5.0+dfsg.1/Toolchain/000077500000000000000000000000001264204753600156445ustar00rootroot00000000000000navit-0.5.0+dfsg.1/Toolchain/arm-apple-darwin9.cmake000066400000000000000000000015471264204753600221060ustar00rootroot00000000000000 # specify the cross compiler SET(CMAKE_C_COMPILER "arm-apple-darwin9-gcc") SET(CMAKE_CXX_COMPILER "arm-apple-darwin9-g++") SET(CMAKE_RC_COMPILER_INIT "arm-apple-darwin9-windres") SET(PKG_CONFIG_EXECUTABLE "arm-apple-darwin9-pkg-config") get_filename_component(COMPILER_PATH ${CMAKE_C_COMPILER} PATH) set (SDKROOT "/work/compile/cc/iphone/trunk/toolchain" CACHE STRING "PATH to iPhone SDK") set(CMAKE_FIND_ROOT_PATH "${SDKROOT}/sys") INCLUDE_DIRECTORIES("${SDKROOT}/sys/usr/include") SET(USE_UIKIT TRUE) SET(APPLE_BUILD TRUE) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) ADD_DEFINITIONS(-D__IPHONE_OS_VERSION_MIN_REQUIRED=20200) set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -lobjc -framework CoreFoundation -bind_at_load") navit-0.5.0+dfsg.1/Toolchain/arm-eabi.cmake000077500000000000000000000030611264204753600203260ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME GNU) set(ANDROID TRUE) set(ANDROID_API_VERSION 8 CACHE STRING "Andriod API Version") set(ANDROID_NDK_API_VERSION ${ANDROID_API_VERSION} CACHE STRING "Andriod NDK API Version") set(ANDROID_ARCH "armeabi" CACHE STRING "Android architecture") find_program(CMAKE_C_COMPILER NAMES arm-eabi-gcc arm-eabi-gcc.exe arm-linux-androideabi-gcc arm-linux-androideabi-gcc.exe) find_program(CMAKE_CXX_COMPILER NAMES arm-eabi-gcc arm-eabi-g++.exe arm-linux-androideabi-g++ arm-linux-androideabi-g++.exe) set(PKG_CONFIG_EXECUTABLE "arm-eabi-pkg-config") get_filename_component(COMPILER_PATH ${CMAKE_C_COMPILER} PATH) set(ANDROID_NDK "${COMPILER_PATH}/../../../../.." CACHE STRING "PATH to Andriod NDK") set(NDK_ARCH_DIR "${ANDROID_NDK}/platforms/android-${ANDROID_NDK_API_VERSION}/arch-arm") set(CMAKE_FIND_ROOT_PATH ${NDK_ARCH_DIR}) set(CMAKE_REQUIRED_FLAGS "-ldl --sysroot=${NDK_ARCH_DIR} ${EXTRA_COMPILER_FLAGS}") set(CMAKE_REQUIRED_INCLUDES "${NDK_ARCH_DIR}/usr/include") set(NAVIT_COMPILE_FLAGS "-I${NDK_ARCH_DIR}/usr/include -g -D_GNU_SOURCE -DANDROID -fno-short-enums ${CMAKE_REQUIRED_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined -Wl,-rpath,/system/lib") set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined") set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,-rpath,/data/data/org.navitproject.navit/lib") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) navit-0.5.0+dfsg.1/Toolchain/arm-mingw32ce.cmake000066400000000000000000000005761264204753600212310ustar00rootroot00000000000000SET(CMAKE_SYSTEM_NAME WINCE) # specify the cross compiler FIND_PROGRAM(CMAKE_C_COMPILER NAMES arm-mingw32ce-gcc arm-wince-mingw32ce-gcc) FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES arm-mingw32ce-g++ arm-wince-mingw32ce-g++) FIND_PROGRAM(CMAKE_RC_COMPILER_INIT NAMES arm-mingw32ce-windres arm-wince-mingw32ce-windres) SET(PKG_CONFIG_EXECUTABLE "arm-mingw32ce-pkg-config") SET(WINCE TRUE) navit-0.5.0+dfsg.1/Toolchain/i386-mingw32ce.cmake000066400000000000000000000004711264204753600211350ustar00rootroot00000000000000SET(CMAKE_SYSTEM_NAME WINCE) # specify the cross compiler FIND_PROGRAM(CMAKE_C_COMPILER NAMES i386-mingw32ce-gcc ) FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES i386-mingw32ce-g++ ) FIND_PROGRAM(CMAKE_RC_COMPILER_INIT NAMES i386-mingw32ce-windres ) SET(PKG_CONFIG_EXECUTABLE "i386-mingw32ce-pkg-config") SET(WINCE TRUE) navit-0.5.0+dfsg.1/Toolchain/i686-android.cmake000077500000000000000000000027451264204753600207730ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME GNU) set(ANDROID TRUE) set(ANDROID_API_VERSION 9 CACHE STRING "Andriod API Version") set(ANDROID_NDK_API_VERSION ${ANDROID_API_VERSION} CACHE STRING "Andriod NDK API Version") set(ANDROID_ARCH "x86" CACHE STRING "Android architecture") find_program(CMAKE_C_COMPILER NAMES i686-android-linux-gcc i686-android-linux-gcc.exe) find_program(CMAKE_CXX_COMPILER NAMES i686-android-linux-g++ i686-android-linux-g++.exe) set(PKG_CONFIG_EXECUTABLE "i686-android-pkg-config") get_filename_component(COMPILER_PATH ${CMAKE_C_COMPILER} PATH) set(ANDROID_NDK "${COMPILER_PATH}/../../../../.." CACHE STRING "PATH to Andriod NDK") set(NDK_ARCH_DIR "${ANDROID_NDK}/platforms/android-${ANDROID_NDK_API_VERSION}/arch-x86") set(CMAKE_FIND_ROOT_PATH ${NDK_ARCH_DIR}) set(CMAKE_REQUIRED_FLAGS "-nostdlib -lc -ldl -lgcc -L${NDK_ARCH_DIR}/usr/lib") set(CMAKE_REQUIRED_INCLUDES "${NDK_ARCH_DIR}/usr/include") set(NAVIT_COMPILE_FLAGS "-I${NDK_ARCH_DIR}/usr/include -g -D_GNU_SOURCE -DANDROID -fno-short-enums ${CMAKE_REQUIRED_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined -Wl,-rpath,/system/lib") set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,--no-undefined") set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_REQUIRED_FLAGS} -Wl,-rpath,/data/data/org.navitproject.navit/lib") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) navit-0.5.0+dfsg.1/Toolchain/mingw32.cmake000066400000000000000000000017361264204753600201430ustar00rootroot00000000000000SET(CMAKE_SYSTEM_NAME Windows) FIND_PROGRAM(CMAKE_C_COMPILER NAMES i686-w64-mingw32-gcc i686-mingw32-gcc i586-mingw32-gcc i386-mingw32-gcc i586-mingw32msvc-gcc mingw32-gcc) FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES i686-w64-mingw32-g++ i686-mingw32-g++ i586-mingw32-g++ i386-mingw32-g++ i586-mingw32msvc-g++ mingw32-g++) FIND_PROGRAM(CMAKE_RC_COMPILER_INIT NAMES i686-w64-mingw32-windres i686-mingw32-windres i586-mingw32-windres i386-mingw32-windres mingw32-windres i586-mingw32msvc-windres windres.exe) FIND_PROGRAM(CMAKE_AR NAMES i686-w64-mingw32-ar i686-mingw32-ar i586-mingw32-ar i386-mingw32-ar i586-mingw32msvc-ar mingw32-ar ar.exe) IF (NOT CMAKE_FIND_ROOT_PATH) EXECUTE_PROCESS( COMMAND ${CMAKE_C_COMPILER} -print-sysroot OUTPUT_VARIABLE CMAKE_FIND_ROOT_PATH ) ENDIF(NOT CMAKE_FIND_ROOT_PATH) set(PKG_CONFIG_EXECUTABLE "mingw32-pkg-config") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) navit-0.5.0+dfsg.1/Toolchain/xcode-iphone-sim.cmake000066400000000000000000000005231264204753600220160ustar00rootroot00000000000000SET(USE_UIKIT 1) SET(TARGETSDK iPhoneSimulator3.2.sdk) SET(CMAKE_OSX_SYSROOT /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/${TARGETSDK} CACHE STRING "") SET(CMAKE_TRY_COMPILE_OSX_BUNDLE 1) SET(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT}) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) navit-0.5.0+dfsg.1/Toolchain/xcode-iphone.cmake000066400000000000000000000006061264204753600212320ustar00rootroot00000000000000SET(USE_UIKIT 1) SET(TARGETSDK iPhoneOS4.3.sdk) SET(CMAKE_OSX_SYSROOT /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/${TARGETSDK} CACHE STRING "") SET(CMAKE_TRY_COMPILE_OSX_BUNDLE 1) SET(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") SET(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT}) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) navit-0.5.0+dfsg.1/autogen.sh000077500000000000000000000006571264204753600157350ustar00rootroot00000000000000#!/bin/sh if [ `uname` = Darwin ]; then LIBTOOL=glibtool else LIBTOOL=libtool fi for pkg in pkg-config $LIBTOOL automake aclocal autoreconf:autoconf autopoint:gettext do if ! ${pkg%%:*} --version >/dev/null then echo "You need to install ${pkg##*:}" exit 1 fi done autoreconf --install -I m4 "$@" echo "***** WARNING *****" echo "Support for autotools will be removed soon from navit, please use cmake instead" sleep 5 navit-0.5.0+dfsg.1/ci/000077500000000000000000000000001264204753600143175ustar00rootroot00000000000000navit-0.5.0+dfsg.1/ci/build_android.sh000066400000000000000000000046011264204753600174530ustar00rootroot00000000000000#!/bin/bash red='\e[0;31m' grn='\e[0;32m' yel='\e[1;33m' off='\e[0m' # setup var's to perform environment setup and cmake export START_PATH=~/ export SOURCE_PATH=$START_PATH"/"${CIRCLE_PROJECT_REPONAME}"/" export CMAKE_FILE=$SOURCE_PATH"/Toolchain/arm-eabi.cmake" export ANDROID_NDK="/usr/local/android-ndk/" export ANDROID_NDK_BIN=$ANDROID_NDK"/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin" export ANDROID_SDK="/usr/local/android-sdk-linux/" export ANDROID_SDK_PLATFORM_TOOLS=$ANDROID_SDK"/platform-tools" export ANDROID_TOOLS_CHECK=$ANDROID_SDK"/tools" export ANDROID_PLATFORM_TOOLS_CHECK=$ANDROID_SDK"/platform-tools" export ANDROID_BUILD_TOOLS="23.0.1" export ANDROID_BUILD_CHECK=$ANDROID_SDK"/build-tools/"$BUILD_TOOLS export ANDROID_PLATFORM_LATEST="android-21" export ANDROID_PLATFORM_MIN="android-7" export BUILD_PATH=$START_PATH"/android-build" export ANDROID_ENV=$ANDROID_NDK_BIN:$ANDROID_SDK_TOOLS:$ANDROID_SDK_PLATFORM_TOOLS # $ANDROID_HOME is /usr/local/android-sdk-linux for the android env. provided by CircleCI # If path already has our environment no need to set it if echo "$ANDROID_ENV" | grep -q "$PATH"; then echo -e "${grn}" " Android PATH configuration... ALREADY SET" "${off}" echo else echo -e "${grn}" " Android PATH configuration... EXPORTED" "${off}" export PATH=$ANDROID_ENV:$PATH echo fi mkdir -p $BUILD_PATH cd $BUILD_PATH export PATH=$ANDROID_NDK_BIN:$ANDROID_SDK_TOOLS:$ANDROID_SDK_PLATFORM_TOOLS:$PATH android list targets # The value comes from ( last_svn_rev - max_build_id ) at the time of the git migration svn_rev=$(( 5658 + $CIRCLE_BUILD_NUM )) sed -i -e "s/ANDROID_VERSION_INT=\"0\"/ANDROID_VERSION_INT=\"${svn_rev}\"/g" ~/navit/navit/android/CMakeLists.txt mkdir $CIRCLE_ARTIFACTS/android/ cp ~/navit/navit/android/CMakeLists.txt $CIRCLE_ARTIFACTS/android/ cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_FILE -DCACHE_SIZE='(20*1024*1024)' -DAVOID_FLOAT=1 -DSAMPLE_MAP=n -DBUILD_MAPTOOL=n -DANDROID_API_VERSION=19 $SOURCE_PATH make || exit 1 if [[ "${CIRCLE_BRANCH}" == "master" ]]; then make apkg-release && mv navit/android/bin/Navit-release-unsigned.apk $CIRCLE_ARTIFACTS/navit-$CIRCLE_SHA1-release-unsigned.apk || exit 1 else make apkg && mv navit/android/bin/Navit-debug.apk $CIRCLE_ARTIFACTS/navit-$CIRCLE_SHA1-debug.apk || exit 1 fi cp ~/android-build/navit/*.xml $CIRCLE_ARTIFACTS/android/ echo echo "Build leftovers :" ls navit/android/bin/ navit-0.5.0+dfsg.1/ci/build_linux.sh000066400000000000000000000015241264204753600171730ustar00rootroot00000000000000if [[ "${CIRCLE_PROJECT_USERNAME}" == "navit-gps" && "${CIRCLE_BRANCH}" == "trunk" ]]; then tar xfz ~/assets/cov-analysis-linux64-7.6.0.tar.gz export PATH=~/navit/cov-analysis-linux64-7.6.0/bin:$PATH mkdir bin && cd bin cov-build --dir cov-int cmake ../ -Dgraphics/qt_qpainter:BOOL=FALSE -Dgui/qml:BOOL=FALSE -DSVG2PNG:BOOL=FALSE -DSAMPLE_MAP=n cov-build --dir cov-int make || exit -1 tar czvf navit.tgz cov-int curl --form token=$COVERITY_TOKEN \ --form email=$COVERITY_EMAIL \ --form file=@navit.tgz \ --form version="${CIRCLE_BRANCH}-$CIRCLE_SHA1" \ --form description="${CIRCLE_BRANCH}-$CIRCLE_SHA1" \ https://scan.coverity.com/builds?project=$CIRCLE_PROJECT_USERNAME else mkdir bin && cd bin cmake ../ -Dgraphics/qt_qpainter:BOOL=FALSE -Dgui/qml:BOOL=FALSE -DSVG2PNG:BOOL=FALSE -DSAMPLE_MAP=n|| exit -1 make || exit -1 fi navit-0.5.0+dfsg.1/ci/dbus_tests.py000066400000000000000000000030551264204753600170530ustar00rootroot00000000000000import glob import dbus from dbus import glib import gobject import sys import os import time from subprocess import call from junit_xml import TestSuite, TestCase gobject.threads_init() glib.init_threads() bus = dbus.SessionBus() navit_object = bus.get_object("org.navit_project.navit", # Connection name "/org/navit_project/navit/default_navit" ) # Object's path iface = dbus.Interface(navit_object, dbus_interface="org.navit_project.navit.navit") junit_directory=sys.argv[1] if not os.path.exists(junit_directory): os.makedirs(junit_directory) tests=[] start_time = time.time() test_cases = TestCase("zoom (factor) expected 512", '', time.time() - start_time, '', '') iface.zoom(-2) zoom=iface.get_attr("zoom")[1] if zoom !=512 : test_cases.add_failure_info('zoom level mismatch. Got '+str(zoom)+', expected 512') tests.append(test_cases) test_cases = TestCase("zoom (factor) expected 1024", '', time.time() - start_time, '', '') iface.zoom(-2) zoom=iface.get_attr("zoom")[1] if zoom !=1024 : test_cases.add_failure_info('zoom level mismatch. Got '+str(zoom)+', expected 1024') tests.append(test_cases) test_cases = TestCase("zoom via set_attr expected 512", '', time.time() - start_time, '', '') iface.set_attr("zoom", 512) zoom=iface.get_attr("zoom")[1] if zoom !=512 : test_cases.add_failure_info('zoom level mismatch. Got '+str(zoom)+', expected 512') tests.append(test_cases) ts = [TestSuite("Navit dbus tests", tests)] with open(junit_directory+'dbus.xml', 'w+') as f: TestSuite.to_file(f, ts, prettyprint=False) navit-0.5.0+dfsg.1/ci/import_translations.sh000066400000000000000000000036361264204753600207760ustar00rootroot00000000000000# Let's check if there is files in the import queue [ -d po/import_queue/ ] || exit 0 # Let's fix the headers of the .po files in the import queue for i in po/import_queue/*.po; do b=`basename $i`; po=${b#*-}; code=${po%.*} git checkout -b i18n/$code lname=`head -n1 ${i} | sed 's/# \(.*\) translation.\{0,1\} for navit/\1/'` if [[ $lname == "" ]]; then echo "Cannot find the language name in the header of $i" exit 1 fi d=`date +"%Y"` echo "# ${lname} translations for navit" > po/${po}.header echo "# Copyright (C) 2006-${d} The Navit Team" >> po/${po}.header echo "# This file is distributed under the same license as the navit package." >> po/${po}.header echo "# Many thanks to the contributors of this translation:" >> po/${po}.header # Build a clean list of the contributors IFS=$'\n' echo "Downloading https://translations.launchpad.net/navit/trunk/+pots/navit/${code}/+details" contributors=`wget -q https://translations.launchpad.net/navit/trunk/+pots/navit/${code}/+details -O - | egrep '^ '` for user in $contributors; do url=`echo $user|cut -d'"' -f2` name=`echo $user|cut -d'>' -f2|cut -d'<' -f1` echo "# $name $url" >> po/${po}.header done echo '' >> po/${po}.header echo 'msgid ""' >> po/${po}.header # We remove two tags that just generate noise sed -i '/X-Launchpad-Export-Date/d' ${i} sed -i '/X-Generator/d' ${i} sed -i '/POT-Creation-Date/d' ${i} # Let's put the translation from launchpad without the header mv po/${po}.header po/${po}.in sed '1,/msgid ""/ d' ${i} >> po/${po}.in git add po/${po}.in && rm $i git commit -m "Updated ${lname} translation from launchpad" po/${po}.in git push --set-upstream origin i18n/${code} done navit-0.5.0+dfsg.1/ci/submit_i18n_pr.sh000066400000000000000000000005761264204753600175260ustar00rootroot00000000000000wget https://github.com/github/hub/releases/download/v2.2.1/hub-linux-amd64-2.2.1.tar.gz tar xvfz hub-linux-amd64-2.2.1.tar.gz sudo mv hub-linux-amd64-2.2.1/hub /usr/local/bin/ sudo chmod +x /usr/local/bin/hub cat > ~/.config/hub << EOF github.com: - user: ${HUB_USER} oauth_token: ${HUB_TOKEN} protocol: https EOF hub pull-request -b trunk -m "Automatic translation import" navit-0.5.0+dfsg.1/ci/update_version.sh000066400000000000000000000012211264204753600176760ustar00rootroot00000000000000if [ -z "$CIRCLE_BUILD_NUM" -o "$CIRCLE_PROJECT_USERNAME" != "navit-gps" ] ; then exit fi if ! git log -n 1 --oneline ; then echo "This script should be run from the versioned directory" exit 1 fi if [ "$CIRCLE_BRANCH" != "trunk" ] ; then exit fi TAG=R$(( 5658 + $CIRCLE_BUILD_NUM )) if [ "$1" == "prepare" ] ; then git log -1 --format="%H %d" | grep 'tag: R' if [ $? -eq 0 ] ; then echo "This commit is already tagged." exit fi git tag $TAG exit fi if [ "$1" == "push" ] ; then git log -1 --format="%H %d" | grep "tag: $TAG" if [ $? -eq 0 ] ; then echo Pushing tag $TAG to origin... git push origin $TAG fi fi navit-0.5.0+dfsg.1/circle.yml000066400000000000000000000060641264204753600157160ustar00rootroot00000000000000machine: environment: CMAKE_FILE: ../Toolchain/arm-eabi.cmake dependencies: cache_directories: - ~/.android - ~/android - "~/assets/" pre: - "[ -d ~/assets ] || mkdir ~/assets" - "[ -d ~/android ] || mkdir ~/android" - wget -c -O ~/assets/cov-analysis-linux64-7.6.0.tar.gz http://sd-55475.dedibox.fr/cov-analysis-linux64-7.6.0.tar.gz - sudo apt-get update - sudo apt-get install cmake - sudo apt-get install libpng12-dev - sudo apt-get install librsvg2-bin - sudo apt-get install libfreetype6-dev - sudo apt-get install libdbus-glib-1-dev - sudo apt-get install g++ - bash ci/update_version.sh prepare - bash ci/import_translations.sh - bash ci/build_linux.sh - sed -i '/INTEGER/d' bin/po/navit.pot - cp bin/po/navit.pot $CIRCLE_ARTIFACTS/ - "[ $CIRCLE_PROJECT_USERNAME != navit-gps ] || curl \"https://translations.launchpad.net/navit/${CIRCLE_BRANCH}/+translations-upload\" -H \"$lp_cookie\" -H \"Referer: https://translations.launchpad.net/navit/${CIRCLE_BRANCH}/+translations-upload\" -F file=@bin/po/navit.pot | grep title" # Android build - sudo apt-get install gettext - sudo apt-get install libsaxonb-java # for aapt - sudo apt-get install lib32stdc++6 - sudo apt-get install lib32z1 - bash ci/build_android.sh # Windows build - sudo apt-get install mingw32 mingw32-binutils mingw32-runtime - sudo apt-get install default-jdk nsis # for sys/select.h # - sudo apt-get install -y libc6-dev - mkdir win32 - cmake -Dbinding/python:BOOL=FALSE -DSAMPLE_MAP=n -DCMAKE_TOOLCHAIN_FILE=../Toolchain/mingw32.cmake ../ && make && make package: pwd: win32/ - cp win32/*.exe $CIRCLE_ARTIFACTS/ # For python testing with junit reporting - sudo pip install junit-xml test: post: - sed -i -e 's@name="Local GPS" profilename="car" enabled="yes" active="1"@name="Local GPS" profilename="car" enabled="no" active="0"@' navit.xml: pwd: bin/navit/ - sed -i -e 's@name="Demo" profilename="car" enabled="no" active="yes"@name="Demo" profilename="car" enabled="yes" active="yes" follow="1" refresh="1"@' navit.xml: pwd: bin/navit/ - sed -i -e 's@type="internal" enabled@type="internal" fullscreen="1" font_size="350" enabled@' navit.xml: pwd: bin/navit/ - sed -i -e 's@libbinding_dbus.so" active="no"@libbinding_dbus.so" active="yes"@' navit.xml: pwd: bin/navit/ - ./navit: pwd: bin/navit/ background: true - sleep 5 - import -window root $CIRCLE_ARTIFACTS/default.png - python ci/dbus_tests.py $CIRCLE_TEST_REPORTS/ - dbus-send --print-reply --session --dest=org.navit_project.navit /org/navit_project/navit/default_navit org.navit_project.navit.navit.quit deployment: merge_into_master: branch: trunk owner: navit-gps commands: - bash ci/update_version.sh push - git push origin $CIRCLE_SHA1:refs/heads/master merge_translations: branch: /i18n.*/ owner: navit-gps commands: - bash ci/submit_i18n_pr.sh notify: webhooks: - url: http://62.210.125.30:8000/ navit-0.5.0+dfsg.1/cmake/000077500000000000000000000000001264204753600150045ustar00rootroot00000000000000navit-0.5.0+dfsg.1/cmake/FindDBus.cmake000066400000000000000000000011041264204753600174400ustar00rootroot00000000000000include(LibFindMacros) libfind_pkg_check_modules(DBUS_PKGCONFIG dbus-1) FIND_PATH(DBus_INCLUDE_DIR dbus/dbus.h PATHS ${DBUS_PKGCONFIG_INCLUDE_DIRS} /usr/include/dbus-1.0 # PATH_SUFFIXES dbus ) FIND_PATH(DBus_INCLUDE_DIR_ARCH dbus/dbus-arch-deps.h PATHS ${DBUS_PKGCONFIG_INCLUDE_DIRS} /usr/lib/dbus-1.0/include # PATH_SUFFIXES dbus ) FIND_LIBRARY(DBus_LIBRARY NAMES dbus-1 PATHS ${DBUS_PKGCONFIG_LIBRARY_DIRS} ) set(DBus_PROCESS_INCLUDES DBus_INCLUDE_DIR DBus_INCLUDE_DIR_ARCH) set(DBus_PROCESS_LIBS DBus_LIBRARY) libfind_process(DBus) navit-0.5.0+dfsg.1/cmake/FindDBusGLib.cmake000066400000000000000000000010141264204753600201760ustar00rootroot00000000000000FIND_PACKAGE(DBus) include(LibFindMacros) libfind_pkg_check_modules(DBUS_GLIB_PKGCONFIG dbus-glib-1) FIND_PATH(DBusGLib_INCLUDE_DIR dbus/dbus-glib.h PATHS ${DBUS_GLIB_PKGCONFIG_INCLUDE_DIRS} /usr/include/dbus-1.0 # PATH_SUFFIXES dbus ) FIND_LIBRARY(DBusGLib_LIBRARY NAMES dbus-glib-1 PATHS ${DBUS_GLIB_PKGCONFIG_LIBRARY_DIRS} ) set(DBusGLib_PROCESS_INCLUDES DBusGLib_INCLUDE_DIR DBus_INCLUDE_DIRS) set(DBusGLib_PROCESS_LIBS DBusGLib_LIBRARY DBus_LIBRARIES) libfind_process(DBusGLib) navit-0.5.0+dfsg.1/cmake/FindGTK2.cmake000066400000000000000000000316351264204753600173260ustar00rootroot00000000000000# - Try to find GTK2 # Once done this will define # # GTK2_FOUND - System has Boost # GTK2_INCLUDE_DIRS - GTK2 include directory # GTK2_LIBRARIES - Link these to use GTK2 # GTK2_LIBRARY_DIRS - The path to where the GTK2 library files are. # GTK2_DEFINITIONS - Compiler switches required for using GTK2 # # Copyright (c) 2007 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # # Set GTK2_DEBUG to enable debug output. macro(GTK2_DEBUG_MESSAGE _message) if (GTK2_DEBUG) message(STATUS "(DEBUG) ${_message}") endif (GTK2_DEBUG) endmacro(GTK2_DEBUG_MESSAGE _message) if (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS) # in cache already set(GTK2_FOUND TRUE) else (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS) # use pkg-config to get the directories and then use these values # in the FIND_PATH() and FIND_LIBRARY() calls include(UsePkgConfig) pkgconfig(gtk+-2.0 _GTK2IncDir _GTK2LinkDir _GTK2LinkFlags _GTK2Cflags) find_path(GTK2_GTK_INCLUDE_DIR NAMES gtk/gtk.h PATHS $ENV{GTK2_HOME} ${_GTK2IncDir} ${_GTK2IncDir}/gtk-2.0 /usr/include/gtk-2.0 /usr/local/include/gtk-2.0 /opt/include/gtk-2.0 /opt/gnome/include/gtk-2.0 /sw/include/gtk-2.0 ) gtk2_debug_message("GTK2_GTK_INCLUDE_DIR is ${GTK2_GTK_INCLUDE_DIR}") # Some Linux distributions (e.g. Red Hat) have glibconfig.h # and glib.h in different directories, so we need to look # for both. # - Atanas Georgiev pkgconfig(glib-2.0 _GLIB2IncDir _GLIB2LinkDir _GLIB2LinkFlags _GLIB2Cflags) pkgconfig(gmodule-2.0 _GMODULE2IncDir _GMODULE2LinkDir _GMODULE2LinkFlags _GMODULE2Cflags) find_path(GTK2_GLIBCONFIG_INCLUDE_DIR NAMES glibconfig.h PATHS ${_GLIB2IncDir} ${_GMODULE2IncDir} ${_GMODULE2IncDir}/glib-2.0 ${_GLIB2LinkDir}/glib-2.0/include /opt/gnome/lib64/glib-2.0/include /opt/gnome/lib/glib-2.0/include /opt/lib/glib-2.0/include /usr/lib64/glib-2.0/include /usr/lib/glib-2.0/include /sw/lib/glib-2.0/include ) gtk2_debug_message("GTK2_GLIBCONFIG_INCLUDE_DIR is ${GTK2_GLIBCONFIG_INCLUDE_DIR}") find_path(GTK2_GLIB_INCLUDE_DIR NAMES glib.h PATHS ${_GLIB2IncDir} ${_GLIB2IncDir}/glib-2.0 ${_GMODULE2IncDir} /opt/include/glib-2.0 /opt/gnome/include/glib-2.0 /usr/include/glib-2.0 /sw/include/glib-2.0 ) gtk2_debug_message("GTK2_GLIB_INCLUDE_DIR is ${GTK2_GLIB_INCLUDE_DIR}") pkgconfig(gdk-2.0 _GDK2IncDir _GDK2LinkDir _GDK2LinkFlags _GDK2Cflags) find_path(GTK2_GDK_INCLUDE_DIR NAMES gdkconfig.h PATHS ${_GDK2IncDir} ${_GDK2IncDir}/gtk-2.0 ${_GDK2LinkDir}/gtk-2.0/include /opt/gnome/lib/gtk-2.0/include /opt/gnome/lib64/gtk-2.0/include /opt/lib/gtk-2.0/include /usr/lib/gtk-2.0/include /usr/lib64/gtk-2.0/include /sw/lib/gtk-2.0/include ) gtk2_debug_message("GTK2_GDK_INCLUDE_DIR is ${GTK2_GDK_INCLUDE_DIR}") find_path(GTK2_GTKGL_INCLUDE_DIR NAMES gtkgl/gtkglarea.h PATHS ${_GLIB2IncDir} /usr/include /usr/local/include /usr/openwin/share/include /opt/gnome/include /opt/include /sw/include ) gtk2_debug_message("GTK2_GTKGL_INCLUDE_DIR is ${GTK2_GTKGL_INCLUDE_DIR}") pkgconfig(pango _PANGOIncDir _PANGOLinkDir _PANGOLinkFlags _PANGOCflags) find_path(GTK2_PANGO_INCLUDE_DIR NAMES pango/pango.h PATHS ${_PANGOIncDir} ${_PANGOIncDir}/pango-1.0/ /usr/include/pango-1.0 /opt/gnome/include/pango-1.0 /opt/include/pango-1.0 /sw/include/pango-1.0 ) gtk2_debug_message("GTK2_PANGO_INCLUDE_DIR is ${GTK2_PANGO_INCLUDE_DIR}") pkgconfig(cairo _CAIROIncDir _CAIROLinkDir _CAIROLinkFlags _CAIROCflags) find_path(GTK2_CAIRO_INCLUDE_DIR NAMES cairo.h PATHS ${_CAIROIncDir} ${_CAIROIncDir}/cairo /opt/gnome/include/cairo /usr/include /usr/include/cairo /opt/include /opt/include/cairo /sw/include /sw/include/cairo ) gtk2_debug_message("GTK2_CAIRO_INCLUDE_DIR is ${GTK2_CAIRO_INCLUDE_DIR}") pkgconfig(gdk-pixbuf-2.0 _GDKPIXBUFIncDir _GDKPIXBUFLinkDir _GDKPIXBUFLinkFlags _GDKPIXBUFCflags) find_path(GTK2_GDKPIXBUF_INCLUDE_DIR NAMES gdk-pixbuf/gdk-pixbuf.h PATHS ${_GDKPIXBUFIncDir} ${_GDKPIXBUFIncDir}/gdk-pixbuf-2.0 /opt/gnome/include/cairo /usr/include /usr/include/cairo /opt/include /opt/include/cairo /sw/include /sw/include/cairo /sw/include/gdk-pixbuf-2.0 ) gtk2_debug_message("GTK2_CAIRO_INCLUDE_DIR is ${GTK2_CAIRO_INCLUDE_DIR}") pkgconfig(atk _ATKIncDir _ATKLinkDir _ATKLinkFlags _ATKCflags) find_path(GTK2_ATK_INCLUDE_DIR NAMES atk/atk.h PATHS ${_ATKIncDir} ${_ATKIncDir}/atk-1.0 /opt/gnome/include/atk-1.0 /usr/include/atk-1.0 /opt/include/atk-1.0 /sw/include/atk-1.0 ) gtk2_debug_message("GTK2_ATK_INCLUDE_DIR is ${GTK2_ATK_INCLUDE_DIR}") if (UNIX) find_library(GTK2_GTK_LIBRARY NAMES gtk-x11-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTK_LIBRARY is ${GTK2_GTK_LIBRARY}") find_library(GTK2_GDK_LIBRARY NAMES gdk-x11-2.0 PATHS ${_GDK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GDK_LIBRARY is ${GTK2_GDK_LIBRARY}") endif(UNIX) if (WIN32) find_library(GTK2_GTK_LIBRARY NAMES gtk-win32-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTK_LIBRARY is ${GTK2_GTK_LIBRARY}") find_library(GTK2_GDK_LIBRARY NAMES gdk-win32-2.0 PATHS ${_GDK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) endif (WIN32) find_library(GTK2_GDK_PIXBUF_LIBRARY NAMES gdk_pixbuf-2.0 PATHS ${_GDK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GDK_PIXBUF_LIBRARY is ${GTK2_GDK_PIXBUF_LIBRARY}") find_library(GTK2_GMODULE_LIBRARY NAMES gmodule-2.0 PATHS ${_GMODULE2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GMODULE_LIBRARY is ${GTK2_GMODULE_LIBRARY}") find_library(GTK2_GTHREAD_LIBRARY NAMES gthread-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTHREAD_LIBRARY is ${GTK2_GTHREAD_LIBRARY}") find_library(GTK2_GOBJECT_LIBRARY NAMES gobject-2.0 PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GOBJECT_LIBRARY is ${GTK2_GOBJECT_LIBRARY}") find_library(GTK2_GLIB_LIBRARY NAMES glib-2.0 PATHS ${_GLIB2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GLIB_LIBRARY is ${GTK2_GLIB_LIBRARY}") find_library(GTK2_GTKGL_LIBRARY NAMES gtkgl PATHS ${_GTK2LinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_GTKGL_LIBRARY is ${GTK2_GTKGL_LIBRARY}") find_library(GTK2_PANGO_LIBRARY NAMES pango-1.0 PATHS ${_PANGOLinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_PANGO_LIBRARY is ${GTK2_PANGO_LIBRARY}") find_library(GTK2_CAIRO_LIBRARY NAMES pangocairo-1.0 PATHS ${_CAIROLinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_PANGO_LIBRARY is ${GTK2_CAIRO_LIBRARY}") find_library(GTK2_ATK_LIBRARY NAMES atk-1.0 PATHS ${_ATKinkDir} /usr/lib /usr/local/lib /usr/openwin/lib /usr/X11R6/lib /opt/gnome/lib /opt/lib /sw/lib ) gtk2_debug_message("GTK2_ATK_LIBRARY is ${GTK2_ATK_LIBRARY}") set(GTK2_INCLUDE_DIRS ${GTK2_GTK_INCLUDE_DIR} ${GTK2_GLIBCONFIG_INCLUDE_DIR} ${GTK2_GLIB_INCLUDE_DIR} ${GTK2_GDK_INCLUDE_DIR} ${GTK2_PANGO_INCLUDE_DIR} ${GTK2_CAIRO_INCLUDE_DIR} ${GTK2_ATK_INCLUDE_DIR} ) if(GTK2_GDKPIXBUF_INCLUDE_DIR) set(GTK2_INCLUDE_DIRS ${GTK2_INCLUDE_DIRS} ${GTK2_GDKPIXBUF_INCLUDE_DIR}) endif(GTK2_GDKPIXBUF_INCLUDE_DIR) if (GTK2_GTK_LIBRARY AND GTK2_GTK_INCLUDE_DIR) if (GTK2_GDK_LIBRARY AND GTK2_GDK_PIXBUF_LIBRARY AND GTK2_GDK_INCLUDE_DIR) if (GTK2_GMODULE_LIBRARY) if (GTK2_GTHREAD_LIBRARY) if (GTK2_GOBJECT_LIBRARY) if (GTK2_PANGO_LIBRARY AND GTK2_PANGO_INCLUDE_DIR) if (GTK2_CAIRO_LIBRARY AND GTK2_CAIRO_INCLUDE_DIR) if (GTK2_ATK_LIBRARY AND GTK2_ATK_INCLUDE_DIR) # set GTK2 libraries set (GTK2_LIBRARIES ${GTK2_GTK_LIBRARY} ${GTK2_GDK_LIBRARY} ${GTK2_GDK_PIXBUF_LIBRARY} ${GTK2_GMODULE_LIBRARY} ${GTK2_GTHREAD_LIBRARY} ${GTK2_GOBJECT_LIBRARY} ${GTK2_PANGO_LIBRARY} ${GTK2_CAIRO_LIBRARY} ${GTK2_ATK_LIBRARY} ) # check for gtkgl support if (GTK2_GTKGL_LIBRARY AND GTK2_GTKGL_INCLUDE_DIR) set(GTK2_GTKGL_FOUND TRUE) # set(GTK2_INCLUDE_DIRS # ${GTK2_INCLUDE_DIRS} # ${GTK2_GTKGL_INCLUDE_DIR} # ) # set(GTK2_LIBRARIES # ${GTK2_LIBRARIES} # ${GTK2_GTKGL_LIBRARY} # ) endif (GTK2_GTKGL_LIBRARY AND GTK2_GTKGL_INCLUDE_DIR) else (GTK2_ATK_LIBRARY AND GTK2_ATK_INCLUDE_DIR) endif (GTK2_ATK_LIBRARY AND GTK2_ATK_INCLUDE_DIR) else (GTK2_CAIRO_LIBRARY AND GTK2_CAIRO_INCLUDE_DIR) endif (GTK2_CAIRO_LIBRARY AND GTK2_CAIRO_INCLUDE_DIR) else (GTK2_PANGO_LIBRARY AND GTK2_PANGO_INCLUDE_DIR) endif (GTK2_PANGO_LIBRARY AND GTK2_PANGO_INCLUDE_DIR) else (GTK2_GOBJECT_LIBRARY) endif (GTK2_GOBJECT_LIBRARY) else (GTK2_GTHREAD_LIBRARY) endif (GTK2_GTHREAD_LIBRARY) else (GTK2_GMODULE_LIBRARY) endif (GTK2_GMODULE_LIBRARY) else (GTK2_GDK_LIBRARY AND GTK2_GDK_PIXBUF_LIBRARY AND GTK2_GDK_INCLUDE_DIR) endif (GTK2_GDK_LIBRARY AND GTK2_GDK_PIXBUF_LIBRARY AND GTK2_GDK_INCLUDE_DIR) else (GTK2_GTK_LIBRARY AND GTK2_GTK_INCLUDE_DIR) endif (GTK2_GTK_LIBRARY AND GTK2_GTK_INCLUDE_DIR) if (GTK2_INCLUDE_DIRS AND GTK2_LIBRARIES) set(GTK2_FOUND TRUE) endif (GTK2_INCLUDE_DIRS AND GTK2_LIBRARIES) if (GTK2_FOUND) if (NOT GTK2_FIND_QUIETLY) message(STATUS "Found GTK2: ${GTK2_LIBRARIES}") endif (NOT GTK2_FIND_QUIETLY) else (GTK2_FOUND) if (GTK2_FIND_REQUIRED) message(FATAL_ERROR "Could not find GTK2") endif (GTK2_FIND_REQUIRED) endif (GTK2_FOUND) # show the GTK2_INCLUDE_DIRS and GTK2_LIBRARIES variables only in the advanced view mark_as_advanced(GTK2_INCLUDE_DIRS GTK2_LIBRARIES) endif (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS) navit-0.5.0+dfsg.1/cmake/FindGlib.cmake000066400000000000000000000021141264204753600174620ustar00rootroot00000000000000# - Try to find Glib-2.0 (with gobject) # Once done, this will define # # Glib_FOUND - system has Glib # Glib_INCLUDE_DIRS - the Glib include directories # Glib_LIBRARIES - link these to use Glib include(LibFindMacros) # Use pkg-config to get hints about paths libfind_pkg_check_modules(Glib_PKGCONF glib-2.0) # Main include dir find_path(Glib_INCLUDE_DIR NAMES glib.h PATHS ${Glib_PKGCONF_INCLUDE_DIRS} /sw/include PATH_SUFFIXES glib-2.0 ) # Glib-related libraries also use a separate config header, which is in lib dir find_path(GlibConfig_INCLUDE_DIR NAMES glibconfig.h PATHS ${Glib_PKGCONF_INCLUDE_DIRS} /usr /sw PATH_SUFFIXES lib/glib-2.0/include ) # Finally the library itself find_library(Glib_LIBRARY NAMES glib-2.0 PATHS ${Glib_PKGCONF_LIBRARY_DIRS} /sw/lib ) # Set the include dir variables and the libraries and let libfind_process do the rest. # NOTE: Singular variables for this library, plural for libraries this this lib depends on. set(Glib_PROCESS_INCLUDES Glib_INCLUDE_DIR GlibConfig_INCLUDE_DIR) set(Glib_PROCESS_LIBS Glib_LIBRARY) libfind_process(Glib) navit-0.5.0+dfsg.1/cmake/FindGmodule.cmake000066400000000000000000000015051264204753600202040ustar00rootroot00000000000000# - Try to find Glib-2.0 (with gobject) # Once done, this will define # # Glib_FOUND - system has Glib # Glib_INCLUDE_DIRS - the Glib include directories # Glib_LIBRARIES - link these to use Glib include(LibFindMacros) libfind_pkg_check_modules(Gmodule_PKGCONF gmodule-2.0) # Main include dir find_path(Gmodule_INCLUDE_DIR NAMES gmodule.h PATHS ${Gmodule_PKGCONF_INCLUDE_DIRS} PATH_SUFFIXES gmodule-2.0 ) # Finally the modulerary itself find_library(Gmodule_LIBRARY NAMES gmodule-2.0 PATHS ${Gmodule_PKGCONF_LIBRARY_DIRS} ) # Set the include dir variables and the libraries and let libfind_process do the rest. # NOTE: Singular variables for this library, plural for libraries this this lib depends on. set(Gmodule_PROCESS_INCLUDES Gmodule_INCLUDE_DIR) set(Gmodule_PROCESS_LIBS Gmodule_LIBRARY) libfind_process(Gmodule) navit-0.5.0+dfsg.1/cmake/FindXGettextGlade.cmake000066400000000000000000000004411264204753600213170ustar00rootroot00000000000000find_package(Gettext) FIND_PROGRAM(XGETTEXT xgettext) if (XGETTEXT) execute_process(COMMAND echo "" COMMAND xgettext -L glade - RESULT_VARIABLE GETTEXT_RET) if ("${GETTEXT_RET}" STREQUAL "0") set(XGETTEXT_GLADE TRUE) else() set(XGETTEXT_GLADE FALSE) endif() endif(XGETTEXT) navit-0.5.0+dfsg.1/cmake/LibFindMacros.cmake000066400000000000000000000100421264204753600204570ustar00rootroot00000000000000# Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments # used for the current package. For this to work, the first parameter must be the # prefix of the current package, then the prefix of the new package etc, which are # passed to find_package. macro (libfind_package PREFIX) set (LIBFIND_PACKAGE_ARGS ${ARGN}) if (${PREFIX}_FIND_QUIETLY) set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET) endif (${PREFIX}_FIND_QUIETLY) if (${PREFIX}_FIND_REQUIRED) set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED) endif (${PREFIX}_FIND_REQUIRED) find_package(${LIBFIND_PACKAGE_ARGS}) endmacro (libfind_package) # CMake developers made the UsePkgConfig system deprecated in the same release (2.6) # where they added pkg_check_modules. Consequently I need to support both in my scripts # to avoid those deprecated warnings. Here's a helper that does just that. # Works identically to pkg_check_modules, except that no checks are needed prior to use. macro (libfind_pkg_check_modules PREFIX PKGNAME) if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) include(UsePkgConfig) pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS) else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(${PREFIX} ${PKGNAME}) endif (PKG_CONFIG_FOUND) endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) endmacro (libfind_pkg_check_modules) # Do the final processing once the paths have been detected. # If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain # all the variables, each of which contain one include directory. # Ditto for ${PREFIX}_PROCESS_LIBS and library files. # Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. # Also handles errors in case library detection was required, etc. macro (libfind_process PREFIX) # Skip processing if already processed during this run if (NOT ${PREFIX}_FOUND) # Start with the assumption that the library was found set (${PREFIX}_FOUND TRUE) # Process all includes and set _FOUND to false if any are missing foreach (i ${${PREFIX}_PROCESS_INCLUDES}) if (${i}) set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}}) mark_as_advanced(${i}) else (${i}) set (${PREFIX}_FOUND FALSE) endif (${i}) endforeach (i) # Process all libraries and set _FOUND to false if any are missing foreach (i ${${PREFIX}_PROCESS_LIBS}) if (${i}) set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}}) mark_as_advanced(${i}) else (${i}) set (${PREFIX}_FOUND FALSE) endif (${i}) endforeach (i) # Print message and/or exit on fatal error if (${PREFIX}_FOUND) if (NOT ${PREFIX}_FIND_QUIETLY) message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") endif (NOT ${PREFIX}_FIND_QUIETLY) else (${PREFIX}_FOUND) if (${PREFIX}_FIND_REQUIRED) foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS}) message("${i}=${${i}}") endforeach (i) message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use ccmake to set the missing variables manually.") endif (${PREFIX}_FIND_REQUIRED) endif (${PREFIX}_FOUND) endif (NOT ${PREFIX}_FOUND) endmacro (libfind_process) macro(libfind_library PREFIX basename) set(TMP "") if(MSVC80) set(TMP -vc80) endif(MSVC80) if(MSVC90) set(TMP -vc90) endif(MSVC90) set(${PREFIX}_LIBNAMES ${basename}${TMP}) if(${ARGC} GREATER 2) set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2}) string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES}) set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP}) endif(${ARGC} GREATER 2) find_library(${PREFIX}_LIBRARY NAMES ${${PREFIX}_LIBNAMES} PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS} ) endmacro(libfind_library) navit-0.5.0+dfsg.1/cmake/build.xml000066400000000000000000000003131264204753600166220ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/cmake/copy_files.cmake000066400000000000000000000007761264204753600201540ustar00rootroot00000000000000message("Copy '${GLOB_EXP}' to '${DST}'") file(GLOB SRC_FILES ${GLOB_EXP}) if ( SRC_FILES ) foreach (FILE ${SRC_FILES}) if ( LOWER ) get_filename_component(FILEN_NAME ${FILE} NAME) string(TOLOWER ${FILEN_NAME} FILEN_NAME_LOWER) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST}/${FILEN_NAME_LOWER}) else() execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST}/) endif( LOWER ) endforeach() endif() navit-0.5.0+dfsg.1/cmake/navit_download.cmake000066400000000000000000000006061264204753600210200ustar00rootroot00000000000000message("Downloading ${URL}") file(DOWNLOAD ${URL} ${DST} SHOW_PROGRESS STATUS DOWNLOAD_STATUS) list(GET DOWNLOAD_STATUS 0 DOWNLOAD_ERR) list(GET DOWNLOAD_STATUS 1 DOWNLOAD_MSG) if(DOWNLOAD_ERR) file(REMOVE ${DST}) message(SEND_ERROR "Download of sample map from ${URL} failed: " "${DOWNLOAD_MSG}\n" "To disable the sample map, run cmake with -DSAMPLE_MAP=n .") endif(DOWNLOAD_ERR) navit-0.5.0+dfsg.1/cmake/navit_macros.cmake000066400000000000000000000105561264204753600205020ustar00rootroot00000000000000macro(set_feature_switch_default VARIABLE REASON ENABLE) if ((NOT DEFINED ${VARIABLE}) # variable not in cache (first run) OR ((DEFINED ${VARIABLE}_AUTODETECTED_VALUE) AND # variable in cache -> different from autodetected value? ((${VARIABLE}_AUTODETECTED_VALUE AND ${VARIABLE}) OR # poor man's boolean equal (NOT ${VARIABLE}_AUTODETECTED_VALUE AND NOT ${VARIABLE})))) set(${VARIABLE}_REASON ${REASON}) set(${VARIABLE} ${ENABLE} CACHE BOOL "feature switch" FORCE) else() set(${VARIABLE}_REASON "User defined") endif() set(${VARIABLE}_AUTODETECTED_VALUE ${ENABLE} CACHE INTERNAL "value autodetected by build script") endmacro() macro(set_with_reason VARIABLE REASON ENABLE) if (DEFINED ${VARIABLE}_REASON AND NOT ${VARIABLE}_REASON STREQUAL "User defined") set(${VARIABLE} ${ENABLE} CACHE BOOL "feature switch" FORCE) set(${VARIABLE}_REASON ${REASON}) string(REPLACE "/" "_" VARIABLE_NAMES ${VARIABLE}) set(${VARIABLE_NAMES}_LIBS ${ARGN}) endif() set(${VARIABLE}_AUTODETECTED_VALUE ${ENABLE} CACHE INTERNAL "value autodetected by build script") endmacro() macro(add_feature FEATURE REASON ENABLE) list(APPEND ALL_FEATURES ${FEATURE}) set_feature_switch_default(${FEATURE} ${REASON} ${ENABLE}) endmacro() macro(cfg_feature FEATURE REASON ENABLE) set(${FEATURE} ${ENABLE}) if (${FEATURE}_REASON STREQUAL "User defined") set(${FEATURE}_REASON "${REASON} *user setting overridden*") else() set(${FEATURE}_REASON ${REASON}) endif() endmacro() macro(add_module MODULE_PATH REASON ENABLE) list(APPEND ALL_MODULES ${MODULE_PATH}) set_feature_switch_default(${MODULE_PATH} ${REASON} ${ENABLE}) endmacro() # plugins are always linked static macro(add_plugin PLUGIN_PATH REASON ENABLE) list(APPEND ALL_PLUGINS ${PLUGIN_PATH}) set_feature_switch_default(${PLUGIN_PATH} ${REASON} ${ENABLE}) endmacro() # module plugins are always linked static macro(add_module_plugin PLUGIN_PATH REASON ENABLE) list(APPEND ALL_MODULE_PLUGINS ${PLUGIN_PATH}) set_feature_switch_default(${PLUGIN_PATH} ${REASON} ${ENABLE}) endmacro() macro(module_add_library MODULE_NAME ) LINK_DIRECTORIES(${${MODULE_NAME}_LIBRARY_DIRS}) add_library(${MODULE_NAME} ${MODULE_BUILD_TYPE} ${ARGN}) SET_TARGET_PROPERTIES(${MODULE_NAME} PROPERTIES COMPILE_DEFINITIONS "MODULE=${MODULE_NAME}") TARGET_LINK_LIBRARIES(${MODULE_NAME} ${${MODULE_NAME}_LIBS}) SET_TARGET_PROPERTIES( ${MODULE_NAME} PROPERTIES COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS} ${${MODULE_NAME}_FLAGS}") INCLUDE_DIRECTORIES(${${MODULE_NAME}_INCLUDES}) if (USE_PLUGINS) if (ANDROID) TARGET_LINK_LIBRARIES(${MODULE_NAME} ${NAVIT_LIBNAME}) endif() if (APPLE) set_target_properties( ${MODULE_NAME} PROPERTIES LINK_FLAGS "-Wl,-undefined -Wl,dynamic_lookup") endif() # workaround to be compatible with old paths set_target_properties( ${MODULE_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.libs") install(TARGETS ${MODULE_NAME} DESTINATION ${LIB_DIR}/navit/${${MODULE_NAME}_TYPE} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) endif() endmacro(module_add_library) macro(supportlib_add_library LIB_NAME ) add_library(${LIB_NAME} ${ARGN}) TARGET_LINK_LIBRARIES(${LIB_NAME} ${${LIB_NAME}_LIBS}) SET_TARGET_PROPERTIES( ${LIB_NAME} PROPERTIES COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS}") SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_DEFINITIONS "MODULE=${LIB_NAME}") endmacro(supportlib_add_library) macro(message_error) set(NAVIT_DEPENDENCY_ERROR 1) message( SEND_ERROR ${ARGN}) endmacro(message_error) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) function(add_compiler_flag_if_available FLAG) set(VAR_FLAG_AVAILABLE_C "FLAG_AVAILABLE_C_${FLAG}") check_c_compiler_flag(${FLAG} ${VAR_FLAG_AVAILABLE_C}) if (${${VAR_FLAG_AVAILABLE_C}}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG} ") endif() if(CMAKE_CXX_COMPILER_LOADED) # C++ compiler is optional set(VAR_FLAG_AVAILABLE_CXX "FLAG_AVAILABLE_CXX_${FLAG}") check_cxx_compiler_flag(${FLAG} ${VAR_FLAG_AVAILABLE_CXX}) if (${${VAR_FLAG_AVAILABLE_CXX}}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG} ") endif() endif() endfunction(add_compiler_flag_if_available) navit-0.5.0+dfsg.1/cmake/navit_po_version.cmake000066400000000000000000000003171264204753600213730ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) string(REGEX REPLACE "\"Project-Id-Version: [^\"]*\"" "\"Project-Id-Version: ${PACKAGE_STRING}\\\\n\"" OUTPUT_LINES "${OUTPUT_LINES}") file(WRITE "${DST}" "${OUTPUT_LINES}") navit-0.5.0+dfsg.1/cmake/navit_writemapxml.cmake000066400000000000000000000001511264204753600215550ustar00rootroot00000000000000message("${TEXT}") file(WRITE ${DST} "\n") navit-0.5.0+dfsg.1/cmake/navit_xml_parser.cmake000066400000000000000000000015351264204753600213670ustar00rootroot00000000000000file(STRINGS "${SRC}" TEXT_LINES REGEX "_\\(") file(WRITE ${DST} "// Strings from navit_shipped.xml\n") foreach (LINE ${TEXT_LINES}) string(REGEX REPLACE ".*(_\\(\"[^\"]*\"\\)).*" "\\1\n" OUTPUT_LINE ${LINE}) file(APPEND ${DST} ${OUTPUT_LINE}) endforeach() file(READ "${SRC}" SRC_CONTENT) string(REGEX MATCHALL "([^<>]*)" TEXT_ELEMENTS "${SRC_CONTENT}") foreach (LINE ${TEXT_ELEMENTS}) string(REGEX REPLACE ".*]*>([^<>]*).*" "_(\"\\1\")" OUTPUT_LINE ${LINE}) string(REPLACE "\n" "\\n" OUTPUT_LINE ${OUTPUT_LINE}) file(APPEND ${DST} "${OUTPUT_LINE}\n") endforeach() string(REGEX MATCHALL "]*name=\"[^\"]+\"" ATTRS "${SRC_CONTENT}") foreach (LINE ${ATTRS}) string(REGEX REPLACE ".* name=\"([^\"]+)\"" "_(\"\\1\")" OUTPUT_LINE ${LINE}) file(APPEND ${DST} "${OUTPUT_LINE}\n") endforeach() navit-0.5.0+dfsg.1/cmake/navit_xml_parser_glade.cmake000066400000000000000000000007541264204753600225250ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) if (PREFIX) set(OUTPUT_LINES "" "${OUTPUT_LINES}") endif() string(REGEX REPLACE "vehicleprofile" "atkaction" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "name=" "description=" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "...CDATA" " " OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "\\]\\]" "" OUTPUT_LINES "${OUTPUT_LINES}") if (SUFFIX) set(OUTPUT_LINES "${OUTPUT_LINES}" "") endif() file(WRITE ${DST} ${OUTPUT_LINES}) navit-0.5.0+dfsg.1/cmake/recolor.cmake000066400000000000000000000005161264204753600174550ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) string(REGEX REPLACE "fill:#111111" "fill:${BGCOLOR}" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "fill:#ffffff" "fill:${FGCOLOR}" OUTPUT_LINES "${OUTPUT_LINES}") string(REGEX REPLACE "stroke:#ffffff" "stroke:${FGCOLOR}" OUTPUT_LINES "${OUTPUT_LINES}") file(WRITE "${DST}" "${OUTPUT_LINES}") navit-0.5.0+dfsg.1/cmake/replace.cmake000066400000000000000000000002231264204753600174160ustar00rootroot00000000000000file(READ "${SRC}" OUTPUT_LINES) string(REGEX REPLACE "${MATCHES}" "${REPLACE}" OUTPUT_LINES "${OUTPUT_LINES}") file(WRITE ${DST} ${OUTPUT_LINES}) navit-0.5.0+dfsg.1/cmake/strings_xml_parser.cmake000066400000000000000000000007441264204753600217400ustar00rootroot00000000000000file(STRINGS "${SRC}" TEXT_LINES REGEX "]+>(.*).*" "\\1" MSGID ${LINE}) string(REGEX REPLACE "\\\\'" "'" MSGID ${MSGID}) string(REGEX REPLACE ".*]+name=\"([^>\"]+)\">.*.*" "\\1" RESID ${LINE}) file(APPEND ${DST} "// Android resource: @strings/${RESID}\n_(\"${MSGID}\")\n") endforeach() navit-0.5.0+dfsg.1/cmake/test.xml000066400000000000000000000001411264204753600165010ustar00rootroot00000000000000 ]> navit-0.5.0+dfsg.1/cmake/test.xslt000066400000000000000000000002211264204753600166720ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/cmake/version.cmake000077500000000000000000000023471264204753600175040ustar00rootroot00000000000000FIND_PROGRAM(GIT_EXECUTABLE NAMES git git.exe DOC "git command line client") get_filename_component(SOURCE_DIR ${SRC} PATH) if (GIT_EXECUTABLE) EXECUTE_PROCESS( COMMAND ${GIT_EXECUTABLE} log "--format=%h %d" WORKING_DIRECTORY "${SOURCE_DIR}" OUTPUT_VARIABLE VERSION ERROR_VARIABLE GIT_ERROR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ) if(NOT VERSION) message(STATUS "Cannot determine current git commit - git error: '${GIT_ERROR}'") set(VERSION "0000") endif() else() message(STATUS "git not found, cannot record git commit") set(VERSION "0000") endif(GIT_EXECUTABLE) string(REGEX MATCH "R[0-9]+" VERSION_NUM ${VERSION} ) if(NOT VERSION_NUM) message(STATUS "I can't find a release tag. This is probably not Navit's official tree") message(STATUS "It's OK, I will default to 0000") set(VERSION_NUM "0000") endif() string(REPLACE "R" "" VERSION_NUM ${VERSION_NUM} ) if(NOT VERSION_NUM) set(VERSION_NUM "0000") endif() string(REGEX MATCH "^[a-z0-9]+" VERSION ${VERSION} ) if (STRIP_M) set(VERSION ${VERSION_NUM}) endif() set(NAVIT_VARIANT "-") set(${NAME} ${VERSION}) message (STATUS "Git commit: ${${NAME}}") CONFIGURE_FILE(${SRC} ${DST} @ONLY) navit-0.5.0+dfsg.1/config.h.cmake000066400000000000000000000034011264204753600164170ustar00rootroot00000000000000#cmakedefine USE_NATIVE_LANGUAGE_SUPPORT 1 #cmakedefine HAVE_MALLOC_H 1 #cmakedefine HAVE_SYS_MOUNT_H 1 #cmakedefine HAVE_STDINT_H 1 #cmakedefine HAVE_API_ANDROID 1 #cmakedefine HAVE_API_WIN32_BASE 1 #cmakedefine HAVE_API_WIN32 1 #cmakedefine HAVE_API_WIN32_CE 1 #cmakedefine HAVE_GLIB 1 #cmakedefine HAVE_GMODULE 1 #cmakedefine HAVE_GETCWD 1 #define CACHE_SIZE ${CACHE_SIZE} #cmakedefine AVOID_FLOAT 1 #cmakedefine AVOID_UNALIGNED 1 #cmakedefine USE_LIBGNUINTL 1 #cmakedefine HAVE_BYTESWAP_H 1 /* Versions */ #cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" #cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" #cmakedefine PACKAGE "@PACKAGE@" #cmakedefine LOCALEDIR "@LOCALEDIR@" #cmakedefine HAVE_LIBCRYPTO 1 #cmakedefine HAVE_ZLIB 1 #cmakedefine USE_ROUTING 1 #cmakedefine HAVE_GTK2 1 #cmakedefine HAVE_FONTCONFIG 1 #cmakedefine USE_PLUGINS 1 #cmakedefine SDL_TTF 1 #cmakedefine SDL_IMAGE 1 #cmakedefine HAVE_QT_SVG 1 #cmakedefine HAVE_UNISTD_H 1 #cmakedefine DBUS_USE_SYSTEM_BUS 1 #cmakedefine HAVE_SOCKET 1 #cmakedefine HAVE_SNPRINTF 1 #cmakedefine HAVE_DECL__SNPRINTF 1 #cmakedefine HAVE_WINSOCK 1 #cmakedefine HAVE_MEMALIGN 1 #cmakedefine HAVE_POSIX_MEMALIGN 1 #cmakedefine HAVE_VALLOC 1 #cmakedefine HAVE_LC_MESSAGES 1 #cmakedefine HAVE_SYS_TIME_H 1 #cmakedefine HAVE_POPEN 1 #cmakedefine HAVE_GETOPT_H 1 #cmakedefine HAVE_GETTIMEOFDAY 1 #cmakedefine HAVE__ATOI64 1 #cmakedefine HAVE_STRING_H 1 #cmakedefine EZXML_NOMMAP 0 #cmakedefine HAVE_STPCPY 1 #cmakedefine HAVE_SBRK 1 #cmakedefine HAVE_PRAGMA_PACK 1 #cmakedefine HAVE_GETDELIM 1 #cmakedefine HAVE_GETLINE 1 #cmakedefine HAVE_FSYNC 1 #cmakedefine HAVE_ENDIAN_H 1 #cmakedefine HAVE_FREEIMAGE 1 #cmakedefine USE_OPENGLES 1 #cmakedefine USE_OPENGLES2 1 #cmakedefine HAVE_SHMEM 1 #cmakedefine HAVE_IMLIB2 1 navit-0.5.0+dfsg.1/configure.in000066400000000000000000001473771264204753600162600ustar00rootroot00000000000000AC_INIT(navit, 0.5.0) AC_CONFIG_MACRO_DIR([m4]) SOURCE_MODE=svn AM_INIT_AUTOMAKE AM_CONFIG_HEADER(config.h) AC_SUBST(SOURCE_MODE) AM_CONDITIONAL(SOURCE_MODE_SVN, [test "x${SOURCE_MODE}" = "xsvn"]) if test "x${SOURCE_MODE}" = "xsvn" ; then USE_MAINTAINER_MODE=yes else USE_MAINTAINER_MODE=no fi AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is enabled by default (reason of inclusion of this function) AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) AM_MAINTAINER_MODE plugins=yes; plugins_reason=default postgresql=yes; postgresql_reason=default samplemap=yes; samplemap_reason=default binding_dbus=yes; binding_dbus_reason=default binding_dbus_use_system_bus=no binding_python=yes; binding_python_reason=default binding_win32=no; binding_win32_reason=default font_freetype=yes; font_freetype_reason=default fontconfig=yes; fontconfig_reason=default fribidi=yes; fribidi_reason=default gui_gtk=no; gui_gtk_reason=default gui_win32=no; gui_win32_reason=default gui_internal=yes; gui_internal_reason=default gui_qml=no; gui_qml_reason=default graphics=yes; graphics_reason=default graphics_gd=no; graphics_gd_reason=default graphics_gtk_drawing_area=no; graphics_gtk_drawing_area_reason=default graphics_qt_qpainter=yes; graphics_qt_qpainter_reason=default graphics_null=yes; graphics_null_reason=default graphics_opengl=yes; graphics_opengl_reason=default graphics_sdl=yes; graphics_sdl_reason=default graphics_win32=no; graphics_win32_reason=default maptool=yes; maptool_reason=default map_binfile=yes; map_binfile_reason=default map_filter=yes; map_filter_reason=default map_mg=yes; map_mg_reason=default map_shapefile=yes; map_shapefile_reason=default map_textfile=yes; map_textfile_reason=default map_csv=yes; map_csv_reason=default osd_core=yes; osd_core_reason=default plugin_pedestrian=no; plugin_pedestrian_reason=default routing=yes; routing_reason=default speech_android=no; speech_android_reason=default speech_cmdline=yes; speech_cmdline_reason=default speech_dbus=no; speech_dbus_reason=default speech_espeak=no; speech_espeak_reason=default speech_speech_dispatcher=yes; speech_speech_dispatcher_reason=default vehicle_demo=yes; vehicle_demo_reason=default vehicle_file=yes; vehicle_file_reason=default vehicle_gpsd=yes; vehicle_gpsd_reason=default vehicle_gpsd_dbus=no; vehicle_gpsd_dbus_reason=default vehicle_gypsy=yes; vehicle_gypsy_reason=default vehicle_null=no; vehicle_null_reason=default vehicle_wince=no; vehicle_wince_reason=default vehicle_iphone=no; vehicle_iphone_reason=default vehicle_android=no; vehicle_android_reason=default graphics_android=no; graphics_android_reason=default vehicle_maemo=no; vehicle_maemo_reason=default vehicle_webos=no; vehicle_webos_reason=default shared_libnavit=no LIBNAVIT=navit bin_navit=yes AC_CANONICAL_HOST win32=no win32ce=no case $host_os in wince|mingw32ce|cegcc) win32=yes win32ce=yes AC_DEFINE(HAVE_API_WIN32_BASE, 1, [Have Windows Base API]) AC_DEFINE(HAVE_API_WIN32_CE, 1, [Have Windows CE API]) AC_DEFINE(HAVE_PRAGMA_PACK, 1, [Have pragma pack]) binding_win32=yes; binding_win32_reason="host_os is wince" gui_win32=yes; gui_win32_reason="host_os is wince" graphics_win32=yes; graphics_win32_reason="host_os is wince" vehicle_wince=yes; vehcile_wince_reason="host_os is wince" speech_espeak=yes; speech_espeak_reason="host_os is wince" support_libpng=yes maptool=no; maptool_reason="host_os is wince" ;; mingw32) win32=yes AC_DEFINE(HAVE_API_WIN32_BASE, 1, [Have Windows Base API]) AC_DEFINE(HAVE_API_WIN32, 1, [Have Windows API]) binding_win32=yes; binding_win32_reason="host_os is mingw32" gui_win32=yes; gui_win32_reason="host_os is mingw32" graphics_win32=yes; graphics_win32_reason="host_os is mingw32" speech_espeak=yes; speech_espeak_reason="host_os is mingw32" support_libpng=yes ;; linux*_android) android=yes shared_libnavit=yes bin_navit=no AC_DEFINE(HAVE_API_ANDROID, 1, [Have Android API]) echo "void dl_unwind_find_exidx(void) {}" >crt0.c $CC -c crt0.c $AR r libg.a crt0.o vehicle_android=yes; vehicle_android_reason="host_os is android" graphics_android=yes; graphics_android_reason="host_os is android" speech_android=yes; speech_android_reason="host_os is android" MODULE_LDFLAGS="-module -Xcompiler -nostdlib -Xcompiler -Wl,-rpath -Xcompiler -Wl,/data/data/org.navitproject.navit/lib" MODULE_LIBADD="-llog" LIBNAVIT=_data_data_org.navitproject.navit_lib_navit NAVIT_MODULE_LDFLAGS="$MODULE_LDFLAGS -L\$(top_builddir)/navit -l$LIBNAVIT" ;; esac if test "x$win32" = "xyes" then NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/win32" NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/win32 -lsupport_win32" NAVIT_SOCKET_LDFLAGS="$MODULE_LDFLAGS -lws2_32" fi AM_CONDITIONAL(SUPPORT_WIN32, [test "x$win32" = "xyes"]) AM_CONDITIONAL(SUPPORT_WIN32CE, [test "x$win32ce" = "xyes"]) AM_CONDITIONAL(SUPPORT_ANDROID, [test "x$android" = "xyes"]) if test "x$support_libpng" = "xyes" then NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/libpng" NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/libpng -lsupport_libpng" fi AM_CONDITIONAL(SUPPORT_LIBPNG, [test "x$support_libpng" = "xyes"]) AC_SUBST(MODULE_LDFLAGS) AC_SUBST(MODULE_LIBADD) AC_SUBST(NAVIT_MODULE_LDFLAGS) AC_SUBST(NAVIT_SOCKET_LDFLAGS) LIBS="$LIBS -lm" if test "$win32" == "no" -a test "$host_os" != "cygwin"; then LIBS="$LIBS -rdynamic" fi m4_ifndef([AC_USE_SYSTEM_EXTENSIONS], [AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS], [AC_GNU_SOURCE])]) AC_USE_SYSTEM_EXTENSIONS m4_ifdef([AC_PROG_OBJC],[AC_PROG_OBJC]) AC_PROG_CC m4_ifdef([AC_PROG_OBJC],[AC_PROG_OBJC],[AC_SUBST([OBJC],["$CC"]) AC_SUBST([OBJCFLAGS],["$CFLAGS"])]) m4_ifndef([AC_PROG_OBJC],[_AM_DEPENDENCIES(OBJC)]) if eval "test x`uname` = xDarwin"; then CFLAGS="$CFLAGS -I/opt/local/include -L/opt/local/lib" fi if eval "test x$GCC = xyes"; then CFLAGS="$CFLAGS -Wall -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" fi AM_PROG_CC_C_O AC_PROG_CXX if eval "test x$GXX = xyes"; then CXXFLAGS="$CXXFLAGS -Wall -Wcast-align -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" fi PKG_CHECK_EXISTS if test "x${cross_compiling}" = "xyes"; then samplemap="no";samplemap_reason="not supported for cross compiling" binding_python="no";binding_python_reason="not supported for cross compiling" postgresql="no";postgresql_reason="not supported for cross compiling" AC_MSG_CHECKING([for a C compiler for build tools]) AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc) else CC_FOR_BUILD=$CC fi CCLD_FOR_BUILD="$CC_FOR_BUILD" AC_SUBST(cross_compiling) AM_CONDITIONAL(CROSS_COMPILING, test "x${cross_compiling}" = "xyes") AC_SUBST(CC_FOR_BUILD) AC_SUBST(CCLD_FOR_BUILD) # Endianness # defines WORDS_BIGENDIAN for big-endian systems AC_C_BIGENDIAN AC_ARG_ENABLE(variant, [ --enable-variant=something set variant], NAVIT_VARIANT=$enableval) AC_SUBST(NAVIT_VARIANT) AC_ARG_ENABLE(cache-size, [ --enable-cache-size=size in bytes set cache size], AC_DEFINE_UNQUOTED(CACHE_SIZE,[${enableval}], [Size of Cache in Bytes]),AC_DEFINE(CACHE_SIZE,[1048576], [Size of Cache in Bytes])) AC_ARG_ENABLE(avoid-unaligned, [ --enable-avoid-unaligned avoid unaligned accesses], AVOID_UNALIGNED=$enableval, AVOID_UNALIGNED=no) test x"${AVOID_UNALIGNED}" = xyes && AC_DEFINE(AVOID_UNALIGNED,[],Define to avoid unaligned access) AC_ARG_ENABLE(avoid-float, [ --enable-avoid-float avoid floating point calculations], AVOID_FLOAT=$enableval, AVOID_FLOAT=no) test x"${AVOID_FLOAT}" = xyes && AC_DEFINE(AVOID_FLOAT,[],Define to avoid floating point) AC_ARG_ENABLE(transformation-roll, [ --enable-transformation-roll add support for specifying roll angle in transformation], ENABLE_ROLL=$enableval, ENABLE_ROLL=no) test x"${ENABLE_ROLL}" = xyes && AC_DEFINE(ENABLE_ROLL,[],Define to add support for specifying roll angle in transformation) AC_ARG_ENABLE(hildon, [ --disable-hildon build without maemo/hildon support], enable_hildon=$enableval, enable_hildon=yes) if test "x${enable_hildon}" = "xyes" ; then PKG_CHECK_MODULES(HILDON, hildon-1 >= 0.9.9, , [ AC_MSG_RESULT(no) enable_hildon=no ]) PKG_CHECK_MODULES(GPSBT, gpsbt, [ AC_DEFINE(HAVE_GPSBT, 1, [Have the gpsbt library]) AC_SUBST(GPSBT_CFLAGS) AC_SUBST(GPSBT_LIBS) ], [ AC_MSG_RESULT(no) ]) if test x"${enable_hildon}" = xyes ; then AC_DEFINE(USE_HILDON, 1, [Build with maemo/hildon support]) AC_SUBST(HILDON_CFLAGS) AC_SUBST(HILDON_LIBS) fi fi AM_CONDITIONAL(USE_HILDON, test "${enable_hildon}" = "xyes") AC_ARG_ENABLE(osso, [ --disable-osso build without maemo/osso support], enable_osso=$enableval, enable_osso=yes) if test "x${enable_osso}" = "xyes" ; then PKG_CHECK_MODULES(LIBOSSO, libosso, , [ AC_MSG_RESULT(no) enable_osso=no ]) if test x"${enable_osso}" = xyes ; then AC_DEFINE(USE_OSSO, 1, [Build with maemo/osso support]) AC_SUBST(LIBOSSO_CFLAGS) AC_SUBST(LIBOSSO_LIBS) fi fi echo ${enable_osso} AM_CONDITIONAL(USE_OSSO, test "x${enable_osso}" = "xyes") AC_ARG_ENABLE(garmin, [ --disable-garmin disable garmin support], USE_GARMIN=$enableval, USE_GARMIN=yes) # samplemap AC_PATH_PROG(_PATH_BZCAT,[bzcat]) if test "x${_PATH_BZCAT}" = "x" ; then samplemap=no; samplemap_reason="bzcat missing" fi AC_ARG_ENABLE(maptool, [ --disable-maptool don't build maptool], maptool=$enableval;maptool_reason="configure parameter") AM_CONDITIONAL(MAPTOOL, [test "x$maptool" = "xyes"]) if test "x$maptool" != "xyes"; then samplemap=no; samplemap_reason="maptool disabled" fi AC_ARG_ENABLE(samplemap, [ --disable-samplemap don't build the samplemap], samplemap=$enableval;samplemap_reason="configure parameter") AM_CONDITIONAL(BUILD_SAMPLEMAP, [test "x$samplemap" = "xyes"]) AC_ARG_ENABLE(fastmath, [ --disable-fastmath don't build with fastmath], fastmath=$enableval, fastmath=yes) AM_CONDITIONAL(FASTMATH, [test "x$fastmath" = "xyes"]) if test x"$fastmath" = xyes; then if eval "test x$GCC = xyes"; then CFLAGS="$CFLAGS -ffast-math" fi fi X_CFLAGS="-I$x_includes" AS_IF([test -n "$ac_x_libraries"], [X_LIBS="-L$ac_x_libraries"]) # glib AC_ARG_ENABLE(glib, [ --disable-glib don't build with external glib], glib=$enableval, glib=yes) if test "x${glib}" = "xyes" -a "x${GLIB_CFLAGS}" = "x" -a "x${GLIB_LIBS}" = "x"; then PKG_CHECK_MODULES(GLIB, [glib-2.0 gthread-2.0], [glib=yes],[glib=no]) fi if test "x${glib}" = "xyes"; then AC_DEFINE(HAVE_GLIB, 1, [Define to 1 if you have (external) glib library]) else GLIB_CFLAGS="-I\$(top_srcdir)/navit/support -I\$(top_srcdir)/navit/support/glib -I\$(top_srcdir)/navit/support/ezxml" GLIB_LIBS="-L\$(top_builddir)/navit/support/glib -lsupport_glib -L\$(top_builddir)/navit/support/ezxml -lsupport_ezxml" if test "x${win32}" != "xyes" -a "x${android}" != "xyes"; then GLIB_LIBS="$GLIB_LIBS -lpthread" fi fi # gmodule AC_ARG_ENABLE(gmodule, [ --disable-gmodule don't build with gmodule], gmodule=$enableval, gmodule=yes) if test x"${gmodule}" = "xyes"; then PKG_CHECK_MODULES(GMODULE, [gmodule-2.0], [gmodule=yes], [gmodule=no]) fi if test "x${gmodule}" = "xyes"; then AC_DEFINE(HAVE_GMODULE, 1, [Define to 1 if you have gmodule]) else AC_CHECK_LIB(dl, dlopen, [plugins_reason="default, via dlopen";GMODULE_LIBS="-ldl";AC_DEFINE(HAVE_DLOPEN, 1, [Define to 1 if you have dlopen])], [plugins="no"; plugins_reason="package gmodule and dlopen missing"] ) fi # libcrypto AC_CHECK_LIB(crypto, AES_encrypt, [CRYPTO_LIBS="-lcrypto";AC_DEFINE(HAVE_LIBCRYPTO, 1, [Define to 1 if you have libcrypto])]) AC_SUBST(CRYPTO_LIBS) # plugins AC_ARG_ENABLE(plugins, [ --disable-plugins disable plugins], [ plugins=$enableval;plugin_reason="configure parameter" ]) AC_ARG_ENABLE(shared-libnavit, [ --enable-shared-libnavit], [ shared_libnavit=$enableval]) if test "x${plugins}" = "xyes"; then AC_ENABLE_SHARED AC_DISABLE_STATIC AC_DEFINE( [USE_PLUGINS], [], Define to 1 if you have plugins. ) if test "x${win32}" = "xyes"; then shared_libnavit=yes NAVIT_MODULE_LDFLAGS="-no-undefined -L\$(top_builddir)/navit -l$LIBNAVIT -L\$(top_builddir)/intl -lintl" fi else if test "x${shared_libnavit}" = "xyes"; then AC_ENABLE_SHARED AC_DISABLE_STATIC else AC_DISABLE_SHARED AC_ENABLE_STATIC fi fi AM_CONDITIONAL(PLUGINS, [test "x$plugins" = "xyes"]) AM_CONDITIONAL(SHARED_LIBNAVIT, [test "x$shared_libnavit" = "xyes"]) AM_CONDITIONAL(BIN_NAVIT, [test "x$bin_navit" = "xyes"]) AC_PROG_LIBTOOL AC_SUBST(LIBNAVIT) AM_CONDITIONAL(EVENT_GLIB, [test "x$glib" = "xyes"]) AM_CONDITIONAL(SUPPORT_GLIB, [test "x$glib" = "xno"]) AM_CONDITIONAL(SUPPORT_EZXML, [test "x$glib" = "xno"]) AC_CHECK_HEADER([sys/time.h], [AC_DEFINE( [HAVE_SYS_TIME_H], [1], [Define to 1 if you have the header file.]) ]) if test "x${ZLIB_CFLAGS}" = "x" -a "x${ZLIB_LIBS}" = "x"; then AC_CHECK_HEADER( zlib.h, AC_DEFINE( [HAVE_ZLIB], [], Define to 1 if you have the header file. ) ZLIB_LIBS="-lz" zlib=yes, ZLIB_CFLAGS="-I\$(top_srcdir)/navit/support/zlib" ZLIB_LIBS="-L\$(top_builddir)/navit/support/zlib -lsupport_zlib" zlib=no ) else zlib=yes fi AM_CONDITIONAL(SUPPORT_ZLIB, [test "x$zlib" = "xno"]) AC_SUBST(ZLIB_CFLAGS) AC_SUBST(ZLIB_LIBS) AC_CHECK_HEADER(sys/socket.h, AC_DEFINE([HAVE_SOCKET],[],Define to 1 if you have sockets)) AC_CHECK_HEADER(winsock2.h, AC_DEFINE([HAVE_WINSOCK],[],Define to 1 if you have Windows sockets)) # gtk PKG_CHECK_MODULES(GTK2, [gtk+-2.0], [gtk2_pkgconfig=yes], [gtk2_pkgconfig=no]) if test "x$gtk2_pkgconfig" = "xyes"; then AC_DEFINE(HAVE_GTK2, 1, [Define to 1 if you have gtk2]) graphics_gtk_drawing_area=yes; graphics_gtk_drawing_area_reason="gtk+-2.0 present" gui_gtk=yes; gui_gtk_reason="gtk+-2.0 present" fi # fsync AC_MSG_CHECKING(for fsync) AC_TRY_LINK([#include ], [fsync(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_FSYNC, 1, [Define to 1 if you have the `fsync' function.]),AC_MSG_RESULT(no)) # system AC_MSG_CHECKING(for system) AC_TRY_LINK([#include ], [system("/bin/true");],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_SYSTEM, 1, [Define to 1 if you have the `system' function.]),speech_cmdline=no; speech_cmdline_reason="not supported without system()"; AC_MSG_RESULT(no)) AC_MSG_CHECKING(for CreateProcess) AC_TRY_LINK([#include ], [CreateProcess(NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_CREATEPROCESS, 1, [Define to 1 if you have the `CreateProcess' function.]) speech_cmdline=yes; speech_cmdline_reason="CreateProcess exists", AC_MSG_RESULT(no)) # sbrk AC_MSG_CHECKING(for sbrk) AC_TRY_LINK([#include ], [sbrk(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_SBRK, 1, [Define to 1 if you have the `sbrk' function.]),AC_MSG_RESULT(no)) AC_ARG_ENABLE(graphics-sdl, [ --disable-graphics-sdl don't create graphics sdl], graphics_sdl=$enableval;graphics_sdl_reason="configure parameter") if test "x${graphics_sdl}" = "xyes" ; then PKG_CHECK_MODULES(SDL, [sdl], [graphics_sdl="yes" graphics_sdl_reason="sdl present"] , [graphics_sdl="no" graphics_sdl_reason="sdl not available"] ) AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) fi if test "x${graphics_sdl}" = "xyes" ; then save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$SDL_CFLAGS $CPPFLAGS" AC_CHECK_HEADER(SDL_image.h,SDL_IMAGE_LIBS=-lSDL_image,graphics_sdl="no";graphics_sdl_reason="SDL_image.h missing") AC_SUBST(SDL_IMAGE_LIBS) CPPFLAGS=$save_CPPFLAGS fi if test "x${graphics_sdl}" = "xyes" ; then AC_DEFINE(GRAPHICS_SDL, 1, [Build with graphics sdl]) fi AM_CONDITIONAL(GRAPHICS_SDL, test "x${graphics_sdl}" = "xyes") AC_ARG_ENABLE(postgresql, [ --disable-postgresql don't add postgresql support to maptool], postgresql=$enableval;postgresql_reason="configure parameter") if test "x${postgresql}" = "xyes" ; then if test -z "$PG_CONFIG"; then AC_PATH_PROG([PG_CONFIG], [pg_config], []) fi AC_MSG_CHECKING([for PostgreSQL libraries with $PG_CONFIG]) if test ! -x "$PG_CONFIG"; then if test "x${PG_CONFIG}" = "x" ; then postgresql_reason="$PG_CONFIG not executable" else postgresql_reason="pg_config missing" fi postgresql=no AC_MSG_RESULT([no]) else POSTGRESQL_CFLAGS="-I`$PG_CONFIG --includedir`" POSTGRESQL_LIBS="-L`$PG_CONFIG --libdir` -lpq" AC_DEFINE(HAVE_POSTGRESQL, 1, [Postgresql libraries available]) AC_SUBST(POSTGRESQL_CFLAGS) AC_SUBST(POSTGRESQL_LIBS) AC_MSG_RESULT([yes]) fi fi AM_CONDITIONAL(HAVE_POSTGRESQL, test "x${postgresql}" = "xyes") # font # freetype AC_ARG_ENABLE(font-freetype, [ --disable-font-freetype don't add freetype support], font_freetype=$enableval;font_freetype_reason="configure parameter") if test "x${font_freetype}" = "xyes" -a "x${FREETYPE2_CFLAGS}" = "x" -a "x${FREETYPE2_LIBS}" = "x"; then PKG_CHECK_MODULES(FREETYPE2, [freetype2], , [font_freetype=no;font_freetype_reason="Package freetype2 missing"]) else fribidi=no fi AC_SUBST(FREETYPE2_CFLAGS) AC_SUBST(FREETYPE2_LIBS) AM_CONDITIONAL(FONT_FREETYPE, test "x${font_freetype}" = "xyes") AC_ARG_WITH(freetype-fonts, [ --with-freetype-fonts specify what fonts to use], AC_DEFINE_UNQUOTED(FREETYPE_FONTS,[${withval}],[Freetype fonts to use])) AC_ARG_ENABLE(fontconfig, [ --disable-fontconfig don't' add fontconfig support], fontconfig=$enableval;fontconfig_reason="configure parameter") if test "x${fontconfig}" = "xyes"; then PKG_CHECK_MODULES(FONTCONFIG, [fontconfig], [fontconfig=yes], [fontconfig=no]) fi if test "x$fontconfig" = "xyes"; then AC_DEFINE(HAVE_FONTCONFIG, 1, [Define to 1 if you have fontconfig]) fi AC_SUBST(FONTCONFIG_CFLAGS) AC_SUBST(FONTCONFIG_LIBS) AM_CONDITIONAL(FONTS, test "x${font_freetype}" = "xyes" -a "x$fontconfig" != "xyes") # fribidi AC_ARG_ENABLE(fribidi, [ --disable-fribidi dont build with fribidi], fribidi=$enableval;fribidi_reason="configure parameter", fribidi=yes) if test x"${fribidi}" = "xyes"; then PKG_CHECK_MODULES(FRIBIDI2, [fribidi >= 0.19.0], [fribidi=yes;oldfribidi=no], [ PKG_CHECK_MODULES([FRIBIDI], [fribidi], [fribidi=yes;oldfribidi=yes;fribid_reason="using old version"], [fribidi=no;fribidi_reason="FriBidi library not found"]) ]) fi if test x"${fribidi}" = "xyes"; then AC_DEFINE(USE_FRIBIDI, 1, [Build with fribidi support]) fi if test x"${oldfribidi}" = "xyes"; then AC_DEFINE(FRIBIDIOLD, 1, [Build with fribidi support for older versions of fribidi]) fi AC_SUBST(FRIBIDI2_CFLAGS) AC_SUBST(FRIBIDI2_LIBS) AC_SUBST(FRIBIDI_CFLAGS) AC_SUBST(FRIBIDI_LIBS) PKG_CHECK_MODULES(IMLIB2, [imlib2], [imlib2_pkgconfig=yes], [imlib2_pkgconfig=no]) if test "x$imlib2_pkgconfig" = "xyes"; then AC_DEFINE(HAVE_IMLIB2, 1, [Define to 1 if you have imlib2]) fi AC_SUBST(IMLIB2_CFLAGS) AC_SUBST(IMLIB2_LIBS) AC_ARG_ENABLE(graphics-opengl, [ --disable-graphics-opengl disable graphics type OpenGL], graphics_opengl=$enableval;graphics_opengl_reason="configure parameter") if test "x${graphics_opengl}" = "xyes" ; then AC_CHECK_HEADER( GL/gl.h, AC_DEFINE( [HAVE_OPENGL], [], Define to 1 if you have the header file. ) OPENGL_LIBS="$X_LIBS -lGL -lglut -lfreeimage" opengl=yes, AC_MSG_WARN([*** no GL/gl.h -- opengl graphics support disabled];graphics_opengl=no;graphics_opengl_reason="GL/gl.h header missing") ) AC_CHECK_HEADER( GL/glut.h, AC_DEFINE( [HAVE_GLUT], [], Define to 1 if you have the header file. ) glut=yes, AC_MSG_WARN([*** no GL/glut.h -- opengl graphics support disabled]);graphics_opengl=no;graphics_opengl_reason="GL/glut.h header missing" ) AC_CHECK_HEADER( GL/freeglut.h, AC_DEFINE( [HAVE_FREEGLUT], [], Define to 1 if you have the header file. ) freeglut=yes, AC_MSG_WARN([*** no GL/freeglut.h -- opengl support disabled]);graphics_opengl=no;graphics_opengl_reason="Headers missing" ) AC_SUBST(OPENGL_CFLAGS) AC_SUBST(OPENGL_LIBS) AC_CHECK_HEADER( GL/glc.h, AC_DEFINE( [HAVE_GLC], [], Define to 1 if you have the header file. ) GLC_LIBS="-lGLC" glc=yes, AC_MSG_WARN([*** no GL/glc.h -- opengl graphics support disabled]);graphics_opengl=no;graphics_opengl_reason="GL/glc.h header missing" ) AC_CHECK_HEADER( FreeImage.h, AC_DEFINE( [HAVE_FREEIMAGE], [1], Define to 1 if you have the header file. ) FREEIMAGE_LIBS="-lfreeimage" freeimage=yes, AC_MSG_WARN([*** no FreeImage.h -- opengl support disabled]);graphics_opengl=no;graphics_opengl_reason="Headers missing" ) AC_SUBST(FREEIMAGE_LIBS) AC_SUBST(GLC_CFLAGS) AC_SUBST(GLC_LIBS) fi AM_CONDITIONAL(GRAPHICS_OPENGL, [test "x$glut" = "xyes" -a "x$freeglut" = "xyes" -a "x$opengl" = "xyes" -a "x$freeimage" = "xyes" -a "x$glc" = "xyes" ]) system_shapefile=no if test x"${map_shapefile}" = xyes then AC_CHECK_HEADERS( [shapefil.h libshp/shapefil.h], [AC_DEFINE( [HAVE_SYS_SHAPEFILELIB], [1], Define to 1 if you have the header file. )], [SHAPEFILE_CFLAGS="-I\$(top_srcdir)/navit/support/shapefile"] ) AC_CHECK_LIB( [shp], [DBFDeleteField], [SHAPEFILE_LIBS="-lshp" system_shapefile=yes], [SHAPEFILE_LIBS="-L\$(top_builddir)/navit/support/shapefile -lsupport_shapefile" system_shapefile=no] ) if test x"${system_shapefile}" = xno then AC_MSG_WARN([*** The shapefile library(libshp) from the system is to old or not found! -- using included copy]) fi fi AC_SUBST(SHAPEFILE_CFLAGS) AC_SUBST(SHAPEFILE_LIBS) AM_CONDITIONAL(HAVE_SYSTEM_SHAPEFILELIB, [test "x$system_shapefile" = "xyes" ]) if test x"${USE_GARMIN}" = xyes then # check for libgarmin PKG_CHECK_MODULES(LIBGARMIN, libgarmin, use_libgarmin=yes, use_libgarmin=no) AC_SUBST(LIBGARMIN_CFLAGS) AC_SUBST(LIBGARMIN_LIBS) fi AM_CONDITIONAL(HAVELIBGARMIN, [test "x$use_libgarmin" = "xyes"]) ## binding # python AC_ARG_ENABLE(binding-python, [ --disable-binding-python don't create binding python], binding_python=$enableval;binding_python_reason="configure parameter") if test "x${binding_python}" = "xyes"; then AC_PATH_PROG(_PATH_PYTHON,[python]) dnl Libraries and flags for embedded Python. dnl FIXME: I wish there was a less icky way to get this. if test "x${_PATH_PYTHON}" != "x" ; then AC_MSG_CHECKING(for Python linkage) AC_PATH_PROG([PYTHONCONFIG], [python-config], []) if test "x${PYTHONCONFIG}" = "x" ; then py_prefix=`$_PATH_PYTHON -c 'import sys; print sys.prefix'` py_ver=`$_PATH_PYTHON -c 'import sys; print sys.version[[:3]]'` py_lib=`$_PATH_PYTHON -c 'import sys; print sys.lib'` py_libdir="${py_prefix}/${py_lib}/python${py_ver}" PYTHON_CFLAGS="-I${py_prefix}/include/python${py_ver}" if test -f $py_libdir/config/Makefile -a -f $py_prefix/include/python${py_ver}/Python.h; then py_libs=`grep '^LIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_libc=`grep '^LIBC=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_libm=`grep '^LIBM=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_liblocalmod=`grep '^LOCALMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` py_libbasemod=`grep '^BASEMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` PYTHON_LIBS="-L$py_libdir/config $py_libs $py_libc $py_libm -lpython$py_ver $py_liblocalmod $py_libbasemod" PYTHON_LIBS=`echo $PYTHON_LIBS | sed -e 's/[ \\t]*/ /g'` AC_MSG_RESULT($py_libdir) else binding_python="no" binding_python_reason="$py_libdir/config/Makefile or $py_prefix/include/python${py_ver}/Python.h missing" fi else PYTHON_CFLAGS="`${PYTHONCONFIG} --cflags`" PYTHON_LIBS="`${PYTHONCONFIG} --ldflags`" fi else binding_python="no" binding_python_reason="python executable missing" fi fi if test "x${binding_python}" = xyes ; then AC_DEFINE(USE_BINDING_PYTHON, 1, [Build with binding python]) fi AC_SUBST(PYTHON_CFLAGS) AC_SUBST(PYTHON_LIBS) AM_CONDITIONAL(BINDING_PYTHON, test "x${binding_python}" = "xyes") # dbus AC_ARG_ENABLE(binding-dbus, [ --disable-binding-dbus don't create binding dbus], binding_dbus=$enableval;binding_dbus_reason="configure parameter") AC_ARG_ENABLE(binding-dbus-use-system-bus, [ --enable-binding-dbus-use-system-bus use system bus for dbus binding], binding_dbus_use_system_bus=$enableval) if test "x${binding_dbus}" = "xyes" ; then PKG_CHECK_MODULES(DBUS, [dbus-glib-1], ,binding_dbus=no) fi if test "x${binding_dbus}" = "xyes" ; then AC_DEFINE(USE_BINDING_DBUS, 1, [Build with binding dbus]) vehicle_gpsd_dbus="yes" vehicle_gpsd_dbus_reason="dbus binding present" speech_dbus="yes" speech_dbus_reason="dbus binding present" fi if test "x${binding_dbus_use_system_bus}" = "xyes" ; then AC_DEFINE(DBUS_USE_SYSTEM_BUS, 1, [Use system bus instead of session bus for binding dbus]) fi AC_SUBST(DBUS_CFLAGS) AC_SUBST(DBUS_LIBS) AM_CONDITIONAL(BINDING_DBUS, test "x${binding_dbus}" = "xyes") AM_CONDITIONAL(VEHICLE_GPSD_DBUS, test "x${vehicle_gpsd_dbus}" = "xyes") AM_CONDITIONAL(SPEECH_DBUS, test "x${speech_dbus}" = "xyes") AC_ARG_WITH(dbus-service-dir, [ --with-dbus-service-dir specify where the dbus service dir resides], DBUS_SERVICE_DIR=$withval, DBUS_SERVICE_DIR="$datarootdir/dbus-1/services") AC_SUBST(DBUS_SERVICE_DIR) # win32 binding AC_ARG_ENABLE(binding-win32, [ --disable-binding-win32 don't create binding win32], binding_win32=$enableval;binding_win32_reason="configure parameter") if test "x${binding_win32}" = "xyes" ; then AC_DEFINE(USE_BINDING_WIN32, 1, [Build with binding win32]) fi AM_CONDITIONAL(BINDING_WIN32, test "x${binding_win32}" = "xyes") # svg AC_ARG_ENABLE(svg, [ --disable-svg disable Scalable Vector Graphics], enable_svg=$enableval, enable_svg=yes) AC_ARG_ENABLE(svg2png, [ --disable-svg2png disable conversion of svgs to pngs], enable_svg2png=$enableval, enable_svg2png=yes) AC_ARG_ENABLE(svg2png-scaling, [ --enable-svg2png-scaling enable conversion of svgs to pngs with specified sizes], SVG2PNG_SCALES=$enableval, SVG2PNG_SCALES="8 16 32 48 96") AC_ARG_ENABLE(svg2png-scaling-flag, [ --enable-svg2png-scaling-flag enable conversion of flag svgs to pngs with specified sizes], SVG2PNG_SCALES_FLAG=$enableval, SVG2PNG_SCALES_FLAG="8 16 32 48 96") AC_ARG_ENABLE(svg2png-scaling-nav, [ --enable-svg2png-scaling-nav enable conversion of nav svgs to pngs with specified sizes], SVG2PNG_SCALES_NAV=$enableval, SVG2PNG_SCALES_NAV="8 16 32 48 96") AC_ARG_WITH(svg2png-use-convert, [ --with-svg2png-use-convert use imagemagick's convert for png creation], SVG2PNG_CONVERTER="convert") AC_ARG_WITH(svg2png-use-rsvg-convert, [ --with-svg2png-use-rsvg-convert use librsvg's rsvg-convert for png creation], SVG2PNG_CONVERTER="rsvg-convert") AC_ARG_WITH(svg2png-use-inkscape, [ --with-svg2png-use-inkscape use inkscapes internal convert routines for png creation], SVG2PNG_CONVERTER="inkscape") AC_ARG_WITH(svg2png-use-ksvgtopng4, [ --with-svg2png-use-ksvgtopng4 use kde4's ksvgtopng4 for png creation], SVG2PNG_CONVERTER="ksvgtopng4") AC_ARG_WITH(svg2png-use-ksvgtopng, [ --with-svg2png-use-ksvgtopng use kde3's convert for png creation], SVG2PNG_CONVERTER="ksvgtopng") if test "x${enable_svg2png}" = "xyes" ; then if test "x${SVG2PNG_CONVERTER}" = "x"; then SVG2PNG_CONVERTER="rsvg-convert ksvgtopng ksvgtopng4 inkscape convert" fi AC_PATH_PROGS([SVG2PNG], ${SVG2PNG_CONVERTER}, [none]) if test "x${SVG2PNG}" = "xnone"; then enable_svg2png="no" fi fi AC_SUBST(SVG2PNG) AC_SUBST(SVG2PNG_SCALES) AC_SUBST(SVG2PNG_SCALES_FLAG) AC_SUBST(SVG2PNG_SCALES_NAV) AM_CONDITIONAL(USE_SVG2PNG_SCALES, test "x${SVG2PNG_SCALES}" != "xyes" -a "x${SVG2PNG_SCALES}" != "x") AM_CONDITIONAL(USE_SVG2PNG_SCALES_FLAG, test "x${SVG2PNG_SCALES_FLAG}" != "xyes" -a "x${SVG2PNG_SCALES_FLAG}" != "x") AM_CONDITIONAL(USE_SVG2PNG_SCALES_NAV, test "x${SVG2PNG_SCALES_NAV}" != "xyes" -a "x${SVG2PNG_SCALES_NAV}" != "x") AM_CONDITIONAL(USE_SVG2PNG, test "x${enable_svg2png}" = "xyes") AM_CONDITIONAL(USE_SVG, test "x${enable_svg}" = "xyes") # XSLTS AC_ARG_WITH(xslts, [ --with-xslts enable processing of navit.xml with given xslt scripts], XSLTS=$withval, XSLTS="") AC_SUBST(XSLTS) AC_ARG_WITH(saxon, [ --with-saxon specify the saxon xslt processor], SAXON=$withval, SAXON="saxon") AC_SUBST(SAXON) # Android Permissions AC_ARG_WITH(android-permissions, [ --with-android-permissions Set additional android permissions], ANDROID_PERMISSIONS=$withval, ANDROID_PERMISSIONS="") AC_SUBST(ANDROID_PERMISSIONS) # Android Project AC_ARG_WITH(android-project, [ --with-android-project Set android project], ANDROID_PROJECT=$withval, ANDROID_PROJECT="3") AC_SUBST(ANDROID_PROJECT) # NLS AC_ARG_ENABLE(nls, [ --disable-nls disable Native Language Support ( gettext/libintl )], enable_nls=$enableval, enable_nls=yes) INTLIBS="" MOFILES="" POFILES="" POIFILES="" LINGUAS="" xgettext_glade=no if test "x$enable_nls" = "xyes"; then AC_CHECK_FUNC(gettext, [HAVEGETTEXT="yes"],[INTLIBS="-lintl" HAVEGETTEXT="yes"]) AC_CHECK_PROG(XGETTEXT, xgettext, xgettext) AC_CHECK_PROG(MSGMERGE, msgmerge, msgmerge) AC_CHECK_PROG(MSGFMT, msgfmt, msgfmt) if test "$XGETTEXT" != ""; then if $XGETTEXT --help 2>&1 | grep illegal >/dev/null ; then echo "xgettext isn't GNU version" XGETTEXT="" else if echo '' | $XGETTEXT -L Glade - ; then xgettext_glade=yes fi fi fi if test "$XGETTEXT" != "" ; then PO="" if test "$LINGUAS" = ""; then ling=` (cd $srcdir/po; /bin/ls *.po.in) ` for l in $ling; do lcode=`basename $l .po.in` LINGUAS="$LINGUAS$lcode " done fi AC_DEFINE(USE_NATIVE_LANGUAGE_SUPPORT, [1], [NLS Please]) echo "xgettext and gettext() exist; will build i18n support for $LINGUAS" else LINGUAS="" PO="" echo "xgettext doesn't exist; will not build i18n support" enable_nls=no fi for lang in $LINGUAS; do MOFILES="$MOFILES $lang.mo" done for lang in $LINGUAS; do POFILES="$POFILES $lang.po" done for lang in $LINGUAS; do POIFILES="$POIFILES $lang.po.in" done AC_SUBST(INTLIBS) AC_SUBST(MOFILES) AC_SUBST(POFILES) AC_SUBST(POIFILES) AM_GNU_GETTEXT_VERSION AM_GNU_GETTEXT(no-libtool, need-ngettext, \$(top_builddir)/intl/) if test "x${shared_libnavit}" = "xyes" -a "x${win32ce}" = "xyes"; then INTLLIBS="\$(top_builddir)/intl/libintl.la" LIBINTL=$INTLLIBS LTLIBINTL=$INTLLIBS fi AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) if test x"$LIBINTL" != "x" ;then CFLAGS="$CFLAGS -I\$(top_builddir)/intl/" fi fi AM_CONDITIONAL(USE_NATIVE_LANGUAGE_SUPPORT, [test "x$enable_nls" = "xyes"]) AM_CONDITIONAL(XGETTEXT_GLADE, [test "x$xgettext_glade" = "xyes"]) AC_CHECK_HEADER( byteswap.h, AC_DEFINE( [HAVE_BYTESWAP_H], [1], [Define to 1 if you have byteswap.h], ) , ) AC_CHECK_HEADER(sys/endian.h,AC_DEFINE([USE_SYS_ENDIAN_H], [1], [Define to 1 if you have sys/endian.h],),) PACKAGE=navit AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") AC_DEFINE_UNQUOTED(VERSION, "$VERSION") AC_SUBST(PACKAGE) AC_SUBST(VERSION) AC_CHECK_HEADER(wordexp.h,wordexp_h=yes,wordexp_h=no;NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/wordexp";WORDEXP_LIBS="-L\$(top_builddir)/navit/support/wordexp -lsupport_wordexp") AM_CONDITIONAL(SUPPORT_WORDEXP, [test "x$wordexp_h" = "xno"]) support_libc=no AC_ARG_ENABLE(support_libc, [ --enable-support-libc enable builtin mini libc ], support_libc=$enableval) AM_CONDITIONAL(SUPPORT_LIBC, [test "x$support_libc" = "xyes"]) if test "x$support_libc" = "xyes"; then CFLAGS="$CFLAGS -I\$(top_srcdir)/navit/support/libc" LIBC_LIBS="-L\$(top_builddir)/navit/support/libc -lsupport_libc" fi ## graphics AC_ARG_ENABLE(graphics, [ --disable-graphics disable graphics], graphics=$enableval;graphics_reason="configure parameter") AM_CONDITIONAL(GRAPHICS, test "x${graphics}" = "xyes") if test "x$graphics" = "xyes"; then AC_DEFINE([USE_GRAPHICS],[1],Define to 1 if you want to use graphics.) fi # gd # android AC_ARG_ENABLE(graphics-android, [ --disable-graphics-android disable graphics type android], graphics_android=$enableval;graphics_android_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_ANDROID, test "x${graphics_android}" = "xyes") # gd AC_ARG_ENABLE(graphics-gd, [ --enable-graphics-gd enable graphics type gd], graphics_gd=$enableval;graphics_gd_reason="configure parameter") if test "x${graphics_gd}" = "xyes" ; then if test -z "$GDLIB_CONFIG"; then AC_PATH_PROG([GDLIB_CONFIG], [gdlib-config], []) fi AC_MSG_CHECKING([for gdlib with $GDLIB_CONFIG]) if test ! -x "$GDLIB_CONFIG"; then if test "x${GDLIB_CONFIG}" = "x" ; then graphics_gd_reason="$GDLIB_CONFIG not executable" else graphics_gd_reason="gdlib-config missing" fi graphics_gd=no AC_MSG_RESULT([no]) else if test "x${GD_CFLAGS}" = "x" ; then GD_CFLAGS="-I`$GDLIB_CONFIG --includedir`" fi if test "x${GD_LIBS}" = "x" ; then GD_LIBS="-L`$GDLIB_CONFIG --libdir` -lgd `$GDLIB_CONFIG --libs`" fi AC_SUBST(GD_CFLAGS) AC_SUBST(GD_LIBS) AC_MSG_RESULT([yes]) fi fi AM_CONDITIONAL(GRAPHICS_GD, test "x${graphics_gd}" = "xyes") AC_CHECK_HEADER( sys/shm.h, AC_DEFINE( [HAVE_SHMEM], [], Define to 1 if you have shared memory ) ) AC_CHECK_HEADER( X11/xpm.h, AC_DEFINE( [HAVE_XPM], [], Define to 1 if you have xpm header ) ) AC_CHECK_HEADER( getopt.h, AC_DEFINE( [HAVE_GETOPT_H], [], Define to 1 if you have the getopt header ) ) if test "x${graphics_gd}" = "xyes" ; then save_CPPFLAGS=$CPPFLAGS save_LIBS=$LIBS LIBS="$GD_LIBS $LIBS" CPPFLAGS="$GD_CFLAGS $CPPFLAGS" AC_TRY_LINK([#include ], [gdImageCreateFromPng(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_GRAPHICS_GD_PNG, 1, [Define to 1 if you have png support in gd.]),AC_MSG_RESULT(no)) CPPFLAGS=$save_CPPFLAGS LIBS=$save_LIBS fi # gtk_drawing_area AC_ARG_ENABLE(graphics-gtk-drawing-area, [ --disable-graphics-gtk-drawing-area disable graphics type gtk_drawing_area], graphics_gtk_drawing_area=$enableval;graphics_gtk_drawing_area_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_GTK_DRAWING_AREA, [test "x${graphics_gtk_drawing_area}" = "xyes"]) # null AC_ARG_ENABLE(graphics-null, [ --disable-graphics-null disable graphics type null], graphics_null=$enableval;graphics_null_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_NULL, test "x${graphics_null}" = "xyes") # win32 AC_ARG_ENABLE(graphics-win32, [ --disable-graphics-win32 disable graphics type win32], graphics_win32=$enableval;graphics_win32_reason="configure parameter") AM_CONDITIONAL(GRAPHICS_WIN32, test "x${graphics_win32}" = "xyes") # qt_qpainter AC_ARG_ENABLE(graphics-qt-qpainter, [ --disable-graphics-qt-qpainter disable graphics type qt-qpainter], graphics_qt_qpainter=$enableval;graphics_qt_qpainter_reason="configure parameter") if test "x${graphics_qt_qpainter}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_GUI, [QtGui QtCore],graphics_qt_qpainter=yes,graphics_qt_qpainter=no;graphics_qt_qpainter_reason="Packages QtGui and/or QtCore missing") if test "x${graphics_qt_qpainter}" = "xno"; then PKG_CHECK_MODULES(QT_GUI, [qt-mt],graphics_qt_qpainter=yes;graphics_qt_qpainter_reason="Package qt-mt present",graphics_qt_qpainter=no) fi fi if test "x${graphics_qt_qpainter}" = "xyes" ; then PKG_CHECK_MODULES(QT_SVG, [QtSvg], have_qt_svg=yes, have_qt_svg=no) if test "x${have_qt_svg}" = "xyes"; then AC_DEFINE([HAVE_QT_SVG],[],Define to 1 if qt supports svg) fi fi if test "x${graphics_qt_qpainter}" = "xyes" ; then AC_DEFINE(USE_GRAPICS_QT_QPAINTER, 1, [Build with graphics qt_qpainter]) fi AC_SUBST(QT_GUI_CFLAGS) AC_SUBST(QT_GUI_LIBS) AC_SUBST(QT_SVG_CFLAGS) AC_SUBST(QT_SVG_LIBS) AM_CONDITIONAL(GRAPHICS_QT_QPAINTER, test "x${graphics_qt_qpainter}" = "xyes") MOC=`$PKG_CONFIG QtGui --variable=moc_location` if test "x${MOC}" = "x"; then AC_CHECK_PROG(MOC, moc, moc) fi AC_SUBST(MOC) ## map # binfile AC_ARG_ENABLE(map-binfile, [ --disable-map-binfile disable map binfile], map_binfile=$enableval;map_binfile_reason="configure parameter") AM_CONDITIONAL(MAP_BINFILE, test "x${map_binfile}" = "xyes") # filter AC_ARG_ENABLE(map-filter, [ --disable-map-filter disable map filter], map_filter=$enableval;map_filter_reason="configure parameter") AM_CONDITIONAL(MAP_FILTER, test "x${map_filter}" = "xyes") # mg AC_ARG_ENABLE(map-mg, [ --disable-map-mg disable map mg], map_mg=$enableval;map_mg_reason="configure parameter") AM_CONDITIONAL(MAP_MG, test "x${map_mg}" = "xyes") # shapefile AC_ARG_ENABLE(map-shapefile, [ --disable-map-shapefile disable map shapefile], map_shapefile=$enableval;map_shapefile_reason="configure parameter") AM_CONDITIONAL(MAP_SHAPEFILE, test "x${map_shapefile}" = "xyes") # textfile AC_ARG_ENABLE(map-textfile, [ --disable-map-textfile disable map textfile], map_textfile=$enableval;map_textfile_reason="configure parameter") AM_CONDITIONAL(MAP_TEXTFILE, test "x${map_textfile}" = "xyes") # csv AC_ARG_ENABLE(map-csv, [ --disable-map-csv disable map csv], map_csv=$enableval;map_csv_reason="configure parameter") AM_CONDITIONAL(MAP_CSV, test "x${map_csv}" = "xyes") ## osd # core AC_ARG_ENABLE(osd-core, [ --disable-osd-core disable osd core], osd_core=$enableval;osd_core_reason="configure parameter") AM_CONDITIONAL(OSD_CORE, test "x${osd_core}" = "xyes") ## gui # gtk AC_ARG_ENABLE(gui-gtk, [ --disable-gui-gtk disable gui type gtk ], gui_gtk=$enableval) AM_CONDITIONAL(GUI_GTK, [test "x${gui_gtk}" = "xyes"]) # internal AC_ARG_ENABLE(gui-internal, [ --disable-gui-internal disable gui type internal], gui_internal=$enableval;gui_internal_reason="configure parameter") AM_CONDITIONAL(GUI_INTERNAL, test "x${gui_internal}" = "xyes") # win32 AC_ARG_ENABLE(gui-win32, [ --disable-gui-win32 disable gui type win32], gui_win32=$enableval;gui_win32_reason="configure parameter") AM_CONDITIONAL(GUI_WIN32, test "x${gui_win32}" = "xyes") # qml AC_ARG_ENABLE(gui-qml, [ --disable-gui-qml disable gui type QML], gui_qml=$enableval;gui_qml_reason="configure parameter") if test "x${gui_qml}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_GUI, [QtGui QtCore], ,gui_qml=no;gui_qml_reason="Packages QtGui and/or QtCore are missing") fi if test "x${gui_qml}" = "xyes" -a "x${QT_XML_CFLAGS}" = "x" -a "x${QT_XML_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_XML, [QtXml], ,gui_qml=no;gui_qml_reason="Package QtXml is missing") fi if test "x${gui_qml}" = "xyes" -a "x${QT_DECLARATIVE_CFLAGS}" = "x" -a "x${QT_DECLARATIVE_LIBS}" = "x"; then PKG_CHECK_MODULES(QT_DECLARATIVE, [QtDeclarative >= 4.6.0 ], ,gui_qml=no;gui_qml_reason="Packages QtDeclarative is missing") fi if test "x${gui_qml}" = "xyes" ; then AC_DEFINE(USE_GUI_QML, 1, [Build with gui qml]) fi AC_SUBST(QT_GUI_CFLAGS) AC_SUBST(QT_GUI_LIBS) AC_SUBST(QT_DECLARATIVE_CFLAGS) AC_SUBST(QT_DECLARATIVE_LIBS) AC_SUBST(QT_XML_CFLAGS) AC_SUBST(QT_XML_LIBS) AM_CONDITIONAL(GUI_QML, test "x${gui_qml}" = "xyes") ## plugins # pedestrian AC_ARG_ENABLE(plugin-pedestrian, [ --enable-plugin-pedestrian enable pedestrian plugin], plugin_pedestrian=$enableval;plugin_pedestrian_reason="configure parameter") AM_CONDITIONAL(PLUGIN_PEDESTRIAN, test "x${plugin_pedestrian}" = "xyes") ## routing AC_ARG_ENABLE(routing, [ --disable-routing disable routing], routing=$enableval;routing_reason="configure parameter") AM_CONDITIONAL(ROUTING, test "x${routing}" = "xyes") if test "x$routing" = "xyes"; then AC_DEFINE([USE_ROUTING],[1],Define to 1 if you want to have routing.) fi ## speech # android AC_ARG_ENABLE(speech-android, [ --disable-speech-android disable speech type android], speech_android=$enableval;speech_android_reason="configure parameter") AM_CONDITIONAL(SPEECH_ANDROID, test "x${speech_android}" = "xyes") # cmdline AC_ARG_ENABLE(speech-cmdline, [ --disable-speech-cmdline disable speech type cmdline], speech_cmdline=$enableval;speech_cmdline_reason="configure parameter") AM_CONDITIONAL(SPEECH_CMDLINE, test "x${speech_cmdline}" = "xyes") # espeak AC_ARG_ENABLE(speech-espeak, [ --disable-speech-espeak disable speech type espeak], speech_espeak=$enableval;speech_espeak_reason="configure parameter") AM_CONDITIONAL(SPEECH_ESPEAK, test "x${speech_espeak}" = "xyes") # speech-dispatcher AC_ARG_ENABLE(speech-speech-dispatcher, [ --disable-speech-speech-dispatcher disable speech type speech-dispatcher], speech_speech_dispatcher=$enableval;speech_speech_dispatcher_reason="configure parameter") if test "x$speech_speech_dispatcher" = "xyes"; then AC_CHECK_HEADER(libspeechd.h, AC_DEFINE([HAVE_LIBSPEECHD],[],Define to 1 if you have the header file.) SPEECHD_LIBS="-lspeechd", speech_speech_dispatcher=no; speech_speech_dispatcher_reason="libspeechd.h missing") fi AC_SUBST(SPEECHD_CFLAGS) AC_SUBST(SPEECHD_LIBS) AM_CONDITIONAL(SPEECH_SPEECH_DISPATCHER, test "x${speech_speech_dispatcher}" = "xyes") AM_CONDITIONAL(SUPPORT_ESPEAK, test "x${support_espeak}" = "xyes") ## vehicle # android AC_ARG_ENABLE(vehicle-android, [ --disable-vehicle-android disable vehicle type android], vehicle_android=$enableval;vehicle_android_reason="configure parameter") AM_CONDITIONAL(VEHICLE_ANDROID, test "x${vehicle_android}" = "xyes") # demo AC_ARG_ENABLE(vehicle-demo, [ --disable-vehicle-demo disable vehicle type demo], vehicle_demo=$enableval;vehicle_demo_reason="configure parameter") AM_CONDITIONAL(VEHICLE_DEMO, test "x${vehicle_demo}" = "xyes") # file AC_ARG_ENABLE(vehicle-file, [ --disable-vehicle-file disable vehicle type file], vehicle_file=$enableval;vehicle_file_reason="configure parameter") AM_CONDITIONAL(VEHICLE_FILE, test "x${vehicle_file}" = "xyes") # gpsd # We accept even old, buggy versions of libgps, because N810 uses an old version (see #1179). AC_ARG_ENABLE(vehicle-gpsd, [ --disable-vehicle-gpsd disable vehicle type gpsd], vehicle_gpsd=$enableval;vehicle_gpsd_reason="configure parameter") if test "x${vehicle_gpsd}" = xyes then PKG_CHECK_MODULES([GPSD], [libgps], have_libgps="yes", have_libgps="no") if test "x$have_libgps" = "xyes"; then AC_DEFINE([HAVE_LIBGPS],[],Define to 1 if you have libgps.) PKG_CHECK_MODULES([LIBGPS19], [libgps >= 2.90], have_libgps19="yes", have_libgps19="no") if test "x$have_libgps19" = "xyes"; then AC_DEFINE([HAVE_LIBGPS19],[],Define to 1 if you have libgps19.) fi else AC_CHECK_HEADER(gps.h, AC_DEFINE([HAVE_LIBGPS],[],Define to 1 if you have the header file.) GPSD_LIBS="-lgps", vehicle_gpsd=no; vehicle_gpsd_reason="no gps.h and no gpsd pkgconfig" ) fi fi AC_SUBST(GPSD_CFLAGS) AC_SUBST(GPSD_LIBS) AM_CONDITIONAL(VEHICLE_GPSD, [test "x${vehicle_gpsd}" = "xyes"]) # gypsy AC_ARG_ENABLE(vehicle-gypsy,[ --disable-vehicle-gypsy disable vehicle type gypsy], vehicle_gypsy=$enableval;vehicle_gypsy_reason="configure parameter") if test "x${vehicle_gypsy}" = "xyes" then PKG_CHECK_MODULES(GYPSY, gypsy, ,vehicle_gypsy=no;vehicle_gypsy_reason="package gypsy missing") fi AC_SUBST(GYPSY_CFLAGS) AC_SUBST(GYPSY_LIBS) AM_CONDITIONAL(VEHICLE_GYPSY, test "x${vehicle_gypsy}" = "xyes") # maemo AC_ARG_ENABLE(vehicle-maemo, [ --disable-vehicle-maemo disable vehicle type maemo], vehicle_maemo=$enableval;vehicle_maemo_reason="configure parameter") if test "x${vehicle_maemo}" = "xyes" ; then PKG_CHECK_MODULES(LIBLOCATION, liblocation, [ AC_SUBST(LIBLOCATION_CFLAGS) AC_SUBST(LIBLOCATION_LIBS) ], [ AC_MSG_RESULT(no) vehicle_maemo=no vehicle_maemo_reason="no maemo location library found" ]) fi AM_CONDITIONAL(VEHICLE_MAEMO, test "x${vehicle_maemo}" = "xyes") # null AC_ARG_ENABLE(vehicle-null, [ --enable-vehicle-null enable vehicle type null], vehicle_null=$enableval;vehicle_null_reason="configure parameter") AM_CONDITIONAL(VEHICLE_NULL, test "x${vehicle_null}" = "xyes") # wince AC_ARG_ENABLE(vehicle-wince, [ --disable-vehicle-wince disable vehicle type wince], vehicle_wince=$enableval;vehicle_wince_reason="configure parameter") AM_CONDITIONAL(VEHICLE_WINCE, test "x${vehicle_wince}" = "xyes") # iphone AC_ARG_ENABLE(vehicle-iphone, [ --disable-vehicle-iphone disable vehicle type iphone], vehicle_iphone=$enableval;vehicle_iphone_reason="configure parameter") AM_CONDITIONAL(VEHICLE_IPHONE, test "x${vehicle_iphone}" = "xyes") if test "x${vehicle_iphone}" = "xyes" then IPHONE_LIBS=-Wl,-framework,CoreLocation fi AC_SUBST(IPHONE_CFLAGS) AC_SUBST(IPHONE_LIBS) # webos AC_ARG_ENABLE(vehicle-webos, [ --enable-vehicle-webos enable vehicle type webos], vehicle_webos=$enableval;vehicle_webos_reason="configure parameter") AM_CONDITIONAL(VEHICLE_WEBOS, test "x${vehicle_webos}" = "xyes") if test "x${vehicle_webos}" = "xyes" then AC_DEFINE(USE_WEBOS,[],Build with webOS support) LIBPDL_CFLAGS="$SDL_CFLAGS -I/usr/local/include" LIBPDL_LIBS="-L/usr/local/lib -lpdl" AC_SUBST(LIBPDL_CFLAGS) AC_SUBST(LIBPDL_LIBS) fi NAVIT_CFLAGS="$NAVIT_CFLAGS $GLIB_CFLAGS $GMODULE_CFLAGS" NAVIT_LIBS="$NAVIT_LIBS $GLIB_LIBS $GMODULE_LIBS $LIBINTL" AC_SUBST(NAVIT_CFLAGS) AC_SUBST(NAVIT_LIBS) AC_SUBST(WORDEXP_LIBS) AC_SUBST(LIBC_LIBS) AC_SUBST(WINDRES) AC_CONFIG_FILES([ Makefile navit/Makefile navit/autoload/Makefile navit/autoload/osso/Makefile navit/binding/Makefile navit/binding/python/Makefile navit/binding/dbus/Makefile navit/binding/win32/Makefile navit/map/Makefile navit/map/mg/Makefile navit/map/textfile/Makefile navit/map/csv/Makefile navit/map/shapefile/Makefile navit/map/filter/Makefile navit/map/binfile/Makefile navit/map/garmin/Makefile navit/maptool/Makefile navit/fib-1.1/Makefile navit/font/Makefile navit/font/freetype/Makefile navit/fonts/Makefile navit/graphics/Makefile navit/graphics/android/Makefile navit/graphics/gd/Makefile navit/graphics/gtk_drawing_area/Makefile navit/graphics/opengl/Makefile navit/graphics/null/Makefile navit/graphics/sdl/Makefile navit/graphics/qt_qpainter/Makefile navit/graphics/win32/Makefile navit/gui/Makefile navit/gui/gtk/Makefile navit/gui/internal/Makefile navit/gui/win32/Makefile navit/gui/qml/Makefile navit/gui/qml/skins/Makefile navit/gui/qml/skins/navit/Makefile navit/osd/Makefile navit/osd/core/Makefile navit/plugin/Makefile navit/plugin/pedestrian/Makefile navit/speech/Makefile navit/speech/android/Makefile navit/speech/cmdline/Makefile navit/speech/dbus/Makefile navit/speech/espeak/Makefile navit/speech/speech_dispatcher/Makefile navit/support/Makefile navit/support/espeak/Makefile navit/support/ezxml/Makefile navit/support/glib/Makefile navit/support/libc/Makefile navit/support/libpng/Makefile navit/support/shapefile/Makefile navit/support/win32/Makefile navit/support/wordexp/Makefile navit/support/zlib/Makefile navit/vehicle/Makefile navit/vehicle/android/Makefile navit/vehicle/file/Makefile navit/vehicle/gpsd/Makefile navit/vehicle/gpsd_dbus/Makefile navit/vehicle/gypsy/Makefile navit/vehicle/maemo/Makefile navit/vehicle/null/Makefile navit/vehicle/demo/Makefile navit/vehicle/wince/Makefile navit/vehicle/iphone/Makefile navit/vehicle/webos/Makefile navit/xpm/Makefile navit/maps/Makefile intl/Makefile po/Makefile man/Makefile ]) #src/data/garmin_img/Makefile AC_OUTPUT echo "" echo "" echo "Summary of your installation :" # FIXME : maybe elaborate missing dependencies if test x"$graphics_sdl" != xyes then sdl_failures="(libsdl maybe?) " fi if test x"$glut" != xyes then sdl_failures=$sdl_failures"glut " fi if test -z "$sdl_failures" then echo "OpenGL gui : ENABLED, with $CEGUI_LIBS" else echo "OpenGL gui : DISABLED : you are missing $sdl_failures" fi if test x"$enable_hildon" = xyes then echo "Maemo/Hildon: ENABLED" else echo "Maemo/Hildon: DISABLED" fi if test x"$enable_osso" = xyes then echo "Maemo/OSSO: ENABLED" else echo "Maemo/OSSO: DISABLED" fi if test x"${USE_GARMIN}" = xyes then if test "x$use_libgarmin" = "xyes" then echo "Garmin IMG : ENABLED" else echo "Garmin IMG : DISABLED (you don't have libgarmin)" fi else echo "Garmin IMG : DISABLED (you requested it)" fi if test x"$LIBINTL" = "x" ;then nls_libs="system gettext support" else nls_libs="$LIBINTL" fi echo "Plugins: $plugins ($plugins_reason)" echo "Postgresql: $postgresql ($postgresql_reason)" echo "Samplemap: $samplemap ($samplemap_reason)" echo "NLS Support: $enable_nls ($nls_libs)" echo "Routing: $routing ($routing_reason)" echo "Font renderers:" echo " freetype: $font_freetype ($font_freetype_reason)" echo " FriBidi enabled: $fribidi ($fribidi_reason)" echo "Graphics types: $graphics ($graphics_reason)" echo " android: $graphics_android ($graphics_android_reason)" echo " gtk_drawing_area: $graphics_gtk_drawing_area ($graphics_gtk_drawing_area_reason)" echo " null: $graphics_null ($graphics_null_reason)" echo " qt_qpainter: $graphics_qt_qpainter ($graphics_qt_qpainter_reason)" echo " win32: $graphics_win32 ($graphics_win32_reason)" echo " OpenGL: $graphics_opengl ($graphics_opengl_reason)" echo " gd: $graphics_gd ($graphics_gd_reason)" echo " sdl: $graphics_sdl ($graphics_sdl_reason)" echo "GUI types:" echo " gtk: $gui_gtk ($gui_gtk_reason)" echo " internal: $gui_internal ($gui_internal_reason)" echo " win32: $gui_win32 ($gui_win32_reason)" echo " qml: $gui_qml ($gui_qml_reason)" echo "Map types:" echo " binfile: $map_binfile ($map_binfile_reason)" echo " filter: $map_filter ($map_filter_reason)" echo " mg: $map_mg ($map_mg_reason)" echo " shapefile: $map_shapefile ($map_shapefile_reason)" echo " textfile: $map_textfile ($map_textfile_reason)" echo " csv: $map_csv ($map_csv_reason)" echo "Bindings:" echo " dbus: $binding_dbus ($binding_dbus_reason)" echo " python: $binding_python ($binding_python_reason)" echo "OSD types:" echo " core: $osd_core ($osd_core_reason)" echo "Plugins:" echo " pedestrian: $plugin_pedestrian ($plugin_pedestrian_reason)" echo "Speech types:" echo " android: $speech_android ($speech_android_reason)" echo " cmdline: $speech_cmdline ($speech_cmdline_reason)" echo " dbus: $speech_dbus ($speech_dbus_reason)" echo " espeak: $speech_espeak ($speech_espeak_reason)" echo " speech_dispatcher: $speech_speech_dispatcher ($speech_speech_dispatcher_reason)" echo "Vehicle types:" echo " android: $vehicle_android ($vehicle_android_reason)" echo " demo: $vehicle_demo ($vehicle_demo_reason)" echo " file: $vehicle_file ($vehicle_file_reason)" echo " gpsd: $vehicle_gpsd ($vehicle_gpsd_reason)" echo " gpsd_dbus: $vehicle_gpsd_dbus ($vehicle_gpsd_dbus_reason)" echo " gypsy: $vehicle_gypsy ($vehicle_gypsy_reason)" echo " maemo: $vehicle_maemo ($vehicle_maemo_reason)" echo " null: $vehicle_null ($vehicle_null_reason)" echo " wince: $vehicle_wince ($vehicle_wince_reason)" echo " iphone: $vehicle_iphone ($vehicle_iphone_reason)" echo " webos: $vehicle_webos ($vehicle_webos_reason)" if test "x${gtk2_pkgconfig}" != "xyes" -a "x${gui_win32}" != "xyes" -a "x${gui_internal}" != "xyes" -a "x${gui_qml}" != "xyes" then echo "" echo "" echo "*** WARNING! you have no gui that can be built! ***" echo "Please install the dependency for at least gtk or sdl gui" echo "For more details, see the wiki at http://wiki.navit-project.org/" echo "" fi echo "Support for autotools will be removed soon from navit, please use cmake instead" sleep 5 navit-0.5.0+dfsg.1/contrib/000077500000000000000000000000001264204753600153645ustar00rootroot00000000000000navit-0.5.0+dfsg.1/contrib/sjjb_import.pl000066400000000000000000000146571264204753600202600ustar00rootroot00000000000000#!/usr/bin/perl -w # Convert the map icons from http://www.sjjb.co.uk/mapicons/ # for use by navit - we want the "Positive" variant and we want # a different color for each section. # WARNING: EXISTING FILES WILL BE OVERWRITTEN WITHOUT HESITATION! # Usage: # sjjb_import.pl [source-dir] [dest-dir] # (C)opyright 2012 Lutz Möhrmann # License: GPL v2 ### config ######################################################### # TODO: Set to 1 to get the "Negative" version as shown here: # http://www.sjjb.co.uk/mapicons/contactsheet # The first value from $colors will be used as background in this # case, otherwise it's the foreground #$negative = 0; # TODO: Foreground color if $negative is set. $fg_color = 'ffffff'; # Use the second value from $colors to produce a tiny border $use_border = 0; # Some icons in place_of_worship/ (and possibly other directories) # contain a drop-shadow. Set to 1 to keep it. $use_shadow = 0; # TODO: produce "White Glow" #$use_glow = 1; # Format is main-color, border-color %colors = ( accommodation => ['00c08f', '226282'], amenity => ['734A08', '825d22'], barrier => ['666666', '808080'], education => ['39ac39', '208020'], food => ['c02727', '815c21'], health => ['da0092', '822262'], landuse => ['999999', '666666'], money => ['000000', '404040'], place_of_worship => ['5e8019', '7a993d'], poi => ['990808', '802020'], power => ['8e7409', '806d20'], shopping => ['ad30c0', '762282'], sport => ['39ac39', '208020'], tourist => ['b26609', 'bf8830'], transport => ['0089cd', '206080'], water => ['0050da', '204380'], ); # Select/rename icons. The first string is the source filename (with path, # but w/o .svg suffix), the second one is the destination filename. If omited, # the source fn is used. @icons = ( ['accommodation/shelter2', 'shelter'], ['amenity/library'], ['amenity/town_hall2', 'townhall'], # ['barrier/', ''], # ['education/', ''], ['food/biergarten'], ['food/drinkingtap', 'drinking_water'], ['health/hospital_emergency', 'emergency'], # ['landuse/', ''], # ['money/', ''], ['place_of_worship/bahai3', 'bahai'], ['place_of_worship/buddhist3', 'buddhist'], # ['place_of_worship/christian3', 'christian'], # that's "church" ['place_of_worship/hindu3', 'hindu'], ['place_of_worship/islamic3', 'islamic'], ['place_of_worship/jain3', 'jain'], ['place_of_worship/jewish3', 'jewish'], ['place_of_worship/pagan3', 'pagan'], # not there (yet) ['place_of_worship/pastafarian3', 'pastafarian'], # not there (yet) ['place_of_worship/shinto3', 'shinto'], ['place_of_worship/sikh3', 'sikh'], ['place_of_worship/taoist3', 'taoist'], # not there (yet) ['place_of_worship/unknown', 'worship'], # ['poi/', ''], # ['power/', ''], # ['shopping/', ''], ['sport/leisure_centre', 'sport'], ['tourist/casino'], ['tourist/castle2', 'castle'], ['tourist/memorial'], ['tourist/picnic'], ['tourist/theatre', 'theater'], ['transport/bus_stop2', 'bus_stop'], ['transport/daymark'], # not there (yet) ['transport/rental_car', 'car_rent'], ['shopping/car', 'car_dealer'], ['shopping/clothes', 'shop_apparel'], ['shopping/computer', 'shop_computer'], ['shopping/department_store', 'shop_department'], ['water/dam'], ); ### /config ######################################################## use File::Basename; use XML::Twig; @fg_patterns= ("fill:white:1", "stroke:white:1", "fill:#ffffff:1", "stroke:#ffffff:1"); @bg_patterns= ("fill:#111111:1", "fill:#111:1"); @brd_patterns= ("stroke:#eeeeee:1", "stroke:#eee:1"); @sh_patterns= ('fill:#ffffff:0.25', 'stroke:#ffffff:0.25'); $dbg_level= 1; sub dbg { my ($lvl, $text)= @_; if ($lvl <= $dbg_level) { print STDERR $text; } } sub change { my ($value, $patterns, $color, $transparent)= @_; &dbg(3, "change('$$value', , '$color', '$transparent')\n"); foreach $p (@{$patterns}) { my ($k, $v, $a)= split(':', $p); $o= $opacity; if ($$value =~ m/\Aopacity:([.0-9]+)/i) { $o*= $1; } elsif ($$value =~ m/;opacity:([.0-9]+)/i) { $o*= $1; } if ($$value =~ m/$k-opacity:([.0-9]+)/i) { $o*= $1; } if ($o >= 0.5) # we don't want half transparent stuff like in tourist/memorial or amenity/town_hall2 { $o= 1; } &dbg(4, "p='$p' k='$k' v='$v' a='$a' o='$o'\n"); if ( !($$value =~ m/$k:$v/i) or ((defined $a) and ($a != $o)) ) { next; } if (!$transparent) { &dbg(4, "changing color to '$color'\n"); $$value =~ s/$k:$v/$k:$color/i; } else { &dbg(4, "changing opacity to '0'\n"); if ($$value =~ m/$k-opacity:[0-9]/i) { $$value =~ s/$k-opacity:[0-9]/$k-opacity:0/i; } else { $$value =~ s/$k:$v/$k:$v;$k-opacity:0/i; } } } } sub g_handler { my $att= $_->{'att'}; if (!defined $att->{'style'}) { return; } if ($att->{'style'} =~ m/[^-]?opacity:([.0-9]+)/i) { $opacity= $1; } } sub handler { my $att= $_->{'att'}; if (!defined $att->{'style'}) { return; } &dbg(2, " in: '$att->{'style'}'\n"); my $fg= $negative ? $fg_color : $color1; &change(\$att->{'style'}, \@sh_patterns, $fg, !$use_shadow); &change(\$att->{'style'}, \@fg_patterns, $fg, 0); &change(\$att->{'style'}, \@bg_patterns, $color1, !$negative); &change(\$att->{'style'}, \@brd_patterns, $color2, !$use_border); &dbg(2, " out: '$att->{'style'}'\n\n"); } sub get_arg { my ($no, $q)= @_; if ($ARGV[$no]) { return $ARGV[$no]; } else { print $q."\n"; $input= ; chomp($input); return $input; } } $sjjb_dir= get_arg(0, "Directory holding the extracted svg's from http://www.sjjb.co.uk/mapicons/downloads"); $dest_dir= $ARGV[1] ? $ARGV[1] : dirname(__FILE__)."/../navit/xpm/"; foreach $i (@icons) { my ($path, $icon)= split('/', $i->[0]); my ($dest)= $i->[1] ? $i->[1] : $icon; $color1= '#'.$colors{$path}[0]; $color2= '#'.$colors{$path}[1]; $opacity= 1.0; my $in_fn= "$sjjb_dir/$path/$icon.svg"; open(my $in_f, $in_fn) or die "Couldn't read '$in_fn': $!"; my $decl= <$in_f>; chomp $decl; # save the ') { $in.= $_; } close($in_f); &dbg(1, "file $in_fn: ".length($in)." bytes.\n"); my $xml= XML::Twig->new( pretty_print => 'indented', twig_handlers => { 'path' => \&handler, 'rect' => \&handler, 'circle' => \&handler, 'svg:path' => \&handler, 'svg:rect' => \&handler, 'svg:circle' => \&handler, }, start_tag_handlers => { 'g' => \&g_handler, 'svg:g' => \&g_handler, }, ); $xml->parse($in); my $out_fn= "$dest_dir/$dest.svg"; open(my $out_f, "> $out_fn") or die "Couldn't write to '$out_fn': $!"; print $out_f $decl."\n".$xml->sprint(); $xml->purge; } navit-0.5.0+dfsg.1/cpack.cmake000066400000000000000000000001441264204753600160060ustar00rootroot00000000000000if(CPACK_GENERATOR=="ZIP") set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1) endif(CPACK_GENERATOR=="ZIP") navit-0.5.0+dfsg.1/intl/000077500000000000000000000000001264204753600146725ustar00rootroot00000000000000navit-0.5.0+dfsg.1/intl/VERSION000066400000000000000000000000501264204753600157350ustar00rootroot00000000000000GNU gettext library from gettext-0.14.1 navit-0.5.0+dfsg.1/man/000077500000000000000000000000001264204753600144775ustar00rootroot00000000000000navit-0.5.0+dfsg.1/man/CMakeLists.txt000066400000000000000000000000701264204753600172340ustar00rootroot00000000000000INSTALL(FILES maptool.1 navit.1 DESTINATION ${MAN_DIR}) navit-0.5.0+dfsg.1/man/Makefile.am000066400000000000000000000000401264204753600165250ustar00rootroot00000000000000dist_man_MANS=maptool.1 navit.1 navit-0.5.0+dfsg.1/man/maptool.1000066400000000000000000000046601264204753600162420ustar00rootroot00000000000000.TH maptool 1 "$Date$" "$Revision$" "USER COMMANDS" .SH NAME maptool \- parse osm textfile and convert to Navit binfile format .SH SYNOPSIS .B For OSM XML data: .B bzcat planet.osm.bz2 | maptool mymap.bin [\-h] [\-5 ] [\-6] [\-a ] [\-c] -[\-d ] [\-i ] [\-k] [\-M] [\-N] [\-o] [\-r ] [\-s ] [\-S ] [\-w] [\-W] [\-U] [\-z ] .B For OSM Protobuf/PBF data: .B maptool \-\-protobuf \-i planet.osm.pbf planet.bin [\-h] [\-5 ] [\-6] [\-a ] [\-c] [\-e ] [\-i ] [\-k] [\-M] [\-N] [\-o] [\-P] [\-r ] [\-s ] [\-S ] [\-w] [\-W] [\-U] [\-z ] .SH DESCRIPTION maptool parses osm textfile and converts it to Navit binfile format .SH OPTIONS .TP \-h (\-\-help) display a short help message .TP \-4 (\-\-md5) set file where to write md5 sum .TP \-6 (\-\-64bit) set zip 64 bit compression .TP \-a (\-\-attr-debug-level) control which data is included in the debug attribute .TP \-c (\-\-dump-coordinates) dump coordinates after phase 1 .TP \-d (\-\-db) get osm data out of a postgresql database with osm simple scheme and given connect string .TP \-e (\-\-end) end at specified phase .TP \-i (\-\-input-file) specify the input file name (OSM), overrules default stdin .TP \-k (\-\-keep-tmpfiles) do not delete tmp files after processing. useful to reuse them .TP \-N (\-\-nodes-only) process only nodes .TP \-o (\-\-coverage) converts every street to street_coverage, resulting in a big fat black line. You can overlay this map with another vector map or image map, and every street you will still see is missing in the \-o map .TP \-P (\-\-protobuf) input file is protobuf .TP \-r (\-\-rule-file) read mapping rules from specified file .TP \-s (\-\-start) start at specified phase .TP \-S (\-\-slice-size) limit memory to use for some large internal buffers, in bytes. Default is 1 GB. Smaller slices reduce peak memory usage, at the cost of increased processing time. .TP \-w (\-\-dedupe-ways) ensure no duplicate ways or nodes. useful when using several input files .TP \-W (\-\-ways-only) process only ways .TP \-U (\-\-unknown-country) add objects with unknown country to index .TP \-z (\-\-compression-level) set the compression level .SH BUGS Should you find one, please report it : http://trac.navit-project.org .SH AUTHOR The navit Team - http://www.navit-project.org .SH SEE ALSO navit(1) navit-0.5.0+dfsg.1/man/navit.1000066400000000000000000000032541264204753600157060ustar00rootroot00000000000000.TH navit 1 "$Date$" "$Revision$" "USER COMMANDS" .SH NAME navit \- The modular touchscreen-friendly vector based navigation software. .SH SYNOPSIS .B navit [\-h] [\-v] [\-d ] [\-c ] .SH DESCRIPTION Navit is a open source (GPL) car navigation system with routing engine. Its modular design is capable of using vector maps of various formats for routing and rendering of the displayed map. It's even possible to use multiple maps at a time. The GTK+ or SDL user interfaces are designed to work well with touch screen displays. Points of Interest of various formats are displayed on the map. The current vehicle position is either read from gpsd or directly from NMEA GPS sensors. The routing engine not only calculates an optimal route to your destination, but also generates directions and even speaks to you. Navit is translated in more than 40 languages currently, please see https://translations.launchpad.net/navit/trunk For more informations, please refer to our wiki : http://wiki.navit-project.org You can also try our mailing lists : http://sourceforge.net/mailarchive/forum.php?forum_name=navit-users Or visit us on IRC : #navit on the freenode network .SH OPTIONS .TP \-h Display a short help text and exit. .TP \-v Display the version number and exit. .TP \-d Increase debugging output. Debuglevel 0 is the default, higher values will print more debugging output. .TP \-c Specify the config file (navit.xml) to use. If not specified, Navit will use a default config file. .SH BUGS Should you find one, please report it : http://trac.navit-project.org .SH AUTHOR The navit Team - http://www.navit-project.org .SH SEE ALSO maptool(1) navit-0.5.0+dfsg.1/navit/000077500000000000000000000000001264204753600150455ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/CMakeLists.txt000066400000000000000000000216261264204753600176140ustar00rootroot00000000000000include_directories( "${PROJECT_BINARY_DIR}") include_directories( "${PROJECT_SOURCE_DIR}") include_directories( "${CMAKE_CURRENT_SOURCE_DIR}") include_directories( "${CMAKE_CURRENT_BINARY_DIR}") include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/support") # navit cre set(NAVIT_SRC announcement.c atom.c attr.c cache.c callback.c command.c config_.c coord.c country.c data_window.c debug.c event.c file.c geom.c graphics.c gui.c item.c layout.c log.c main.c map.c maps.c linguistics.c mapset.c maptype.c menu.c messages.c bookmarks.c navit.c navit_nls.c navigation.c osd.c param.c phrase.c plugin.c popup.c profile.c profile_option.c projection.c roadprofile.c route.c script.c search.c speech.c start_real.c sunriset.c transform.c track.c search_houseno_interpol.c util.c vehicle.c vehicleprofile.c xmlconfig.c ) if(NOT USE_PLUGINS) list(APPEND NAVIT_SRC ${CMAKE_CURRENT_BINARY_DIR}/builtin.c) endif(NOT USE_PLUGINS) if (${HAVE_GLIB}) list(APPEND NAVIT_SRC event_glib.c) endif() if(ANDROID) list(APPEND NAVIT_SRC android.c) set(NAVIT_LIBNAME navit) else() set(NAVIT_LIBNAME navit_core) endif() foreach ( PLUGIN_PATH ${ALL_PLUGINS}) if (${PLUGIN_PATH}) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/${PLUGIN_PATH}") string(REPLACE "/" "_" MODULE_INC ${PLUGIN_PATH}) list(APPEND NAVIT_SUPPORT_LIBS ${MODULE_INC}) endif() endforeach() foreach ( MODULE_PATH ${ALL_MODULES}) if ( ${MODULE_PATH} ) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_PATH}") string(REPLACE "/" "_" MODULE_INC ${MODULE_PATH}) list(APPEND MODULES_PROTOTYPE "\nvoid\tmodule_${MODULE_INC}_init(void)") list(APPEND MODULES_FUNC "\nmodule_${MODULE_INC}_init()") if (NOT USE_PLUGINS) list(APPEND MODULES_NAME ${MODULE_INC}) else() string(REGEX REPLACE "(^[^/]*)/.*" "\\1" ${MODULE_INC}_TYPE ${MODULE_PATH}) endif() endif() endforeach() CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/builtin.c.in ${CMAKE_CURRENT_BINARY_DIR}/builtin.c) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}/fib-1.1") # Add module paths foreach (CURRENT_MODULE ${ALL_PLUGINS} ${ALL_MODULE_PLUGINS} ${ALL_MODULES}) if (${CURRENT_MODULE}) add_subdirectory( "${CMAKE_CURRENT_SOURCE_DIR}/${CURRENT_MODULE}") endif() endforeach() add_subdirectory (fib-1.1) if(NOT ANDROID) set(NAVIT_START_SRC start.c) if(WIN32 OR WINCE AND NOT WIN_OMIT_RESOURCES) list(APPEND NAVIT_START_SRC ${CMAKE_CURRENT_SOURCE_DIR}/gui/win32/resources/resource.rc) else() if (APPLE) set(NAVIT_START_SRC start_apple.m) endif() endif() if (BUILD_BUNDLE) list(APPEND NAVIT_START_SRC resources/share resources/Icon.png resources/Default.png) add_custom_command(OUTPUT resources/Icon.png COMMAND convert -scale 79x79 -crop 60x60+8+19 ${CMAKE_CURRENT_SOURCE_DIR}/xpm/desktop_icons/128x128/navit.png resources/Icon.png) add_custom_command(OUTPUT resources/Default.png COMMAND convert -scale 79x79 -crop 60x60+8+19 ${CMAKE_CURRENT_SOURCE_DIR}/xpm/desktop_icons/128x128/navit.png resources/Default.png) endif() add_executable(navit ${NAVIT_START_SRC}) target_link_libraries (navit ${NAVIT_LIBNAME}) set_target_properties(navit PROPERTIES COMPILE_DEFINITIONS "MODULE=${MODULE_NAME}") if (BUILD_BUNDLE) add_custom_command(OUTPUT resources/share COMMAND mkdir -p resources/share) set_source_files_properties(resources/share resources/Icon.png resources/Default.png PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set_target_properties(navit PROPERTIES MACOSX_BUNDLE TRUE) set_target_properties(navit PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) add_dependencies(navit navit_config_xml_resource) add_dependencies(navit images_resource) add_dependencies(navit locale_resource) endif() endif() if (SHARED_LIBNAVIT) add_library (${NAVIT_LIBNAME} SHARED ${NAVIT_SRC} ) else(SHARED_LIBNAVIT) add_library (${NAVIT_LIBNAME} STATIC ${NAVIT_SRC} ) endif(SHARED_LIBNAVIT) if(NOT MSVC) SET(NAVIT_LIBS ${NAVIT_LIBS} m) endif(NOT MSVC) target_link_libraries(${NAVIT_LIBNAME} ${MODULES_NAME} ${NAVIT_SUPPORT_LIBS} fib ${NAVIT_LIBS} ) set_target_properties(${NAVIT_LIBNAME} PROPERTIES COMPILE_DEFINITIONS "MODULE=navit;LIBDIR=\"${CMAKE_INSTALL_PREFIX}/${LIB_DIR}\";PREFIX=\"${CMAKE_INSTALL_PREFIX}\"") if (DEFINED NAVIT_COMPILE_FLAGS) set_target_properties(${NAVIT_LIBNAME} PROPERTIES COMPILE_FLAGS "${NAVIT_COMPILE_FLAGS}") endif() ADD_CUSTOM_TARGET( git_version ${CMAKE_COMMAND} -D SRC=${CMAKE_CURRENT_SOURCE_DIR}/version.h.in -D DST=${CMAKE_CURRENT_BINARY_DIR}/version.h -D NAME="GIT_VERSION" -P ${PROJECT_SOURCE_DIR}/cmake/version.cmake ) # additional parameter are passed to the stylesheet processor as parameter macro(process_xslt SRC_XML DEST_XML) set(XSLT_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy ${SRC_XML} ${DEST_XML} COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/navit/navit.dtd ${CMAKE_CURRENT_BINARY_DIR}/navit.dtd) if(XSL_PROCESSING AND XSLTS) string(REPLACE "," ";" XSLTS "${XSLTS}") foreach(tmp ${XSLTS}) set(XSLT_FILE "${PROJECT_SOURCE_DIR}/navit/xslt/${tmp}.xslt") list(APPEND XSLT_FILES "${XSLT_FILE}") list(APPEND XSLT_COMMANDS COMMAND ${CMAKE_COMMAND} -E echo Applying ${tmp}.xslt) compose_xslt_transform_command(CMD "${XSLT_FILE}" "${DEST_XML}" "${DEST_XML}.tmp" "${ARGN}") list(APPEND XSLT_COMMANDS ${CMD}) list(APPEND XSLT_COMMANDS COMMAND ${CMAKE_COMMAND} -E rename ${DEST_XML}.tmp ${DEST_XML}) endforeach() endif() ADD_CUSTOM_COMMAND( OUTPUT ${DEST_XML} DEPENDS ${SRC_XML} ${XSLT_FILES} ${XSLT_COMMANDS} ) endmacro() if(ANDROID) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navitxxxhdpi.xml OSD_SIZE=5.33 ICON_SMALL=128 ICON_MEDIUM=192 ICON_BIG=256) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navitxxhdpi.xml OSD_SIZE=4 ICON_SMALL=96 ICON_MEDIUM=128 ICON_BIG=192) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navitxhdpi.xml OSD_SIZE=2.67 ICON_SMALL=64 ICON_MEDIUM=96 ICON_BIG=128) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navithdpi.xml OSD_SIZE=2 ICON_SMALL=48 ICON_MEDIUM=64 ICON_BIG=96) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navitmdpi.xml OSD_SIZE=1.33 ICON_SMALL=32 ICON_MEDIUM=48 ICON_BIG=64) process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navitldpi.xml OSD_SIZE=1 ICON_SMALL=24 ICON_MEDIUM=32 ICON_BIG=48) add_custom_target( navit_config_xml ALL DEPENDS navitxxxhdpi.xml navitxxhdpi.xml navitxhdpi.xml navithdpi.xml navitmdpi.xml navitldpi.xml) else() process_xslt(${CMAKE_CURRENT_SOURCE_DIR}/navit_shipped.xml ${CMAKE_CURRENT_BINARY_DIR}/navit.xml "") add_custom_target( navit_config_xml_resource DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/navit.xml COMMAND mkdir -p resources/share/navit COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/navit.xml resources/share/navit) add_custom_target( locale_resource DEPENDS locales COMMAND mkdir -p resources/share COMMAND cp -a ${CMAKE_CURRENT_BINARY_DIR}/../locale resources/share/locale) add_custom_target( navit_config_xml ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/navit.xml) endif() ADD_DEPENDENCIES(${NAVIT_LIBNAME} git_version) if (USE_LIBGNUINTL AND NOT HAVE_GLIB) ADD_DEPENDENCIES(support_glib support_gettext_intl) endif() add_subdirectory (maptool) add_subdirectory (xpm) add_subdirectory (maps) if(ANDROID) add_subdirectory (android) endif() install(TARGETS navit DESTINATION ${BIN_DIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/navit.xml DESTINATION ${SHARE_DIR} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) get_directory_property(INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES) WRITE_FILE("cmake_plugin_settings.txt" "set(APPLE ${APPLE} CACHE BOOL init)\n" "set(ANDROID ${ANDROID} CACHE BOOL init)\n" "set(USE_PLUGINS ${USE_PLUGINS} CACHE BOOL init)\n" "set(MODULE_BUILD_TYPE \"${MODULE_BUILD_TYPE}\" CACHE STRING init)\n" "set(NAVIT_COMPILE_FLAGS \"${NAVIT_COMPILE_FLAGS}\" CACHE STRING init)\n" "set(navit_SOURCE_DIR \"${navit_SOURCE_DIR}\" CACHE STRING init)\n" "set(NAVIT_LIBNAME \"${NAVIT_LIBNAME}\" CACHE STRING init)\n" "set(ANDROID_API_VERSION \"${ANDROID_API_VERSION}\" CACHE STRING init)\n" "set(ANDROID_NDK_API_VERSION \"${ANDROID_NDK_API_VERSION}\" CACHE STRING init)\n" "set(CMAKE_TOOLCHAIN_FILE \"${CMAKE_TOOLCHAIN_FILE}\" CACHE STRING init)\n" "set(INCLUDE_DIRECTORIES \"${INCLUDE_DIRECTORIES}\" CACHE STRING init)\n" "set(LIB_DIR \"${LIB_DIR}\" CACHE STRING init)\n" "set(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\" CACHE STRING init)\n" ) navit-0.5.0+dfsg.1/navit/Doxyfile000066400000000000000000001427061264204753600165650ustar00rootroot00000000000000# Doxyfile 1.4.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = navit # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ../doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is YES. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO navit-0.5.0+dfsg.1/navit/Info.plist000066400000000000000000000021401264204753600170120ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable $(EXECUTABLE_NAME) CFBundleGetInfoString CFBundleIconFile CFBundleIdentifier org.navitproject.navit CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString CFBundleDisplayName Navit CFBundleName Navit CFBundlePackageType APPL CFBundleShortVersionString CFBundleSignature ???? CFBundleVersion CSResourcesFileMapped LSRequiresCarbon NSHumanReadableCopyright UIFileSharingEnabled navit-0.5.0+dfsg.1/navit/Makefile.am000066400000000000000000000304101264204753600170770ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc comma=, SUBDIRS=fib-1.1 support if PLUGINS SUBDIRS += . endif DIST_SUBDIRS=autoload binding map maptool fib-1.1 font fonts gui graphics osd plugin speech support vehicle xpm maps SUBDIRS+=autoload binding map font gui graphics osd plugin speech vehicle xpm MODULES = $(wildcard $(top_builddir)/navit/binding/*/*.la $(top_builddir)/navit/font/*/*.la $(top_builddir)/navit/graphics/*/*.la $(top_builddir)/navit/gui/*/*.la $(top_builddir)/navit/map/*/*.la $(top_builddir)/navit/osd/*/*.la $(top_builddir)/navit/speech/*/*.la $(top_builddir)/navit/vehicle/*/*.la) if FONTS SUBDIRS += fonts endif if !PLUGINS SUBDIRS += . endif if MAPTOOL SUBDIRS += maptool endif if BUILD_SAMPLEMAP SUBDIRS += maps endif AM_CPPFLAGS = -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ @ZLIB_CFLAGS@ -DPREFIX=\"@prefix@\" -DLIBDIR=\"@libdir@\" -DMODULE=navit BUILT_SOURCES = version.h navit_config.h if BIN_NAVIT bin_PROGRAMS = navit endif if SHARED_LIBNAVIT lib_LTLIBRARIES = lib@LIBNAVIT@.la lib@LIBNAVIT@_la_LDFLAGS = -avoid-version @MODULE_LDFLAGS@ @NAVIT_SOCKET_LDFLAGS@ -no-undefined -Wl,--no-undefined else noinst_LTLIBRARIES = lib@LIBNAVIT@.la endif lib@LIBNAVIT@_la_LIBADD = @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @INTLLIBS@ -Lfib-1.1 -lfib @MODULE_LIBADD@ @CRYPTO_LIBS@ if SUPPORT_WIN32CE lib@LIBNAVIT@_la_LIBADD += -Lsupport/libc -lsupport_libc endif pkgdata_DATA = navit.xml EXTRA_DIST = navit_shipped.xml navit.dtd lib@LIBNAVIT@_la_SOURCES = announcement.c atom.c attr.c cache.c callback.c command.c config_.c coord.c country.c data_window.c debug.c \ event.c event_glib.h file.c geom.c graphics.c gui.c item.c layout.c log.c main.c map.c maps.c \ linguistics.c mapset.c maptype.c menu.c messages.c bookmarks.c bookmarks.h navit.c navigation.c osd.c param.c phrase.c plugin.c popup.c \ profile.c profile_option.c projection.c roadprofile.c route.c search.c search_houseno_interpol.c script.c speech.c start_real.c \ transform.c track.c util.c vehicle.c vehicleprofile.c xmlconfig.c \ announcement.h atom.h attr.h attr_def.h cache.h callback.h color.h command.h config_.h coord.h country.h \ android.h data.h data_window.h data_window_int.h debug.h destination.h draw_info.h endianess.h event.h \ file.h geom.h graphics.h gtkext.h gui.h item.h item_def.h keys.h log.h layer.h layout.h linguistics.h main.h map-share.h map.h\ map_data.h mapset.h maptype.h menu.h messages.h navigation.h navit.h osd.h \ param.h phrase.h plugin.h point.h plugin_def.h projection.h popup.h route.h profile.h roadprofile.h search.h search_houseno_interpol.h \ speech.h start_real.h transform.h track.h types.h util.h vehicle.h vehicleprofile.h window.h xmlconfig.h zipfile.h \ navit_lfs.h navit_nls.c navit_nls.h sunriset.c sunriset.h glib_slice.h XSLTS=@XSLTS@ navit.xml: navit_shipped.xml $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))) navit_android_xml cp $< navit.xml.new if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi for i in $^; do if [ "$${i%.xslt}" != "$$i" ]; then echo "Applying $$i" ; @SAXON@ -snone navit.xml.new $$i >navit.xml.tmp || exit ; mv -f navit.xml.tmp navit.xml.new || exit ; fi ; done mv -f navit.xml.new navit.xml rm -f navit.xml.tmp navit_android_xml: navit_shipped.xml if SUPPORT_ANDROID # new android xml files for (mdpi,ldpi,hdpi) cp $(srcdir)/navit_shipped.xml navit_android.xml.new if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi # # now apply any other xslt files (this would allow for pedestrian plugin) # for i in $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))); do if [ "$${i%.xslt}" != "$$i" ]; then j=`basename $$i` ; if [ "$$j" != "android.xslt" ] ; then echo "Android: Applying $$i" ; @SAXON@ -snone navit_android.xml.new $(srcdir)/"$$i" >navit_android.xml.new.tmp || exit ; mv navit_android.xml.new.tmp navit_android.xml.new || exit ; fi ; fi ; done # # for now disable pedestrian plugin (zoff99) @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_mdpi.xslt >navit_android_mdpi.xml.tmp @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_ldpi.xslt >navit_android_ldpi.xml.tmp @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_hdpi.xslt >navit_android_hdpi.xml.tmp rm -f navit_android.xml.new rm -f navit_android.xml.new.tmp mv -f navit_android_mdpi.xml.tmp navit_android_mdpi.xml mv -f navit_android_ldpi.xml.tmp navit_android_ldpi.xml mv -f navit_android_hdpi.xml.tmp navit_android_hdpi.xml rm -f navit_android_mdpi.xml.tmp rm -f navit_android_ldpi.xml.tmp rm -f navit_android_hdpi.xml.tmp else echo "no Android support" endif if SUPPORT_ANDROID lib@LIBNAVIT@_la_SOURCES += android.c navit_SOURCES = navit_LDADD = v_int = $$(cat $(srcdir)/android/Android_Market_Version_int.txt|grep v_int|cut -d ":" -f 2) v_name = "0.5.0-"$$(LANG=C svnversion $(top_srcdir) 2> /dev/null|tr -d ":A-Z" 2> /dev/null) android/AndroidManifest.xml: android/AndroidManifest.xml.in mkdir -p $(builddir)/android sed '0,/$@ for i in $(subst $(comma), ,@ANDROID_PERMISSIONS@); do echo " " >>$@; done sed '0,/>$@ sed -e "s/@ANDROID_VERSION_INT@/$(v_int)/" <$@ >android/AndroidManifest.xml.tmp mv -f android/AndroidManifest.xml.tmp $@ sed -e "s/@ANDROID_VERSION_NAME@/$(v_name)/" <$@ >android/AndroidManifest.xml.tmp mv -f android/AndroidManifest.xml.tmp $@ android/build.xml: android/AndroidManifest.xml android/dummy.txt # this is needed, otherwise somehow the files cant be deleted mkdir -p $(builddir)/android/src/ if [ "$(builddir)" != "$(srcdir)" ]; then chmod -R u+w $(builddir)/android/src/; fi if [ "$(builddir)" != "$(srcdir)" ]; then rm -Rf $(builddir)/android/src/; fi if [ "$(builddir)" != "$(srcdir)" ]; then cp -rpf $(srcdir)/android/* $(builddir)/android; fi touch $(srcdir)/android/dummy.txt touch $(builddir)/android/dummy.txt android update project -t @ANDROID_PROJECT@ -p android apkg-all: all android/build.xml navit.xml mkdir -p android/libs/armeabi cp .libs/*.so android/libs/armeabi/libnavit.so for i in */*/.libs/*.so ; do sed 's&lib_data_data_org\.navitproject\.navit_lib_&/data/data/org.navitproject.navit/lib/lib&' <$$i >android/libs/armeabi/$$(basename $$i); done for i in $(shell cd $(srcdir)/../po && echo ??_*.po.in ??.po.in); do echo Gnerating strings.xml from $$i ; mkdir -p $(builddir)/android/res/values-$$(echo $$i | sed -e s/\\.po\\.in// -e s/_/-r/) ; @SAXON@ $(srcdir)/android/res/values/strings.xml $(srcdir)/android/po2xml.xslt po_file=$(abs_top_srcdir)/po/$$i >$(builddir)/android/res/values-$$(echo $$i | sed -e s/\\.po\\.in// -e s/_/-r/)/strings.xml ; done mkdir -p android/res/drawable-ldpi mkdir -p android/res/drawable-mdpi mkdir -p android/res/drawable-hdpi for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$${i%.xpm}.png; done for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$${i%.xpm}.png; done for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$${i%.xpm}.png; done # for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi # if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi # if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 75% $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 150% $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi mkdir -p android/res/raw for i in $(shell cd ../po && echo *.mo); do cp ../po/$$i android/res/raw/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done # cp navit.xml android/res/raw cp navit_android_mdpi.xml android/res/raw/navitmdpi.xml cp navit_android_ldpi.xml android/res/raw/navitldpi.xml cp navit_android_hdpi.xml android/res/raw/navithdpi.xml apkg: apkg-all touch $(srcdir)/android/dummy.txt touch $(builddir)/android/dummy.txt cd android && ant debug apkg-release: apkg-all touch $(srcdir)/android/dummy.txt touch $(builddir)/android/dummy.txt cd android && ant release jarsigner $$(cat ~/.keystore_args) android/bin/Navit-unsigned.apk mykey # zipalign -f 4 android/bin/Navit-unsigned.apk android/bin/Navit-unsigned-aligned.apk else navit_SOURCES = start.c navit_LDADD = lib@LIBNAVIT@.la endif if EVENT_GLIB lib@LIBNAVIT@_la_SOURCES += event_glib.c endif navit_LDFLAGS = -export-dynamic if !PLUGINS lib@LIBNAVIT@_la_SOURCES += builtin.c lib@LIBNAVIT@_la_LIBADD += $(MODULES) endif navit_LDADD += @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ if SUPPORT_WIN32 navit_LDADD += resource.rsc if SUPPORT_WIN32CE navit_LDADD += -lcommctrl -Lsupport/libc else navit_LDADD += -lgdi32 -lcomctl32 -lwinmm endif resource.rsc: $(top_srcdir)/navit/gui/win32/resources/resource.rc $(WINDRES) -I $(top_srcdir)/navit/gui/win32/resources $(top_srcdir)/navit/gui/win32/resources/resource.rc resource.rsc endif .PHONY: version.h.tmp version.h.tmp: echo "#include \"config.h\"" >version.h.tmp if SOURCE_MODE_SVN echo "#define SVN_VERSION \"$$(LANG=C svnversion $(top_srcdir) 2>/dev/null)\"" >>version.h.tmp else echo "#define SVN_VERSION \"@SOURCE_MODE@\"" >>version.h.tmp endif echo "#define NAVIT_VARIANT \"@NAVIT_VARIANT@\"" >>version.h.tmp if ! diff version.h.tmp version.h >/dev/null 2>/dev/null; \ then \ mv -f version.h.tmp version.h; \ fi version.h: version.h.tmp navit_config.h: ../config.h cp ../config.h navit_config.h.tmp if ! diff navit_config.h.tmp navit_config.h >/dev/null 2>/dev/null; \ then \ mv -f navit_config.h.tmp navit_config.h; \ fi distclean-local: rm -f version.h version.h.tmp navit_config.h navit_config.h.tmp builtin.c support-builtin.c navit.xml resurce.rsc if [ "$(top_builddir)" != "$(top_srcdir)" ]; then rm -f navit.dtd; fi builtin.c: $(top_builddir)/config.h ls $(top_builddir)/navit/*/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >builtin.c echo "extern void builtin_init(void);" >>builtin.c echo "void builtin_init(void) {" >>builtin.c ls $(top_builddir)/navit/*/*/*.la | grep -v shapefile | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>builtin.c echo "}" >>builtin.c support-builtin.c: $(top_builddir)/config.h ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >support-builtin.c echo "extern void builtin_init(void);" >>support-builtin.c echo "void builtin_init(void) {" >>support-builtin.c ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>support-builtin.c echo "}" >>support-builtin.c navit-0.5.0+dfsg.1/navit/android/000077500000000000000000000000001264204753600164655ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/android/res/000077500000000000000000000000001264204753600172565ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/android/res/values/000077500000000000000000000000001264204753600205555ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/android/res/values/strings.xml000066400000000000000000000103021264204753600227640ustar00rootroot00000000000000 Yes No Navit started Navit running Welcome to Navit Thank you for installing Navit!\n\nTo start, select \"Download maps\" from the menu to download a map. Note: The map filesize may be large (>50MB) - a wifi connection is recommended.\n\nMapdata: (c) OpenStreetMap contributors\n\nEnjoy Navit! OK More info Zoom in Zoom out Download maps Toggle POIs Exit Navit Backup / Restore Set map location Position Route to here Delete this map? Map download Downloading: ETA ready Error downloading map. Map download aborted Not enough free space No location. Reopen after location fix. Maps containing current location Address search Enter destination Match partial address Search Searching... Address not found Getting search results Loading search results No results found No text entered Setting destination to: Towns Streets Choose an action Please insert an SD Card Backing up... Restoring... Failed to create backup directory Backup failed No backup found Failed to restore Backup successful Restore Successful\nPlease restart Navit Backup not found Restore failed Select backup Backup Restore System text to speech engine data is missing Navit can use any text to speech engine installed on your device. The currently selected engine reports it is unable to speak in your language. Should we ask the system to show voice download dialog? navit-0.5.0+dfsg.1/navit/android/src/000077500000000000000000000000001264204753600172545ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/android/src/org/000077500000000000000000000000001264204753600200435ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/000077500000000000000000000000001264204753600225535ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/000077500000000000000000000000001264204753600236745ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/Navit.java000066400000000000000000000635121264204753600256270ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Message; import android.os.PowerManager; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class Navit extends Activity { public NavitDialogs dialogs; private PowerManager.WakeLock wl; private NavitActivityResult ActivityResults[]; public static InputMethodManager mgr = null; public static DisplayMetrics metrics = null; public static Boolean show_soft_keyboard = false; public static Boolean show_soft_keyboard_now_showing = false; public static long last_pressed_menu_key = 0L; public static long time_pressed_menu_key = 0L; private static Intent startup_intent = null; private static long startup_intent_timestamp = 0L; public static String my_display_density = "mdpi"; public static final int NavitDownloaderSelectMap_id = 967; public static final int MAP_NUM_PRIMARY = 11; public static final int NavitAddressSearch_id = 70; public static final int NavitSelectStorage_id = 43; public static String NavitLanguage; public static Resources NavitResources = null; public static final int MAP_NUM_SECONDARY = 12; static final String NAVIT_PACKAGE_NAME = "org.navitproject.navit"; static final String TAG = "Navit"; static String map_filename_path = null; static final String NAVIT_DATA_DIR = "/data/data/" + NAVIT_PACKAGE_NAME; static final String NAVIT_DATA_SHARE_DIR = NAVIT_DATA_DIR + "/share"; static final String FIRST_STARTUP_FILE = NAVIT_DATA_SHARE_DIR + "/has_run_once.txt"; public static final String NAVIT_PREFS = "NavitPrefs"; public void removeFileIfExists(String source) { File file = new File(source); if (!file.exists()) return; file.delete(); } public void copyFileIfExists(String source, String destination) throws IOException { File file = new File(source); if (!file.exists()) return; FileInputStream is = null; FileOutputStream os = null; try { is = new FileInputStream(source); os = new FileOutputStream(destination); int len; byte buffer[] = new byte[1024]; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } } finally { /* Close the FileStreams to prevent Resource leaks */ if (is != null) is.close(); if (os != null) os.close(); } return; } public static String _(String in) { return NavitTextTranslations.get_text(in); } private boolean extractRes(String resname, String result) { boolean needs_update = false; Log.e(TAG, "Res Name " + resname + ", result " + result); int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME); Log.e(TAG, "Res ID " + id); if (id == 0) return false; File resultfile = new File(result); if (!resultfile.exists()) { needs_update = true; File path = resultfile.getParentFile(); if ( !path.exists() && !resultfile.getParentFile().mkdirs()) return false; } else { PackageManager pm = getPackageManager(); ApplicationInfo appInfo; long apkUpdateTime = 0; try { appInfo = pm.getApplicationInfo(NAVIT_PACKAGE_NAME, 0); apkUpdateTime = new File(appInfo.sourceDir).lastModified(); } catch (NameNotFoundException e) { Log.e(TAG, "Could not read package infos"); e.printStackTrace(); } if (apkUpdateTime > resultfile.lastModified()) needs_update = true; } if (needs_update) { Log.e(TAG, "Extracting resource"); try { InputStream resourcestream = NavitResources.openRawResource(id); FileOutputStream resultfilestream = new FileOutputStream(resultfile); byte[] buf = new byte[1024]; int i = 0; while ((i = resourcestream.read(buf)) != -1) { resultfilestream.write(buf, 0, i); } resultfilestream.close(); } catch (Exception e) { Log.e(TAG, "Exception " + e.getMessage()); return false; } } return true; } private void showInfos() { SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE); boolean firstStart = settings.getBoolean("firstStart", true); if (firstStart) { AlertDialog.Builder infobox = new AlertDialog.Builder(this); infobox.setTitle(getString(R.string.initial_info_box_title)); // TRANS infobox.setCancelable(false); final TextView message = new TextView(this); message.setFadingEdgeLength(20); message.setVerticalFadingEdgeEnabled(true); // message.setVerticalScrollBarEnabled(true); RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); message.setLayoutParams(rlp); final SpannableString s = new SpannableString(getString(R.string.initial_info_box_message)); // TRANS Linkify.addLinks(s, Linkify.WEB_URLS); message.setText(s); message.setMovementMethod(LinkMovementMethod.getInstance()); infobox.setView(message); // TRANS infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "Ok, user saw the infobox"); } }); // TRANS infobox.setNeutralButton(getString(R.string.initial_info_box_more_info), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "user wants more info, show the website"); String url = "http://wiki.navit-project.org/index.php/Navit_on_Android"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); } }); infobox.show(); SharedPreferences.Editor edit_settings = settings.edit(); edit_settings.putBoolean("firstStart", false); edit_settings.commit(); } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) this.requestWindowFeature(Window.FEATURE_NO_TITLE); dialogs = new NavitDialogs(this); NavitResources = getResources(); // only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.) Navit.startup_intent = this.getIntent(); // hack! Remember time stamps, and only allow 4 secs. later in onResume to set target! Navit.startup_intent_timestamp = System.currentTimeMillis(); Log.e("Navit", "**1**A " + startup_intent.getAction()); Log.e("Navit", "**1**D " + startup_intent.getDataString()); // init translated text NavitTextTranslations.init(); // NOTIFICATION // Setup the status bar notification // This notification is removed in the exit() function NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager Notification NavitNotification = new Notification(R.drawable.icon, getString(R.string.notification_ticker), System.currentTimeMillis()); // Create a new notification, with the text string to show when the notification first appears PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0); NavitNotification.setLatestEventInfo(getApplicationContext(), "Navit", getString(R.string.notification_event_default), appIntent); // Set the text in the notification NavitNotification.flags|=Notification.FLAG_ONGOING_EVENT; // Ensure that the notification appears in Ongoing nm.notify(R.string.app_name, NavitNotification); // Set the notification // get the local language ------------- Locale locale = java.util.Locale.getDefault(); String lang = locale.getLanguage(); String langu = lang; String langc = lang; Log.e("Navit", "lang=" + lang); int pos = langu.indexOf('_'); if (pos != -1) { langc = langu.substring(0, pos); NavitLanguage = langc + langu.substring(pos).toUpperCase(locale); Log.e("Navit", "substring lang " + NavitLanguage.substring(pos).toUpperCase(locale)); // set lang. for translation NavitTextTranslations.main_language = langc; NavitTextTranslations.sub_language = NavitLanguage.substring(pos).toUpperCase(locale); } else { String country = locale.getCountry(); Log.e("Navit", "Country1 " + country); Log.e("Navit", "Country2 " + country.toUpperCase(locale)); NavitLanguage = langc + "_" + country.toUpperCase(locale); // set lang. for translation NavitTextTranslations.main_language = langc; NavitTextTranslations.sub_language = country.toUpperCase(locale); } Log.e("Navit", "Language " + lang); SharedPreferences prefs = getSharedPreferences(NAVIT_PREFS,MODE_PRIVATE); map_filename_path = prefs.getString("filenamePath", Environment.getExternalStorageDirectory().getPath() + "/navit/"); // make sure the new path for the navitmap.bin file(s) exist!! File navit_maps_dir = new File(map_filename_path); navit_maps_dir.mkdirs(); // make sure the share dir exists File navit_data_share_dir = new File(NAVIT_DATA_SHARE_DIR); navit_data_share_dir.mkdirs(); Display display_ = getWindowManager().getDefaultDisplay(); int width_ = display_.getWidth(); int height_ = display_.getHeight(); metrics = new DisplayMetrics(); display_.getMetrics(Navit.metrics); int densityDpi = (int)(( Navit.metrics.density*160)-.5f); Log.e("Navit", "Navit -> pixels x=" + width_ + " pixels y=" + height_); Log.e("Navit", "Navit -> dpi=" + densityDpi); Log.e("Navit", "Navit -> density=" + Navit.metrics.density); Log.e("Navit", "Navit -> scaledDensity=" + Navit.metrics.scaledDensity); ActivityResults = new NavitActivityResult[16]; setVolumeControlStream(AudioManager.STREAM_MUSIC); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"NavitDoNotDimScreen"); if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) { Log.e("Navit", "Failed to extract language resource " + langc); } if (densityDpi <= 120) { my_display_density = "ldpi"; } else if (densityDpi <= 160) { my_display_density = "mdpi"; } else if (densityDpi < 240) { my_display_density = "hdpi"; } else if (densityDpi < 320) { my_display_density = "xhdpi"; } else if (densityDpi < 480) { my_display_density = "xxhdpi"; } else if (densityDpi < 640) { my_display_density = "xxxhdpi"; } else { Log.e("Navit", "found device of very high density ("+densityDpi+")"); Log.e("Navit", "using xxxhdpi values"); my_display_density = "xxxhdpi"; } if (!extractRes("navit" + my_display_density, NAVIT_DATA_DIR + "/share/navit.xml")) { Log.e("Navit", "Failed to extract navit.xml for " + my_display_density); } // --> dont use android.os.Build.VERSION.SDK_INT, needs API >= 4 Log.e("Navit", "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK)); NavitMain(this, NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, NAVIT_DATA_DIR+"/bin/navit",map_filename_path); showInfos(); Navit.mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); } @Override public void onResume() { super.onResume(); Log.e("Navit", "OnResume"); //InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // DEBUG // intent_data = "google.navigation:q=Wien Burggasse 27"; // intent_data = "google.navigation:q=48.25676,16.643"; // intent_data = "google.navigation:ll=48.25676,16.643&q=blabla-strasse"; // intent_data = "google.navigation:ll=48.25676,16.643"; if (startup_intent != null) { if (System.currentTimeMillis() <= Navit.startup_intent_timestamp + 4000L) { Log.e("Navit", "**2**A " + startup_intent.getAction()); Log.e("Navit", "**2**D " + startup_intent.getDataString()); String navi_scheme = startup_intent.getScheme(); if ( navi_scheme != null && navi_scheme.equals("google.navigation")) { parseNavigationURI(startup_intent.getData().getSchemeSpecificPart()); } } else { Log.e("Navit", "timestamp for navigate_to expired! not using data"); } } } private void parseNavigationURI(String schemeSpecificPart) { String naviData[]= schemeSpecificPart.split("&"); Pattern p = Pattern.compile("(.*)=(.*)"); Map params = new HashMap(); for (int count=0; count < naviData.length; count++) { Matcher m = p.matcher(naviData[count]); if (m.matches()) { params.put(m.group(1), m.group(2)); } } // d: google.navigation:q=blabla-strasse # (this happens when you are offline, or from contacts) // a: google.navigation:ll=48.25676,16.643&q=blabla-strasse // c: google.navigation:ll=48.25676,16.643 // b: google.navigation:q=48.25676,16.643 Float lat; Float lon; Bundle b = new Bundle(); String geoString = params.get("ll"); if (geoString != null) { String address = params.get("q"); if (address != null) b.putString("q", address); } else { geoString = params.get("q"); } if ( geoString != null) { if (geoString.matches("^[+-]{0,1}\\d+(|\\.\\d*),[+-]{0,1}\\d+(|\\.\\d*)$")) { String geo[] = geoString.split(","); if (geo.length == 2) { try { lat = Float.valueOf(geo[0]); lon = Float.valueOf(geo[1]); b.putFloat("lat", lat); b.putFloat("lon", lon); Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); msg.setData(b); msg.sendToTarget(); Log.e("Navit", "target found (b): " + geoString); } catch (NumberFormatException e) { } // nothing to do here } } else { start_targetsearch_from_intent(geoString); } } } public void setActivityResult(int requestCode, NavitActivityResult ActivityResult) { //Log.e("Navit", "setActivityResult " + requestCode); ActivityResults[requestCode] = ActivityResult; } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); //Log.e("Navit","onPrepareOptionsMenu"); // this gets called every time the menu is opened!! // change menu items here! menu.clear(); // group-id,item-id,sort order number //menu.add(1, 1, 100, getString(R.string.optionsmenu_zoom_in)); //TRANS //menu.add(1, 2, 200, getString(R.string.optionsmenu_zoom_out)); //TRANS menu.add(1, 3, 300, getString(R.string.optionsmenu_download_maps)); //TRANS menu.add(1, 5, 400, getString(R.string.optionsmenu_toggle_poi)); //TRANS menu.add(1, 6, 500, getString(R.string.optionsmenu_address_search)); //TRANS menu.add(1, 10, 600, getString(R.string.optionsmenu_set_map_location)); menu.add(1, 99, 900, getString(R.string.optionsmenu_exit_navit)); //TRANS /* Only show the Backup to SD-Card Option if we really have one */ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) menu.add(1, 7, 700, getString(R.string.optionsmenu_backup_restore)); //TRANS return true; } // define callback id here public static NavitGraphics N_NavitGraphics = null; // callback id gets set here when called from NavitGraphics public static void setKeypressCallback(int kp_cb_id, NavitGraphics ng) { //Log.e("Navit", "setKeypressCallback -> id1=" + kp_cb_id); //Log.e("Navit", "setKeypressCallback -> ng=" + String.valueOf(ng)); //N_KeypressCallbackID = kp_cb_id; N_NavitGraphics = ng; } public static void setMotionCallback(int mo_cb_id, NavitGraphics ng) { //Log.e("Navit", "setKeypressCallback -> id2=" + mo_cb_id); //Log.e("Navit", "setKeypressCallback -> ng=" + String.valueOf(ng)); //N_MotionCallbackID = mo_cb_id; N_NavitGraphics = ng; } public void start_targetsearch_from_intent(String target_address) { if (target_address == null || target_address.equals("")) { // empty search string entered Toast.makeText(getApplicationContext(), getString(R.string.address_search_not_found), Toast.LENGTH_LONG).show(); //TRANS } else { Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); search_intent.putExtra("search_string", target_address); this.startActivityForResult(search_intent, NavitAddressSearch_id); } } @Override public boolean onOptionsItemSelected(MenuItem item) { runOptionsItem(item.getItemId()); return true; } public void runOptionsItem(int id) { // Handle item selection switch (id) { case 1 : // zoom in Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_IN.ordinal()).sendToTarget(); // if we zoom, hide the bubble Log.e("Navit", "onOptionsItemSelected -> zoom in"); break; case 2 : // zoom out Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_OUT.ordinal()).sendToTarget(); // if we zoom, hide the bubble Log.e("Navit", "onOptionsItemSelected -> zoom out"); break; case 3 : // map download menu Intent map_download_list_activity = new Intent(this, NavitDownloadSelectMapActivity.class); startActivityForResult(map_download_list_activity, Navit.NavitDownloaderSelectMap_id); break; case 5 : // toggle the normal POI layers (to avoid double POIs) Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); Bundle b = new Bundle(); b.putString("cmd", "toggle_layer(\"POI Symbols\");"); msg.setData(b); msg.sendToTarget(); // toggle full POI icons on/off msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); b = new Bundle(); b.putString("cmd", "toggle_layer(\"Android-POI-Icons-full\");"); msg.setData(b); msg.sendToTarget(); break; case 6 : // ok startup address search activity Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); this.startActivityForResult(search_intent, NavitAddressSearch_id); break; case 7 : /* Backup / Restore */ showDialog(NavitDialogs.DIALOG_BACKUP_RESTORE); break; case 10: setMapLocation(); break; case 99 : // exit this.onStop(); this.exit(); break; } } void setDestination(float latitude, float longitude, String address) { Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + address, Toast.LENGTH_LONG).show(); //TRANS Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); Bundle b = new Bundle(); b.putFloat("lat", latitude); b.putFloat("lon", longitude); b.putString("q", address); msg.setData(b); msg.sendToTarget(); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Navit.NavitDownloaderSelectMap_id : if (resultCode == Activity.RESULT_OK) { Message msg = dialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD , data.getIntExtra("map_index", -1), 0); msg.sendToTarget(); } break; case NavitAddressSearch_id : if (resultCode == Activity.RESULT_OK) { Bundle destination = data.getExtras(); Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + destination.getString(("q")), Toast.LENGTH_LONG).show(); //TRANS Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); msg.setData(destination); msg.sendToTarget(); } break; case NavitSelectStorage_id : if(resultCode == RESULT_OK) { String newDir = data.getStringExtra(FileBrowserActivity.returnDirectoryParameter); Log.d(TAG, "selected path= "+newDir); if(!newDir.contains("/navit")) newDir = newDir+"/navit/"; else newDir = newDir+"/"; SharedPreferences prefs = this.getSharedPreferences(NAVIT_PREFS,MODE_PRIVATE); SharedPreferences.Editor prefs_editor = prefs.edit(); prefs_editor.putString("filenamePath", newDir); prefs_editor.commit(); Toast.makeText(this, String.format(Navit._("New location set to %s\nRestart Navit to apply the changes."),newDir),Toast.LENGTH_LONG).show(); } else Log.w(TAG, "select path failed"); break; default : //Log.e("Navit", "onActivityResult " + requestCode + " " + resultCode); ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); break; } } @Override protected void onPrepareDialog(int id, Dialog dialog) { dialogs.prepareDialog(id, dialog); super.onPrepareDialog(id, dialog); } protected Dialog onCreateDialog(int id) { return dialogs.createDialog(id); } @Override public boolean onSearchRequested() { /* Launch the internal Search Activity */ Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); this.startActivityForResult(search_intent, NavitAddressSearch_id); return true; } public boolean setMapLocation() { Intent fileExploreIntent = new Intent(this,FileBrowserActivity.class); fileExploreIntent .putExtra(FileBrowserActivity.startDirectoryParameter, "/mnt") .setAction(FileBrowserActivity.INTENT_ACTION_SELECT_DIR); startActivityForResult(fileExploreIntent,NavitSelectStorage_id); return true; } @Override public void onDestroy() { super.onDestroy(); Log.e("Navit", "OnDestroy"); // TODO next call will kill our app the hard way. This should not be necessary, but ensures navit is // properly restarted and no resources are wasted with navit in background. Remove this call after // code review NavitDestroy(); } public void fullscreen(int fullscreen) { if(fullscreen != 0) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) this.getActionBar().hide(); } else { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) this.getActionBar().show(); } } public void disableSuspend() { wl.acquire(); wl.release(); } public void exit() { NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.cancel(R.string.app_name); NavitVehicle.removeListener(); NavitDestroy(); } public native void NavitMain(Navit x, String lang, int version, String display_density_string, String path, String path2); public native void NavitDestroy(); /* * this is used to load the 'navit' native library on * application startup. The library has already been unpacked at * installation time by the package manager. */ static { System.loadLibrary("navit"); } } navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java000066400000000000000000000325511264204753600317770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Locale; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; public class NavitAddressSearchActivity extends Activity { public static final class NavitAddress { public NavitAddress(int type, float latitude, float longitude, String address) { result_type = type; lat = latitude; lon = longitude; addr = address; } int result_type; float lat; float lon; String addr; } private static final String TAG = "NavitAddress"; private static final int ADDRESS_RESULT_PROGRESS_MAX = 10; private List Addresses_found = null; private List addresses_shown = null; private String mAddressString = ""; private boolean mPartialSearch = false; private String mCountry; private ImageButton mCountryButton; ProgressDialog search_results_wait = null; public RelativeLayout NavitAddressSearchActivity_layout; private int search_results_towns = 0; private int search_results_streets = 0; private int search_results_streets_hn = 0; private long search_handle = 0; // TODO remember settings private static String last_address_search_string = ""; private static Boolean last_address_partial_match = false; private static String last_country = ""; private int getDrawableID(String resourceName) { int drawableId = 0; try { Class res = R.drawable.class; Field field = res.getField(resourceName); drawableId = field.getInt(null); } catch (Exception e) { Log.e("NavitAddressSearch", "Failure to get drawable id.", e); } return drawableId; } private void setCountryButtonImage() { // We have all images stored as drawable_nodpi resources which allows native code to manipulate them // without interference with android builtin choosing and scaling system. But that makes us to // reinvent the wheel here to show an image in android native interface. int flag_icon_sizes[]={24,32,48,64,96}; int exact_size, nearest_size; exact_size=(int)(Navit.metrics.density*24.0 -.5); nearest_size=flag_icon_sizes[0]; for(int size: flag_icon_sizes) { nearest_size=size; if(exact_size<=size) break; } mCountryButton.setImageResource(getDrawableID("country_" + mCountry+"_"+nearest_size+"_"+nearest_size)); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = getIntent().getExtras(); if ( extras != null ) { String search_string = extras.getString(("search_string")); if (search_string != null) { mPartialSearch = true; mAddressString = search_string; executeSearch(); return; } } mPartialSearch = last_address_partial_match; mAddressString = last_address_search_string; getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); LinearLayout panel = new LinearLayout(this); panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); panel.setOrientation(LinearLayout.VERTICAL); // address: label and text field SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); mCountry = settings.getString(("DefaultCountry") , null); if (mCountry == null) { Locale defaultLocale = Locale.getDefault(); mCountry = defaultLocale.getCountry().toLowerCase(defaultLocale); SharedPreferences.Editor edit_settings = settings.edit(); edit_settings.putString("DefaultCountry", mCountry); edit_settings.commit(); } mCountryButton = new ImageButton(this); setCountryButtonImage(); mCountryButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { requestCountryDialog(); } }); // address: label and text field TextView addr_view = new TextView(this); addr_view.setText(Navit._("Enter Destination")); // TRANS addr_view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); addr_view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); addr_view.setPadding(4, 4, 4, 4); // partial match checkbox final CheckBox checkboxPartialMatch = new CheckBox(this); checkboxPartialMatch.setText(Navit._("partial match")); // TRANS checkboxPartialMatch.setChecked(last_address_partial_match); checkboxPartialMatch.setGravity(Gravity.CENTER); final EditText address_string = new EditText(this); address_string.setText(last_address_search_string); address_string.setSelectAllOnFocus(true); // search button final Button btnSearch = new Button(this); btnSearch.setText(Navit._("Search")); // TRANS btnSearch.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); btnSearch.setGravity(Gravity.CENTER); btnSearch.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPartialSearch = checkboxPartialMatch.isChecked(); mAddressString = address_string.getText().toString(); last_address_partial_match = mPartialSearch; last_address_search_string = mAddressString; executeSearch(); } }); ListView lastAddresses = new ListView(this); NavitAppConfig navitConfig = (NavitAppConfig) getApplicationContext(); final List addresses = navitConfig.getLastAddresses(); int addressCount = addresses.size(); if (addressCount > 0) { String[] strAddresses = new String[addressCount]; for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) { strAddresses[addrIndex] = addresses.get(addrIndex).addr; } ArrayAdapter addressList = new ArrayAdapter(this, android.R.layout.simple_list_item_1, strAddresses); lastAddresses.setAdapter(addressList); lastAddresses.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { NavitAddress addressSelected = addresses.get(arg2); Intent resultIntent = new Intent(); resultIntent.putExtra("lat", addressSelected.lat); resultIntent.putExtra("lon", addressSelected.lon); resultIntent.putExtra("q", addressSelected.addr); setResult(Activity.RESULT_OK, resultIntent); finish(); } }); } String title = getString(R.string.address_search_title); if (title != null && title.length() > 0) this.setTitle(title); LinearLayout searchSettingsLayout = new LinearLayout(this); searchSettingsLayout.setOrientation(LinearLayout.HORIZONTAL); searchSettingsLayout.addView(mCountryButton); searchSettingsLayout.addView(checkboxPartialMatch); panel.addView(addr_view); panel.addView(address_string); panel.addView(searchSettingsLayout); panel.addView(btnSearch); panel.addView(lastAddresses); setContentView(panel); } private void requestCountryDialog() { final String[][] all_countries = NavitGraphics.GetAllCountries(); Comparator country_comperator = new Comparator() { public int compare(String[] object1, String[] object2) { return object1[1].compareTo(object2[1]); } }; Arrays.sort(all_countries, country_comperator); AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this); // ToDo also show icons and country code String[] country_name = new String[all_countries.length]; for (int country_index = 0; country_index < all_countries.length; country_index++) { country_name[country_index] = all_countries[country_index][1]; } mapModeChooser.setItems(country_name, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); mCountry = all_countries[item][0]; SharedPreferences.Editor edit_settings = settings.edit(); edit_settings.putString("DefaultCountry", mCountry); edit_settings.commit(); setCountryButtonImage(); } }); AlertDialog d=mapModeChooser.create(); d.getListView().setFastScrollEnabled(true); d.show(); } /** * start a search on the map */ public void receiveAddress(int type, float latitude, float longitude, String address) { Log.e(TAG, "(" + String.valueOf(latitude) + ", " + String.valueOf(longitude) + ") " + address); switch (type) { case 0: search_results_towns++; break; case 1: search_results_streets++; break; case 2: search_results_streets_hn++; break; } search_results_wait.setMessage(Navit._("Towns") + ":" + search_results_towns + " " + Navit._("Streets") + ":" + search_results_streets + "/" + search_results_streets_hn); search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1)); Addresses_found.add(new NavitAddress(type, latitude, longitude, address)); } public void finishAddressSearch() { if (Addresses_found.isEmpty()) { Toast.makeText( getApplicationContext(),getString(R.string.address_search_not_found) + "\n" + mAddressString, Toast.LENGTH_LONG).show(); //TRANS setResult(Activity.RESULT_CANCELED); finish(); } ListView addressesFound = new ListView(this); addressesFound.setFastScrollEnabled(true); ArrayAdapter addressList = new ArrayAdapter(this, android.R.layout.simple_list_item_1); addresses_shown = new ArrayList(); for (NavitAddress currentAddress : Addresses_found) { if (currentAddress.result_type != 0 || search_results_streets == 0) { addressList.add(currentAddress.addr); addresses_shown.add(currentAddress); } } addressesFound.setAdapter(addressList); addressesFound.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { NavitAddress addressSelected = addresses_shown.get(arg2); Intent resultIntent = new Intent(); resultIntent.putExtra("lat", addressSelected.lat); resultIntent.putExtra("lon", addressSelected.lon); resultIntent.putExtra("q", addressSelected.addr); setResult(Activity.RESULT_OK, resultIntent); finish(); } }); setContentView(addressesFound); search_results_wait.dismiss(); } public native long CallbackStartAddressSearch(int partial_match, String country, String s); public native void CallbackCancelAddressSearch(long handle); @Override protected Dialog onCreateDialog(int id) { search_results_wait = new ProgressDialog(this); search_results_wait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); search_results_wait.setTitle("Loading search results"); search_results_wait.setMessage("--"); search_results_wait.setCancelable(true); search_results_wait.setProgress(0); search_results_wait.setMax(10); Addresses_found = new ArrayList(); search_results_towns = 0; search_results_streets = 0; search_results_streets_hn = 0; search_handle = CallbackStartAddressSearch(mPartialSearch ? 1 : 0, mCountry, mAddressString); search_results_wait.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { CallbackCancelAddressSearch(search_handle); search_handle = 0; search_results_wait.dismiss(); } }); return search_results_wait; } void executeSearch() { showDialog(0); } } navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java000066400000000000000000000166521264204753600304750ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.RectF; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.MotionEvent; import android.widget.ImageView; public class NavitAndroidOverlay extends ImageView implements Runnable { public Boolean draw_bubble = false; public static Boolean confirmed_bubble = false; public static long bubble_max_showing_timespan = 8000L; // 8 secs. public static class NavitAndroidOverlayBubble { int x; int y; String text = null; } private NavitAndroidOverlayBubble bubble_001 = null; public NavitAndroidOverlay(Context context) { super(context); } public void show_bubble() { //Log.e("Navit", "NavitAndroidOverlay -> show_bubble"); if (!this.draw_bubble) { Handler handler = new Handler(); handler.postDelayed(this, bubble_max_showing_timespan); NavitAndroidOverlay.confirmed_bubble = false; this.draw_bubble = true; } } public Boolean get_show_bubble() { return this.draw_bubble; } public void hide_bubble() { confirmed_bubble = false; draw_bubble = false; Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_REDRAW.ordinal()); msg.sendToTarget(); postInvalidate(); } public void set_bubble(NavitAndroidOverlayBubble b) { this.bubble_001 = b; } @Override public boolean onTouchEvent(MotionEvent event) { //Log.e("Navit", "NavitAndroidOverlay -> onTouchEvent"); super.onTouchEvent(event); int x = (int) event.getX(); int y = (int) event.getY(); if ((this.draw_bubble) && (!NavitAndroidOverlay.confirmed_bubble)) { // bubble is showing, test if we touch it to confirm destination float draw_factor = 1.0f; if (Navit.my_display_density.compareTo("mdpi") == 0) { draw_factor = 1.0f; } else if (Navit.my_display_density.compareTo("ldpi") == 0) { draw_factor = 0.7f; } else if (Navit.my_display_density.compareTo("hdpi") == 0) { draw_factor = 1.5f; } int dx = (int) ((20 / 1.5f) * draw_factor); int dy = (int) ((-100 / 1.5f) * draw_factor); int bubble_size_x = (int) ((150 / 1.5f) * draw_factor); int bubble_size_y = (int) ((60 / 1.5f) * draw_factor); RectF box_rect = new RectF(this.bubble_001.x + dx, this.bubble_001.y + dy, this.bubble_001.x + bubble_size_x + dx, this.bubble_001.y + bubble_size_y + dy); if (box_rect.contains(x, y)) { // bubble touched to confirm destination NavitAndroidOverlay.confirmed_bubble = true; // draw confirmed bubble this.postInvalidate(); // set destination Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DISPLAY_DESTINATION.ordinal()); Bundle b = new Bundle(); b.putInt("x", this.bubble_001.x); b.putInt("y", this.bubble_001.y); msg.setData(b); msg.sendToTarget(); // consume the event return true; } } // false -> we dont use this event, give it to other layers return false; } public void onDraw(Canvas c) { //Log.e("Navit", "NavitAndroidOverlay -> onDraw"); float draw_factor = 1.0f; if (Navit.my_display_density.compareTo("mdpi") == 0) { draw_factor = 1.0f; } else if (Navit.my_display_density.compareTo("ldpi") == 0) { draw_factor = 0.7f; } else if (Navit.my_display_density.compareTo("hdpi") == 0) { draw_factor = 1.5f; } if (this.draw_bubble) { //Log.e("Navit", "NavitAndroidOverlay -> onDraw -> bubble"); int dx = (int) ((20 / 1.5f) * draw_factor); int dy = (int) ((-100 / 1.5f) * draw_factor); Paint bubble_paint = new Paint(0); int bubble_size_x = (int) ((150 / 1.5f) * draw_factor); int bubble_size_y = (int) ((60 / 1.5f) * draw_factor); // yellow-ish funny lines int lx = (int) ((15 / 1.5f) * draw_factor); int ly = (int) ((15 / 1.5f) * draw_factor); bubble_paint.setStyle(Style.FILL); bubble_paint.setAntiAlias(true); bubble_paint.setStrokeWidth(8 / 1.5f * draw_factor); bubble_paint.setColor(Color.parseColor("#FFF8C6")); c.drawLine(this.bubble_001.x + dx, this.bubble_001.y + dy + bubble_size_y - ly, this.bubble_001.x, this.bubble_001.y, bubble_paint); c.drawLine(this.bubble_001.x + dx + lx, this.bubble_001.y + dy + bubble_size_y, this.bubble_001.x, this.bubble_001.y, bubble_paint); // draw black funny lines to target bubble_paint.setStyle(Style.STROKE); bubble_paint.setAntiAlias(true); bubble_paint.setStrokeWidth(3); bubble_paint.setColor(Color.parseColor("#000000")); c.drawLine(this.bubble_001.x + dx, this.bubble_001.y + dy + bubble_size_y - ly, this.bubble_001.x, this.bubble_001.y, bubble_paint); c.drawLine(this.bubble_001.x + dx + lx, this.bubble_001.y + dy + bubble_size_y, this.bubble_001.x, this.bubble_001.y, bubble_paint); // filled rect yellow-ish bubble_paint.setStyle(Style.FILL); bubble_paint.setStrokeWidth(0); bubble_paint.setAntiAlias(false); bubble_paint.setColor(Color.parseColor("#FFF8C6")); RectF box_rect = new RectF(this.bubble_001.x + dx, this.bubble_001.y + dy, this.bubble_001.x + bubble_size_x + dx, this.bubble_001.y + bubble_size_y + dy); int rx = (int) (20 / 1.5f * draw_factor); int ry = (int) (20 / 1.5f * draw_factor); c.drawRoundRect(box_rect, rx, ry, bubble_paint); if (NavitAndroidOverlay.confirmed_bubble) { // filled red rect (for confirmed bubble) //bubble_paint.setStyle(Style.FILL); //bubble_paint.setStrokeWidth(0); //bubble_paint.setAntiAlias(false); bubble_paint.setColor(Color.parseColor("#EC294D")); c.drawRoundRect(box_rect, rx, ry, bubble_paint); } // black outlined rect bubble_paint.setStyle(Style.STROKE); bubble_paint.setStrokeWidth(3); bubble_paint.setAntiAlias(true); bubble_paint.setColor(Color.parseColor("#000000")); c.drawRoundRect(box_rect, rx, ry, bubble_paint); int inner_dx = (int) (30 / 1.5f * draw_factor); int inner_dy = (int) (36 / 1.5f * draw_factor); bubble_paint.setAntiAlias(true); bubble_paint.setStyle(Style.FILL); bubble_paint.setTextSize((int) (20 / 1.5f * draw_factor)); bubble_paint.setStrokeWidth(3); bubble_paint.setColor(Color.parseColor("#3b3131")); c.drawText(Navit._("Route to here"), this.bubble_001.x + dx + inner_dx, this.bubble_001.y + dy + inner_dy, bubble_paint); } } public void run() { hide_bubble(); } } navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/NavitDialogs.java000066400000000000000000000176241264204753600271350ustar00rootroot00000000000000package org.navitproject.navit; import java.io.File; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.Toast; import android.os.Environment; public class NavitDialogs extends Handler{ // Dialogs public static final int DIALOG_MAPDOWNLOAD = 1; public static final int DIALOG_BACKUP_RESTORE = 2; public static final int DIALOG_SELECT_BACKUP = 3; // dialog messages static final int MSG_MAP_DOWNLOAD_FINISHED = 0; static final int MSG_PROGRESS_BAR = 1; static final int MSG_TOAST = 2; static final int MSG_TOAST_LONG = 3; static final int MSG_POSITION_MENU = 6; static final int MSG_START_MAP_DOWNLOAD = 7; static final int MSG_REMOVE_DIALOG_GENERIC = 99; static Handler mHandler; private ProgressDialog mapdownloader_dialog = null; private NavitMapDownloader mapdownloader = null; private Navit mActivity; public NavitDialogs(Navit activity) { super(); mActivity = activity; mHandler = this; } static public void sendDialogMessage(int what, String title, String text, int dialog_num, int value1, int value2) { Message msg = mHandler.obtainMessage(what); Bundle data = new Bundle(); data.putString("title", title); data.putString("text", text); data.putInt("value1", value1); data.putInt("value2", value2); data.putInt("dialog_num", dialog_num); msg.setData(data); mHandler.sendMessage(msg); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_MAP_DOWNLOAD_FINISHED : { // dismiss dialog, remove dialog mActivity.dismissDialog(DIALOG_MAPDOWNLOAD); mActivity.removeDialog(DIALOG_MAPDOWNLOAD); if (msg.getData().getInt("value1") == 1) { Message msg_out = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_LOAD_MAP.ordinal()); msg_out.setData(msg.getData()); msg_out.sendToTarget(); msg_out = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); Bundle b = new Bundle(); int mi=msg.getData().getInt("value2"); double lon=(Double.parseDouble(NavitMapDownloader.osm_maps[mi].lon1)+Double.parseDouble(NavitMapDownloader.osm_maps[mi].lon2))/2.0; double lat=(Double.parseDouble(NavitMapDownloader.osm_maps[mi].lat1)+Double.parseDouble(NavitMapDownloader.osm_maps[mi].lat2))/2.0; b.putString("cmd", "set_center(\""+ lon +" "+ lat + "\",1); zoom=256"); msg_out.setData(b); msg_out.sendToTarget(); } break; } case MSG_PROGRESS_BAR : // change progressbar values mapdownloader_dialog.setMax(msg.getData().getInt("value1")); mapdownloader_dialog.setProgress(msg.getData().getInt("value2")); mapdownloader_dialog.setTitle(msg.getData().getString(("title"))); mapdownloader_dialog.setMessage(msg.getData().getString(("text"))); break; case MSG_TOAST : Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_SHORT).show(); break; case MSG_TOAST_LONG : Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_LONG).show(); break; case MSG_START_MAP_DOWNLOAD: { int download_map_id = msg.arg1; Log.d("Navit", "PRI id=" + download_map_id); // set map id to download // show the map download progressbar, and download the map if (download_map_id > -1) { mapdownloader = new NavitMapDownloader(download_map_id); mActivity.showDialog(NavitDialogs.DIALOG_MAPDOWNLOAD); mapdownloader.start(); } } break; case MSG_REMOVE_DIALOG_GENERIC : // dismiss dialog, remove dialog - generic mActivity.dismissDialog(msg.getData().getInt("dialog_num")); mActivity.removeDialog(msg.getData().getInt("dialog_num")); break; } } Dialog createDialog(int id) { AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); switch (id) { case DIALOG_MAPDOWNLOAD : mapdownloader_dialog = new ProgressDialog(mActivity); mapdownloader_dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mapdownloader_dialog.setTitle("--"); mapdownloader_dialog.setMessage("--"); mapdownloader_dialog.setCancelable(true); mapdownloader_dialog.setProgress(0); mapdownloader_dialog.setMax(200); DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() { public void onDismiss(DialogInterface dialog) { Log.e("Navit", "onDismiss: mapdownloader_dialog"); if(mapdownloader!=null) mapdownloader.stop_thread(); } }; mapdownloader_dialog.setOnDismissListener(onDismissListener); // show license for OSM maps Toast.makeText(mActivity.getApplicationContext(), Navit._("Map data (c) OpenStreetMap contributors, ODBL"), Toast.LENGTH_LONG).show(); //TRANS return mapdownloader_dialog; case DIALOG_BACKUP_RESTORE : /* Create a Dialog that Displays Options wether to Backup or Restore */ builder.setTitle(mActivity.getString(R.string.choose_an_action)). setCancelable(true). setItems(R.array.dialog_backup_restore_items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { /* Notify User if no SD Card present */ if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) Toast.makeText(mActivity,mActivity.getString(R.string.please_insert_an_sd_card), Toast.LENGTH_LONG).show(); switch (which) { case 0: /* Backup */ new NavitBackupTask(mActivity).execute(); break; case 1: /* Restore */ mActivity.showDialog(DIALOG_SELECT_BACKUP); break; } }}); return builder.create(); case DIALOG_SELECT_BACKUP : /* Create a Dialog with a list from which the user selects the Backup to be restored */ File mainBackupDir = new File(Environment.getExternalStorageDirectory().getPath() + "/navit/backup/"); String[] backups = null; if(mainBackupDir.isDirectory()) backups = mainBackupDir.list(); if(backups == null || backups.length == 0) { /* No Backups were found */ builder.setTitle(mActivity.getText(R.string.no_backup_found)); builder.setNegativeButton(mActivity.getText(android.R.string.cancel), null); return builder.create(); } builder.setTitle(mActivity.getString(R.string.select_backup)); final ArrayAdapter adapter = new ArrayAdapter(mActivity, android.R.layout.simple_spinner_item, backups); builder.setAdapter(adapter, new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { new NavitRestoreTask(mActivity, adapter.getItem(which)).execute(); }}); builder.setNegativeButton(mActivity.getString(android.R.string.cancel), null); return builder.create(); } // should never get here!! return null; } public void prepareDialog(int id, Dialog dialog) { /* Remove the Dialog to force Android to rerun onCreateDialog */ if(id == DIALOG_SELECT_BACKUP) mActivity.removeDialog(id); } } navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java000066400000000000000000000236551264204753600326360ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.ExpandableListActivity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.Message; import android.os.StatFs; import android.util.Log; import android.view.View; import android.widget.ExpandableListView; import android.widget.RelativeLayout; import android.widget.SimpleExpandableListAdapter; import android.widget.TextView; public class NavitDownloadSelectMapActivity extends ExpandableListActivity { private static SimpleExpandableListAdapter adapter = null; private static final String MAP_BULLETPOINT = " * "; private static ArrayList> downloaded_maps_childs = null; private static ArrayList> maps_current_position_childs = null; private static boolean currentLocationKnown = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (adapter == null) { adapter = createAdapter(); } updateDownloadedMaps(); updateMapsForLocation(NavitMapDownloader.osm_maps); setListAdapter(adapter); try { setTitle(String.valueOf(getFreeSpace() / 1024 / 1024) + "MB available"); } catch (Exception e) { Log.e("Navit","Exception "+e.getClass().getName()+" during getFreeSpace, reporting 'no sdcard present'"); NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, String.format(Navit._("Current map location %s is not available\nPlease restart Navit after you attach an SD card or select a different map location."),Navit.map_filename_path), -1, 0, 0); finish(); } } protected long getFreeSpace() { StatFs fsInfo = new StatFs(Navit.map_filename_path); return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); } private void updateDownloadedMaps() { downloaded_maps_childs.clear(); for (NavitMap map : NavitMapDownloader.getAvailableMaps()) { HashMap child = new HashMap(); child.put("map_name", map.mapName + " " + (map.size() / 1024 / 1024) + "MB"); child.put("map_location", map.getLocation()); downloaded_maps_childs.add(child); } } private void updateMapsForLocation(NavitMapDownloader.osm_map_values osm_maps[]) { Location currentLocation = NavitVehicle.lastLocation; if (maps_current_position_childs.size() == 0 || (currentLocation != null && !currentLocationKnown)) { if (currentLocation == null) { LocationManager mapLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); List providers = mapLocationManager.getProviders(true); long lastUpdate = 0; long bestUpdateTime = -1; for (String provider : providers) { Location lastKnownLocation = mapLocationManager.getLastKnownLocation(provider); if (lastKnownLocation != null) { lastUpdate = lastKnownLocation.getTime(); if (lastUpdate > bestUpdateTime) { currentLocation = lastKnownLocation; bestUpdateTime = lastUpdate; } } } } else currentLocationKnown = true; if (currentLocation != null) { // if this map contains data to our current position, add it to // the // MapsOfCurrentLocation-list for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { if (osm_maps[currentMapIndex].isInMap(currentLocation)) { HashMap currentPositionMapChild = new HashMap(); currentPositionMapChild.put("map_name", osm_maps[currentMapIndex].map_name + " " + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + "MB"); currentPositionMapChild.put("map_index", String.valueOf(currentMapIndex)); maps_current_position_childs.add(currentPositionMapChild); } } } } } private SimpleExpandableListAdapter createAdapter() { NavitMapDownloader.osm_map_values osm_maps[] = NavitMapDownloader.osm_maps; ArrayList> resultGroups = new ArrayList>(); ArrayList>> resultChilds = new ArrayList>>(); // add already downloaded maps (group and empty child list HashMap downloaded_maps_hash = new HashMap(); downloaded_maps_hash.put("category_name", Navit._("Downloaded maps")); resultGroups.add(downloaded_maps_hash); downloaded_maps_childs = new ArrayList>(); resultChilds.add(downloaded_maps_childs); ArrayList> secList = new ArrayList>(); maps_current_position_childs = new ArrayList>(); // maps containing the current location HashMap matching_maps = new HashMap(); matching_maps.put("category_name", Navit.NavitResources.getString(R.string.maps_for_current_location)); resultGroups.add(matching_maps); resultChilds.add(maps_current_position_childs); // add all maps for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { if (osm_maps[currentMapIndex].level == 0) { if (secList != null && secList.size() > 0) { resultChilds.add(secList); } secList = new ArrayList>(); HashMap map_info_hash = new HashMap(); map_info_hash.put("category_name", osm_maps[currentMapIndex].map_name); resultGroups.add(map_info_hash); } HashMap child = new HashMap(); child.put("map_name", (osm_maps[currentMapIndex].level > 1 ? MAP_BULLETPOINT : "") + osm_maps[currentMapIndex].map_name + " " + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + "MB"); child.put("map_index", String.valueOf(currentMapIndex)); secList.add(child); } resultChilds.add(secList); return new SimpleExpandableListAdapter(this, resultGroups, android.R.layout.simple_expandable_list_item_1, new String[] { "category_name" }, new int[] { android.R.id.text1 }, resultChilds, android.R.layout.simple_expandable_list_item_1, new String[] { "map_name" }, new int[] { android.R.id.text1 }); } @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { super.onChildClick(parent, v, groupPosition, childPosition, id); Log.d("Navit", "p:" + groupPosition + ", child_pos:" + childPosition); @SuppressWarnings("unchecked") HashMap child = (HashMap) adapter.getChild(groupPosition, childPosition); String map_index = child.get("map_index"); if (map_index != null) { int mi=Integer.parseInt(map_index); if(NavitMapDownloader.osm_maps[mi].est_size_bytes/1024/1024/950>=4) { NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, Navit._("Sorry, we currently do not support maps above 3.8G on Android, please select a smaller one."), -1, 0, 0); return true; } Intent resultIntent = new Intent(); resultIntent.putExtra("map_index", mi); setResult(Activity.RESULT_OK, resultIntent); finish(); } else { // ask user if to delete this map askForMapDeletion(child.get("map_location")); } return true; } private void askForMapDeletion(final String map_location) { AlertDialog.Builder deleteMapBox = new AlertDialog.Builder(this); deleteMapBox.setTitle(getString(R.string.map_delete)); // TRANS deleteMapBox.setCancelable(true); final TextView message = new TextView(this); message.setFadingEdgeLength(20); message.setVerticalFadingEdgeEnabled(true); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); message.setLayoutParams(layoutParams); NavitMap maptoDelete = new NavitMap(map_location); message.setText(maptoDelete.mapName + " " + String.valueOf(maptoDelete.size() / 1024 / 1024) + "MB"); deleteMapBox.setView(message); // TRANS deleteMapBox.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "Delete Map"); Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); Bundle b = new Bundle(); b.putString("title", map_location); msg.setData(b); msg.sendToTarget(); finish(); } }); // TRANS deleteMapBox.setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.e("Navit", "don't delete map"); } }); deleteMapBox.show(); } } navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/NavitGraphics.java000066400000000000000000000670501264204753600273110ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; import android.os.Message; import android.util.FloatMath; import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.RelativeLayout; public class NavitGraphics { private NavitGraphics parent_graphics; private ArrayList overlays = new ArrayList(); int bitmap_w; int bitmap_h; int pos_x; int pos_y; int pos_wraparound; int overlay_disabled; float trackball_x, trackball_y; View view; RelativeLayout relativelayout; NavitCamera camera; Activity activity; public static Boolean in_map = false; // for menu key private static long time_for_long_press = 300L; private static long interval_for_long_press = 200L; private Handler timer_handler = new Handler(); public void SetCamera(int use_camera) { if (use_camera != 0 && camera == null) { // activity.requestWindowFeature(Window.FEATURE_NO_TITLE); camera = new NavitCamera(activity); relativelayout.addView(camera); relativelayout.bringChildToFront(view); } } protected Rect get_rect() { Rect ret=new Rect(); ret.left=pos_x; ret.top=pos_y; if (pos_wraparound != 0) { if (ret.left < 0) { ret.left+=parent_graphics.bitmap_w; } if (ret.top < 0) { ret.top+=parent_graphics.bitmap_h; } } ret.right=ret.left+bitmap_w; ret.bottom=ret.top+bitmap_h; if (pos_wraparound != 0) { if (bitmap_w < 0) { ret.right=ret.left+bitmap_w+parent_graphics.bitmap_w; } if (bitmap_h < 0) { ret.bottom=ret.top+bitmap_h+parent_graphics.bitmap_h; } } return ret; } private class NavitView extends View implements Runnable, MenuItem.OnMenuItemClickListener{ int touch_mode = NONE; float oldDist = 0; static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; static final int PRESSED = 3; Method eventGetX = null; Method eventGetY = null; public PointF mPressedPosition = null; public NavitView(Context context) { super(context); try { eventGetX = android.view.MotionEvent.class.getMethod("getX", int.class); eventGetY = android.view.MotionEvent.class.getMethod("getY", int.class); } catch (Exception e) { Log.e("NavitGraphics", "Multitouch zoom not supported"); } } @Override protected void onCreateContextMenu(ContextMenu menu) { super.onCreateContextMenu(menu); menu.setHeaderTitle(Navit._("Position")+".."); menu.add(1, 1, NONE, Navit._("Route to here")).setOnMenuItemClickListener(this); menu.add(1, 2, NONE, Navit._("Cancel")).setOnMenuItemClickListener(this); } @Override public boolean onMenuItemClick(MenuItem item) { switch(item.getItemId()) { case 1: Message msg = Message.obtain(callback_handler, msg_type.CLB_SET_DISPLAY_DESTINATION.ordinal() , (int)mPressedPosition.x, (int)mPressedPosition.y); msg.sendToTarget(); break; } return false; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(draw_bitmap, pos_x, pos_y, null); if (overlay_disabled == 0) { // assume we ARE in map view mode! in_map = true; for (NavitGraphics overlay : overlays) { if (overlay.overlay_disabled == 0) { Rect r=overlay.get_rect(); canvas.drawBitmap(overlay.draw_bitmap, r.left, r.top, null); } } } else { if (Navit.show_soft_keyboard) { if (Navit.mgr != null) { //Log.e("NavitGraphics", "view -> SHOW SoftInput"); //Log.e("NavitGraphics", "view mgr=" + String.valueOf(Navit.mgr)); Navit.mgr.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); Navit.show_soft_keyboard_now_showing = true; // clear the variable now, keyboard will stay on screen until backbutton pressed Navit.show_soft_keyboard = false; } } } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Log.e("Navit", "NavitGraphics -> onSizeChanged pixels x=" + w + " pixels y=" + h); Log.e("Navit", "NavitGraphics -> onSizeChanged density=" + Navit.metrics.density); Log.e("Navit", "NavitGraphics -> onSizeChanged scaledDensity=" + Navit.metrics.scaledDensity); super.onSizeChanged(w, h, oldw, oldh); draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); draw_canvas = new Canvas(draw_bitmap); bitmap_w = w; bitmap_h = h; SizeChangedCallback(SizeChangedCallbackID, w, h); } public void do_longpress_action() { Log.e("NavitGraphics", "do_longpress_action enter"); activity.openContextMenu(this); } private int getActionField(String fieldname, Object obj) { int ret_value = -999; try { java.lang.reflect.Field field = android.view.MotionEvent.class.getField(fieldname); try { ret_value = field.getInt(obj); } catch (Exception e) { e.printStackTrace(); } } catch (NoSuchFieldException ex) {} return ret_value; } @Override public boolean onTouchEvent(MotionEvent event) { //Log.e("NavitGraphics", "onTouchEvent"); super.onTouchEvent(event); int x = (int) event.getX(); int y = (int) event.getY(); int _ACTION_POINTER_UP_ = getActionField("ACTION_POINTER_UP", event); int _ACTION_POINTER_DOWN_ = getActionField("ACTION_POINTER_DOWN", event); int _ACTION_MASK_ = getActionField("ACTION_MASK", event); int switch_value = event.getAction(); if (_ACTION_MASK_ != -999) { switch_value = (event.getAction() & _ACTION_MASK_); } if (switch_value == MotionEvent.ACTION_DOWN) { touch_mode = PRESSED; if (!in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down mPressedPosition = new PointF(x, y); postDelayed(this, time_for_long_press); } else if ((switch_value == MotionEvent.ACTION_UP) || (switch_value == _ACTION_POINTER_UP_)) { Log.e("NavitGraphics", "ACTION_UP"); if ( touch_mode == DRAG ) { Log.e("NavitGraphics", "onTouch move"); MotionCallback(MotionCallbackID, x, y); ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up } else if (touch_mode == ZOOM) { //Log.e("NavitGraphics", "onTouch zoom"); float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); float scale = 0; if (newDist > 10f) { scale = newDist / oldDist; } if (scale > 1.3) { // zoom in CallbackMessageChannel(1, null); //Log.e("NavitGraphics", "onTouch zoom in"); } else if (scale < 0.8) { // zoom out CallbackMessageChannel(2, null); //Log.e("NavitGraphics", "onTouch zoom out"); } } else if (touch_mode == PRESSED) { if (in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up } touch_mode = NONE; } else if (switch_value == MotionEvent.ACTION_MOVE) { //Log.e("NavitGraphics", "ACTION_MOVE"); if (touch_mode == DRAG) { MotionCallback(MotionCallbackID, x, y); } else if (touch_mode == ZOOM) { float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); float scale = newDist / oldDist; Log.e("NavitGraphics", "New scale = " + scale); if (scale > 1.2) { // zoom in CallbackMessageChannel(1, ""); oldDist = newDist; //Log.e("NavitGraphics", "onTouch zoom in"); } else if (scale < 0.8) { oldDist = newDist; // zoom out CallbackMessageChannel(2, ""); //Log.e("NavitGraphics", "onTouch zoom out"); } } else if (touch_mode == PRESSED) { Log.e("NavitGraphics", "Start drag mode"); if ( spacing(mPressedPosition, new PointF(event.getX(), event.getY())) > 20f) { ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down touch_mode = DRAG; } } } else if (switch_value == _ACTION_POINTER_DOWN_) { //Log.e("NavitGraphics", "ACTION_POINTER_DOWN"); oldDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); if (oldDist > 2f) { touch_mode = ZOOM; //Log.e("NavitGraphics", "--> zoom"); } } return true; } private float spacing(PointF a, PointF b) { float x = a.x - b.x; float y = a.y - b.y; return FloatMath.sqrt(x * x + y * y); } private PointF getFloatValue(Object instance, Object argument) { PointF pos = new PointF(0,0); if (eventGetX != null && eventGetY != null) { try { Float x = (java.lang.Float) eventGetX.invoke(instance, argument); Float y = (java.lang.Float) eventGetY.invoke(instance, argument); pos.set(x.floatValue(), y.floatValue()); } catch (Exception e){} } return pos; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { int i; String s = null; boolean handled = true; i = event.getUnicodeChar(); //Log.e("NavitGraphics", "onKeyDown " + keyCode + " " + i); // Log.e("NavitGraphics","Unicode "+event.getUnicodeChar()); if (i == 0) { if (keyCode == android.view.KeyEvent.KEYCODE_DEL) { s = java.lang.String.valueOf((char) 8); } else if (keyCode == android.view.KeyEvent.KEYCODE_MENU) { if (!in_map) { // if last menukeypress is less than 0.2 seconds away then count longpress if ((System.currentTimeMillis() - Navit.last_pressed_menu_key) < interval_for_long_press) { Navit.time_pressed_menu_key = Navit.time_pressed_menu_key + (System.currentTimeMillis() - Navit.last_pressed_menu_key); //Log.e("NavitGraphics", "press time=" + Navit.time_pressed_menu_key); // on long press let softkeyboard popup if (Navit.time_pressed_menu_key > time_for_long_press) { //Log.e("NavitGraphics", "long press menu key!!"); Navit.show_soft_keyboard = true; Navit.time_pressed_menu_key = 0L; // need to draw to get the keyboard showing this.postInvalidate(); } } else { Navit.time_pressed_menu_key = 0L; } Navit.last_pressed_menu_key = System.currentTimeMillis(); // if in menu view: // use as OK (Enter) key s = java.lang.String.valueOf((char) 13); handled = true; // dont use menu key here (use it in onKeyUp) return handled; } else { // if on map view: // volume UP //s = java.lang.String.valueOf((char) 1); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_SEARCH) { /* Handle event in Main Activity if map is shown */ if(in_map) return false; s = java.lang.String.valueOf((char) 19); } else if (keyCode == android.view.KeyEvent.KEYCODE_BACK) { //Log.e("NavitGraphics", "KEYCODE_BACK down"); s = java.lang.String.valueOf((char) 27); } else if (keyCode == android.view.KeyEvent.KEYCODE_CALL) { s = java.lang.String.valueOf((char) 3); } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_UP) { if (!in_map) { // if in menu view: // use as UP key s = java.lang.String.valueOf((char) 16); handled = true; } else { // if on map view: // volume UP //s = java.lang.String.valueOf((char) 21); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_DOWN) { if (!in_map) { // if in menu view: // use as DOWN key s = java.lang.String.valueOf((char) 14); handled = true; } else { // if on map view: // volume DOWN //s = java.lang.String.valueOf((char) 4); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_CENTER) { s = java.lang.String.valueOf((char) 13); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_DOWN) { s = java.lang.String.valueOf((char) 14); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_LEFT) { s = java.lang.String.valueOf((char) 2); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_RIGHT) { s = java.lang.String.valueOf((char) 6); } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_UP) { s = java.lang.String.valueOf((char) 16); } } else if (i == 10) { s = java.lang.String.valueOf((char) 13); } if (s != null) { KeypressCallback(KeypressCallbackID, s); } return handled; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { //Log.e("NavitGraphics", "onKeyUp " + keyCode); int i; String s = null; boolean handled = true; i = event.getUnicodeChar(); if (i == 0) { if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_UP) { if (!in_map) { //s = java.lang.String.valueOf((char) 16); handled = true; return handled; } else { //s = java.lang.String.valueOf((char) 21); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_DOWN) { if (!in_map) { //s = java.lang.String.valueOf((char) 14); handled = true; return handled; } else { //s = java.lang.String.valueOf((char) 4); handled = false; return handled; } } else if (keyCode == android.view.KeyEvent.KEYCODE_SEARCH) { /* Handle event in Main Activity if map is shown */ if(in_map) return false; } else if (keyCode == android.view.KeyEvent.KEYCODE_BACK) { if (Navit.show_soft_keyboard_now_showing) { Navit.show_soft_keyboard_now_showing = false; } //Log.e("NavitGraphics", "KEYCODE_BACK up"); //s = java.lang.String.valueOf((char) 27); handled = true; return handled; } else if (keyCode == android.view.KeyEvent.KEYCODE_MENU) { if (!in_map) { if (Navit.show_soft_keyboard_now_showing) { // if soft keyboard showing on screen, dont use menu button as select key } else { // if in menu view: // use as OK (Enter) key s = java.lang.String.valueOf((char) 13); handled = true; } } else { // if on map view: // volume UP //s = java.lang.String.valueOf((char) 1); handled = false; return handled; } } } else if(i!=10) { s = java.lang.String.valueOf((char) i); } if (s != null) { KeypressCallback(KeypressCallbackID, s); } return handled; } @Override public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) { String s = null; if(keyCode == KeyEvent.KEYCODE_UNKNOWN) { s=event.getCharacters(); KeypressCallback(KeypressCallbackID, s); return true; } return super.onKeyMultiple(keyCode, count, event); } @Override public boolean onTrackballEvent(MotionEvent event) { //Log.e("NavitGraphics", "onTrackball " + event.getAction() + " " + event.getX() + " " // + event.getY()); String s = null; if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) { s = java.lang.String.valueOf((char) 13); } if (event.getAction() == android.view.MotionEvent.ACTION_MOVE) { trackball_x += event.getX(); trackball_y += event.getY(); //Log.e("NavitGraphics", "trackball " + trackball_x + " " + trackball_y); if (trackball_x <= -1) { s = java.lang.String.valueOf((char) 2); trackball_x += 1; } if (trackball_x >= 1) { s = java.lang.String.valueOf((char) 6); trackball_x -= 1; } if (trackball_y <= -1) { s = java.lang.String.valueOf((char) 16); trackball_y += 1; } if (trackball_y >= 1) { s = java.lang.String.valueOf((char) 14); trackball_y -= 1; } } if (s != null) { KeypressCallback(KeypressCallbackID, s); } return true; } @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); //Log.e("NavitGraphics", "FocusChange " + gainFocus); } public void run() { if (in_map && touch_mode == PRESSED) { do_longpress_action(); touch_mode = NONE; } } } public NavitGraphics(final Activity activity, NavitGraphics parent, int x, int y, int w, int h, int wraparound, int use_camera) { if (parent == null) { this.activity = activity; view = new NavitView(activity); //activity.registerForContextMenu(view); view.setClickable(false); view.setFocusable(true); view.setFocusableInTouchMode(true); view.setKeepScreenOn(true); relativelayout = new RelativeLayout(activity); if (use_camera != 0) { SetCamera(use_camera); } relativelayout.addView(view); activity.setContentView(relativelayout); view.requestFocus(); } else { draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); bitmap_w = w; bitmap_h = h; pos_x = x; pos_y = y; pos_wraparound = wraparound; draw_canvas = new Canvas(draw_bitmap); parent.overlays.add(this); } parent_graphics = parent; } static public enum msg_type { CLB_ZOOM_IN, CLB_ZOOM_OUT, CLB_REDRAW, CLB_MOVE, CLB_BUTTON_UP, CLB_BUTTON_DOWN, CLB_SET_DESTINATION , CLB_SET_DISPLAY_DESTINATION, CLB_CALL_CMD, CLB_COUNTRY_CHOOSER, CLB_LOAD_MAP, CLB_UNLOAD_MAP, CLB_DELETE_MAP }; static public msg_type[] msg_values = msg_type.values(); public Handler callback_handler = new Handler() { public void handleMessage(Message msg) { switch (msg_values[msg.what]) { case CLB_ZOOM_IN: CallbackMessageChannel(1, ""); break; case CLB_ZOOM_OUT: CallbackMessageChannel(2, ""); break; case CLB_MOVE: MotionCallback(MotionCallbackID, msg.getData().getInt("x"), msg.getData().getInt("y")); break; case CLB_SET_DESTINATION: String lat = Float.toString(msg.getData().getFloat("lat")); String lon = Float.toString(msg.getData().getFloat("lon")); String q = msg.getData().getString(("q")); CallbackMessageChannel(3, lat + "#" + lon + "#" + q); break; case CLB_SET_DISPLAY_DESTINATION: int x = msg.arg1; int y = msg.arg2; CallbackMessageChannel(4, "" + x + "#" + y); break; case CLB_CALL_CMD: String cmd = msg.getData().getString(("cmd")); CallbackMessageChannel(5, cmd); break; case CLB_BUTTON_UP: ButtonCallback(ButtonCallbackID, 0, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // up break; case CLB_BUTTON_DOWN: ButtonCallback(ButtonCallbackID, 1, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // down break; case CLB_COUNTRY_CHOOSER: break; case CLB_LOAD_MAP: CallbackMessageChannel(6, msg.getData().getString(("title"))); break; case CLB_DELETE_MAP: File toDelete = new File( msg.getData().getString(("title"))); toDelete.delete(); //fallthrough case CLB_UNLOAD_MAP: CallbackMessageChannel(7, msg.getData().getString(("title"))); break; } } }; public native void SizeChangedCallback(int id, int x, int y); public native void KeypressCallback(int id, String s); public native int CallbackMessageChannel(int i, String s); public native void ButtonCallback(int id, int pressed, int button, int x, int y); public native void MotionCallback(int id, int x, int y); public native String GetDefaultCountry(int id, String s); public static native String[][] GetAllCountries(); private Canvas draw_canvas; private Bitmap draw_bitmap; private int SizeChangedCallbackID, ButtonCallbackID, MotionCallbackID, KeypressCallbackID; // private int count; public void setSizeChangedCallback(int id) { SizeChangedCallbackID = id; } public void setButtonCallback(int id) { ButtonCallbackID = id; } public void setMotionCallback(int id) { MotionCallbackID = id; Navit.setMotionCallback(id, this); } public void setKeypressCallback(int id) { KeypressCallbackID = id; // set callback id also in main intent (for menus) Navit.setKeypressCallback(id, this); } protected void draw_polyline(Paint paint, int c[]) { int i, ndashes; float [] intervals; // Log.e("NavitGraphics","draw_polyline"); paint.setStrokeWidth(c[0]); paint.setARGB(c[1],c[2],c[3],c[4]); paint.setStyle(Paint.Style.STROKE); //paint.setAntiAlias(true); //paint.setStrokeWidth(0); ndashes=c[5]; intervals=new float[ndashes+(ndashes%2)]; for (i = 0; i < ndashes; i++) intervals[i]=c[6+i]; if((ndashes%2)==1) intervals[ndashes]=intervals[ndashes-1]; if(ndashes>0) paint.setPathEffect(new android.graphics.DashPathEffect(intervals,0.0f)); Path path = new Path(); path.moveTo(c[6+ndashes], c[7+ndashes]); for (i = 8+ndashes; i < c.length; i += 2) { path.lineTo(c[i], c[i + 1]); } //global_path.close(); draw_canvas.drawPath(path, paint); paint.setPathEffect(null); } protected void draw_polygon(Paint paint, int c[]) { //Log.e("NavitGraphics","draw_polygon"); paint.setStrokeWidth(c[0]); paint.setARGB(c[1],c[2],c[3],c[4]); paint.setStyle(Paint.Style.FILL); //paint.setAntiAlias(true); //paint.setStrokeWidth(0); Path path = new Path(); path.moveTo(c[5], c[6]); for (int i = 7; i < c.length; i += 2) { path.lineTo(c[i], c[i + 1]); } //global_path.close(); draw_canvas.drawPath(path, paint); } protected void draw_rectangle(Paint paint, int x, int y, int w, int h) { //Log.e("NavitGraphics","draw_rectangle"); Rect r = new Rect(x, y, x + w, y + h); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); //paint.setStrokeWidth(0); draw_canvas.drawRect(r, paint); } protected void draw_circle(Paint paint, int x, int y, int r) { //Log.e("NavitGraphics","draw_circle"); // float fx = x; // float fy = y; // float fr = r / 2; paint.setStyle(Paint.Style.STROKE); draw_canvas.drawCircle(x, y, r / 2, paint); } protected void draw_text(Paint paint, int x, int y, String text, int size, int dx, int dy, int bgcolor) { int oldcolor=paint.getColor(); Path path=null; paint.setTextSize(size / 15); paint.setStyle(Paint.Style.FILL); if (dx != 0x10000 || dy != 0) { path = new Path(); path.moveTo(x, y); path.rLineTo(dx, dy); paint.setTextAlign(android.graphics.Paint.Align.LEFT); } if(bgcolor!=0) { paint.setStrokeWidth(3); paint.setColor(bgcolor); paint.setStyle(Paint.Style.STROKE); if(path==null) { draw_canvas.drawText(text, x, y, paint); } else { draw_canvas.drawTextOnPath(text, path, 0, 0, paint); } paint.setStyle(Paint.Style.FILL); paint.setColor(oldcolor); } if(path==null) { draw_canvas.drawText(text, x, y, paint); } else { draw_canvas.drawTextOnPath(text, path, 0, 0, paint); } paint.clearShadowLayer(); } protected void draw_image(Paint paint, int x, int y, Bitmap bitmap) { //Log.e("NavitGraphics","draw_image"); // float fx = x; // float fy = y; draw_canvas.drawBitmap(bitmap, x, y, paint); } /* takes an image and draws it on the screen as a prerendered maptile * * * * @param paint Paint object used to draw the image * @param count the number of points specified * @param p0x and p0y specifying the top left point * @param p1x and p1y specifying the top right point * @param p2x and p2y specifying the bottom left point, not yet used but kept * for compatibility with the linux port * @param bitmap Bitmap object holding the image to draw * * TODO make it work with 4 points specified to make it work for 3D mapview, so it can be used * for small but very detailed maps as well as for large maps with very little detail but large * coverage. * TODO make it work with rectangular tiles as well ? */ protected void draw_image_warp(Paint paint, int count, int p0x, int p0y, int p1x, int p1y, int p2x, int p2y, Bitmap bitmap) { float width; float scale; float deltaY; float deltaX; float angle; Matrix matrix; if (count == 3) { matrix = new Matrix(); deltaX = p1x - p0x; deltaY = p1y - p0y; width = (float) (Math.sqrt((deltaX * deltaX) + (deltaY * deltaY))); angle = (float) (Math.atan2(deltaY, deltaX) * 180d / Math.PI); scale = width / bitmap.getWidth(); matrix.preScale(scale, scale); matrix.postTranslate(p0x, p0y); matrix.postRotate(angle, p0x, p0y); draw_canvas.drawBitmap(bitmap, matrix, paint); } } /* These constants must be synchronized with enum draw_mode_num in graphics.h. */ public static final int draw_mode_begin = 0; public static final int draw_mode_end = 1; protected void draw_mode(int mode) { //Log.e("NavitGraphics", "draw_mode mode=" + mode + " parent_graphics=" // + String.valueOf(parent_graphics)); if (mode == draw_mode_end) { if (parent_graphics == null) { view.invalidate(); } else { parent_graphics.view.invalidate(get_rect()); } } if (mode == draw_mode_begin && parent_graphics != null) { draw_bitmap.eraseColor(0); } } protected void draw_drag(int x, int y) { //Log.e("NavitGraphics","draw_drag"); pos_x = x; pos_y = y; } protected void overlay_disable(int disable) { Log.e("NavitGraphics","overlay_disable: " + disable + "Parent: " + (parent_graphics != null)); // assume we are NOT in map view mode! if (parent_graphics == null) in_map = (disable==0); if (overlay_disabled != disable) { overlay_disabled = disable; if (parent_graphics != null) { parent_graphics.view.invalidate(get_rect()); } } } protected void overlay_resize(int x, int y, int w, int h, int wraparound) { //Log.e("NavitGraphics","overlay_resize"); draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); bitmap_w = w; bitmap_h = h; pos_x = x; pos_y = y; pos_wraparound = wraparound; draw_canvas.setBitmap(draw_bitmap); } public static String getLocalizedString(String text) { String ret = CallbackLocalizedString(text); //Log.e("NavitGraphics", "callback_handler -> lozalized string=" + ret); return ret; } /** * get localized string */ public static native String CallbackLocalizedString(String s); } navit-0.5.0+dfsg.1/navit/android/src/org/navitproject/navit/NavitMapDownloader.java000066400000000000000000001055451264204753600303070ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.navitproject.navit; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import android.location.Location; import android.os.Bundle; import android.os.Message; import android.os.StatFs; import android.util.Log; /** * @author rikky * */ public class NavitMapDownloader extends Thread { public static class osm_map_values { String lon1; String lat1; String lon2; String lat2; String map_name = ""; long est_size_bytes = 0; int level = 0; public osm_map_values(String mapname, String lon_1, String lat_1, String lon_2, String lat_2, long bytes_est, int level) { this.map_name = mapname; this.lon1 = lon_1; this.lat1 = lat_1; this.lon2 = lon_2; this.lat2 = lat_2; this.est_size_bytes = bytes_est; this.level = level; } public boolean isInMap(Location location) { double longitude_1 = Double.valueOf(this.lon1); double latitude_1 = Double.valueOf(this.lat1); double longitude_2 = Double.valueOf(this.lon2); double latitude_2 = Double.valueOf(this.lat2); if (location.getLongitude() < longitude_1) return false; if (location.getLongitude() > longitude_2) return false; if (location.getLatitude() < latitude_1) return false; if (location.getLatitude() > latitude_2) return false; return true; } } // // define the maps here // public static final osm_map_values[] osm_maps = { new osm_map_values(Navit._("Whole Planet"), "-180", "-90", "180", "90", 17142215673L, 0), new osm_map_values(Navit._("Africa"), "-30.89", "-36.17", "61.68", "38.40", 978759015L, 0), new osm_map_values(Navit._("Angola"), "11.4", "-18.1", "24.2", "-5.3", 91248521L, 1), new osm_map_values(Navit._("Burundi"), "28.9", "-4.5", "30.9", "-2.2", 90190335L, 1), new osm_map_values(Navit._("Canary Islands"), "-18.69", "26.52", "-12.79", "29.99", 98499593L, 1), new osm_map_values(Navit._("Congo, Democratic Republic of the"), "11.7", "-13.6", "31.5", "5.7", 142546118L, 1), new osm_map_values(Navit._("Ethiopia"), "32.89", "3.33", "48.07", "14.97", 104750098L, 1), new osm_map_values(Navit._("Guinea"), "-15.47", "7.12", "-7.58", "12.74", 142811547L, 1), new osm_map_values(Navit._("Cote d'Ivoire"), "-8.72", "4.09", "-2.43", "10.80", 96781332L, 1), new osm_map_values(Navit._("Kenya"), "33.8", "-5.2", "42.4", "4.9", 99336192L, 1), new osm_map_values(Navit._("Lesotho"), "26.9", "-30.7", "29.6", "-28.4", 100726025L, 1), new osm_map_values(Navit._("Liberia"), "-15.00", "-0.73", "-7.20", "8.65", 124911153L, 1), new osm_map_values(Navit._("Libya"), "9.32", "19.40", "25.54", "33.63", 92073435L, 1), new osm_map_values(Navit._("Madagascar"), "42.25", "-26.63", "51.20", "-11.31", 106061047L, 1), new osm_map_values(Navit._("Namibia")+"+"+Navit._("Botswana"), "11.4", "-29.1", "29.5", "-16.9", 114970822L, 1), new osm_map_values(Navit._("Reunion"), "55.2", "-21.4", "55.9", "-20.9", 98431755L, 1), new osm_map_values(Navit._("Rwanda"), "28.8", "-2.9", "30.9", "-1.0", 94150938L, 1), new osm_map_values(Navit._("South Africa")+"+"+Navit._("Lesotho"), "15.93", "-36.36", "33.65", "-22.08", 156152979L, 1), new osm_map_values(Navit._("Tanzania, United Republic of"), "29.19", "-11.87", "40.74", "-0.88", 106768648L, 1), new osm_map_values(Navit._("Uganda"), "29.3", "-1.6", "35.1", "4.3", 100022833L, 1), new osm_map_values(Navit._("Asia"), "23.8", "0.1", "195.0", "82.4", 3253177355L, 0), new osm_map_values(Navit._("Azerbaijan"), "44.74", "38.34", "51.69", "42.37", 102293296L, 1), new osm_map_values(Navit._("China"), "67.3", "5.3", "135.0", "54.5", 903999878L, 1), new osm_map_values(Navit._("Cyprus"), "32.0", "34.5", "34.9", "35.8", 90703681L, 1), new osm_map_values(Navit._("India")+"+"+Navit._("Nepal"), "67.9", "5.5", "89.6", "36.0", 256058660L, 1), new osm_map_values(Navit._("Indonesia"), "93.7", "-17.3", "155.5", "7.6", 228766382L, 1), new osm_map_values(Navit._("Iran, Islamic Republic of"), "43.5", "24.4", "63.6", "40.4", 154094880L, 1), new osm_map_values(Navit._("Iraq"), "38.7", "28.5", "49.2", "37.4", 107058534L, 1), new osm_map_values(Navit._("Israel"), "33.99", "29.8", "35.95", "33.4", 119569846L, 1), new osm_map_values(Navit._("Japan")+"+"+Navit._("Korea")+"+"+Navit._("Taiwan"), "117.6", "20.5", "151.3", "47.1", 766362093L, 1), new osm_map_values(Navit._("Kazakhstan"), "46.44", "40.89", "87.36", "55.45", 280438037L, 1), new osm_map_values(Navit._("Kyrgyzstan"), "69.23", "39.13", "80.33", "43.29", 110465464L, 1), new osm_map_values(Navit._("Malaysia")+"+"+Navit._("Singapore"), "94.3", "-5.9", "108.6", "6.8", 119187612L, 1), new osm_map_values(Navit._("Mongolia"), "87.5", "41.4", "120.3", "52.7", 107398401L, 1), new osm_map_values(Navit._("Pakistan"), "60.83", "23.28", "77.89", "37.15", 136107911L, 1), new osm_map_values(Navit._("Philippines"), "115.58", "4.47", "127.85", "21.60", 166151582L, 1), new osm_map_values(Navit._("Saudi Arabia"), "33.2", "16.1", "55.9", "33.5", 170037602L, 1), new osm_map_values(Navit._("Thailand"), "97.5", "5.7", "105.2", "19.7", 134166813L, 1), new osm_map_values(Navit._("Turkey"), "25.1", "35.8", "46.4", "42.8", 232347346L, 1), new osm_map_values(Navit._("Turkmenistan"), "51.78", "35.07", "66.76", "42.91", 95588384L, 1), new osm_map_values(Navit._("UAE+Other"), "51.5", "22.6", "56.7", "26.5", 95709627L, 1), new osm_map_values(Navit._("Australia")+"+"+Navit._("Oceania"), "89.84", "-57.39", "179.79", "7.26", 482408675L, 0), new osm_map_values(Navit._("Australia"), "110.5", "-44.2", "154.9", "-9.2", 244410808L, 0), new osm_map_values(Navit._("Tasmania"), "144.0", "-45.1", "155.3", "-24.8", 176390644L, 1), new osm_map_values(Navit._("Victoria")+"+"+Navit._("New South Wales"), "140.7", "-39.4", "153.7", "-26.9", 166905296L, 1), new osm_map_values(Navit._("New Caledonia"), "157.85", "-25.05", "174.15", "-16.85", 88175405L, 1), new osm_map_values(Navit._("New Zealand"), "165.2", "-47.6", "179.1", "-33.7", 180469055L, 1), new osm_map_values(Navit._("Europe"), "-12.97", "33.59", "34.15", "72.10", 9046728786L, 0), new osm_map_values(Navit._("Western Europe"), "-17.6", "34.5", "42.9", "70.9", 9512395121L, 1), new osm_map_values(Navit._("Austria"), "9.4", "46.32", "17.21", "49.1", 662454467L, 1), new osm_map_values(Navit._("Azores"), "-31.62", "36.63", "-24.67", "40.13", 84310373L, 1), new osm_map_values(Navit._("BeNeLux"), "2.08", "48.87", "7.78", "54.52", 1520394547L, 1), new osm_map_values(Navit._("Netherlands"), "3.07", "50.75", "7.23", "53.73", 1055308779L, 1), new osm_map_values(Navit._("Denmark"), "7.65", "54.32", "15.58", "58.07", 290170098L, 1), new osm_map_values(Navit._("Faroe Islands"), "-7.8", "61.3", "-6.1", "62.5", 83188591L, 1), new osm_map_values(Navit._("France"), "-5.45", "42.00", "8.44", "51.68", 3249655126L, 1), new osm_map_values(Navit._("Alsace"), "6.79", "47.27", "8.48", "49.17", 288424319L, 2), new osm_map_values(Navit._("Aquitaine"), "-2.27", "42.44", "1.50", "45.76", 372741849L, 2), new osm_map_values(Navit._("Auvergne"), "2.01", "44.57", "4.54", "46.85", 248344580L, 2), new osm_map_values(Navit._("Basse-Normandie"), "-2.09", "48.13", "1.03", "49.98", 212920166L, 2), new osm_map_values(Navit._("Bourgogne"), "2.80", "46.11", "5.58", "48.45", 254169749L, 2), new osm_map_values(Navit._("Bretagne"), "-5.58", "46.95", "-0.96", "48.99", 344216282L, 2), new osm_map_values(Navit._("Centre"), "0.01", "46.29", "3.18", "48.99", 406182417L, 2), new osm_map_values(Navit._("Champagne-Ardenne"), "3.34", "47.53", "5.94", "50.28", 229584275L, 2), new osm_map_values(Navit._("Corse"), "8.12", "41.32", "9.95", "43.28", 100145697L, 2), new osm_map_values(Navit._("Franche-Comte"), "5.20", "46.21", "7.83", "48.07", 262855868L, 2), new osm_map_values(Navit._("Haute-Normandie"), "-0.15", "48.62", "1.85", "50.18", 161154198L, 2), new osm_map_values(Navit._("Ile-de-France"), "1.40", "48.07", "3.61", "49.29", 161154198L, 2), new osm_map_values(Navit._("Languedoc-Roussillon"), "1.53", "42.25", "4.89", "45.02", 327632080L, 2), new osm_map_values(Navit._("Limousin"), "0.58", "44.87", "2.66", "46.50", 183489689L, 2), new osm_map_values(Navit._("Lorraine"), "4.84", "47.77", "7.72", "49.73", 269812559L, 2), new osm_map_values(Navit._("Midi-Pyrenees"), "-0.37", "42.18", "3.50", "45.10", 383558262L, 2), new osm_map_values(Navit._("Nord-pas-de-Calais"), "1.42", "49.92", "4.49", "51.31", 302919146L, 2), new osm_map_values(Navit._("Pays-de-la-Loire"), "-2.88", "46.20", "0.97", "48.62", 450193605L, 2), new osm_map_values(Navit._("Picardie"), "1.25", "48.79", "4.31", "50.43", 307070563L, 2), new osm_map_values(Navit._("Poitou-Charentes"), "-1.69", "45.04", "1.26", "47.23", 313113043L, 2), new osm_map_values(Navit._("Provence-Alpes-Cote-d-Azur"), "4.21", "42.91", "7.99", "45.18", 317595783L, 2), new osm_map_values(Navit._("Rhone-Alpes"), "3.65", "44.07", "7.88", "46.64", 407877163L, 2), new osm_map_values(Navit._("Germany"), "5.18", "46.84", "15.47", "55.64", 2837673591L, 1), new osm_map_values(Navit._("Baden-Wuerttemberg"), "7.32", "47.14", "10.57", "49.85", 527492836L, 2), new osm_map_values(Navit._("Bayern"), "8.92", "47.22", "13.90", "50.62", 662940459L, 2), new osm_map_values(Navit._("Mittelfranken"), "9.86", "48.78", "11.65", "49.84", 160155291L, 2), new osm_map_values(Navit._("Niederbayern"), "11.55", "47.75", "14.12", "49.42", 239575482L, 2), new osm_map_values(Navit._("Oberbayern"), "10.67", "47.05", "13.57", "49.14", 301207029L, 2), new osm_map_values(Navit._("Oberfranken"), "10.31", "49.54", "12.49", "50.95", 183767024L, 2), new osm_map_values(Navit._("Oberpfalz"), "11.14", "48.71", "13.47", "50.43", 199582448L, 2), new osm_map_values(Navit._("Schwaben"), "9.27", "47.10", "11.36", "49.09", 248955385L, 2), new osm_map_values(Navit._("Unterfranken"), "8.59", "49.16", "10.93", "50.67", 236009244L, 2), new osm_map_values(Navit._("Berlin"), "13.03", "52.28", "13.81", "52.73", 236009244L, 2), new osm_map_values(Navit._("Brandenburg"), "11.17", "51.30", "14.83", "53.63", 248263976L, 2), new osm_map_values(Navit._("Bremen"), "8.43", "52.96", "9.04", "53.66", 116469818L, 2), new osm_map_values(Navit._("Hamburg"), "9.56", "53.34", "10.39", "53.80", 122614777L, 2), new osm_map_values(Navit._("Hessen"), "7.72", "49.34", "10.29", "51.71", 334364378L, 2), new osm_map_values(Navit._("Mecklenburg-Vorpommern"), "10.54", "53.05", "14.48", "55.05", 164819613L, 2), new osm_map_values(Navit._("Niedersachsen"), "6.40", "51.24", "11.69", "54.22", 662782848L, 2), new osm_map_values(Navit._("Nordrhein-westfalen"), "5.46", "50.26", "9.52", "52.59", 796972268L, 2), new osm_map_values(Navit._("Rheinland-Pfalz"), "6.06", "48.91", "8.56", "51.00", 334191707L, 2), new osm_map_values(Navit._("Saarland"), "6.30", "49.06", "7.46", "49.69", 120534914L, 2), new osm_map_values(Navit._("Sachsen-Anhalt"), "10.50", "50.88", "13.26", "53.11", 221889143L, 2), new osm_map_values(Navit._("Sachsen"), "11.82", "50.11", "15.10", "51.73", 267277236L, 2), new osm_map_values(Navit._("Schleswig-Holstein"), "7.41", "53.30", "11.98", "55.20", 219653495L, 2), new osm_map_values(Navit._("Thueringen"), "9.81", "50.15", "12.72", "51.70", 208223042L, 2), new osm_map_values(Navit._("Germany")+"+"+Navit._("Austria")+"+"+Navit._("Switzerland"), "3.4", "44.5", "18.6", "55.1", 4492224830L, 1), new osm_map_values(Navit._("Iceland"), "-25.3", "62.8", "-11.4", "67.5", 94548231L, 1), new osm_map_values(Navit._("Ireland"), "-11.17", "51.25", "-5.23", "55.9", 165550114L, 1), new osm_map_values(Navit._("Italy"), "6.52", "36.38", "18.96", "47.19", 1062662974L, 1), new osm_map_values(Navit._("Spain")+"+"+Navit._("Portugal"), "-11.04", "34.87", "4.62", "44.41", 812986937L, 1), new osm_map_values(Navit._("Mallorca"), "2.2", "38.8", "4.7", "40.2", 134412997L, 2), new osm_map_values(Navit._("Galicia"), "-10.0", "41.7", "-6.3", "44.1", 151155417L, 2), new osm_map_values(Navit._("Scandinavia"), "4.0", "54.4", "32.1", "71.5", 957345953L, 1), new osm_map_values(Navit._("Finland"), "18.6", "59.2", "32.3", "70.3", 326001389L, 1), new osm_map_values(Navit._("Denmark"), "7.49", "54.33", "13.05", "57.88", 255631813L, 1), new osm_map_values(Navit._("Switzerland"), "5.79", "45.74", "10.59", "47.84", 439384941L, 1), new osm_map_values(Navit._("United Kingdom"), "-9.7", "49.6", "2.2", "61.2", 679063758L, 1), new osm_map_values(Navit._("England"), "-7.80", "48.93", "2.41", "56.14", 724085648L, 1), new osm_map_values(Navit._("Buckinghamshire"), "-1.19", "51.44", "-0.43", "52.25", 109563143L, 2), new osm_map_values(Navit._("Cambridgeshire"), "-0.55", "51.96", "0.56", "52.79", 108935775L, 2), new osm_map_values(Navit._("Cumbria"), "-3.96", "53.85", "-2.11", "55.24", 108479102L, 2), new osm_map_values(Navit._("East yorkshire with hull"), "-1.16", "53.50", "0.54", "54.26", 109066505L, 2), new osm_map_values(Navit._("Essex"), "-0.07", "51.40", "1.36", "52.14", 126883293L, 2), new osm_map_values(Navit._("Herefordshire"), "-3.19", "51.78", "-2.29", "52.45", 97777992L, 2), new osm_map_values(Navit._("Kent"), "-0.02", "50.81", "1.65", "51.53", 112579242L, 2), new osm_map_values(Navit._("Lancashire"), "-3.20", "53.43", "-2.00", "54.29", 112845974L, 2), new osm_map_values(Navit._("Leicestershire"), "-1.65", "52.34", "-0.61", "53.03", 117179765L, 2), new osm_map_values(Navit._("Norfolk"), "0.10", "52.30", "2.04", "53.41", 108306587L, 2), new osm_map_values(Navit._("Nottinghamshire"), "-1.39", "52.73", "-0.62", "53.55", 112023678L, 2), new osm_map_values(Navit._("Oxfordshire"), "-1.77", "51.41", "-0.82", "52.22", 109834780L, 2), new osm_map_values(Navit._("Shropshire"), "-3.29", "52.26", "-2.18", "53.05", 103532414L, 2), new osm_map_values(Navit._("Somerset"), "-3.89", "50.77", "-2.20", "51.40", 109975069L, 2), new osm_map_values(Navit._("South yorkshire"), "-1.88", "53.25", "-0.80", "53.71", 110488840L, 2), new osm_map_values(Navit._("Suffolk"), "0.29", "51.88", "1.81", "52.60", 109788040L, 2), new osm_map_values(Navit._("Surrey"), "-0.90", "51.02", "0.10", "51.52", 121727148L, 2), new osm_map_values(Navit._("Wiltshire"), "-2.41", "50.90", "-1.44", "51.76", 106375888L, 2), new osm_map_values(Navit._("Scotland"), "-8.13", "54.49", "-0.15", "61.40", 189176250L, 2), new osm_map_values(Navit._("Wales"), "-5.56", "51.28", "-2.60", "53.60", 144572638L, 2), new osm_map_values(Navit._("Albania"), "19.09", "39.55", "21.12", "42.72", 106939331L, 1), new osm_map_values(Navit._("Belarus"), "23.12", "51.21", "32.87", "56.23", 229648760L, 1), new osm_map_values(Navit._("Russian Federation"), "27.9", "41.5", "190.4", "77.6", 1479983473L, 1), new osm_map_values(Navit._("Bulgaria"), "24.7", "42.1", "24.8", "42.1", 83696190L, 1), new osm_map_values(Navit._("Bosnia and Herzegovina"), "15.69", "42.52", "19.67", "45.32", 144196241L, 1), new osm_map_values(Navit._("Czech Republic"), "11.91", "48.48", "19.02", "51.17", 711304334L, 1), new osm_map_values(Navit._("Croatia"), "13.4", "42.1", "19.4", "46.9", 251673871L, 1), new osm_map_values(Navit._("Estonia"), "21.5", "57.5", "28.2", "59.6", 142340828L, 1), new osm_map_values(Navit._("Greece"), "28.9", "37.8", "29.0", "37.8", 83257661L, 1), new osm_map_values(Navit._("Crete"), "23.3", "34.5", "26.8", "36.0", 87834598L, 1), new osm_map_values(Navit._("Hungary"), "16.08", "45.57", "23.03", "48.39", 256779608L, 1), new osm_map_values(Navit._("Latvia"), "20.7", "55.6", "28.3", "58.1", 144857068L, 1), new osm_map_values(Navit._("Lithuania"), "20.9", "53.8", "26.9", "56.5", 156811735L, 1), new osm_map_values(Navit._("Poland"), "13.6", "48.8", "24.5", "55.0", 1018629889L, 1), new osm_map_values(Navit._("Romania"), "20.3", "43.5", "29.9", "48.4", 265402066L, 1), new osm_map_values(Navit._("Ukraine"), "22.0", "44.3", "40.4", "52.4", 524768547L, 1), new osm_map_values(Navit._("North America"), "-178.1", "6.5", "-10.4", "84.0", 4526641449L, 0), new osm_map_values(Navit._("Alaska"), "-179.5", "49.5", "-129", "71.6", 174207438L, 1), new osm_map_values(Navit._("Canada"), "-141.3", "41.5", "-52.2", "70.2", 2273900574L, 1), new osm_map_values(Navit._("Hawaii"), "-161.07", "18.49", "-154.45", "22.85", 87476921L, 1), new osm_map_values(Navit._("USA")+Navit._(" (except Alaska and Hawaii)"), "-125.4", "24.3", "-66.5", "49.3", 3389691841L, 1), new osm_map_values(Navit._("Midwest"), "-104.11", "35.92", "-80.46", "49.46", 1030850300L, 2), new osm_map_values(Navit._("Michigan"), "-90.47", "41.64", "-79.00", "49.37", 495136827L, 2), new osm_map_values(Navit._("Ohio"), "-84.87", "38.05", "-79.85", "43.53", 226499873L, 2), new osm_map_values(Navit._("Northeast"), "-80.58", "38.72", "-66.83", "47.53", 848767227L, 2), new osm_map_values(Navit._("Massachusetts"), "-73.56", "40.78", "-68.67", "42.94", 284272912L, 2), new osm_map_values(Navit._("Vermont"), "-73.49", "42.68", "-71.41", "45.07", 110911886L, 2), new osm_map_values(Navit._("Pacific"), "-180.05", "15.87", "-129.75", "73.04", 172206612L, 2), new osm_map_values(Navit._("South"), "-106.70", "23.98", "-71.46", "40.70", 1481026457L, 2), new osm_map_values(Navit._("Arkansas"), "-94.67", "32.95", "-89.59", "36.60", 125115656L, 2), new osm_map_values(Navit._("District of Columbia"), "-77.17", "38.74", "-76.86", "39.05", 101152353L, 2), new osm_map_values(Navit._("Florida"), "-88.75", "23.63", "-77.67", "31.05", 174378547L, 2), new osm_map_values(Navit._("Louisiana"), "-94.09", "28.09", "-88.62", "33.07", 177996551L, 2), new osm_map_values(Navit._("Maryland"), "-79.54", "37.83", "-74.99", "40.22", 213559925L, 2), new osm_map_values(Navit._("Mississippi"), "-91.71", "29.99", "-88.04", "35.05", 146620850L, 2), new osm_map_values(Navit._("Oklahoma"), "-103.41", "33.56", "-94.38", "37.38", 167396836L, 2), new osm_map_values(Navit._("Texas"), "-106.96", "25.62", "-92.97", "36.58", 320259945L, 2), new osm_map_values(Navit._("Virginia"), "-83.73", "36.49", "-74.25", "39.52", 306054196L, 2), new osm_map_values(Navit._("West Virginia"), "-82.70", "37.15", "-77.66", "40.97", 181531617L, 2), new osm_map_values(Navit._("West"), "-133.11", "31.28", "-101.99", "49.51", 837597071L, 2), new osm_map_values(Navit._("Arizona"), "-114.88", "30.01", "-108.99", "37.06", 140190223L, 2), new osm_map_values(Navit._("California"), "-125.94", "32.43", "-114.08", "42.07", 384857326L, 2), new osm_map_values(Navit._("Colorado"), "-109.11", "36.52", "-100.41", "41.05", 185388342L, 2), new osm_map_values(Navit._("Idaho"), "-117.30", "41.93", "-110.99", "49.18", 137642365L, 2), new osm_map_values(Navit._("Montana"), "-116.10", "44.31", "-102.64", "49.74", 140601787L, 2), new osm_map_values(Navit._("New Mexico"), "-109.10", "26.98", "-96.07", "37.05", 263105357L, 2), new osm_map_values(Navit._("Nevada"), "-120.2", "35.0", "-113.8", "42.1", 164712473L, 2), new osm_map_values(Navit._("Oregon"), "-124.8", "41.8", "-116.3", "46.3", 153169398L, 2), new osm_map_values(Navit._("Utah"), "-114.11", "36.95", "-108.99", "42.05", 115653638L, 2), new osm_map_values(Navit._("Washington State"), "-125.0", "45.5", "-116.9", "49.0", 167427046L, 2), new osm_map_values(Navit._("South+Middle America"), "-83.5", "-56.3", "-30.8", "13.7", 562230441L, 0), new osm_map_values(Navit._("Argentina"), "-73.9", "-57.3", "-51.6", "-21.0", 244901827L, 1), new osm_map_values(Navit._("Argentina")+"+"+Navit._("Chile"), "-77.2", "-56.3", "-52.7", "-16.1", 269594088L, 1), new osm_map_values(Navit._("Bolivia"), "-70.5", "-23.1", "-57.3", "-9.3", 121759213L, 1), new osm_map_values(Navit._("Brazil"), "-71.4", "-34.7", "-32.8", "5.4", 388405363L, 1), new osm_map_values(Navit._("Chile"), "-81.77", "-58.50", "-65.46", "-17.41", 160742590L, 1), new osm_map_values(Navit._("Cuba"), "-85.3", "19.6", "-74.0", "23.6", 95014897L, 1), new osm_map_values(Navit._("Colombia"), "-79.1", "-4.0", "-66.7", "12.6", 151545547L, 1), new osm_map_values(Navit._("Ecuador"), "-82.6", "-5.4", "-74.4", "2.3", 105488624L, 1), new osm_map_values(Navit._("Guyana")+"+"+Navit._("Suriname")+"+"+Navit._("Guyane Francaise"), "-62.0", "1.0", "-51.2", "8.9", 92083881L, 1), new osm_map_values(Navit._("Haiti")+"+"+Navit._("Dominican Republic"), "-74.8", "17.3", "-68.2", "20.1", 103797756L, 1), new osm_map_values(Navit._("Jamaica"), "-78.6", "17.4", "-75.9", "18.9", 85053924L, 1), new osm_map_values(Navit._("Mexico"), "-117.6", "14.1", "-86.4", "32.8", 384891270L, 1), new osm_map_values(Navit._("Paraguay"), "-63.8", "-28.1", "-53.6", "-18.8", 116798539L, 1), new osm_map_values(Navit._("Peru"), "-82.4", "-18.1", "-67.5", "0.4", 137292365L, 1), new osm_map_values(Navit._("Uruguay"), "-59.2", "-36.5", "-51.7", "-29.7", 113817110L, 1), new osm_map_values(Navit._("Venezuela"), "-73.6", "0.4", "-59.7", "12.8", 124001905L, 1) }; private String map_filename_path; public static NavitMap[] getAvailableMaps() { class filterMaps implements FilenameFilter { public boolean accept(File dir, String filename) { if (filename.endsWith(".bin")) return true; return false; } } NavitMap maps[] = new NavitMap[0]; File map_dir = new File(Navit.map_filename_path); String map_file_names[] = map_dir.list(new filterMaps()); if (map_file_names != null) { maps = new NavitMap[map_file_names.length]; for (int map_file_index = 0; map_file_index < map_file_names.length; map_file_index++) { maps[map_file_index] = new NavitMap(Navit.map_filename_path, map_file_names[map_file_index]); } } return maps; } private Boolean stop_me = false; private osm_map_values map_values; private int map_id; private long uiLastUpdated = -1; private Boolean retryDownload = false; //Download failed, but //we should try to resume private static final int SOCKET_CONNECT_TIMEOUT = 60000; // 60 secs. private static final int SOCKET_READ_TIMEOUT = 120000; // 120 secs. private static final int MAP_WRITE_FILE_BUFFER = 1024 * 64; private static final int MAP_WRITE_MEM_BUFFER = 1024 * 64; private static final int MAP_READ_FILE_BUFFER = 1024 * 64; private static final int UPDATE_PROGRESS_TIME_NS = 1000 * 1000000; // 1ns=1E-9s private static final int MAX_RETRIES = 5; private static final String TAG = "NavitMapDownloader"; protected int retry_counter = 0; public NavitMapDownloader(int map_id) { this.map_values = osm_maps[map_id]; this.map_id=map_id; this.map_filename_path=Navit.map_filename_path; } public void run() { stop_me = false; retry_counter = 0; Log.v(TAG, "start download " + map_values.map_name); updateProgress(0, map_values.est_size_bytes, Navit._("downloading") + ": " + map_values.map_name); boolean success; do { try { Thread.sleep(10 + retry_counter * 1000); } catch (InterruptedException e1) {} retryDownload = false; success = download_osm_map(); } while ( !success && retryDownload && retry_counter < MAX_RETRIES && !stop_me); if (success) { toast(map_values.map_name + " " + Navit._("ready")); Log.d(TAG, "success"); } if (success || stop_me ) { NavitDialogs.sendDialogMessage( NavitDialogs.MSG_MAP_DOWNLOAD_FINISHED , map_filename_path + map_values.map_name + ".bin", null, -1, success ? 1 : 0 , map_id ); } } public void stop_thread() { stop_me = true; Log.d(TAG, "stop_me -> true"); } protected boolean checkFreeSpace(long needed_bytes) { long free_space = getFreeSpace(); if ( needed_bytes <= 0 ) needed_bytes = MAP_WRITE_FILE_BUFFER; if (free_space < needed_bytes ) { String msg; Log.e(TAG, "Not enough free space or media not available. Please free at least " + needed_bytes / 1024 /1024 + "Mb."); if(free_space<0) msg=Navit._("Media selected for map storage is not available"); else msg=Navit._("Not enough free space"); updateProgress(free_space, needed_bytes, Navit._("Error downloading map!") + "\n" + msg); return false; } return true; } protected boolean deleteMap() { File finalOutputFile = getMapFile(); if (finalOutputFile.exists()) { Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); Bundle b = new Bundle(); b.putString("title", finalOutputFile.getAbsolutePath()); msg.setData(b); msg.sendToTarget(); return true; } return false; } /** * @param map_values * @return */ protected boolean download_osm_map() { long already_read = 0; long real_size_bytes = 0; boolean resume = true; File outputFile = getDestinationFile(); long old_download_size = outputFile.length(); URL url = null; if (old_download_size > 0) { url = readFileInfo(); } if (url == null) { resume = false; url = getDownloadURL(); } // URL url = new URL("http://192.168.2.101:8080/zweibruecken.bin"); URLConnection c = initConnection(url); if (c != null) { if (resume) { c.setRequestProperty("Range", "bytes=" + old_download_size + "-"); already_read = old_download_size; } try { real_size_bytes=Long.parseLong(c.getHeaderField("Content-Length")) + already_read; } catch(Exception e) { real_size_bytes=-1; } long fileTime = c.getLastModified(); if (!resume) { outputFile.delete(); writeFileInfo(c, real_size_bytes); } if (real_size_bytes <= 0) real_size_bytes = map_values.est_size_bytes; Log.d(TAG, "size: " + real_size_bytes + ", read: " + already_read + ", timestamp: " + fileTime + ", Connection ref: " + c.getURL()); if (checkFreeSpace(real_size_bytes - already_read) && downloadData(c, already_read, real_size_bytes, resume, outputFile)) { File finalOutputFile = getMapFile(); // delete an already existing file first finalOutputFile.delete(); // rename file to its final name outputFile.renameTo(finalOutputFile); return true; } } return false; } protected File getDestinationFile() { File outputFile = new File(map_filename_path, map_values.map_name + ".tmp"); outputFile.getParentFile().mkdir(); return outputFile; } protected boolean downloadData(URLConnection c, long already_read, long real_size_bytes , boolean resume,File outputFile) { boolean success = false; BufferedOutputStream buf = getOutputStream(outputFile, resume); BufferedInputStream bif = getInputStream(c); if (buf != null && bif != null) { success = readData(buf, bif, already_read, real_size_bytes); // always cleanup, as we might get errors when trying to resume try { buf.flush(); buf.close(); bif.close(); } catch (IOException e) { } } return success; } protected URL getDownloadURL() { URL url = null; try { url = new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + "," + map_values.lat1 + "," + map_values.lon2 + "," + map_values.lat2); } catch (MalformedURLException e) { Log.e(TAG, "We failed to create a URL to " + map_values.map_name); e.printStackTrace(); return null; } Log.v(TAG, "connect to " + url.toString()); return url; } protected long getFreeSpace() { try { StatFs fsInfo = new StatFs(map_filename_path); return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); } catch(Exception e) { return -1; } } protected BufferedInputStream getInputStream(URLConnection c) { BufferedInputStream bif = null; try { bif = new BufferedInputStream(c.getInputStream(), MAP_READ_FILE_BUFFER); } catch (FileNotFoundException e) { Log.e(TAG, "File not found on server: " + e); if (retry_counter > 0) { getMapInfoFile().delete(); } enableRetry(); bif = null; } catch (IOException e) { Log.e(TAG, "Error reading from server: " + e); enableRetry(); bif = null; } return bif; } protected File getMapFile() { return new File(map_filename_path, map_values.map_name + ".bin"); } protected File getMapInfoFile() { return new File(map_filename_path, map_values.map_name + ".tmp.info"); } protected BufferedOutputStream getOutputStream(File outputFile, boolean resume) { BufferedOutputStream buf = null; try { buf = new BufferedOutputStream(new FileOutputStream(outputFile, resume), MAP_WRITE_FILE_BUFFER); } catch (FileNotFoundException e) { Log.e(TAG, "Could not open output file for writing: " + e); buf = null; } return buf; } protected URLConnection initConnection(URL url) { HttpURLConnection c = null; try { c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); } catch (Exception e) { Log.e(TAG, "Failed connecting server: " + e); enableRetry(); return null; } c.setReadTimeout(SOCKET_READ_TIMEOUT); c.setConnectTimeout(SOCKET_CONNECT_TIMEOUT); return c; } protected boolean readData(OutputStream buf, InputStream bif, long already_read, long real_size_bytes) { long start_timestamp = System.nanoTime(); byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER]; int len1 = 0; long mapFileSize = real_size_bytes; long startOffset = already_read; boolean success = false; try { while (!stop_me && (len1 = bif.read(buffer)) != -1) { already_read += len1; updateProgress(start_timestamp, startOffset, already_read, mapFileSize); try { buf.write(buffer, 0, len1); } catch (IOException e) { Log.d(TAG, "Error: " + e); if ( !checkFreeSpace(real_size_bytes - already_read + MAP_WRITE_FILE_BUFFER)) { if (deleteMap()) { enableRetry(); } else { updateProgress(already_read, real_size_bytes, Navit._("Error downloading map!") + "\n" + Navit._("Not enough free space")); } } else { updateProgress(already_read, real_size_bytes, Navit._("Error writing map!")); } return false; } } if (stop_me) { toast(Navit._("Map download aborted!")); } else if ( already_read < real_size_bytes ) { Log.d(TAG, "Server send only " + already_read + " bytes of " + real_size_bytes); enableRetry(); } else { success = true; } } catch (IOException e) { Log.d(TAG, "Error: " + e); enableRetry(); updateProgress(already_read, real_size_bytes, Navit._("Error downloading map!")); } return success; } protected URL readFileInfo() { URL url = null; try { ObjectInputStream infoStream = new ObjectInputStream(new FileInputStream(getMapInfoFile())); String resume_proto = infoStream.readUTF(); infoStream.readUTF(); // read the host name (unused for now) String resume_file = infoStream.readUTF(); infoStream.close(); // looks like the same file, try to resume Log.v(TAG, "Try to resume download"); url = new URL(resume_proto + "://" + "maps.navit-project.org" + resume_file); } catch (Exception e) { getMapInfoFile().delete(); } return url; } protected void toast(String message) { NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST, null, message, -1, 0, 0); } protected void updateProgress(long startTime, long offsetBytes, long readBytes, long maxBytes) { long currentTime = System.nanoTime(); if ((currentTime > uiLastUpdated + UPDATE_PROGRESS_TIME_NS) && startTime!=currentTime) { float per_second_overall = (readBytes - offsetBytes) / ((currentTime - startTime) / 1000000000f); long bytes_remaining = maxBytes - readBytes; int eta_seconds = (int) (bytes_remaining / per_second_overall); String eta_string; if (eta_seconds > 60) { eta_string = (int) (eta_seconds / 60f) + " m"; } else { eta_string = eta_seconds + " s"; } String info = String.format("%s: %s\n %dMb / %dMb\n %.1f kb/s %s: %s", Navit._("downloading") , map_values.map_name, readBytes / 1024 / 1024, maxBytes / 1024 / 1024, per_second_overall / 1024f, Navit._("ETA"), eta_string); if (retry_counter > 0) { info += "\n Retry " + retry_counter + "/" + MAX_RETRIES; } Log.e(TAG, "info: " + info); updateProgress(readBytes, maxBytes, info); uiLastUpdated = currentTime; } } protected void updateProgress(long positionBytes, long maximumBytes, String infoText) { NavitDialogs.sendDialogMessage(NavitDialogs.MSG_PROGRESS_BAR, Navit._("Map download"), infoText , NavitDialogs.DIALOG_MAPDOWNLOAD, (int) (maximumBytes / 1024), (int) (positionBytes / 1024)); } protected void writeFileInfo(URLConnection c, long sizeInBytes) { ObjectOutputStream infoStream; try { infoStream = new ObjectOutputStream(new FileOutputStream(getMapInfoFile())); infoStream.writeUTF(c.getURL().getProtocol()); infoStream.writeUTF(c.getURL().getHost()); infoStream.writeUTF(c.getURL().getFile()); infoStream.writeLong(sizeInBytes); infoStream.close(); } catch (Exception e) { Log.e(TAG, "Could not write info file for map download. Resuming will not be possible. (" + e.getMessage() + ")"); } } void enableRetry() { retryDownload = true; retry_counter++; } // dialog send helper methods } navit-0.5.0+dfsg.1/navit/announcement.c000066400000000000000000000034321264204753600177050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "item.h" #include "announcement.h" struct announcement { struct attr **attrs; }; struct announcement * announcement_new(struct attr *parent, struct attr **attrs) { struct announcement *this_; struct attr *type_attr; if (! (type_attr=attr_search(attrs, NULL, attr_name))) { return NULL; } this_=g_new0(struct announcement, 1); this_->attrs=attr_list_dup(attrs); return this_; } int announcement_get_attr(struct announcement *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int announcement_set_attr(struct announcement *this_, struct attr *attr) { this_->attrs=attr_generic_set_attr(this_->attrs, attr); return 1; } int announcement_add_attr(struct announcement *this_, struct attr *attr) { this_->attrs=attr_generic_add_attr(this_->attrs, attr); return 1; } int announcement_remove_attr(struct announcement *this_, struct attr *attr) { this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; } navit-0.5.0+dfsg.1/navit/announcement.h000066400000000000000000000022241264204753600177100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ struct announcement * announcement_new(struct attr *parent, struct attr **attrs); int announcement_get_attr(struct announcement *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int announcement_set_attr(struct announcement *this_, struct attr *attr); int announcement_add_attr(struct announcement *this_, struct attr *attr); int announcement_remove_attr(struct announcement *this_, struct attr *attr); navit-0.5.0+dfsg.1/navit/atom.c000066400000000000000000000006751264204753600161610ustar00rootroot00000000000000#include #include "atom.h" static GHashTable *atom_hash; char * atom_lookup(char *name) { if (!atom_hash) return NULL; return g_hash_table_lookup(atom_hash,name); } char * atom(char *name) { char *id=atom_lookup(name); if (id) return id; if (!atom_hash) return NULL; id=g_strdup(name); g_hash_table_insert(atom_hash, id, id); return id; } void atom_init(void) { atom_hash=g_hash_table_new(g_str_hash, g_str_equal); } navit-0.5.0+dfsg.1/navit/atom.h000066400000000000000000000002221264204753600161520ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif char * atom_lookup(char *name); char * atom(char *name); void atom_init(void); #ifdef __cplusplus } #endif navit-0.5.0+dfsg.1/navit/attr.c000066400000000000000000000734241264204753600161750ustar00rootroot00000000000000/* * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file attr.c * @brief Attribute handling code * * Structures and functions for working with attributes. * * @author Navit Team * @date 2005-2014 */ #include #include #include #include #include "debug.h" #include "item.h" #include "coord.h" #include "transform.h" #include "color.h" #include "navigation.h" #include "attr.h" #include "map.h" #include "config.h" #include "endianess.h" #include "util.h" #include "types.h" #include "xmlconfig.h" struct attr_name { enum attr_type attr; char *name; }; /** List of attr_types with their names as strings. */ static struct attr_name attr_names[]={ #define ATTR2(x,y) ATTR(y) #define ATTR(x) { attr_##x, #x }, #define ATTR_UNUSED /* Unused attr_types not needed here.*/ #include "attr_def.h" #undef ATTR_UNUSED #undef ATTR2 #undef ATTR }; static GHashTable *attr_hash; void attr_create_hash(void) { int i; attr_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { g_hash_table_insert(attr_hash, attr_names[i].name, GINT_TO_POINTER(attr_names[i].attr)); } } void attr_destroy_hash(void) { g_hash_table_destroy(attr_hash); attr_hash=NULL; } /** * @brief Converts a string to an attr_type * * This function reads a string and returns the corresponding attr_type. * * @param name The attribute name * @return The corresponding {@code attr_type}, or {@code attr_none} if the string specifies a nonexistent or invalid attribute type. */ enum attr_type attr_from_name(const char *name) { int i; if (attr_hash) return GPOINTER_TO_INT(g_hash_table_lookup(attr_hash, name)); for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { if (! strcmp(attr_names[i].name, name)) return attr_names[i].attr; } return attr_none; } static int attr_match(enum attr_type search, enum attr_type found); /** * @brief Converts an attr_type to a string * * @param attr The attribute type to be converted. * @return The attribute name, or NULL if an invalid value was passed as {@code attr}. * The calling function should create a copy of the string if it needs to alter it or relies on the * string being available permanently. */ char * attr_to_name(enum attr_type attr) { int i; for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { if (attr_names[i].attr == attr) return attr_names[i].name; } return NULL; } /** * @brief Creates an attribute from text information * * This function creates an attribute from two strings specifying the name and * the value. * * @param name The name of the new attribute * @param value The value of the new attribute * @return The new attribute */ struct attr * attr_new_from_text(const char *name, const char *value) { enum attr_type attr; struct attr *ret; struct coord_geo *g; struct coord c; enum item_type item_type; char *pos,*type_str,*str,*tok; int min,max,count; ret=g_new0(struct attr, 1); dbg(lvl_debug,"enter name='%s' value='%s'\n", name, value); attr=attr_from_name(name); ret->type=attr; switch (attr) { case attr_item_type: ret->u.item_type=item_from_name(value); break; case attr_item_types: count=0; type_str=g_strdup(value); str=type_str; while ((tok=strtok(str, ","))) { ret->u.item_types=g_realloc(ret->u.item_types, (count+2)*sizeof(enum item_type)); item_type=item_from_name(tok); if (item_type!=type_none) { ret->u.item_types[count++]=item_type; ret->u.item_types[count]=type_none; } else { dbg(lvl_error,"Unknown item type '%s' ignored.\n",tok); } str=NULL; } g_free(type_str); break; case attr_attr_types: count=0; type_str=g_strdup(value); str=type_str; while ((tok=strtok(str, ","))) { ret->u.attr_types=g_realloc(ret->u.attr_types, (count+2)*sizeof(enum attr_type)); ret->u.attr_types[count++]=attr_from_name(tok); ret->u.attr_types[count]=attr_none; str=NULL; } g_free(type_str); break; case attr_dash: count=0; type_str=g_strdup(value); str=type_str; while ((tok=strtok(str, ","))) { ret->u.dash=g_realloc(ret->u.dash, (count+2)*sizeof(int)); ret->u.dash[count++]=g_ascii_strtoull(tok,NULL,0); ret->u.dash[count]=0; str=NULL; } g_free(type_str); break; case attr_order: case attr_sequence_range: case attr_angle_range: case attr_speed_range: pos=strchr(value, '-'); min=0; max=32767; if (! pos) { sscanf(value,"%d",&min); max=min; } else if (pos == value) sscanf(value,"-%d",&max); else sscanf(value,"%d-%d",&min, &max); ret->u.range.min=min; ret->u.range.max=max; break; default: if (attr >= attr_type_string_begin && attr <= attr_type_string_end) { ret->u.str=g_strdup(value); break; } if (attr >= attr_type_int_begin && attr < attr_type_rel_abs_begin) { char *tail; if (value[0] == '0' && value[1] == 'x') ret->u.num=strtoul(value, &tail, 0); else ret->u.num=strtol(value, &tail, 0); if (*tail) { dbg(lvl_error, "Incorrect value '%s' for attribute '%s'; expected a number. " "Defaulting to 0.\n", value, name); ret->u.num=0; } break; } if (attr >= attr_type_rel_abs_begin && attr < attr_type_boolean_begin) { char *tail; int value_is_relative=0; ret->u.num=strtol(value, &tail, 0); if (*tail) { if (!strcmp(tail, "%")) { value_is_relative=1; } else { dbg(lvl_error, "Incorrect value '%s' for attribute '%s'; expected a number or a relative value in percent. " "Defaulting to 0.\n", value, name); ret->u.num=0; } } if (value_is_relative) { if ((ret->u.num > ATTR_REL_MAXREL) || (ret->u.num < ATTR_REL_MINREL)) { dbg(lvl_error, "Relative possibly-relative attribute with value out of range: %li\n", ret->u.num); } ret->u.num += ATTR_REL_RELSHIFT; } else { if ((ret->u.num > ATTR_REL_MAXABS) || (ret->u.num < ATTR_REL_MINABS)) { dbg(lvl_error, "Non-relative possibly-relative attribute with value out of range: %li\n", ret->u.num); } } break; } if (attr >= attr_type_boolean_begin && attr <= attr_type_int_end) { if (!(g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false"))) ret->u.num=0; else if (!(g_ascii_strcasecmp(value,"yes") && g_ascii_strcasecmp(value,"1") && g_ascii_strcasecmp(value,"true"))) ret->u.num=1; else { dbg(lvl_error, "Incorrect value '%s' for attribute '%s'; expected a boolean (no/0/false or yes/1/true). " "Defaulting to 'true'.\n", value, name); ret->u.num=1; } break; } if (attr >= attr_type_color_begin && attr <= attr_type_color_end) { struct color *color=g_new0(struct color, 1); int r,g,b,a; ret->u.color=color; if(strlen(value)==7){ sscanf(value,"#%02x%02x%02x", &r, &g, &b); color->r = (r << 8) | r; color->g = (g << 8) | g; color->b = (b << 8) | b; color->a = (65535); } else if(strlen(value)==9){ sscanf(value,"#%02x%02x%02x%02x", &r, &g, &b, &a); color->r = (r << 8) | r; color->g = (g << 8) | g; color->b = (b << 8) | b; color->a = (a << 8) | a; } else { dbg(lvl_error,"color %s has unknown format\n",value); } break; } if (attr >= attr_type_coord_geo_begin && attr <= attr_type_coord_geo_end) { g=g_new(struct coord_geo, 1); ret->u.coord_geo=g; coord_parse(value, projection_mg, &c); transform_to_geo(projection_mg, &c, g); break; } dbg(lvl_debug,"unknown attribute\n"); g_free(ret); ret=NULL; } return ret; } /** * @brief Converts access flags to a human-readable string. * * @param flags The flags as a number * @return The flags in human-readable form */ static char * flags_to_text(int flags) { char *ret=g_strdup_printf("0x%x:",flags); if (flags & AF_ONEWAY) ret=g_strconcat_printf(ret,"%sAF_ONEWAY",ret?"|":""); if (flags & AF_ONEWAYREV) ret=g_strconcat_printf(ret,"%sAF_ONEWAYREV",ret?"|":""); if (flags & AF_SEGMENTED) ret=g_strconcat_printf(ret,"%sAF_SEGMENTED",ret?"|":""); if (flags & AF_ROUNDABOUT) ret=g_strconcat_printf(ret,"%sAF_ROUNDABOUT",ret?"|":""); if (flags & AF_ROUNDABOUT_VALID) ret=g_strconcat_printf(ret,"%sAF_ROUNDABOUT_VALID",ret?"|":""); if (flags & AF_ONEWAY_EXCEPTION) ret=g_strconcat_printf(ret,"%sAF_ONEWAY_EXCEPTION",ret?"|":""); if (flags & AF_SPEED_LIMIT) ret=g_strconcat_printf(ret,"%sAF_SPEED_LIMIT",ret?"|":""); if (flags & AF_RESERVED1) ret=g_strconcat_printf(ret,"%sAF_RESERVED1",ret?"|":""); if (flags & AF_SIZE_OR_WEIGHT_LIMIT) ret=g_strconcat_printf(ret,"%sAF_SIZE_OR_WEIGHT_LIMIT",ret?"|":""); if (flags & AF_THROUGH_TRAFFIC_LIMIT) ret=g_strconcat_printf(ret,"%sAF_THROUGH_TRAFFIC_LIMIT",ret?"|":""); if (flags & AF_TOLL) ret=g_strconcat_printf(ret,"%sAF_TOLL",ret?"|":""); if (flags & AF_SEASONAL) ret=g_strconcat_printf(ret,"%sAF_SEASONAL",ret?"|":""); if (flags & AF_UNPAVED) ret=g_strconcat_printf(ret,"%sAF_UNPAVED",ret?"|":""); if (flags & AF_FORD) ret=g_strconcat_printf(ret,"%sAF_FORD",ret?"|":""); if (flags & AF_UNDERGROUND) ret=g_strconcat_printf(ret,"%sAF_UNDERGROUND",ret?"|":""); if (flags & AF_DANGEROUS_GOODS) ret=g_strconcat_printf(ret,"%sAF_DANGEROUS_GOODS",ret?"|":""); if ((flags & AF_ALL) == AF_ALL) return g_strconcat_printf(ret,"%sAF_ALL",ret?"|":""); if ((flags & AF_ALL) == AF_MOTORIZED_FAST) return g_strconcat_printf(ret,"%sAF_MOTORIZED_FAST",ret?"|":""); if (flags & AF_EMERGENCY_VEHICLES) ret=g_strconcat_printf(ret,"%sAF_EMERGENCY_VEHICLES",ret?"|":""); if (flags & AF_TRANSPORT_TRUCK) ret=g_strconcat_printf(ret,"%sAF_TRANSPORT_TRUCK",ret?"|":""); if (flags & AF_DELIVERY_TRUCK) ret=g_strconcat_printf(ret,"%sAF_DELIVERY_TRUCK",ret?"|":""); if (flags & AF_PUBLIC_BUS) ret=g_strconcat_printf(ret,"%sAF_PUBLIC_BUS",ret?"|":""); if (flags & AF_TAXI) ret=g_strconcat_printf(ret,"%sAF_TAXI",ret?"|":""); if (flags & AF_HIGH_OCCUPANCY_CAR) ret=g_strconcat_printf(ret,"%sAF_HIGH_OCCUPANCY_CAR",ret?"|":""); if (flags & AF_CAR) ret=g_strconcat_printf(ret,"%sAF_CAR",ret?"|":""); if (flags & AF_MOTORCYCLE) ret=g_strconcat_printf(ret,"%sAF_MOTORCYCLE",ret?"|":""); if (flags & AF_MOPED) ret=g_strconcat_printf(ret,"%sAF_MOPED",ret?"|":""); if (flags & AF_HORSE) ret=g_strconcat_printf(ret,"%sAF_HORSE",ret?"|":""); if (flags & AF_BIKE) ret=g_strconcat_printf(ret,"%sAF_BIKE",ret?"|":""); if (flags & AF_PEDESTRIAN) ret=g_strconcat_printf(ret,"%sAF_PEDESTRIAN",ret?"|":""); return ret; } /** * @brief Converts attribute data to human-readable text * * @param attr The attribute to be formatted * @param sep The separator to insert between a numeric value and its unit. If NULL, nothing will be inserted. * @param fmt Set to {@code attr_format_with_units} if {@code attr} is of type {@code attr_destination_length} * or {@code attr_destination_time} or a group type which might contain attributes of those types. Ignored for * all other attribute types. * @param def_fmt Not used * @param map The translation map. This is only needed for string type attributes or group type * attributes which might contain strings. It can be NULL for other attribute types. If a string * type attribute is encountered and {@code map} is NULL, the string will be returned unchanged. * * @return The attribute data in human-readable form. The caller is responsible for calling {@code g_free()} on * the result when it is no longer needed. */ char * attr_to_text_ext(struct attr *attr, char *sep, enum attr_format fmt, enum attr_format def_fmt, struct map *map) { char *ret; enum attr_type type=attr->type; if (!sep) sep=""; if (type >= attr_type_item_begin && type <= attr_type_item_end) { struct item *item=attr->u.item; struct attr type, data; if (! item) return g_strdup("(nil)"); if (! item->map || !map_get_attr(item->map, attr_type, &type, NULL)) type.u.str=""; if (! item->map || !map_get_attr(item->map, attr_data, &data, NULL)) data.u.str=""; return g_strdup_printf("type=0x%x id=0x%x,0x%x map=%p (%s:%s)", item->type, item->id_hi, item->id_lo, item->map, type.u.str, data.u.str); } if (type >= attr_type_string_begin && type <= attr_type_string_end) { if (map) { char *mstr; if (attr->u.str) { mstr=map_convert_string(map, attr->u.str); ret=g_strdup(mstr); map_convert_free(mstr); } else ret=g_strdup("(null)"); } else ret=g_strdup(attr->u.str); return ret; } if (type == attr_flags || type == attr_through_traffic_flags) return flags_to_text(attr->u.num); if (type == attr_destination_length) { if (fmt == attr_format_with_units) { double distance=attr->u.num; if (distance > 10000) return g_strdup_printf("%.0f%skm",distance/1000,sep); return g_strdup_printf("%.1f%skm",distance/1000,sep); } } if (type == attr_destination_time) { if (fmt == attr_format_with_units) { int seconds=(attr->u.num+5)/10; int minutes=seconds/60; int hours=minutes/60; int days=hours/24; hours%=24; minutes%=60; seconds%=60; if (days) return g_strdup_printf("%d:%02d:%02d:%02d",days,hours,minutes,seconds); if (hours) return g_strdup_printf("%02d:%02d:%02d",hours,minutes,seconds); return g_strdup_printf("%02d:%02d",minutes,seconds); } } if (type >= attr_type_int_begin && type <= attr_type_int_end) return g_strdup_printf("%ld", attr->u.num); if (type >= attr_type_int64_begin && type <= attr_type_int64_end) return g_strdup_printf(LONGLONG_FMT, *attr->u.num64); if (type >= attr_type_double_begin && type <= attr_type_double_end) return g_strdup_printf("%f", *attr->u.numd); if (type >= attr_type_object_begin && type <= attr_type_object_end) return g_strdup_printf("(object[%s])", attr_to_name(type)); if (type >= attr_type_color_begin && type <= attr_type_color_end) { if (attr->u.color->a != 65535) return g_strdup_printf("#%02x%02x%02x%02x", attr->u.color->r>>8,attr->u.color->g>>8,attr->u.color->b>>8, attr->u.color->a>>8); else return g_strdup_printf("#%02x%02x%02x", attr->u.color->r>>8,attr->u.color->g>>8,attr->u.color->b>>8); } if (type >= attr_type_coord_geo_begin && type <= attr_type_coord_geo_end) return g_strdup_printf("%f %f",attr->u.coord_geo->lng,attr->u.coord_geo->lat); if (type == attr_zipfile_ref_block) { int *data=attr->u.data; return g_strdup_printf("0x%x,0x%x,0x%x",data[0],data[1],data[2]); } if (type == attr_item_id) { int *data=attr->u.data; return g_strdup_printf("0x%x,0x%x",data[0],data[1]); } if (type == attr_item_types) { enum item_type *item_types=attr->u.item_types; char *sep="",*ret=NULL; while (item_types && *item_types) { ret=g_strconcat_printf(ret,"%s%s",sep,item_to_name(*item_types++)); sep=","; } return ret; } if (type >= attr_type_group_begin && type <= attr_type_group_end) { int i=0; char *ret=g_strdup(""); char *sep=""; while (attr->u.attrs[i].type) { char *val=attr_to_text_ext(&attr->u.attrs[i], sep, fmt, def_fmt, map); ret=g_strconcat_printf(ret,"%s%s=%s",sep,attr_to_name(attr->u.attrs[i].type),val); g_free(val); sep=" "; i++; } return ret; } if (type >= attr_type_item_type_begin && type <= attr_type_item_type_end) { return g_strdup_printf("0x%ld[%s]",attr->u.num,item_to_name(attr->u.num)); } if (type == attr_nav_status) { return nav_status_to_text(attr->u.num); } return g_strdup_printf("(no text[%s])", attr_to_name(type)); } /** * @brief Converts an attribute to a string that can be displayed * * This function is just a wrapper around {@code attr_to_text_ext()}. * * @param attr The attribute to convert * @param map The translation map, see {@code attr_to_text_ext()} * @param pretty Not used */ char * attr_to_text(struct attr *attr, struct map *map, int pretty) { return attr_to_text_ext(attr, NULL, attr_format_default, attr_format_default, map); } /** * @brief Searches for an attribute of a given type * * This function searches an array of pointers to attributes for a given * attribute type and returns the first match. * * @param attrs Points to the array of attribute pointers to be searched * @param last Not used * @param attr_type The attribute type to search for. Generic types (such as * attr_any or attr_any_xml) are NOT supported. * @return Pointer to the first matching attribute, or NULL if no match was found. */ struct attr * attr_search(struct attr **attrs, struct attr *last, enum attr_type attr) { dbg(lvl_info, "enter attrs=%p\n", attrs); while (*attrs) { dbg(lvl_debug,"*attrs=%p\n", *attrs); if ((*attrs)->type == attr) { return *attrs; } attrs++; } return NULL; } static int attr_match(enum attr_type search, enum attr_type found) { switch (search) { case attr_any: return 1; case attr_any_xml: switch (found) { case attr_callback: return 0; default: return 1; } default: return search == found; } } /** * @brief Generic get function * * This function searches an attribute list for an attribute of a given type and * stores it in the attr parameter. If no match is found in attrs and the * def_attrs argument is supplied, def_attrs is searched for the attribute type * and the first match (if any) is returned. *

* Searching for attr_any or attr_any_xml is supported, but def_attrs will not * be searched in that case. *

* An iterator can be specified to get multiple attributes of the same type: * The first call will return the first match from attr; each subsequent call * with the same iterator will return the next match. After obtaining the last * match from attr, def_attrs is searched in the same manner. If no more matching * attributes are found in either of them, false is returned. * * @param attrs Points to the array of attribute pointers to be searched * @param def_attrs Points to a list of pointers to default attributes. * If an attribute is not found in attrs, the function will return the first * match from def_attrs. This parameter may be NULL. * @param type The attribute type to search for * @param attr Points to a {@code struct attr} which will receive the attribute * @param iter An iterator. This parameter may be NULL. * @return True if a matching attribute was found, false if not. */ int attr_generic_get_attr(struct attr **attrs, struct attr **def_attrs, enum attr_type type, struct attr *attr, struct attr_iter *iter) { while (attrs && *attrs) { if (attr_match(type,(*attrs)->type)) { *attr=**attrs; if (!iter) return 1; if (*((void **)iter) < (void *)attrs) { *((void **)iter)=(void *)attrs; return 1; } } attrs++; } if (type == attr_any || type == attr_any_xml) return 0; while (def_attrs && *def_attrs) { if ((*def_attrs)->type == type) { *attr=**def_attrs; return 1; } def_attrs++; } return 0; } /** * @brief Generic set function * * This function will search the list for the first attribute of the same type * as the supplied new one and replace it with that. If the list does not * contain an attribute whose type matches that of the new one, the new * attribute is inserted into the list. * * @param attrs Points to the array of attribute pointers to be updated * @param attr The new attribute. * @return Pointer to the updated attribute list */ struct attr ** attr_generic_set_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,count=0; dbg(lvl_debug, "enter, attrs=%p, attr=%p (%s)\n", attrs, attr, attr_to_name(attr->type)); while (curr && *curr) { if ((*curr)->type == attr->type) { attr_free(*curr); *curr=attr_dup(attr); return attrs; } curr++; count++; } curr=g_new0(struct attr *, count+2); for (i = 0 ; i < count ; i++) curr[i]=attrs[i]; curr[count]=attr_dup(attr); curr[count+1]=NULL; g_free(attrs); return curr; } /** * @brief Generic add function * * This function will insert a new attribute into the list. * * @param attrs Points to the array of attribute pointers to be updated * @param attr The new attribute. * @return Pointer to the updated attribute list */ struct attr ** attr_generic_add_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,count=0; dbg(lvl_debug, "enter, attrs=%p, attr=%p (%s)\n", attrs, attr, attr_to_name(attr->type)); while (curr && *curr) { curr++; count++; } curr=g_new0(struct attr *, count+2); for (i = 0 ; i < count ; i++) curr[i]=attrs[i]; curr[count]=attr_dup(attr); curr[count+1]=NULL; g_free(attrs); return curr; } struct attr ** attr_generic_add_attr_list(struct attr **attrs, struct attr **add) { while (add && *add) { attrs=attr_generic_add_attr(attrs, *add); add++; } return attrs; } struct attr ** attr_generic_prepend_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,count=0; while (curr && *curr) { curr++; count++; } curr=g_new0(struct attr *, count+2); for (i = 0 ; i < count ; i++) curr[i+1]=attrs[i]; curr[0]=attr_dup(attr); curr[count+1]=NULL; g_free(attrs); return curr; } struct attr ** attr_generic_remove_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; int i,j,count=0,found=0; while (curr && *curr) { if ((*curr)->type == attr->type && (*curr)->u.data == attr->u.data) found=1; curr++; count++; } if (!found) return attrs; curr=g_new0(struct attr *, count); j=0; for (i = 0 ; i < count ; i++) { if (attrs[i]->type != attr->type || attrs[i]->u.data != attr->u.data) curr[j++]=attrs[i]; else attr_free(attrs[i]); } curr[j]=NULL; g_free(attrs); return curr; } enum attr_type attr_type_begin(enum attr_type type) { if (type < attr_type_item_begin) return attr_none; if (type < attr_type_int_begin) return attr_type_item_begin; if (type < attr_type_string_begin) return attr_type_int_begin; if (type < attr_type_special_begin) return attr_type_string_begin; if (type < attr_type_double_begin) return attr_type_special_begin; if (type < attr_type_coord_geo_begin) return attr_type_double_begin; if (type < attr_type_color_begin) return attr_type_coord_geo_begin; if (type < attr_type_object_begin) return attr_type_color_begin; if (type < attr_type_coord_begin) return attr_type_object_begin; if (type < attr_type_pcoord_begin) return attr_type_coord_begin; if (type < attr_type_callback_begin) return attr_type_pcoord_begin; if (type < attr_type_int64_begin) return attr_type_callback_begin; if (type <= attr_type_int64_end) return attr_type_int64_begin; return attr_none; } int attr_data_size(struct attr *attr) { if (attr->type == attr_none) return 0; if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) return attr->u.str?strlen(attr->u.str)+1:0; if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) return sizeof(attr->u.num); if (attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) return sizeof(*attr->u.coord_geo); if (attr->type >= attr_type_color_begin && attr->type <= attr_type_color_end) return sizeof(*attr->u.color); if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) return sizeof(void *); if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) return sizeof(struct item); if (attr->type >= attr_type_int64_begin && attr->type <= attr_type_int64_end) return sizeof(*attr->u.num64); if (attr->type == attr_order) return sizeof(attr->u.range); if (attr->type >= attr_type_double_begin && attr->type <= attr_type_double_end) return sizeof(*attr->u.numd); if (attr->type == attr_item_types) { int i=0; while (attr->u.item_types[i++] != type_none); return i*sizeof(enum item_type); } if (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) return sizeof(enum item_type); if (attr->type == attr_attr_types) { int i=0; while (attr->u.attr_types[i++] != attr_none); return i*sizeof(enum attr_type); } dbg(lvl_error,"size for %s unknown\n", attr_to_name(attr->type)); return 0; } void * attr_data_get(struct attr *attr) { if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) return &attr->u.num; if (attr->type == attr_order) return &attr->u.range; return attr->u.data; } void attr_data_set(struct attr *attr, void *data) { if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) attr->u.num=*((int *)data); else attr->u.data=data; } void attr_data_set_le(struct attr * attr, void * data) { if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) attr->u.num=le32_to_cpu(*((int *)data)); else if (attr->type == attr_order) { attr->u.num=le32_to_cpu(*((int *)data)); attr->u.range.min=le16_to_cpu(attr->u.range.min); attr->u.range.max=le16_to_cpu(attr->u.range.max); } else /* Fixme: Handle long long */ attr->u.data=data; } static void attr_free_content_do(struct attr *attr) { if (!attr) return; if (HAS_OBJECT_FUNC(attr->type)) { struct navit_object *obj=attr->u.data; if (obj && obj->func && obj->func->unref) obj->func->unref(obj); } if (!(attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) && !(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end)) g_free(attr->u.data); } void attr_free_content(struct attr *attr) { attr_free_content_do(attr); memset(attr,0,sizeof(*attr)); } void attr_free(struct attr *attr) { attr_free_content_do(attr); g_free(attr); } void attr_dup_content(struct attr *src, struct attr *dst) { int size; dst->type=src->type; if (src->type >= attr_type_int_begin && src->type <= attr_type_int_end) dst->u.num=src->u.num; else if (src->type >= attr_type_object_begin && src->type <= attr_type_object_end) { if (HAS_OBJECT_FUNC(src->type)) { struct navit_object *obj=src->u.data; if (obj && obj->func && obj->func->ref) { dst->u.data=obj->func->ref(obj); } else dst->u.data=obj; } else dst->u.data=src->u.data; } else { size=attr_data_size(src); if (size) { dst->u.data=g_malloc(size); memcpy(dst->u.data, src->u.data, size); } } } struct attr * attr_dup(struct attr *attr) { struct attr *ret=g_new0(struct attr, 1); attr_dup_content(attr, ret); return ret; } void attr_list_free(struct attr **attrs) { int count=0; while (attrs && attrs[count]) { attr_free(attrs[count++]); } g_free(attrs); } struct attr ** attr_list_dup(struct attr **attrs) { struct attr **ret; int i,count=0; if (!attrs) return NULL; while (attrs[count]) count++; ret=g_new0(struct attr *, count+1); for (i = 0 ; i < count ; i++) ret[i]=attr_dup(attrs[i]); return ret; } int attr_from_line(char *line, char *name, int *pos, char *val_ret, char *name_ret) { int len=0,quoted; char *p,*e,*n; dbg(lvl_debug,"get_tag %s from %s\n", name, line); if (name) len=strlen(name); if (pos) p=line+*pos; else p=line; for(;;) { while (*p == ' ') { p++; } if (! *p) return 0; n=p; e=strchr(p,'='); if (! e) return 0; p=e+1; quoted=0; while (*p) { if (*p == ' ' && !quoted) break; if (*p == '"') quoted=1-quoted; p++; } if (name == NULL || (e-n == len && !strncmp(n, name, len))) { if (name_ret) { len=e-n; strncpy(name_ret, n, len); name_ret[len]='\0'; } e++; len=p-e; if (e[0] == '"') { e++; len-=2; } strncpy(val_ret, e, len); val_ret[len]='\0'; if (pos) *pos=p-line; return 1; } } return 0; } /** * @brief Checks if an enumeration of attribute types contains a specific attribute. * * @param types Points to a NULL-terminated array of pointers to {@code enum attr_type}, which will be searched * @param type The attr_type to be searched for * * @return True if the attribute type was found, false if it was not found or if {@code types} is empty */ int attr_types_contains(enum attr_type *types, enum attr_type type) { while (types && *types != attr_none) { if (*types == type) return 1; types++; } return 0; } /** * @brief Check if an enumeration of attribute types contains a specific attribute. * * This function is mostly identical to {@code attr_types_contains()} but returns the supplied default * value if {@code types} is empty. * * @param types Points to a NULL-terminated array of pointers to {@code enum attr_type}, which will be searched * @param type The attr_type to be searched for * @param deflt The default value to return if {@code types} is empty. * * @return True if the attribute type was found, false if it was not found, {@code deflt} if types is empty. */ int attr_types_contains_default(enum attr_type *types, enum attr_type type, int deflt) { if (!types) { return deflt; } return attr_types_contains(types, type); } /** * @brief Derive absolute value from relative attribute, given value of the whole range. * * @param attrval Value of u.num member of attribute capable of holding relative values. * @param whole Range counted as 100%. * @param treat_neg_as_rel Replace negative absolute values with whole+attr.u.num. * * @return Absolute value corresponding to given relative value. */ int attr_rel2real(int attrval, int whole, int treat_neg_as_rel) { if (attrval > ATTR_REL_MAXABS) return whole * (attrval - ATTR_REL_RELSHIFT)/100; if(treat_neg_as_rel && attrval<0 ) return whole+attrval; return attrval; } navit-0.5.0+dfsg.1/navit/attr.h000066400000000000000000000231111264204753600161660ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_ATTR_H #define NAVIT_ATTR_H #ifdef __cplusplus extern "C" { #endif #include "projection.h" enum item_type; /** * Attribute type values, created using macro magic. */ enum attr_type { #define ATTR2(x,y) attr_##y=x, #define ATTR(x) attr_##x, /* Special macro for unused attribute types. Creates a placeholder entry * in the enum so the following values do not change. */ #define ATTR_UNUSED ATTR_UNUSED_L(__LINE__) #define ATTR_UNUSED_L(x) ATTR_UNUSED_WITH_LINE_NUMBER(x) #define ATTR_UNUSED_WITH_LINE_NUMBER(x) ATTR_UNUSED_##x, #include "attr_def.h" #undef ATTR_UNUSED_WITH_LINE_NUMBER #undef ATTR_UNUSED_L #undef ATTR_UNUSED #undef ATTR2 #undef ATTR }; enum attr_format { attr_format_default=0, attr_format_with_units=1, }; #define AF_ONEWAY (1<<0) #define AF_ONEWAYREV (1<<1) #define AF_NOPASS (AF_ONEWAY|AF_ONEWAYREV) #define AF_ONEWAYMASK (AF_ONEWAY|AF_ONEWAYREV) #define AF_SEGMENTED (1<<2) #define AF_ROUNDABOUT (1<<3) #define AF_ROUNDABOUT_VALID (1<<4) #define AF_ONEWAY_EXCEPTION (1<<5) #define AF_SPEED_LIMIT (1<<6) #define AF_RESERVED1 (1<<7) #define AF_SIZE_OR_WEIGHT_LIMIT (1<<8) #define AF_THROUGH_TRAFFIC_LIMIT (1<<9) #define AF_TOLL (1<<10) #define AF_SEASONAL (1<<11) #define AF_UNPAVED (1<<12) #define AF_FORD (1<<13) #define AF_UNDERGROUND (1<<14) #define AF_DANGEROUS_GOODS (1<<19) #define AF_EMERGENCY_VEHICLES (1<<20) #define AF_TRANSPORT_TRUCK (1<<21) #define AF_DELIVERY_TRUCK (1<<22) #define AF_PUBLIC_BUS (1<<23) #define AF_TAXI (1<<24) #define AF_HIGH_OCCUPANCY_CAR (1<<25) #define AF_CAR (1<<26) #define AF_MOTORCYCLE (1<<27) #define AF_MOPED (1<<28) #define AF_HORSE (1<<29) #define AF_BIKE (1<<30) #define AF_PEDESTRIAN (1<<31) #define AF_PBH (AF_PEDESTRIAN|AF_BIKE|AF_HORSE) #define AF_MOTORIZED_FAST (AF_MOTORCYCLE|AF_CAR|AF_HIGH_OCCUPANCY_CAR|AF_TAXI|AF_PUBLIC_BUS|AF_DELIVERY_TRUCK|AF_TRANSPORT_TRUCK|AF_EMERGENCY_VEHICLES) #define AF_ALL (AF_PBH|AF_MOPED|AF_MOTORIZED_FAST) #define AF_DG_ANY (1<<0) #define AF_DG_WATER_HARMFUL (1<<1) #define AF_DG_EXPLOSIVE (1<<2) #define AF_DG_FLAMMABLE (1<<3) /* * Values for attributes that could carry relative values. * Some attributes allow both absolute and relative values. The value for these * attributes is stored as an int. Absolute values are stored as-is, relative * values are stored shifted by adding ATTR_REL_RELSHIFT. */ /** Minimum value for an absolute attribute value. */ #define ATTR_REL_MINABS -0x40000000 /** Maximum value for an absolute attribute value. */ #define ATTR_REL_MAXABS 0x40000000 /** Minimum value for an relative attribute value (without value shift). */ #define ATTR_REL_MINREL -0x1FFFFFFF /** Maximum value for an relative attribute value (without value shift). */ #define ATTR_REL_MAXREL 0x20000000 /** * Value shift for relative values. This value is added to an attribute values to indicate * a relative value. */ #define ATTR_REL_RELSHIFT 0x60000000 /** Indicates whether a position is valid **/ enum attr_position_valid { attr_position_valid_invalid, /**< The position is invalid and should be discarded. **/ attr_position_valid_static, /**< The position is valid but the vehicle is not moving, or moving very slowly. Calculations that involve the difference between two consecutive positions, such as bearing, may therefore be inaccurate. **/ attr_position_valid_extrapolated_time, /**< FIXME: this description is just my (mvglasow) guess; this value is not used anywhere as of r5957. The position is the vehicle's last known position, and the consumer of the information should be aware that the vehicle may have moved since. **/ attr_position_valid_extrapolated_spatial, /**< FIXME: this description is just my (mvglasow) guess; this value is not used anywhere as of r5957. The position is a prediction of the vehicle's current position, based on its last known position, the time elapsed since it was obtained and possibly other factors. This would be used for positions obtained through inertial navigation. **/ attr_position_valid_valid, /**< The position is valid and can be used for all purposes. **/ }; #define ATTR_IS_INT(x) ((x) >= attr_type_int_begin && (x) <= attr_type_int_end) #define ATTR_IS_DOUBLE(x) ((x) >= attr_type_double_begin && (x) <= attr_type_double_end) #define ATTR_IS_STRING(x) ((x) >= attr_type_string_begin && (x) <= attr_type_string_end) #define ATTR_IS_OBJECT(x) ((x) >= attr_type_object_begin && (x) <= attr_type_object_end) #define ATTR_IS_ITEM(x) ((x) >= attr_type_item_begin && (x) <= attr_type_item_end) #define ATTR_IS_COORD_GEO(x) ((x) >= attr_type_coord_geo_begin && (x) <= attr_type_coord_geo_end) #define ATTR_IS_NUMERIC(x) (ATTR_IS_INT(x) || ATTR_IS_DOUBLE(x)) #define ATTR_IS_COLOR(x) ((x) >= attr_type_color_begin && (x) <= attr_type_color_end) #define ATTR_IS_PCOORD(x) ((x) >= attr_type_pcoord_begin && (x) <= attr_type_pcoord_end) #define ATTR_IS_COORD(x) ((x) >= attr_type_coord_begin && (x) <= attr_type_coord_end) #define ATTR_IS_GROUP(x) ((x) >= attr_type_group_begin && (x) <= attr_type_group_end) #define ATTR_INT(x,y) ((struct attr){attr_##x,{.num=y}}) #define ATTR_OBJECT(x,y) ((struct attr){attr_##x,{.navit=y}}) struct range { short min, max; }; struct attr { enum attr_type type; union { char *str; void *data; long num; struct item *item; enum item_type item_type; enum projection projection; double * numd; struct color *color; struct coord_geo *coord_geo; struct navit *navit; struct callback *callback; struct callback_list *callback_list; struct vehicle *vehicle; struct layout *layout; struct layer *layer; struct map *map; struct mapset *mapset; struct log *log; struct route *route; struct navigation *navigation; struct coord *coord; struct pcoord *pcoord; struct gui *gui; struct graphics *graphics; struct tracking *tracking; struct itemgra *itemgra; struct plugin *plugin; struct plugins *plugins; struct polygon *polygon; struct polyline *polyline; struct circle *circle; struct text *text; struct icon *icon; struct image *image; struct arrows *arrows; struct element *element; struct speech *speech; struct cursor *cursor; struct displaylist *displaylist; struct transformation *transformation; struct vehicleprofile *vehicleprofile; struct roadprofile *roadprofile; struct bookmarks *bookmarks; struct config *config; struct osd *osd; struct range range; struct navit_object *navit_object; int *dash; enum item_type *item_types; enum attr_type *attr_types; long long *num64; struct attr *attrs; } u; }; struct attr_iter; /* prototypes */ void attr_create_hash(void); void attr_destroy_hash(void); enum attr_type attr_from_name(const char *name); char *attr_to_name(enum attr_type attr); struct attr *attr_new_from_text(const char *name, const char *value); char *attr_to_text_ext(struct attr *attr, char *sep, enum attr_format fmt, enum attr_format def_fmt, struct map *map); char *attr_to_text(struct attr *attr, struct map *map, int pretty); struct attr *attr_search(struct attr **attrs, struct attr *last, enum attr_type attr); int attr_generic_get_attr(struct attr **attrs, struct attr **def_attrs, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct attr **attr_generic_set_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_add_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_add_attr_list(struct attr **attrs, struct attr **add); struct attr **attr_generic_prepend_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_remove_attr(struct attr **attrs, struct attr *attr); enum attr_type attr_type_begin(enum attr_type type); int attr_data_size(struct attr *attr); void *attr_data_get(struct attr *attr); void attr_data_set(struct attr *attr, void *data); void attr_data_set_le(struct attr *attr, void *data); void attr_free_content(struct attr *attr); void attr_free(struct attr *attr); void attr_dup_content(struct attr *src, struct attr *dst); struct attr *attr_dup(struct attr *attr); void attr_list_free(struct attr **attrs); struct attr **attr_list_dup(struct attr **attrs); struct attr **attr_list_append(struct attr **attrs, struct attr *attr); int attr_from_line(char *line, char *name, int *pos, char *val_ret, char *name_ret); int attr_types_contains(enum attr_type *types, enum attr_type type); int attr_types_contains_default(enum attr_type *types, enum attr_type type, int deflt); int attr_rel2real(int attrval, int whole, int treat_neg_as_rel); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/attr_def.h000066400000000000000000000235711264204753600170160ustar00rootroot00000000000000/* * Navit, a modular navigation system. * Copyright (C) 2005-2014 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file attr_def.h * @brief Attribute definitions. * * Any attribute used by a Navit object must be defined in this file. * * @author Navit Team * @date 2005-2014 */ /* prototypes */ /* common */ ATTR2(0x00000000,none) ATTR(any) ATTR(any_xml) ATTR2(0x00010000,type_item_begin) ATTR(town_streets_item) ATTR_UNUSED ATTR_UNUSED ATTR(street_item) ATTR_UNUSED ATTR(position_sat_item) ATTR(current_item) ATTR2(0x0001ffff,type_item_end) ATTR2(0x00020000,type_int_begin) ATTR_UNUSED ATTR(id) ATTR(flags) ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR(flush_size) ATTR(flush_time) ATTR(zipfile_ref) ATTR(country_id) ATTR(position_sats) ATTR(position_sats_used) ATTR(update) ATTR(follow) ATTR(length) ATTR(time) ATTR(destination_length) ATTR(destination_time) ATTR(speed) ATTR(interval) ATTR(position_qual) ATTR(zoom) ATTR(retry_interval) ATTR(projection) ATTR(offroad) ATTR(vocabulary_name) ATTR(vocabulary_name_systematic) ATTR(vocabulary_distances) ATTR_UNUSED ATTR(antialias) ATTR(order_delta) ATTR(baudrate) ATTR_UNUSED ATTR(icon_xs) ATTR(icon_l) ATTR(icon_s) ATTR(spacing) ATTR(recent_dest) ATTR(destination_distance) ATTR(check_version) ATTR(details) ATTR(width) ATTR(offset) ATTR(directed) ATTR(radius) ATTR(text_size) ATTR(level) ATTR(icon_w) ATTR(icon_h) ATTR(rotation) ATTR(checksum_ignore) ATTR(position_fix_type) ATTR(timeout) ATTR(orientation) ATTR(keyboard) ATTR(position_sats_signal) ATTR(cps) ATTR_UNUSED ATTR(osd_configuration) ATTR(columns) ATTR(align) ATTR(sat_prn) ATTR(sat_elevation) ATTR(sat_azimuth) ATTR(sat_snr) ATTR(autozoom) ATTR(version) ATTR(autozoom_min) ATTR(maxspeed) ATTR(cdf_histsize) ATTR(message_maxage) ATTR(message_maxnum) ATTR(pitch) ATTR_UNUSED ATTR_UNUSED ATTR(route_status) ATTR(route_weight) ATTR_UNUSED ATTR(route_mode) ATTR(maxspeed_handling) ATTR(flags_forward_mask) ATTR(flags_reverse_mask) ATTR_UNUSED ATTR(delay) ATTR(lag) ATTR(bpp) ATTR(fullscreen) ATTR(windowid) ATTR(hog) ATTR(flags_town) ATTR(flags_street) ATTR(flags_house_number) ATTR(use_camera) ATTR(flags_graphics) ATTR(zoom_min) ATTR(zoom_max) ATTR(gamma) ATTR(brightness) ATTR(contrast) ATTR(height) ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR(shmkey) ATTR(vehicle_width) ATTR(vehicle_length) ATTR(vehicle_height) ATTR(vehicle_weight) ATTR(vehicle_axle_weight) ATTR(vehicle_dangerous_goods) ATTR(shmsize) ATTR(shmoffset) ATTR_UNUSED ATTR(static_speed) ATTR(static_distance) ATTR(through_traffic_penalty) ATTR(through_traffic_flags) ATTR(speed_exceed_limit_offset) ATTR(speed_exceed_limit_percent) ATTR(map_border) ATTR(angle_pref) ATTR(connected_pref) ATTR(nostop_pref) ATTR(offroad_limit_pref) ATTR(route_pref) ATTR(overspeed_pref) ATTR(overspeed_percent_pref) ATTR(autosave_period) ATTR(tec_type) ATTR(tec_dirtype) ATTR(tec_direction) ATTR(imperial) ATTR(update_period) ATTR(tunnel_extrapolation) ATTR(street_count) ATTR(min_dist) ATTR(max_dist) ATTR(cache_size) ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR(turn_around_count) ATTR(turn_around_penalty) ATTR(turn_around_penalty2) ATTR(autozoom_max) ATTR(nav_status) ATTR2(0x00027500,type_rel_abs_begin) /* These attributes are int that can either hold relative or absolute values. See the * documentation of ATTR_REL_RELSHIFT for details. */ ATTR(h) ATTR(w) ATTR(x) ATTR(y) ATTR(font_size) ATTR2(0x00028000,type_boolean_begin) /* boolean */ ATTR(overwrite) ATTR(active) ATTR(follow_cursor) ATTR_UNUSED ATTR(tracking) ATTR(menubar) ATTR(statusbar) ATTR(toolbar) ATTR(animate) ATTR(lazy) ATTR(mkdir) ATTR(predraw) ATTR(postdraw) ATTR(button) ATTR(ondemand) ATTR(menu_on_map_click) ATTR(direction) ATTR_UNUSED ATTR(gui_speech) ATTR(town_id) /* fixme? */ ATTR(street_id) /* fixme? */ ATTR(district_id) /* fixme? */ ATTR(drag_bitmap) ATTR(use_mousewheel) ATTR_UNUSED ATTR(position_magnetic_direction) ATTR(use_overlay) ATTR_UNUSED ATTR(autozoom_active) ATTR(position_valid) ATTR(frame) ATTR(tell_street_name) ATTR(bluetooth) ATTR(signal_on_map_click) ATTR(route_active) ATTR(search_active) ATTR(unsuspend) ATTR(announce_on) ATTR(disable_reset) ATTR(autostart) ATTR(readwrite) ATTR(cache) ATTR(create) ATTR(persistent) ATTR(waypoints_flag) /* toggle for "set as destination" to switch between start a new route or add */ ATTR(no_warning_if_map_file_missing) ATTR(duplicate) ATTR2(0x0002ffff,type_int_end) ATTR2(0x00030000,type_string_begin) ATTR(type) ATTR(label) ATTR(data) ATTR(charset) ATTR(country_all) ATTR(country_iso3) ATTR(country_iso2) ATTR(country_car) ATTR(country_name) ATTR(town_name) ATTR(town_postal) ATTR(district_name) ATTR(street_name) ATTR(street_name_systematic) ATTR_UNUSED ATTR(debug) ATTR(address) ATTR(phone) ATTR(entry_fee) ATTR(open_hours) ATTR(skin) ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR(window_title) ATTR_UNUSED ATTR_UNUSED /* poi */ ATTR_UNUSED ATTR(info_html) ATTR(price_html) /* navigation */ ATTR(navigation_short) ATTR(navigation_long) ATTR(navigation_long_exact) ATTR(navigation_speech) ATTR(name) ATTR(cursorname) ATTR(source) ATTR(description) ATTR(gc_type) ATTR_UNUSED ATTR(position_nmea) ATTR(gpsd_query) ATTR(on_eof) ATTR(command) ATTR(src) ATTR(path) ATTR(font) ATTR(url_local) ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR(icon_src) ATTR(position_time_iso8601) ATTR(house_number) ATTR(osm_member) ATTR(osm_tag) ATTR(municipality_name) ATTR(county_name) ATTR(state_name) ATTR(message) ATTR_UNUSED ATTR(enable_expression) ATTR(fax) ATTR(email) ATTR(url) ATTR(profilename) ATTR(projectionname) ATTR(town_or_district_name) ATTR(postal) ATTR(postal_mask) ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR_UNUSED ATTR(town_name_match) ATTR(district_name_match) ATTR(street_name_match) ATTR(language) ATTR(subtype) ATTR(filter) ATTR(daylayout) ATTR(nightlayout) ATTR(xml_text) ATTR(layout_name) ATTR_UNUSED ATTR_UNUSED ATTR(status_text) ATTR(log_gpx_desc) ATTR(map_pass) ATTR_UNUSED ATTR(socket) /* These attributes for house number interpolation are only written by * martin-s' (unpublished) GDF converter. */ ATTR(house_number_left) ATTR(house_number_left_odd) ATTR(house_number_left_even) ATTR(house_number_right) ATTR(house_number_right_odd) ATTR(house_number_right_even) ATTR(map_release) ATTR(accesskey) ATTR(http_method) ATTR(http_header) ATTR(progress) ATTR(sample_dir) ATTR(sample_suffix) ATTR(dbus_destination) ATTR(dbus_path) ATTR(dbus_interface) ATTR(dbus_method) ATTR(osm_is_in) ATTR(event_loop_system) ATTR(map_name) ATTR(item_name) ATTR(state_file) ATTR(on_map_click) ATTR(route_depth) ATTR(ref) ATTR(tile_name) ATTR(first_key) ATTR(last_key) ATTR(src_dir) ATTR(refresh_cond) /* House number interpolation information from OSM. For OSM data, the interpolation must * exclude the end nodes, because these are imported as separate nodes. */ ATTR(house_number_interpolation_no_ends_incrmt_1) ATTR(house_number_interpolation_no_ends_incrmt_2) ATTR(dbg_level) ATTR(street_name_systematic_nat) ATTR(street_name_systematic_int) ATTR(street_destination) ATTR(exit_to) ATTR(street_destination_forward) ATTR(street_destination_backward) ATTR2(0x0003ffff,type_string_end) ATTR2(0x00040000,type_special_begin) ATTR(order) ATTR(item_type) ATTR(item_types) ATTR(dash) ATTR(sequence_range) ATTR(angle_range) ATTR(speed_range) ATTR(attr_types) ATTR(ch_edge) ATTR(zipfile_ref_block) ATTR(item_id) ATTR(pdl_gps_update) ATTR2(0x0004ffff,type_special_end) ATTR2(0x00050000,type_double_begin) ATTR(position_height) ATTR(position_speed) ATTR(position_direction) ATTR(position_hdop) ATTR(position_radius) ATTR(position_longitude) ATTR(position_latitude) ATTR(position_direction_matched) ATTR2(0x0005ffff,type_double_end) ATTR2(0x00060000,type_coord_geo_begin) ATTR(position_coord_geo) ATTR(center) ATTR(click_coord_geo) ATTR2(0x0006ffff,type_coord_geo_end) ATTR2(0x00070000,type_color_begin) ATTR(color) ATTR_UNUSED ATTR(background_color) ATTR(foreground_color) ATTR(text_color) ATTR(idle_color) ATTR(background_color2) ATTR(text_background) ATTR2(0x0007ffff,type_color_end) ATTR2(0x00080000,type_object_begin) ATTR(navit) ATTR(log) ATTR(callback) ATTR(route) ATTR(navigation) ATTR(vehicle) ATTR(map) ATTR(bookmark_map) ATTR(bookmarks) ATTR(former_destination_map) ATTR(graphics) ATTR(gui) ATTR(trackingo) /* fixme */ ATTR(plugins) ATTR(layer) ATTR(itemgra) ATTR(polygon) ATTR(polyline) ATTR(circle) ATTR(text) ATTR(icon) ATTR(image) ATTR(arrows) ATTR(mapset) ATTR(osd) ATTR(plugin) ATTR(speech) ATTR(coord) ATTR(private_data) ATTR(callback_list) ATTR(displaylist) ATTR(transformation) ATTR(vehicleprofile) ATTR(roadprofile) ATTR(announcement) ATTR(cursor) ATTR(config) ATTR(maps) ATTR(layout) ATTR(profile_option) ATTR(script) ATTR2(0x0008ffff,type_object_end) ATTR2(0x00090000,type_coord_begin) ATTR2(0x0009ffff,type_coord_end) ATTR2(0x000a0000,type_pcoord_begin) ATTR(destination) ATTR(position) ATTR(position_test) ATTR2(0x000affff,type_pcoord_end) ATTR2(0x000b0000,type_callback_begin) ATTR(resize) ATTR(motion) ATTR(keypress) ATTR(window_closed) ATTR(log_gpx) ATTR(log_textfile) ATTR(graphics_ready) ATTR(destroy) ATTR(wm_copydata) ATTR2(0x000bffff,type_callback_end) ATTR2(0x000c0000,type_int64_begin) ATTR(osm_nodeid) ATTR(osm_wayid) ATTR(osm_relationid) ATTR(osm_nodeid_first_node) ATTR(osm_nodeid_last_node) ATTR2(0x000cffff,type_int64_end) ATTR2(0x000d0000,type_group_begin) ATTR2(0x000dffff,type_group_end) ATTR2(0x000e0000,type_item_type_begin) ATTR2(0x000effff,type_item_type_end) navit-0.5.0+dfsg.1/navit/autoload/000077500000000000000000000000001264204753600166555ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/autoload/Makefile.am000066400000000000000000000001041264204753600207040ustar00rootroot00000000000000SUBDIRS= if USE_OSSO SUBDIRS += osso endif DIST_SUBDIRS= osso navit-0.5.0+dfsg.1/navit/autoload/osso/000077500000000000000000000000001264204753600176405ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/autoload/osso/CMakeLists.txt000066400000000000000000000000531264204753600223760ustar00rootroot00000000000000module_add_library(autoload_osso osso.c) navit-0.5.0+dfsg.1/navit/autoload/osso/Makefile.am000066400000000000000000000005121264204753600216720ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBOSSO_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_osso moduleautoload_LTLIBRARIES = libplugin_osso.la libplugin_osso_la_LDFLAGS=-module -avoid-version @NAVIT_MODULE_LDFLAGS@ @LIBOSSO_LIBS@ #-Wl,--no-undefined libplugin_osso_la_SOURCES = osso.c navit-0.5.0+dfsg.1/navit/autoload/osso/osso.c000066400000000000000000000046061264204753600207750ustar00rootroot00000000000000#include #include #include "config.h" #include "debug.h" #include "item.h" #include "attr.h" #include "navit.h" #include "plugin.h" #include "callback.h" #include "config_.h" static osso_context_t *osso_context; static struct attr callback = { attr_callback }; extern char *version; struct cb_hw_state_trail { struct navit* nav; osso_hw_state_t *state; }; static void osso_display_on(struct navit *this_) { osso_return_t err; err = osso_display_blanking_pause(osso_context); dbg(lvl_warning, "Unblank result: ", err == OSSO_OK ? "Ok" : (err == OSSO_ERROR ? "Error" : "Invalid context")); } static gboolean osso_cb_hw_state_idle(struct cb_hw_state_trail * params) { dbg(lvl_debug, "(inact=%d, save=%d, shut=%d, memlow=%d, state=%d)\n", params->state->system_inactivity_ind, params->state->save_unsaved_data_ind, params->state->shutdown_ind, params->state->memory_low_ind, params->state->sig_device_mode_ind); if (params->state->shutdown_ind) { /* we are going down, down, down */ navit_destroy(params->nav); } g_free(params->state); g_free(params); return FALSE; } /** * * Handle osso events * * @param state Osso hardware state * * @param data ptr to private data * * @returns nothing **/ static void osso_cb_hw_state(osso_hw_state_t * state, gpointer data) { struct navit *nav = (struct navit*)data; struct cb_hw_state_trail *params = g_new(struct cb_hw_state_trail,1); params->nav=nav; params->state = g_new(osso_hw_state_t, 1); memcpy(params->state, state, sizeof(osso_hw_state_t)); g_idle_add((GSourceFunc) osso_cb_hw_state_idle, params); } static void osso_navit(struct navit *nav, int add) { dbg(lvl_debug, "Installing osso context for org.navit_project.navit\n"); osso_context = osso_initialize("org.navit_project.navit", version, TRUE, NULL); if (osso_context == NULL) { dbg(lvl_error, "error initiating osso context\n"); } osso_hw_set_event_cb(osso_context, NULL, osso_cb_hw_state, nav); if (add > 0) { /* add callback to unblank screen */ navit_add_callback(nav, callback_new_attr_0(callback_cast (osso_display_on), attr_unsuspend)); } } void plugin_init(void) { //struct callback *cb; dbg(lvl_info, "enter\n"); callback.u.callback = callback_new_attr_0(callback_cast(osso_navit), attr_navit); config_add_attr(config, &callback); } void plugin_deinit(void) { osso_deinitialize(osso_context); } navit-0.5.0+dfsg.1/navit/binding/000077500000000000000000000000001264204753600164575ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/binding/Makefile.am000066400000000000000000000002441264204753600205130ustar00rootroot00000000000000SUBDIRS= if BINDING_PYTHON SUBDIRS+=python endif if BINDING_DBUS SUBDIRS+=dbus endif if BINDING_WIN32 SUBDIRS+=win32 endif DIST_SUBDIRS=python dbus win32 navit-0.5.0+dfsg.1/navit/binding/dbus/000077500000000000000000000000001264204753600174145ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/binding/dbus/CMakeLists.txt000066400000000000000000000005751264204753600221630ustar00rootroot00000000000000module_add_library(binding_dbus binding_dbus.c) set(bindir ${CMAKE_INSTALL_PREFIX}/${BIN_DIR}) configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/org.navit_project.navit.service.in" "${CMAKE_CURRENT_BINARY_DIR}/org.navit_project.navit.service" ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.navit_project.navit.service DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dbus-1/services/) navit-0.5.0+dfsg.1/navit/binding/dbus/Makefile.am000066400000000000000000000011441264204753600214500ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_dbus modulebinding_LTLIBRARIES = libbinding_dbus.la libbinding_dbus_la_SOURCES = binding_dbus.c libbinding_dbus_la_LIBADD = @DBUS_LIBS@ libbinding_dbus_la_LDFLAGS = -module -avoid-version servicedir = @DBUS_SERVICE_DIR@ service_in_files = org.navit_project.navit.service.in service_DATA = $(service_in_files:.service.in=.service) $(service_DATA): $(service_in_files) Makefile sed -e "s|\@bindir\@|$(bindir)|" $< > $@ EXTRA_DIST = $(service_in_files) distclean-local: rm -f $(service_DATA) navit-0.5.0+dfsg.1/navit/binding/dbus/binding_dbus.c000066400000000000000000002352531264204753600222210ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #define DBUS_API_SUBJECT_TO_CHANGE #include #include #include #include "config.h" #include "config_.h" #include "navit.h" #include "coord.h" #include "point.h" #include "plugin.h" #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "attr.h" #include "layout.h" #include "navigation.h" #include "command.h" #include "callback.h" #include "graphics.h" #include "track.h" #include "vehicle.h" #include "vehicleprofile.h" #include "map.h" #include "mapset.h" #include "osd.h" #include "route.h" #include "search.h" #include "callback.h" #include "gui.h" #include "layout.h" #include "roadprofile.h" #include "util.h" #include "transform.h" #include "event.h" static DBusConnection *connection; static dbus_uint32_t dbus_serial; static char *service_name = "org.navit_project.navit"; static char *object_path = "/org/navit_project/navit"; char *navitintrospectxml_head1 = "\n" "\n" " \n" " \n" " \n" " \n" " \n"; GHashTable *object_hash; GHashTable *object_hash_rev; GHashTable *object_count; struct dbus_callback { struct callback *callback; char *signal; }; static char * object_new(char *type, void *object) { int id; char *ret; dbg(lvl_debug,"enter %s\n", type); if ((ret=g_hash_table_lookup(object_hash_rev, object))) return ret; id=GPOINTER_TO_INT(g_hash_table_lookup(object_count, type)); g_hash_table_insert(object_count, type, GINT_TO_POINTER((id+1))); ret=g_strdup_printf("%s/%s/%d", object_path, type, id); g_hash_table_insert(object_hash, ret, object); g_hash_table_insert(object_hash_rev, object, ret); dbg(lvl_debug,"return %s\n", ret); return (ret); } static void * object_get(const char *path) { return g_hash_table_lookup(object_hash, path); } static void object_destroy(const char *path, void *object) { if (!path && !object) return; if (!object) object=g_hash_table_lookup(object_hash, path); if (!path) path=g_hash_table_lookup(object_hash_rev, object); g_hash_table_remove(object_hash, path); g_hash_table_remove(object_hash_rev, object); } static void * resolve_object(const char *opath, char *type) { char *prefix; const char *oprefix; void *ret=NULL; char *def_navit="/default_navit"; char *def_gui="/default_gui"; char *def_graphics="/default_graphics"; char *def_vehicle="/default_vehicle"; char *def_vehicleprofile="/default_vehicleprofile"; char *def_mapset="/default_mapset"; char *def_map="/default_map"; char *def_navigation="/default_navigation"; char *def_route="/default_route"; char *def_tracking="/default_tracking"; struct attr attr; if (strncmp(opath, object_path, strlen(object_path))) { dbg(lvl_error,"wrong object path %s\n",opath); return NULL; } prefix=g_strdup_printf("%s/%s/", object_path, type); if (!strncmp(prefix, opath, strlen(prefix))) { ret=object_get(opath); g_free(prefix); return ret; } g_free(prefix); oprefix=opath+strlen(object_path); if (!strncmp(oprefix,def_navit,strlen(def_navit))) { oprefix+=strlen(def_navit); struct attr navit; if (!config_get_attr(config, attr_navit, &navit, NULL)) return NULL; if (!oprefix[0]) { dbg(lvl_debug,"default_navit\n"); return navit.u.navit; } if (!strncmp(oprefix,def_graphics,strlen(def_graphics))) { if (navit_get_attr(navit.u.navit, attr_graphics, &attr, NULL)) { return attr.u.graphics; } return NULL; } if (!strncmp(oprefix,def_gui,strlen(def_gui))) { if (navit_get_attr(navit.u.navit, attr_gui, &attr, NULL)) { return attr.u.gui; } return NULL; } if (!strncmp(oprefix,def_vehicleprofile,strlen(def_vehicleprofile))) { if (navit_get_attr(navit.u.navit, attr_vehicleprofile, &attr, NULL)) { return attr.u.vehicleprofile; } return NULL; } if (!strncmp(oprefix,def_vehicle,strlen(def_vehicle))) { if (navit_get_attr(navit.u.navit, attr_vehicle, &attr, NULL)) { return attr.u.vehicle; } return NULL; } if (!strncmp(oprefix,def_mapset,strlen(def_mapset))) { oprefix+=strlen(def_mapset); if (navit_get_attr(navit.u.navit, attr_mapset, &attr, NULL)) { if (!oprefix[0]) { return attr.u.mapset; } if (!strncmp(oprefix,def_map,strlen(def_map))) { if (mapset_get_attr(attr.u.mapset, attr_map, &attr, NULL)) { return attr.u.map; } return NULL; } } return NULL; } if (!strncmp(oprefix,def_navigation,strlen(def_navigation))) { if (navit_get_attr(navit.u.navit, attr_navigation, &attr, NULL)) { return attr.u.navigation; } return NULL; } if (!strncmp(oprefix,def_route,strlen(def_route))) { oprefix+=strlen(def_route); if (navit_get_attr(navit.u.navit, attr_route, &attr, NULL)) { return attr.u.route; } return NULL; } if (!strncmp(oprefix,def_tracking,strlen(def_tracking))) { if (navit_get_attr(navit.u.navit, attr_trackingo, &attr, NULL)) { return attr.u.tracking; } return NULL; } } return NULL; } static void * object_get_from_message_arg(DBusMessageIter *iter, char *type) { char *opath; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH) return NULL; dbus_message_iter_get_basic(iter, &opath); dbus_message_iter_next(iter); return resolve_object(opath, type); } static void * object_get_from_message(DBusMessage *message, char *type) { return resolve_object(dbus_message_get_path(message), type); } static enum attr_type attr_type_get_from_message(DBusMessageIter *iter) { char *attr_type; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) return attr_none; dbus_message_iter_get_basic(iter, &attr_type); dbus_message_iter_next(iter); return attr_from_name(attr_type); } static void encode_variant_string(DBusMessageIter *iter, char *str) { DBusMessageIter variant; dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &variant); dbus_message_iter_append_basic(&variant, DBUS_TYPE_STRING, &str); dbus_message_iter_close_container(iter, &variant); } static void encode_dict_string_variant_string(DBusMessageIter *iter, char *key, char *value) { DBusMessageIter dict; dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict); dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &key); encode_variant_string(&dict, value); dbus_message_iter_close_container(iter, &dict); } static int encode_attr(DBusMessageIter *iter1, struct attr *attr) { char *name=attr_to_name(attr->type); DBusMessageIter iter2,iter3; dbus_message_iter_append_basic(iter1, DBUS_TYPE_STRING, &name); if (attr->type >= attr_type_int_begin && attr->type < attr_type_boolean_begin) { dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_INT32_AS_STRING, &iter2); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &attr->u.num); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_BOOLEAN_AS_STRING, &iter2); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_BOOLEAN, &attr->u.num); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { encode_variant_string(iter1, attr->u.str); } if ((attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) || attr->type == attr_item_type) { encode_variant_string(iter1, item_to_name(attr->u.item_type)); } if (attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, "ai", &iter2); dbus_message_iter_open_container(&iter2, DBUS_TYPE_ARRAY, "i", &iter3); if (attr->u.pcoord) { dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->pro); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->x); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->y); } dbus_message_iter_close_container(&iter2, &iter3); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { char *object=object_new(attr_to_name(attr->type), attr->u.data); dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter2); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_OBJECT_PATH, &object); dbus_message_iter_close_container(iter1, &iter2); } if (attr->type == attr_item_types) { char *str=attr_to_text(attr,NULL,0); encode_variant_string(iter1, str); g_free(str); } return 1; } static DBusHandlerResult empty_reply(DBusConnection *connection, DBusMessage *message) { DBusMessage *reply; reply = dbus_message_new_method_return(message); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult dbus_error(DBusConnection *connection, DBusMessage *message, char *error, char *msg) { DBusMessage *reply; reply = dbus_message_new_error(message, error, msg); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult dbus_error_invalid_attr_type(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "attribute type invalid"); } static DBusHandlerResult dbus_error_invalid_parameter(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "parameter invalid"); } static DBusHandlerResult dbus_error_invalid_object_path(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path invalid"); } static DBusHandlerResult dbus_error_invalid_object_path_parameter(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path parameter invalid"); } static DBusHandlerResult dbus_error_navigation_not_configured(DBusConnection *connection, DBusMessage *message) { return dbus_error(connection, message, DBUS_ERROR_FAILED, "navigation is not configured (no element in config file?)"); } static DBusHandlerResult dbus_error_no_data_available(DBusConnection *connection, DBusMessage *message) { #if 1 return dbus_error(connection, message, DBUS_ERROR_FILE_NOT_FOUND, "no data available"); #else return empty_reply(connection, message); #endif } #if 0 static void dbus_dump_iter(char *prefix, DBusMessageIter *iter) { char *prefixr,*vals; int arg,vali; DBusMessageIter iterr; while ((arg=dbus_message_iter_get_arg_type(iter)) != DBUS_TYPE_INVALID) { switch (arg) { case DBUS_TYPE_INT32: dbus_message_iter_get_basic(iter, &vali); dbg(lvl_debug,"%sDBUS_TYPE_INT32: %d\n",prefix,vali); break; case DBUS_TYPE_STRING: dbus_message_iter_get_basic(iter, &vals); dbg(lvl_debug,"%sDBUS_TYPE_STRING: %s\n",prefix,vals); break; case DBUS_TYPE_STRUCT: dbg(lvl_debug,"%sDBUS_TYPE_STRUCT:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; case DBUS_TYPE_VARIANT: dbg(lvl_debug,"%sDBUS_TYPE_VARIANT:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; case DBUS_TYPE_DICT_ENTRY: dbg(lvl_debug,"%sDBUS_TYPE_DICT_ENTRY:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; case DBUS_TYPE_ARRAY: dbg(lvl_debug,"%sDBUS_TYPE_ARRAY:\n",prefix); prefixr=g_strdup_printf("%s ",prefix); dbus_message_iter_recurse(iter, &iterr); dbus_dump_iter(prefixr, &iterr); g_free(prefixr); break; default: dbg(lvl_debug,"%c\n",arg); } dbus_message_iter_next(iter); } } static void dbus_dump(DBusMessage *message) { DBusMessageIter iter; dbus_message_iter_init(message, &iter); dbus_dump_iter("",&iter); } #endif /** * Extracts a struct pcoord from a DBus message * * @param message The DBus message * @param iter Sort of pointer that points on that (iii)-object in the message * @param pc Pointer where the data should get stored * @returns Returns 1 when everything went right, otherwise 0 */ static int pcoord_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct pcoord *pc) { if(!strcmp(dbus_message_iter_get_signature(iter), "s")) { char *coordstring; dbus_message_iter_get_basic(iter, &coordstring); if(!pcoord_parse(coordstring, projection_mg, pc)) return 0; return 1; } else { DBusMessageIter iter2; dbus_message_iter_recurse(iter, &iter2); if(!strcmp(dbus_message_iter_get_signature(iter), "(is)")) { char *coordstring; int projection; dbus_message_iter_get_basic(&iter2, &projection); dbus_message_iter_next(&iter2); dbus_message_iter_get_basic(&iter2, &coordstring); if(!pcoord_parse(coordstring, projection, pc)) return 0; return 1; } else if(!strcmp(dbus_message_iter_get_signature(iter), "(iii)")) { dbus_message_iter_get_basic(&iter2, &pc->pro); dbus_message_iter_next(&iter2); dbus_message_iter_get_basic(&iter2, &pc->x); dbus_message_iter_next(&iter2); dbus_message_iter_get_basic(&iter2, &pc->y); return 1; } } return 0; } static void pcoord_encode(DBusMessageIter *iter, struct pcoord *pc) { DBusMessageIter iter2; dbus_message_iter_open_container(iter,DBUS_TYPE_STRUCT,NULL,&iter2); if (pc) { dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->pro); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->x); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->y); } else { int n=0; dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); } dbus_message_iter_close_container(iter, &iter2); } static enum attr_type decode_attr_type_from_iter(DBusMessageIter *iter) { char *attr_type; enum attr_type ret; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) return attr_none; dbus_message_iter_get_basic(iter, &attr_type); dbus_message_iter_next(iter); ret=attr_from_name(attr_type); dbg(lvl_debug, "attr value: 0x%x string: %s\n", ret, attr_type); return ret; } static int decode_attr_from_iter(DBusMessageIter *iter, struct attr *attr) { DBusMessageIter iterattr, iterstruct; int ret=1; double d; attr->type=decode_attr_type_from_iter(iter); if (attr->type == attr_none) return 0; dbus_message_iter_recurse(iter, &iterattr); dbus_message_iter_next(iter); dbg(lvl_debug, "seems valid. signature: %s\n", dbus_message_iter_get_signature(&iterattr)); if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) return 0; if (attr->type >= attr_type_int_begin && attr->type <= attr_type_boolean_begin) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_INT32) { int val; dbus_message_iter_get_basic(&iterattr, &val); attr->u.num=val; return 1; } return 0; } if(attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_BOOLEAN) { int val; dbus_message_iter_get_basic(&iterattr, &val); attr->u.num=val; return 1; } return 0; } if(attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRING) { dbus_message_iter_get_basic(&iterattr, &attr->u.str); return 1; } return 0; } if(attr->type >= attr_type_double_begin && attr->type <= attr_type_double_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_DOUBLE) { attr->u.numd=g_new(typeof(*attr->u.numd),1); dbus_message_iter_get_basic(&iterattr, attr->u.numd); return 1; } } if(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_OBJECT_PATH) { char *obj; dbus_message_iter_get_basic(&iterattr, &obj); attr->u.data=object_get(obj); if (attr->u.data) { return 1; } } return 0; } if(attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) { if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { attr->u.coord_geo=g_new(typeof(*attr->u.coord_geo),1); dbus_message_iter_recurse(&iterattr, &iterstruct); if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { dbus_message_iter_get_basic(&iterstruct, &d); dbus_message_iter_next(&iterstruct); attr->u.coord_geo->lng=d; } else ret=0; if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { dbus_message_iter_get_basic(&iterstruct, &d); attr->u.coord_geo->lat=d; } else ret=0; if (!ret) { g_free(attr->u.coord_geo); attr->u.coord_geo=NULL; } return ret; } } if(attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { int i; if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { attr->u.pcoord=g_new(typeof(*attr->u.pcoord),1); dbus_message_iter_recurse(&iterattr, &iterstruct); if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { dbus_message_iter_get_basic(&iterstruct, &i); dbus_message_iter_next(&iterstruct); attr->u.pcoord->pro=i; } else ret=0; if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { dbus_message_iter_get_basic(&iterstruct, &i); dbus_message_iter_next(&iterstruct); attr->u.pcoord->x=i; } else ret=0; if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { dbus_message_iter_get_basic(&iterstruct, &i); attr->u.pcoord->y=i; } else ret=0; if (!ret) { g_free(attr->u.pcoord); attr->u.pcoord=NULL; } return ret; } } if (attr->type == attr_callback) { struct dbus_callback *callback=object_get_from_message_arg(&iterattr, "callback"); if (callback) { attr->u.callback=callback->callback; return 1; } } return 0; } static int decode_attr(DBusMessage *message, struct attr *attr) { DBusMessageIter iter; dbus_message_iter_init(message, &iter); return decode_attr_from_iter(&iter, attr); } static void destroy_attr(struct attr *attr) { if(attr->type > attr_type_double_begin && attr->type < attr_type_double_end) { g_free(attr->u.numd); } } static char * get_iter_name(char *type) { return g_strdup_printf("%s_attr_iter",type); } static DBusHandlerResult request_attr_iter(DBusConnection *connection, DBusMessage *message, char *type, struct attr_iter *(*func)(void)) { DBusMessage *reply; char *iter_name; char *opath; struct attr_iter *attr_iter; attr_iter=(*func)(); iter_name=get_iter_name(type); opath=object_new(iter_name,attr_iter); g_free(iter_name); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_attr_iter_destroy(DBusConnection *connection, DBusMessage *message, char *type, void (*func)(struct attr_iter *)) { struct attr_iter *attr_iter; DBusMessageIter iter; char *iter_name; dbus_message_iter_init(message, &iter); iter_name=get_iter_name(type); attr_iter=object_get_from_message_arg(&iter, iter_name); g_free(iter_name); if (! attr_iter) return dbus_error_invalid_object_path_parameter(connection, message); object_destroy(NULL, attr_iter); func(attr_iter); return empty_reply(connection, message); } static DBusHandlerResult request_destroy(DBusConnection *connection, DBusMessage *message, char *type, void *data, void (*func)(void *)) { if (!data) data=object_get_from_message(message, type); if (!data) return dbus_error_invalid_object_path(connection, message); object_destroy(NULL, data); func(data); return empty_reply(connection, message); } static DBusHandlerResult request_dup(DBusConnection *connection, DBusMessage *message, char *type, void *data, void *(*func)(void *)) { DBusMessage *reply; char *opath; void *obj; if (!data) data=object_get_from_message(message, type); if (!data) return dbus_error_invalid_object_path(connection, message); obj=func(data); opath=object_new(type,obj); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_get_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) { DBusMessage *reply; DBusMessageIter iter; struct attr attr; enum attr_type attr_type; struct attr_iter *attr_iter; char *iter_name; if (! data) data = object_get_from_message(message, type); if (! data) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); attr_type=attr_type_get_from_message(&iter); if (attr_type == attr_none) return dbus_error_invalid_attr_type(connection, message); iter_name=get_iter_name(type); attr_iter=object_get_from_message_arg(&iter, iter_name); g_free(iter_name); if (func(data, attr_type, &attr, attr_iter)) { DBusMessageIter iter1; reply = dbus_message_new_method_return(message); dbus_message_iter_init_append(reply, &iter1); encode_attr(&iter1, &attr); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } return dbus_error_no_data_available(connection, message); } static DBusHandlerResult request_command(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) { DBusMessageIter iter; struct attr attr; char *command; if (! data) data = object_get_from_message(message, type); if (! data) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &command); dbus_message_iter_next(&iter); if (func(data, attr_callback_list, &attr, NULL)) { int valid=0; callback_list_call_attr_4(attr.u.callback_list, attr_command, command, NULL, NULL, &valid); } return empty_reply(connection, message); } static DBusHandlerResult request_set_add_remove_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, struct attr *attr)) { struct attr attr; int ret; if (! data) data = object_get_from_message(message, type); if (! data) return dbus_error_invalid_object_path(connection, message); if (decode_attr(message, &attr)) { ret=(*func)(data, &attr); destroy_attr(&attr); if (ret) return empty_reply(connection, message); dbg(lvl_error,"failed to set/add/remove attr\n"); } else { dbg(lvl_error,"failed to decode attr\n"); } return dbus_error_invalid_parameter(connection, message); } /* callback */ static void dbus_callback_emit_signal(struct dbus_callback *dbus_callback) { DBusMessage* msg; msg = dbus_message_new_signal(object_path, service_name, dbus_callback->signal); if (msg) { dbus_connection_send(connection, msg, &dbus_serial); dbus_connection_flush(connection); dbus_message_unref(msg); } } static void request_callback_destroy_do(struct dbus_callback *data) { callback_destroy(data->callback); g_free(data->signal); g_free(data); } static DBusHandlerResult request_callback_destroy(DBusConnection *connection, DBusMessage *message) { return request_destroy(connection, message, "callback", NULL, (void (*)(void *)) request_callback_destroy_do); } static DBusHandlerResult request_callback_new(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; DBusMessage *reply; struct dbus_callback *callback; char *signal,*opath; enum attr_type type; dbus_message_iter_init(message, &iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &signal); dbus_message_iter_next(&iter); callback=g_new0(struct dbus_callback, 1); callback->signal=g_strdup(signal); if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) { type=attr_type_get_from_message(&iter); callback->callback=callback_new_attr_1(callback_cast(dbus_callback_emit_signal), type, callback); } else callback->callback=callback_new_1(callback_cast(dbus_callback_emit_signal), callback); opath=object_new("callback", callback); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } /* config */ static DBusHandlerResult request_config_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "config", config, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))config_get_attr); } static DBusHandlerResult request_config_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "config", (struct attr_iter * (*)(void))config_attr_iter_new); } static DBusHandlerResult request_config_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "config", (void (*)(struct attr_iter *))config_attr_iter_destroy); } /* graphics */ static DBusHandlerResult request_graphics_get_data(DBusConnection *connection, DBusMessage *message) { struct graphics *graphics; char *data; struct graphics_data_image *image; DBusMessage *reply; graphics = object_get_from_message(message, "graphics"); if (! graphics) return dbus_error_invalid_object_path(connection, message); if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID)) return dbus_error_invalid_parameter(connection, message); image=graphics_get_data(graphics, data); if (image) { DBusMessageIter iter1,iter2; reply = dbus_message_new_method_return(message); #if 0 dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); #endif dbus_message_iter_init_append(reply, &iter1); dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "y", &iter2); if (image->data && image->size) dbus_message_iter_append_fixed_array(&iter2, DBUS_TYPE_BYTE, &image->data, image->size); dbus_message_iter_close_container(&iter1, &iter2); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } return dbus_error_no_data_available(connection, message); } /* gui */ static DBusHandlerResult request_gui_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); } static DBusHandlerResult request_gui_command(DBusConnection *connection, DBusMessage *message) { return request_command(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); } static DBusHandlerResult request_graphics_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "graphics", NULL, (int (*)(void *, struct attr *))graphics_set_attr); } /* layout */ static DBusHandlerResult request_layout_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "layout", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))layout_get_attr); } /* map */ static DBusHandlerResult request_map_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "map", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))map_get_attr); } static DBusHandlerResult request_map_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "map", NULL, (int (*)(void *, struct attr *))map_set_attr); } static DBusHandlerResult request_map_dump(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; struct map *map; map=object_get_from_message(message, "map"); if (! map) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if(!strcmp(dbus_message_iter_get_signature(&iter), "s")) { char *file; FILE *f; dbus_message_iter_get_basic(&iter, &file); /* dbg(0,"File '%s'\n",file); */ f=fopen(file,"w"); map_dump_filedesc(map,f); fclose(f); return empty_reply(connection, message); } return dbus_error_invalid_parameter(connection, message); } /* mapset */ static DBusHandlerResult request_mapset_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "mapset", (struct attr_iter * (*)(void))mapset_attr_iter_new); } static DBusHandlerResult request_mapset_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "mapset", (void (*)(struct attr_iter *))mapset_attr_iter_destroy); } static DBusHandlerResult request_mapset_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "mapset", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))mapset_get_attr); } /* navigation */ static DBusHandlerResult request_navigation_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "navigation", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navigation_get_attr); } /* osd */ static DBusHandlerResult request_osd_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "osd", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))osd_get_attr); } static DBusHandlerResult request_osd_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "osd", NULL, (int (*)(void *, struct attr *))osd_set_attr); } /* roadprofile */ static DBusHandlerResult request_roadprofile_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "roadprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))roadprofile_get_attr); } static DBusHandlerResult request_roadprofile_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "roadprofile", NULL, (int (*)(void *, struct attr *))roadprofile_set_attr); } static DBusHandlerResult request_roadprofile_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "roadprofile", (struct attr_iter * (*)(void))roadprofile_attr_iter_new); } static DBusHandlerResult request_roadprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "roadprofile", (void (*)(struct attr_iter *))roadprofile_attr_iter_destroy); } /* route */ static DBusHandlerResult request_route_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "route", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))route_get_attr); } static DBusHandlerResult request_route_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_set_attr); } static DBusHandlerResult request_route_add_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_add_attr); } static DBusHandlerResult request_route_remove_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_remove_attr); } static DBusHandlerResult request_route_destroy(DBusConnection *connection, DBusMessage *message) { return request_destroy(connection, message, "route", NULL, (void (*)(void *)) route_destroy); } static DBusHandlerResult request_route_dup(DBusConnection *connection, DBusMessage *message) { return request_dup(connection, message, "route", NULL, (void *(*)(void *)) route_dup); } /* navit */ static DBusHandlerResult request_navit_draw(DBusConnection *connection, DBusMessage *message) { struct navit *navit; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); navit_draw(navit); return empty_reply(connection, message); } /** * Extracts a struct point from a DBus message * * @param message The DBus message * @param iter Sort of pointer that points on that (ii)-object in the message * @param p Pointer where the data should get stored * @returns Returns 1 when everything went right, otherwise 0 */ static int point_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct point *p) { DBusMessageIter iter2; dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(iter)); dbus_message_iter_recurse(iter, &iter2); if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) return 0; dbus_message_iter_get_basic(&iter2, &p->x); dbus_message_iter_next(&iter2); if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) return 0; dbus_message_iter_get_basic(&iter2, &p->y); dbg(lvl_debug, " x -> %x y -> %x\n", p->x, p->y); dbus_message_iter_next(&iter2); if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INVALID) return 0; return 1; } /** * @brief Shows up a message * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the coordinates * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_add_message(DBusConnection *connection, DBusMessage *message) { struct navit *navit; char *usermessage; DBusMessageIter iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbus_message_iter_get_basic(&iter, &usermessage); navit_add_message(navit, usermessage); return empty_reply(connection, message); } /** * @brief Centers the screen on a specified position \a pc on the world * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the coordinates * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_set_center(DBusConnection *connection, DBusMessage *message) { struct pcoord pc; struct navit *navit; DBusMessageIter iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!pcoord_get_from_message(message, &iter, &pc)) return dbus_error_invalid_parameter(connection, message); navit_set_center(navit, &pc, 0); return empty_reply(connection, message); } /** * @brief Centers the screen on a specified position \a p shown on the screen * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the x and y value * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_set_center_screen(DBusConnection *connection, DBusMessage *message) { struct point p; struct navit *navit; DBusMessageIter iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!point_get_from_message(message, &iter, &p)) return dbus_error_invalid_parameter(connection, message); navit_set_center_screen(navit, &p, 0); return empty_reply(connection, message); } /** * @brief Sets the layout to \a new_layout_name extracted from \a message * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage containing the name of the layout * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_set_layout(DBusConnection *connection, DBusMessage *message) { char *new_layout_name; struct navit *navit; struct attr attr; struct attr_iter *iter; navit=object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &new_layout_name, DBUS_TYPE_INVALID)) return dbus_error_invalid_parameter(connection, message); iter=navit_attr_iter_new(); while(navit_get_attr(navit, attr_layout, &attr, iter)) { if (strcmp(attr.u.layout->name, new_layout_name) == 0) { navit_set_attr(navit, &attr); } } return empty_reply(connection, message); } /** * @brief Gracefully exit Navit by registering a one-second callback to allow clean shutdown of the dbus connection * @param connection The DBusConnection object through which \a message arrived * @param message The DBusMessage * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_quit(DBusConnection *connection, DBusMessage *message) { dbg(lvl_debug,"Got a quit request from DBUS\n"); struct attr navit; navit.type=attr_navit; struct navit *nav; nav = object_get_from_message(message, "navit"); if (! nav) return dbus_error_invalid_object_path(connection, message); navit.u.navit=nav; config_remove_attr(config, &navit); struct callback *callback; callback=callback_new_1(callback_cast(event_main_loop_quit), NULL); event_add_timeout(1000, 1, callback); return empty_reply(connection, message); } static DBusHandlerResult request_navit_zoom(DBusConnection *connection, DBusMessage *message) { int factor; struct point p, *pp=NULL; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(&iter)); dbus_message_iter_get_basic(&iter, &factor); if (dbus_message_iter_has_next(&iter)) { dbus_message_iter_next(&iter); if (!point_get_from_message(message, &iter, &p)) return dbus_error_invalid_parameter(connection, message); pp=&p; } if (factor > 1) navit_zoom_in(navit, factor, pp); else if (factor < -1) navit_zoom_out(navit, 0-factor, pp); return empty_reply(connection, message); } /** * @brief Exports the current route as a GPX file * @param connection The DBusConnection object through which a message arrived * @param message The DBusMessage including the 'filename' parameter * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_zoom_to_route(DBusConnection *connection, DBusMessage *message) { struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(&iter)); navit_zoom_to_route(navit,0); return empty_reply(connection, message); } static DBusHandlerResult request_navit_route_export_gpx(DBusConnection *connection, DBusMessage *message) { char * filename; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbus_message_iter_get_basic(&iter, &filename); struct navigation *nav = navit_get_navigation(navit); if(!nav) { return dbus_error_navigation_not_configured(connection, message); } dbg(lvl_debug,"Dumping route from dbus to %s\n", filename); struct map * map=NULL; struct map_rect * mr=NULL; struct item *item = NULL; struct attr attr; struct coord c; struct coord_geo g; char *header = "\n" "\n" "\n"; char *trailer = "\n\n"; map = navigation_get_map(nav); if(map) mr = map_rect_new(map,NULL); FILE *fp; fp = fopen(filename,"w"); fprintf(fp, "%s", header); while((item = map_rect_get_item(mr))) { if(item_attr_get(item,attr_navigation_long,&attr)) { item_coord_get(item, &c, 1); transform_to_geo (projection_mg, &c, &g); fprintf(fp,"%s%s\n",g.lng, g.lat, item_to_name(item->type), map_convert_string_tmp(item->map,attr.u.str)); } } fprintf(fp,"%s",trailer); fclose(fp); return empty_reply(connection, message); } /** * @brief Exports the current route as a GeoJSON file * @param connection The DBusConnection object through which a message arrived * @param message The DBusMessage including the 'filename' parameter * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ static DBusHandlerResult request_navit_route_export_geojson(DBusConnection *connection, DBusMessage *message) { char * filename; struct point p; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbus_message_iter_get_basic(&iter, &filename); if (dbus_message_iter_has_next(&iter)) { dbus_message_iter_next(&iter); if (!point_get_from_message(message, &iter, &p)) return dbus_error_invalid_parameter(connection, message); } dbg(lvl_debug,"Dumping route from dbus to %s\n", filename); struct map * map=NULL; struct navigation * nav = NULL; struct map_rect * mr=NULL; struct item *item = NULL; struct attr attr; struct coord c; struct coord_geo g; char *header = "{\n" " \"type\": \"FeatureCollection\",\n" " \"features\": [\n" " {\n" " \"type\": \"Feature\",\n" " \"properties\": {\n" " \"name\": \"Navit route export\",\n" " \"stroke\": \"red\",\n" " \"stroke-width\": \"5px\"\n" " },\n" " \"geometry\": {\n" " \"type\": \"LineString\",\n" " \"coordinates\": [\n"; nav = navit_get_navigation(navit); if(!nav) { return dbus_error_navigation_not_configured(connection, message); } map = navigation_get_map(nav); if(map) mr = map_rect_new(map,NULL); FILE *fp; fp = fopen(filename,"w"); fprintf(fp, "%s", header); int is_first=1; char * instructions; instructions=g_strdup(""); while((item = map_rect_get_item(mr))) { if(item_attr_get(item,attr_navigation_long,&attr)) { item_coord_get(item, &c, 1); transform_to_geo (projection_mg, &c, &g); if(!is_first){ fprintf(fp,",\n"); instructions=g_strconcat_printf(instructions,",\n"); } fprintf(fp,"[ %4.16f, %4.16f ]",g.lng, g.lat); instructions=g_strconcat_printf(instructions, g_strdup_printf(" { \"type\": \"Feature\", \"properties\": { \"Instruction\": \"%s\", \"name\": \"\" }, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ %4.16f, %4.16f ] } }", map_convert_string_tmp(item->map,attr.u.str), g.lng, g.lat)); /* fprintf(fp,"%s%s\n",g.lng, g.lat, item_to_name(item->type), map_convert_string_tmp(item->map,attr.u.str)); */ is_first=0; } } fprintf(fp," ]}\n },\n%s ]\n }\n",instructions); fclose(fp); return empty_reply(connection, message); } static DBusHandlerResult request_navit_block(DBusConnection *connection, DBusMessage *message) { int mode; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbus_message_iter_get_basic(&iter, &mode); navit_block(navit, mode); return empty_reply(connection, message); } static DBusHandlerResult request_navit_resize(DBusConnection *connection, DBusMessage *message) { struct navit *navit; int w, h; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(&iter)); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &w); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &h); dbg(lvl_debug, " w -> %i h -> %i\n", w, h); navit_handle_resize(navit, w, h); return empty_reply(connection, message); } static DBusHandlerResult request_navit_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "navit", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navit_get_attr); } static DBusHandlerResult request_navit_attr_iter(DBusConnection *connection, DBusMessage *message) { DBusMessage *reply; struct attr_iter *attr_iter=navit_attr_iter_new(); char *opath=object_new("navit_attr_iter",attr_iter); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_navit_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { struct attr_iter *attr_iter; DBusMessageIter iter; dbus_message_iter_init(message, &iter); attr_iter=object_get_from_message_arg(&iter, "navit_attr_iter"); if (! attr_iter) return dbus_error_invalid_object_path_parameter(connection, message); navit_attr_iter_destroy(attr_iter); return empty_reply(connection, message); } static DBusHandlerResult request_navit_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_set_attr); } static DBusHandlerResult request_navit_add_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_add_attr); } static DBusHandlerResult request_navit_remove_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_remove_attr); } static DBusHandlerResult request_navit_set_position(DBusConnection *connection, DBusMessage *message) { struct pcoord pc; struct navit *navit; DBusMessageIter iter; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!pcoord_get_from_message(message, &iter, &pc)) return dbus_error_invalid_parameter(connection, message); navit_set_position(navit, &pc); return empty_reply(connection, message); } static DBusHandlerResult request_navit_set_destination(DBusConnection *connection, DBusMessage *message) { struct pcoord pc; struct navit *navit; DBusMessageIter iter; char *description; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!pcoord_get_from_message(message, &iter, &pc)) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_next(&iter); dbus_message_iter_get_basic(&iter, &description); dbg(lvl_debug, " destination -> %s\n", description); navit_set_destination(navit, &pc, description, 1); return empty_reply(connection, message); } static DBusHandlerResult request_navit_clear_destination(DBusConnection *connection, DBusMessage *message) { struct navit *navit; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); navit_set_destination(navit, NULL, NULL, 0); return empty_reply(connection, message); } static DBusHandlerResult request_navit_evaluate(DBusConnection *connection, DBusMessage *message) { struct navit *navit; char *command; char *result; struct attr attr; DBusMessage *reply; int error; navit = object_get_from_message(message, "navit"); if (! navit) return dbus_error_invalid_object_path(connection, message); attr.type=attr_navit; attr.u.navit=navit; if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &command, DBUS_TYPE_INVALID)) return dbus_error_invalid_parameter(connection, message); result=command_evaluate_to_string(&attr, command, &error); reply = dbus_message_new_method_return(message); if (error) dbus_message_append_args(reply, DBUS_TYPE_INT32, &error, DBUS_TYPE_INVALID); else if (result) dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } /* search_list */ static DBusHandlerResult request_search_list_destroy(DBusConnection *connection, DBusMessage *message) { return request_destroy(connection, message, "search_list", NULL, (void (*)(void *)) search_list_destroy); } void request_search_list_common(struct search_list_common *slc, DBusMessageIter *iter4) { if (slc->postal) encode_dict_string_variant_string(iter4, "postal", slc->postal); if (slc->postal_mask) encode_dict_string_variant_string(iter4, "postal_mask", slc->postal_mask); } static DBusHandlerResult request_search_list_get_result(DBusConnection *connection, DBusMessage *message) { struct search_list *search_list; struct search_list_result *result; DBusMessage *reply; DBusMessageIter iter,iter2,iter3,iter4; char *country="country"; char *town="town"; char *street="street"; char *house_number="housenumber"; search_list = object_get_from_message(message, "search_list"); if (! search_list) return dbus_error_invalid_object_path(connection, message); result=search_list_get_result(search_list); if (!result) return dbus_error_no_data_available(connection, message); reply = dbus_message_new_method_return(message); dbus_message_iter_init_append(reply, &iter); dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &result->id); pcoord_encode(&iter, result->c); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &iter2); if (result->country && (result->country->car || result->country->iso2 || result->country->iso3 || result->country->name)) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &country); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); if (result->country->car) encode_dict_string_variant_string(&iter4, "car", result->country->car); if (result->country->iso2) encode_dict_string_variant_string(&iter4, "iso2", result->country->iso2); if (result->country->iso3) encode_dict_string_variant_string(&iter4, "iso3", result->country->iso3); if (result->country->name) encode_dict_string_variant_string(&iter4, "name", result->country->name); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } if (result->town && (result->town->common.district_name || result->town->common.town_name)) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &town); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); request_search_list_common(&result->town->common,&iter4); if (result->town->common.district_name) encode_dict_string_variant_string(&iter4, "district", result->town->common.district_name); if (result->town->common.town_name) encode_dict_string_variant_string(&iter4, "name", result->town->common.town_name); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } if (result->street && result->street->name) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &street); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); request_search_list_common(&result->street->common,&iter4); if (result->street->name) encode_dict_string_variant_string(&iter4, "name", result->street->name); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } if (result->house_number && result->house_number->house_number) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &house_number); dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); request_search_list_common(&result->house_number->common,&iter4); encode_dict_string_variant_string(&iter4, "name", result->house_number->house_number); dbus_message_iter_close_container(&iter3, &iter4); dbus_message_iter_close_container(&iter2, &iter3); } dbus_message_iter_close_container(&iter, &iter2); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_search_list_new(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; DBusMessage *reply; struct mapset *mapset; struct search_list *search_list; char *opath; dbus_message_iter_init(message, &iter); mapset=object_get_from_message_arg(&iter, "mapset"); if (! mapset) return dbus_error_invalid_object_path_parameter(connection, message); search_list=search_list_new(mapset); opath=object_new("search_list", search_list); reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult request_search_list_search(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; struct search_list *search_list; struct attr attr; int partial; search_list = object_get_from_message(message, "search_list"); if (! search_list) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); if (!decode_attr_from_iter(&iter, &attr)) return dbus_error_invalid_parameter(connection, message); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &partial); search_list_search(search_list, &attr, partial); return empty_reply(connection, message); } static DBusHandlerResult request_search_list_select(DBusConnection *connection, DBusMessage *message) { DBusMessageIter iter; struct search_list *search_list; int id, mode; enum attr_type attr_type; search_list = object_get_from_message(message, "search_list"); if (! search_list) return dbus_error_invalid_object_path(connection, message); dbus_message_iter_init(message, &iter); attr_type=decode_attr_type_from_iter(&iter); if (attr_type == attr_none) return dbus_error_invalid_parameter(connection, message); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &id); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) return dbus_error_invalid_parameter(connection, message); dbus_message_iter_get_basic(&iter, &mode); search_list_select(search_list, attr_type, id, mode); return empty_reply(connection, message); } /* tracking */ static DBusHandlerResult request_tracking_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "tracking", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))tracking_get_attr); } /* vehicle */ static DBusHandlerResult request_vehicle_set_attr(DBusConnection *connection, DBusMessage *message) { struct vehicle *vehicle; struct attr attr; int ret; vehicle = object_get_from_message(message, "vehicle"); if (! vehicle) return dbus_error_invalid_object_path(connection, message); if (decode_attr(message, &attr)) { ret=vehicle_set_attr(vehicle, &attr); destroy_attr(&attr); if (ret) return empty_reply(connection, message); } return dbus_error_invalid_parameter(connection, message); } /* vehicleprofile */ static DBusHandlerResult request_vehicleprofile_get_attr(DBusConnection *connection, DBusMessage *message) { return request_get_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))vehicleprofile_get_attr); } static DBusHandlerResult request_vehicleprofile_set_attr(DBusConnection *connection, DBusMessage *message) { return request_set_add_remove_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, struct attr *))vehicleprofile_set_attr); } static DBusHandlerResult request_vehicleprofile_attr_iter(DBusConnection *connection, DBusMessage *message) { return request_attr_iter(connection, message, "vehicleprofile", (struct attr_iter * (*)(void))vehicleprofile_attr_iter_new); } static DBusHandlerResult request_vehicleprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { return request_attr_iter_destroy(connection, message, "vehicleprofile", (void (*)(struct attr_iter *))vehicleprofile_attr_iter_destroy); } struct dbus_method { char *path; char *method; char *signature; char *signature_name; char *response; char *response_name; DBusHandlerResult(*func)(DBusConnection *connection, DBusMessage *message); } dbus_methods[] = { {"", "attr_iter", "", "", "o", "attr_iter", request_config_attr_iter}, {"", "attr_iter_destroy", "o", "attr_iter", "", "", request_config_attr_iter_destroy}, {"", "get_attr", "s", "attrname", "sv", "attrname,value",request_config_get_attr}, {"", "get_attr_wi", "so", "attrname,attr_iter", "sv", "attrname,value",request_config_get_attr}, {"", "callback_new", "s", "signalname", "o", "callback",request_callback_new}, {"", "callback_attr_new", "ss", "signalname,attribute", "o", "callback",request_callback_new}, {"", "search_list_new", "o", "mapset", "o", "search",request_search_list_new}, {".callback","destroy", "", "", "", "", request_callback_destroy}, {".graphics","get_data", "s", "type", "ay", "data", request_graphics_get_data}, {".graphics","set_attr", "sv", "attribute,value", "", "", request_graphics_set_attr}, {".gui", "get_attr", "s", "attribute", "sv", "attrname,value", request_gui_get_attr}, {".gui", "command_parameter", "sa{sa{sv}}","command,parameter", "a{sa{sv}}", "return", request_gui_command}, {".gui", "command", "s", "command", "a{sa{sv}}", "return", request_gui_command}, {".navit", "draw", "", "", "", "", request_navit_draw}, {".navit", "add_message", "s", "message", "", "", request_navit_add_message}, {".navit", "set_center_by_string","s", "(coordinates)", "", "", request_navit_set_center}, {".navit", "set_center", "(is)", "(projection,coordinates)", "", "", request_navit_set_center}, {".navit", "set_center", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_center}, {".navit", "set_center_screen", "(ii)", "(pixel_x,pixel_y)", "", "", request_navit_set_center_screen}, {".navit", "set_layout", "s", "layoutname", "", "", request_navit_set_layout}, {".navit", "zoom", "i(ii)", "factor(pixel_x,pixel_y)", "", "", request_navit_zoom}, {".navit", "zoom", "i", "factor", "", "", request_navit_zoom}, {".navit", "zoom_to_route", "", "", "", "", request_navit_zoom_to_route}, {".navit", "quit", "", "", "", "", request_navit_quit}, {".navit", "export_as_gpx", "s", "filename", "", "", request_navit_route_export_gpx}, {".navit", "export_as_geojson", "s", "filename", "", "", request_navit_route_export_geojson}, {".navit", "block", "i", "mode", "", "", request_navit_block}, {".navit", "resize", "ii", "upperleft,lowerright", "", "", request_navit_resize}, {".navit", "attr_iter", "", "", "o", "attr_iter", request_navit_attr_iter}, {".navit", "attr_iter_destroy", "o", "attr_iter", "", "", request_navit_attr_iter_destroy}, {".navit", "get_attr", "s", "attribute", "sv", "attrname,value", request_navit_get_attr}, {".navit", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_navit_get_attr}, {".navit", "set_attr", "sv", "attribute,value", "", "", request_navit_set_attr}, {".navit", "add_attr", "sv", "attribute,value", "", "", request_navit_add_attr}, {".navit", "remove_attr", "sv", "attribute,value", "", "", request_navit_remove_attr}, {".navit", "set_position", "s", "(coordinates)", "", "", request_navit_set_position}, {".navit", "set_position", "(is)", "(projection,coordinated)", "", "", request_navit_set_position}, {".navit", "set_position", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_position}, {".navit", "set_destination", "ss", "coordinates,comment", "", "", request_navit_set_destination}, {".navit", "set_destination", "(is)s", "(projection,coordinates)comment", "", "", request_navit_set_destination}, {".navit", "set_destination", "(iii)s", "(projection,longitude,latitude)comment", "", "", request_navit_set_destination}, {".navit", "clear_destination", "", "", "", "", request_navit_clear_destination}, {".navit", "evaluate", "s", "command", "s", "", request_navit_evaluate}, {".layout", "get_attr", "s", "attribute", "sv", "attrname,value", request_layout_get_attr}, {".map", "get_attr", "s", "attribute", "sv", "attrname,value", request_map_get_attr}, {".map", "set_attr", "sv", "attribute,value", "", "", request_map_set_attr}, {".map", "dump", "s", "file", "", "", request_map_dump}, {".mapset", "attr_iter", "", "", "o", "attr_iter", request_mapset_attr_iter}, {".mapset", "attr_iter_destroy", "o", "attr_iter", "", "", request_mapset_attr_iter_destroy}, {".mapset", "get_attr", "s", "attribute", "sv", "attrname,value", request_mapset_get_attr}, {".mapset", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_mapset_get_attr}, {".navigation","get_attr", "s", "attribute", "", "", request_navigation_get_attr}, {".osd", "get_attr", "s", "attribute", "sv", "attrname,value", request_osd_get_attr}, {".osd", "set_attr", "sv", "attribute,value", "", "", request_osd_set_attr}, {".roadprofile", "get_attr", "s", "attribute", "sv", "attrname,value", request_roadprofile_get_attr}, {".roadprofile", "get_attr_wi", "so", "attribute,attr_iter", "", "", request_roadprofile_get_attr}, {".roadprofile", "set_attr", "sv", "attribute,value", "", "", request_roadprofile_set_attr}, {".roadprofile", "attr_iter", "", "", "o", "attr_iter", request_roadprofile_attr_iter}, {".roadprofile", "attr_iter_destroy","o", "attr_iter", "", "", request_roadprofile_attr_iter_destroy}, {".route", "get_attr", "s", "attribute", "sv", "attrname,value", request_route_get_attr}, {".route", "set_attr", "sv", "attribute,value", "", "", request_route_set_attr}, {".route", "add_attr", "sv", "attribute,value", "", "", request_route_add_attr}, {".route", "remove_attr", "sv", "attribute,value", "", "", request_route_remove_attr}, {".route", "destroy", "", "", "", "", request_route_destroy}, {".route", "dup", "", "", "", "", request_route_dup}, {".search_list","destroy", "", "", "", "", request_search_list_destroy}, {".search_list","destroy", "", "", "", "", request_search_list_destroy}, {".search_list","destroy", "", "", "", "", request_search_list_destroy}, {".search_list","get_result", "", "", "i(iii)a{sa{sv}}", "id,coord,dict", request_search_list_get_result}, {".search_list","search", "svi", "attribute,value,partial", "", "", request_search_list_search}, {".search_list","select", "sii", "attribute_type,id,mode", "", "", request_search_list_select}, {".tracking","get_attr", "s", "attribute", "", "", request_tracking_get_attr}, {".vehicle","set_attr", "sv", "attribute,value", "", "", request_vehicle_set_attr}, {".vehicleprofile","get_attr", "s", "attribute", "", "", request_vehicleprofile_get_attr}, {".vehicleprofile","get_attr_wi", "so", "attribute,attr_iter", "", "", request_vehicleprofile_get_attr}, {".vehicleprofile","set_attr", "sv", "attribute,value", "", "", request_vehicleprofile_set_attr}, {".vehicleprofile","attr_iter", "", "", "o", "attr_iter", request_vehicleprofile_attr_iter}, {".vehicleprofile","attr_iter_destroy","o", "attr_iter", "", "", request_vehicleprofile_attr_iter_destroy}, }; static char * introspect_path(const char *object) { char *ret; int i; char *def=".default_"; int def_len=strlen(def); if (strncmp(object, object_path, strlen(object_path))) return NULL; ret=g_strdup(object+strlen(object_path)); dbg(lvl_debug,"path=%s\n",ret); for (i = strlen(ret)-1 ; i >= 0 ; i--) { if (ret[i] == '/' || (ret[i] >= '0' && ret[i] <= '9')) ret[i]='\0'; else break; } for (i = 0 ; i < strlen(ret); i++) if (ret[i] == '/') ret[i]='.'; for (i = strlen(ret)-1 ; i >= 0 ; i--) { if (!strncmp(ret+i, def, def_len)) { memmove(ret+1,ret+i+def_len,strlen(ret+i+def_len)+1); break; } } return ret; } static char * generate_navitintrospectxml(const char *object) { int i,methods_size,n=0; char *navitintrospectxml; char *path=introspect_path(object); if (!path) return NULL; dbg(lvl_debug,"path=%s\n",path); // write header and make navit introspectable navitintrospectxml = g_strdup_printf("%s%s%s\n", navitintrospectxml_head1, object, navitintrospectxml_head2); methods_size=sizeof(dbus_methods)/sizeof(struct dbus_method); for (i = 0 ; i < methods_size ; i++) { // start new interface if it's the first method or it changed if (strcmp(dbus_methods[i].path, path)) continue; if ((n == 0) || strcmp(dbus_methods[i-1].path, dbus_methods[i].path)) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", service_name, dbus_methods[i].path); n++; // start the new method navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].method); // set input signature if existent if (strcmp(dbus_methods[i].signature, "")) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].signature_name, dbus_methods[i].signature); // set response signature if existent if (strcmp(dbus_methods[i].response, "")) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].response_name, dbus_methods[i].response); // close the method navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n"); // close the interface if we reached the last method or the interface changes if ((methods_size == i+1) || ((methods_size > i+1) && strcmp(dbus_methods[i+1].path, dbus_methods[i].path))) navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n\n"); } // close the "mother tag" navitintrospectxml = g_strconcat_printf(navitintrospectxml, "\n"); return navitintrospectxml; } static DBusHandlerResult navit_handler_func(DBusConnection *connection, DBusMessage *message, void *user_data) { int i; char *path; dbg(lvl_debug,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) { DBusMessage *reply; char *navitintrospectxml = generate_navitintrospectxml(dbus_message_get_path(message)); dbg(lvl_debug,"Introspect %s:Result:%s\n",dbus_message_get_path(message), navitintrospectxml); if (navitintrospectxml) { reply = dbus_message_new_method_return(message); dbus_message_append_args(reply, DBUS_TYPE_STRING, &navitintrospectxml, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); g_free(navitintrospectxml); return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } for (i = 0 ; i < sizeof(dbus_methods)/sizeof(struct dbus_method) ; i++) { path=g_strdup_printf("%s%s", service_name, dbus_methods[i].path); if (dbus_message_is_method_call(message, path, dbus_methods[i].method) && dbus_message_has_signature(message, dbus_methods[i].signature)) { g_free(path); return dbus_methods[i].func(connection, message); } g_free(path); } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static DBusObjectPathVTable dbus_navit_vtable = { NULL, navit_handler_func, NULL }; #if 0 DBusHandlerResult filter(DBusConnection *connection, DBusMessage *message, void *user_data) { dbg(lvl_debug,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } #endif static int dbus_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) { DBusMessage* msg; char *opath=object_new("navit",navit); char *interface=g_strdup_printf("%s%s", service_name, ".navit"); dbg(lvl_debug,"enter %s %s %s\n",opath,command,interface); msg = dbus_message_new_signal(opath, interface, "signal"); if (msg) { DBusMessageIter iter1,iter2,iter3; dbus_message_iter_init_append(msg, &iter1); dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "{sv}", &iter2); if (in) { while (*in) { dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); encode_attr(&iter3, *in); dbus_message_iter_close_container(&iter2, &iter3); in++; } } dbus_message_iter_close_container(&iter1, &iter2); dbus_connection_send(connection, msg, &dbus_serial); dbus_connection_flush(connection); dbus_message_unref(msg); } g_free(interface); return 0; } static struct command_table commands[] = { {"dbus_send_signal",command_cast(dbus_cmd_send_signal)}, }; static void dbus_main_navit(struct navit *navit, int added) { struct attr attr; if (added==1) { DBusMessage* msg; char *opath=object_new("navit",navit); char *interface=g_strdup_printf("%s%s", service_name, ".navit"); command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); navit_add_attr(navit, &attr); msg = dbus_message_new_signal(opath, interface, "startup"); dbus_connection_send(connection, msg, &dbus_serial); dbus_connection_flush(connection); dbus_message_unref(msg); g_free(interface); } } void plugin_init(void) { DBusError error; struct attr callback; object_hash=g_hash_table_new(g_str_hash, g_str_equal); object_hash_rev=g_hash_table_new(NULL, NULL); object_count=g_hash_table_new(g_str_hash, g_str_equal); dbg(lvl_debug,"enter\n"); dbus_error_init(&error); #ifdef DBUS_USE_SYSTEM_BUS connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); #else connection = dbus_bus_get(DBUS_BUS_SESSION, &error); #endif if (!connection) { dbg(lvl_error,"Failed to open connection to session message bus: %s\n", error.message); dbus_error_free(&error); return; } dbus_connection_setup_with_g_main(connection, NULL); #if 0 dbus_connection_add_filter(connection, filter, NULL, NULL); dbus_bus_add_match(connection, "type='signal',""interface='" DBUS_INTERFACE_DBUS "'", &error); #endif dbus_connection_register_fallback(connection, object_path, &dbus_navit_vtable, NULL); dbus_bus_request_name(connection, service_name, 0, &error); if (dbus_error_is_set(&error)) { dbg(lvl_error,"Failed to request name: %s", error.message); dbus_error_free (&error); } callback.type=attr_callback; callback.u.callback=callback_new_attr_0(callback_cast(dbus_main_navit),attr_navit); config_add_attr(config, &callback); } navit-0.5.0+dfsg.1/navit/binding/dbus/eval.py000077500000000000000000000007671264204753600207320ustar00rootroot00000000000000#! /usr/bin/python import dbus import sys bus = dbus.SessionBus() conn = bus.get_object('org.navit_project.navit', '/org/navit_project/navit') iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit'); iter=iface.attr_iter(); navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi('navit',iter)[1]); iface.attr_iter_destroy(iter); navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit'); print navit_iface.evaluate(sys.argv[1]); navit-0.5.0+dfsg.1/navit/binding/dbus/navit.introspect000066400000000000000000000020441264204753600226510ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/binding/dbus/org.navit_project.navit.service.in000066400000000000000000000001011264204753600261500ustar00rootroot00000000000000[D-BUS Service] Name=org.navit_project.navit Exec=@bindir@/navit navit-0.5.0+dfsg.1/navit/binding/dbus/test.py000077500000000000000000000007621264204753600207550ustar00rootroot00000000000000#! /usr/bin/python import dbus bus = dbus.SessionBus() conn = bus.get_object('org.navit_project.navit', '/org/navit_project/navit') iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit'); iter=iface.attr_iter(); navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi("navit",iter)[1]); iface.attr_iter_destroy(iter); navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit'); navit_iface.set_center((1,0x138a4a,0x5d773f)); navit-0.5.0+dfsg.1/navit/binding/python/000077500000000000000000000000001264204753600200005ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/binding/python/CMakeLists.txt000066400000000000000000000002261264204753600225400ustar00rootroot00000000000000include_directories(${PYTHON_INCLUDE_DIRS}) module_add_library(binding_python attr.c binding_python.c config.c navigation.c navit.c pcoord.c route.c) navit-0.5.0+dfsg.1/navit/binding/python/Makefile.am000066400000000000000000000006001264204753600220300ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @PYTHON_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_python modulebinding_LTLIBRARIES = libbinding_python.la libbinding_python_la_SOURCES = binding_python.c config.c navit.c pcoord.c route.c navigation.c attr.c common.h libbinding_python_la_LIBADD = @PYTHON_LIBS@ libbinding_python_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/binding/python/attr.c000066400000000000000000000041201264204753600211130ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "attr.h" typedef struct { PyObject_HEAD int ref; struct attr *attr; } attrObject; static PyObject * attr_func(attrObject *self, PyObject *args) { const char *file; int ret; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; ret=0; return Py_BuildValue("i",ret); } static PyMethodDef attr_methods[] = { {"func", (PyCFunction) attr_func, METH_VARARGS }, {NULL, NULL }, }; static PyObject * attr_getattr_py(PyObject *self, char *name) { return Py_FindMethod(attr_methods, self, name); } static void attr_destroy_py(attrObject *self) { if (! self->ref) attr_free(self->attr); } PyTypeObject attr_Type = { Obj_HEAD .tp_name="attr", .tp_basicsize=sizeof(attrObject), .tp_dealloc=(destructor)attr_destroy_py, .tp_getattr=attr_getattr_py, }; struct attr * attr_py_get(PyObject *self) { return ((attrObject *)self)->attr; } PyObject * attr_new_py(PyObject *self, PyObject *args) { attrObject *ret; const char *name,*value; if (!PyArg_ParseTuple(args, "ss", &name, &value)) return NULL; ret=PyObject_NEW(attrObject, &attr_Type); ret->attr=attr_new_from_text(name, value); ret->ref=0; return (PyObject *)ret; } PyObject * attr_new_py_ref(struct attr *attr) { attrObject *ret; ret=PyObject_NEW(attrObject, &attr_Type); ret->ref=1; ret->attr=attr; return (PyObject *)ret; } navit-0.5.0+dfsg.1/navit/binding/python/binding_python.c000066400000000000000000000173611264204753600231670ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "config.h" #include #include #include "coord.h" #include "projection.h" #include "debug.h" #include "item.h" #include "map.h" #include "mapset.h" #include "plugin.h" #include "debug.h" #include "item.h" #include "attr.h" #include "xmlconfig.h" #if defined(MS_WINDOWS) || defined(__CYGWIN__) #define Obj_HEAD PyObject_HEAD_INIT(NULL); #else #define Obj_HEAD PyObject_HEAD_INIT(&PyType_Type) #endif /* *** coord *** */ typedef struct { PyObject_HEAD struct coord *c; } coordObject; static void coord_destroy_py(coordObject *self); PyTypeObject coord_Type = { Obj_HEAD .tp_name="coord", .tp_basicsize=sizeof(coordObject), .tp_dealloc=(destructor)coord_destroy_py, }; /* *** map *** */ typedef struct { PyObject_HEAD int ref; struct map *m; } mapObject; static void map_destroy_py(mapObject *self); static PyObject *map_getattr_py(PyObject *self, char *name); PyTypeObject map_Type = { Obj_HEAD .tp_name="map", .tp_basicsize=sizeof(mapObject), .tp_dealloc=(destructor)map_destroy_py, .tp_getattr=map_getattr_py, }; /* *** IMPLEMENTATIONS *** */ /* *** coord *** */ static PyObject * coord_new_py(PyObject *self, PyObject *args) { coordObject *ret; int x,y; if (!PyArg_ParseTuple(args, "ii:navit.coord",&x,&y)) return NULL; ret=PyObject_NEW(coordObject, &coord_Type); ret->c=coord_new(x,y); return (PyObject *)ret; } static void coord_destroy_py(coordObject *self) { coord_destroy(self->c); } /* *** coord_rect *** */ typedef struct { PyObject_HEAD struct coord_rect *r; } coord_rectObject; static void coord_rect_destroy_py(coord_rectObject *self); PyTypeObject coord_rect_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) PyObject_HEAD_INIT(NULL); #else PyObject_HEAD_INIT(&PyType_Type) #endif .tp_name="coord_rect", .tp_basicsize=sizeof(coord_rectObject), .tp_dealloc=(destructor)coord_rect_destroy_py, }; static PyObject * coord_rect_new_py(PyObject *self, PyObject *args) { coord_rectObject *ret; coordObject *lu,*rd; if (!PyArg_ParseTuple(args, "O!O!:navit.coord_rect_rect",&coord_Type,&lu,&coord_Type,&rd)) return NULL; ret=PyObject_NEW(coord_rectObject, &coord_rect_Type); ret->r=coord_rect_new(lu->c,rd->c); return (PyObject *)ret; } static void coord_rect_destroy_py(coord_rectObject *self) { coord_rect_destroy(self->r); } /* *** map_rect *** */ typedef struct { PyObject_HEAD struct map_rect *mr; } map_rectObject; static void map_rect_destroy_py(map_rectObject *self); PyTypeObject map_rect_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) PyObject_HEAD_INIT(NULL); #else PyObject_HEAD_INIT(&PyType_Type) #endif .tp_name="map_rect", .tp_basicsize=sizeof(map_rectObject), .tp_dealloc=(destructor)map_rect_destroy_py, }; static PyObject * map_rect_new_py(mapObject *self, PyObject *args) { map_rectObject *ret; coord_rectObject *r; if (!PyArg_ParseTuple(args, "O!:navit.map_rect_rect",&coord_rect_Type,&r)) return NULL; ret=PyObject_NEW(map_rectObject, &map_rect_Type); ret->mr=map_rect_new(self->m, NULL); return (PyObject *)ret; } static void map_rect_destroy_py(map_rectObject *self) { map_rect_destroy(self->mr); } /* *** map *** */ static PyObject * map_dump_file_py(mapObject *self, PyObject *args) { const char *s; if (!PyArg_ParseTuple(args, "s",&s)) return NULL; map_dump_file(self->m, s); Py_RETURN_NONE; } static PyObject * map_set_attr_py(mapObject *self, PyObject *args) { PyObject *attr; if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) return NULL; map_set_attr(self->m, attr_py_get(attr)); Py_RETURN_NONE; } static PyMethodDef map_methods[] = { {"dump_file", (PyCFunction) map_dump_file_py, METH_VARARGS }, {"map_rect_new", (PyCFunction) map_rect_new_py, METH_VARARGS }, {"set_attr", (PyCFunction) map_set_attr_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * map_getattr_py(PyObject *self, char *name) { return Py_FindMethod(map_methods, self, name); } static PyObject * map_new_py(PyObject *self, PyObject *args) { mapObject *ret; char *type, *filename; if (!PyArg_ParseTuple(args, "ss:navit.map", &type, &filename)) return NULL; ret=PyObject_NEW(mapObject, &map_Type); ret->m=map_new(NULL,NULL); ret->ref=0; return (PyObject *)ret; } PyObject * map_py_ref(struct map *map) { mapObject *ret; ret=PyObject_NEW(mapObject, &map_Type); ret->m=map; ret->ref=1; return (PyObject *)ret; } static void map_destroy_py(mapObject *self) { if (!self->ref) map_destroy(self->m); } /* *** mapset *** */ typedef struct { PyObject_HEAD struct mapset *ms; } mapsetObject; static void mapset_destroy_py(mapsetObject *self); static PyObject *mapset_getattr_py(PyObject *self, char *name); PyTypeObject mapset_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) PyObject_HEAD_INIT(NULL); #else PyObject_HEAD_INIT(&PyType_Type) #endif .tp_name="mapset", .tp_basicsize=sizeof(mapsetObject), .tp_dealloc=(destructor)mapset_destroy_py, .tp_getattr=mapset_getattr_py, }; static PyObject * mapset_add_py(mapsetObject *self, PyObject *args) { mapObject *map; if (!PyArg_ParseTuple(args, "O:navit.mapset", &map)) return NULL; Py_INCREF(map); mapset_add_attr(self->ms, &(struct attr){attr_map,.u.map=map->m}); return Py_BuildValue(""); } static PyMethodDef mapset_methods[] = { {"add", (PyCFunction) mapset_add_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * mapset_getattr_py(PyObject *self, char *name) { return Py_FindMethod(mapset_methods, self, name); } static PyObject * mapset_new_py(PyObject *self, PyObject *args) { mapsetObject *ret; if (!PyArg_ParseTuple(args, ":navit.mapset")) return NULL; ret=PyObject_NEW(mapsetObject, &mapset_Type); ret->ms=mapset_new(NULL,NULL); return (PyObject *)ret; } static void mapset_destroy_py(mapsetObject *self) { mapset_destroy(self->ms); } static PyObject * config_load_py(PyObject *self, PyObject *args) { const char *file; int ret; xmlerror *error; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; ret=config_load(file, &error); return Py_BuildValue("i",ret); } static PyMethodDef navitMethods[]={ {"attr", attr_new_py, METH_VARARGS}, {"coord", coord_new_py, METH_VARARGS, "Create a new coordinate point."}, {"coord_rect", coord_rect_new_py, METH_VARARGS, "Create a new coordinate rectangle."}, {"map", map_new_py, METH_VARARGS, "Create a new map."}, {"mapset", mapset_new_py, METH_VARARGS, "Create a new mapset."}, {"config_load", config_load_py, METH_VARARGS, "Load a config"}, {"config", config_py, METH_VARARGS, "Get Config Object"}, {"pcoord", pcoord_py, METH_VARARGS}, {NULL, NULL, 0, NULL} }; PyObject * python_object_from_attr(struct attr *attr) { switch (attr->type) { case attr_navigation: return navigation_py_ref(attr->u.navigation); case attr_route: return route_py_ref(attr->u.route); default: return NULL; } return NULL; } void plugin_init(void) { int fd,size; char buffer[65536]; Py_Initialize(); Py_InitModule("navit", navitMethods); fd=open("startup.py",O_RDONLY); if (fd >= 0) { size=read(fd, buffer, 65535); if (size > 0) { buffer[size]='\0'; PyRun_SimpleString(buffer); } } Py_Finalize(); } navit-0.5.0+dfsg.1/navit/binding/python/common.h000066400000000000000000000033661264204753600214510ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #if defined(MS_WINDOWS) || defined(__CYGWIN__) #define Obj_HEAD PyObject_HEAD_INIT(NULL); #else #define Obj_HEAD PyObject_HEAD_INIT(&PyType_Type) #endif struct navit; struct map; PyObject * python_object_from_attr(struct attr *attr); PyObject * config_py(PyObject *self, PyObject *args); PyObject * map_py_ref(struct map *map); struct navigation; PyObject * navigation_py(PyObject *self, PyObject *args); PyObject * navigation_py_ref(struct navigation *navigation); PyObject * navit_py(PyObject *self, PyObject *args); PyObject * navit_py_ref(struct navit *navit); extern PyTypeObject pcoord_Type; PyObject * pcoord_py(PyObject *self, PyObject *args); struct pcoord *pcoord_py_get(PyObject *self); struct route; PyObject * route_py(PyObject *self, PyObject *args); PyObject * route_py_ref(struct route *route); extern PyTypeObject attr_Type; PyObject * attr_new_py(PyObject *self, PyObject *args); PyObject * attr_new_py_ref(struct attr *attr); struct attr * attr_py_get(PyObject *self); navit-0.5.0+dfsg.1/navit/binding/python/config.c000066400000000000000000000032441264204753600214140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "config_.h" typedef struct { PyObject_HEAD } configObject; static PyObject * config_navit(PyObject *self, PyObject *args) { struct attr navit; if (config_get_attr(config, attr_navit, &navit, NULL)) return navit_py_ref(navit.u.navit); return NULL; } static PyMethodDef config_methods[] = { {"navit", (PyCFunction) config_navit, METH_VARARGS }, {NULL, NULL }, }; static PyObject * config_getattr_py(PyObject *self, char *name) { return Py_FindMethod(config_methods, self, name); } static void config_destroy_py(configObject *self) { } PyTypeObject config_Type = { Obj_HEAD .tp_name="config", .tp_basicsize=sizeof(configObject), .tp_dealloc=(destructor)config_destroy_py, .tp_getattr=config_getattr_py, }; PyObject * config_py(PyObject *self, PyObject *args) { configObject *ret; dbg(lvl_debug,"enter\n"); ret=PyObject_NEW(configObject, &config_Type); return (PyObject *)ret; } navit-0.5.0+dfsg.1/navit/binding/python/navigation.c000066400000000000000000000036431264204753600223110ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "navigation.h" typedef struct { PyObject_HEAD struct navigation *navigation; } navigationObject; static PyObject * navigation_get_map_py(navigationObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; return map_py_ref(navigation_get_map(self->navigation)); } static PyMethodDef navigation_methods[] = { {"get_map", (PyCFunction) navigation_get_map_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * navigation_getattr_py(PyObject *self, char *name) { return Py_FindMethod(navigation_methods, self, name); } static void navigation_destroy_py(navigationObject *self) { } PyTypeObject navigation_Type = { Obj_HEAD .tp_name="navigation", .tp_basicsize=sizeof(navigationObject), .tp_dealloc=(destructor)navigation_destroy_py, .tp_getattr=navigation_getattr_py, }; PyObject * navigation_py(PyObject *self, PyObject *args) { navigationObject *ret; ret=PyObject_NEW(navigationObject, &navigation_Type); return (PyObject *)ret; } PyObject * navigation_py_ref(struct navigation *navigation) { navigationObject *ret; ret=PyObject_NEW(navigationObject, &navigation_Type); ret->navigation=navigation; return (PyObject *)ret; } navit-0.5.0+dfsg.1/navit/binding/python/navit.c000066400000000000000000000071261264204753600212730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "navit.h" typedef struct { PyObject_HEAD struct navit *navit; } navitObject; static PyObject * navit_set_attr_py(navitObject *self, PyObject *args) { PyObject *attr; if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) return NULL; navit_set_attr(self->navit, attr_py_get(attr)); Py_RETURN_NONE; } static PyObject * navit_get_attr_py(navitObject *self, PyObject *args) { char *name; struct attr attr; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; if (!navit_get_attr(self->navit, attr_from_name(name), &attr, NULL)) { dbg(lvl_error,"get_attr not ok\n"); Py_RETURN_NONE; } dbg(lvl_debug,"get_attr ok\n"); return python_object_from_attr(&attr); } static PyObject * navit_set_center_py(navitObject *self, PyObject *args) { PyObject *pcoord; if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) return NULL; navit_set_center(self->navit, pcoord_py_get(pcoord), 0); Py_RETURN_NONE; } static PyObject * navit_set_destination_py(navitObject *self, PyObject *args) { PyObject *pcoord; const char *description; int async; if (!PyArg_ParseTuple(args, "O!si", &pcoord_Type, &pcoord, &description, &async)) return NULL; navit_set_destination(self->navit, pcoord_py_get(pcoord), description, async); Py_RETURN_NONE; } static PyObject * navit_set_position_py(navitObject *self, PyObject *args) { PyObject *pcoord; if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) return NULL; navit_set_position(self->navit, pcoord_py_get(pcoord)); Py_RETURN_NONE; } static PyObject * navit_zoom_to_route_py(navitObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; navit_zoom_to_route(self->navit,0); Py_RETURN_NONE; } static PyMethodDef navit_methods[] = { {"set_attr", (PyCFunction) navit_set_attr_py, METH_VARARGS }, {"get_attr", (PyCFunction) navit_get_attr_py, METH_VARARGS }, {"set_center", (PyCFunction) navit_set_center_py, METH_VARARGS }, {"set_destination", (PyCFunction) navit_set_destination_py, METH_VARARGS }, {"set_position", (PyCFunction) navit_set_position_py, METH_VARARGS }, {"zoom_to_route", (PyCFunction) navit_zoom_to_route_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * navit_getattr_py(PyObject *self, char *name) { return Py_FindMethod(navit_methods, self, name); } static void navit_destroy_py(navitObject *self) { } PyTypeObject navit_Type = { Obj_HEAD .tp_name="navit", .tp_basicsize=sizeof(navitObject), .tp_dealloc=(destructor)navit_destroy_py, .tp_getattr=navit_getattr_py, }; PyObject * navit_py(PyObject *self, PyObject *args) { navitObject *ret; dbg(lvl_debug,"enter\n"); ret=PyObject_NEW(navitObject, &navit_Type); return (PyObject *)ret; } PyObject * navit_py_ref(struct navit *navit) { dbg(lvl_debug,"navit=%p\n", navit); navitObject *ret=PyObject_NEW(navitObject, &navit_Type); ret->navit=navit; return (PyObject *)ret; } navit-0.5.0+dfsg.1/navit/binding/python/navit.xml.python000066400000000000000000000004041264204753600231610ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/binding/python/pcoord.c000066400000000000000000000037051264204753600214370ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "coord.h" typedef struct { PyObject_HEAD struct pcoord pc; } pcoordObject; static PyObject * pcoord_func(pcoordObject *self, PyObject *args) { const char *file; int ret=0; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; return Py_BuildValue("i",ret); } static PyMethodDef pcoord_methods[] = { {"func", (PyCFunction) pcoord_func, METH_VARARGS }, {NULL, NULL }, }; static PyObject * pcoord_getattr_py(PyObject *self, char *name) { return Py_FindMethod(pcoord_methods, self, name); } static void pcoord_destroy_py(pcoordObject *self) { } PyTypeObject pcoord_Type = { Obj_HEAD .tp_name="pcoord", .tp_basicsize=sizeof(pcoordObject), .tp_dealloc=(destructor)pcoord_destroy_py, .tp_getattr=pcoord_getattr_py, }; PyObject * pcoord_py(PyObject *self, PyObject *args) { pcoordObject *ret; const char *str; enum projection pro; struct coord c; if (!PyArg_ParseTuple(args, "si", &str, &pro)) return NULL; ret=PyObject_NEW(pcoordObject, &pcoord_Type); coord_parse(str, pro, &c); ret->pc.pro=pro; ret->pc.x=c.x; ret->pc.y=c.y; dbg(lvl_debug,"0x%x,0x%x\n", c.x, c.y); return (PyObject *)ret; } struct pcoord * pcoord_py_get(PyObject *self) { return &((pcoordObject *)self)->pc; } navit-0.5.0+dfsg.1/navit/binding/python/route.c000066400000000000000000000034551264204753600213110ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "item.h" #include "coord.h" #include "route.h" typedef struct { PyObject_HEAD struct route *route; } routeObject; static PyObject * route_get_map_py(routeObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; return map_py_ref(route_get_map(self->route)); } static PyMethodDef route_methods[] = { {"get_map", (PyCFunction) route_get_map_py, METH_VARARGS }, {NULL, NULL }, }; static PyObject * route_getattr_py(PyObject *self, char *name) { return Py_FindMethod(route_methods, self, name); } static void route_destroy_py(routeObject *self) { } PyTypeObject route_Type = { Obj_HEAD .tp_name="route", .tp_basicsize=sizeof(routeObject), .tp_dealloc=(destructor)route_destroy_py, .tp_getattr=route_getattr_py, }; PyObject * route_py(PyObject *self, PyObject *args) { routeObject *ret; ret=PyObject_NEW(routeObject, &route_Type); return (PyObject *)ret; } PyObject * route_py_ref(struct route *route) { routeObject *ret; ret=PyObject_NEW(routeObject, &route_Type); ret->route=route; return (PyObject *)ret; } navit-0.5.0+dfsg.1/navit/binding/python/startup.py000066400000000000000000000004011264204753600220470ustar00rootroot00000000000000import navit navit.config_load("navit.xml.local") pos=navit.pcoord("5023.7493 N 00730.2898 E",1); dest=navit.pcoord("5023.6604 N 00729.8500 E",1); inst=navit.config().navit(); inst.set_position(pos); inst.set_destination(dest,"Test"); inst.set_center(pos); navit-0.5.0+dfsg.1/navit/binding/python/template.c000066400000000000000000000041201264204753600217540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "common.h" #include "template.h" typedef struct { PyObject_HEAD int ref; struct template *template; } templateObject; static PyObject * template_func(templateObject *self, PyObject *args) { const char *file; int ret; if (!PyArg_ParseTuple(args, "s", &file)) return NULL; ret=0; return Py_BuildValue("i",ret); } static PyMethodDef template_methods[] = { {"func", (PyCFunction) template_func, METH_VARARGS }, {NULL, NULL }, }; static PyObject * template_getattr_py(PyObject *self, char *name) { return Py_FindMethod(template_methods, self, name); } static void template_destroy_py(templateObject *self) { if (! self->ref) template_destroy(self->template); } PyTypeObject template_Type = { Obj_HEAD .tp_name="template", .tp_basicsize=sizeof(templateObject), .tp_dealloc=(destructor)template_destroy_py, .tp_getattr=template_getattr_py, }; struct template * template_py_get(PyObject *self) { return ((templateObject *)self)->template; } PyObject * template_new_py(PyObject *self, PyObject *args) { templateObject *ret; ret=PyObject_NEW(templateObject, &template_Type); ret->template=template_new(); ret->ref=0; return (PyObject *)ret; } PyObject * template_new_py_ref(struct template *template) { templateObject *ret; ret=PyObject_NEW(templateObject, &template_Type); ret->ref=1; ret->template=template; return (PyObject *)ret; } navit-0.5.0+dfsg.1/navit/bookmarks.c000066400000000000000000000570231264204753600172100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include "file.h" #include "debug.h" #include "projection.h" #include "coord.h" #include "transform.h" #include "callback.h" #include "map.h" #include "command.h" #include "bookmarks.h" #include "navit.h" #include "navit_nls.h" #include "util.h" /* FIXME: Move this to support directory */ #ifdef _MSC_VER #include static int ftruncate(int fd, __int64 length) { HANDLE fh = (HANDLE)_get_osfhandle(fd); if (!fh || _lseeki64(fd, length, SEEK_SET)) { return -1; } return SetEndOfFile(fh) ? 0 : -1; } #endif /* _MSC_VER */ struct bookmarks { //data storage struct map *bookmark; struct map_rect *mr; GHashTable *bookmarks_hash; GList *bookmarks_list; char* bookmark_file; char *working_file; struct bookmark_item_priv* clipboard; struct bookmark_item_priv* root; struct bookmark_item_priv* current; //Refs to other objects struct transformation *trans; struct attr **attrs; struct callback_list *attr_cbl; struct attr *parent; }; struct bookmark_item_priv { char *label; enum item_type type; struct pcoord c; GList *children; GList *iter; struct bookmark_item_priv *parent; struct item item; }; void bookmarks_move_root(struct bookmarks *this_) { this_->current=this_->root; this_->current->iter=g_list_first(this_->current->children); dbg(lvl_info,"Root list have %u entries\n",g_list_length(this_->current->children)); return; } void bookmarks_move_up(struct bookmarks *this_) { if (this_->current->parent) { this_->current=this_->current->parent; this_->current->iter=this_->current->children; } return; } int bookmarks_move_down(struct bookmarks *this_,const char* name) { bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,name)) { this_->current=(struct bookmark_item_priv*)this_->current->iter->data; this_->current->iter=g_list_first(this_->current->children); dbg(lvl_info,"%s list have %u entries\n",this_->current->label,g_list_length(this_->current->children)); return 1; } this_->current->iter=g_list_next(this_->current->iter); } return 0; } void bookmarks_item_rewind(struct bookmarks* this_) { this_->current->children=g_list_first(this_->current->children); this_->current->iter=this_->current->children; this_->current->iter=this_->current->children; } struct item* bookmarks_get_item(struct bookmarks* this_) { struct item item,*ret; if (this_->current->iter==NULL) { return NULL; } item=((struct bookmark_item_priv*)this_->current->iter->data)->item; this_->current->iter=g_list_next(this_->current->iter); ret = map_rect_get_item_byid(this_->mr, item.id_hi, item.id_lo); return ret; } int bookmarks_get_bookmark_count(struct bookmarks* this_) { int ret=0; bookmarks_item_rewind(this_); while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (data->type == type_bookmark) { ret++; } this_->current->iter=g_list_next(this_->current->iter); } return ret; } const char* bookmarks_item_cwd(struct bookmarks* this_) { return this_->current->label; } static void bookmarks_clear_item(struct bookmark_item_priv *b_item) { b_item->children=g_list_first(b_item->children); while(b_item->children) { bookmarks_clear_item((struct bookmark_item_priv*)b_item->children->data); b_item->children=g_list_next(b_item->children); } g_free(b_item->label); g_free(b_item); } static void bookmarks_clear_hash(struct bookmarks *this_) { if (this_->mr) { map_rect_destroy(this_->mr); } bookmarks_clear_item(this_->root); g_hash_table_destroy(this_->bookmarks_hash); g_list_free(this_->bookmarks_list); } static void bookmarks_load_hash(struct bookmarks *this_) { struct bookmark_item_priv *b_item; struct item *item; struct attr attr; struct coord c; char *pos,*finder; char *copy_helper; if (this_->mr) { map_rect_destroy(this_->mr); } this_->mr=map_rect_new(this_->bookmark, NULL); this_->bookmarks_hash=g_hash_table_new(g_str_hash, g_str_equal); this_->root=g_new0(struct bookmark_item_priv,1); this_->root->type=type_none; this_->root->parent=NULL; this_->root->children=NULL; bookmarks_move_root(this_); while ((item=map_rect_get_item(this_->mr))) { if (item->type != type_bookmark && item->type != type_bookmark_folder ) continue; if (!item_attr_get(item, attr_path, &attr)) { item_attr_get(item, attr_label, &attr); } item_coord_get(item, &c, 1); b_item=g_new0(struct bookmark_item_priv,1); b_item->c.x=c.x; b_item->c.y=c.y; b_item->label=g_strdup(attr.u.str); b_item->type=item->type; b_item->item=*item; //Prepare position bookmarks_move_root(this_); finder=b_item->label; while ((pos=strchr(finder,'/'))) { *pos=0x00; dbg(lvl_debug,"Found path entry: %s\n",finder); if (!bookmarks_move_down(this_,finder)) { struct bookmark_item_priv *path_item=g_new0(struct bookmark_item_priv,1); path_item->type=type_bookmark_folder; path_item->parent=this_->current; path_item->children=NULL; path_item->label=g_strdup(finder); this_->current->children=g_list_append(this_->current->children,path_item); this_->current=path_item; g_hash_table_insert(this_->bookmarks_hash,b_item->label,path_item); this_->bookmarks_list=g_list_append(this_->bookmarks_list,path_item); } finder+=strlen(finder)+1; } copy_helper=g_strdup(finder); free(b_item->label); b_item->label=copy_helper; b_item->parent=this_->current; g_hash_table_insert(this_->bookmarks_hash,b_item->label,b_item); this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); this_->current->children=g_list_append(this_->current->children,b_item); this_->current->children=g_list_first(this_->current->children); dbg(lvl_debug,"Added %s to %s and current list now %u long\n",b_item->label,this_->current->label,g_list_length(this_->current->children)); } bookmarks_move_root(this_); } struct bookmarks * bookmarks_new(struct attr *parent, struct attr **attrs, struct transformation *trans) { struct bookmarks *this_; if (parent->type!=attr_navit) { return NULL; } this_ = g_new0(struct bookmarks,1); this_->attr_cbl=callback_list_new(); this_->parent=parent; //this_->attrs=attr_list_dup(attrs); this_->trans=trans; this_->bookmark_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/bookmark.txt", NULL); this_->working_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/bookmark.txt.tmp", NULL); this_->clipboard=g_new0(struct bookmark_item_priv,1); { //Load map now struct attr type={attr_type, {"textfile"}}, data={attr_data, {this_->bookmark_file}}, no_warn={attr_no_warning_if_map_file_missing, {(void *)1}}; struct attr *attrs[]={&type, &data, &no_warn, NULL}; this_->bookmark=map_new(this_->parent, attrs); if (!this_->bookmark) return NULL; bookmarks_load_hash(this_); } return this_; } void bookmarks_destroy(struct bookmarks *this_) { bookmarks_clear_hash(this_); map_destroy(this_->bookmark); callback_list_destroy(this_->attr_cbl); g_free(this_->bookmark_file); g_free(this_->working_file); g_free(this_->clipboard); g_free(this_); } struct map* bookmarks_get_map(struct bookmarks *this_) { return this_->bookmark; } enum projection bookmarks_get_projection(struct bookmarks *this_){ return map_projection(this_->bookmark); } void bookmarks_add_callback(struct bookmarks *this_, struct callback *cb) { callback_list_add(this_->attr_cbl, cb); } static int bookmarks_store_bookmarks_to_file(struct bookmarks *this_, int limit,int replace) { FILE *f; struct bookmark_item_priv *item,*parent_item; char *fullname; const char *prostr; int result; GHashTable *dedup=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,NULL); f=fopen(this_->working_file, replace ? "w+" : "a+"); if (f==NULL) { navit_add_message(this_->parent->u.navit,_("Failed to write bookmarks file")); return FALSE; } this_->bookmarks_list=g_list_first(this_->bookmarks_list); while (this_->bookmarks_list) { item=(struct bookmark_item_priv*)this_->bookmarks_list->data; parent_item=item; fullname=g_strdup(item->label); while ((parent_item=parent_item->parent)) { char *pathHelper; if (parent_item->label) { pathHelper=g_strconcat(parent_item->label,"/",fullname,NULL); g_free(fullname); fullname=g_strdup(pathHelper); g_free(pathHelper); dbg(lvl_debug,"full name: %s\n",fullname); } } if (!g_hash_table_lookup(dedup,fullname)) { g_hash_table_insert(dedup,fullname,fullname); if (item->type == type_bookmark) { prostr = projection_to_name(projection_mg); if (fprintf(f,"%s%s%s0x%x %s0x%x type=%s label=\"%s\" path=\"%s\"\n", prostr, *prostr ? ":" : "", item->c.x >= 0 ? "":"-", item->c.x >= 0 ? item->c.x : -item->c.x, item->c.y >= 0 ? "":"-", item->c.y >= 0 ? item->c.y : -item->c.y, "bookmark", item->label,fullname)<1) { g_free(fullname); break; } } if (item->type == type_bookmark_folder) { prostr = projection_to_name(projection_mg); if (fprintf(f,"%s%s%s0x%x %s0x%x type=%s label=\"%s\" path=\"%s\"\n", prostr, *prostr ? ":" : "", "", 0, "", 0, "bookmark_folder", item->label,fullname)<1) { g_free(fullname); break; } } } /* Limit could be zero, so we start decrementing it from zero and never reach 1 or it was bigger and we decreased it earlier. So when this counter becomes 1, we know that we have enough entries in bookmarks file */ if (limit==1) { break; } limit--; this_->bookmarks_list=g_list_next(this_->bookmarks_list); } fclose(f); g_hash_table_destroy(dedup); if (this_->mr) { map_rect_destroy(this_->mr); this_->mr = 0; } unlink(this_->bookmark_file); result=(rename(this_->working_file,this_->bookmark_file)==0); if (!result) { navit_add_message(this_->parent->u.navit,_("Failed to write bookmarks file")); } return result; } /** * @param create: create the directory where the file is stored * if it does not exist * @return The name of the file used to store destinations with its * full path. Should be freed using g_free. * */ char* bookmarks_get_destination_file(gboolean create) { return g_strjoin(NULL, navit_get_user_data_directory(create), "/destination.txt", NULL); } /* * bookmarks_get_center_file * * returns the name of the file used to store the center file with its * full path * * arg: gboolean create: create the directory where the file is stored * if it does not exist */ char* bookmarks_get_center_file(gboolean create) { return g_strjoin(NULL, navit_get_user_data_directory(create), "/center.txt", NULL); } void bookmarks_set_center_from_file(struct bookmarks *this_, char *file) { FILE *f; char *line = NULL; size_t line_size = 0; enum projection pro; struct coord *center; f = fopen(file, "r"); if (! f) return; getline(&line, &line_size, f); fclose(f); if (line) { center = transform_center(this_->trans); pro = transform_get_projection(this_->trans); coord_parse(g_strchomp(line), pro, center); free(line); } return; } void bookmarks_write_center_to_file(struct bookmarks *this_, char *file) { FILE *f; enum projection pro; struct coord *center; f = fopen(file, "w+"); if (f) { center = transform_center(this_->trans); pro = transform_get_projection(this_->trans); coord_print(pro, center, f); fclose(f); } else { perror(file); } return; } static void bookmarks_emit_dbus_signal(struct bookmarks *this_, struct pcoord *c, const char *description,int create) { struct attr attr1,attr2,attr3,attr4,cb,*attr_list[5]; int valid=0; attr1.type=attr_type; attr1.u.str="bookmark"; attr2.type=attr_data; attr2.u.str=create ? "create" : "delete"; attr3.type=attr_data; attr3.u.str=(char *)description; attr4.type=attr_coord; attr4.u.pcoord=c; attr_list[0]=&attr1; attr_list[1]=&attr2; attr_list[2]=&attr3; attr_list[3]=&attr4; attr_list[4]=NULL; if (navit_get_attr(this_->parent->u.navit, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); } /** * Record the given set of coordinates as a bookmark * * @param navit The navit instance * @param c The coordinate to store * @param description A label which allows the user to later identify this bookmark * @returns nothing */ int bookmarks_add_bookmark(struct bookmarks *this_, struct pcoord *pc, const char *description) { struct bookmark_item_priv *b_item=g_new0(struct bookmark_item_priv,1); int result; if (pc) { b_item->c.x=pc->x; b_item->c.y=pc->y; b_item->type=type_bookmark; } else { b_item->type=type_bookmark_folder; } b_item->label=g_strdup(description); b_item->parent=this_->current; b_item->children=NULL; this_->current->children=g_list_first(this_->current->children); this_->current->children=g_list_append(this_->current->children,b_item); this_->bookmarks_list=g_list_first(this_->bookmarks_list); this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); bookmarks_emit_dbus_signal(this_,&(b_item->c),description,TRUE); return result; } int bookmarks_cut_bookmark(struct bookmarks *this_, const char *label) { if (bookmarks_copy_bookmark(this_,label)) { return bookmarks_delete_bookmark(this_,label); } return FALSE; } int bookmarks_copy_bookmark(struct bookmarks *this_, const char *label) { bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,label)) { this_->clipboard->c=data->c; this_->clipboard->type=data->type; this_->clipboard->item=data->item; this_->clipboard->children=data->children; if (!this_->clipboard->label) { g_free(this_->clipboard->label); } this_->clipboard->label=g_strdup(data->label); return TRUE; } this_->current->iter=g_list_next(this_->current->iter); } return FALSE; } int bookmarks_paste_bookmark(struct bookmarks *this_) { int result; struct bookmark_item_priv* b_item; if (!this_->clipboard->label) { return FALSE; } b_item=g_new0(struct bookmark_item_priv,1); b_item->c.x=this_->clipboard->c.x; b_item->c.y=this_->clipboard->c.y; b_item->label=g_strdup(this_->clipboard->label); b_item->type=this_->clipboard->type; b_item->item=this_->clipboard->item; b_item->parent=this_->current; b_item->children=this_->clipboard->children; g_hash_table_insert(this_->bookmarks_hash,b_item->label,b_item); this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); this_->current->children=g_list_append(this_->current->children,b_item); this_->current->children=g_list_first(this_->current->children); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); return result; } int bookmarks_delete_bookmark(struct bookmarks *this_, const char *label) { int result; bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,label)) { this_->bookmarks_list=g_list_first(this_->bookmarks_list); this_->bookmarks_list=g_list_remove(this_->bookmarks_list,data); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); bookmarks_emit_dbus_signal(this_,&(data->c),label,FALSE); return result; } this_->current->iter=g_list_next(this_->current->iter); } return FALSE; } int bookmarks_rename_bookmark(struct bookmarks *this_, const char *oldName, const char* newName) { int result; bookmarks_item_rewind(this_); if (this_->current->children==NULL) { return 0; } while (this_->current->iter!=NULL) { struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; if (!strcmp(data->label,oldName)) { g_free(data->label); data->label=g_strdup(newName); result=bookmarks_store_bookmarks_to_file(this_,0,0); callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); bookmarks_clear_hash(this_); bookmarks_load_hash(this_); return result; } this_->current->iter=g_list_next(this_->current->iter); } return FALSE; } struct former_destination{ enum item_type type; char* description; GList* c; }; static void free_former_destination(struct former_destination* former_destination){ g_free(former_destination->description); g_list_foreach(former_destination->c, (GFunc)g_free, NULL); g_list_free(former_destination->c); g_free(former_destination); } /* * Doesn't read any items besides former_destination. So active waypoints items of type former_itinerary and former_itinerary_part are skipped. */ static GList* read_former_destination_map_as_list(struct map *map){ struct map_rect *mr; struct item *item; struct attr attr; struct former_destination *dest; struct coord c; int more; GList* list = NULL; if (map && (mr=map_rect_new(map, NULL))) { while ((item=map_rect_get_item(mr))) { if (item->type != type_former_destination) continue; dest = g_new0(struct former_destination, 1); dest->type=item->type; item_attr_get(item, attr_label, &attr); dest->description = g_strdup(attr.u.str); more = item_coord_get(item, &c, 1); while (more) { dest->c = g_list_append(dest->c, g_new(struct coord, 1)); *(struct coord *)g_list_last(dest->c)->data = c; more = item_coord_get(item, &c, 1); } list = g_list_prepend(list, dest); } map_rect_destroy(mr); } return g_list_reverse(list); } static int destination_equal(struct former_destination* dest1, struct former_destination* dest2, int ignore_descriptions) { if ((dest1->type == dest2->type) && (ignore_descriptions || !strcmp(dest1->description, dest2->description)) && (coord_equal((struct coord *)g_list_last(dest1->c)->data, (struct coord *)g_list_last(dest2->c)->data))){ return TRUE; } return FALSE; } /* * Find destination in given GList. If remove_found is non-zero, any matching items are removed and new beginning of the list is returned. * If remove_found is zero, last matching item is returned. In the latter case, description is ignored and can be NULL. */ static GList* find_destination_in_list(struct former_destination* dest_to_remove, GList* former_destinations, int remove_found) { GList* curr_el = former_destinations; GList* prev_el = NULL; GList* found_el = NULL; struct former_destination* curr_dest; while(curr_el){ curr_dest = curr_el->data; if (destination_equal(dest_to_remove, curr_dest, remove_found?0:1)) { if(remove_found) { free_former_destination(curr_dest); curr_el = g_list_remove(curr_el, curr_dest); continue; } else { found_el=curr_el; } } prev_el = curr_el; curr_el = g_list_next(curr_el); } if(remove_found) return g_list_first(prev_el); else return found_el; } static void write_former_destinations(GList* former_destinations, char *former_destination_file, enum projection proj) { FILE *f; GList* currdest = NULL; GList* c_list = NULL; struct coord *c; struct former_destination *dest; const char* prostr = projection_to_name(proj); f=fopen(former_destination_file, "w"); if (f) { for(currdest = former_destinations; currdest; currdest = g_list_next(currdest)){ dest = currdest->data; if (dest->description) fprintf(f,"type=%s label=\"%s\"\n", item_to_name(dest->type), dest->description); else fprintf(f,"type=%s\n", item_to_name(dest->type)); c_list = dest->c; do { c = (struct coord *)c_list->data; fprintf(f,"%s%s%s0x%x %s0x%x\n", prostr, *prostr ? ":" : "", c->x >= 0 ? "":"-", c->x >= 0 ? c->x : -c->x, c->y >= 0 ? "":"-", c->y >= 0 ? c->y : -c->y); c_list = g_list_next(c_list); } while (c_list); } fclose(f); } else { dbg(lvl_error, "Error updating destinations file %s: %s\n", former_destination_file, strerror(errno)); } } /** * Append recent destination(s) item to the former destionations map. * @param former_destination_map * @param former_destination_file * @param c coordinates of item point(s). Can be set to NULL when navigation is stopped to remove type_former_itinerary and * type_former_itinerary_part items from the file. * @param count number of points in this item. Set to 0 when navigation is stopped. * @param type type_former_destination, type_former_itinerary and type_former_itinerary_part are meaningful here * @param description character string used to identify this destination. If NULL, most recent waypoint at these coordinates will be used * to get description. * @param limit Limits the number of entries in the "backlog". Set to 0 for "infinite" */ void bookmarks_append_destinations(struct map *former_destination_map, char *former_destination_file, struct pcoord *c, int count, enum item_type type, const char *description, int limit) { struct former_destination *new_dest=NULL; GList* former_destinations = NULL; GList* former_destinations_shortened = NULL; struct coord* c_dup; int no_of_former_destinations; int i; former_destinations = read_former_destination_map_as_list(former_destination_map); if(c && count>0) { GList *older; struct coord ctmp; new_dest = g_new0(struct former_destination, 1); new_dest->type = type; for (i=0; ic = g_list_append(new_dest->c, c_dup); } older=find_destination_in_list(new_dest, former_destinations,0); if(!description && older) description=((struct former_destination *)older->data)->description; new_dest->description = g_strdup(description?description:_("Map Point")); former_destinations = find_destination_in_list(new_dest, former_destinations, 1); former_destinations = g_list_append(former_destinations, new_dest); } no_of_former_destinations = g_list_length(former_destinations); if (limit > 0 && no_of_former_destinations > limit) former_destinations_shortened = g_list_nth(former_destinations, no_of_former_destinations - limit); else former_destinations_shortened = former_destinations; write_former_destinations(former_destinations_shortened, former_destination_file, map_projection(former_destination_map)); g_list_foreach(former_destinations, (GFunc) free_former_destination, NULL); g_list_free(former_destinations); } navit-0.5.0+dfsg.1/navit/bookmarks.h000066400000000000000000000051471264204753600172150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_BOOKMARKS_H #define NAVIT_BOOKMARKS_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ struct bookmarks; struct bookmarks *bookmarks_new(struct attr *parent, struct attr **attrs, struct transformation *trans); void bookmarks_destroy(struct bookmarks *this_); void bookmarks_add_callback(struct bookmarks *this_, struct callback *cb); int bookmarks_add_bookmark(struct bookmarks *this_, struct pcoord *c, const char *description); int bookmarks_cut_bookmark(struct bookmarks *this_, const char *label); int bookmarks_copy_bookmark(struct bookmarks *this_, const char *label); int bookmarks_paste_bookmark(struct bookmarks *this_); int bookmarks_rename_bookmark(struct bookmarks *this_, const char *oldName, const char* newName); int bookmarks_delete_bookmark(struct bookmarks *this_, const char *label); struct map* bookmarks_get_map(struct bookmarks *this_); enum projection bookmarks_get_projection(struct bookmarks *this_); void bookmarks_move_root(struct bookmarks *this_); void bookmarks_move_up(struct bookmarks *this_); int bookmarks_move_down(struct bookmarks *this_,const char* name); struct item* bookmarks_get_item(struct bookmarks* this_); int bookmarks_get_bookmark_count(struct bookmarks* this_); void bookmarks_item_rewind(struct bookmarks* this_); const char* bookmarks_item_cwd(struct bookmarks* this_); char* bookmarks_get_user_data_directory(gboolean create); char* bookmarks_get_destination_file(gboolean create); void bookmarks_set_center_from_file(struct bookmarks *this_, char *file); char* bookmarks_get_center_file(gboolean create); void bookmarks_write_center_to_file(struct bookmarks *this_, char *file); void bookmarks_append_destinations(struct map *former_destination_map, char *file, struct pcoord *c, int count, enum item_type type, const char *description, int limit); /* end of prototypes */ #ifdef __cplusplus } #endif #endif /* NAVIT_BOOKMARKS_H */ navit-0.5.0+dfsg.1/navit/browserplugin.c000066400000000000000000000336701264204753600201240ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-navit-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Josh Aas * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "browserplugin.h" #include #include #include #include #include #include #include #define PLUGIN_NAME "Navit Sample Plug-in" #define PLUGIN_DESCRIPTION PLUGIN_NAME " (Mozilla SDK)" #define PLUGIN_VERSION "1.0.0.0" static NPNetscapeFuncs *sBrowserFuncs = NULL; extern struct NPClass navitclass,navitclass2; typedef struct InstanceData { NPP npp; NPWindow window; } InstanceData; static void fillPluginFunctionTable(NPPluginFuncs * pFuncs) { pFuncs->version = 11; pFuncs->size = sizeof(*pFuncs); pFuncs->newp = NPP_New; pFuncs->destroy = NPP_Destroy; pFuncs->setwindow = NPP_SetWindow; pFuncs->newstream = NPP_NewStream; pFuncs->destroystream = NPP_DestroyStream; pFuncs->asfile = NPP_StreamAsFile; pFuncs->writeready = NPP_WriteReady; pFuncs->write = NPP_Write; pFuncs->print = NPP_Print; pFuncs->event = NPP_HandleEvent; pFuncs->urlnotify = NPP_URLNotify; pFuncs->getvalue = NPP_GetValue; pFuncs->setvalue = NPP_SetValue; } NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs * bFuncs, NPPluginFuncs * pFuncs) { NPError err = NPERR_NO_ERROR; NPBool supportsXEmbed = false; NPNToolkitType toolkit = 0; sBrowserFuncs = bFuncs; fillPluginFunctionTable(pFuncs); err = sBrowserFuncs->getvalue(NULL, NPNVSupportsXEmbedBool, (void *) &supportsXEmbed); if (err != NPERR_NO_ERROR || supportsXEmbed != true) return NPERR_INCOMPATIBLE_VERSION_ERROR; err = sBrowserFuncs->getvalue(NULL, NPNVToolkit, (void *) &toolkit); if (err != NPERR_NO_ERROR || toolkit != NPNVGtk2) return NPERR_INCOMPATIBLE_VERSION_ERROR; return NPERR_NO_ERROR; } NP_EXPORT(char *) NP_GetPluginVersion() { return PLUGIN_VERSION; } NP_EXPORT(char *) NP_GetMIMEDescription() { return "application/navit-plugin:nsc:Navit plugin"; } NP_EXPORT(NPError) NP_GetValue(void *future, NPPVariable aVariable, void *aValue) { fprintf(stderr, "NP_GetValue %d\n", aVariable); switch (aVariable) { case NPPVpluginNameString: *((char **) aValue) = PLUGIN_NAME; break; case NPPVpluginDescriptionString: *((char **) aValue) = PLUGIN_DESCRIPTION; break; default: return NPERR_INVALID_PARAM; break; } return NPERR_NO_ERROR; } NP_EXPORT(NPError) NP_Shutdown() { return NPERR_NO_ERROR; } NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData * saved) { char *args[]={"/usr/bin/navit",NULL}; // Make sure we can render this plugin NPBool browserSupportsWindowless = false; sBrowserFuncs->getvalue(instance, NPNVSupportsWindowless, &browserSupportsWindowless); if (!browserSupportsWindowless) { printf("Windowless mode not supported by the browser\n"); return NPERR_GENERIC_ERROR; } #if 0 sBrowserFuncs->setvalue(instance, NPPVpluginWindowBool, (void *) true); #endif // set up our our instance data InstanceData *instanceData = (InstanceData *) malloc(sizeof(InstanceData)); if (!instanceData) return NPERR_OUT_OF_MEMORY_ERROR; memset(instanceData, 0, sizeof(InstanceData)); instanceData->npp = instance; instance->pdata = instanceData; fprintf(stderr, "npp=%p\n", instance); main_real(1, args); return NPERR_NO_ERROR; } NPError NPP_Destroy(NPP instance, NPSavedData ** save) { InstanceData *instanceData = (InstanceData *) (instance->pdata); free(instanceData); return NPERR_NO_ERROR; } NPError NPP_SetWindow(NPP instance, NPWindow * window) { struct attr navit,graphics,windowid; InstanceData *instanceData = (InstanceData *) (instance->pdata); if (window->window == instanceData->window.window) return; instanceData->window = *window; fprintf(stderr, "Window 0x%x\n", window->window); if (!config_get_attr(config, attr_navit, &navit, NULL)) { fprintf(stderr,"No navit\n"); return NPERR_GENERIC_ERROR; } if (!navit_get_attr(navit.u.navit, attr_graphics, &graphics, NULL)) { fprintf(stderr,"No Graphics\n"); return NPERR_GENERIC_ERROR; } windowid.type=attr_windowid; windowid.u.num=window->window; if (!graphics_set_attr(graphics.u.graphics, &windowid)) { fprintf(stderr,"Failed to set window\n"); return NPERR_GENERIC_ERROR; } return NPERR_NO_ERROR; } NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream * stream, NPBool seekable, uint16_t * stype) { return NPERR_GENERIC_ERROR; } NPError NPP_DestroyStream(NPP instance, NPStream * stream, NPReason reason) { return NPERR_GENERIC_ERROR; } int32_t NPP_WriteReady(NPP instance, NPStream * stream) { return 0; } int32_t NPP_Write(NPP instance, NPStream * stream, int32_t offset, int32_t len, void *buffer) { return 0; } void NPP_StreamAsFile(NPP instance, NPStream * stream, const char *fname) { } void NPP_Print(NPP instance, NPPrint * platformPrint) { } int16_t NPP_HandleEvent(NPP instance, void *event) { return 0; #if 0 InstanceData *instanceData = (InstanceData *) (instance->pdata); XEvent *nativeEvent = (XEvent *) event; if (nativeEvent->type != GraphicsExpose) return 0; XGraphicsExposeEvent *expose = &nativeEvent->xgraphicsexpose; instanceData->window.window = (void *) (expose->drawable); GdkNativeWindow nativeWinId = (XID) (instanceData->window.window); GdkDrawable *gdkWindow = GDK_DRAWABLE(gdk_window_foreign_new(nativeWinId)); drawWindow(instanceData, gdkWindow); g_object_unref(gdkWindow); #endif return 1; } void NPP_URLNotify(NPP instance, const char *URL, NPReason reason, void *notifyData) { } struct NavitObject { NPClass *class; uint32_t referenceCount; InstanceData *instanceData; int is_attr; struct attr attr; }; void printIdentifier(NPIdentifier name) { NPUTF8 *str; str = sBrowserFuncs->utf8fromidentifier(name); fprintf(stderr, "%s\n", str); sBrowserFuncs->memfree(str); } NPObject * allocate(NPP npp, NPClass * aClass) { struct NavitObject *ret = calloc(sizeof(struct NavitObject), 1); if (ret) { ret->class = aClass; ret->instanceData = npp->pdata; fprintf(stderr, "instanceData for %p is %p\n", ret, ret->instanceData); } return (NPObject *) ret; } void invalidate(NPObject * npobj) { fprintf(stderr, "invalidate\n"); } bool hasMethod(NPObject * npobj, NPIdentifier name) { fprintf(stderr, "hasMethod\n"); printIdentifier(name); if (name == sBrowserFuncs->getstringidentifier("command")) return true; if (name == sBrowserFuncs->getstringidentifier("get_attr")) return true; if (name == sBrowserFuncs->getstringidentifier("toString")) return true; if (name == sBrowserFuncs->getstringidentifier("nativeMethod")) return true; if (name == sBrowserFuncs->getstringidentifier("anotherNativeMethod")) return true; return false; } enum attr_type variant_to_attr_type(const NPVariant *variant) { if (NPVARIANT_IS_STRING(*variant)) return attr_from_name(NPVARIANT_TO_STRING(*variant).utf8characters); return attr_none; } bool invoke(NPObject * npobj, NPIdentifier name, const NPVariant * args, uint32_t argCount, NPVariant * result) { struct NavitObject *obj = (struct NavitObject *) npobj; fprintf(stderr, "invoke\n"); printIdentifier(name); if (name == sBrowserFuncs->getstringidentifier("get_attr")) { enum attr_type attr_type; struct attr attr; if (!argCount) return false; attr_type=variant_to_attr_type(&args[0]); if (attr_type == attr_none) return false; if (config_get_attr(config, attr_type, &attr, NULL)) { struct NavitObject *obj2 = (struct NavitObject *)sBrowserFuncs->createobject(obj->instanceData->npp, &navitclass); obj2->is_attr=1; obj2->attr=attr; OBJECT_TO_NPVARIANT((NPObject *)obj2, *result); return true; } else { VOID_TO_NPVARIANT(*result); return true; } } if (name == sBrowserFuncs->getstringidentifier("command")) { enum attr_type attr_type; struct attr attr; NPObject *window; NPError err; NPVariant value; if (!argCount || !NPVARIANT_IS_STRING(args[0])) return false; if (navit_get_attr(obj->attr.u.navit, attr_callback_list, &attr, NULL)) { int valid=0; callback_list_call_attr_4(attr.u.callback_list, attr_command, NPVARIANT_TO_STRING(args[0]), NULL, NULL, &valid); } err=sBrowserFuncs->getvalue(obj->instanceData->npp, NPNVWindowNPObject, (void *) &window); fprintf(stderr,"error1:%d\n",err); //OBJECT_TO_NPVARIANT(window, *result); err=sBrowserFuncs->invoke(obj->instanceData->npp, window, sBrowserFuncs->getstringidentifier("Array"), window, 0, result); fprintf(stderr,"error2:%d\n",err); INT32_TO_NPVARIANT(23, value); err=sBrowserFuncs->setproperty(obj->instanceData->npp, NPVARIANT_TO_OBJECT(*result), sBrowserFuncs->getintidentifier(0), &value); INT32_TO_NPVARIANT(42, value); err=sBrowserFuncs->setproperty(obj->instanceData->npp, NPVARIANT_TO_OBJECT(*result), sBrowserFuncs->getintidentifier(1), &value); fprintf(stderr,"error3:%d\n",err); //VOID_TO_NPVARIANT(*result); return true; } if (name == sBrowserFuncs->getstringidentifier("toString")) { char *s; if (obj->is_attr) { s="[NavitObject attribute]"; STRINGZ_TO_NPVARIANT(strdup(s), *result); return true; } s=g_strdup_printf("[NavitObject %s]",attr_to_name(obj->attr.type)); STRINGZ_TO_NPVARIANT(strdup(s), *result); g_free(s); return true; } if (name == sBrowserFuncs->getstringidentifier("nativeMethod")) { result->type = NPVariantType_Int32; result->value.intValue = 23; return true; } if (name == sBrowserFuncs->getstringidentifier("anotherNativeMethod")) { result->type = NPVariantType_Int32; result->value.intValue = 42; return true; } return false; } bool invokeDefault(NPObject * npobj, const NPVariant * args, uint32_t argCount, NPVariant * result) { fprintf(stderr, "invokeDefault\n"); return false; } bool hasProperty(NPObject * npobj, NPIdentifier name) { struct NavitObject *obj = (struct NavitObject *) npobj; fprintf(stderr, "hasProperty\n"); printIdentifier(name); if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("type")) return true; if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("val")) return true; if (name == sBrowserFuncs->getstringidentifier("nativeProperty")) { return true; } return false; } bool getProperty(NPObject * npobj, NPIdentifier name, NPVariant * result) { struct NavitObject *obj = (struct NavitObject *) npobj; fprintf(stderr, "getProperty %p\n", obj); fprintf(stderr, "instanceData %p\n", obj->instanceData); if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("type")) { STRINGZ_TO_NPVARIANT(strdup(attr_to_name(obj->attr.type)), *result); return true; } if (obj->is_attr && name == sBrowserFuncs->getstringidentifier("val")) { struct NavitObject *obj2 = (struct NavitObject *)sBrowserFuncs->createobject(obj->instanceData->npp, &navitclass); obj2->attr=obj->attr; OBJECT_TO_NPVARIANT((NPObject *)obj2, *result); return true; } if (name == sBrowserFuncs->getstringidentifier("nativeProperty")) { result->type = NPVariantType_Object; fprintf(stderr, "npp=%p\n", obj->instanceData->npp); result->value.objectValue = sBrowserFuncs->createobject(obj->instanceData->npp, &navitclass2); return true; } return false; } bool setProperty(NPObject * npobj, NPIdentifier name, const NPVariant * value) { fprintf(stderr, "setProperty\n"); return false; } bool removeProperty(NPObject * npobj, NPIdentifier name) { fprintf(stderr, "removeProperty\n"); return false; } struct NPClass navitclass = { 1, allocate, NULL, /* deallocate */ invalidate, hasMethod, invoke, invokeDefault, hasProperty, getProperty, setProperty, removeProperty, }; struct NPClass navitclass2 = { 1, allocate, /* allocate */ NULL, /* deallocate */ invalidate, hasMethod, invoke, invokeDefault, hasProperty, getProperty, setProperty, removeProperty, }; NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) { fprintf(stderr, "NPP_GetValue %d %d\n", variable, NPPVpluginScriptableNPObject); if (variable == NPPVpluginNeedsXEmbed) { *((NPBool *) value) = true; fprintf(stderr, "Xembedd\n"); return NPERR_NO_ERROR; } if (variable == NPPVpluginScriptableNPObject) { *(NPObject **) value = sBrowserFuncs->createobject(instance, &navitclass); return NPERR_NO_ERROR; } return NPERR_GENERIC_ERROR; } NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) { return NPERR_GENERIC_ERROR; } navit-0.5.0+dfsg.1/navit/builtin.c.in000066400000000000000000000001511264204753600172610ustar00rootroot00000000000000${MODULES_PROTOTYPE}; extern void builtin_init(void); void builtin_init(void) { ${MODULES_FUNC}; } navit-0.5.0+dfsg.1/navit/cache.c000066400000000000000000000232021264204753600162530ustar00rootroot00000000000000#include "glib_slice.h" #ifdef DEBUG_CACHE #include #endif #include #include "debug.h" #include "cache.h" struct cache_entry { int usage; int size; struct cache_entry_list *where; struct cache_entry *next; struct cache_entry *prev; int id[0]; }; struct cache_entry_list { struct cache_entry *first, *last; int size; }; struct cache { struct cache_entry_list t1,b1,t2,b2,*insert; int size,id_size,entry_size; int t1_target; int misses; int hits; GHashTable *hash; }; static void cache_entry_dump(struct cache *cache, struct cache_entry *entry) { int i,size; dbg(lvl_debug,"Usage: %d size %d\n",entry->usage, entry->size); if (cache) size=cache->id_size; else size=5; for (i = 0 ; i < size ; i++) { dbg(lvl_debug,"0x%x\n", entry->id[i]); } } static void cache_list_dump(char *str, struct cache *cache, struct cache_entry_list *list) { struct cache_entry *first=list->first; dbg(lvl_debug,"dump %s %d\n",str, list->size); while (first) { cache_entry_dump(cache, first); first=first->next; } } static guint cache_hash4(gconstpointer key) { int *id=(int *)key; return id[0]; } static guint cache_hash20(gconstpointer key) { int *id=(int *)key; return id[0]^id[1]^id[2]^id[3]^id[4]; } static gboolean cache_equal4(gconstpointer a, gconstpointer b) { int *ida=(int *)a; int *idb=(int *)b; return ida[0] == idb[0]; } static gboolean cache_equal20(gconstpointer a, gconstpointer b) { int *ida=(int *)a; int *idb=(int *)b; return(ida[0] == idb[0] && ida[1] == idb[1] && ida[2] == idb[2] && ida[3] == idb[3] && ida[4] == idb[4]); } struct cache * cache_new(int id_size, int size) { struct cache *cache=g_new0(struct cache, 1); cache->id_size=id_size/4; cache->entry_size=cache->id_size*sizeof(int)+sizeof(struct cache_entry); cache->size=size; switch (id_size) { case 4: cache->hash=g_hash_table_new(cache_hash4, cache_equal4); break; case 20: cache->hash=g_hash_table_new(cache_hash20, cache_equal20); break; default: dbg(lvl_error,"cache with id_size of %d not supported\n", id_size); g_free(cache); cache=NULL; } return cache; } void cache_resize(struct cache *cache, int size) { cache->size=size; } static void cache_insert_mru(struct cache *cache, struct cache_entry_list *list, struct cache_entry *entry) { entry->prev=NULL; entry->next=list->first; entry->where=list; if (entry->next) entry->next->prev=entry; list->first=entry; if (! list->last) list->last=entry; list->size+=entry->size; if (cache) g_hash_table_insert(cache->hash, (gpointer)entry->id, entry); } static void cache_remove_from_list(struct cache_entry_list *list, struct cache_entry *entry) { if (entry->prev) entry->prev->next=entry->next; else list->first=entry->next; if (entry->next) entry->next->prev=entry->prev; else list->last=entry->prev; list->size-=entry->size; } static void cache_remove(struct cache *cache, struct cache_entry *entry) { dbg(lvl_debug,"remove 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); g_hash_table_remove(cache->hash, (gpointer)(entry->id)); g_slice_free1(entry->size, entry); } static struct cache_entry * cache_remove_lru_helper(struct cache_entry_list *list) { struct cache_entry *last=list->last; if (! last) return NULL; list->last=last->prev; if (last->prev) last->prev->next=NULL; else list->first=NULL; list->size-=last->size; return last; } static struct cache_entry * cache_remove_lru(struct cache *cache, struct cache_entry_list *list) { struct cache_entry *last; int seen=0; while (list->last && list->last->usage && seen < list->size) { last=cache_remove_lru_helper(list); cache_insert_mru(NULL, list, last); seen+=last->size; } last=list->last; if (! last || last->usage || seen >= list->size) return NULL; dbg(lvl_debug,"removing %d\n", last->id[0]); cache_remove_lru_helper(list); if (cache) { cache_remove(cache, last); return NULL; } return last; } void * cache_entry_new(struct cache *cache, void *id, int size) { struct cache_entry *ret; size+=cache->entry_size; cache->misses+=size; ret=(struct cache_entry *)g_slice_alloc0(size); ret->size=size; ret->usage=1; memcpy(ret->id, id, cache->id_size*sizeof(int)); return &ret->id[cache->id_size]; } void cache_entry_destroy(struct cache *cache, void *data) { struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); dbg(lvl_debug,"destroy 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); entry->usage--; } static struct cache_entry * cache_trim(struct cache *cache, struct cache_entry *entry) { struct cache_entry *new_entry; dbg(lvl_debug,"trim 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); dbg(lvl_debug,"Trim %x from %d -> %d\n", entry->id[0], entry->size, cache->size); if ( cache->entry_size < entry->size ) { g_hash_table_remove(cache->hash, (gpointer)(entry->id)); new_entry = g_slice_alloc0(cache->entry_size); memcpy(new_entry, entry, cache->entry_size); g_slice_free1( entry->size, entry); new_entry->size = cache->entry_size; g_hash_table_insert(cache->hash, (gpointer)new_entry->id, new_entry); } else { new_entry = entry; } return new_entry; } static struct cache_entry * cache_move(struct cache *cache, struct cache_entry_list *old, struct cache_entry_list *new) { struct cache_entry *entry; entry=cache_remove_lru(NULL, old); if (! entry) return NULL; entry=cache_trim(cache, entry); cache_insert_mru(NULL, new, entry); return entry; } static int cache_replace(struct cache *cache) { if (cache->t1.size >= MAX(1,cache->t1_target)) { dbg(lvl_debug,"replace 12\n"); if (!cache_move(cache, &cache->t1, &cache->b1)) cache_move(cache, &cache->t2, &cache->b2); } else { dbg(lvl_debug,"replace t2\n"); if (!cache_move(cache, &cache->t2, &cache->b2)) cache_move(cache, &cache->t1, &cache->b1); } #if 0 if (! entry) { cache_dump(cache); exit(0); } #endif return 1; } void cache_flush(struct cache *cache, void *id) { struct cache_entry *entry=g_hash_table_lookup(cache->hash, id); if (entry) { cache_remove_from_list(entry->where, entry); cache_remove(cache, entry); } } void cache_flush_data(struct cache *cache, void *data) { struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); if (entry) { cache_remove_from_list(entry->where, entry); cache_remove(cache, entry); } } void * cache_lookup(struct cache *cache, void *id) { struct cache_entry *entry; dbg(lvl_debug,"get %d\n", ((int *)id)[0]); entry=g_hash_table_lookup(cache->hash, id); if (entry == NULL) { cache->insert=&cache->t1; #ifdef DEBUG_CACHE fprintf(stderr,"-"); #endif dbg(lvl_debug,"not in cache\n"); return NULL; } dbg(lvl_debug,"found 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); if (entry->where == &cache->t1 || entry->where == &cache->t2) { cache->hits+=entry->size; #ifdef DEBUG_CACHE if (entry->where == &cache->t1) fprintf(stderr,"h"); else fprintf(stderr,"H"); #endif dbg(lvl_debug,"in cache %s\n", entry->where == &cache->t1 ? "T1" : "T2"); cache_remove_from_list(entry->where, entry); cache_insert_mru(NULL, &cache->t2, entry); entry->usage++; return &entry->id[cache->id_size]; } else { if (entry->where == &cache->b1) { #ifdef DEBUG_CACHE fprintf(stderr,"m"); #endif dbg(lvl_debug,"in phantom cache B1\n"); cache->t1_target=MIN(cache->t1_target+MAX(cache->b2.size/cache->b1.size, 1),cache->size); cache_remove_from_list(&cache->b1, entry); } else if (entry->where == &cache->b2) { #ifdef DEBUG_CACHE fprintf(stderr,"M"); #endif dbg(lvl_debug,"in phantom cache B2\n"); cache->t1_target=MAX(cache->t1_target-MAX(cache->b1.size/cache->b2.size, 1),0); cache_remove_from_list(&cache->b2, entry); } else { dbg(lvl_error,"**ERROR** invalid where\n"); } cache_replace(cache); cache_remove(cache, entry); cache->insert=&cache->t2; return NULL; } } void cache_insert(struct cache *cache, void *data) { struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); dbg(lvl_debug,"insert 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); if (cache->insert == &cache->t1) { if (cache->t1.size + cache->b1.size >= cache->size) { if (cache->t1.size < cache->size) { cache_remove_lru(cache, &cache->b1); cache_replace(cache); } else { cache_remove_lru(cache, &cache->t1); } } else { if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= cache->size) { if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= 2*cache->size) cache_remove_lru(cache, &cache->b2); cache_replace(cache); } } } cache_insert_mru(cache, cache->insert, entry); } void * cache_insert_new(struct cache *cache, void *id, int size) { void *data=cache_entry_new(cache, id, size); cache_insert(cache, data); return data; } static void cache_stats(struct cache *cache) { dbg(lvl_debug,"hits %d misses %d hitratio %d size %d entry_size %d id_size %d T1 target %d\n", cache->hits, cache->misses, cache->hits*100/(cache->hits+cache->misses), cache->size, cache->entry_size, cache->id_size, cache->t1_target); dbg(lvl_debug,"T1:%d B1:%d T2:%d B2:%d\n", cache->t1.size, cache->b1.size, cache->t2.size, cache->b2.size); cache->hits=0; cache->misses=0; } void cache_dump(struct cache *cache) { cache_stats(cache); cache_list_dump("T1", cache, &cache->t1); cache_list_dump("B1", cache, &cache->b1); cache_list_dump("T2", cache, &cache->t2); cache_list_dump("B2", cache, &cache->b2); dbg(lvl_debug,"dump end\n"); } navit-0.5.0+dfsg.1/navit/cache.h000066400000000000000000000011371264204753600162630ustar00rootroot00000000000000struct cache_entry; struct cache; /* prototypes */ struct cache *cache_new(int id_size, int size); void cache_resize(struct cache *cache, int size); void *cache_entry_new(struct cache *cache, void *id, int size); void cache_entry_destroy(struct cache *cache, void *data); void *cache_lookup(struct cache *cache, void *id); void cache_insert(struct cache *cache, void *data); void *cache_insert_new(struct cache *cache, void *id, int size); void cache_flush(struct cache *cache, void *id); void cache_dump(struct cache *cache); void cache_flush_data(struct cache *cache, void *data); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/callback.c000066400000000000000000000135361264204753600167550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "item.h" #include "debug.h" #include "callback.h" struct callback { /* func has variable number of arguments, not (void), * but we must declare something... */ void (*func)(void); int pcount; enum attr_type type; void *p[0]; }; struct callback_list { GList *list; }; struct callback_list * callback_list_new(void) { struct callback_list *ret=g_new0(struct callback_list, 1); return ret; } struct callback * callback_new_attr(void (*func)(void), enum attr_type type, int pcount, void **p) { struct callback *ret; int i; ret=g_malloc0(sizeof(struct callback)+pcount*sizeof(void *)); ret->func=func; ret->pcount=pcount; ret->type=type; for (i = 0 ; i < pcount ; i++) { ret->p[i]=p[i]; } return ret; } struct callback * callback_new_attr_args(void (*func)(void), enum attr_type type, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); return callback_new_attr(func, type, count, p); } struct callback * callback_new(void (*func)(void), int pcount, void **p) { return callback_new_attr(func, attr_none, pcount, p); } struct callback * callback_new_args(void (*func)(void), int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); return callback_new(func, count, p); } void callback_destroy(struct callback *cb) { g_free(cb); } void callback_set_arg(struct callback *cb, int arg, void *p) { if (arg < 0 || arg > cb->pcount) return; cb->p[arg]=p; } void callback_list_add(struct callback_list *l, struct callback *cb) { l->list=g_list_prepend(l->list, cb); } struct callback * callback_list_add_new(struct callback_list *l, void (*func)(void), int pcount, void **p) { struct callback *ret; ret=callback_new(func, pcount, p); callback_list_add(l, ret); return ret; } void callback_list_remove(struct callback_list *l, struct callback *cb) { l->list=g_list_remove(l->list, cb); } void callback_list_remove_destroy(struct callback_list *l, struct callback *cb) { callback_list_remove(l, cb); g_free(cb); } void callback_call(struct callback *cb, int pcount, void **p) { int i; void *pf[8]; if (! cb) return; if (cb->pcount + pcount <= 8) { dbg(lvl_debug,"cb->pcount=%d\n", cb->pcount); if (cb->pcount && cb->p) dbg(lvl_debug,"cb->p[0]=%p\n", cb->p[0]); dbg(lvl_debug,"pcount=%d\n", pcount); if (pcount) { dbg_assert(p!=NULL); dbg(lvl_debug,"p[0]=%p\n", p[0]); } for (i = 0 ; i < cb->pcount ; i++) pf[i]=cb->p[i]; for (i = 0 ; i < pcount ; i++) pf[i+cb->pcount]=p[i]; switch (cb->pcount+pcount) { case 8: ((int (*)(void*,void*,void*,void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6],pf[7]); break; case 7: ((int (*)(void*,void*,void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6]); break; case 6: ((int (*)(void*,void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4],pf[5]); break; case 5: ((int (*)(void*,void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3],pf[4]); break; case 4: ((int (*)(void*,void*,void*,void*))cb->func)( pf[0],pf[1],pf[2],pf[3]); break; case 3: ((int (*)(void*,void*,void*))cb->func)( pf[0],pf[1],pf[2]); break; case 2: ((int (*)(void*,void*))cb->func)( pf[0],pf[1]); break; case 1: ((int (*)(void*))cb->func)( pf[0]); break; case 0: cb->func(); break; } } else { dbg(lvl_error,"too many parameters for callback (%d+%d)\n", cb->pcount, pcount); } } void callback_call_args(struct callback *cb, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); callback_call(cb, count, p); } void callback_list_call_attr(struct callback_list *l, enum attr_type type, int pcount, void **p) { GList *cbi; struct callback *cb; if (!l) { return; } cbi=l->list; while (cbi) { cb=cbi->data; if (type == attr_any || cb->type == attr_any || cb->type == type) callback_call(cb, pcount, p); cbi=g_list_next(cbi); } } void callback_list_call_attr_args(struct callback_list *cbl, enum attr_type type, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); callback_list_call_attr(cbl, type, count, p); } void callback_list_call(struct callback_list *l, int pcount, void **p) { callback_list_call_attr(l, attr_any, pcount, p); } void callback_list_call_args(struct callback_list *cbl, int count, ...) { int i; void **p=g_alloca(sizeof(void*)*count); va_list ap; va_start(ap, count); for (i = 0 ; i < count ; i++) p[i]=va_arg(ap, void *); va_end(ap); callback_list_call(cbl, count, p); } void callback_list_destroy(struct callback_list *l) { GList *cbi; cbi=l->list; while (cbi) { g_free(cbi->data); cbi=g_list_next(cbi); } g_list_free(l->list); g_free(l); } navit-0.5.0+dfsg.1/navit/callback.h000066400000000000000000000105741264204753600167610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_CALLBACK_H #define NAVIT_CALLBACK_H #include "item.h" #include "attr.h" #ifdef __cplusplus extern "C" { #endif /* prototypes */ enum attr_type; struct callback; struct callback_list; struct callback_list *callback_list_new(void); struct callback *callback_new_attr(void (*func)(void), enum attr_type type, int pcount, void **p); struct callback *callback_new_attr_args(void (*func)(void), enum attr_type type, int count, ...); struct callback *callback_new(void (*func)(void), int pcount, void **p); struct callback *callback_new_args(void (*func)(void), int count, ...); void callback_destroy(struct callback *cb); void callback_set_arg(struct callback *cb, int arg, void *p); void callback_list_add(struct callback_list *l, struct callback *cb); struct callback *callback_list_add_new(struct callback_list *l, void (*func)(void), int pcount, void **p); void callback_list_remove(struct callback_list *l, struct callback *cb); void callback_list_remove_destroy(struct callback_list *l, struct callback *cb); void callback_call(struct callback *cb, int pcount, void **p); void callback_call_args(struct callback *cb, int count, ...); void callback_list_call_attr(struct callback_list *l, enum attr_type type, int pcount, void **p); void callback_list_call_attr_args(struct callback_list *cbl, enum attr_type type, int count, ...); void callback_list_call(struct callback_list *l, int pcount, void **p); void callback_list_call_args(struct callback_list *cbl, int count, ...); void callback_list_destroy(struct callback_list *l); /* end of prototypes */ #define callback_new_0(func) callback_new_args(func, 0) #define callback_new_1(func,p1) callback_new_args(func, 1, p1) #define callback_new_2(func,p1,p2) callback_new_args(func, 2, p1, p2) #define callback_new_3(func,p1,p2,p3) callback_new_args(func, 3, p1, p2, p3) #define callback_new_4(func,p1,p2,p3,p4) callback_new_args(func, 4, p1, p2, p3, p4) #define callback_new_attr_0(func,type) callback_new_attr_args(func, type, 0) #define callback_new_attr_1(func,type,p1) callback_new_attr_args(func, type, 1, p1) #define callback_new_attr_2(func,type,p1,p2) callback_new_attr_args(func, type, 2, p1, p2) #define callback_new_attr_3(func,type,p1,p2,p3) callback_new_attr_args(func, type, 3, p1, p2, p3) #define callback_new_attr_4(func,type,p1,p2,p3,p4) callback_new_attr_args(func, type, 4, p1, p2, p3, p4) #define callback_call_0(cb) callback_call_args(cb, 0) #define callback_call_1(cb,p1) callback_call_args(cb, 1, p1) #define callback_call_2(cb,p1,p2) callback_call_args(cb, 2, p1, p2) #define callback_call_3(cb,p1,p2,p3) callback_call_args(cb, 3, p1, p2, p3) #define callback_call_4(cb,p1,p2,p3,p4) callback_call_args(cb, 4, p1, p2, p3, p4) #define callback_list_call_0(cbl) callback_list_call_args(cbl, 0) #define callback_list_call_1(cbl,p1) callback_list_call_args(cbl, 1, p1) #define callback_list_call_2(cbl,p1,p2) callback_list_call_args(cbl, 2, p1, p2) #define callback_list_call_3(cbl,p1,p2,p3) callback_list_call_args(cbl, 3, p1, p2, p3) #define callback_list_call_4(cbl,p1,p2,p3,p4) callback_list_call_args(cbl, 4, p1, p2, p3, p4) #define callback_list_call_attr_0(cbl,type) callback_list_call_attr_args(cbl,type, 0) #define callback_list_call_attr_1(cbl,type,p1) callback_list_call_attr_args(cbl, type, 1, p1) #define callback_list_call_attr_2(cbl,type,p1,p2) callback_list_call_attr_args(cbl, type, 2, p1, p2) #define callback_list_call_attr_3(cbl,type,p1,p2,p3) callback_list_call_attr_args(cbl, type, 3, p1, p2, p3) #define callback_list_call_attr_4(cbl,type,p1,p2,p3,p4) callback_list_call_attr_args(cbl, type, 4, p1, p2, p3, p4) #define callback_cast(x) (void (*)(void))(x) #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/color.h000066400000000000000000000030301264204753600163300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COLOR_H #define NAVIT_COLOR_H struct color { int r,g,b,a; }; #define COLOR_BITDEPTH 16 #define COLOR_WHITE_ 0xffff,0xffff,0xffff,0xffff #define COLOR_BLACK_ 0x0000,0x0000,0x0000,0xffff #define COLOR_BACKGROUND_ 0xffff, 0xefef, 0xb7b7, 0xffff #define COLOR_TRANSPARENT__ 0x0000,0x0000,0x0000,0xffff #define COLOR_WHITE ((struct color) {COLOR_WHITE_}) #define COLOR_BLACK ((struct color) {COLOR_BLACK_}) #define COLOR_TRANSPARENT ((struct color) {COLOR_TRANSPARENT_}) #define COLOR_FMT "0x%x,0x%x,0x%x,0x%x" #define COLOR_ARGS(c) (c).r,(c).g,(c).b,(c).a #define COLOR_IS_SAME(c1,c2) ((c1).r==(c2).r && (c1).g==(c2).g && (c1).b==(c2).b && (c1).a==(c2).a) #define COLOR_IS_WHITE(c) COLOR_IS_SAME(c, COLOR_WHITE) #define COLOR_IS_BLACK(c) COLOR_IS_SAME(c, COLOR_BLACK) #endif navit-0.5.0+dfsg.1/navit/command.c000066400000000000000000001437521264204753600166430ustar00rootroot00000000000000#include #include #include #include #include #include "item.h" #include "xmlconfig.h" #include "main.h" #include "navit.h" #include "vehicle.h" #include "speech.h" #include "gui.h" #include "debug.h" #include "callback.h" #include "command.h" #include "event.h" #include "navit_nls.h" /* gui.fullscreen=!gui.fullscreen gui.menu() gui.get_data() zoom_in() zoom_out() speech.active=!speech.active osd_configuration=1 osd[@type=="xxx"].active=0;osd[@type=="yyy"].active=0 */ /** * The result, or interim result, of evaluating a saved command. */ struct result { struct attr attr; /**< The attribute. If {@code allocated} is true, it stores an object that was * successfully retrieved. Else it is either a placeholder or a constant value. */ double val; const char *var; /**< If {@code allocated} is false, the name of the object to be resolved. * Else, it is the name of the object successfully retrieved and stored in * {@code attr}, or {@code NULL} if retrieval failed. * Only the first {@code varlen} characters are significant. */ int varlen; /**< Number of significant characters in {@code var} */ const char *attrn; /**< The name of an object that has been resolved but not yet retrieved, * {@code NULL} otherwise. Only the first {@code attrnlen} characters are * significant. */ int attrnlen; /**< Number of significant characters in {@code attrn} */ int allocated; /**< Whether the result has been calculated */ }; struct result_list { struct attr **attrs; }; struct context { struct attr *attr; int error; int skip; const char *expr; struct result res; }; /** * Information about a callback function for a saved command. */ struct command_saved_cb { struct callback *cb; /**< The callback function */ struct attr attr; }; /** * A saved command. */ struct command_saved { struct context ctx; struct result res; char *command; /**< The command string itself **/ struct event_idle *idle_ev; /**< Event to update this command **/ struct callback *idle_cb; struct callback *register_cb; /**< Callback to register all the callbacks **/ struct event_idle *register_ev; /**< Idle event to register all the callbacks **/ struct attr context_attr; /**< The root of the object hierarchy, which will be assumed as * the parent of all unqualified or partially qualified object * references. **/ int num_cbs; /**< Number of entries in {@code cbs} **/ struct command_saved_cb *cbs; /**< List of callbacks for this saved command **/ struct callback *cb; /**< Callback that should be called when we re-evaluate **/ int error; int async; }; enum error { no_error=0, missing_double_quote, missing_opening_parenthesis, missing_closing_parenthesis, missing_closing_brace, missing_colon, missing_semicolon, wrong_type, illegal_number_format, illegal_character, missing_closing_bracket, invalid_type, not_ready, internal, eof_reached }; enum op_type { op_type_binary, op_type_prefix, op_type_suffix }; enum set_type { set_type_symbol, set_type_string, set_type_integer, set_type_float }; static void eval_comma(struct context *ctx, struct result *res); static struct attr ** eval_list(struct context *ctx); /** * @brief Converts an error to human-readable text. * * @param err The error code * * @return A string containing the error description. The caller is responsible for freeing up the string by * calling {@code g_free()} when it is no longer needed. */ char *command_error_to_text(int err) { switch (err) { case no_error: return g_strdup("no_error"); case missing_double_quote: return g_strdup("missing_double_quote"); case missing_opening_parenthesis: return g_strdup("missing_opening_parenthesis"); case missing_closing_parenthesis: return g_strdup("missing_closing_parenthesis"); case missing_closing_brace: return g_strdup("missing_closing_brace"); case missing_colon: return g_strdup("missing_colon"); case missing_semicolon: return g_strdup("missing_semicolon"); case wrong_type: return g_strdup("wrong_type"); case illegal_number_format: return g_strdup("illegal_number_format"); case illegal_character: return g_strdup("illegal_character"); case missing_closing_bracket: return g_strdup("missing_closing_bracket"); case invalid_type: return g_strdup("invalid_type"); case not_ready: return g_strdup("not_ready"); case internal: return g_strdup("internal"); case eof_reached: return g_strdup("eof_reached"); default: return g_strdup("unknown"); } } static void result_free(struct result *res) { if(res->allocated) { attr_free_content(&res->attr); res->allocated=0; } else { res->attr.type=type_none; res->attr.u.data=NULL; } } static int command_register_callbacks(struct command_saved *cs); static const char * get_op(struct context *ctx, int test, ...) { char *op; const char *ret=NULL; va_list ap; while (*ctx->expr && g_ascii_isspace(*ctx->expr)) { ctx->expr++; } va_start(ap, test); while ((op = va_arg(ap, char *))) { if (!strncmp(ctx->expr, op, strlen(op))) { ret=op; if (! test) ctx->expr+=strlen(op); break; } } va_end(ap); return ret; } /*static int is_int(struct result *res) { return 1; }*/ static int is_double(struct result *res) { return 0; } static void dump(struct result *res) { #if 0 char object[res->varlen+1]; char attribute[res->attrnlen+1]; if (res->var) strncpy(object, res->var, res->varlen); object[res->varlen]='\0'; if (res->attrn) strncpy(attribute, res->attrn, res->attrnlen); attribute[res->attrnlen]='\0'; dbg(lvl_debug,"type:%s\n", attr_to_name(res->attr.type)); dbg(lvl_debug,"attribute '%s' from '%s'\n", attribute, object); #endif } static enum attr_type command_attr_type(struct result *res) { char *attrn=g_alloca(sizeof(char)*(res->attrnlen+1)); strncpy(attrn, res->attrn, res->attrnlen); attrn[res->attrnlen]='\0'; return attr_from_name(attrn); } /** * @brief Retrieves an attribute from an object. * * This function will retrieve the first matching attribute by calling the {@code get_attr} method for * the object type. If {@code object} does not refer to a valid object, or the {@code get_attr} method * for the object type could not be defined, the function fails and zero is returned. * * @param ctx The context (ignored) * @param object The object for which the attribute is to be retrieved. * @param attr_type The type of attribute to retrieve * @param ret Points to a {@code struct attr} to which the attribute will be copied * * @return True if a matching attribute was found, false if no matching attribute was found or an error * occurred */ static int command_object_get_attr(struct context *ctx, struct attr *object, enum attr_type attr_type, struct attr *ret) { int r; struct attr dup; struct object_func *func=object_func_lookup(object->type); if (!object->u.data || !func || !func->get_attr) { dbg(lvl_warning, "cannot retrieve attributes from %s (%p), func=%p\n", attr_to_name(object->type), object->u.data, func) return 0; } r=func->get_attr(object->u.data, attr_type, &dup, NULL); if(r) attr_dup_content(&dup,ret); else dbg(lvl_warning, "%s (%p) has no attribute %s\n", attr_to_name(object->type), object->u.data, attr_to_name(attr_type)) return r; } static int command_object_add_attr(struct context *ctx, struct attr *object, struct attr *attr) { struct object_func *func=object_func_lookup(object->type); if (!object->u.data || !func || !func->add_attr) return 0; return func->add_attr(object->u.data, attr); } static int command_object_remove_attr(struct context *ctx, struct attr *object, struct attr *attr) { struct object_func *func=object_func_lookup(object->type); if (!object->u.data || !func || !func->remove_attr) return 0; return func->remove_attr(object->u.data, attr); } /** * @brief Retrieves the current value of an attribute and stores it in {@code res}. * * If {@code ctx->skip} is true, the function aborts and no action is taken. * * Before calling this function, object references in {@code res} must be resolved. That is, * {@code res->attr} holds a copy of {@code ctx->attr} and the first {@code res->attrnlen} characters of * {@code res->attrn} correspond to the object name. * * After this function completes, {@code res->allocated} is true, and {@code res->attrn} and * {@code res->attrnlen} are reset. * * If the attribute was successfully retrieved, the first {@code res->varlen} characters of * {@code res->var} correspond to an object name and {@code res->attr} holds the attribute. * * If the attribute could not be retrieved, {@code res->attr.type} is set to {@code attr_none}, and * {@code res->var} and {@code res->varlen} are reset. * * @param ctx The context * @param res The result */ static void command_get_attr(struct context *ctx, struct result *res) { int result; struct result tmp={{0,},}; enum attr_type attr_type=command_attr_type(res); enum attr_type parent_type = res->attr.type; /* for debugging only */ if (ctx->skip) return; result=command_object_get_attr(ctx, &res->attr, attr_type, &tmp.attr); result_free(res); *res=tmp; res->allocated=1; if (result) { dbg(lvl_debug, "successfully retrieved '%s' from '%s'\n", attr_to_name(attr_type), attr_to_name(parent_type)); res->var=res->attrn; res->varlen=res->attrnlen; } else { dbg(lvl_warning, "could not retrieve '%s' from '%s'\n", attr_to_name(attr_type), attr_to_name(parent_type)); result_free(res); res->attr.type=attr_none; res->var=NULL; res->varlen=0; } res->attrn=NULL; res->attrnlen=0; dump(res); } static void command_set_attr(struct context *ctx, struct result *res, struct result *newres) { enum attr_type attr_type=command_attr_type(res); struct object_func *func=object_func_lookup(res->attr.type); if (ctx->skip) return; if (!res->attr.u.data || !func || !func->set_attr) return; if (attr_type == attr_attr_types) { char *attrn=g_alloca(sizeof(char)*(res->attrnlen+1)); struct attr *tmp; strncpy(attrn, res->attrn, res->attrnlen); attrn[res->attrnlen]='\0'; tmp=attr_new_from_text(attrn, newres->attr.u.str); newres->attr.u.data=tmp->u.data; newres->allocated=1; g_free(tmp); } newres->attr.type=attr_type; func->set_attr(res->attr.u.data, &newres->attr); result_free(res); *res=*newres; } /** * @brief Resolves an object reference. * * Prior to calling this function, {@code res} must contain a valid, unresolved object reference: * {@code res->attr.type} must be {@code attr_none}, and the first {@code res->varlen} characters of * {@code res->var} must correspond to an object name. * * After the function returns, {@code res->attr} holds a copy of {@code ctx->attr} and the first * {@code res->attrnlen} characters of {@code res->attrn} correspond to the object name. * {@code res->var} and {@code res->varlen} are reset. * * @param ctx The context * @param res The result */ static void resolve_object(struct context *ctx, struct result *res) { if (res->attr.type == attr_none && res->varlen) { res->attr=*ctx->attr; res->attrn=res->var; res->attrnlen=res->varlen; res->var=NULL; res->varlen=0; } } /** * @brief Resolves and retrieves an object and stores it in {@code res}. * * Prior to calling this function, {@code res} must contain a valid, unresolved object reference: * {@code res->attr.type} must be {@code attr_none}, and the first {@code res->varlen} characters of * {@code res->var} must correspond to an object name. * * If {@code ctx->skip} is true, the object reference will be resolved but the object will not be * retrieved: the first {@code res->attrnlen} characters of {@code res->attrn} correspond to the object * name after the function returns, while {@code res->var} and {@code res->varlen} are reset. * * If {@code ctx->skip} is false, {@code res->allocated} is true after this function completes. The * object is stored in {@code res->attr} if it was successfully retrieved, otherwise {@code res->var} * and {@code res->varlen} are reset. * * @param ctx The context * @param res The result */ static void resolve(struct context *ctx, struct result *res) { resolve_object(ctx, res); if (res->attrn) command_get_attr(ctx, res); } static double get_double(struct context *ctx, struct result *res) { resolve(ctx, res); return res->val; } /** * @brief Returns an integer or bool representation of the result of an expression * * This function evaluates the result of an expression ({@code res->attr}). * * If {@code res->attr} is of a numeric type, its integer part is returned. * * If {@code is_bool} is false and {@code res->attr} is not of a numeric type, 0 is returned. * * If {@code is_bool} is true and {@code res->attr} is of an object or string type, true is returned * for non-null, false otherwise. * * For all other types of {@code res->attr}, 0 (false) is returned. * * @param ctx The context for the expression * @param is_bool If true, return boolean representation, else return integer representation. See description. * @param res The result of the evaluation * * @return The result of the expression, see description. */ static int get_int_bool(struct context *ctx, int is_bool, struct result *res) { resolve(ctx, res); if (res->attr.type == attr_none) return 0; if (res->attr.type >= attr_type_int_begin && res->attr.type <= attr_type_int_end) { return res->attr.u.num; } if (res->attr.type >= attr_type_double_begin && res->attr.type <= attr_type_double_end) { return (int) (*res->attr.u.numd); } if (is_bool && ATTR_IS_OBJECT(res->attr.type)) return res->attr.u.data != NULL; if (is_bool && ATTR_IS_STRING(res->attr.type)) return res->attr.u.data != NULL; dbg(lvl_debug,"bool %d %s\n",is_bool,attr_to_name(res->attr.type)); ctx->error=wrong_type; return 0; } /** * @brief Returns an integer representation of the result of an expression * * This function is a wrapper around {@code get_int_bool()}. It is equivalent to * {@code get_int_bool(ctx, 0, res)}. See {@code get_int_bool()} for a description. */ static int get_int(struct context *ctx, struct result *res) { return get_int_bool(ctx, 0, res); } /** * @brief Returns a boolean representation of the result of an expression * * This function is a wrapper around {@code get_int_bool()}. It is equivalent to * {@code get_int_bool(ctx, 1, res)}. See {@code get_int_bool()} for a description. */ static int get_bool(struct context *ctx, struct result *res) { return !!get_int_bool(ctx, 1, res); } static char * get_string(struct context *ctx, struct result *res) { resolve(ctx, res); return attr_to_text(&res->attr, NULL, 0); } static void set_double(struct result *res, double val) { result_free(res); res->attr.type=attr_type_double_begin; res->attr.u.numd=&res->val; res->val=val; } static void set_int(struct result *res, int val) { result_free(res); res->attr.type=attr_type_int_begin; res->attr.u.num=val; } static void result_op(struct context *ctx, enum op_type op_type, const char *op, struct result *inout, struct result *in) { if (ctx->skip) return; switch (op_type) { case op_type_prefix: switch ((op[0] << 8) | op[1]) { case ('!' << 8): set_int(inout, !get_bool(ctx, inout)); return; case ('~' << 8): set_int(inout, ~get_int(ctx, inout)); return; } break; case op_type_binary: resolve(ctx, inout); resolve(ctx, in); switch ((op[0] << 8) | op[1]) { case ('=' << 8)|'=': if (inout->attr.type == attr_none || in->attr.type == attr_none) { set_int(inout, 0); } else if (ATTR_IS_STRING(inout->attr.type) && ATTR_IS_STRING(in->attr.type)) { char *s1=get_string(ctx, inout),*s2=get_string(ctx, in); set_int(inout, (!strcmp(s1,s2))); g_free(s1); g_free(s2); } else if (ATTR_IS_OBJECT(inout->attr.type) && ATTR_IS_OBJECT(in->attr.type)) { set_int(inout, inout->attr.u.data == in->attr.u.data); } else set_int(inout, (get_int(ctx, inout) == get_int(ctx, in))); return; case ('!' << 8)|'=': if (inout->attr.type == attr_none || in->attr.type == attr_none) { set_int(inout, 1); } else if (ATTR_IS_STRING(inout->attr.type) && ATTR_IS_STRING(in->attr.type)) { char *s1=get_string(ctx, inout),*s2=get_string(ctx, in); set_int(inout, (!!strcmp(s1,s2))); g_free(s1); g_free(s2); } else if (ATTR_IS_OBJECT(inout->attr.type) && ATTR_IS_OBJECT(in->attr.type)) { set_int(inout, inout->attr.u.data != in->attr.u.data); } else set_int(inout, (get_int(ctx, inout) != get_int(ctx, in))); return; case ('<' << 8): set_int(inout, (get_int(ctx, inout) < get_int(ctx, in))); return; case ('<' << 8)|'=': set_int(inout, (get_int(ctx, inout) <= get_int(ctx, in))); return; case ('>' << 8): set_int(inout, (get_int(ctx, inout) > get_int(ctx, in))); return; case ('>' << 8)|'=': set_int(inout, (get_int(ctx, inout) >= get_int(ctx, in))); return; case ('*' << 8): if (is_double(inout) || is_double(in)) set_double(inout, get_double(ctx, inout) * get_double(ctx, in)); else set_int(inout, get_int(ctx, inout) * get_int(ctx, in)); return; case ('/' << 8): if (is_double(inout) || is_double(in)) set_double(inout, get_double(ctx, inout) * get_double(ctx, in)); else set_int(inout, get_int(ctx, inout) * get_int(ctx, in)); return; case ('%' << 8): set_int(inout, get_int(ctx, inout) % get_int(ctx, in)); return; case ('+' << 8): if (is_double(inout) || is_double(in)) set_double(inout, get_double(ctx, inout) + get_double(ctx, in)); else if (ATTR_IS_STRING(inout->attr.type) && ATTR_IS_STRING(in->attr.type)) { char *str=g_strdup_printf("%s%s",inout->attr.u.str,in->attr.u.str); result_free(inout); inout->attr.type=attr_type_string_begin; inout->attr.u.str=str; inout->allocated=1; } else set_int(inout, get_int(ctx, inout) + get_int(ctx, in)); return; case ('-' << 8): if (is_double(inout) || is_double(in)) set_int(inout, get_int(ctx, inout) - get_int(ctx, in)); else set_double(inout, get_double(ctx, inout) - get_double(ctx, in)); return; case ('&' << 8): set_int(inout, get_int(ctx, inout) & get_int(ctx, in)); return; case ('^' << 8): set_int(inout, get_int(ctx, inout) ^ get_int(ctx, in)); return; case ('|' << 8): set_int(inout, get_int(ctx, inout) | get_int(ctx, in)); return; case (('&' << 8) | '&'): set_int(inout, get_int(ctx, inout) && get_int(ctx, in)); return; case (('|' << 8) | '|'): set_int(inout, get_int(ctx, inout) || get_int(ctx, in)); return; default: break; } default: break; } dbg(lvl_error,"Unkown op %d %s\n",op_type,op); ctx->error=internal; } static void result_set(struct context *ctx, enum set_type set_type, const char *op, int len, struct result *out) { if (ctx->skip) return; switch (set_type) { case set_type_symbol: out->attr.type=attr_none; out->var=op; out->varlen=len; return; case set_type_integer: out->attr.type=attr_type_int_begin; out->attr.u.num=atoi(ctx->expr); return; case set_type_float: out->val = strtod(ctx->expr, NULL); out->attr.type=attr_type_double_begin; out->attr.u.numd=&out->val; return; case set_type_string: if (len >= 2) { out->attr.type=attr_type_string_begin; out->attr.u.str=g_malloc(len-1); strncpy(out->attr.u.str, op+1, len-2); out->attr.u.str[len-2]='\0'; out->allocated=1; return; } break; default: break; } dbg(lvl_error,"unknown set type %d %s\n",set_type,op); ctx->error=internal; } /** * @brief Evaluates a value and stores its result. * * This function evaluates the first value in {@code ctx->expr}. A value can be either an object name * (such as {@code vehicle.position_speed}) or a literal value. * * If evaluation is successful, the result is stored in {@code res->attr}. * * If an object name is encountered, the result has an attribute type of {@code attr_none} and the first * {@code res->varlen} characters of {@code res->var} will point to the object name. * * If a literal value is encountered, the result's attribute type is set to the corresponding generic * data type and its value is stored with the attribute. * * After this function returns, {@code ctx->expr} contains the rest of the expression string, which was * not evaluated. Leading spaces before the value will be discarded with the value. * * If {@code ctx->expr}, after eliminating any leading whitespace, does not begin with a valid value, * one of the following errors is stored in {@code ctx->error}: *

    *
  • {@code illegal_number_format} An illegal number format, such as a second decimal dot, was * encountered.
  • *
  • {@code missing_double_quote} A double quote without a matching second double quote was found.
  • *
  • {@code eof_reached} The expression string is empty.
  • *
  • {@code illegal_character} The expression string begins with a character which is illegal in a * value. This may happen when the expression string begins with an operator.
  • *
* * @param ctx The context to evaluate * @param res Points to a {@code struct res} in which the result will be stored */ static void eval_value(struct context *ctx, struct result *res) { const char *op; int dots=0; result_free(res); res->varlen=0; res->var=NULL; res->attrnlen=0; res->attrn=NULL; while (g_ascii_isspace(*(ctx->expr))) { ctx->expr++; } op = ctx->expr; if ((op[0] >= 'a' && op[0] <= 'z') || (op[0] >= 'A' && op[0] <= 'Z') || op[0] == '_') { const char *s=op; for (;;) { while ((op[0] >= 'a' && op[0] <= 'z') || (op[0] >= 'A' && op[0] <= 'Z') || (op[0] >= '0' && op[0] <= '9') || op[0] == '_') { op++; } if (op-s == 3 && !strncmp(s,"new",3) && op[0] == ' ') { op++; } else break; } result_set(ctx, set_type_symbol, ctx->expr, op-ctx->expr, res); ctx->expr=op; return; } if ((op[0] >= '0' && op[0] <= '9') || (op[0] == '.' && op[1] >= '0' && op[1] <= '9') || (op[0] == '-' && op[1] >= '0' && op[1] <= '9') || (op[0] == '-' && op[1] == '.' && op[2] >= '0' && op[2] <= '9')) { while ((op[0] >= '0' && op[0] <= '9') || op[0] == '.' || (res->varlen == 0 && op[0] == '-')) { if (op[0] == '.') dots++; if (dots > 1) { ctx->error=illegal_number_format; return; } op++; } result_set(ctx, dots?set_type_float:set_type_integer, ctx->expr, op-ctx->expr, res); ctx->expr=op; return; } if (op[0] == '"') { int escaped=0; do { if (op[0] == '\\') { escaped=1; if (op[1] == '"') op++; } op++; } while (op[0] && op[0] != '"'); if(!*op) { ctx->error=missing_double_quote; return; } op++; if (escaped) { char *tmpstr=g_malloc(op-ctx->expr+1),*s=tmpstr; op=ctx->expr; do { if (op[0] == '\\') op++; *s++=*op++; } while (op[0] != '"'); *s++=*op++; result_set(ctx, set_type_string, tmpstr, s-tmpstr, res); g_free(tmpstr); } else result_set(ctx, set_type_string, ctx->expr, op-ctx->expr, res); ctx->expr=op; return; } if (!*op) ctx->error=eof_reached; else { /* * If we get here, ctx->expr does not begin with a variable or a literal value. This is not an * error if this function is being called to test if an expression begins with a value. */ dbg(lvl_debug, "character 0x%x is illegal in a value\n",*op); ctx->error=illegal_character; } } /** * @brief Retrieves the next object reference from an expression. * * This function scans the expression string {@code ctx->expr} for the next object reference. Anything * other than an object reference (whitespace characters, literal values, operators and even illegal * characters) is discarded until either the end of the string is reached or an object reference is * encountered. * * After this function completes successfully, {@code res->attr.type} is {@code attr_none} and the first * {@code res->varlen} characters of {@code res->var} point to the object name. * * Object names retrieved by this function are unqualified, i.e. {@code vehicle.position_speed} will be * retrieved as {@code vehicle} on the first call (return value 2) and {@code position_speed} on the * second call (return value 1). * * @param ctx The context * @param res Points to a {@code struct result} where the result will be stored. * * @return If a complete object name has been retrieved, the return value is 1. If a partial object name * has been retrieved (e.g. {@code vehicle} from {@code vehicle.position_speed}), the return value is 2. * If no object references were found, the return value is 0. */ static int get_next_object(struct context *ctx, struct result *res) { while (*ctx->expr) { res->varlen = 0; ctx->error = 0; eval_value(ctx,res); if ((res->attr.type == attr_none) && (res->varlen > 0)) { if (ctx->expr[0] != '.') { return 1; // 1 means "this is the final object name" } else { return 2; // 2 means "there are more object names following" (e.g. we just hit 'vehicle' in 'vehicle.position_speed' } } if (ctx->error) { // Probably hit an operator ctx->expr++; } } return 0; } static void eval_brace(struct context *ctx, struct result *res) { if (get_op(ctx,0,"(",NULL)) { eval_comma(ctx, res); if (ctx->error) return; if (!get_op(ctx,0,")",NULL)) ctx->error=missing_closing_parenthesis; return; } eval_value(ctx, res); } static void command_call_function(struct context *ctx, struct result *res) { struct attr cbl,**list=NULL; char *function=g_alloca(sizeof(char)*(res->attrnlen+1)); if (res->attrn) strncpy(function, res->attrn, res->attrnlen); function[res->attrnlen]='\0'; dbg(lvl_debug,"function=%s\n", function); if (ctx->expr[0] != ')') { list=eval_list(ctx); if (ctx->error) { attr_list_free(list); return; } } if (!get_op(ctx,0,")",NULL)) { attr_list_free(list); ctx->error=missing_closing_parenthesis; return; } if (!ctx->skip) { if (!strcmp(function,"_") && list && list[0] && list[0]->type >= attr_type_string_begin && list[0]->type <= attr_type_string_end) { result_free(res); res->attr.type=list[0]->type; res->attr.u.str=g_strdup(navit_nls_gettext(list[0]->u.str)); res->allocated=1; } else if (!strncmp(function,"new ",4)) { enum attr_type attr_type=attr_from_name(function+4); result_free(res); if (ATTR_IS_INT(attr_type)) { if (list && list[0] && ATTR_IS_INT(list[0]->type)) { res->attr.type=attr_type; res->attr.u.num=list[0]->u.num; res->allocated=0; } else { dbg(lvl_error,"don't know how to create int of args\n"); } } else if (ATTR_IS_STRING(attr_type)) { if (list && list[0] && ATTR_IS_STRING(list[0]->type)) { res->attr.type=attr_type; res->attr.u.str=g_strdup(list[0]->u.str); res->allocated=1; } else { dbg(lvl_error,"don't know how to create string of args\n"); } } else if (ATTR_IS_OBJECT(attr_type)) { struct object_func *func=object_func_lookup(attr_type); if (func && func->create) { res->attr.type=attr_type; res->attr.u.data=func->create(list[0], list+1); /* Setting allocated to 1 here will make object to be destroyed when last reference is destroyed. So created persistent objects should be stored with set_attr_var command. */ res->allocated=1; } } else { dbg(lvl_error,"don't know how to create %s (%s)\n",attr_to_name(attr_type),function+4); } } else if (!strcmp(function,"add_attr")) { command_object_add_attr(ctx, &res->attr, list[0]); } else if (!strcmp(function,"remove_attr")) { command_object_remove_attr(ctx, &res->attr, list[0]); } else { if (command_object_get_attr(ctx, &res->attr, attr_callback_list, &cbl)) { int valid =0; struct attr **out=NULL; dbg(lvl_debug,"function call %s from %s\n",function, attr_to_name(res->attr.type)); callback_list_call_attr_4(cbl.u.callback_list, attr_command, function, list, &out, &valid); if (valid!=1){ dbg(lvl_error, "invalid command ignored: \"%s\"; see http://wiki.navit-project.org/index.php/" "The_Navit_Command_Interface for valid commands.\n", function); } if (out && out[0]) { result_free(res); attr_dup_content(out[0], &res->attr); res->allocated=1; attr_list_free(out); } else result_free(res); } else result_free(res); } } attr_list_free(list); res->var=NULL; res->varlen=0; res->attrn=NULL; res->attrnlen=0; } static void eval_postfix(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_brace(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"[","(",".",NULL))) return; if (op[0] == '.') { eval_brace(ctx, &tmp); if (ctx->error) return; resolve(ctx, res); if (ctx->error) return; res->attrn=tmp.var; res->attrnlen=tmp.varlen; dump(res); } else if (op[0] == '[') { resolve_object(ctx, res); if (ctx->error) return; if (get_op(ctx,0,"@",NULL)) { if (!ctx->skip) { struct object_func *obj_func=object_func_lookup(res->attr.type); struct attr_iter *iter; struct attr attr; enum attr_type attr_type=command_attr_type(res); void *obj=res->attr.u.data; if (!obj) { dbg(lvl_error,"no object\n"); return; } if (!obj_func) { dbg(lvl_error,"no object func\n"); return; } if (!obj_func->iter_new || !obj_func->iter_destroy) { dbg(lvl_error,"no iter func\n"); return; } iter = obj_func->iter_new(NULL); result_free(res); res->varlen=0; res->attrn=NULL; while (obj_func->get_attr(obj, attr_type, &attr, iter)) { if (command_evaluate_to_boolean(&attr, ctx->expr, &ctx->error)) { result_free(res); res->attr=attr; } } obj_func->iter_destroy(iter); } if (ctx->error) return; ctx->expr+=command_evaluate_to_length(ctx->expr, &ctx->error); } if (!get_op(ctx,0,"]",NULL)) { ctx->error=missing_closing_bracket; return; } } else if (op[0] == '(') { dbg(lvl_debug,"function call\n"); resolve_object(ctx, res); command_call_function(ctx, res); } } } static void eval_unary(struct context *ctx, struct result *res) { const char *op; op=get_op(ctx,0,"~","!",NULL); if (op) { eval_unary(ctx, res); if (ctx->error) return; result_op(ctx, op_type_prefix, op, res, NULL); } else eval_postfix(ctx, res); } static void eval_multiplicative(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_unary(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"*","/","%",NULL))) return; eval_unary(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, op, res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_additive(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_multiplicative(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"-","+",NULL))) return; eval_multiplicative(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, op, res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_equality(struct context *ctx, struct result *res) { struct result tmp={{0,},}; const char *op; eval_additive(ctx, res); if (ctx->error) return; for (;;) { if (!(op=get_op(ctx,0,"==","!=","<=",">=","<",">",NULL))) return; eval_additive(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, op, res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_bitwise_and(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_equality(ctx, res); if (ctx->error) return; for (;;) { if (get_op(ctx,1,"&&",NULL)) return; if (!get_op(ctx,0,"&",NULL)) return; eval_equality(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "&", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_bitwise_xor(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_bitwise_and(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,"^",NULL)) return; eval_bitwise_and(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "^", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_bitwise_or(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_bitwise_xor(ctx, res); if (ctx->error) return; for (;;) { if (get_op(ctx,1,"||",NULL)) return; if (!get_op(ctx,0,"|",NULL)) return; eval_bitwise_xor(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "|", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_logical_and(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_bitwise_or(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,"&&",NULL)) return; eval_bitwise_or(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "&&", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_logical_or(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_logical_and(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,"||",NULL)) return; eval_logical_and(ctx, &tmp); if (!ctx->error) result_op(ctx, op_type_binary, "||", res, &tmp); result_free(&tmp); if (ctx->error) return; } } static void eval_conditional(struct context *ctx, struct result *res) { struct result tmp={{0,},}; int cond=0; int skip; eval_logical_or(ctx, res); if (ctx->error) return; if (!get_op(ctx,0,"?",NULL)) return; skip=ctx->skip; cond=get_bool(ctx, res); result_free(res); if (ctx->error) return; ctx->skip=!cond || skip; eval_logical_or(ctx, &tmp); ctx->skip=skip; if (ctx->error) { result_free(&tmp); return; } *res=tmp; memset(&tmp,0,sizeof(tmp)); if (!get_op(ctx,0,":",NULL)) { dbg(lvl_debug,"ctxerr\n"); ctx->error=missing_colon; return; } ctx->skip=cond || skip; eval_logical_or(ctx, &tmp); ctx->skip=skip; if (ctx->error) { result_free(&tmp); return; } if (!cond) { result_free(res); *res=tmp; } else result_free(&tmp); } /* = *= /= %= += -= >>= <<= &= ^= |= */ static void eval_assignment(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_conditional(ctx, res); if (ctx->error) return; if (!get_op(ctx,0,"=",NULL)) return; eval_conditional(ctx, &tmp); if (ctx->error) { result_free(&tmp); return; } resolve(ctx, &tmp); if (ctx->error) { result_free(&tmp); return; } resolve_object(ctx, res); command_set_attr(ctx, res, &tmp); } /* , */ static void eval_comma(struct context *ctx, struct result *res) { struct result tmp={{0,},}; eval_assignment(ctx, res); if (ctx->error) return; for (;;) { if (!get_op(ctx,0,",",NULL)) return; eval_assignment(ctx, &tmp); if (ctx->error) return; result_free(res); *res=tmp; } } static struct attr ** eval_list(struct context *ctx) { struct result tmp={{0,},}; struct attr **ret=NULL; for (;;) { eval_assignment(ctx, &tmp); if (ctx->error) { result_free(&tmp); attr_list_free(ret); return NULL; } resolve(ctx, &tmp); ret=attr_generic_add_attr(ret, &tmp.attr); result_free(&tmp); if (!get_op(ctx,0,",",NULL)) return ret; } } #if 0 void command(struct attr *attr, char *expr) { struct result res; struct context ctx; memset(&res, 0, sizeof(res)); memset(&ctx, 0, sizeof(ctx)); ctx.attr=attr; ctx.error=0; ctx.expr=expr; printf("command='%s'\n", expr); eval_comma(&ctx,&res); printf("err=%d %s\n", ctx.error, ctx.expr); dump(&res); printf("***\n"); resolve(&ctx, &res); dump(&res); printf("%s\n", get_string(&ctx, &res)); } #endif static void command_evaluate_to(struct attr *attr, const char *expr, struct context *ctx, struct result *res) { result_free(res); memset(res, 0, sizeof(*res)); memset(ctx, 0, sizeof(*ctx)); ctx->attr=attr; ctx->expr=expr; eval_comma(ctx,res); } enum attr_type command_evaluate_to_attr(struct attr *attr, char *expr, int *error, struct attr *ret) { struct result res={{0,},}; struct context ctx; command_evaluate_to(attr, expr, &ctx, &res); if (ctx.error) return attr_none; resolve_object(&ctx, &res); *ret=res.attr; dbg(lvl_debug,"type %s\n",attr_to_name(command_attr_type(&res))); return command_attr_type(&res); } void command_evaluate_to_void(struct attr *attr, char *expr, int *error) { struct result res={{0,},}; struct context ctx; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res); if (error) *error=ctx.error; result_free(&res); } char * command_evaluate_to_string(struct attr *attr, char *expr, int *error) { struct result res={{0,},}; struct context ctx; char *ret=NULL; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res); if (!ctx.error) ret=get_string(&ctx, &res); if (error) *error=ctx.error; result_free(&res); if (ctx.error) return NULL; else return ret; } int command_evaluate_to_int(struct attr *attr, char *expr, int *error) { struct result res={{0,},}; struct context ctx; int ret=0; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res); if (!ctx.error) ret=get_int(&ctx, &res); if (error) *error=ctx.error; result_free(&res); if (ctx.error) return 0; else return ret; } int command_evaluate_to_boolean(struct attr *attr, const char *expr, int *error) { struct result res={{0,},}; struct context ctx; int ret=0; command_evaluate_to(attr, expr, &ctx, &res); if (!ctx.error) resolve(&ctx, &res); if (!ctx.error) { if (res.attr.type == attr_none) ret=0; else if ((res.attr.type >= attr_type_int_begin && res.attr.type <= attr_type_int_end) || (res.attr.type >= attr_type_double_begin && res.attr.type <= attr_type_double_end)) ret=get_int(&ctx, &res); else ret=res.attr.u.data != NULL; } result_free(&res); if (error) *error=ctx.error; if (ctx.error) return 0; else return ret; } int command_evaluate_to_length(const char *expr, int *error) { struct attr attr; struct result res={{0,},}; struct context ctx; attr.type=attr_none; attr.u.data=NULL; command_evaluate_to(&attr, expr, &ctx, &res); result_free(&res); if (!ctx.error) return ctx.expr-expr; return 0; } static int command_evaluate_single(struct context *ctx) { struct result res={{0,},},tmp={{0,},}; const char *op,*a,*f,*end; enum attr_type attr_type; void *obj; struct object_func *obj_func; struct attr_iter *iter; struct attr attr; int cond=0; int skip=ctx->skip; if (!(op=get_op(ctx,0,"foreach","if","{",NULL))) { eval_comma(ctx,&res); if (ctx->error) return 0; resolve(ctx, &res); result_free(&res); if (ctx->error) return 0; return get_op(ctx,0,";",NULL) != NULL; } switch (op[0]) { case 'f': if (!get_op(ctx,0,"(",NULL)) { ctx->error=missing_opening_parenthesis; return 0; } ctx->skip=1; a=ctx->expr; eval_conditional(ctx, &res); resolve_object(ctx, &res); ctx->skip=skip; if (!get_op(ctx,0,";",NULL)) { ctx->error=missing_semicolon; return 0; } eval_comma(ctx,&res); attr_type=command_attr_type(&res); obj=res.attr.u.data; obj_func=object_func_lookup(res.attr.type); if (!get_op(ctx,0,")",NULL)) { ctx->error=missing_closing_parenthesis; return 0; } f=ctx->expr; ctx->skip=1; if (!command_evaluate_single(ctx)) { ctx->skip=skip; return 0; } ctx->skip=skip; if (ctx->skip) { result_free(&res); return 1; } end=ctx->expr; if (!obj) { dbg(lvl_error,"no object\n"); return 0; } if (!obj_func) { dbg(lvl_error,"no object func\n"); return 0; } if (!obj_func->iter_new || !obj_func->iter_destroy) { dbg(lvl_error,"no iter func\n"); return 0; } iter = obj_func->iter_new(NULL); while (obj_func->get_attr(obj, attr_type, &attr, iter)) { ctx->expr=a; eval_conditional(ctx, &res); resolve_object(ctx, &res); tmp.attr=attr; resolve(ctx, &tmp); if (ctx->error) { result_free(&tmp); return 0; } command_set_attr(ctx, &res, &tmp); result_free(&tmp); ctx->expr=f; if (!command_evaluate_single(ctx)) { obj_func->iter_destroy(iter); return 0; } } obj_func->iter_destroy(iter); ctx->expr=end; return 1; case 'i': if (!get_op(ctx,0,"(",NULL)) { ctx->error=missing_opening_parenthesis; return 0; } eval_comma(ctx,&res); if (!skip && !ctx->error) cond=get_bool(ctx, &res); result_free(&res); if (ctx->error) return 0; if (!get_op(ctx,0,")",NULL)) { ctx->error=missing_closing_parenthesis; return 0; } ctx->skip=!cond || skip; command_evaluate_single(ctx); ctx->skip=skip; if (ctx->error) return 0; if (get_op(ctx,0,"else",NULL)) { ctx->skip=cond || skip; command_evaluate_single(ctx); ctx->skip=skip; if (ctx->error) return 0; } return 1; case '{': while (!get_op(ctx,0,"}",NULL)) { if (!command_evaluate_single(ctx)) return 0; } return 1; default: return 0; } } void command_evaluate(struct attr *attr, const char *expr) { /* Once the eval has started we can't rely anymore on the content of * expr which may be freed when the calling widget is destroyed by a * subsequent command call. Hence the g_strdup. */ char *expr_dup; char *err = NULL; /* Error description */ struct context ctx={0,}; ctx.attr=attr; ctx.error=0; ctx.expr=expr_dup=g_strdup(expr); for (;;) { if (!command_evaluate_single(&ctx)) break; } if (ctx.error && ctx.error != eof_reached) { char expr[32]; strncpy(expr, ctx.expr, 32); expr[31]='\0'; err = command_error_to_text(ctx.error); dbg(lvl_error, "error %s starting at %s\n", err, expr); g_free(err); } g_free(expr_dup); } #if 0 void command_interpreter(struct attr *attr) { char buffer[4096]; int size; for (;;) { size=read(0, buffer, 4095); buffer[size]='\0'; if (size) { buffer[size-1]='\0'; } command(attr, buffer); } } #endif static void command_table_call(struct command_table *table, int count, void *data, char *command, struct attr **in, struct attr ***out, int *valid) { int i; for (i = 0 ; i < count ; i++) { if (!strcmp(command,table->command)) { if (valid) *valid=1; table->func(data, command, in, out); } table++; } } void command_add_table_attr(struct command_table *table, int count, void *data, struct attr *attr) { attr->type=attr_callback; attr->u.callback=callback_new_attr_3(callback_cast(command_table_call),attr_command, table, count, data); } void command_add_table(struct callback_list *cbl, struct command_table *table, int count, void *data) { struct attr attr; command_add_table_attr(table, count, data, &attr); callback_list_add(cbl, attr.u.callback); } void command_saved_set_cb (struct command_saved *cs, struct callback *cb) { cs->cb = cb; } /** * @brief Returns an integer representation of the evaluation result of a saved command * * This function is a wrapper around {@code get_int()}. It is equivalent to * {@code get_int(&cs->ctx, &cs->res)}. See {@code get_int()} for a description. */ int command_saved_get_int (struct command_saved *cs) { return get_int(&cs->ctx, &cs->res); } int command_saved_error (struct command_saved *cs) { return cs->error; } /** * @brief Idle function to evaluate a command * * This function is called from an idle loop for asynchronous evaluation but may also be called in-line. * * The result of the evaluation can be retrieved from {@code cs->res} after this function returns. If an * error occurred, it will be stored in {@code cs->error}. * * @param cs The command to evaluate */ static void command_saved_evaluate_idle (struct command_saved *cs) { dbg(lvl_debug, "enter: cs=%p, cs->command=%s\n", cs, cs->command); // Only run once at a time if (cs->idle_ev) { event_remove_idle(cs->idle_ev); cs->idle_ev = NULL; } command_evaluate_to(&cs->context_attr, cs->command, &cs->ctx, &cs->res); if (!cs->ctx.error) { cs->error = 0; if (cs->cb) { callback_call_1(cs->cb, cs); } } else { cs->error = cs->ctx.error; } } /** * @brief Evaluates a command * * This function examines {@code cs->async} to determine if the command should be evaluated immediately. * If {@code cs->async} is true, an idle event is registered to register the command. Else the command * is evaluated immediately and the result can be retrieved immediately after this function returns. * * See {@link command_saved_evaluate_idle(struct command_saved *)} for details. * * @param cs The command to evaluate */ static void command_saved_evaluate(struct command_saved *cs) { dbg(lvl_debug, "enter: cs=%p, cs->async=%d, cs->command=%s\n", cs, cs->async, cs->command); if (!cs->async) { command_saved_evaluate_idle(cs); return; } if (cs->idle_ev) { // We're already scheduled for reevaluation return; } if (!cs->idle_cb) { cs->idle_cb = callback_new_1(callback_cast(command_saved_evaluate_idle), cs); } cs->idle_ev = event_add_idle(100, cs->idle_cb); } /** * @brief Recreates all callbacks for a saved command * * @param cs The saved command */ static void command_saved_callbacks_changed(struct command_saved *cs) { // For now, we delete each and every callback and then re-create them int i; struct object_func *func; struct attr attr; dbg(lvl_debug, "enter: cs=%p, cs->async=%d, cs->command=%s\n", cs, cs->async, cs->command); if (cs->register_ev) { event_remove_idle(cs->register_ev); cs->register_ev = NULL; } attr.type = attr_callback; for (i = 0; i < cs->num_cbs; i++) { func = object_func_lookup(cs->cbs[i].attr.type); if (!func->remove_attr) { dbg(lvl_error, "Could not remove command-evaluation callback because remove_attr is missing for type %i!\n", cs->cbs[i].attr.type); continue; } attr.u.callback = cs->cbs[i].cb; func->remove_attr(cs->cbs[i].attr.u.data, &attr); callback_destroy(cs->cbs[i].cb); } g_free(cs->cbs); cs->cbs = NULL; cs->num_cbs = 0; // Now, re-create all the callbacks command_register_callbacks(cs); } /** * @brief Registers callbacks for a saved command * * This function registers callbacks for each attribute used in a saved command, causing the command to * be re-evaluated whenever its value might change. * * This function will fail if an object used in the expression could not be resolved. This may happen * during startup if this function is called before all objects have been created. In this case, the * caller should schedule the function to be called again at a later time. * * It will also fail if an error is encountered. This can be determined by examining * {@code cs->ctx.error} after the function returns. * * @param cs The command * * @return True if all callbacks were successfully registered, false if the function failed */ static int command_register_callbacks(struct command_saved *cs) { struct attr prev; /* The parent of the next object which will be retrieved. */ struct attr cb_attr; int status; struct object_func *func; struct callback *cb; int tmpoffset; /* For debugging. Because we work with pointers into the same string instance. * we can figure out offsets by using simple pointer arithmetics. */ dbg(lvl_debug, "enter: cs=%p, cs->async=%d, cs->command=%s\n", cs, cs->async, cs->command); cs->ctx.expr = cs->command; prev = cs->context_attr; while ((status = get_next_object(&cs->ctx, &cs->res)) != 0) { tmpoffset = cs->res.var - cs->command; cs->ctx.attr = &prev; resolve(&cs->ctx, &cs->res); if (cs->ctx.error) { /* An error occurred while parsing the command */ tmpoffset = cs->ctx.expr - cs->command; dbg(lvl_error, "parsing error: cs=%p, cs->ctx.error=%d\n\t%s\n\t%*s\n", cs, cs->ctx.error, cs->command, tmpoffset + 1, "^"); return 0; } else if (cs->res.attr.type == attr_none) { /* We could not resolve an object, perhaps because it has not been created */ dbg(lvl_error, "could not resolve object in cs=%p:\n\t%s\n\t%*s\n", cs, cs->command, tmpoffset + 1, "^"); return 0; } if (prev.type != attr_none) { func = object_func_lookup(prev.type); if (func->add_attr) { if (status == 2) { // This is not the final attribute name cb = callback_new_attr_1(callback_cast(command_saved_callbacks_changed), cs->res.attr.type, (void*)cs); } else if (status == 1) { // This is the final attribute name cb = callback_new_attr_1(callback_cast(command_saved_evaluate), cs->res.attr.type, (void*)cs); cs->ctx.attr = &cs->context_attr; } else { dbg(lvl_error, "Error: Strange status returned from get_next_object()\n"); } cs->num_cbs++; cs->cbs = g_realloc(cs->cbs, (sizeof(struct command_saved_cb) * cs->num_cbs)); cs->cbs[cs->num_cbs-1].cb = cb; cs->cbs[cs->num_cbs-1].attr = prev; cb_attr.u.callback = cb; cb_attr.type = attr_callback; func->add_attr(prev.u.data, &cb_attr); } else { dbg(lvl_error, "Could not add callback because add_attr is missing for type %i\n", prev.type); } } if (status == 2) { prev = cs->res.attr; } else { prev = cs->context_attr; } } command_saved_evaluate_idle(cs); dbg(lvl_debug, "done: cs=%p, cs->command=%s\n", cs, cs->command); return 1; } /** * @brief Creates a new saved command. * * @param command The command string * @param attr The context attribute for the saved command * @param cb The callback to call whenver the command is re-evaluated * @param async Whether the saved command should be flagged as asynchronous, causing it to be evaluated * in an idle callback */ struct command_saved * command_saved_attr_new(char *command, struct attr *attr, struct callback *cb, int async) { struct command_saved *ret; ret = g_new0(struct command_saved, 1); dbg(lvl_debug, "enter, ret=%p, command=%s\n", ret, command); ret->command = g_strdup(command); ret->context_attr = *attr; ret->cb = cb; ret->error = not_ready; ret->async = async; if (!command_register_callbacks(ret)) { // We try this as an idle call again dbg(lvl_debug, "could not register callbacks, will retry as an idle call\n"); ret->register_cb = callback_new_1(callback_cast(command_saved_callbacks_changed), ret); ret->register_ev = event_add_idle(300, ret->register_cb); } return ret; } struct command_saved * command_saved_new(char *command, struct navit *navit, struct callback *cb, int async) { struct attr attr=ATTR_OBJECT(navit, navit); return command_saved_attr_new(command, &attr, cb, async); } void command_saved_destroy(struct command_saved *cs) { g_free(cs->command); g_free(cs); } navit-0.5.0+dfsg.1/navit/command.h000066400000000000000000000047021264204753600166370ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COMMAND_H #define NAVIT_COMMAND_H #ifdef __cplusplus extern "C" { #endif struct command_table { const char *command; int (*func)(void *data, char *cmd, struct attr **in, struct attr ***out); }; #define command_cast(x) (int (*)(void *, char *, struct attr **, struct attr ***))(x) /* prototypes */ enum attr_type; struct attr; struct callback; struct callback_list; struct command_saved; struct command_table; struct navit; char *command_error_to_text(int err); enum attr_type command_evaluate_to_attr(struct attr *attr, char *expr, int *error, struct attr *ret); void command_evaluate_to_void(struct attr *attr, char *expr, int *error); char *command_evaluate_to_string(struct attr *attr, char *expr, int *error); int command_evaluate_to_int(struct attr *attr, char *expr, int *error); int command_evaluate_to_boolean(struct attr *attr, const char *expr, int *error); int command_evaluate_to_length(const char *expr, int *error); void command_evaluate(struct attr *attr, const char *expr); void command_add_table_attr(struct command_table *table, int count, void *data, struct attr *attr); void command_add_table(struct callback_list *cbl, struct command_table *table, int count, void *data); void command_saved_set_cb(struct command_saved *cs, struct callback *cb); int command_saved_get_int(struct command_saved *cs); int command_saved_error(struct command_saved *cs); struct command_saved *command_saved_attr_new(char *command, struct attr *context, struct callback *cb, int async); struct command_saved *command_saved_new(char *command, struct navit *navit, struct callback *cb, int async); void command_saved_destroy(struct command_saved *cs); /* end of prototypes */ #ifdef __cplusplus } #endif #endif /* NAVIT_COMMAND_H */ navit-0.5.0+dfsg.1/navit/config_.c000066400000000000000000000075751264204753600166330ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "callback.h" #include "navit.h" #include "config_.h" #include "file.h" #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif struct config { NAVIT_OBJECT } *config; struct config * config_get(void) { return config; } int config_empty_ok; int configured; struct attr_iter { void *iter; }; void config_destroy(struct config *this_) { attr_list_free(this_->attrs); g_free(config); exit(0); } static void config_terminate(int sig) { dbg(lvl_debug,"terminating\n"); config_destroy(config); } static void config_new_int(void) { config=g_new0(struct config, 1); #ifndef HAVE_API_WIN32_CE signal(SIGTERM, config_terminate); #ifndef HAVE_API_WIN32 #ifndef _MSC_VER #ifndef __MINGW32__ signal(SIGPIPE, SIG_IGN); #endif /* __MINGW32__ */ #endif #endif #endif } int config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } static int config_set_attr_int(struct config *this_, struct attr *attr) { switch (attr->type) { case attr_language: setenv("LANG",attr->u.str,1); return 1; case attr_cache_size: return file_set_cache_size(attr->u.num); default: return 0; } } int config_set_attr(struct config *this_, struct attr *attr) { if (config_set_attr_int(this_, attr)) return navit_object_set_attr((struct navit_object *)this_, attr); else return 0; } int config_add_attr(struct config *this_, struct attr *attr) { if (!config) { config_new_int(); this_=config; } return navit_object_add_attr((struct navit_object *)this_, attr); } int config_remove_attr(struct config *this_, struct attr *attr) { return navit_object_remove_attr((struct navit_object *)this_, attr); } struct attr_iter * config_attr_iter_new() { return navit_object_attr_iter_new(); } void config_attr_iter_destroy(struct attr_iter *iter) { navit_object_attr_iter_destroy(iter); } struct config * config_new(struct attr *parent, struct attr **attrs) { if (configured) { dbg(lvl_error,"only one config allowed\n"); return config; } if (parent) { dbg(lvl_error,"no parent in config allowed\n"); return NULL; } if (!config) config_new_int(); config->func=&config_func; navit_object_ref((struct navit_object *)config); config->attrs=attr_generic_add_attr_list(config->attrs, attrs); while (*attrs) { if (!config_set_attr_int(config,*attrs)) { dbg(lvl_error,"failed to set attribute '%s'\n",attr_to_name((*attrs)->type)); config_destroy(config); config=NULL; break; } attrs++; } configured=1; return config; } struct object_func config_func = { attr_config, (object_func_new)config_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)config_set_attr, (object_func_add_attr)config_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/config_.h000066400000000000000000000015201264204753600166200ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif extern int main_argc; extern char * const* main_argv; extern struct config *config; extern int configured; extern int config_empty_ok; /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct config; struct config * config_get(void); void config_destroy(struct config *this_); int config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int config_set_attr(struct config *this_, struct attr *attr); int config_add_attr(struct config *this_, struct attr *attr); int config_remove_attr(struct config *this_, struct attr *attr); struct attr_iter *config_attr_iter_new(void); void config_attr_iter_destroy(struct attr_iter *iter); struct config *config_new(struct attr *parent, struct attr **attrs); /* end of prototypes */ #ifdef __cplusplus } #endif navit-0.5.0+dfsg.1/navit/coord.c000066400000000000000000000243151264204753600163240ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "debug.h" #include "item.h" #include "coord.h" #include "transform.h" #include "projection.h" /** * @defgroup coord Coordinate handling functions * @{ */ /** * Get a coordinate * * @param p Pointer to the coordinate * @returns the coordinate */ struct coord * coord_get(unsigned char **p) { struct coord *ret=(struct coord *)(*p); *p += sizeof(*ret); return ret; } struct coord * coord_new(int x, int y) { struct coord *c=g_new(struct coord, 1); c->x=x; c->y=y; return c; } struct coord * coord_new_from_attrs(struct attr *parent, struct attr **attrs) { struct attr *x,*y; x=attr_search(attrs, NULL, attr_x); y=attr_search(attrs, NULL, attr_y); if (!x || !y) return NULL; return coord_new(x->u.num, y->u.num); } void coord_destroy(struct coord *c) { g_free(c); } struct coord_rect * coord_rect_new(struct coord *lu, struct coord *rl) { struct coord_rect *r=g_new(struct coord_rect, 1); dbg_assert(lu->x <= rl->x); dbg_assert(lu->y >= rl->y); r->lu=*lu; r->rl=*rl; return r; } void coord_rect_destroy(struct coord_rect *r) { g_free(r); } int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2) { dbg_assert(r1->lu.x <= r1->rl.x); dbg_assert(r1->lu.y >= r1->rl.y); dbg_assert(r2->lu.x <= r2->rl.x); dbg_assert(r2->lu.y >= r2->rl.y); dbg(lvl_debug,"0x%x,0x%x - 0x%x,0x%x vs 0x%x,0x%x - 0x%x,0x%x\n", r1->lu.x, r1->lu.y, r1->rl.x, r1->rl.y, r2->lu.x, r2->lu.y, r2->rl.x, r2->rl.y); if (r1->lu.x > r2->rl.x) return 0; if (r1->rl.x < r2->lu.x) return 0; if (r1->lu.y < r2->rl.y) return 0; if (r1->rl.y > r2->lu.y) return 0; return 1; } int coord_rect_contains(struct coord_rect *r, struct coord *c) { dbg_assert(r->lu.x <= r->rl.x); dbg_assert(r->lu.y >= r->rl.y); if (c->x < r->lu.x) return 0; if (c->x > r->rl.x) return 0; if (c->y < r->rl.y) return 0; if (c->y > r->lu.y) return 0; return 1; } void coord_rect_extend(struct coord_rect *r, struct coord *c) { if (c->x < r->lu.x) r->lu.x=c->x; if (c->x > r->rl.x) r->rl.x=c->x; if (c->y < r->rl.y) r->rl.y=c->y; if (c->y > r->lu.y) r->lu.y=c->y; } /** * Parses \c char \a *coord_input and writes back the coordinates to \c coord \a *result, using \c projection \a output_projection. * \a *coord_input may specify its projection at the beginning. * The format for \a *coord_input can be: * \li [Proj:][-]0xXX.... [-]0xXX... - Mercator coordinates, hex integers (XX), Proj can be "mg" or "garmin", defaults to mg * \li [Proj:][D][D]Dmm.mm.. N/S [D][D]DMM.mm... E/W - lat/long (WGS 84), integer degrees (DD) and minutes as decimal fraction (MM), Proj must be "geo" or absent * \li [Proj:][-][D]D.d[d]... [-][D][D]D.d[d] - long/lat (WGS 84, note order!), degrees as decimal fraction, Proj does not matter * \li utm[zoneinfo]:[-][D]D.d[d]... [-][D][D]D.d[d] - UTM coordinates, as decimal fraction, with optional zone information (?) * Note that the spaces are relevant for parsing. * * @param *coord_input String to be parsed * @param output_projection Desired projection of the result * @param *result For returning result * @returns The lenght of the parsed string */ int coord_parse(const char *coord_input, enum projection output_projection, struct coord *result) { char *proj=NULL,*s,*co; const char *str=coord_input; int args,ret = 0; struct coord_geo g; struct coord c,offset; enum projection str_pro=projection_none; dbg(lvl_debug,"enter('%s',%d,%p)\n", coord_input, output_projection, result); s=strchr(str,' '); co=strchr(str,':'); if (co && co < s) { proj=malloc(co-str+1); strncpy(proj, str, co-str); proj[co-str]='\0'; dbg(lvl_debug,"projection=%s\n", proj); str=co+1; s=strchr(str,' '); if (!strcmp(proj, "geo")) str_pro = projection_none; else { str_pro = projection_from_name(proj,&offset); if (str_pro == projection_none) { dbg(lvl_error, "Unknown projection: %s\n", proj); goto out; } } } if (! s) { ret=0; goto out; } while (*s == ' ') { s++; } if (!strncmp(s, "0x", 2) || !strncmp(s, "-0x", 3)) { args=sscanf(str, "%i %i%n",&c.x, &c.y, &ret); if (args < 2) goto out; dbg(lvl_debug,"str='%s' x=0x%x y=0x%x c=%d\n", str, c.x, c.y, ret); dbg(lvl_debug,"rest='%s'\n", str+ret); if (str_pro == projection_none) str_pro=projection_mg; if (str_pro != output_projection) { transform_to_geo(str_pro, &c, &g); transform_from_geo(output_projection, &g, &c); } *result=c; } else if (*s == 'N' || *s == 'n' || *s == 'S' || *s == 's') { double lng, lat; char ns, ew; dbg(lvl_debug,"str='%s'\n", str); args=sscanf(str, "%lf %c %lf %c%n", &lat, &ns, &lng, &ew, &ret); dbg(lvl_debug,"args=%d\n", args); dbg(lvl_debug,"lat=%f %c lon=%f %c\n", lat, ns, lng, ew); if (args < 4) goto out; dbg(lvl_debug,"projection=%d str_pro=%d projection_none=%d\n", output_projection, str_pro, projection_none); if (str_pro == projection_none) { g.lat=floor(lat/100); lat-=g.lat*100; g.lat+=lat/60; g.lng=floor(lng/100); lng-=g.lng*100; g.lng+=lng/60; if (ns == 's' || ns == 'S') g.lat=-g.lat; if (ew == 'w' || ew == 'W') g.lng=-g.lng; dbg(lvl_debug,"transform_from_geo(%f,%f)",g.lat,g.lng); transform_from_geo(output_projection, &g, result); dbg(lvl_debug,"result 0x%x,0x%x\n", result->x,result->y); } dbg(lvl_debug,"str='%s' x=%f ns=%c y=%f ew=%c c=%d\n", str, lng, ns, lat, ew, ret); dbg(lvl_debug,"rest='%s'\n", str+ret); } else if (str_pro == projection_utm) { double x,y; args=sscanf(str, "%lf %lf%n", &x, &y, &ret); if (args < 2) goto out; c.x=x+offset.x; c.y=y+offset.y; if (str_pro != output_projection) { transform_to_geo(str_pro, &c, &g); transform_from_geo(output_projection, &g, &c); } *result=c; } else { double lng, lat; args=sscanf(str, "%lf %lf%n", &lng, &lat, &ret); if (args < 2) goto out; dbg(lvl_debug,"str='%s' x=%f y=%f c=%d\n", str, lng, lat, ret); dbg(lvl_debug,"rest='%s'\n", str+ret); g.lng=lng; g.lat=lat; transform_from_geo(output_projection, &g, result); } ret+=str-coord_input; dbg(lvl_info, "ret=%d delta=%d ret_str='%s'\n", ret, GPOINTER_TO_INT(str-coord_input), coord_input+ret); out: free(proj); return ret; } /** * A wrapper for coord_parse that also returns the projection. * For parameters see coord_parse. */ int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *pc_ret) { struct coord c; int ret; ret = coord_parse(c_str, pro, &c); pc_ret->x = c.x; pc_ret->y = c.y; pc_ret->pro = pro; return ret; } void coord_print(enum projection pro, struct coord *c, FILE *out) { unsigned int x; unsigned int y; char *sign_x = ""; char *sign_y = ""; if ( c->x < 0 ) { x = -c->x; sign_x = "-"; } else { x = c->x; } if ( c->y < 0 ) { y = -c->y; sign_y = "-"; } else { y = c->y; } fprintf( out, "%s: %s0x%x %s0x%x\n", projection_to_name( pro ), sign_x, x, sign_y, y ); return; } /** * @brief Converts a lat/lon into a text formatted text string. * @param lat The latitude (if lat is 360 or greater, the latitude will be omitted) * @param lng The longitude (if lng is 360 or greater, the longitude will be omitted) * @param fmt The format to use. * @li DEGREES_DECIMAL=>Degrees with decimal places, i.e. 20.5000°N 110.5000°E * @li DEGREES_MINUTES=>Degrees and minutes, i.e. 20°30.00'N 110°30.00'E * @li DEGREES_MINUTES_SECONDS=>Degrees, minutes and seconds, i.e. 20°30'30.00"N 110°30'30"E * * * @param buffer A buffer large enough to hold the output + a terminating NULL (up to 31 bytes) * @param size The size of the buffer * */ void coord_format(float lat,float lng, enum coord_format fmt, char * buffer, int size) { char lat_c='N'; char lng_c='E'; float lat_deg,lat_min,lat_sec; float lng_deg,lng_min,lng_sec; int size_used=0; if (lng < 0) { lng=-lng; lng_c='W'; } if (lat < 0) { lat=-lat; lat_c='S'; } lat_deg=lat; lat_min=(lat-floor(lat_deg))*60; lat_sec=fmod(lat*3600,60); lng_deg=lng; lng_min=(lng-floor(lng_deg))*60; lng_sec=fmod(lng*3600,60); switch(fmt) { case DEGREES_DECIMAL: if (lat<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.6f°%c",lat,lat_c); if ((lat<360)&&(lng<360)) size_used+=g_snprintf(buffer+size_used,size-size_used," "); if (lng<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.7f°%c",lng,lng_c); break; case DEGREES_MINUTES: if (lat<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.0f°%07.4f' %c",floor(lat_deg),lat_min,lat_c); if ((lat<360)&&(lng<360)) size_used+=g_snprintf(buffer+size_used,size-size_used," "); if (lng<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.0f°%07.4f' %c",floor(lng_deg),lng_min,lng_c); break; case DEGREES_MINUTES_SECONDS: if (lat<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.0f°%02.0f'%05.2f\" %c",floor(lat_deg),floor(lat_min),lat_sec,lat_c); if ((lat<360)&&(lng<360)) size_used+=g_snprintf(buffer+size_used,size-size_used," "); if (lng<360) size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.0f°%02.0f'%05.2f\" %c",floor(lng_deg),floor(lng_min),lng_sec,lng_c); break; } } unsigned int coord_hash(const void *key) { const struct coord *c=key; return c->x^c->y; } int coord_equal(const void *a, const void *b) { const struct coord *c_a=a; const struct coord *c_b=b; if (c_a->x == c_b->x && c_a->y == c_b->y) return TRUE; return FALSE; } /** @} */ navit-0.5.0+dfsg.1/navit/coord.h000066400000000000000000000111651264204753600163300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COORD_H #define NAVIT_COORD_H #ifdef __cplusplus extern "C" { #endif #include #include "config.h" #include "projection.h" #define coord_is_equal(a,b) ((a).x==(b).x && (a).y==(b).y) /*! A integer mercator coordinate */ struct coord { int x; /*!< X-Value */ int y; /*!< Y-Value */ }; /*! A integer mercator coordinate carrying its projection */ struct pcoord { enum projection pro; int x; /*!< X-Value */ int y; /*!< Y-Value */ }; struct coord_rect { struct coord lu; struct coord rl; }; #ifdef AVOID_FLOAT /** * On platforms where we are trying to avoid floats, sometimes we can't. * It is better on these platforms to use single precision floating points * over double percision ones since performance is much better. */ typedef float navit_float; #define navit_sin(x) sinf(x) #define navit_cos(x) cosf(x) #define navit_tan(x) tanf(x) #define navit_atan(x) atanf(x) #define navit_acos(x) acosf(x) #define navit_asin(x) asinf(x) #define navit_sqrt(x) sqrtf(x) #else typedef double navit_float; #define navit_sin(x) sin(x) #define navit_cos(x) cos(x) #define navit_tan(x) tan(x) #define navit_atan(x) atan(x) #define navit_acos(x) acos(x) #define navit_asin(x) asin(x) #define navit_sqrt(x) sqrt(x) #endif //! A double mercator coordinate struct coord_d { double x; /*!< X-Value */ double y; /*!< Y-Value */ }; //! A WGS84 coordinate struct coord_geo { navit_float lng; /*!< Longitude */ navit_float lat; /*!< Latitude */ }; //! A cartesian coordinate struct coord_geo_cart { navit_float x; /*!< X-Value */ navit_float y; /*!< Y-Value */ navit_float z; /*!< Z-Value */ }; /** * An enumeration of formats for printing geographic coordinates in. * */ enum coord_format { /** * Degrees with decimal places. * Ie 20.5000 N 110.5000 E */ DEGREES_DECIMAL, /** * Degrees and minutes. * ie 20 30.00 N 110 30.00 E */ DEGREES_MINUTES, /** * Degrees, minutes and seconds. * ie 20 30 30.00 N 110 30 30 E */ DEGREES_MINUTES_SECONDS }; enum projection; struct attr; struct coord * coord_get(unsigned char **p); struct coord * coord_new(int x, int y); struct coord * coord_new_from_attrs(struct attr *parent, struct attr **attrs); void coord_destroy(struct coord *c); int coord_parse(const char *c_str, enum projection pro, struct coord *c_ret); int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *c_ret); void coord_print(enum projection pro, struct coord *c, FILE *out); struct coord_rect * coord_rect_new(struct coord *lu, struct coord *rl); void coord_rect_destroy(struct coord_rect *r); int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2); int coord_rect_contains(struct coord_rect *r, struct coord *c); void coord_rect_extend(struct coord_rect *r, struct coord *c); void coord_format(float lat,float lng, enum coord_format, char * buffer, int size); /* prototypes */ enum coord_format; enum projection; struct attr; struct coord; struct coord_rect; struct pcoord; struct coord *coord_get(unsigned char **p); struct coord *coord_new(int x, int y); struct coord *coord_new_from_attrs(struct attr *parent, struct attr **attrs); void coord_destroy(struct coord *c); struct coord_rect *coord_rect_new(struct coord *lu, struct coord *rl); void coord_rect_destroy(struct coord_rect *r); int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2); int coord_rect_contains(struct coord_rect *r, struct coord *c); void coord_rect_extend(struct coord_rect *r, struct coord *c); int coord_parse(const char *c_str, enum projection pro, struct coord *c_ret); int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *pc_ret); void coord_print(enum projection pro, struct coord *c, FILE *out); void coord_format(float lat, float lng, enum coord_format fmt, char *buffer, int size); unsigned int coord_hash(const void *key); int coord_equal(const void *a, const void *b); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/country.c000066400000000000000000000454521264204753600167260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "item.h" #include "country.h" #include "search.h" #include "linguistics.h" #include "navit_nls.h" struct country { int id; const char *car; const char *iso2; const char *iso3; const char *name; }; /* List of all known countries and their codes. * If you update this list, look at country_table array in maptool/osm.c also. */ static struct country country[]= { { 20, "AND", "AD", "AND", /* 020 */ _n("Andorra")}, {784, "UAE", "AE", "ARE", /* 784 */ _n("United Arab Emirates")}, { 4, "AFG", "AF", "AFG", /* 004 */ _n("Afghanistan")}, { 28, "AG", "AG", "ATG", /* 028 */ _n("Antigua and Barbuda")}, {660, NULL, "AI", "AIA", /* 660 */ _n("Anguilla")}, { 8, "AL", "AL", "ALB", /* 008 */ _n("Albania")}, { 51, "ARM", "AM", "ARM", /* 051 */ _n("Armenia")}, {530, "NA", "AN", "ANT", /* 530 */ _n("Netherlands Antilles")}, { 24, "ANG", "AO", "AGO", /* 024 */ _n("Angola")}, { 10, NULL, "AQ", "ATA", /* 010 */ _n("Antarctica")}, { 32, "RA", "AR", "ARG", /* 032 */ _n("Argentina")}, { 16, NULL, "AS", "ASM", /* 016 */ _n("American Samoa")}, { 40, "A", "AT", "AUT", /* 040 */ _n("Austria")}, { 36, "AUS", "AU", "AUS", /* 036 */ _n("Australia")}, {533, "ARU", "AW", "ABW", /* 533 */ _n("Aruba")}, {248, "AX", "AX", "ALA", /* 248 */ _n("Aland Islands")}, { 31, "AZ", "AZ", "AZE", /* 031 */ _n("Azerbaijan")}, { 70, "BiH", "BA", "BIH", /* 070 */ _n("Bosnia and Herzegovina")}, { 52, "BDS", "BB", "BRB", /* 052 */ _n("Barbados")}, { 50, "BD", "BD", "BGD", /* 050 */ _n("Bangladesh")}, { 56, "B", "BE", "BEL", /* 056 */ _n("Belgium")}, {854, "BF", "BF", "BFA", /* 854 */ _n("Burkina Faso")}, {100, "BG", "BG", "BGR", /* 100 */ _n("Bulgaria")}, { 48, "BRN", "BH", "BHR", /* 048 */ _n("Bahrain")}, {108, "RU", "BI", "BDI", /* 108 */ _n("Burundi")}, {204, "BJ", "BJ", "BEN", /* 204 */ _n("Benin")}, {652, NULL, "BL", "BLM", /* 652 */ _n("Saint Barthelemy")}, { 60, NULL, "BM", "BMU", /* 060 */ _n("Bermuda")}, { 96, "BRU", "BN", "BRN", /* 096 */ _n("Brunei Darussalam")}, { 68, "BOL", "BO", "BOL", /* 068 */ _n("Bolivia")}, {535, NULL, "BQ", "BES", /* 535 */ _n("Bonaire, Sint Eustatius and Saba")}, { 76, "BR", "BR", "BRA", /* 076 */ _n("Brazil")}, { 44, "BS", "BS", "BHS", /* 044 */ _n("Bahamas")}, { 64, "BHT", "BT", "BTN", /* 064 */ _n("Bhutan")}, { 74, NULL, "BV", "BVT", /* 074 */ _n("Bouvet Island")}, { 72, "RB", "BW", "BWA", /* 072 */ _n("Botswana")}, {112, "BY", "BY", "BLR", /* 112 */ _n("Belarus")}, { 84, "BZ", "BZ", "BLZ", /* 084 */ _n("Belize")}, {124, "CDN", "CA", "CAN", /* 124 */ _n("Canada")}, {166, NULL, "CC", "CCK", /* 166 */ _n("Cocos (Keeling) Islands")}, {180, "CGO", "CD", "COD", /* 180 */ _n("Congo, Democratic Republic of the")}, {140, "RCA", "CF", "CAF", /* 140 */ _n("Central African Republic")}, {178, NULL, "CG", "COG", /* 178 */ _n("Congo")}, {756, "CH", "CH", "CHE", /* 756 */ _n("Switzerland")}, {384, "CI", "CI", "CIV", /* 384 */ _n("Cote d'Ivoire")}, {184, NULL, "CK", "COK", /* 184 */ _n("Cook Islands")}, {152, "RCH", "CL", "CHL", /* 152 */ _n("Chile")}, {120, "CAM", "CM", "CMR", /* 120 */ _n("Cameroon")}, {156, "RC", "CN", "CHN", /* 156 */ _n("China")}, {170, "CO", "CO", "COL", /* 170 */ _n("Colombia")}, {188, "CR", "CR", "CRI", /* 188 */ _n("Costa Rica")}, {192, "C", "CU", "CUB", /* 192 */ _n("Cuba")}, {132, "CV", "CV", "CPV", /* 132 */ _n("Cape Verde")}, {531, NULL, "CW", "CUW", /* 531 */ _n("Curacao")}, {162, NULL, "CX", "CXR", /* 162 */ _n("Christmas Island")}, {196, "CY", "CY", "CYP", /* 196 */ _n("Cyprus")}, {203, "CZ", "CZ", "CZE", /* 203 */ _n("Czech Republic")}, {276, "D", "DE", "DEU", /* 276 */ _n("Germany")}, {262, "DJI", "DJ", "DJI", /* 262 */ _n("Djibouti")}, {208, "DK", "DK", "DNK", /* 208 */ _n("Denmark")}, {212, "WD", "DM", "DMA", /* 212 */ _n("Dominica")}, {214, "DOM", "DO", "DOM", /* 214 */ _n("Dominican Republic")}, { 12, "DZ", "DZ", "DZA", /* 012 */ _n("Algeria")}, {218, "EC", "EC", "ECU", /* 218 */ _n("Ecuador")}, {233, "EST", "EE", "EST", /* 233 */ _n("Estonia")}, {818, "ET", "EG", "EGY", /* 818 */ _n("Egypt")}, {732, "WSA", "EH", "ESH", /* 732 */ _n("Western Sahara")}, {232, "ER", "ER", "ERI", /* 232 */ _n("Eritrea")}, {724, "E", "ES", "ESP", /* 724 */ _n("Spain")}, {231, "ETH", "ET", "ETH", /* 231 */ _n("Ethiopia")}, {246, "FIN", "FI", "FIN", /* 246 */ _n("Finland")}, {242, "FJI", "FJ", "FJI", /* 242 */ _n("Fiji")}, {238, NULL, "FK", "FLK", /* 238 */ _n("Falkland Islands (Malvinas)")}, {583, "FSM", "FM", "FSM", /* 583 */ _n("Micronesia, Federated States of")}, {234, "FO", "FO", "FRO", /* 234 */ _n("Faroe Islands")}, {250, "F", "FR", "FRA", /* 250 */ _n("France")}, {266, "G", "GA", "GAB", /* 266 */ _n("Gabon")}, {826, "GB", "GB", "GBR", /* 826 */ _n("United Kingdom")}, {308, "WG", "GD", "GRD", /* 308 */ _n("Grenada")}, {268, "GE", "GE", "GEO", /* 268 */ _n("Georgia")}, {254, NULL, "GF", "GUF", /* 254 */ _n("French Guiana")}, {831, NULL, "GG", "GGY", /* 831 */ _n("Guernsey")}, {288, "GH", "GH", "GHA", /* 288 */ _n("Ghana")}, {292, "GBZ", "GI", "GIB", /* 292 */ _n("Gibraltar")}, {304, "KN", "GL", "GRL", /* 304 */ _n("Greenland")}, {270, "WAG", "GM", "GMB", /* 270 */ _n("Gambia")}, {324, "RG", "GN", "GIN", /* 324 */ _n("Guinea")}, {312, NULL, "GP", "GLP", /* 312 */ _n("Guadeloupe")}, {226, "GQ", "GQ", "GNQ", /* 226 */ _n("Equatorial Guinea")}, {300, "GR", "GR", "GRC", /* 300 */ _n("Greece")}, {239, NULL, "GS", "SGS", /* 239 */ _n("South Georgia and the South Sandwich Islands")}, {320, "GCA", "GT", "GTM", /* 320 */ _n("Guatemala")}, {316, NULL, "GU", "GUM", /* 316 */ _n("Guam")}, {624, "GUB", "GW", "GNB", /* 624 */ _n("Guinea-Bissau")}, {328, "GUY", "GY", "GUY", /* 328 */ _n("Guyana")}, {344, "HK", "HK", "HKG", /* 344 */ _n("Hong Kong")}, {334, NULL, "HM", "HMD", /* 334 */ _n("Heard Island and McDonald Islands")}, {340, "HN", "HN", "HND", /* 340 */ _n("Honduras")}, {191, "HR", "HR", "HRV", /* 191 */ _n("Croatia")}, {332, "RH", "HT", "HTI", /* 332 */ _n("Haiti")}, {348, "H", "HU", "HUN", /* 348 */ _n("Hungary")}, {360, "RI", "ID", "IDN", /* 360 */ _n("Indonesia")}, {372, "IRL", "IE", "IRL", /* 372 */ _n("Ireland")}, {376, "IL", "IL", "ISR", /* 376 */ _n("Israel")}, {833, NULL, "IM", "IMN", /* 833 */ _n("Isle of Man")}, {356, "IND", "IN", "IND", /* 356 */ _n("India")}, { 86, NULL, "IO", "IOT", /* 086 */ _n("British Indian Ocean Territory")}, {368, "IRQ", "IQ", "IRQ", /* 368 */ _n("Iraq")}, {364, "IR", "IR", "IRN", /* 364 */ _n("Iran, Islamic Republic of")}, {352, "IS", "IS", "ISL", /* 352 */ _n("Iceland")}, {380, "I", "IT", "ITA", /* 380 */ _n("Italy")}, {832, NULL, "JE", "JEY", /* 832 */ _n("Jersey")}, {388, "JA", "JM", "JAM", /* 388 */ _n("Jamaica")}, {400, "JOR", "JO", "JOR", /* 400 */ _n("Jordan")}, {392, "J", "JP", "JPN", /* 392 */ _n("Japan")}, {404, "EAK", "KE", "KEN", /* 404 */ _n("Kenya")}, {417, "KS", "KG", "KGZ", /* 417 */ _n("Kyrgyzstan")}, {116, "K", "KH", "KHM", /* 116 */ _n("Cambodia")}, {296, "KIR", "KI", "KIR", /* 296 */ _n("Kiribati")}, {174, "COM", "KM", "COM", /* 174 */ _n("Comoros")}, {659, "KAN", "KN", "KNA", /* 659 */ _n("Saint Kitts and Nevis")}, {408, "KP", "KP", "PRK", /* 408 */ _n("Korea, Democratic People's Republic of")}, {410, "ROK", "KR", "KOR", /* 410 */ _n("Korea, Republic of")}, {414, "KWT", "KW", "KWT", /* 414 */ _n("Kuwait")}, {136, NULL, "KY", "CYM", /* 136 */ _n("Cayman Islands")}, {398, "KZ", "KZ", "KAZ", /* 398 */ _n("Kazakhstan")}, {418, "LAO", "LA", "LAO", /* 418 */ _n("Lao People's Democratic Republic")}, {422, "RL", "LB", "LBN", /* 422 */ _n("Lebanon")}, {662, "WL", "LC", "LCA", /* 662 */ _n("Saint Lucia")}, {438, "FL", "LI", "LIE", /* 438 */ _n("Liechtenstein")}, {144, "CL", "LK", "LKA", /* 144 */ _n("Sri Lanka")}, {430, "LB", "LR", "LBR", /* 430 */ _n("Liberia")}, {426, "LS", "LS", "LSO", /* 426 */ _n("Lesotho")}, {440, "LT", "LT", "LTU", /* 440 */ _n("Lithuania")}, {442, "L", "LU", "LUX", /* 442 */ _n("Luxembourg")}, {428, "LV", "LV", "LVA", /* 428 */ _n("Latvia")}, {434, "LAR", "LY", "LBY", /* 434 */ _n("Libya")}, {504, "MA", "MA", "MAR", /* 504 */ _n("Morocco")}, {492, "MC", "MC", "MCO", /* 492 */ _n("Monaco")}, {498, "MD", "MD", "MDA", /* 498 */ _n("Moldova, Republic of")}, {499, "MNE", "ME", "MNE", /* 499 */ _n("Montenegro")}, {663, NULL, "MF", "MAF", /* 663 */ _n("Saint Martin (French part)")}, {450, "RM", "MG", "MDG", /* 450 */ _n("Madagascar")}, {584, "MH", "MH", "MHL", /* 584 */ _n("Marshall Islands")}, {807, "MK", "MK", "MKD", /* 807 */ _n("Macedonia, the former Yugoslav Republic of")}, {466, "RMM", "ML", "MLI", /* 466 */ _n("Mali")}, {104, "MYA", "MM", "MMR", /* 104 */ _n("Myanmar")}, {496, "MGL", "MN", "MNG", /* 496 */ _n("Mongolia")}, {446, NULL, "MO", "MAC", /* 446 */ _n("Macao")}, {580, NULL, "MP", "MNP", /* 580 */ _n("Northern Mariana Islands")}, {474, NULL, "MQ", "MTQ", /* 474 */ _n("Martinique")}, {478, "RIM", "MR", "MRT", /* 478 */ _n("Mauritania")}, {500, NULL, "MS", "MSR", /* 500 */ _n("Montserrat")}, {470, "M", "MT", "MLT", /* 470 */ _n("Malta")}, {480, "MS", "MU", "MUS", /* 480 */ _n("Mauritius")}, {462, "MV", "MV", "MDV", /* 462 */ _n("Maldives")}, {454, "MW", "MW", "MWI", /* 454 */ _n("Malawi")}, {484, "MEX", "MX", "MEX", /* 484 */ _n("Mexico")}, {458, "MAL", "MY", "MYS", /* 458 */ _n("Malaysia")}, {508, "MOC", "MZ", "MOZ", /* 508 */ _n("Mozambique")}, {516, "NAM", "NA", "NAM", /* 516 */ _n("Namibia")}, {540, "NCL", "NC", "NCL", /* 540 */ _n("New Caledonia")}, {562, "RN", "NE", "NER", /* 562 */ _n("Niger")}, {574, NULL, "NF", "NFK", /* 574 */ _n("Norfolk Island")}, {566, "NGR", "NG", "NGA", /* 566 */ _n("Nigeria")}, {558, "NIC", "NI", "NIC", /* 558 */ _n("Nicaragua")}, {528, "NL", "NL", "NLD", /* 528 */ _n("Netherlands")}, {578, "N", "NO", "NOR", /* 578 */ _n("Norway")}, {524, "NEP", "NP", "NPL", /* 524 */ _n("Nepal")}, {520, "NAU", "NR", "NRU", /* 520 */ _n("Nauru")}, {570, NULL, "NU", "NIU", /* 570 */ _n("Niue")}, {554, "NZ", "NZ", "NZL", /* 554 */ _n("New Zealand")}, {512, "OM", "OM", "OMN", /* 512 */ _n("Oman")}, {591, "PA", "PA", "PAN", /* 591 */ _n("Panama")}, {604, "PE", "PE", "PER", /* 604 */ _n("Peru")}, {258, NULL, "PF", "PYF", /* 258 */ _n("French Polynesia")}, {598, "PNG", "PG", "PNG", /* 598 */ _n("Papua New Guinea")}, {608, "RP", "PH", "PHL", /* 608 */ _n("Philippines")}, {586, "PK", "PK", "PAK", /* 586 */ _n("Pakistan")}, {616, "PL", "PL", "POL", /* 616 */ _n("Poland")}, {666, NULL, "PM", "SPM", /* 666 */ _n("Saint Pierre and Miquelon")}, {612, NULL, "PN", "PCN", /* 612 */ _n("Pitcairn")}, {630, "PRI", "PR", "PRI", /* 630 */ _n("Puerto Rico")}, {275, "AUT", "PS", "PSE", /* 275 */ _n("Palestinian Territory, Occupied")}, {620, "P", "PT", "PRT", /* 620 */ _n("Portugal")}, {585, "PAL", "PW", "PLW", /* 585 */ _n("Palau")}, {600, "PY", "PY", "PRY", /* 600 */ _n("Paraguay")}, {634, "Q", "QA", "QAT", /* 634 */ _n("Qatar")}, {638, NULL, "RE", "REU", /* 638 */ _n("Reunion")}, {642, "RO", "RO", "ROU", /* 642 */ _n("Romania")}, {688, "SRB", "RS", "SRB", /* 688 */ _n("Serbia")}, {643, "RUS", "RU", "RUS", /* 643 */ _n("Russian Federation")}, {646, "RWA", "RW", "RWA", /* 646 */ _n("Rwanda")}, {682, "KSA", "SA", "SAU", /* 682 */ _n("Saudi Arabia")}, { 90, "SOL", "SB", "SLB", /* 090 */ _n("Solomon Islands")}, {690, "SY", "SC", "SYC", /* 690 */ _n("Seychelles")}, {736, "SUD", "SD", "SDN", /* 736 */ _n("Sudan")}, {752, "S", "SE", "SWE", /* 752 */ _n("Sweden")}, {702, "SGP", "SG", "SGP", /* 702 */ _n("Singapore")}, {654, NULL, "SH", "SHN", /* 654 */ _n("Saint Helena")}, {705, "SLO", "SI", "SVN", /* 705 */ _n("Slovenia")}, {744, NULL, "SJ", "SJM", /* 744 */ _n("Svalbard and Jan Mayen")}, {703, "SK", "SK", "SVK", /* 703 */ _n("Slovakia")}, {694, "WAL", "SL", "SLE", /* 694 */ _n("Sierra Leone")}, {674, "RSM", "SM", "SMR", /* 674 */ _n("San Marino")}, {686, "SN", "SN", "SEN", /* 686 */ _n("Senegal")}, {706, "SO", "SO", "SOM", /* 706 */ _n("Somalia")}, {740, "SME", "SR", "SUR", /* 740 */ _n("Suriname")}, {728, NULL, "SS", "SSD", /* 728 */ _n("South Sudan")}, {678, "STP", "ST", "STP", /* 678 */ _n("Sao Tome and Principe")}, {222, "ES", "SV", "SLV", /* 222 */ _n("El Salvador")}, {534, NULL, "SX", "SXM", /* 534 */ _n("Sint Maarten (Dutch part)")}, {760, "SYR", "SY", "SYR", /* 760 */ _n("Syrian Arab Republic")}, {748, "SD", "SZ", "SWZ", /* 748 */ _n("Swaziland")}, {796, NULL, "TC", "TCA", /* 796 */ _n("Turks and Caicos Islands")}, {148, "TD", "TD", "TCD", /* 148 */ _n("Chad")}, {260, "ARK", "TF", "ATF", /* 260 */ _n("French Southern Territories")}, {768, "RT", "TG", "TGO", /* 768 */ _n("Togo")}, {764, "T", "TH", "THA", /* 764 */ _n("Thailand")}, {762, "TJ", "TJ", "TJK", /* 762 */ _n("Tajikistan")}, {772, NULL, "TK", "TKL", /* 772 */ _n("Tokelau")}, {626, "TL", "TL", "TLS", /* 626 */ _n("Timor-Leste")}, {795, "TM", "TM", "TKM", /* 795 */ _n("Turkmenistan")}, {788, "TN", "TN", "TUN", /* 788 */ _n("Tunisia")}, {776, "TON", "TO", "TON", /* 776 */ _n("Tonga")}, {792, "TR", "TR", "TUR", /* 792 */ _n("Turkey")}, {780, "TT", "TT", "TTO", /* 780 */ _n("Trinidad and Tobago")}, {798, "TUV", "TV", "TUV", /* 798 */ _n("Tuvalu")}, {158, NULL, "TW", "TWN", /* 158 */ _n("Taiwan, Province of China")}, {834, "EAT", "TZ", "TZA", /* 834 */ _n("Tanzania, United Republic of")}, {804, "UA", "UA", "UKR", /* 804 */ _n("Ukraine")}, {800, "EAU", "UG", "UGA", /* 800 */ _n("Uganda")}, {581, NULL, "UM", "UMI", /* 581 */ _n("United States Minor Outlying Islands")}, {840, "USA", "US", "USA", /* 840 */ _n("United States")}, {858, "ROU", "UY", "URY", /* 858 */ _n("Uruguay")}, {860, "UZ", "UZ", "UZB", /* 860 */ _n("Uzbekistan")}, {336, "SCV", "VA", "VAT", /* 336 */ _n("Holy See (Vatican City State)")}, {670, "WV", "VC", "VCT", /* 670 */ _n("Saint Vincent and the Grenadines")}, {862, "YV", "VE", "VEN", /* 862 */ _n("Venezuela")}, { 92, NULL, "VG", "VGB", /* 092 */ _n("Virgin Islands, British")}, {850, NULL, "VI", "VIR", /* 850 */ _n("Virgin Islands, U.S.")}, {704, "VN", "VN", "VNM", /* 704 */ _n("Viet Nam")}, {548, "VAN", "VU", "VUT", /* 548 */ _n("Vanuatu")}, {876, NULL, "WF", "WLF", /* 876 */ _n("Wallis and Futuna")}, {882, "WS", "WS", "WSM", /* 882 */ _n("Samoa")}, {887, "YAR", "YE", "YEM", /* 887 */ _n("Yemen")}, {175, NULL, "YT", "MYT", /* 175 */ _n("Mayotte")}, {710, "ZA", "ZA", "ZAF", /* 710 */ _n("South Africa") }, {894, "Z", "ZM", "ZMB", /* 894 */ _n("Zambia")}, {716, "ZW", "ZW", "ZWE", /* 716 */ _n("Zimbabwe")}, {999, "*", "*", "*", _n("* Unknown, add is_in tags to those cities")}, }; struct country_search { struct attr search; int len; int partial; struct item item; int count; struct country *country; enum attr_type attr_next; }; static int country_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct country_search *this_=priv_data; struct country *country=this_->country; attr->type=attr_type; switch (attr_type) { case attr_any: while (this_->attr_next != attr_none) { if (country_attr_get(this_, this_->attr_next, attr)) return 1; } return 0; // Cast to char* necessary but safe, because our callers know // not to modify attr->u.str (hopefully). case attr_label: attr->u.str=(char*)navit_nls_gettext(country->name); this_->attr_next=attr_country_id; return 1; case attr_country_id: attr->u.num=country->id; this_->attr_next=country->car ? attr_country_car : attr_country_iso2; return 1; case attr_country_car: attr->u.str=(char*)country->car; this_->attr_next=attr_country_iso2; return attr->u.str ? 1 : 0; case attr_country_iso2: attr->u.str=(char*)country->iso2; this_->attr_next=attr_country_iso3; return 1; case attr_country_iso3: attr->u.str=(char*)country->iso3; this_->attr_next=attr_country_name; return 1; case attr_country_name: attr->u.str=(char*)navit_nls_gettext(country->name); this_->attr_next=attr_none; return 1; default: return 0; } } struct item_methods country_meth = { NULL, /* coord_rewind */ NULL, /* coord_get */ NULL, /* attr_rewind */ country_attr_get, /* attr_get */ }; struct country_search * country_search_new(struct attr *search, int partial) { struct country_search *ret=g_new(struct country_search, 1); ret->search=*search; ret->search.u.str=linguistics_casefold(ret->search.u.str); if (search->type != attr_country_id) ret->len=strlen(ret->search.u.str); else ret->len=0; ret->partial=partial; ret->count=0; ret->item.type=type_country_label; ret->item.id_hi=0; ret->item.map=NULL; ret->item.meth=&country_meth; ret->item.priv_data=ret; return ret; } static int match(struct country_search *this_, enum attr_type type, const char *name) { int ret; if (!name) return 0; if (this_->search.type != type && this_->search.type != attr_country_all) return 0; ret=linguistics_compare(name, this_->search.u.str, linguistics_cmp_expand | (this_->partial?linguistics_cmp_partial:0) | linguistics_cmp_words)==0; return ret; } struct item * country_search_get_item(struct country_search *this_) { for (;;) { if (this_->count >= sizeof(country)/sizeof(struct country)) return NULL; this_->country=&country[this_->count++]; if ((this_->search.type == attr_country_id && this_->search.u.num == this_->country->id) || match(this_, attr_country_iso3, this_->country->iso3) || match(this_, attr_country_iso2, this_->country->iso2) || match(this_, attr_country_car, this_->country->car) || match(this_, attr_country_name, navit_nls_gettext(this_->country->name))) { this_->item.id_lo=this_->country->id; return &this_->item; } } } static struct attr country_default_attr; static char iso2[3]; struct attr * country_default(void) { char *lang; if (country_default_attr.u.str) return &country_default_attr; lang=getenv("LANG"); if (!lang || strlen(lang) < 5) return NULL; strncpy(iso2, lang+3, 2); country_default_attr.type=attr_country_iso2; country_default_attr.u.str=iso2; return &country_default_attr; } void country_search_destroy(struct country_search *this_) { g_free(this_->search.u.str); g_free(this_); } navit-0.5.0+dfsg.1/navit/country.h000066400000000000000000000023121264204753600167170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_COUNTRY_H #define NAVIT_COUNTRY_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ struct attr; struct country_search; struct item; struct country_search *country_search_new(struct attr *search, int partial); struct item *country_search_get_item(struct country_search *this_); struct attr *country_default(void); void country_search_destroy(struct country_search *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/data.h000066400000000000000000000043201264204753600161260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DATA_H #define NAVIT_DATA_H #include "config.h" #ifdef WORDS_BIGENDIAN #include #endif static inline unsigned char get_u8(unsigned char **p) { return *((*p)++); } static inline unsigned short get_u16(unsigned char **p) { unsigned short ret; ret=*((unsigned short *)*p); *p+=sizeof(unsigned short); #ifdef WORDS_BIGENDIAN return __bswap_16(ret); #else return ret; #endif } static inline unsigned short get_u16_unal(unsigned char **p) { unsigned short ret; ret=*(*p)++; ret|=(*(*p)++) << 8; return ret; } static inline unsigned int get_u24(unsigned char **p) { unsigned long ret; ret=get_u16(p); ret|=*((*p)++) << 16; return ret; } static inline unsigned int get_u24_unal(unsigned char **p) { unsigned long ret; ret=get_u16_unal(p); ret|=*((*p)++) << 16; return ret; } static inline unsigned int get_u32(unsigned char **p) { unsigned long ret; ret=*((unsigned int *)*p); *p+=sizeof(unsigned int); #ifdef WORDS_BIGENDIAN return __bswap_32(ret); #else return ret; #endif } static inline unsigned int get_u32_unal(unsigned char **p) { unsigned long ret; ret=*(*p)++; ret|=(*(*p)++) << 8; ret|=(*(*p)++) << 16; ret|=(*(*p)++) << 24; return ret; } static inline char * get_string(unsigned char **p) { char *ret=(char *)(*p); while (**p) (*p)++; (*p)++; return ret; } #define L(x) ({ unsigned char *t=(unsigned char *)&(x); t[0] | (t[1] << 8) | (t[2] << 16) | (t[3] << 24); }) #endif navit-0.5.0+dfsg.1/navit/data_window.c000066400000000000000000000021271264204753600175130ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "data_window.h" void datawindow_mode(struct datawindow *win, int start) { win->meth.mode(win->priv, start); } void datawindow_add(struct datawindow *win, struct param_list *param, int count) { win->meth.add(win->priv, param, count); } void datawindow_destroy(struct datawindow *win) { win->meth.destroy(win->priv); g_free(win); } navit-0.5.0+dfsg.1/navit/data_window.h000066400000000000000000000025561264204753600175260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DATA_WINDOW_H #define NAVIT_DATA_WINDOW_H struct datawindow; struct param_list; struct datawindow_priv; struct datawindow_methods { void (*destroy)(struct datawindow_priv *win); void (*add)(struct datawindow_priv *win, struct param_list *param, int count); void (*mode)(struct datawindow_priv *win, int start); }; struct datawindow { struct datawindow_priv *priv; struct datawindow_methods meth; }; void datawindow_destroy(struct datawindow *win); void datawindow_add(struct datawindow *win, struct param_list *param, int count); void datawindow_mode(struct datawindow *win, int start); #endif navit-0.5.0+dfsg.1/navit/data_window_int.h000066400000000000000000000017411264204753600203730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DATA_WINDOW_INT_H #define NAVIT_DATA_WINDOW_INT_H struct data_window { GtkWidget *window; GtkWidget *scrolled_window; GtkWidget *treeview; void(*callback)(struct data_window *, char **cols); }; #endif navit-0.5.0+dfsg.1/navit/debug.c000066400000000000000000000306521264204753600163050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "config.h" #include "file.h" #include "item.h" #include "debug.h" #ifdef HAVE_API_ANDROID #include #endif #if defined HAVE_API_WIN32_CE || defined _MSC_VER #include #include #endif #ifdef HAVE_SOCKET #include #include #include #include static int debug_socket=-1; static struct sockaddr_in debug_sin; #endif #define DEFAULT_DEBUG_LEVEL lvl_error dbg_level max_debug_level=DEFAULT_DEBUG_LEVEL; #define GLOBAL_DEBUG_LEVEL_UNSET lvl_unset dbg_level global_debug_level=GLOBAL_DEBUG_LEVEL_UNSET; int segv_level=0; int timestamp_prefix=0; static int dummy; static GHashTable *debug_hash; static gchar *gdb_program; static FILE *debug_fp; #if defined(_WIN32) || defined(__CEGCC__) static void sigsegv(int sig) { } #else #include static void sigsegv(int sig) { char buffer[256]; if (segv_level > 1) sprintf(buffer, "gdb -ex bt %s %d", gdb_program, getpid()); else sprintf(buffer, "gdb -ex bt -ex detach -ex quit %s %d", gdb_program, getpid()); system(buffer); exit(1); } #endif void debug_init(const char *program_name) { #ifndef HAVE_API_ANDROID gdb_program=g_strdup(program_name); signal(SIGSEGV, sigsegv); #endif debug_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED debug_fp = stdout; #else debug_fp = stderr; #endif } static void debug_update_level(gpointer key, gpointer value, gpointer user_data) { if (max_debug_level < GPOINTER_TO_INT(value)) max_debug_level = GPOINTER_TO_INT(value); } void debug_set_global_level(dbg_level level, int override_old_value ) { if (global_debug_level == GLOBAL_DEBUG_LEVEL_UNSET || override_old_value) { global_debug_level=level; if (max_debug_level < global_debug_level){ max_debug_level = global_debug_level; } } } void debug_level_set(const char *name, dbg_level level) { if (!strcmp(name, "segv")) { #ifndef HAVE_API_ANDROID segv_level=level; if (segv_level) signal(SIGSEGV, sigsegv); else signal(SIGSEGV, NULL); #endif } else if (!strcmp(name, "timestamps")) { timestamp_prefix=level; } else if (!strcmp(name, DEBUG_MODULE_GLOBAL)) { debug_set_global_level(level, 0); } else { g_hash_table_insert(debug_hash, g_strdup(name), GINT_TO_POINTER(level)); g_hash_table_foreach(debug_hash, debug_update_level, NULL); } } static dbg_level parse_dbg_level(struct attr *dbg_level_attr, struct attr *level_attr) { if (dbg_level_attr) { if(!strcmp(dbg_level_attr->u.str,"error")){ return lvl_error; } if(!strcmp(dbg_level_attr->u.str,"warning")){ return lvl_warning; } if(!strcmp(dbg_level_attr->u.str,"info")){ return lvl_info; } if(!strcmp(dbg_level_attr->u.str,"debug")){ return lvl_debug; } dbg(lvl_error, "Invalid debug level in config: '%s'\n", dbg_level_attr->u.str); } else if (level_attr) { if (level_attr->u.num>= lvl_error && level_attr->u.num<= lvl_debug) return level_attr->u.num; dbg(lvl_error, "Invalid debug level in config: %ld\n", level_attr->u.num); } return lvl_unset; } struct debug * debug_new(struct attr *parent, struct attr **attrs) { struct attr *name,*dbg_level_attr,*level_attr; dbg_level level; name=attr_search(attrs, NULL, attr_name); dbg_level_attr=attr_search(attrs, NULL, attr_dbg_level); level_attr=attr_search(attrs, NULL, attr_level); level = parse_dbg_level(dbg_level_attr,level_attr); #ifdef HAVE_SOCKET if (!name && level==lvl_unset) { struct attr *socket_attr=attr_search(attrs, NULL, attr_socket); char *p,*s; if (!socket_attr) return NULL; s=g_strdup(socket_attr->u.str); p=strchr(s,':'); if (!p) { g_free(s); return NULL; } *p++='\0'; debug_sin.sin_family=AF_INET; if (!inet_aton(s, &debug_sin.sin_addr)) { g_free(s); return NULL; } debug_sin.sin_port=ntohs(atoi(p)); if (debug_socket == -1) debug_socket=socket(PF_INET, SOCK_DGRAM, 0); g_free(s); return (struct debug *)&dummy; } #endif if (!name || level==lvl_unset) return NULL; debug_level_set(name->u.str, level); return (struct debug *)&dummy; } dbg_level debug_level_get(const char *message_category) { if (!debug_hash) return DEFAULT_DEBUG_LEVEL; gpointer level = g_hash_table_lookup(debug_hash, message_category); if (!level) { return DEFAULT_DEBUG_LEVEL; } return GPOINTER_TO_INT(level); } static void debug_timestamp(char *buffer) { #if defined HAVE_API_WIN32_CE || defined _MSC_VER LARGE_INTEGER counter, frequency; double val; QueryPerformanceCounter(&counter); QueryPerformanceFrequency(&frequency); val=counter.HighPart * 4294967296.0 + counter.LowPart; val/=frequency.HighPart * 4294967296.0 + frequency.LowPart; sprintf(buffer,"%.6f|",val); #else struct timeval tv; if (gettimeofday(&tv, NULL) == -1) return; /* Timestamps are UTC */ sprintf(buffer, "%02d:%02d:%02d.%03d|", (int)(tv.tv_sec/3600)%24, (int)(tv.tv_sec/60)%60, (int)tv.tv_sec % 60, (int)tv.tv_usec/1000); #endif } static char* dbg_level_to_string(dbg_level level) { switch(level) { case lvl_unset: return "-unset-"; case lvl_error: return "error"; case lvl_warning: return "warning"; case lvl_info: return "info"; case lvl_debug: return "debug"; } return "-invalid level-"; } #ifdef HAVE_API_ANDROID static android_LogPriority dbg_level_to_android(dbg_level level) { switch(level) { case lvl_unset: return ANDROID_LOG_UNKNOWN; case lvl_error: return ANDROID_LOG_ERROR; case lvl_warning: return ANDROID_LOG_WARN; case lvl_info: return ANDROID_LOG_INFO; case lvl_debug: return ANDROID_LOG_DEBUG; } return ANDROID_LOG_UNKNOWN; } #endif void debug_vprintf(dbg_level level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, va_list ap) { #if defined HAVE_API_WIN32_CE || defined _MSC_VER char message_origin[4096]; #else char message_origin[mlen+flen+3]; #endif sprintf(message_origin, "%s:%s", module, function); if (global_debug_level >= level || debug_level_get(module) >= level || debug_level_get(message_origin) >= level) { #if defined(DEBUG_WIN32_CE_MESSAGEBOX) wchar_t muni[4096]; #endif char debug_message[4096]; debug_message[0]='\0'; if (prefix) { if (timestamp_prefix) debug_timestamp(debug_message); strcpy(debug_message+strlen(debug_message),dbg_level_to_string(level)); strcpy(debug_message+strlen(debug_message),":"); strcpy(debug_message+strlen(debug_message),message_origin); strcpy(debug_message+strlen(debug_message),":"); } #if defined HAVE_API_WIN32_CE #define vsnprintf _vsnprintf #endif vsnprintf(debug_message+strlen(debug_message),4095-strlen(debug_message),fmt,ap); #ifdef DEBUG_WIN32_CE_MESSAGEBOX mbstowcs(muni, debug_message, strlen(debug_message)+1); MessageBoxW(NULL, muni, TEXT("Navit - Error"), MB_APPLMODAL|MB_OK|MB_ICONERROR); #else #ifdef HAVE_API_ANDROID __android_log_print(dbg_level_to_android(level), "navit", "%s", debug_message); #else #ifdef HAVE_SOCKET if (debug_socket != -1) { sendto(debug_socket, debug_message, strlen(debug_message), 0, (struct sockaddr *)&debug_sin, sizeof(debug_sin)); return; } #endif FILE *fp=debug_fp; if (! fp) fp = stderr; fprintf(fp,"%s",debug_message); fflush(fp); #endif #endif } } void debug_printf(dbg_level level, const char *module, const int mlen,const char *function, const int flen, int prefix, const char *fmt, ...) { va_list ap; va_start(ap, fmt); debug_vprintf(level, module, mlen, function, flen, prefix, fmt, ap); va_end(ap); } void debug_assert_fail(const char *module, const int mlen,const char *function, const int flen, const char *file, int line, const char *expr) { debug_printf(lvl_error,module,mlen,function,flen,1,"%s:%d assertion failed:%s\n", file, line, expr); abort(); } void debug_destroy(void) { if (!debug_fp) return; if (debug_fp == stderr || debug_fp == stdout) return; fclose(debug_fp); debug_fp = NULL; } void debug_set_logfile(const char *path) { FILE *fp; fp = fopen(path, "a"); if (fp) { debug_destroy(); debug_fp = fp; fprintf(debug_fp, "Navit log started\n"); fflush(debug_fp); } } struct malloc_head { int magic; int size; char *where; void *return_address[8]; struct malloc_head *prev; struct malloc_head *next; } *malloc_heads; struct malloc_tail { int magic; }; int mallocs,debug_malloc_size,debug_malloc_size_m; void debug_dump_mallocs(void) { struct malloc_head *head=malloc_heads; int i; dbg(lvl_debug,"mallocs %d\n",mallocs); while (head) { fprintf(stderr,"unfreed malloc from %s of size %d\n",head->where,head->size); for (i = 0 ; i < 8 ; i++) fprintf(stderr,"\tlist *%p\n",head->return_address[i]); #if 0 fprintf(stderr,"%s\n",head+1); #endif head=head->next; } } void * debug_malloc(const char *where, int line, const char *func, int size) { struct malloc_head *head; struct malloc_tail *tail; if (!size) return NULL; mallocs++; debug_malloc_size+=size; if (debug_malloc_size/(1024*1024) != debug_malloc_size_m) { debug_malloc_size_m=debug_malloc_size/(1024*1024); dbg(lvl_debug,"malloced %d kb\n",debug_malloc_size/1024); } head=malloc(size+sizeof(*head)+sizeof(*tail)); head->magic=0xdeadbeef; head->size=size; head->prev=NULL; head->next=malloc_heads; malloc_heads=head; if (head->next) head->next->prev=head; head->where=g_strdup_printf("%s:%d %s",where,line,func); #if !defined (__GNUC__) #define __builtin_return_address(x) NULL #endif head->return_address[0]=__builtin_return_address(0); head->return_address[1]=__builtin_return_address(1); head->return_address[2]=__builtin_return_address(2); head->return_address[3]=__builtin_return_address(3); head->return_address[4]=__builtin_return_address(4); head->return_address[5]=__builtin_return_address(5); head->return_address[6]=__builtin_return_address(6); head->return_address[7]=__builtin_return_address(7); head++; tail=(struct malloc_tail *)((unsigned char *)head+size); tail->magic=0xdeadbef0; return head; } void * debug_malloc0(const char *where, int line, const char *func, int size) { void *ret=debug_malloc(where, line, func, size); if (ret) memset(ret, 0, size); return ret; } void * debug_realloc(const char *where, int line, const char *func, void *ptr, int size) { void *ret=debug_malloc(where, line, func, size); if (ret && ptr) memcpy(ret, ptr, size); debug_free(where, line, func, ptr); return ret; } char * debug_strdup(const char *where, int line, const char *func, const char *ptr) { int size; char *ret; if (!ptr) return NULL; size=strlen(ptr)+1; ret=debug_malloc(where, line, func, size); memcpy(ret, ptr, size); return ret; } char * debug_guard(const char *where, int line, const char *func, char *str) { char *ret=debug_strdup(where, line, func, str); g_free(str); return ret; } void debug_free(const char *where, int line, const char *func, void *ptr) { struct malloc_head *head; struct malloc_tail *tail; if (!ptr) return; mallocs--; head=(struct malloc_head *)((unsigned char *)ptr-sizeof(*head)); tail=(struct malloc_tail *)((unsigned char *)ptr+head->size); debug_malloc_size-=head->size; if (head->magic != 0xdeadbeef || tail->magic != 0xdeadbef0) { fprintf(stderr,"Invalid free from %s:%d %s\n",where,line,func); } head->magic=0; tail->magic=0; if (head->prev) head->prev->next=head->next; else malloc_heads=head->next; if (head->next) head->next->prev=head->prev; free(head->where); free(head); } void debug_free_func(void *ptr) { debug_free("unknown",0,"unknown",ptr); } void debug_finished(void) { debug_dump_mallocs(); g_free(gdb_program); g_hash_table_destroy(debug_hash); debug_destroy(); } navit-0.5.0+dfsg.1/navit/debug.h000066400000000000000000000110351264204753600163040ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DEBUG_H #define NAVIT_DEBUG_H #ifdef __cplusplus extern "C" { #endif #include #include #ifdef _MSC_VER #define __PRETTY_FUNCTION__ __FUNCTION__ /* Uncomment the following define to enable MSVC's memory debugging support */ /*#define _CRTDBG_MAP_ALLOC*/ #ifdef _CRTDBG_MAP_ALLOC #include #include #endif #endif /** Possible debug levels (inspired by SLF4J). */ typedef enum { /** Internal use only, do not use for logging. */ lvl_unset=-1, /** Error: something did not work. */ lvl_error, /** Warning: something may not have worked. */ lvl_warning, /** Informational message. Should make sense to non-programmers. */ lvl_info, /** Debug output: (almost) anything goes. */ lvl_debug } dbg_level; extern dbg_level max_debug_level; #define dbg_str2(x) #x #define dbg_str1(x) dbg_str2(x) #define dbg_module dbg_str1(MODULE) #define dbg(level,...) { if (max_debug_level >= level) debug_printf(level,dbg_module,strlen(dbg_module),__PRETTY_FUNCTION__, strlen(__PRETTY_FUNCTION__),1,__VA_ARGS__); } #define dbg_assert(expr) ((expr) ? (void) 0 : debug_assert_fail(dbg_module,strlen(dbg_module),__PRETTY_FUNCTION__, strlen(__PRETTY_FUNCTION__),__FILE__,__LINE__,dbg_str1(expr))) #define DEBUG_MODULE_GLOBAL "global" #ifdef DEBUG_MALLOC #undef g_new #undef g_new0 #define g_new(type, size) (type *)debug_malloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,sizeof(type)*(size)) #define g_new0(type, size) (type *)debug_malloc0(__FILE__,__LINE__,__PRETTY_FUNCTION__,sizeof(type)*(size)) #define g_malloc(size) debug_malloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,(size)) #define g_malloc0(size) debug_malloc0(__FILE__,__LINE__,__PRETTY_FUNCTION__,(size)) #define g_realloc(ptr,size) debug_realloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr,(size)) #define g_free(ptr) debug_free(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr) #define g_strdup(ptr) debug_strdup(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr) #define g_strdup_printf(fmt...) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,g_strdup_printf(fmt)) #define graphics_icon_path(x) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,graphics_icon_path(x)) #define dbg_guard(x) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,x) #define g_free_func debug_free_func #else #define g_free_func g_free #define dbg_guard(x) x #endif /* prototypes */ struct attr; struct debug; void debug_init(const char *program_name); void debug_level_set(const char *name, dbg_level level); struct debug *debug_new(struct attr *parent, struct attr **attrs); dbg_level debug_level_get(const char *name); void debug_vprintf(dbg_level level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, va_list ap); void debug_printf(dbg_level level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, ...) #ifdef __GNUC__ __attribute__ ((format (printf, 7, 8))) #endif ; void debug_assert_fail(const char *module, const int mlen, const char *function, const int flen, const char *file, int line, const char *expr); void debug_destroy(void); void debug_set_logfile(const char *path); void debug_dump_mallocs(void); void *debug_malloc(const char *where, int line, const char *func, int size); void *debug_malloc0(const char *where, int line, const char *func, int size); char *debug_strdup(const char *where, int line, const char *func, const char *ptr); char *debug_guard(const char *where, int line, const char *func, char *str); void debug_free(const char *where, int line, const char *func, void *ptr); void debug_free_func(void *ptr); void debug_finished(void); void *debug_realloc(const char *where, int line, const char *func, void *ptr, int size); void debug_set_global_level(dbg_level level, int override_old_value); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/destination.h000066400000000000000000000016471264204753600175470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DESTINATION_H #define NAVIT_DESTINATION_H /* prototypes */ struct navit; int destination_address(struct navit *nav); /* end of prototypes */ #endif navit-0.5.0+dfsg.1/navit/draw_info.h000066400000000000000000000016071264204753600171720ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_DRAW_INFO_H #define NAVIT_DRAW_INFO_H struct draw_info { struct container *co; int display; int limit; }; #endif navit-0.5.0+dfsg.1/navit/endianess.h000066400000000000000000000101071264204753600171660ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __ENDIANESS_HANDLER__ /* The following is based on xorg/xserver/GL/glx/glxbyteorder.h * which is (c) IBM Corp. 2006,2007 and originally licensed under the following * BSD-license. All modifications in navit are licensed under the GNU GPL as * described in file "COPYRIGHT". * * Portions also from GNU C Library include/bits/byteswap.h Also licsend * under the GPL. * * -------------------------- * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sub license, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDERS, THE AUTHORS, AND/OR THEIR SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #if HAVE_BYTESWAP_H /* machine dependent versions of byte swapping functions. GNU extension.*/ #include #if HAVE_ENDIAN_H #include #endif #elif defined(USE_SYS_ENDIAN_H) #include #if defined(_BYTE_ORDER) && !defined(__BYTE_ORDER) #define __BYTE_ORDER _BYTE_ORDER #define __LITTLE_ENDIAN _LITTLE_ENDIAN #define __BIG_ENDIAN _BIG_ENDIAN #endif #elif defined(__APPLE__) #include #define __bswap_16 OSSwapInt16 #define __bswap_32 OSSwapInt32 #define __bswap_64 OSSwapInt64 #ifndef __BYTE_ORDER #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 #if defined(__LITTLE_ENDIAN__) #define __BYTE_ORDER __LITTLE_ENDIAN #elif defined(__BIG_ENDIAN__) #define __BYTE_ORDER __BIG_ENDIAN #else #error "No endianness defined for Mac OS!" #endif #endif #elif defined(_WIN32) || defined(__CEGCC__) #define __BIG_ENDIAN 4321 #define __LITTLE_ENDIAN 1234 #define __BYTE_ORDER __LITTLE_ENDIAN #else #define __bswap_16(__bsx) ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)) #define __bswap_32(__bsx) ((((__bsx) & 0xff000000) >> 24) | \ (((__bsx) & 0x00ff0000) >> 8) |\ (((__bsx) & 0x0000ff00) << 8) | \ (((__bsx) & 0x000000ff) << 24)) #endif #if __BYTE_ORDER == __BIG_ENDIAN #define le16_to_cpu(x) __bswap_16 (x) #define le32_to_cpu(x) __bswap_32 (x) #define le64_to_cpu(x) __bswap_64 (x) #define cpu_to_le16(x) __bswap_16 (x) #define cpu_to_le32(x) __bswap_32 (x) #define cpu_to_le64(x) __bswap_64 (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define le16_to_cpu(x) (x) #define le32_to_cpu(x) (x) #define cpu_to_le16(x) (x) #define cpu_to_le32(x) (x) #else #error "Unknown endianess" #endif #define __ENDIANESS_HANDLER__ #endif navit-0.5.0+dfsg.1/navit/event.c000066400000000000000000000063271264204753600163420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "event.h" #include "plugin.h" #include "debug.h" static struct event_methods event_methods; static const char *e_requestor; static const char *e_system; static int has_quit; #define require_method_helper(m)\ if(!event_methods.m) {\ dbg(lvl_error, "Can't find event system method %s. Event system is %s%s\n",\ #m ,e_system?"set to ":"not set.", e_system?e_system:"");\ #define require_method(m)\ require_method_helper(m)\ return;\ } #define require_method2(m,r)\ require_method_helper(m)\ return r;\ } void event_main_loop_run(void) { require_method(main_loop_run); event_methods.main_loop_run(); } void event_main_loop_quit(void) { if (event_methods.main_loop_quit) event_methods.main_loop_quit(); has_quit=1; } int event_main_loop_has_quit(void) { return has_quit; } struct event_watch * event_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { require_method2(add_watch, NULL); return event_methods.add_watch(fd, cond, cb); } void event_remove_watch(struct event_watch *ev) { require_method(remove_watch); event_methods.remove_watch(ev); } struct event_timeout * event_add_timeout(int timeout, int multi, struct callback *cb) { require_method2(add_timeout, NULL); return event_methods.add_timeout(timeout, multi, cb); } void event_remove_timeout(struct event_timeout *ev) { require_method(remove_timeout); event_methods.remove_timeout(ev); } struct event_idle * event_add_idle(int priority, struct callback *cb) { require_method2(add_idle, NULL); return event_methods.add_idle(priority,cb); } void event_remove_idle(struct event_idle *ev) { require_method(remove_idle); event_methods.remove_idle(ev); } void event_call_callback(struct callback_list *cb) { require_method(call_callback); event_methods.call_callback(cb); } char const * event_system(void) { return e_system; } int event_request_system(const char *system, const char *requestor) { void (*event_type_new)(struct event_methods *meth); if (e_system) { if (strcmp(e_system, system)) { dbg(lvl_error,"system '%s' already requested by '%s', can't set to '%s' as requested from '%s'\n", e_system, e_requestor, system, requestor); return 0; } return 1; } event_type_new=plugin_get_event_type(system); if (! event_type_new) { dbg(lvl_error,"unsupported event system '%s' requested from '%s'\n", system, requestor); return 0; } event_type_new(&event_methods); e_system=system; e_requestor=requestor; return 1; } navit-0.5.0+dfsg.1/navit/event.h000066400000000000000000000045401264204753600163420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef __cplusplus extern "C" { #endif struct event_idle; struct event_timeout; struct event_watch; struct callback; struct callback_list; struct file; enum event_watch_cond { event_watch_cond_read=1, event_watch_cond_write, event_watch_cond_except, }; struct event_methods { void (*main_loop_run)(void); void (*main_loop_quit)(void); struct event_watch *(*add_watch)(int fd, enum event_watch_cond cond, struct callback *cb); void (*remove_watch)(struct event_watch *ev); struct event_timeout *(*add_timeout)(int timeout, int multi, struct callback *cb); void (*remove_timeout)(struct event_timeout *ev); struct event_idle *(*add_idle)(int priority, struct callback *cb); void (*remove_idle)(struct event_idle *ev); void (*call_callback)(struct callback_list *cb); }; /* prototypes */ enum event_watch_cond; struct callback; struct callback_list; struct event_idle; struct event_timeout; struct event_watch; void event_main_loop_run(void); void event_main_loop_quit(void); int event_main_loop_has_quit(void); struct event_watch *event_add_watch(int fd, enum event_watch_cond cond, struct callback *cb); void event_remove_watch(struct event_watch *ev); struct event_timeout *event_add_timeout(int timeout, int multi, struct callback *cb); void event_remove_timeout(struct event_timeout *ev); struct event_idle *event_add_idle(int priority, struct callback *cb); void event_remove_idle(struct event_idle *ev); void event_call_callback(struct callback_list *cb); char const *event_system(void); int event_request_system(const char *system, const char *requestor); /* end of prototypes */ #ifdef __cplusplus } #endif navit-0.5.0+dfsg.1/navit/event_glib.c000066400000000000000000000102361264204753600173310ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "event.h" #include "event_glib.h" #include "debug.h" #include "callback.h" #include "plugin.h" static GMainLoop *loop; static void event_glib_main_loop_run(void) { loop = g_main_loop_new (NULL, TRUE); if (g_main_loop_is_running (loop)) { g_main_loop_run (loop); } } static void event_glib_main_loop_quit(void) { if (loop) { g_main_loop_quit(loop); g_main_loop_unref(loop); } } struct event_watch { GIOChannel *iochan; guint source; }; static gboolean event_glib_call_watch(GIOChannel * iochan, GIOCondition condition, gpointer t) { struct callback *cb=t; callback_call_0(cb); return TRUE; } static struct event_watch * event_glib_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { struct event_watch *ret=g_new0(struct event_watch, 1); int flags=0; ret->iochan = g_io_channel_unix_new(fd); switch (cond) { case event_watch_cond_read: flags=G_IO_IN; break; case event_watch_cond_write: flags=G_IO_OUT; break; case event_watch_cond_except: flags=G_IO_ERR|G_IO_HUP; break; } ret->source = g_io_add_watch(ret->iochan, flags, event_glib_call_watch, (gpointer)cb); return ret; } static void event_glib_remove_watch(struct event_watch *ev) { if (! ev) return; g_source_remove(ev->source); g_io_channel_unref(ev->iochan); g_free(ev); } struct event_timeout { guint source; struct callback *cb; }; static gboolean event_glib_call_timeout_single(struct event_timeout *ev) { callback_call_0(ev->cb); g_free(ev); return FALSE; } static gboolean event_glib_call_timeout_multi(struct event_timeout *ev) { callback_call_0(ev->cb); return TRUE; } static struct event_timeout * event_glib_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout *ret=g_new0(struct event_timeout, 1); ret->cb=cb; ret->source = g_timeout_add(timeout, multi ? (GSourceFunc)event_glib_call_timeout_multi : (GSourceFunc)event_glib_call_timeout_single, (gpointer)ret); return ret; } static void event_glib_remove_timeout(struct event_timeout *ev) { if (! ev) return; g_source_remove(ev->source); g_free(ev); } struct event_idle { guint source; struct callback *cb; }; static gboolean event_glib_call_idle(struct event_idle *ev) { callback_call_0(ev->cb); return TRUE; } static struct event_idle * event_glib_add_idle(int priority, struct callback *cb) { struct event_idle *ret=g_new0(struct event_idle, 1); ret->cb=cb; ret->source = g_idle_add_full(G_PRIORITY_HIGH_IDLE+priority, (GSourceFunc)event_glib_call_idle, (gpointer)ret, NULL); return ret; } static void event_glib_remove_idle(struct event_idle *ev) { if (! ev) return; g_source_remove(ev->source); g_free(ev); } static void event_glib_call_callback(struct callback_list *cb) { /* Idea for implementation: Create a pipe then use add_watch add callback to a queue from here write to the pipe to wakeup the pool then from the gui thread process the callback queue */ } static struct event_methods event_glib_methods = { event_glib_main_loop_run, event_glib_main_loop_quit, event_glib_add_watch, event_glib_remove_watch, event_glib_add_timeout, event_glib_remove_timeout, event_glib_add_idle, event_glib_remove_idle, event_glib_call_callback, }; struct event_priv { int data; }; static struct event_priv* event_glib_new(struct event_methods *meth) { *meth=event_glib_methods; return (struct event_priv *)event_glib_new; } void event_glib_init(void) { plugin_register_event_type("glib", event_glib_new); } navit-0.5.0+dfsg.1/navit/event_glib.h000066400000000000000000000001051264204753600173300ustar00rootroot00000000000000/* prototypes */ void event_glib_init(void); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/fib-1.1/000077500000000000000000000000001264204753600161025ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/fib-1.1/CMakeLists.txt000066400000000000000000000000431264204753600206370ustar00rootroot00000000000000supportlib_add_library(fib fib.c) navit-0.5.0+dfsg.1/navit/fib-1.1/Makefile.am000066400000000000000000000002671264204753600201430ustar00rootroot00000000000000noinst_LTLIBRARIES = libfib.la libfib_la_SOURCES = fib.c fib.h fibpriv.h EXTRA_DIST=README configure.in fh_extractmin.3 fh_makeheap.3 fh_makekeyheap.3 fibtest.c fibtest2.c tt.c use.c navit-0.5.0+dfsg.1/navit/fib-1.1/README000066400000000000000000000024321264204753600167630ustar00rootroot00000000000000Version 1.1 now supports increasing the key using the fh_replace* functions. Previously it would simply return NULL when you tried to increase the key. It also improves performance slightly by only calling checkcons when we are about to use it, at extract, instead of calling it on every insert. I have now fixed fh_union and it properly updates the minimum. Thanks to Ryan Earl for pointing out that in fh_consolidate, it is VERY time consuming to constantly malloc/free an array of pointers. The array is small enough that simply reallocating when more pointers are needed is ok. Thanks to Thomas Eschbach and Wolfgang Guenther who have pointed out bugs with my code. Wolfgang Guenther provided a fix which put in on the correct track for where the bug was. They have also provided a few test programs that exhibited other bugs which I have now integrated into my source so that you can easily regress test the library. I have reciently completed a review of the code. I have made a number of improvements with a few minor interface changes. There is another improvement to the rh_replace* family of functions to help eliminate redundant code. I'm still planning on writing a type safe memory allocator for use with the code instead of using malloc to hopefully improve performance slightly. navit-0.5.0+dfsg.1/navit/fib-1.1/configure000077500000000000000000001014221264204753600200110ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=fib.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:529: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:584: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:609: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:622: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_hdr in limits.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:716: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:726: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done echo $ac_n "checking for inline""... $ac_c" 1>&6 echo "configure:754: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* done fi echo "$ac_t""$ac_cv_c_inline" 1>&6 case "$ac_cv_c_inline" in inline | yes) ;; no) cat >> confdefs.h <<\EOF #define inline EOF ;; *) cat >> confdefs.h < confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. cat > conftest.defs <<\EOF s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%\[%\\&%g s%\]%\\&%g s%\$%$$%g EOF DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` rm -f conftest.defs # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@CPP@%$CPP%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 navit-0.5.0+dfsg.1/navit/fib-1.1/configure.in000066400000000000000000000005271264204753600204170ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT(fib.c) dnl Checks for programs. dnl Checks for libraries. dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(limits.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE dnl Checks for library functions. AC_OUTPUT(Makefile) navit-0.5.0+dfsg.1/navit/fib-1.1/fh_extractmin.3000066400000000000000000000032731264204753600210260ustar00rootroot00000000000000.TH FH_EXTRACTMIN 3 "29 Mar 2000" "libfib" .SH NAME fh_extractmin \- extract minimum element from a Fibonacci Heap .SH SYNOPSIS #include .PP void * .PD 0 .HP 8 .BR fh_extractmin "(struct fibheap *heap)" .PD .PP void * .PD 0 .HP 8 .BR fh_min "(struct fibheap *heap)" .PD .PP void * .PD 0 .HP 8 .BR fh_replacedata "(struct fibheap *heap, struct fibheap_el *elem, void *data)" .PD .PP void * .PD 0 .HP 8 .BR fh_delete "(struct fibheap *heap, struct fibheap_el *elem)" .PD .PP void .PD 0 .HP 8 .BR fh_deleteheap "(struct fibheap *heap)" .PD .PP struct fibheap * .PD 0 .HP 8 .BR fh_union "(struct fibheap *heapa, struct fibheap *heapb)" .PD .SH DESCRIPTION These functions are shared between both key heaps and normal heaps. .PP Once a .B elem pointer has been passed to .BR fh_delete (3) that .B elem pointer may be reused to store another datum. You should make sure that you destroy any copies of the pointer. .SH RETURN VALUES The .B fh_extractmin function returns the value of .B data that is the minimum element and removes it from the heap. .PP The .B fh_min function returns the current minimum element but does .I not remove it from the heap. .PP The .B fh_replacedata replaces the data in .B elem and returns the old data. .PP The .B fh_delete function removes .B elem from the heap, and returns the .B data that was stored in the element. .PP The .B fh_deleteheap complete destroys the heap. It does not free any user supplied .B data elements stored in the heap. .PP The .B fh_union function returns the union of the two heaps .B heapa and .BR heapb . .SH SEE ALSO .BR fh_makeheap (3), .BR fh_makekeyheap (3) .SH AUTHORS This library and man page was writen by John-Mark Gurney . .SH BUGS navit-0.5.0+dfsg.1/navit/fib-1.1/fh_makeheap.3000066400000000000000000000005041264204753600204150ustar00rootroot00000000000000.TH FH_MAKEHEAP 3 "29 Mar 2000" "libfib" .SH NAME fh_makeheap \- make a Fibonacci Heap .SH SYNOPSIS .nf #include .PP struct fibheap * .BR fh_makeheap (void) .fi .SH DESCRIPTION .SH RETURN VALUES .SH FILES .SH SEE ALSO .SH AUTHORS This library and man page was writen by John-Mark Gurney . .SH BUGS navit-0.5.0+dfsg.1/navit/fib-1.1/fh_makekeyheap.3000066400000000000000000000037001264204753600211270ustar00rootroot00000000000000.TH FH_MAKEKEYHEAP 3 "29 Mar 2000" "libfib" .SH NAME fh_makekeyheap \- make a Fibonacci key Heap .SH SYNOPSIS #include .PP struct fibheap * .PD 0 .HP 8 .BR fh_makekeyheap (void) .PD .PP struct fibheap_el * .PD 0 .HP 8 .BR fh_insertkey "(struct fibheap *heap, int key, void *data)" .PD .PP int .PD 0 .HP 8 .BR fh_minkey "(struct fibheap *heap)" .PD .PP void * .PD 0 .HP 8 .BR fh_replacekey "(struct fibheap *heap, struct fibheap_el *elem, int key)" .PD .PP void * .PD 0 .HP 8 .BR fh_replacekeydata "(struct fibheap *heap, struct fibheap_el *elem, int key, void *data)" .PD .SH DESCRIPTION The .B fh_makekeyheap function makes a Fibonacci heap which does ordering based on an integer key that is given in addition to the data. This menthod is useful so that you can eliminate the need to call a comparision function to order the data in the heap. .PP The pointer to the structure .B fibheap returned by .B fh_makekeyheap is an opaque structure. The the pointer can only be passed to other functions in the .B libfib library. .PP The .B fh_insertkey function inserts the .B data element into the heap with a value of .BR key . The pointer returned can be used in calls to functions like .BR fh_delete (3) to delete the key from the heap before it gets extracted via .BR fh_extractmin (3). .SH RETURN VALUES The .B fh_makekeyheap function returns a pointer to a heap structure used to insert and extract data elements. .PP The .B fh_insertkey functions returns a pointer to a heap element structure which can be used to manimulate that data element in the heap. .PP The .B fh_minkey function returns the integer key of the data at the top of the heap. If you would like to view the data, see .BR fh_min (3). .SH SEE ALSO .BR fh_extractmin (3) .SH AUTHORS This library and man page was writen by John-Mark Gurney . .SH BUGS A key heap does not provide a way for handling key collitions and deffering decission to a user provided function to resolve colissions. navit-0.5.0+dfsg.1/navit/fib-1.1/fib.c000066400000000000000000000303231264204753600170070ustar00rootroot00000000000000/*- * Copyright 1997-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: fib.c,v 1.2 2007-07-04 22:44:39 martin-s Exp $ * */ #include #include #include #include #define swap(type, a, b) \ do { \ type c; \ c = a; \ a = b; \ b = c; \ } while (0) \ #define INT_BITS (sizeof(int) * 8) static int ceillog2(unsigned int a) { int oa; int i; int b; oa = a; b = INT_BITS / 2; i = 0; while (b) { i = (i << 1); if (a >= (1 << b)) { a /= (1 << b); i = i | 1; } else a &= (1 << b) - 1; b /= 2; } if ((1 << i) == oa) return i; else return i + 1; } /* * Private Heap Functions */ static void fh_deleteel(struct fibheap *h, struct fibheap_el *x) { void *data; int key; data = x->fhe_data; key = x->fhe_key; if (!h->fh_keys) fh_replacedata(h, x, h->fh_neginf); else fh_replacekey(h, x, INT_MIN); if (fh_extractminel(h) != x) { /* * XXX - This should never happen as fh_replace should set it * to min. */ abort(); } x->fhe_data = data; x->fhe_key = key; } static void fh_initheap(struct fibheap *new) { new->fh_cmp_fnct = NULL; new->fh_neginf = NULL; new->fh_n = 0; new->fh_Dl = -1; new->fh_cons = NULL; new->fh_min = NULL; new->fh_root = NULL; new->fh_keys = 0; #ifdef FH_STATS new->fh_maxn = 0; new->fh_ninserts = 0; new->fh_nextracts = 0; #endif } static void fh_destroyheap(struct fibheap *h) { h->fh_cmp_fnct = NULL; h->fh_neginf = NULL; if (h->fh_cons != NULL) free(h->fh_cons); h->fh_cons = NULL; free(h); } /* * Public Heap Functions */ struct fibheap * fh_makekeyheap() { struct fibheap *n; if ((n = malloc(sizeof *n)) == NULL) return NULL; fh_initheap(n); n->fh_keys = 1; return n; } struct fibheap * fh_makeheap() { struct fibheap *n; if ((n = malloc(sizeof *n)) == NULL) return NULL; fh_initheap(n); return n; } voidcmp fh_setcmp(struct fibheap *h, voidcmp fnct) { voidcmp oldfnct; oldfnct = h->fh_cmp_fnct; h->fh_cmp_fnct = fnct; return oldfnct; } void * fh_setneginf(struct fibheap *h, void *data) { void *old; old = h->fh_neginf; h->fh_neginf = data; return old; } struct fibheap * fh_union(struct fibheap *ha, struct fibheap *hb) { struct fibheap_el *x; if (ha->fh_root == NULL || hb->fh_root == NULL) { /* either one or both are empty */ if (ha->fh_root == NULL) { fh_destroyheap(ha); return hb; } else { fh_destroyheap(hb); return ha; } } ha->fh_root->fhe_left->fhe_right = hb->fh_root; hb->fh_root->fhe_left->fhe_right = ha->fh_root; x = ha->fh_root->fhe_left; ha->fh_root->fhe_left = hb->fh_root->fhe_left; hb->fh_root->fhe_left = x; ha->fh_n += hb->fh_n; /* * we probably should also keep stats on number of unions */ /* set fh_min if necessary */ if (fh_compare(ha, hb->fh_min, ha->fh_min) < 0) ha->fh_min = hb->fh_min; fh_destroyheap(hb); return ha; } void fh_deleteheap(struct fibheap *h) { /* * We could do this even faster by walking each binomial tree, but * this is simpler to code. */ while (h->fh_min != NULL) fhe_destroy(fh_extractminel(h)); fh_destroyheap(h); } /* * Public Key Heap Functions */ struct fibheap_el * fh_insertkey(struct fibheap *h, int key, void *data) { struct fibheap_el *x; if ((x = fhe_newelem()) == NULL) return NULL; /* just insert on root list, and make sure it's not the new min */ x->fhe_data = data; x->fhe_key = key; fh_insertel(h, x); return x; } int fh_minkey(struct fibheap *h) { if (h->fh_min == NULL) return INT_MIN; return h->fh_min->fhe_key; } int fh_replacekey(struct fibheap *h, struct fibheap_el *x, int key) { int ret; ret = x->fhe_key; (void)fh_replacekeydata(h, x, key, x->fhe_data); return ret; } #include void * fh_replacekeydata(struct fibheap *h, struct fibheap_el *x, int key, void *data) { void *odata; int okey; struct fibheap_el *y; int r; odata = x->fhe_data; okey = x->fhe_key; /* * we can increase a key by deleting and reinserting, that * requires O(lgn) time. */ if ((r = fh_comparedata(h, key, data, x)) > 0) { printf("fh_comparedata r=%d key=%d data=%p\n", r, key, data); /* XXX - bad code! */ abort(); fh_deleteel(h, x); x->fhe_data = data; x->fhe_key = key; fh_insertel(h, x); return odata; } x->fhe_data = data; x->fhe_key = key; /* because they are equal, we don't have to do anything */ if (r == 0) return odata; y = x->fhe_p; if (h->fh_keys && okey == key) return odata; if (y != NULL && fh_compare(h, x, y) <= 0) { fh_cut(h, x, y); fh_cascading_cut(h, y); } /* * the = is so that the call from fh_delete will delete the proper * element. */ if (fh_compare(h, x, h->fh_min) <= 0) h->fh_min = x; return odata; } /* * Public void * Heap Functions */ /* * this will return these values: * NULL failed for some reason * ptr token to use for manipulation of data */ struct fibheap_el * fh_insert(struct fibheap *h, void *data) { struct fibheap_el *x; if ((x = fhe_newelem()) == NULL) return NULL; /* just insert on root list, and make sure it's not the new min */ x->fhe_data = data; fh_insertel(h, x); return x; } void * fh_min(struct fibheap *h) { if (h->fh_min == NULL) return NULL; return h->fh_min->fhe_data; } void * fh_extractmin(struct fibheap *h) { struct fibheap_el *z; void *ret; ret = NULL; if (h->fh_min != NULL) { z = fh_extractminel(h); ret = z->fhe_data; #ifndef NO_FREE fhe_destroy(z); #endif } return ret; } void * fh_replacedata(struct fibheap *h, struct fibheap_el *x, void *data) { return fh_replacekeydata(h, x, x->fhe_key, data); } void * fh_delete(struct fibheap *h, struct fibheap_el *x) { void *k; k = x->fhe_data; if (!h->fh_keys) fh_replacedata(h, x, h->fh_neginf); else fh_replacekey(h, x, INT_MIN); fh_extractmin(h); return k; } /* * Statistics Functions */ #ifdef FH_STATS int fh_maxn(struct fibheap *h) { return h->fh_maxn; } int fh_ninserts(struct fibheap *h) { return h->fh_ninserts; } int fh_nextracts(struct fibheap *h) { return h->fh_nextracts; } #endif /* * begin of private element fuctions */ static struct fibheap_el * fh_extractminel(struct fibheap *h) { struct fibheap_el *ret; struct fibheap_el *x, *y, *orig; ret = h->fh_min; orig = NULL; /* put all the children on the root list */ /* for true consistancy, we should use fhe_remove */ for(x = ret->fhe_child; x != orig && x != NULL;) { if (orig == NULL) orig = x; y = x->fhe_right; x->fhe_p = NULL; fh_insertrootlist(h, x); x = y; } /* remove minimum from root list */ fh_removerootlist(h, ret); h->fh_n--; /* if we aren't empty, consolidate the heap */ if (h->fh_n == 0) h->fh_min = NULL; else { h->fh_min = ret->fhe_right; fh_consolidate(h); } #ifdef FH_STATS h->fh_nextracts++; #endif return ret; } static void fh_insertrootlist(struct fibheap *h, struct fibheap_el *x) { if (h->fh_root == NULL) { h->fh_root = x; x->fhe_left = x; x->fhe_right = x; return; } fhe_insertafter(h->fh_root, x); } static void fh_removerootlist(struct fibheap *h, struct fibheap_el *x) { if (x->fhe_left == x) h->fh_root = NULL; else h->fh_root = fhe_remove(x); } static void fh_consolidate(struct fibheap *h) { struct fibheap_el **a; struct fibheap_el *w; struct fibheap_el *y; struct fibheap_el *x; int i; int d; int D; fh_checkcons(h); /* assign a the value of h->fh_cons so I don't have to rewrite code */ D = h->fh_Dl + 1; a = h->fh_cons; for (i = 0; i < D; i++) a[i] = NULL; while ((w = h->fh_root) != NULL) { x = w; fh_removerootlist(h, w); d = x->fhe_degree; /* XXX - assert that d < D */ while(a[d] != NULL) { y = a[d]; if (fh_compare(h, x, y) > 0) swap(struct fibheap_el *, x, y); fh_heaplink(h, y, x); a[d] = NULL; d++; } a[d] = x; } h->fh_min = NULL; for (i = 0; i < D; i++) if (a[i] != NULL) { fh_insertrootlist(h, a[i]); if (h->fh_min == NULL || fh_compare(h, a[i], h->fh_min) < 0) h->fh_min = a[i]; } } static void fh_heaplink(struct fibheap *h, struct fibheap_el *y, struct fibheap_el *x) { /* make y a child of x */ if (x->fhe_child == NULL) x->fhe_child = y; else fhe_insertbefore(x->fhe_child, y); y->fhe_p = x; x->fhe_degree++; y->fhe_mark = 0; } static void fh_cut(struct fibheap *h, struct fibheap_el *x, struct fibheap_el *y) { fhe_remove(x); y->fhe_degree--; fh_insertrootlist(h, x); x->fhe_p = NULL; x->fhe_mark = 0; } static void fh_cascading_cut(struct fibheap *h, struct fibheap_el *y) { struct fibheap_el *z; while ((z = y->fhe_p) != NULL) { if (y->fhe_mark == 0) { y->fhe_mark = 1; return; } else { fh_cut(h, y, z); y = z; } } } /* * begining of handling elements of fibheap */ static struct fibheap_el * fhe_newelem() { struct fibheap_el *e; if ((e = malloc(sizeof *e)) == NULL) return NULL; fhe_initelem(e); return e; } static void fhe_initelem(struct fibheap_el *e) { e->fhe_degree = 0; e->fhe_mark = 0; e->fhe_p = NULL; e->fhe_child = NULL; e->fhe_left = e; e->fhe_right = e; e->fhe_data = NULL; } static void fhe_insertafter(struct fibheap_el *a, struct fibheap_el *b) { if (a == a->fhe_right) { a->fhe_right = b; a->fhe_left = b; b->fhe_right = a; b->fhe_left = a; } else { b->fhe_right = a->fhe_right; a->fhe_right->fhe_left = b; a->fhe_right = b; b->fhe_left = a; } } static void fhe_insertbefore(struct fibheap_el *a, struct fibheap_el *b) { fhe_insertafter(a->fhe_left, b); } static struct fibheap_el * fhe_remove(struct fibheap_el *x) { struct fibheap_el *ret; if (x == x->fhe_left) ret = NULL; else ret = x->fhe_left; /* fix the parent pointer */ if (x->fhe_p != NULL && x->fhe_p->fhe_child == x) x->fhe_p->fhe_child = ret; x->fhe_right->fhe_left = x->fhe_left; x->fhe_left->fhe_right = x->fhe_right; /* clear out hanging pointers */ x->fhe_p = NULL; x->fhe_left = x; x->fhe_right = x; return ret; } static void fh_checkcons(struct fibheap *h) { int oDl; /* make sure we have enough memory allocated to "reorganize" */ if (h->fh_Dl == -1 || h->fh_n > (1 << h->fh_Dl)) { oDl = h->fh_Dl; if ((h->fh_Dl = ceillog2(h->fh_n) + 1) < 8) h->fh_Dl = 8; if (oDl != h->fh_Dl) h->fh_cons = (struct fibheap_el **)realloc(h->fh_cons, sizeof *h->fh_cons * (h->fh_Dl + 1)); if (h->fh_cons == NULL) abort(); } } static int fh_compare(struct fibheap *h, struct fibheap_el *a, struct fibheap_el *b) { if (h->fh_keys) { if (a->fhe_key < b->fhe_key) return -1; if (a->fhe_key == b->fhe_key) return 0; return 1; } else return h->fh_cmp_fnct(a->fhe_data, b->fhe_data); } static int fh_comparedata(struct fibheap *h, int key, void *data, struct fibheap_el *b) { struct fibheap_el a; a.fhe_key = key; a.fhe_data = data; return fh_compare(h, &a, b); } static void fh_insertel(struct fibheap *h, struct fibheap_el *x) { fh_insertrootlist(h, x); if (h->fh_min == NULL || (h->fh_keys ? x->fhe_key < h->fh_min->fhe_key : h->fh_cmp_fnct(x->fhe_data, h->fh_min->fhe_data) < 0)) h->fh_min = x; h->fh_n++; #ifdef FH_STATS if (h->fh_n > h->fh_maxn) h->fh_maxn = h->fh_n; h->fh_ninserts++; #endif } navit-0.5.0+dfsg.1/navit/fib-1.1/fib.h000066400000000000000000000047371264204753600170260ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: fib.h,v 1.1 2005-12-02 10:41:56 martin-s Exp $ * */ #ifndef _FIB_H_ #define _FIB_H_ struct fibheap; struct fibheap_el; typedef int (*voidcmp)(void *, void *); /* functions for key heaps */ struct fibheap *fh_makekeyheap(void); struct fibheap_el *fh_insertkey(struct fibheap *, int, void *); int fh_minkey(struct fibheap *); int fh_replacekey(struct fibheap *, struct fibheap_el *, int); void *fh_replacekeydata(struct fibheap *, struct fibheap_el *, int, void *); /* functions for void * heaps */ struct fibheap *fh_makeheap(void); voidcmp fh_setcmp(struct fibheap *, voidcmp); void *fh_setneginf(struct fibheap *, void *); struct fibheap_el *fh_insert(struct fibheap *, void *); /* shared functions */ void *fh_extractmin(struct fibheap *); void *fh_min(struct fibheap *); void *fh_replacedata(struct fibheap *, struct fibheap_el *, void *); void *fh_delete(struct fibheap *, struct fibheap_el *); void fh_deleteheap(struct fibheap *); struct fibheap *fh_union(struct fibheap *, struct fibheap *); #ifdef FH_STATS int fh_maxn(struct fibheap *); int fh_ninserts(struct fibheap *); int fh_nextracts(struct fibheap *); #endif #endif /* _FIB_H_ */ navit-0.5.0+dfsg.1/navit/fib-1.1/fibpriv.h000066400000000000000000000065161264204753600177240ustar00rootroot00000000000000/*- * Copyright 1997, 1999-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: fibpriv.h,v 1.1 2005-12-02 10:41:56 martin-s Exp $ * */ #ifndef _FIBPRIV_H_ #define _FIBPRIV_H_ struct fibheap_el; /* * global heap operations */ struct fibheap { int (*fh_cmp_fnct)(void *, void *); int fh_n; int fh_Dl; struct fibheap_el **fh_cons; struct fibheap_el *fh_min; struct fibheap_el *fh_root; void *fh_neginf; int fh_keys : 1; #ifdef FH_STATS int fh_maxn; int fh_ninserts; int fh_nextracts; #endif }; static void fh_initheap(struct fibheap *); static void fh_insertrootlist(struct fibheap *, struct fibheap_el *); static void fh_removerootlist(struct fibheap *, struct fibheap_el *); static void fh_consolidate(struct fibheap *); static void fh_heaplink(struct fibheap *h, struct fibheap_el *y, struct fibheap_el *x); static void fh_cut(struct fibheap *, struct fibheap_el *, struct fibheap_el *); static void fh_cascading_cut(struct fibheap *, struct fibheap_el *); static struct fibheap_el *fh_extractminel(struct fibheap *); static void fh_checkcons(struct fibheap *h); static void fh_destroyheap(struct fibheap *h); static int fh_compare(struct fibheap *h, struct fibheap_el *a, struct fibheap_el *b); static int fh_comparedata(struct fibheap *h, int key, void *data, struct fibheap_el *b); static void fh_insertel(struct fibheap *h, struct fibheap_el *x); static void fh_deleteel(struct fibheap *h, struct fibheap_el *x); /* * specific node operations */ struct fibheap_el { int fhe_degree; int fhe_mark; struct fibheap_el *fhe_p; struct fibheap_el *fhe_child; struct fibheap_el *fhe_left; struct fibheap_el *fhe_right; int fhe_key; void *fhe_data; }; static struct fibheap_el *fhe_newelem(void); static void fhe_initelem(struct fibheap_el *); static void fhe_insertafter(struct fibheap_el *a, struct fibheap_el *b); static void fhe_insertbefore(struct fibheap_el *a, struct fibheap_el *b); static struct fibheap_el *fhe_remove(struct fibheap_el *a); #define fhe_destroy(x) free((x)) /* * general functions */ static int ceillog2(unsigned int a); #endif /* _FIBPRIV_H_ */ navit-0.5.0+dfsg.1/navit/fib-1.1/fibtest.c000066400000000000000000000065701264204753600177160ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include "fib.h" int main(void) { struct fibheap *a; void *arr[10]; int i; a = fh_makekeyheap(); for (i=1 ; i < 10 ; i++) { arr[i]= fh_insertkey(a,0,(void *)i); printf("adding: 0 %d \n",i); } printf(" \n"); fh_replacekey(a, arr[1],-1); fh_replacekey(a, arr[6],-1); fh_replacekey(a, arr[4],-1); fh_replacekey(a, arr[2],-1); fh_replacekey(a, arr[8],-1); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[7],-33); /* -> node 7 becomes root node, but is still pointed to by node 6 */ fh_replacekey(a, arr[4],-36); fh_replacekey(a, arr[3],-1); fh_replacekey(a, arr[9],-81); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[6],-68); fh_replacekey(a, arr[2],-69); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[1],-52); fh_replacekey(a, arr[3],-2); fh_replacekey(a, arr[4],-120); fh_replacekey(a, arr[5],-48); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-3); fh_replacekey(a, arr[5],-63); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[5],-110); fh_replacekey(a, arr[7],-115); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[5],-188); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-4); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); printf("value(minkey) %d\n",fh_minkey(a)); printf("id: %d\n\n", (int)fh_extractmin(a)); fh_deleteheap(a); return 0; } navit-0.5.0+dfsg.1/navit/fib-1.1/fibtest.out000066400000000000000000000005311264204753600202720ustar00rootroot00000000000000adding: 0 1 adding: 0 2 adding: 0 3 adding: 0 4 adding: 0 5 adding: 0 6 adding: 0 7 adding: 0 8 adding: 0 9 value(minkey) -1 id: 8 value(minkey) -81 id: 9 value(minkey) -69 id: 2 value(minkey) -120 id: 4 value(minkey) -68 id: 6 value(minkey) -115 id: 7 value(minkey) -188 id: 5 value(minkey) -52 id: 1 value(minkey) -4 id: 3 navit-0.5.0+dfsg.1/navit/fib-1.1/fibtest2.c000066400000000000000000000065231264204753600177760ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include "fib.h" int main(void) { struct fibheap *a; void *arr[10]; int i; a = fh_makekeyheap(); for (i=1 ; i < 10 ; i++) { arr[i]= fh_insertkey(a,0,(void *)i); printf("adding: 0 %d \n",i); } printf(" \n"); fh_replacekey(a, arr[1],-38); fh_replacekey(a, arr[7],-34); printf("wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[2],-55); fh_replacekey(a, arr[5],-56); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[4],-1); fh_replacekey(a, arr[2],-102); fh_replacekey(a, arr[6],-1); fh_replacekey(a, arr[9],-1); fh_replacekey(a, arr[8],-4); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-74); fh_replacekey(a, arr[8],-55); fh_replacekey(a, arr[4],-2); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[4],-3); fh_replacekey(a, arr[6],-2); fh_replacekey(a, arr[7],-99); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[6],-3); fh_replacekey(a, arr[4],-4); fh_replacekey(a, arr[8],-94); fh_replacekey(a, arr[9],-2); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[6],-4); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); /*fh_replacekey(a, arr[9],-3);*/ printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); /*fh_replacekey(a, arr[9],-49);*/ fh_deleteheap(a); return 0; } navit-0.5.0+dfsg.1/navit/fib-1.1/fibtest2.out000066400000000000000000000005611264204753600203570ustar00rootroot00000000000000adding: 0 1 adding: 0 2 adding: 0 3 adding: 0 4 adding: 0 5 adding: 0 6 adding: 0 7 adding: 0 8 adding: 0 9 wert(minkey) -38 Knoten: 1 Wert(minkey) -56 Knoten: 5 Wert(minkey) -102 Knoten: 2 Wert(minkey) -74 Knoten: 3 Wert(minkey) -99 Knoten: 7 Wert(minkey) -94 Knoten: 8 Wert(minkey) -4 Knoten: 6 Wert(minkey) -4 Knoten: 4 Wert(minkey) -2 Knoten: 9 navit-0.5.0+dfsg.1/navit/fib-1.1/tt.c000066400000000000000000000054651264204753600167070ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include "fib.h" int main(void) { struct fibheap *a; void *arr[10]; int i; a = fh_makekeyheap(); for (i=1 ; i < 8 ; i++) { arr[i]= fh_insertkey(a,0,(void *)i); printf("adding: 0 %d \n",i); } printf(" \n"); fh_replacekey(a, arr[1],-2); fh_replacekey(a, arr[4],-3); fh_replacekey(a, arr[7],-5); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[3],-2); fh_replacekey(a, arr[6],-1); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[1],-9); fh_replacekey(a, arr[5],-3); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[2],-4); fh_replacekey(a, arr[5],-5); fh_replacekey(a, arr[6],-3); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_replacekey(a, arr[2],-6); fh_replacekey(a, arr[6],-6); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); printf("Wert(minkey) %d\n",fh_minkey(a)); printf("Knoten: %d\n\n", (int)fh_extractmin(a)); fh_deleteheap(a); return 0; } navit-0.5.0+dfsg.1/navit/fib-1.1/tt.out000066400000000000000000000004321264204753600172610ustar00rootroot00000000000000adding: 0 1 adding: 0 2 adding: 0 3 adding: 0 4 adding: 0 5 adding: 0 6 adding: 0 7 Wert(minkey) -5 Knoten: 7 Wert(minkey) -3 Knoten: 4 Wert(minkey) -9 Knoten: 1 Wert(minkey) -5 Knoten: 5 Wert(minkey) -6 Knoten: 6 Wert(minkey) -6 Knoten: 2 Wert(minkey) -2 Knoten: 3 navit-0.5.0+dfsg.1/navit/fib-1.1/use.c000066400000000000000000000072071264204753600170500ustar00rootroot00000000000000/*- * Copyright 1997, 1998-2003 John-Mark Gurney. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #include "fib.h" #define TESTCASE 1 #define COUNT 100000 #define DIF 1000 #define MAXEXT 10 #define VERBOSE 1 int cmp(void *, void *); int cmp(void *x, void *y) { int a, b; a = (int)x; b = (int)y; if (a < b) return -1; if (a == b) return 0; return 1; } int main(void) { #if !TESTCASE struct fibheap_el *w; #else int e, j, k; #endif struct fibheap *a; int i, x; a = fh_makeheap(); fh_setcmp(a, cmp); srandom(time(NULL)); #if TESTCASE #if VERBOSE printf("inserting: "); #endif e = 0; for (i = 0; i < COUNT; i++) { #if VERBOSE if (i) printf(", "); #endif fh_insert(a, (void *)(x = random()/10)); #if VERBOSE printf("%d", x); #endif if (i - e > DIF) { k = random() % MAXEXT; for (j = 0; j < k; j++, e++) printf("throwing: %d\n", (int)fh_extractmin(a)); } } #if VERBOSE printf("\nremaining: %d\n", COUNT - e); printf("extracting: "); #endif for (i = 0; i < COUNT - e; i++) { #if VERBOSE if (i) printf(", "); printf("%d", (int)fh_extractmin(a)); #else fh_extractmin(a); #endif } #if VERBOSE printf("\n"); #endif if ((int)fh_extractmin(a) == 0) printf("heap empty!\n"); else { printf("heap not empty! ERROR!\n"); exit(1); } #else w = fh_insert(a, (void *)6); printf("adding: %d\n", 6); fh_insert(a, (void *)9); printf("adding: %d\n", 9); fh_insert(a, (void *)1); printf("adding: %d\n", 1); for(i = 0; i < 5; i++) { x = random()/10000; printf("adding: %d\n", x); fh_insert(a, (void *)x); } fh_insert(a, (void *)4); printf("adding: %d\n", 4); fh_insert(a, (void *)8); printf("adding: %d\n", 8); printf("first: %d\n", (int)fh_extractmin(a)); printf("deleting: %d\n", (int)fh_delete(a, w)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); for(i = 0; i < 5; i++) { x = random()/10000; printf("adding: %d\n", x); fh_insert(a, (void *)x); } printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); printf("first: %d\n", (int)fh_extractmin(a)); #endif fh_deleteheap(a); return 0; } navit-0.5.0+dfsg.1/navit/file.c000066400000000000000000000455751264204753600161500ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "navit_lfs.h" #ifdef _MSC_VER #include #else #include #endif /* _MSC_VER */ #include #include #include #include #include #include #include #include "debug.h" #include "cache.h" #include "file.h" #include "atom.h" #include "item.h" #include "util.h" #include "types.h" #include "zipfile.h" #ifdef HAVE_SOCKET #include #include #endif extern char *version; #ifdef HAVE_LIBCRYPTO #include #include #include #include #include #endif #ifdef CACHE_SIZE static GHashTable *file_name_hash; #endif static struct cache *file_cache; #ifdef HAVE_PRAGMA_PACK #pragma pack(push) #pragma pack(1) #endif struct file_cache_id { long long offset; int size; int file_name_id; int method; } ATTRIBUTE_PACKED; #ifdef HAVE_PRAGMA_PACK #pragma pack(pop) #endif #ifdef HAVE_SOCKET static int file_socket_connect(char *host, char *service) { struct addrinfo hints; struct addrinfo *result, *rp; int fd=-1,s; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; s = getaddrinfo(host, service, &hints, &result); if (s != 0) { dbg(lvl_error,"getaddrinfo error %s\n",gai_strerror(s)); return -1; } for (rp = result; rp != NULL; rp = rp->ai_next) { fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (fd != -1) { if (connect(fd, rp->ai_addr, rp->ai_addrlen) != -1) break; close(fd); fd=-1; } } freeaddrinfo(result); return fd; } static void file_http_request(struct file *file, char *method, char *host, char *path, char *header, int persistent) { char *request=g_strdup_printf("%s %s HTTP/1.0\r\nUser-Agent: navit %s\r\nHost: %s\r\n%s%s%s\r\n",method,path,version,host,persistent?"Connection: Keep-Alive\r\n":"",header?header:"",header?"\r\n":""); write(file->fd, request, strlen(request)); dbg(lvl_debug,"%s\n",request); file->requests++; } static int file_request_do(struct file *file, struct attr **options, int connect) { struct attr *attr; char *name; if (!options) return 0; attr=attr_search(options, NULL, attr_url); if (!attr) return 0; name=attr->u.str; if (!name) return 0; g_free(file->name); file->name = g_strdup(name); if (!strncmp(name,"http://",7)) { char *host=g_strdup(name+7); char *port=strchr(host,':'); char *path=strchr(name+7,'/'); char *method="GET"; char *header=NULL; int persistent=0; if ((attr=attr_search(options, NULL, attr_http_method)) && attr->u.str) method=attr->u.str; if ((attr=attr_search(options, NULL, attr_http_header)) && attr->u.str) header=attr->u.str; if ((attr=attr_search(options, NULL, attr_persistent))) persistent=attr->u.num; if (path) host[path-name-7]='\0'; if (port) *port++='\0'; dbg(lvl_debug,"host=%s path=%s\n",host,path); if (connect) file->fd=file_socket_connect(host,port?port:"80"); file_http_request(file,method,host,path,header,persistent); file->special=1; g_free(host); } return 1; } #endif static unsigned char * file_http_header_end(unsigned char *str, int len) { int i; for (i=0; i+1headers) return NULL; return g_hash_table_lookup(f->headers, header); } struct file * file_create(char *name, struct attr **options) { struct file *file= g_new0(struct file,1); struct attr *attr; int open_flags=O_LARGEFILE|O_BINARY; if (options && (attr=attr_search(options, NULL, attr_url))) { #ifdef HAVE_SOCKET file_request_do(file, options, 1); #endif } else { if (options && (attr=attr_search(options, NULL, attr_readwrite)) && attr->u.num) { open_flags |= O_RDWR; if ((attr=attr_search(options, NULL, attr_create)) && attr->u.num) open_flags |= O_CREAT|O_TRUNC; } else open_flags |= O_RDONLY; file->name = g_strdup(name); file->fd=open(name, open_flags, 0666); if (file->fd == -1) { g_free(file->name); g_free(file); return NULL; } dbg(lvl_debug,"fd=%d\n", file->fd); file->size=lseek(file->fd, 0, SEEK_END); if (file->size < 0) file->size=0; dbg(lvl_debug,"size="LONGLONG_FMT"\n", file->size); file->name_id = (long)atom(name); } #ifdef CACHE_SIZE if (!options || !(attr=attr_search(options, NULL, attr_cache)) || attr->u.num) file->cache=1; #endif dbg_assert(file != NULL); return file; } #if 0 struct file * file_create_url(char *url) { } #endif #ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif #ifndef S_ISREG #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif int file_is_dir(char *name) { struct stat buf; if (! stat(name, &buf)) { return S_ISDIR(buf.st_mode); } return 0; } int file_is_reg(char *name) { struct stat buf; if (! stat(name, &buf)) { return S_ISREG(buf.st_mode); } return 0; } long long file_size(struct file *file) { return file->size; } int file_mkdir(char *name, int pflag) { char *buffer=g_alloca(sizeof(char)*(strlen(name)+1)); int ret; char *next; dbg(lvl_debug,"enter %s %d\n",name,pflag); if (!pflag) { if (file_is_dir(name)) return 0; #if defined HAVE_API_WIN32_BASE || defined _MSC_VER return mkdir(name); #else return mkdir(name, 0777); #endif } strcpy(buffer, name); next=buffer; while ((next=strchr(next, '/'))) { *next='\0'; if (*buffer) { ret=file_mkdir(buffer, 0); if (ret) return ret; } *next++='/'; } if (pflag == 2) return 0; return file_mkdir(buffer, 0); } int file_mmap(struct file *file) { #if 0 int mmap_size=file->size+1024*1024; #else int mmap_size=file->size; #endif #ifdef HAVE_API_WIN32_BASE file->begin = (unsigned char*)mmap_readonly_win32( file->name, &file->map_handle, &file->map_file ); #else file->begin=mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, file->fd, 0); dbg_assert(file->begin != NULL); if (file->begin == (void *)0xffffffff) { perror("mmap"); return 0; } #endif dbg_assert(file->begin != (void *)0xffffffff); file->mmap_end=file->begin+mmap_size; file->end=file->begin+file->size; return 1; } unsigned char * file_data_read(struct file *file, long long offset, int size) { void *ret; if (file->special) return NULL; if (file->begin) return file->begin+offset; if (file->cache) { struct file_cache_id id={offset,size,file->name_id,0}; ret=cache_lookup(file_cache,&id); if (ret) return ret; ret=cache_insert_new(file_cache,&id,size); } else ret=g_malloc(size); lseek(file->fd, offset, SEEK_SET); if (read(file->fd, ret, size) != size) { file_data_free(file, ret); ret=NULL; } return ret; } static void file_process_headers(struct file *file, unsigned char *headers) { char *tok; char *cl; if (file->headers) g_hash_table_destroy(file->headers); file->headers=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); while ((tok=strtok((char*)headers, "\r\n"))) { char *sep; tok=g_strdup(tok); sep=strchr(tok,':'); if (!sep) sep=strchr(tok,'/'); if (!sep) { g_free(tok); continue; } *sep++='\0'; if (*sep == ' ') sep++; strtolower(tok, tok); dbg(lvl_debug,"header '%s'='%s'\n",tok,sep); g_hash_table_insert(file->headers, tok, sep); headers=NULL; } cl=g_hash_table_lookup(file->headers, "content-length"); if (cl) #ifdef HAVE__ATOI64 file->size=_atoi64(cl); #else file->size=atoll(cl); #endif } static void file_shift_buffer(struct file *file, int amount) { memmove(file->buffer, file->buffer+amount, file->buffer_len-amount); file->buffer_len-=amount; } unsigned char * file_data_read_special(struct file *file, int size, int *size_ret) { unsigned char *ret,*hdr; int rets=0,rd; int buffer_size=8192; int eof=0; if (!file->special) return NULL; if (!file->buffer) file->buffer=g_malloc(buffer_size); ret=g_malloc(size); while ((size > 0 || file->requests) && (!eof || file->buffer_len)) { int toread=buffer_size-file->buffer_len; if (toread >= 4096 && !eof) { if (!file->requests && toread > size) toread=size; rd=read(file->fd, file->buffer+file->buffer_len, toread); if (rd > 0) { file->buffer_len+=rd; } else eof=1; } if (file->requests) { dbg(lvl_debug,"checking header\n"); if ((hdr=file_http_header_end(file->buffer, file->buffer_len))) { hdr[-1]='\0'; dbg(lvl_debug,"found %s\n",file->buffer); file_process_headers(file, file->buffer); file_shift_buffer(file, hdr-file->buffer); file->requests--; if (file_http_header(file, "location")) break; } } if (!file->requests) { rd=file->buffer_len; if (rd > size) rd=size; memcpy(ret+rets, file->buffer, rd); file_shift_buffer(file, rd); rets+=rd; size-=rd; } } *size_ret=rets; return ret; } unsigned char * file_data_read_all(struct file *file) { return file_data_read(file, 0, file->size); } void file_data_flush(struct file *file, long long offset, int size) { if (file->cache) { struct file_cache_id id={offset,size,file->name_id,0}; cache_flush(file_cache,&id); dbg(lvl_debug,"Flushing "LONGLONG_FMT" %d bytes\n",offset,size); } } int file_data_write(struct file *file, long long offset, int size, const void *data) { file_data_flush(file, offset, size); lseek(file->fd, offset, SEEK_SET); if (write(file->fd, data, size) != size) return 0; if (file->size < offset+size) file->size=offset+size; return 1; } int file_get_contents(char *name, unsigned char **buffer, int *size) { struct file *file; file=file_create(name, 0); if (!file) return 0; file->cache=0; *size=file_size(file); *buffer=file_data_read_all(file); file_destroy(file); return 1; } static int uncompress_int(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; stream.next_out = dest; stream.avail_out = (uInt)*destLen; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit2(&stream, -MAX_WBITS); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } unsigned char * file_data_read_compressed(struct file *file, long long offset, int size, int size_uncomp) { void *ret; char *buffer = 0; uLongf destLen=size_uncomp; if (file->cache) { struct file_cache_id id={offset,size,file->name_id,1}; ret=cache_lookup(file_cache,&id); if (ret) return ret; ret=cache_insert_new(file_cache,&id,size_uncomp); } else ret=g_malloc(size_uncomp); lseek(file->fd, offset, SEEK_SET); buffer = (char *)g_malloc(size); if (read(file->fd, buffer, size) != size) { g_free(ret); ret=NULL; } else { if (uncompress_int(ret, &destLen, (Bytef *)buffer, size) != Z_OK) { dbg(lvl_error,"uncompress failed\n"); g_free(ret); ret=NULL; } } g_free(buffer); return ret; } unsigned char * file_data_read_encrypted(struct file *file, long long offset, int size, int size_uncomp, int compressed, char *passwd) { #ifdef HAVE_LIBCRYPTO void *ret; unsigned char *buffer = 0; uLongf destLen=size_uncomp; if (file->cache) { struct file_cache_id id={offset,size,file->name_id,1}; ret=cache_lookup(file_cache,&id); if (ret) return ret; ret=cache_insert_new(file_cache,&id,size_uncomp); } else ret=g_malloc(size_uncomp); lseek(file->fd, offset, SEEK_SET); buffer = (unsigned char *)g_malloc(size); if (read(file->fd, buffer, size) != size) { g_free(ret); ret=NULL; } else { unsigned char key[34], salt[8], verify[2], counter[16], xor[16], mac[10], *datap; int overhead=sizeof(salt)+sizeof(verify)+sizeof(mac); int esize=size-overhead; PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), (unsigned char *)buffer, 8, 1000, 34, key); if (key[32] == buffer[8] && key[33] == buffer[9] && esize >= 0) { AES_KEY aeskey; AES_set_encrypt_key(key, 128, &aeskey); datap=buffer+sizeof(salt)+sizeof(verify); memset(counter, 0, sizeof(counter)); while (esize > 0) { int i,curr_size,idx=0; do { counter[idx]++; } while (!counter[idx++]); AES_encrypt(counter, xor, &aeskey); curr_size=esize; if (curr_size > sizeof(xor)) curr_size=sizeof(xor); for (i = 0 ; i < curr_size ; i++) *datap++^=xor[i]; esize-=curr_size; } size-=overhead; datap=buffer+sizeof(salt)+sizeof(verify); if (compressed) { if (uncompress_int(ret, &destLen, (Bytef *)datap, size) != Z_OK) { dbg(lvl_error,"uncompress failed\n"); g_free(ret); ret=NULL; } } else { if (size == destLen) memcpy(ret, buffer, destLen); else { dbg(lvl_error,"memcpy failed\n"); g_free(ret); ret=NULL; } } } else { g_free(ret); ret=NULL; } } g_free(buffer); return ret; #else return NULL; #endif } void file_data_free(struct file *file, unsigned char *data) { if (file->begin) { if (data == file->begin) return; if (data >= file->begin && data < file->end) return; } if (file->cache && data) { cache_entry_destroy(file_cache, data); } else g_free(data); } void file_data_remove(struct file *file, unsigned char *data) { if (file->begin) { if (data == file->begin) return; if (data >= file->begin && data < file->end) return; } if (file->cache && data) { cache_flush_data(file_cache, data); } else g_free(data); } int file_exists(char const *name) { struct stat buf; if (! stat(name, &buf)) return 1; return 0; } void file_remap_readonly(struct file *f) { #if defined(_WIN32) || defined(__CEGCC__) #else void *begin; munmap(f->begin, f->size); begin=mmap(f->begin, f->size, PROT_READ, MAP_PRIVATE, f->fd, 0); if (f->begin != begin) printf("remap failed\n"); #endif } void file_unmap(struct file *f) { #if defined(_WIN32) || defined(__CEGCC__) mmap_unmap_win32( f->begin, f->map_handle , f->map_file ); #else munmap(f->begin, f->size); #endif } #ifndef _MSC_VER void * file_opendir(char *dir) { return opendir(dir); } #else void * file_opendir(char *dir) { WIN32_FIND_DATAA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; #undef UNICODE // we need FindFirstFileA() which takes an 8-bit c-string char* fname=g_alloca(sizeof(char)*(strlen(dir)+4)); sprintf(fname,"%s\\*",dir); hFind = FindFirstFileA(fname, &FindFileData); return hFind; } #endif #ifndef _MSC_VER char * file_readdir(void *hnd) { struct dirent *ent; ent=readdir(hnd); if (! ent) return NULL; return ent->d_name; } #else char * file_readdir(void *hnd) { WIN32_FIND_DATA FindFileData; if (FindNextFile(hnd, &FindFileData) ) { return FindFileData.cFileName; } else { return NULL; } } #endif /* _MSC_VER */ #ifndef _MSC_VER void file_closedir(void *hnd) { closedir(hnd); } #else void file_closedir(void *hnd) { FindClose(hnd); } #endif /* _MSC_VER */ struct file * file_create_caseinsensitive(char *name, struct attr **options) { char *dirname=g_alloca(sizeof(char)*(strlen(name)+1)); char *filename; char *p; void *d; struct file *ret; ret=file_create(name, options); if (ret) return ret; strcpy(dirname, name); p=dirname+strlen(name); while (p > dirname) { if (*p == '/') break; p--; } *p=0; d=file_opendir(dirname); if (d) { *p++='/'; while ((filename=file_readdir(d))) { if (!g_ascii_strcasecmp(filename, p)) { strcpy(p, filename); ret=file_create(dirname, options); if (ret) break; } } file_closedir(d); } return ret; } void file_fsync(struct file *f) { #ifdef HAVE_FSYNC fsync(f->fd); #endif } void file_destroy(struct file *f) { if (f->headers) g_hash_table_destroy(f->headers); switch (f->special) { case 0: case 1: close(f->fd); break; } if ( f->begin != NULL ) { file_unmap( f ); } g_free(f->buffer); g_free(f->name); g_free(f); } struct file_wordexp { int err; char *pattern; wordexp_t we; }; struct file_wordexp * file_wordexp_new(const char *pattern) { struct file_wordexp *ret=g_new0(struct file_wordexp, 1); ret->pattern=g_strdup(pattern); ret->err=wordexp(pattern, &ret->we, 0); if (ret->err) dbg(lvl_debug,"wordexp('%s') returned %d\n", pattern, ret->err); return ret; } int file_wordexp_get_count(struct file_wordexp *wexp) { if (wexp->err) return 1; return wexp->we.we_wordc; } char ** file_wordexp_get_array(struct file_wordexp *wexp) { if (wexp->err) return &wexp->pattern; return wexp->we.we_wordv; } void file_wordexp_destroy(struct file_wordexp *wexp) { if (! wexp->err) wordfree(&wexp->we); g_free(wexp->pattern); g_free(wexp); } int file_version(struct file *file, int mode) { #ifndef HAVE_API_WIN32_BASE struct stat st; int error; if (mode == 3) { long long size=lseek(file->fd, 0, SEEK_END); if (file->begin && file->begin+size > file->mmap_end) { file->version++; } else { file->size=size; if (file->begin) file->end=file->begin+file->size; } } else { if (mode == 2) error=stat(file->name, &st); else error=fstat(file->fd, &st); if (error || !file->version || file->mtime != st.st_mtime || file->ctime != st.st_ctime) { file->mtime=st.st_mtime; file->ctime=st.st_ctime; file->version++; dbg(lvl_debug,"%s now version %d\n", file->name, file->version); } } return file->version; #else return 0; #endif } void * file_get_os_handle(struct file *file) { return GINT_TO_POINTER(file->fd); } int file_set_cache_size(int cache_size) { #ifdef CACHE_SIZE cache_resize(file_cache, cache_size); return 1; #else return 0; #endif } void file_init(void) { #ifdef CACHE_SIZE file_name_hash=g_hash_table_new(g_str_hash, g_str_equal); file_cache=cache_new(sizeof(struct file_cache_id), CACHE_SIZE); #endif if(sizeof(off_t)<8) dbg(lvl_error,"Maps larger than 2GB are not supported by this binary, sizeof(off_t)=%zu\n",sizeof(off_t)); } navit-0.5.0+dfsg.1/navit/file.h000066400000000000000000000065711264204753600161460ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_FILE_H #define NAVIT_FILE_H #ifdef __cplusplus extern "C" { #endif #ifndef PATH_MAX #define PATH_MAX 4096 #endif #ifndef __CEGCC__ #include #endif #include "param.h" #include struct file { struct file *next; unsigned char *begin; unsigned char *end; unsigned char *mmap_end; long long size; int name_id; int fd; #ifndef __CEGCC__ time_t mtime; time_t ctime; int version; #endif #if defined(_WIN32) || defined(__CEGCC__) long map_handle; long map_file; #endif char *name; int special; int cache; int requests; unsigned char *buffer; int buffer_len; GHashTable *headers; }; struct attr; /* prototypes */ int file_request(struct file *f, struct attr **options); char *file_http_header(struct file *f, char *header); struct file *file_create(char *name, struct attr **options); int file_is_dir(char *name); long long file_size(struct file *file); int file_mkdir(char *name, int pflag); int file_mmap(struct file *file); unsigned char *file_data_read(struct file *file, long long offset, int size); unsigned char *file_data_read_special(struct file *file, int size, int *size_ret); unsigned char *file_data_read_all(struct file *file); void file_data_flush(struct file *file, long long offset, int size); int file_data_write(struct file *file, long long offset, int size, const void *data); int file_get_contents(char *name, unsigned char **buffer, int *size); unsigned char *file_data_read_compressed(struct file *file, long long offset, int size, int size_uncomp); unsigned char *file_data_read_encrypted(struct file *file, long long offset, int size, int size_uncomp, int compressed, char *passwd); void file_data_free(struct file *file, unsigned char *data); int file_exists(char const *name); void file_remap_readonly(struct file *f); void file_unmap(struct file *f); void *file_opendir(char *dir); char *file_readdir(void *hnd); void file_closedir(void *hnd); struct file *file_create_caseinsensitive(char *name, struct attr **options); void file_fsync(struct file *f); void file_destroy(struct file *f); struct file_wordexp *file_wordexp_new(const char *pattern); int file_wordexp_get_count(struct file_wordexp *wexp); char **file_wordexp_get_array(struct file_wordexp *wexp); void file_wordexp_destroy(struct file_wordexp *wexp); int file_get_param(struct file *file, struct param_list *param, int count); int file_version(struct file *file, int byname); void *file_get_os_handle(struct file *file); int file_set_cache_size(int cache_size); void file_init(void); int file_is_reg(char *name); void file_data_remove(struct file *file, unsigned char *data); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/font/000077500000000000000000000000001264204753600160135ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/font/Makefile.am000066400000000000000000000000641264204753600200470ustar00rootroot00000000000000SUBDIRS= if FONT_FREETYPE SUBDIRS+=freetype endif navit-0.5.0+dfsg.1/navit/font/freetype/000077500000000000000000000000001264204753600176365ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/font/freetype/CMakeLists.txt000066400000000000000000000006421264204753600224000ustar00rootroot00000000000000module_add_library(font_freetype font_freetype.c) if (FRIBIDI_FOUND) include_directories(${FRIBIDI_INCLUDE_DIRS}) set_property( TARGET font_freetype APPEND PROPERTY COMPILE_DEFINITIONS USE_FRIBIDI=1 ) if (NOT FRIBIDI2_FOUND) set_property( TARGET font_freetype APPEND PROPERTY COMPILE_DEFINITIONS FRIBIDIOLD=1 ) endif (NOT FRIBIDI2_FOUND) endif (FRIBIDI_FOUND) navit-0.5.0+dfsg.1/navit/font/freetype/Makefile.am000066400000000000000000000007341264204753600216760ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @FREETYPE2_CFLAGS@ @FONTCONFIG_CFLAGS@ @FRIBIDI2_CFLAGS@ @FRIBIDI_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=font_freetype if PLUGINS modulefont_LTLIBRARIES = libfont_freetype.la else noinst_LTLIBRARIES = libfont_freetype.la endif libfont_freetype_la_SOURCES = font_freetype.c font_freetype.h libfont_freetype_la_LDFLAGS = @FREETYPE2_LIBS@ @FONTCONFIG_LIBS@ @FRIBIDI2_LIBS@ @FRIBIDI_LIBS@ -module -avoid-version navit-0.5.0+dfsg.1/navit/font/freetype/font_freetype.c000066400000000000000000000417161264204753600226640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef HAVE_FONTCONFIG #include #endif #include #include #include FT_FREETYPE_H #ifndef USE_CACHING #define USE_CACHING 1 #endif #if USE_CACHING #include FT_CACHE_H #endif #ifdef USE_FRIBIDI #pragma GCC diagnostic push // fribidi.h is a bit misbehaved... #pragma GCC diagnostic ignored "-Wundef" #include #pragma GCC diagnostic pop #endif #include FT_GLYPH_H #include "point.h" #include "graphics.h" #include "debug.h" #include "plugin.h" #include "color.h" #include "atom.h" #include "font_freetype.h" #ifndef HAVE_LOOKUP_SCALER #if FREETYPE_MAJOR * 10000 + FREETYPE_MINOR * 100 + FREETYPE_PATCH > 20304 #define HAVE_LOOKUP_SCALER 1 #else #define HAVE_LOOKUP_SCALER 0 #endif #endif #define COLOR_BITDEPTH_OUTPUT 8 #define COL_SHIFT (COLOR_BITDEPTH-COLOR_BITDEPTH_OUTPUT) struct font_freetype_font { int size; #if USE_CACHING #if HAVE_LOOKUP_SCALER FTC_ScalerRec scaler; #else FTC_ImageTypeRec scaler; #endif int charmap_index; #else FT_Face face; #endif }; struct font_priv { int data; }; static struct font_priv dummy; static FT_Library library; #if USE_CACHING static FTC_Manager manager; static FTC_ImageCache image_cache; static FTC_CMapCache charmap_cache; static FTC_SBitCache sbit_cache; #endif static int library_init = 0; static int library_deinit = 0; static void font_freetype_get_text_bbox(struct graphics_priv *gr, struct font_freetype_font *font, char *text, int dx, int dy, struct point *ret, int estimate) { char *p = text; FT_BBox bbox; FT_UInt glyph_index; FT_Glyph glyph; FT_Matrix matrix; FT_Vector pen; int i; struct point pt; int n, len, x = 0, y = 0; pen.x = 0 * 64; pen.y = 0 * 64; #if 0 matrix.xx = dx; matrix.xy = dy; matrix.yx = -dy; matrix.yy = dx; #else matrix.xx = 0x10000; matrix.xy = 0; matrix.yx = 0; matrix.yy = 0x10000; #endif len = g_utf8_strlen(text, -1); if (estimate) { bbox.xMin = 0; bbox.yMin = 0; bbox.yMax = 13*font->size/256; bbox.xMax = 9*font->size*len/256; } else { bbox.xMin = bbox.yMin = 32000; bbox.xMax = bbox.yMax = -32000; #if !USE_CACHING FT_Set_Transform(font->face, &matrix, &pen); #endif for (n = 0; n < len; n++) { FT_BBox glyph_bbox; #if USE_CACHING FTC_Node anode = NULL; FT_Glyph cached_glyph; glyph_index = FTC_CMapCache_Lookup(charmap_cache, font->scaler.face_id, font->charmap_index, g_utf8_get_char(p)); #if HAVE_LOOKUP_SCALER FTC_ImageCache_LookupScaler(image_cache, &font->scaler, FT_LOAD_DEFAULT, glyph_index, &cached_glyph, &anode); #else FTC_ImageCache_Lookup(image_cache, &font->scaler, glyph_index, &cached_glyph, &anode); #endif /* HAVE_LOOKUP_SCALER */ FT_Glyph_Copy(cached_glyph, &glyph); FT_Glyph_Transform(glyph, &matrix, &pen); #else glyph_index = FT_Get_Char_Index(font->face, g_utf8_get_char(p)); FT_Load_Glyph(font->face, glyph_index, FT_LOAD_DEFAULT); FT_Get_Glyph(font->face->glyph, &glyph); #endif /* USE_CACHING */ FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_pixels, &glyph_bbox); glyph_bbox.xMin += x >> 6; glyph_bbox.xMax += x >> 6; glyph_bbox.yMin += y >> 6; glyph_bbox.yMax += y >> 6; x += glyph->advance.x >> 10; y -= glyph->advance.y >> 10; if (glyph_bbox.xMin < bbox.xMin) bbox.xMin = glyph_bbox.xMin; if (glyph_bbox.yMin < bbox.yMin) bbox.yMin = glyph_bbox.yMin; if (glyph_bbox.xMax > bbox.xMax) bbox.xMax = glyph_bbox.xMax; if (glyph_bbox.yMax > bbox.yMax) bbox.yMax = glyph_bbox.yMax; p = g_utf8_next_char(p); FT_Done_Glyph(glyph); #if USE_CACHING FTC_Node_Unref(anode, manager); #endif } if (bbox.xMin > bbox.xMax) { bbox.xMin = 0; bbox.yMin = 0; bbox.xMax = 0; bbox.yMax = 0; } } ret[0].x = bbox.xMin; ret[0].y = -bbox.yMin; ret[1].x = bbox.xMin; ret[1].y = -bbox.yMax; ret[2].x = bbox.xMax; ret[2].y = -bbox.yMax; ret[3].x = bbox.xMax; ret[3].y = -bbox.yMin; if (dy != 0 || dx != 0x10000) { for (i = 0 ; i < 4 ; i++) { pt=ret[i]; ret[i].x=(pt.x*dx-pt.y*dy)/0x10000; ret[i].y=(pt.y*dx+pt.x*dy)/0x10000; } } } static struct font_freetype_text * font_freetype_text_new(char *text, struct font_freetype_font *font, int dx, int dy) { FT_Matrix matrix; FT_Vector pen; FT_UInt glyph_index; int y, n, len, w, h, pixmap_len; struct font_freetype_text *ret; struct font_freetype_glyph *curr; char *p = text; unsigned char *gl, *pm; FT_BitmapGlyph glyph_bitmap; FT_Glyph glyph; len = g_utf8_strlen(text, -1); ret = g_malloc(sizeof(*ret) + len * sizeof(struct text_glyph *)); ret->glyph_count = len; matrix.xx = dx; matrix.xy = dy; matrix.yx = -dy; matrix.yy = dx; pen.x = 0 * 64; pen.y = 0 * 64; #if !USE_CACHING FT_Set_Transform(font->face, &matrix, &pen); #endif #ifdef USE_FRIBIDI // Need to use fribidi to handle the string properly char visual_text[len*4+1]; { FriBidiChar unicode_text[len+2]; FriBidiChar visual_unicode_text[len+2]; FriBidiStrIndex textlen = strlen(text); #ifdef FRIBIDIOLD FriBidiCharType base = FRIBIDI_TYPE_LTR; #else FriBidiParType base = FRIBIDI_PAR_LTR; #endif FriBidiStrIndex unicode_len = #ifdef FRIBIDIOLD fribidi_utf8_to_unicode(text, textlen, unicode_text); #else fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_UTF8, text, textlen, unicode_text); #endif fribidi_log2vis(unicode_text, unicode_len, &base, visual_unicode_text, NULL, NULL, NULL); // TODO: check return value #ifdef FRIBIDIOLD fribidi_unicode_to_utf8(visual_unicode_text, unicode_len, visual_text); #else fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_UTF8, visual_unicode_text, unicode_len, visual_text); #endif p = visual_text; } #endif /* USE_FRIBIDI */ for (n = 0; n < len; n++) { #if USE_CACHING FTC_Node anode=NULL; FT_Glyph cached_glyph; glyph_index = FTC_CMapCache_Lookup(charmap_cache, font->scaler.face_id, font->charmap_index, g_utf8_get_char(p)); #if HAVE_LOOKUP_SCALER FTC_ImageCache_LookupScaler(image_cache, &font->scaler, FT_LOAD_DEFAULT, glyph_index, &cached_glyph, &anode); #else FTC_ImageCache_Lookup(image_cache, &font->scaler, glyph_index, &cached_glyph, &anode); #endif FT_Glyph_Copy(cached_glyph, &glyph); FT_Glyph_Transform(glyph, &matrix, &pen); FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, NULL, TRUE); #else glyph_index = FT_Get_Char_Index(font->face, g_utf8_get_char(p)); FT_Load_Glyph(font->face, glyph_index, FT_LOAD_DEFAULT); FT_Get_Glyph(font->face->glyph, &glyph); #endif FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, NULL, TRUE); glyph_bitmap = (FT_BitmapGlyph)glyph; w = glyph_bitmap->bitmap.width; h = glyph_bitmap->bitmap.rows; if (w && h) pixmap_len = (w + 2) * (h + 2); else pixmap_len = 0; curr = g_malloc0(sizeof(*curr) + pixmap_len); if (pixmap_len) { curr->w = w; curr->h = h; } curr->pixmap = (unsigned char *) (curr + 1); ret->glyph[n] = curr; curr->x = glyph_bitmap->left << 6; curr->y = -glyph_bitmap->top << 6; for (y = 0; y < h; y++) { gl = glyph_bitmap->bitmap.buffer + y * glyph_bitmap->bitmap.pitch; pm = curr->pixmap + y * w; memcpy(pm, gl, w); } curr->dx = glyph->advance.x >> 10; curr->dy = -glyph->advance.y >> 10; FT_Done_Glyph(glyph); #if USE_CACHING FTC_Node_Unref(anode, manager); #endif p = g_utf8_next_char(p); } ret->glyph_count = len; return ret; } /** * List of font families to use, in order of preference */ static char *fontfamilies[] = { "Liberation Sans", "Arial", "NcrBI4nh", "luximbi", "FreeSans", "DejaVu Sans", NULL, }; static void font_destroy(struct graphics_font_priv *font) { g_free(font); /* TODO: free font->face */ } static struct graphics_font_methods font_methods = { font_destroy }; static void font_freetype_text_destroy(struct font_freetype_text *text) { int i; struct font_freetype_glyph **gp; gp = text->glyph; i = text->glyph_count; while (i-- > 0) g_free(*gp++); g_free(text); } #if USE_CACHING static FT_Error face_requester( FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face* aface ) { FT_Error ret; char *fontfile,*fontindex; if (! face_id) return FT_Err_Invalid_Handle; fontfile=g_strdup((char *)face_id); dbg(lvl_debug,"fontfile=%s\n", fontfile); fontindex=strrchr(fontfile,'/'); if (! fontindex) { g_free(fontfile); return FT_Err_Invalid_Handle; } *fontindex++='\0'; dbg(lvl_debug,"new face %s %d\n", fontfile, atoi(fontindex)); ret = FT_New_Face( library, fontfile, atoi(fontindex), aface ); if(ret) { dbg(lvl_error,"Error while creating freetype face: %d\n", ret); return ret; } if((ret = FT_Select_Charmap(*aface, FT_ENCODING_UNICODE))) { dbg(lvl_error,"Error while creating freetype face: %d\n", ret); } return 0; } #endif /** Implementation of font_freetype_methods.font_new */ static struct font_freetype_font * font_freetype_font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *fontfamily, int size, int flags) { struct font_freetype_font *font = g_new(struct font_freetype_font, 1); int exact, found=0; char **family, **family_sav; #if USE_CACHING char *idstr; FT_Face face; #endif #ifndef HAVE_FONTCONFIG char *name; #endif *meth = font_methods; if (!library_init) { FT_Init_FreeType(&library); #if USE_CACHING FTC_Manager_New( library, 0, 0, 0, &face_requester, NULL, &manager); FTC_ImageCache_New( manager, &image_cache); FTC_CMapCache_New( manager, &charmap_cache); FTC_SBitCache_New( manager, &sbit_cache); #endif library_init = 1; } font->size=size; #ifdef HAVE_FONTCONFIG dbg(lvl_info, " about to search for fonts, preferred = %s\n", fontfamily); family = g_malloc(sizeof(fontfamilies) + sizeof(fontfamily)); if (fontfamily) { memcpy(family, &fontfamily, sizeof(fontfamily)); memcpy(family + 1, fontfamilies, sizeof(fontfamilies)); } else { memcpy(family, fontfamilies, sizeof(fontfamilies)); } family_sav=family; for (exact = 1; !found && exact >= 0; exact--) { family=family_sav; while (*family && !found) { dbg(lvl_info, "Looking for font family %s. exact=%d\n", *family, exact); FcPattern *required = FcPatternBuild(NULL, FC_FAMILY, FcTypeString, *family, NULL); if (flags) FcPatternAddInteger(required, FC_WEIGHT, FC_WEIGHT_BOLD); FcConfigSubstitute(FcConfigGetCurrent(), required, FcMatchFont); FcDefaultSubstitute(required); FcResult result; FcPattern *matched = FcFontMatch(FcConfigGetCurrent(), required, &result); if (matched) { FcValue v1, v2; FcChar8 *fontfile; int fontindex; FcPatternGet(required, FC_FAMILY, 0, &v1); FcPatternGet(matched, FC_FAMILY, 0, &v2); FcResult r1 = FcPatternGetString(matched, FC_FILE, 0, &fontfile); FcResult r2 = FcPatternGetInteger(matched, FC_INDEX, 0, &fontindex); if ((r1 == FcResultMatch) && (r2 == FcResultMatch) && (FcValueEqual(v1, v2) || !exact)) { dbg(lvl_info, "About to load font from file %s index %d\n", fontfile, fontindex); #if USE_CACHING idstr=g_strdup_printf("%s/%d", fontfile, fontindex); font->scaler.face_id=(FTC_FaceID)atom(idstr); g_free(idstr); #if HAVE_LOOKUP_SCALER font->scaler.width=0; font->scaler.height=size; font->scaler.pixel=0; font->scaler.x_res=300; font->scaler.y_res=300; #else font->scaler.width=size/15; font->scaler.height=size/15; font->scaler.flags=FT_LOAD_DEFAULT; #endif FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; #else /* USE_CACHING */ FT_New_Face(library, (char *) fontfile, fontindex, &font->face); #endif /* USE_CACHING */ found = 1; } FcPatternDestroy(matched); } FcPatternDestroy(required); family++; } } g_free(family_sav); #else /* HAVE_FONTCONFIG */ #ifdef FREETYPE_FONTS { char *fonts[]={FREETYPE_FONTS}; name=g_strdup(fonts[flags ? 1:0]); } #else name=g_strdup_printf("%s/fonts/%s-%s.ttf",getenv("NAVIT_SHAREDIR"),"LiberationSans",flags ? "Bold":"Regular"); #endif #if USE_CACHING idstr=g_strdup_printf("%s/%d", name, 0); font->scaler.face_id=(FTC_FaceID)atom(idstr); g_free(idstr); FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; #if HAVE_LOOKUP_SCALER font->scaler.width=0; font->scaler.height=size; font->scaler.pixel=0; font->scaler.x_res=300; font->scaler.y_res=300; #else font->scaler.width=size/15; font->scaler.height=size/15; font->scaler.flags=FT_LOAD_DEFAULT; #endif found=1; FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; #else /* USE_CACHING */ if (!FT_New_Face(library, name, 0, &font->face)) found=1; #endif /* USE_CACHING */ g_free(name); #endif /* HAVE_FONTCONFIG */ if (!found) { dbg(lvl_error,"Failed to load font, no labelling\n"); g_free(font); return NULL; } #if !USE_CACHING FT_Set_Char_Size(font->face, 0, size, 300, 300); FT_Select_Charmap(font->face, FT_ENCODING_UNICODE); #endif return font; } /** Implementation of font_freetype_methods.get_shadow. */ static int font_freetype_glyph_get_shadow(struct font_freetype_glyph *g, unsigned char *data, int stride, struct color *foreground, struct color *background) { int x, y, w = g->w, h = g->h; unsigned int bg, fg; unsigned char *pm, *psp,*ps,*psn; fg=((foreground->a>>COL_SHIFT)<<24)| ((foreground->r>>COL_SHIFT)<<16)| ((foreground->g>>COL_SHIFT)<<8)| ((foreground->b>>COL_SHIFT)<<0); bg=((background->a>>COL_SHIFT)<<24)| ((background->r>>COL_SHIFT)<<16)| ((background->g>>COL_SHIFT)<<8)| ((background->b>>COL_SHIFT)<<0); for (y = 0; y < h+2; y++) { if (stride) { ps = data + stride * y; } else { unsigned char **dataptr=(unsigned char **)data; ps = dataptr[y]; } for (x = 0 ; x < w+2 ; x++) ((unsigned int *)ps)[x]=bg; } for (y = 0; y < h; y++) { pm = g->pixmap + y * w; if (stride) { psp = data + stride * y; ps = psp + stride; psn = ps + stride; } else { unsigned char **dataptr=(unsigned char **)data; psp = dataptr[y]; ps = dataptr[y+1]; psn = dataptr[y+2]; } for (x = 0; x < w; x++) { if (*pm) { ((unsigned int *)psp)[1]=fg; ((unsigned int *)ps)[0]=fg; ((unsigned int *)ps)[1]=fg; ((unsigned int *)ps)[2]=fg; ((unsigned int *)psn)[1]=fg; } psp+=4; ps+=4; psn+=4; pm++; } } return 1; } /** Implementation of font_freetype_methods.get_glyph. */ static int font_freetype_glyph_get_glyph(struct font_freetype_glyph *g, unsigned char *data, int stride, struct color *fg, struct color *bg, struct color *transparent) { int x, y, w = g->w, h = g->h; unsigned int tr; unsigned char v,vi,*pm, *ps; tr=((transparent->a>>COL_SHIFT)<<24)| ((transparent->r>>COL_SHIFT)<<16)| ((transparent->g>>COL_SHIFT)<<8)| ((transparent->b>>COL_SHIFT)<<0); for (y = 0; y < h; y++) { pm = g->pixmap + y * w; if (stride) { ps = data + stride*y; } else { unsigned char **dataptr=(unsigned char **)data; ps = dataptr[y]; } for (x = 0; x < w; x++) { v=*pm; if (v) { vi=255-v; ((unsigned int *)ps)[0]= ((((fg->a*v+bg->a*vi)/255)>>COL_SHIFT)<<24)| ((((fg->r*v+bg->r*vi)/255)>>COL_SHIFT)<<16)| ((((fg->g*v+bg->g*vi)/255)>>COL_SHIFT)<<8)| ((((fg->b*v+bg->b*vi)/255)>>COL_SHIFT)<<0); } else ((unsigned int *)ps)[0]=tr; ps+=4; pm++; } } return 1; } static void font_freetype_destroy(void) { // Do not call FcFini here: GdkPixbuf also (indirectly) uses fontconfig (for SVGs with // text), but does not properly deallocate all objects, so FcFini assert()s. if (!library_deinit) { #if USE_CACHING FTC_Manager_Done(manager); #endif FT_Done_FreeType(library); } library_deinit = 1; } static struct font_freetype_methods methods = { font_freetype_destroy, font_freetype_font_new, font_freetype_get_text_bbox, font_freetype_text_new, font_freetype_text_destroy, font_freetype_glyph_get_shadow, font_freetype_glyph_get_glyph, }; static struct font_priv * font_freetype_new(void *meth) { *((struct font_freetype_methods *) meth) = methods; return &dummy; } void plugin_init(void) { plugin_register_font_type("freetype", font_freetype_new); #ifdef HAVE_FONTCONFIG FcInit(); #endif } navit-0.5.0+dfsg.1/navit/font/freetype/font_freetype.h000066400000000000000000000111501264204753600226560ustar00rootroot00000000000000/* * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * @brief Interface to the FreeType 2 library, to render text as bitmaps. * * This plugin supplies functions to render text (encoded as UTF-8) to bitmaps with the help of * FreeType 2. Typical usage: * @li create a struct font_freetype_font by calling font_freetype_methods.font_new() * @li for the text to render, create a struct font_freetype_text by calling font_freetype_methods.text_new() * @li obtain glyph bitmaps by calling font_freetype_methods.get_glyph() on the glyphs inside * struct font_freetype_text * @li optionally, obtain a "shadow" of the glyph from font_freetype_methods.get_shadow(), to make * the text easier to read against a colored background (like the map) */ struct font_freetype_font; struct font_freetype_glyph; /** Methods provided by this plugin. */ struct font_freetype_methods { void (*destroy)(void); /** * @brief Load a font, preferring one with the given font family. * * Try to load a font, trying to match either the given font family, or one from a list * of hardcoded families, or let fontconfig pick the best match. * @param graphics_priv unused * @param graphics_font_methods used to return font methods * @param fontfamily the preferred font family * @param size requested size of font * @param flags extra flags for the font (bold,etc) * @returns loaded font, or NULL */ struct font_freetype_font *(*font_new) (struct graphics_priv * gr, struct graphics_font_methods * meth, char *font, int size, int flags); void (*get_text_bbox) (struct graphics_priv * gr, struct font_freetype_font * font, char *text, int dx, int dy, struct point * ret, int estimate); struct font_freetype_text *(*text_new) (char *text, struct font_freetype_font * font, int dx, int dy); void (*text_destroy) (struct font_freetype_text * text); /** * @brief Get glyph "shadow", a glyph bitmap to be used as background. * * This method returns a glyph shadow, a bitmap with the glyph, where the glyph has been * "fattened" by expanding it by one pixel on each side. * In Navit, the shadow is used as the background behind the glyph bitmaps (returned by * font_freetype_methods.get_glyph() ), to make the text easier to read. * * @param g glyph to render, usually created via font_freetype_methods.text_new() * @param data buffer for result image bitmap. Size must be at least (4 * stride * (g->h+2)). * @param stride see font_freetype_methods.get_glyph(). Minimum: g->w+2. * @param foreground color for rendering the "shadow" * @param background color for rest of the bitmap (typically set to transparent) * @returns 0 if depth is invalid, 1 otherwise */ int (*get_shadow) (struct font_freetype_glyph * glyph, unsigned char *data, int stride, struct color *fg, struct color *tr); /** * @brief Get a glyph bitmap. * * This method returns a bitmap for rendering the supplied glyph. * * @param g glyph to render, usually obtained from a struct font_freetype_text created via font_freetype_methods.text_new() * @param data buffer for result image bitmap. Size must be at least (4 * stride * g->h). * @param stride stride (bytes per data row) for result bitmap; must be at least g->w, but may include padding. * Special case: * If set to 0, 'data' is interpreted as an array of pointers to image data rows (i.e. unsigned char**). * @param fg color for rendering the glyph * @param bg color to alpha blend with fg for semi-transparent glyph pixels * @param transparent color for background pixels * @returns 0 if depth is invalid, 1 otherwise */ int (*get_glyph) (struct font_freetype_glyph * glyph, unsigned char *data, int stride, struct color * fg, struct color * bg, struct color *tr); }; struct font_freetype_glyph { int x, y, w, h, dx, dy; unsigned char *pixmap; }; struct font_freetype_text { int glyph_count; struct font_freetype_glyph *glyph[0]; }; navit-0.5.0+dfsg.1/navit/geom.c000066400000000000000000000276201264204753600161470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "geom.h" void geom_coord_copy(struct coord *from, struct coord *to, int count, int reverse) { int i; if (!reverse) { memcpy(to, from, count*sizeof(struct coord)); return; } from+=count; for (i = 0 ; i < count ; i++) *to++=*--from; } /** * Get coordinates of polyline middle point. * @param in *p array of poly vertex coordinates * @param in count count of poly vertexes * @param out *c coordinates of middle point * @returns number of first vertex of segment containing middle point */ int geom_line_middle(struct coord *p, int count, struct coord *c) { double length=0,half=0,len=0; int i; if(count==1) { *c=*p; return 0; } for (i=0; i 0) { i--; half-=length; if (len) { c->x=(p[i].x*half+p[i+1].x*(len-half))/len; c->y=(p[i].y*half+p[i+1].y*(len-half))/len; } else *c=p[i]; } else *c=p[0]; return i; } void geom_coord_revert(struct coord *c, int count) { struct coord tmp; int i; for (i = 0 ; i < count/2 ; i++) { tmp=c[i]; c[i]=c[count-1-i]; c[count-1-i]=tmp; } } long long geom_poly_area(struct coord *c, int count) { long long area=0; int i,j=0; #if 0 fprintf(stderr,"count=%d\n",count); #endif for (i=0; ix=x0+sx/3/area; c->y=y0+sy/3/area; return 1; } return 0; } /** * Get coordinates of polyline point c most close to given point p. * @param in *pl array of polyline vertex coordinates * @param in count count of polyline vertexes * @param in *p point coordinates * @param out *c coordinates of polyline point most close to given point. * @returns first vertex number of polyline segment to which c belongs */ int geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c) { int i,vertex=0; long long x, y, xi, xj, yi, yj, u, d, dmin=0; if(count<2) { c->x=pl->x; c->y=pl->y; return 0; } for(i=0;ix-xi)*(xj-xi)+(p->y-yi)*(yj-yi))*1000/u; } if(u<0) u=0; else if (u>1000) u=1000; x=xi+u*(xj-xi)/1000; y=yi+u*(yj-yi)/1000; d=(p->x-x)*(p->x-x)+(p->y-y)*(p->y-y); if(i==0 || dx=x; c->y=y; vertex=i; } } return vertex; } /** * Check if point is inside polgone. * @param in *cp array of polygon vertex coordinates * @param in count count of polygon vertexes * @param in *c point coordinates * @returns 1 - inside, 0 - outside */ int geom_poly_point_inside(struct coord *cp, int count, struct coord *c) { int ret=0; struct coord *last=cp+count-1; while (cp < last) { if ((cp[0].y > c->y) != (cp[1].y > c->y) && c->x < ((long long)cp[1].x-cp[0].x)*(c->y-cp[0].y)/(cp[1].y-cp[0].y)+cp[0].x) { #if 0 fprintf(stderr," cross 0x%x,0x%x-0x%x,0x%x %dx%d",cp,cp[0].x,cp[0].y,cp[1].x,cp[1].y,cp[1].x-cp[0].x,c->y-cp[0].y); printf("type=selected_line\n"); coord_print(projection_mg, &cp[0], stdout); coord_print(projection_mg, &cp[1], stdout); #endif ret=!ret; } cp++; } return ret; } GList * geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third) { int count; struct geom_poly_segment *ret; struct coord *pos; if (!second) return NULL; ret=g_new(struct geom_poly_segment, 1); ret->type=second->type; count=(second->last-second->first)+1; if (first) count+=(first->last-first->first); if (third) count+=(third->last-third->first); #if 0 fprintf(stderr,"count=%d first=%p second=%p third=%p\n",count,first,second,third); if (first) fprintf(stderr,"first:0x%x,0x%x-0x%x,0x%x (%d)\n",first->first->x,first->first->y,first->last->x,first->last->y, first->last-first->first+1); if (second) fprintf(stderr,"second:0x%x,0x%x-0x%x,0x%x (%d)\n",second->first->x,second->first->y,second->last->x,second->last->y, second->last-second->first+1); if (third) fprintf(stderr,"third:0x%x,0x%x-0x%x,0x%x (%d)\n",third->first->x,third->first->y,third->last->x,third->last->y, third->last-third->first+1); #endif ret->first=g_new(struct coord, count); pos=ret->first; if (first) { count=(first->last-first->first)+1; geom_coord_copy(first->first, pos, count, coord_is_equal(*first->first, *second->first)); pos+=count-1; } count=(second->last-second->first)+1; geom_coord_copy(second->first, pos, count, 0); pos+=count; if (third) { pos--; count=(third->last-third->first)+1; geom_coord_copy(third->first, pos, count, coord_is_equal(*third->last, *second->last)); pos+=count; } ret->last=pos-1; #if 0 fprintf(stderr,"result:0x%x,0x%x-0x%x,0x%x (%d)\n",ret->first->x,ret->first->y,ret->last->x,ret->last->y, ret->last-ret->first+1); #endif list=g_list_prepend(list, ret); #if 0 fprintf(stderr,"List=%p\n",list); #endif return list; } void geom_poly_segment_destroy(struct geom_poly_segment *seg) { g_free(seg->first); g_free(seg); } GList * geom_poly_segments_remove(GList *list, struct geom_poly_segment *seg) { if (seg) { list=g_list_remove(list, seg); geom_poly_segment_destroy(seg); } return list; } int geom_poly_segment_compatible(struct geom_poly_segment *s1, struct geom_poly_segment *s2, int dir) { int same=0,opposite=0; if (s1->type == geom_poly_segment_type_none || s2->type == geom_poly_segment_type_none) return 0; if (s1->type == s2->type) { same=1; if (s1->type == geom_poly_segment_type_way_inner || s1->type == geom_poly_segment_type_way_outer) { opposite=1; } } if (s1->type == geom_poly_segment_type_way_left_side && s2->type == geom_poly_segment_type_way_right_side) opposite=1; if (s1->type == geom_poly_segment_type_way_right_side && s2->type == geom_poly_segment_type_way_left_side) opposite=1; if (s1->type == geom_poly_segment_type_way_unknown || s2->type == geom_poly_segment_type_way_unknown) { same=1; opposite=1; } if (dir < 0) { if ((opposite && coord_is_equal(*s1->first, *s2->first)) || (same && coord_is_equal(*s1->first, *s2->last))) return 1; } else { if ((opposite && coord_is_equal(*s1->last, *s2->last)) || (same && coord_is_equal(*s1->last, *s2->first))) return 1; } return 0; } GList * geom_poly_segments_sort(GList *in, enum geom_poly_segment_type type) { GList *ret=NULL; while (in) { struct geom_poly_segment *seg=in->data; GList *tmp=ret; struct geom_poly_segment *merge_first=NULL,*merge_last=NULL; while (tmp) { struct geom_poly_segment *cseg=tmp->data; if (geom_poly_segment_compatible(seg, cseg, -1)) merge_first=cseg; if (geom_poly_segment_compatible(seg, cseg, 1)) merge_last=cseg; tmp=g_list_next(tmp); } if (merge_first == merge_last) merge_last=NULL; ret=geom_poly_segments_insert(ret, merge_first, seg, merge_last); ret=geom_poly_segments_remove(ret, merge_first); ret=geom_poly_segments_remove(ret, merge_last); in=g_list_next(in); } in=ret; while (in) { struct geom_poly_segment *seg=in->data; if (coord_is_equal(*seg->first, *seg->last)) { long long area=geom_poly_area(seg->first,seg->last-seg->first+1); if (type == geom_poly_segment_type_way_right_side && seg->type == geom_poly_segment_type_way_right_side) { seg->type=area > 0 ? geom_poly_segment_type_way_outer : geom_poly_segment_type_way_inner; } } in=g_list_next(in); } return ret; } int geom_poly_segments_point_inside(GList *in, struct coord *c) { int open_matches=0,closed_matches=0; #if 0 fprintf(stderr,"try 0x%x,0x%x:",c->x,c->y); #endif while (in) { struct geom_poly_segment *seg=in->data; if (geom_poly_point_inside(seg->first, seg->last-seg->first+1, c)) { #if 0 fprintf(stderr," inside"); #endif if (coord_is_equal(*seg->first,*seg->last)) closed_matches++; else open_matches++; } else { #if 0 fprintf(stderr," outside"); #endif } in=g_list_next(in); } #if 0 fprintf(stderr,"\n"); fprintf(stderr,"open_matches %d closed_matches %d\n",open_matches,closed_matches); #endif if (closed_matches) { if (closed_matches & 1) return 1; else return 0; } if (open_matches) { if (open_matches & 1) return -1; else return 0; } return 0; } static int clipcode(struct coord *p, struct rect *r) { int code=0; if (p->x < r->l.x) code=1; if (p->x > r->h.x) code=2; if (p->y < r->l.y) code |=4; if (p->y > r->h.y) code |=8; return code; } int geom_clip_line_code(struct coord *p1, struct coord *p2, struct rect *r) { int code1,code2,ret=1; long long dx,dy; code1=clipcode(p1, r); if (code1) ret |= 2; code2=clipcode(p2, r); if (code2) ret |= 4; dx=p2->x-p1->x; dy=p2->y-p1->y; while (code1 || code2) { if (code1 & code2) return 0; if (code1 & 1) { p1->y+=(r->l.x-p1->x)*dy/dx; p1->x=r->l.x; } else if (code1 & 2) { p1->y+=(r->h.x-p1->x)*dy/dx; p1->x=r->h.x; } else if (code1 & 4) { p1->x+=(r->l.y-p1->y)*dx/dy; p1->y=r->l.y; } else if (code1 & 8) { p1->x+=(r->h.y-p1->y)*dx/dy; p1->y=r->h.y; } code1=clipcode(p1, r); if (code1 & code2) return 0; if (code2 & 1) { p2->y+=(r->l.x-p2->x)*dy/dx; p2->x=r->l.x; } else if (code2 & 2) { p2->y+=(r->h.x-p2->x)*dy/dx; p2->x=r->h.x; } else if (code2 & 4) { p2->x+=(r->l.y-p2->y)*dx/dy; p2->y=r->l.y; } else if (code2 & 8) { p2->x+=(r->h.y-p2->y)*dx/dy; p2->y=r->h.y; } code2=clipcode(p2, r); } if (p1->x == p2->x && p1->y == p2->y) ret=0; return ret; } int geom_is_inside(struct coord *p, struct rect *r, int edge) { switch(edge) { case 0: return p->x >= r->l.x; case 1: return p->x <= r->h.x; case 2: return p->y >= r->l.y; case 3: return p->y <= r->h.y; default: return 0; } } void geom_poly_intersection(struct coord *p1, struct coord *p2, struct rect *r, int edge, struct coord *ret) { int dx=p2->x-p1->x; int dy=p2->y-p1->y; switch(edge) { case 0: ret->y=p1->y+(r->l.x-p1->x)*dy/dx; ret->x=r->l.x; break; case 1: ret->y=p1->y+(r->h.x-p1->x)*dy/dx; ret->x=r->h.x; break; case 2: ret->x=p1->x+(r->l.y-p1->y)*dx/dy; ret->y=r->l.y; break; case 3: ret->x=p1->x+(r->h.y-p1->y)*dx/dy; ret->y=r->h.y; break; } } void geom_init() { } navit-0.5.0+dfsg.1/navit/geom.h000066400000000000000000000052251264204753600161510ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GEOM_H #define NAVIT_GEOM_H #ifdef __cplusplus extern "C" { #endif #include #include "config.h" #include "coord.h" #include "item.h" #include "attr.h" #define sq(x) ((double)(x)*(x)) struct rect {struct coord l,h;}; enum geom_poly_segment_type { geom_poly_segment_type_none, geom_poly_segment_type_way_inner, geom_poly_segment_type_way_outer, geom_poly_segment_type_way_left_side, geom_poly_segment_type_way_right_side, geom_poly_segment_type_way_unknown, }; struct geom_poly_segment { enum geom_poly_segment_type type; struct coord *first,*last; }; /* prototypes */ void geom_coord_copy(struct coord *from, struct coord *to, int count, int reverse); void geom_coord_revert(struct coord *c, int count); int geom_line_middle(struct coord *p, int count, struct coord *c); long long geom_poly_area(struct coord *c, int count); int geom_poly_centroid(struct coord *c, int count, struct coord *r); int geom_poly_point_inside(struct coord *cp, int count, struct coord *c); int geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c); GList *geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third); void geom_poly_segment_destroy(struct geom_poly_segment *seg); GList *geom_poly_segments_remove(GList *list, struct geom_poly_segment *seg); int geom_poly_segment_compatible(struct geom_poly_segment *s1, struct geom_poly_segment *s2, int dir); GList *geom_poly_segments_sort(GList *in, enum geom_poly_segment_type type); int geom_poly_segments_point_inside(GList *in, struct coord *c); int geom_clip_line_code(struct coord *p1, struct coord *p2, struct rect *r); int geom_is_inside(struct coord *p, struct rect *r, int edge); void geom_poly_intersection(struct coord *p1, struct coord *p2, struct rect *r, int edge, struct coord *ret); void geom_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/glib_slice.h000066400000000000000000000003361264204753600173140ustar00rootroot00000000000000#include #if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 10 #define g_slice_alloc0 g_malloc0 #define g_slice_new0(x) g_new0(x,1) #define g_slice_free(x,y) g_free(y) #define g_slice_free1(x,y) g_free(y) #endif navit-0.5.0+dfsg.1/navit/graphics.c000066400000000000000000002322171264204753600170200ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ //############################################################################################################## //# //# File: graphics.c //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //# //############################################################################################################## #include #include #include #include #include "config.h" #include "debug.h" #include "string.h" #include "draw_info.h" #include "point.h" #include "graphics.h" #include "projection.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "coord.h" #include "transform.h" #include "plugin.h" #include "profile.h" #include "mapset.h" #include "layout.h" #include "route.h" #include "util.h" #include "callback.h" #include "file.h" #include "event.h" //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## /** * @brief graphics object * A graphics object serves as the target for drawing operations. * It encapsulates various settings, and a drawing target, such as an image buffer or a window. * Currently, in Navit, there is always one main graphics object, which is used to draw the * map, and optionally additional graphics objects for overlays. * @see graphics_overlay_new() * @see struct graphics_gc */ struct graphics { struct graphics* parent; struct graphics_priv *priv; struct graphics_methods meth; char *default_font; int font_len; struct graphics_font **font; struct graphics_gc *gc[3]; struct attr **attrs; struct callback_list *cbl; struct point_rect r; int gamma,brightness,contrast; int colormgmt; int font_size; GList *selection; int disabled; /* * Counter for z_order of displayitems; */ int current_z_order; GHashTable *image_cache_hash; }; struct display_context { struct graphics *gra; struct element *e; struct graphics_gc *gc; struct graphics_gc *gc_background; struct graphics_image *img; enum projection pro; int mindist; struct transformation *trans; enum item_type type; int maxlen; }; #define HASH_SIZE 1024 struct hash_entry { enum item_type type; struct displayitem *di; }; struct displaylist { int busy; int workload; struct callback *cb; struct layout *layout, *layout_hashed; struct display_context dc; int order, order_hashed, max_offset; struct mapset *ms; struct mapset_handle *msh; struct map *m; int conv; struct map_selection *sel; struct map_rect *mr; struct callback *idle_cb; struct event_idle *idle_ev; unsigned int seq; struct hash_entry hash_entries[HASH_SIZE]; }; struct displaylist_icon_cache { unsigned int seq; }; static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir); static void graphics_process_selection(struct graphics *gra, struct displaylist *dl); static void graphics_gc_init(struct graphics *this_); static void clear_hash(struct displaylist *dl) { int i; for (i = 0 ; i < HASH_SIZE ; i++) dl->hash_entries[i].type=type_none; } static struct hash_entry * get_hash_entry(struct displaylist *dl, enum item_type type) { int hashidx=(type*2654435761UL) & (HASH_SIZE-1); int offset=dl->max_offset; do { if (!dl->hash_entries[hashidx].type) return NULL; if (dl->hash_entries[hashidx].type == type) return &dl->hash_entries[hashidx]; hashidx=(hashidx+1)&(HASH_SIZE-1); } while (offset-- > 0); return NULL; } static struct hash_entry * set_hash_entry(struct displaylist *dl, enum item_type type) { int hashidx=(type*2654435761UL) & (HASH_SIZE-1); int offset=0; for (;;) { if (!dl->hash_entries[hashidx].type) { dl->hash_entries[hashidx].type=type; if (dl->max_offset < offset) dl->max_offset=offset; return &dl->hash_entries[hashidx]; } if (dl->hash_entries[hashidx].type == type) return &dl->hash_entries[hashidx]; hashidx=(hashidx+1)&(HASH_SIZE-1); offset++; } return NULL; } /** * @brief Sets a generic attribute of the graphics instance * * This will only set one of the supported generic graphics attributes (currently {@code gamma}, * {@code brightness}, {@code contrast} or {@code font_size}) and fail for other attribute types. * * To set an attribute provided by a graphics plugin, use {@link graphics_set_attr(struct graphics *, struct attr *)} * instead. * * @param gra The graphics instance * @param attr The attribute to set * * @return True if the attribute was set, false if not */ static int graphics_set_attr_do(struct graphics *gra, struct attr *attr) { switch (attr->type) { case attr_gamma: gra->gamma=attr->u.num; break; case attr_brightness: gra->brightness=attr->u.num; break; case attr_contrast: gra->contrast=attr->u.num; break; case attr_font_size: gra->font_size=attr->u.num; return 1; default: return 0; } gra->colormgmt=(gra->gamma != 65536 || gra->brightness != 0 || gra->contrast != 65536); graphics_gc_init(gra); return 1; } /** * @brief Sets an attribute of the graphics instance * * This method first tries to set one of the private attributes implemented by the current graphics * plugin. If this fails, it tries to set one of the generic attributes. * * If the graphics plugin does not supply a {@code set_attr} method, this method currently does nothing * and returns true, even if the attribute is a generic one. * * @param gra The graphics instance * @param attr The attribute to set * * @return True if the attribute was successfully set, false otherwise. */ int graphics_set_attr(struct graphics *gra, struct attr *attr) { int ret=1; /* FIXME if gra->meth doesn't have a setter, we don't even try the generic attrs - is that what we want? */ dbg(lvl_debug,"enter\n"); if (gra->meth.set_attr) ret=gra->meth.set_attr(gra->priv, attr); if (!ret) ret=graphics_set_attr_do(gra, attr); return ret != 0; } void graphics_set_rect(struct graphics *gra, struct point_rect *pr) { gra->r=*pr; } /** * Creates a new graphics object * attr type required * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct graphics * graphics_new(struct attr *parent, struct attr **attrs) { struct graphics *this_; struct attr *type_attr, cbl_attr; struct graphics_priv * (*graphicstype_new)(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl); if (! (type_attr=attr_search(attrs, NULL, attr_type))) { dbg(lvl_error,"Graphics plugin type is not set.\n"); return NULL; } graphicstype_new=plugin_get_graphics_type(type_attr->u.str); if (! graphicstype_new) { dbg(lvl_error,"Failed to load graphics plugin %s.\n", type_attr->u.str); return NULL; } this_=g_new0(struct graphics, 1); this_->attrs=attr_list_dup(attrs); this_->cbl=callback_list_new(); cbl_attr.type=attr_callback_list; cbl_attr.u.callback_list=this_->cbl; this_->attrs=attr_generic_add_attr(this_->attrs, &cbl_attr); this_->priv=(*graphicstype_new)(parent->u.navit, &this_->meth, this_->attrs, this_->cbl); this_->brightness=0; this_->contrast=65536; this_->gamma=65536; this_->font_size=20; this_->image_cache_hash = g_hash_table_new_full(g_str_hash, g_str_equal,g_free,g_free); while (*attrs) { graphics_set_attr_do(this_,*attrs); attrs++; } return this_; } /** * @brief Gets an attribute of the graphics instance * * This function searches the attribute list of the graphics object for an attribute of a given type and * stores it in the attr parameter. *

* Searching for attr_any or attr_any_xml is supported. *

* An iterator can be specified to get multiple attributes of the same type: * The first call will return the first match from attr; each subsequent call * with the same iterator will return the next match. If no more matching * attributes are found in either of them, false is returned. *

* Note that currently this will only return the generic attributes which can be set with * {@link graphics_set_attr_do(struct graphics *, struct attr *)}. Attributes implemented by a graphics * plugin cannot be retrieved with this method. * * @param this The graphics instance * @param type The attribute type to search for * @param attr Points to a {@code struct attr} which will receive the attribute * @param iter An iterator. This parameter may be NULL. * * @return True if a matching attribute was found, false if not. * * @author Martin Schaller (04/2008) */ int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } /** * @brief Create a new graphics overlay. * An overlay is a graphics object that is independent of the main graphics object. When * drawing everything to a window, the overlay will be shown on top of the main graphics * object. Navit uses overlays for OSD elements and for the vehicle on the map. * This allows updating OSD elements and the vehicle without redrawing the map. * * @param parent parent graphics context (should be the main graphics context as returned by * graphics_new) * @param p drawing position for the overlay * @param w width of overlay * @param h height of overlay * @param wraparound use wraparound (0/1). If set, position, width and height "wrap around": * negative position coordinates wrap around the window, negative width/height specify * difference to window width/height. * @returns new overlay * @author Martin Schaller (04/2008) */ struct graphics * graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int wraparound) { struct graphics *this_; struct point_rect pr; if (!parent->meth.overlay_new) return NULL; this_=g_new0(struct graphics, 1); this_->priv=parent->meth.overlay_new(parent->priv, &this_->meth, p, w, h, wraparound); this_->image_cache_hash = parent->image_cache_hash; this_->parent = parent; pr.lu.x=0; pr.lu.y=0; pr.rl.x=w; pr.rl.y=h; this_->font_size=20; graphics_set_rect(this_, &pr); if (!this_->priv) { g_free(this_); this_=NULL; } return this_; } /** * @brief Alters the size, position and wraparound for an overlay * * @param this_ The overlay's graphics struct * @param p The new position of the overlay * @param w The new width of the overlay * @param h The new height of the overlay * @param wraparound The new wraparound of the overlay */ void graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, int wraparound) { if (! this_->meth.overlay_resize) { return; } this_->meth.overlay_resize(this_->priv, p, w, h, wraparound); } static void graphics_gc_init(struct graphics *this_) { struct color background={ COLOR_BACKGROUND_ }; struct color black={ COLOR_BLACK_ }; struct color white={ COLOR_WHITE_ }; if (!this_->gc[0] || !this_->gc[1] || !this_->gc[2]) return; graphics_gc_set_background(this_->gc[0], &background ); graphics_gc_set_foreground(this_->gc[0], &background ); graphics_gc_set_background(this_->gc[1], &black ); graphics_gc_set_foreground(this_->gc[1], &white ); graphics_gc_set_background(this_->gc[2], &white ); graphics_gc_set_foreground(this_->gc[2], &black ); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_init(struct graphics *this_) { if (this_->gc[0]) return; this_->gc[0]=graphics_gc_new(this_); this_->gc[1]=graphics_gc_new(this_); this_->gc[2]=graphics_gc_new(this_); graphics_gc_init(this_); graphics_background_gc(this_, this_->gc[0]); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void * graphics_get_data(struct graphics *this_, const char *type) { return (this_->meth.get_data(this_->priv, type)); } void graphics_add_callback(struct graphics *this_, struct callback *cb) { callback_list_add(this_->cbl, cb); } void graphics_remove_callback(struct graphics *this_, struct callback *cb) { callback_list_remove(this_->cbl, cb); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_font * graphics_font_new(struct graphics *gra, int size, int flags) { struct graphics_font *this_; this_=g_new0(struct graphics_font,1); this_->priv=gra->meth.font_new(gra->priv, &this_->meth, gra->default_font, size, flags); return this_; } struct graphics_font * graphics_named_font_new(struct graphics *gra, char *font, int size, int flags) { struct graphics_font *this_; this_=g_new0(struct graphics_font,1); this_->priv=gra->meth.font_new(gra->priv, &this_->meth, font, size, flags); return this_; } void graphics_font_destroy(struct graphics_font *gra_font) { if(!gra_font) return; gra_font->meth.font_destroy(gra_font->priv); g_free(gra_font); } /** * Destroy graphics * Called when navit exits * @param gra The graphics instance * @returns nothing * @author David Tegze (02/2011) */ void graphics_free(struct graphics *gra) { if (!gra) return; /* If it's not an overlay, free the image cache. */ if(!gra->parent) { struct graphics_image *img; GList *ll, *l; /* We can't specify context (pointer to struct graphics) for g_hash_table_new to have it passed to free function so we have to free img->priv manually, the rest would be freed by g_hash_table_destroy. GHashTableIter isn't used because it broke n800 build at r5107. */ for(ll=l=g_hash_to_list(gra->image_cache_hash);l;l=g_list_next(l)) { img=l->data; if (img && gra->meth.image_free) gra->meth.image_free(gra->priv, img->priv); } g_list_free(ll); g_hash_table_destroy(gra->image_cache_hash); } attr_list_free(gra->attrs); graphics_gc_destroy(gra->gc[0]); graphics_gc_destroy(gra->gc[1]); graphics_gc_destroy(gra->gc[2]); g_free(gra->default_font); graphics_font_destroy_all(gra); g_free(gra->font); gra->meth.graphics_destroy(gra->priv); g_free(gra); } /** * Free all loaded fonts. * Used when switching layouts. * @param gra The graphics instance * @returns nothing * @author Sarah Nordstrom (05/2008) */ void graphics_font_destroy_all(struct graphics *gra) { int i; for(i = 0 ; i < gra->font_len; i++) { if(!gra->font[i]) continue; gra->font[i]->meth.font_destroy(gra->font[i]->priv); g_free(gra->font[i]); gra->font[i] = NULL; } } /** * Create a new graphics context. * @param gra associated graphics object for the new context * @returns new graphics context * @author Martin Schaller (04/2008) */ struct graphics_gc * graphics_gc_new(struct graphics *gra) { struct graphics_gc *this_; this_=g_new0(struct graphics_gc,1); this_->priv=gra->meth.gc_new(gra->priv, &this_->meth); this_->gra=gra; return this_; } /** * Destroy a graphics context, freeing associated resources. * @param gc context to destroy * @author Martin Schaller (04/2008) */ void graphics_gc_destroy(struct graphics_gc *gc) { if (!gc) return; gc->meth.gc_destroy(gc->priv); g_free(gc); } static void graphics_convert_color(struct graphics *gra, struct color *in, struct color *out) { *out=*in; if (gra->brightness) { out->r+=gra->brightness; out->g+=gra->brightness; out->b+=gra->brightness; } if (gra->contrast != 65536) { out->r=out->r*gra->contrast/65536; out->g=out->g*gra->contrast/65536; out->b=out->b*gra->contrast/65536; } if (out->r < 0) out->r=0; if (out->r > 65535) out->r=65535; if (out->g < 0) out->g=0; if (out->g > 65535) out->g=65535; if (out->b < 0) out->b=0; if (out->b > 65535) out->b=65535; if (gra->gamma != 65536) { out->r=pow(out->r/65535.0,gra->gamma/65536.0)*65535.0; out->g=pow(out->g/65535.0,gra->gamma/65536.0)*65535.0; out->b=pow(out->b/65535.0,gra->gamma/65536.0)*65535.0; } } /** * Set foreground color. * @param gc graphics context to set color for * @param c color to set * @author Martin Schaller (04/2008) */ void graphics_gc_set_foreground(struct graphics_gc *gc, struct color *c) { struct color cn; if (gc->gra->colormgmt) { graphics_convert_color(gc->gra, c, &cn); c=&cn; } gc->meth.gc_set_foreground(gc->priv, c); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_background(struct graphics_gc *gc, struct color *c) { struct color cn; if (gc->gra->colormgmt) { graphics_convert_color(gc->gra, c, &cn); c=&cn; } gc->meth.gc_set_background(gc->priv, c); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_linewidth(struct graphics_gc *gc, int width) { gc->meth.gc_set_linewidth(gc->priv, width); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n) { if (gc->meth.gc_set_dashes) gc->meth.gc_set_dashes(gc->priv, width, offset, dash_list, n); } /** * Create a new image from file path scaled to w and h pixels * @param gra the graphics instance * @param path path of the image to load * @param w width to rescale to * @param h height to rescale to * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_image * graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h) { return graphics_image_new_scaled_rotated(gra, path, w, h, 0); } static void image_new_helper(struct graphics *gra, struct graphics_image *this_, char *path, char *name, int width, int height, int rotate, int zip) { int i=0; int stdsizes[]={8,12,16,22,24,32,36,48,64,72,96,128,192,256}; const int numstdsizes=sizeof(stdsizes)/sizeof(int); int sz; int mode=1; int bmstd=0; sz=width>0?width:height; while (mode<=8) { char *new_name=NULL; int n; switch (mode) { case 1: /* The best variant both for cpu usage and quality would be prescaled png of a needed size */ mode++; if (width != -1 && height != -1) { new_name=g_strdup_printf("%s_%d_%d.png", name, width, height); } break; case 2: mode++; /* Try to load image by the exact name given by user. For example, if she wants to scale some prescaled png variant to a new size given as function params, or have default png image to be displayed unscaled. */ new_name=g_strdup(path); break; case 3: mode++; /* Next, try uncompressed and compressed svgs as they should give best quality but rendering might take more cpu resources when the image is displayed for the first time */ new_name=g_strdup_printf("%s.svg", name); break; case 4: mode++; new_name=g_strdup_printf("%s.svgz", name); break; case 5: mode++; i=0; /* If we have no size specifiers, try the default png now */ if(sz<=0) { new_name=g_strdup_printf("%s.png", name); break; } /* Find best matching size from standard row */ for(bmstd=0;bmstdsz) break; i=1; /* Fall through */ case 6: /* Select best matching image from standard row */ if(sz>0) { /* If size were specified, start with bmstd and then try standard sizes in row * bmstd, bmstd+1, bmstd+2, .. numstdsizes-1, bmstd-1, bmstd-2, .., 0 */ n=bmstd+i; if((bmstd+i)>=numstdsizes) n=numstdsizes-i-1; if(++i==numstdsizes) mode++; } else { /* If no size were specified, start with the smallest standard size and then try following ones */ n=i++; if(i==numstdsizes) mode+=2; } if(n<0||n>=numstdsizes) break; new_name=g_strdup_printf("%s_%d_%d.png", name, stdsizes[n],stdsizes[n]); break; case 7: /* Scaling the default prescaled png of unknown size to the needed size will give random quality loss */ mode++; new_name=g_strdup_printf("%s.png", name); break; case 8: /* xpm format is used as a last resort, because its not widely supported and we are moving to svg and png formats */ mode++; new_name=g_strdup_printf("%s.xpm", name); break; } if (! new_name) continue; this_->width=width; this_->height=height; dbg(lvl_debug,"Trying to load image '%s' for '%s' at %dx%d\n", new_name, path, width, height); if (zip) { unsigned char *start; int len; if (file_get_contents(new_name, &start, &len)) { struct graphics_image_buffer buffer={"buffer:",graphics_image_type_unknown}; buffer.start=start; buffer.len=len; this_->priv=gra->meth.image_new(gra->priv, &this_->meth, (char *)&buffer, &this_->width, &this_->height, &this_->hot, rotate); g_free(start); } } else { if (strcmp(new_name,"buffer:")) this_->priv=gra->meth.image_new(gra->priv, &this_->meth, new_name, &this_->width, &this_->height, &this_->hot, rotate); } if (this_->priv) { dbg(lvl_info,"Using image '%s' for '%s' at %dx%d\n", new_name, path, width, height); g_free(new_name); break; } g_free(new_name); } } /** * Create a new image from file path scaled to w and h pixels and possibly rotated * @param gra the graphics instance * @param path path of the image to load * @param w width to rescale to * @param h height to rescale to * @param rotate angle to rotate the image. Warning, graphics might only support 90 degree steps here * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate) { struct graphics_image *this_; char* hash_key = g_strdup_printf("%s*%d*%d*%d",path,w,h,rotate); struct file_wordexp *we; int i; char **paths; if ( g_hash_table_lookup_extended( gra->image_cache_hash, hash_key, NULL, (gpointer)&this_) ) { g_free(hash_key); dbg(lvl_debug,"Found cached image%sfor '%s'\n",this_?" ":" miss ",path); return this_; } this_=g_new0(struct graphics_image,1); this_->height=h; this_->width=w; we=file_wordexp_new(path); paths=file_wordexp_get_array(we); for(i=0;ipriv;i++) { char *ext; char *s, *name; char *pathi=paths[i]; int len=strlen(pathi); int i,k; int newwidth=-1, newheight=-1; ext=g_utf8_strrchr(pathi,-1,'.'); i=pathi-ext+len; /* Dont allow too long or too short file name extensions*/ if(ext && ((i>5) || (i<1))) ext=NULL; /* Search for _w_h name part, begin from char before extension if it exists */ if(ext) s=ext-1; else s=pathi+len; k=1; while(s>pathi && g_ascii_isdigit(*s)) { if(newheight<0) newheight=0; newheight+=(*s-'0')*k; k*=10; s--; } if(k>1 && s>pathi && *s=='_') { k=1; s--; while(s>pathi && g_ascii_isdigit(*s)) { if(newwidth<0) newwidth=0; newwidth+=(*s-'0')*k;; k*=10; s--; } } if(k==1 || s<=pathi || *s!='_') { newwidth=-1; newheight=-1; if(ext) s=ext; else s=pathi+len; } /* If exact h and w values were given as function parameters, they take precedence over values guessed from the image name */ if(w!=-1) newwidth=w; if(h!=-1) newheight=h; name=g_strndup(pathi,s-pathi); #if 0 if (!strstr(name,"test.zip")) #endif image_new_helper(gra, this_, pathi, name, newwidth, newheight, rotate, 0); if (!this_->priv && strstr(pathi, ".zip/")) image_new_helper(gra, this_, pathi, name, newwidth, newheight, rotate, 1); g_free(name); } file_wordexp_destroy(we); if (! this_->priv) { dbg(lvl_error,"No image for '%s'\n", path); g_free(this_); this_=NULL; } g_hash_table_insert(gra->image_cache_hash, hash_key, (gpointer)this_ ); return this_; } /** * Create a new image from file path * @param gra the graphics instance * @param path path of the image to load * @returns <> * @author Martin Schaller (04/2008) */ struct graphics_image * graphics_image_new(struct graphics *gra, char *path) { return graphics_image_new_scaled_rotated(gra, path, -1, -1, 0); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_image_free(struct graphics *gra, struct graphics_image *img) { /* Image is cached inside gra->image_cache_hash. So it would be freed only when graphics is destroyed => Do nothing here. */ } /** * @brief Start or finish a set of drawing operations. * * graphics_draw_mode(draw_mode_begin) must be invoked before performing any drawing * operations; this allows the graphics driver to perform any necessary setup. * graphics_draw_mode(draw_mode_end) must be invoked to finish a set of drawing operations; * this will typically clean up drawing resources and display the drawing result. * @param this_ graphics object that is being drawn to * @param mode specify beginning or end of drawing * @author Martin Schaller (04/2008) */ void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode) { this_->meth.draw_mode(this_->priv, mode); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count) { this_->meth.draw_lines(this_->priv, gc->priv, p, count); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r) { struct point *pnt=g_alloca(sizeof(struct point)*(r*4+64)); int i=0; if(this_->meth.draw_circle) this_->meth.draw_circle(this_->priv, gc->priv, p, r); else { draw_circle(p, r, 0, -1, 1026, pnt, &i, 1); pnt[i] = pnt[0]; i++; this_->meth.draw_lines(this_->priv, gc->priv, pnt, i); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h) { this_->meth.draw_rectangle(this_->priv, gc->priv, p, w, h); } void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill) { struct point *p=g_alloca(sizeof(struct point)*(r*4+32)); struct point pi0={plu->x+r,plu->y+r}; struct point pi1={plu->x+w-r,plu->y+r}; struct point pi2={plu->x+w-r,plu->y+h-r}; struct point pi3={plu->x+r,plu->y+h-r}; int i=0; draw_circle(&pi2, r*2, 0, -1, 258, p, &i, 1); draw_circle(&pi1, r*2, 0, 255, 258, p, &i, 1); draw_circle(&pi0, r*2, 0, 511, 258, p, &i, 1); draw_circle(&pi3, r*2, 0, 767, 258, p, &i, 1); p[i]=p[0]; i++; if (fill) this_->meth.draw_polygon(this_->priv, gc->priv, p, i); else this_->meth.draw_lines(this_->priv, gc->priv, p, i); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy) { this_->meth.draw_text(this_->priv, gc1->priv, gc2 ? gc2->priv : NULL, font->priv, text, p, dx, dy); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate) { this_->meth.get_text_bbox(this_->priv, font->priv, text, dx, dy, ret, estimate); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_overlay_disable(struct graphics *this_, int disable) { this_->disabled = disable; if (this_->meth.overlay_disable) this_->meth.overlay_disable(this_->priv, disable); } int graphics_is_disabled(struct graphics *this_) { return this_->disabled || (this_->parent && this_->parent->disabled); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img) { this_->meth.draw_image(this_->priv, gc->priv, p, img->priv); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## int graphics_draw_drag(struct graphics *this_, struct point *p) { if (!this_->meth.draw_drag) return 0; this_->meth.draw_drag(this_->priv, p); return 1; } void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc) { this_->meth.background_gc(this_->priv, gc ? gc->priv : NULL); } #include "attr.h" #include "popup.h" #include #if 0 //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void popup_view_html(struct popup_item *item, char *file) { char command[1024]; sprintf(command,"firefox %s", file); system(command); } struct transformatin *tg; enum projection pg; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void graphics_popup(struct display_list *list, struct popup_item **popup) { struct item *item; struct attr attr; struct map_rect *mr; struct coord c; struct popup_item *curr_item,*last=NULL; item=list->data; mr=map_rect_new(item->map, NULL, NULL, 0); printf("id hi=0x%x lo=0x%x\n", item->id_hi, item->id_lo); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if (item) { if (item_attr_get(item, attr_name, &attr)) { curr_item=popup_item_new_text(popup,attr.u.str,1); if (item_attr_get(item, attr_info_html, &attr)) { popup_item_new_func(&last,"HTML Info",1, popup_view_html, g_strdup(attr.u.str)); } if (item_attr_get(item, attr_price_html, &attr)) { popup_item_new_func(&last,"HTML Preis",2, popup_view_html, g_strdup(attr.u.str)); } curr_item->submenu=last; } } map_rect_destroy(mr); } #endif /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displayitem { struct displayitem *next; struct item item; char *label; int z_order; int count; struct coord c[0]; }; /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_free(struct displaylist *dl) { int i; for (i = 0 ; i < HASH_SIZE ; i++) { struct displayitem *di=dl->hash_entries[i].di; while (di) { struct displayitem *next=di->next; g_free(di); di=next; } dl->hash_entries[i].di=NULL; } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void display_add(struct hash_entry *entry, struct item *item, int count, struct coord *c, char **label, int label_count) { struct displayitem *di; int len,i; char *p; len=sizeof(*di)+count*sizeof(*c); if (label && label_count) { for (i = 0 ; i < label_count ; i++) { if (label[i]) len+=strlen(label[i])+1; else len++; } } p=g_malloc(len); di=(struct displayitem *)p; p+=sizeof(*di)+count*sizeof(*c); di->item=*item; di->z_order=0; if (label && label_count) { di->label=p; for (i = 0 ; i < label_count ; i++) { if (label[i]) { strcpy(p, label[i]); p+=strlen(label[i])+1; } else *p++='\0'; } } else di->label=NULL; di->count=count; memcpy(di->c, c, count*sizeof(*c)); di->next=entry->di; entry->di=di; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void label_line(struct graphics *gra, struct graphics_gc *fg, struct graphics_gc *bg, struct graphics_font *font, struct point *p, int count, char *label) { int i,x,y,tl,tlm,th,thm,tlsq,l; float lsq; double dx,dy; struct point p_t; struct point pb[5]; if (gra->meth.get_text_bbox) { gra->meth.get_text_bbox(gra->priv, font->priv, label, 0x10000, 0x0, pb, 1); tl=(pb[2].x-pb[0].x); th=(pb[0].y-pb[1].y); } else { tl=strlen(label)*4; th=8; } tlm=tl*32; thm=th*36; tlsq = tlm*tlm; for (i = 0 ; i < count-1 ; i++) { dx=p[i+1].x-p[i].x; dx*=32; dy=p[i+1].y-p[i].y; dy*=32; lsq = dx*dx+dy*dy; if (lsq > tlsq) { l=(int)sqrtf(lsq); x=p[i].x; y=p[i].y; if (dx < 0) { dx=-dx; dy=-dy; x=p[i+1].x; y=p[i+1].y; } x+=(l-tlm)*dx/l/64; y+=(l-tlm)*dy/l/64; x-=dy*thm/l/64; y+=dx*thm/l/64; p_t.x=x; p_t.y=y; #if 0 dbg(lvl_debug,"display_text: '%s', %d, %d, %d, %d %d\n", label, x, y, dx*0x10000/l, dy*0x10000/l, l); #endif if (x < gra->r.rl.x && x + tl > gra->r.lu.x && y + tl > gra->r.lu.y && y - tl < gra->r.rl.y) gra->meth.draw_text(gra->priv, fg->priv, bg?bg->priv:NULL, font->priv, label, &p_t, dx*0x10000/l, dy*0x10000/l); } } } static void display_draw_arrow(struct point *p, int dx, int dy, int l, struct graphics_gc *gc, struct graphics *gra) { struct point pnt[3]; pnt[0]=pnt[1]=pnt[2]=*p; pnt[0].x+=-dx*l/65536+dy*l/65536; pnt[0].y+=-dy*l/65536-dx*l/65536; pnt[2].x+=-dx*l/65536-dy*l/65536; pnt[2].y+=-dy*l/65536+dx*l/65536; gra->meth.draw_lines(gra->priv, gc->priv, pnt, 3); } static void display_draw_arrows(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int count) { int i,dx,dy,l; struct point p; for (i = 0 ; i < count-1 ; i++) { dx=pnt[i+1].x-pnt[i].x; dy=pnt[i+1].y-pnt[i].y; l=sqrt(dx*dx+dy*dy); if (l) { dx=dx*65536/l; dy=dy*65536/l; p=pnt[i]; p.x+=dx*15/65536; p.y+=dy*15/65536; display_draw_arrow(&p, dx, dy, 10, gc, gra); p=pnt[i+1]; p.x-=dx*15/65536; p.y-=dy*15/65536; display_draw_arrow(&p, dx, dy, 10, gc, gra); } } } static int intersection(struct point * a1, int adx, int ady, struct point * b1, int bdx, int bdy, struct point * res) { int n, a, b; dbg(lvl_debug,"%d,%d - %d,%d x %d,%d-%d,%d\n",a1->x,a1->y,a1->x+adx,a1->y+ady,b1->x,b1->y,b1->x+bdx,b1->y+bdy); n = bdy * adx - bdx * ady; a = bdx * (a1->y - b1->y) - bdy * (a1->x - b1->x); b = adx * (a1->y - b1->y) - ady * (a1->x - b1->x); dbg(lvl_debug,"a %d b %d n %d\n",a,b,n); if (n < 0) { n = -n; a = -a; b = -b; } #if 0 if (a < 0 || b < 0) return 0; if (a > n || b > n) return 0; #endif if (n == 0) return 0; res->x = a1->x + a * adx / n; res->y = a1->y + a * ady / n; dbg(lvl_debug,"%d,%d\n",res->x,res->y); return 1; } struct circle { short x,y,fowler; } circle64[]={ {0,128,0}, {13,127,13}, {25,126,25}, {37,122,38}, {49,118,53}, {60,113,67}, {71,106,85}, {81,99,104}, {91,91,128}, {99,81,152}, {106,71,171}, {113,60,189}, {118,49,203}, {122,37,218}, {126,25,231}, {127,13,243}, {128,0,256}, {127,-13,269}, {126,-25,281}, {122,-37,294}, {118,-49,309}, {113,-60,323}, {106,-71,341}, {99,-81,360}, {91,-91,384}, {81,-99,408}, {71,-106,427}, {60,-113,445}, {49,-118,459}, {37,-122,474}, {25,-126,487}, {13,-127,499}, {0,-128,512}, {-13,-127,525}, {-25,-126,537}, {-37,-122,550}, {-49,-118,565}, {-60,-113,579}, {-71,-106,597}, {-81,-99,616}, {-91,-91,640}, {-99,-81,664}, {-106,-71,683}, {-113,-60,701}, {-118,-49,715}, {-122,-37,730}, {-126,-25,743}, {-127,-13,755}, {-128,0,768}, {-127,13,781}, {-126,25,793}, {-122,37,806}, {-118,49,821}, {-113,60,835}, {-106,71,853}, {-99,81,872}, {-91,91,896}, {-81,99,920}, {-71,106,939}, {-60,113,957}, {-49,118,971}, {-37,122,986}, {-25,126,999}, {-13,127,1011}, }; static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir) { struct circle *c; #if 0 dbg(lvl_debug,"diameter=%d start=%d len=%d pos=%d dir=%d\n", diameter, start, len, *pos, dir); #endif int count=64; int end=start+len; int i,step; c=circle64; if (diameter > 128) step=1; else if (diameter > 64) step=2; else if (diameter > 24) step=4; else if (diameter > 8) step=8; else step=16; if (len > 0) { while (start < 0) { start+=1024; end+=1024; } while (end > 0) { i=0; while (i < count && c[i].fowler <= start) i+=step; while (i < count && c[i].fowler < end) { if (1< *pos || 0x+((c[i].x*diameter+128)>>8); res[*pos].y=pnt->y+((c[i].y*diameter+128)>>8); (*pos)+=dir; } i+=step; } end-=1024; start-=1024; } } else { while (start > 1024) { start-=1024; end-=1024; } while (end < 1024) { i=count-1; while (i >= 0 && c[i].fowler >= start) i-=step; while (i >= 0 && c[i].fowler > end) { if (1< *pos || 0x+((c[i].x*diameter+128)>>8); res[*pos].y=pnt->y+((c[i].y*diameter+128)>>8); (*pos)+=dir; } i-=step; } start+=1024; end+=1024; } } } static int fowler(int dy, int dx) { int adx, ady; /* Absolute Values of Dx and Dy */ int code; /* Angular Region Classification Code */ adx = (dx < 0) ? -dx : dx; /* Compute the absolute values. */ ady = (dy < 0) ? -dy : dy; code = (adx < ady) ? 1 : 0; if (dx < 0) code += 2; if (dy < 0) code += 4; switch (code) { case 0: return (dx == 0) ? 0 : 128*ady / adx; /* [ 0, 45] */ case 1: return (256 - (128*adx / ady)); /* ( 45, 90] */ case 3: return (256 + (128*adx / ady)); /* ( 90,135) */ case 2: return (512 - (128*ady / adx)); /* [135,180] */ case 6: return (512 + (128*ady / adx)); /* (180,225] */ case 7: return (768 - (128*adx / ady)); /* (225,270) */ case 5: return (768 + (128*adx / ady)); /* [270,315) */ case 4: return (1024 - (128*ady / adx));/* [315,360) */ } return 0; } static int int_sqrt(unsigned int n) { unsigned int h, p= 0, q= 1, r= n; /* avoid q rollover */ if(n >= (1<<(sizeof(n)*8-2))) { q = 1<<(sizeof(n)*8-2); } else { while ( q <= n ) { q <<= 2; } q >>= 2; } while ( q != 0 ) { h = p + q; p >>= 1; if ( r >= h ) { p += q; r -= h; } q >>= 2; } return p; } #if 0 static void debug_line(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int dx, int dy) { struct point p[2]; p[0]=p[1]=*pnt; p[1].x+=dx; p[1].y+=dy; gra->meth.draw_lines(gra->priv, gc->priv, p, 2); } static void debug_point(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int s) { struct point p[4]; p[0]=p[1]=p[2]=*pnt; p[0].x-=s; p[0].y+=s; p[1].x+=s; p[1].y+=s; p[2].y-=s; p[3]=p[0]; gra->meth.draw_lines(gra->priv, gc->priv, p, 4); } #endif struct draw_polyline_shape { int wi; int step; int fow; int dx,dy; int dxw,dyw; int l,lscale; }; struct draw_polyline_context { int prec; int ppos,npos; struct point *res; struct draw_polyline_shape shape; struct draw_polyline_shape prev_shape; }; static void draw_shape_update(struct draw_polyline_shape *shape) { shape->dxw = -(shape->dx * shape->wi * shape->lscale) / shape->l; shape->dyw = (shape->dy * shape->wi * shape->lscale) / shape->l; } static void draw_shape(struct draw_polyline_context *ctx, struct point *pnt, int wi) { int dxs,dys,lscales; int lscale=16; int l; struct draw_polyline_shape *shape=&ctx->shape; struct draw_polyline_shape *prev=&ctx->prev_shape; #if 0 dbg(lvl_debug,"enter %d,%d - %d,%d %d\n",pnt[0].x,pnt[0].y,pnt[1].x,pnt[1].y,wi); #endif *prev=*shape; if (prev->wi != wi && prev->l) { prev->wi=wi; draw_shape_update(prev); } shape->wi=wi; shape->dx = (pnt[1].x - pnt[0].x); shape->dy = (pnt[1].y - pnt[0].y); if (wi > 16) shape->step=4; else if (wi > 8) shape->step=8; else shape->step=16; #if 0 l = int_sqrt(dx * dx * lscale * lscale + dy * dy * lscale * lscale); #else dxs=shape->dx*shape->dx; dys=shape->dy*shape->dy; lscales=lscale*lscale; if (dxs + dys > lscales) l = int_sqrt(dxs+dys)*lscale; else l = int_sqrt((dxs+dys)*lscales); #endif shape->fow=fowler(-shape->dy, shape->dx); dbg(lvl_debug,"fow=%d\n",shape->fow); if (! l) l=1; if (wi*lscale > 10000) lscale=10000/wi; dbg_assert(wi*lscale <= 10000); shape->l=l; shape->lscale=lscale; shape->wi=wi; draw_shape_update(shape); } static void draw_point(struct draw_polyline_shape *shape, struct point *src, struct point *dst, int pos) { if (pos) { dst->x=(src->x*2-shape->dyw)/2; dst->y=(src->y*2-shape->dxw)/2; } else { dst->x=(src->x*2+shape->dyw)/2; dst->y=(src->y*2+shape->dxw)/2; } } static void draw_begin(struct draw_polyline_context *ctx, struct point *p) { struct draw_polyline_shape *shape=&ctx->shape; int i; for (i = 0 ; i <= 32 ; i+=shape->step) { ctx->res[ctx->ppos].x=(p->x*256+(shape->dyw*circle64[i].y)+(shape->dxw*circle64[i].x))/256; ctx->res[ctx->ppos].y=(p->y*256+(shape->dxw*circle64[i].y)-(shape->dyw*circle64[i].x))/256; ctx->ppos++; } } static int draw_middle(struct draw_polyline_context *ctx, struct point *p) { int delta=ctx->prev_shape.fow-ctx->shape.fow; if (delta > 512) delta-=1024; if (delta < -512) delta+=1024; if (delta < 16 && delta > -16) { draw_point(&ctx->shape, p, &ctx->res[ctx->npos--], 0); draw_point(&ctx->shape, p, &ctx->res[ctx->ppos++], 1); return 1; } dbg(lvl_debug,"delta %d\n",delta); if (delta > 0) { struct point pos,poso; draw_point(&ctx->shape, p, &pos, 1); draw_point(&ctx->prev_shape, p, &poso, 1); if (delta >= 256) return 0; if (intersection(&pos, ctx->shape.dx, ctx->shape.dy, &poso, ctx->prev_shape.dx, ctx->prev_shape.dy, &ctx->res[ctx->ppos])) { ctx->ppos++; draw_point(&ctx->prev_shape, p, &ctx->res[ctx->npos--], 0); draw_point(&ctx->shape, p, &ctx->res[ctx->npos--], 0); return 1; } } else { struct point neg,nego; draw_point(&ctx->shape, p, &neg, 0); draw_point(&ctx->prev_shape, p, &nego, 0); if (delta <= -256) return 0; if (intersection(&neg, ctx->shape.dx, ctx->shape.dy, &nego, ctx->prev_shape.dx, ctx->prev_shape.dy, &ctx->res[ctx->npos])) { ctx->npos--; draw_point(&ctx->prev_shape, p, &ctx->res[ctx->ppos++], 1); draw_point(&ctx->shape, p, &ctx->res[ctx->ppos++], 1); return 1; } } return 0; } static void draw_end(struct draw_polyline_context *ctx, struct point *p) { int i; struct draw_polyline_shape *shape=&ctx->prev_shape; for (i = 0 ; i <= 32 ; i+=shape->step) { ctx->res[ctx->npos].x=(p->x*256+(shape->dyw*circle64[i].y)-(shape->dxw*circle64[i].x))/256; ctx->res[ctx->npos].y=(p->y*256+(shape->dxw*circle64[i].y)+(shape->dyw*circle64[i].x))/256; ctx->npos--; } } static void draw_init_ctx(struct draw_polyline_context *ctx, int maxpoints) { ctx->prec=1; ctx->ppos=maxpoints/2; ctx->npos=maxpoints/2-1; } static void graphics_draw_polyline_as_polygon(struct graphics_priv *gra_priv, struct graphics_gc_priv *gc_priv, struct point *pnt, int count, int *width, void (*draw)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count)) { int maxpoints=200; struct draw_polyline_context ctx; int i=0; int max_circle_points=20; if (count < 2) return; #if 0 dbg(lvl_debug,"count=%d\n",count); for (i = 0 ; i < count ; i++) dbg(lvl_debug,"%d,%d width %d\n",pnt[i].x,pnt[i].y,width[i]); #endif ctx.shape.l=0; ctx.res=g_alloca(sizeof(struct point)*maxpoints); i=0; draw_init_ctx(&ctx, maxpoints); draw_shape(&ctx, pnt, *width++); draw_begin(&ctx,&pnt[0]); for (i = 1 ; i < count -1 ; i++) { draw_shape(&ctx, pnt+i, *width++); if (ctx.npos < max_circle_points || ctx.ppos >= maxpoints-max_circle_points || !draw_middle(&ctx,&pnt[i])) { draw_end(&ctx,&pnt[i]); ctx.res[ctx.npos]=ctx.res[ctx.ppos-1]; draw(gra_priv, gc_priv, ctx.res+ctx.npos, ctx.ppos-ctx.npos); draw_init_ctx(&ctx, maxpoints); draw_begin(&ctx,&pnt[i]); } } draw_shape(&ctx, &pnt[count-2], *width++); ctx.prev_shape=ctx.shape; draw_end(&ctx,&pnt[count-1]); ctx.res[ctx.npos]=ctx.res[ctx.ppos-1]; draw(gra_priv, gc_priv, ctx.res+ctx.npos, ctx.ppos-ctx.npos); } struct wpoint { int x,y,w; }; enum relative_pos { INSIDE = 0, LEFT_OF = 1, RIGHT_OF = 2, ABOVE = 4, BELOW = 8 }; static int relative_pos(struct wpoint *p, struct point_rect *r) { int relative_pos=INSIDE; if (p->x < r->lu.x) relative_pos=LEFT_OF; else if (p->x > r->rl.x) relative_pos=RIGHT_OF; if (p->y < r->lu.y) relative_pos |=ABOVE; else if (p->y > r->rl.y) relative_pos |=BELOW; return relative_pos; } static void clip_line_endoint_to_rect_edge(struct wpoint *p, int rel_pos, int dx, int dy, int dw, struct point_rect *clip_rect) { // We must cast to float to avoid integer // overflow (i.e. undefined behaviour) at high // zoom levels. if (rel_pos & LEFT_OF) { p->y+=(((float)clip_rect->lu.x)-p->x)*dy/dx; p->w+=(((float)clip_rect->lu.x)-p->x)*dw/dx; p->x=clip_rect->lu.x; } else if (rel_pos & RIGHT_OF) { p->y+=(((float)clip_rect->rl.x)-p->x)*dy/dx; p->w+=(((float)clip_rect->rl.x)-p->x)*dw/dx; p->x=clip_rect->rl.x; } else if (rel_pos & ABOVE) { p->x+=(((float)clip_rect->lu.y)-p->y)*dx/dy; p->w+=(((float)clip_rect->lu.y)-p->y)*dw/dy; p->y=clip_rect->lu.y; } else if (rel_pos & BELOW) { p->x+=(((float)clip_rect->rl.y)-p->y)*dx/dy; p->w+=(((float)clip_rect->rl.y)-p->y)*dw/dy; p->y=clip_rect->rl.y; } } enum clip_result { CLIPRES_INVISIBLE = 0, CLIPRES_VISIBLE = 1, CLIPRES_START_CLIPPED = 2, CLIPRES_END_CLIPPED = 4, }; static int clip_line(struct wpoint *p1, struct wpoint *p2, struct point_rect *clip_rect) { int rel_pos1,rel_pos2; int ret = CLIPRES_VISIBLE; int dx,dy,dw; rel_pos1=relative_pos(p1, clip_rect); if (rel_pos1!=INSIDE) ret |= CLIPRES_START_CLIPPED; rel_pos2=relative_pos(p2, clip_rect); if (rel_pos2!=INSIDE) ret |= CLIPRES_END_CLIPPED; dx=p2->x-p1->x; dy=p2->y-p1->y; dw=p2->w-p1->w; while ((rel_pos1!=INSIDE) || (rel_pos2!=INSIDE)) { if (rel_pos1 & rel_pos2) return CLIPRES_INVISIBLE; clip_line_endoint_to_rect_edge(p1, rel_pos1, dx, dy, dw, clip_rect); rel_pos1=relative_pos(p1, clip_rect); if (rel_pos1 & rel_pos2) return CLIPRES_INVISIBLE; clip_line_endoint_to_rect_edge(p2, rel_pos2, dx, dy, dw, clip_rect); rel_pos2=relative_pos(p2, clip_rect); } return ret; } static void graphics_draw_polyline_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pa, int count, int *width, int poly) { struct point *points_to_draw=g_alloca(sizeof(struct point)*(count+1)); int *w=g_alloca(sizeof(int)*(count+1)); struct wpoint segment_start,segment_end; int i,points_to_draw_cnt=0; int clip_result; int r_width, r_height; struct point_rect r=gra->r; r_width=r.rl.x-r.lu.x; r_height=r.rl.y-r.lu.y; // Expand clipping rect by 1/3 so wide, slanted lines do not // partially end before screen border. // Ideally we would expand by the line width here, but in 3D // mode the width is variable and needs clipping itself, so that // would get complicated. Anyway, 1/3 of screen size should be // enough... r.lu.x-=r_width/3; r.lu.y-=r_height/3; r.rl.x+=r_width/3; r.rl.y+=r_height/3; // Iterate over line segments, push them into points_to_draw // until we reach a completely invisible segment... for (i = 0 ; i < count ; i++) { if (i) { segment_start.x=pa[i-1].x; segment_start.y=pa[i-1].y; segment_start.w=width[(i-1)]; segment_end.x=pa[i].x; segment_end.y=pa[i].y; segment_end.w=width[i]; dbg(lvl_debug, "Segment: [%d, %d] - [%d, %d]...\n", segment_start.x, segment_start.y, segment_end.x, segment_end.y); clip_result=clip_line(&segment_start, &segment_end, &r); if (clip_result != CLIPRES_INVISIBLE) { dbg(lvl_debug, "....clipped to [%d, %d] - [%d, %d]\n", segment_start.x, segment_start.y, segment_end.x, segment_end.y); if ((i == 1) || (clip_result & CLIPRES_START_CLIPPED)) { points_to_draw[points_to_draw_cnt].x=segment_start.x; points_to_draw[points_to_draw_cnt].y=segment_start.y; w[points_to_draw_cnt]=segment_start.w; points_to_draw_cnt++; } points_to_draw[points_to_draw_cnt].x=segment_end.x; points_to_draw[points_to_draw_cnt].y=segment_end.y; w[points_to_draw_cnt]=segment_end.w; points_to_draw_cnt++; } if ((i == count-1) || (clip_result & CLIPRES_END_CLIPPED)) { // ... then draw the resulting polyline if (points_to_draw_cnt > 1) { if (poly) { graphics_draw_polyline_as_polygon(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt, w, gra->meth.draw_polygon); #if 0 gra->meth.draw_lines(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt); #endif } else gra->meth.draw_lines(gra->priv, gc->priv, points_to_draw, points_to_draw_cnt); points_to_draw_cnt=0; } } } } } static int is_inside(struct point *p, struct point_rect *r, int edge) { switch(edge) { case 0: return p->x >= r->lu.x; case 1: return p->x <= r->rl.x; case 2: return p->y >= r->lu.y; case 3: return p->y <= r->rl.y; default: return 0; } } static void poly_intersection(struct point *p1, struct point *p2, struct point_rect *r, int edge, struct point *ret) { int dx=p2->x-p1->x; int dy=p2->y-p1->y; switch(edge) { case 0: ret->y=p1->y+((float)r->lu.x-p1->x)*dy/dx; ret->x=r->lu.x; break; case 1: ret->y=p1->y+((float)r->rl.x-p1->x)*dy/dx; ret->x=r->rl.x; break; case 2: ret->x=p1->x+((float)r->lu.y-p1->y)*dx/dy; ret->y=r->lu.y; break; case 3: ret->x=p1->x+((float)r->rl.y-p1->y)*dx/dy; ret->y=r->rl.y; break; } } static void graphics_draw_polygon_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pin, int count_in) { struct point_rect r=gra->r; struct point *pout,*p,*s,pi,*p1,*p2; int limit=10000; struct point *pa1=g_alloca(sizeof(struct point) * (count_in < limit ? count_in*8+1:0)); struct point *pa2=g_alloca(sizeof(struct point) * (count_in < limit ? count_in*8+1:0)); int count_out,edge=3; int i; #if 0 r.lu.x+=20; r.lu.y+=20; r.rl.x-=20; r.rl.y-=20; #endif if (count_in < limit) { p1=pa1; p2=pa2; } else { p1=g_new(struct point, count_in*8+1); p2=g_new(struct point, count_in*8+1); } pout=p1; for (edge = 0 ; edge < 4 ; edge++) { p=pin; s=pin+count_in-1; count_out=0; for (i = 0 ; i < count_in ; i++) { if (is_inside(p, &r, edge)) { if (! is_inside(s, &r, edge)) { poly_intersection(s,p,&r,edge,&pi); pout[count_out++]=pi; } pout[count_out++]=*p; } else { if (is_inside(s, &r, edge)) { poly_intersection(p,s,&r,edge,&pi); pout[count_out++]=pi; } } s=p; p++; } count_in=count_out; if (pin == p1) { pin=p2; pout=p1; } else { pin=p1; pout=p2; } } gra->meth.draw_polygon(gra->priv, gc->priv, pin, count_in); if (count_in >= limit) { g_free(p1); g_free(p2); } } static void display_context_free(struct display_context *dc) { if (dc->gc) graphics_gc_destroy(dc->gc); if (dc->gc_background) graphics_gc_destroy(dc->gc_background); if (dc->img) graphics_image_free(dc->gra, dc->img); dc->gc=NULL; dc->gc_background=NULL; dc->img=NULL; } static struct graphics_font * get_font(struct graphics *gra, int size) { if (size > 64) size=64; if (size >= gra->font_len) { gra->font=g_renew(struct graphics_font *, gra->font, size+1); while (gra->font_len <= size) gra->font[gra->font_len++]=NULL; } if (! gra->font[size]) gra->font[size]=graphics_font_new(gra, size*gra->font_size, 0); return gra->font[size]; } void graphics_draw_text_std(struct graphics *this_, int text_size, char *text, struct point *p) { struct graphics_font *font=get_font(this_, text_size); struct point bbox[4]; int i; graphics_get_text_bbox(this_, font, text, 0x10000, 0, bbox, 0); for (i = 0 ; i < 4 ; i++) { bbox[i].x+=p->x; bbox[i].y+=p->y; } graphics_draw_rectangle(this_, this_->gc[2], &bbox[1], bbox[2].x-bbox[0].x, bbox[0].y-bbox[1].y+5); graphics_draw_text(this_, this_->gc[1], this_->gc[2], font, text, p, 0x10000, 0); } char * graphics_icon_path(const char *icon) { static char *navit_sharedir; char *ret=NULL; struct file_wordexp *wordexp=NULL; dbg(lvl_debug,"enter %s\n",icon); if (strchr(icon, '$')) { wordexp=file_wordexp_new(icon); if (file_wordexp_get_count(wordexp)) icon=file_wordexp_get_array(wordexp)[0]; } if (strchr(icon,'/')) ret=g_strdup(icon); else { #ifdef HAVE_API_ANDROID // get resources for the correct screen density // // this part not needed, android unpacks only the correct version into res/drawable dir! // dbg(lvl_debug,"android icon_path %s\n",icon); // static char *android_density; // android_density = getenv("ANDROID_DENSITY"); // ret=g_strdup_printf("res/drawable-%s/%s",android_density ,icon); ret=g_strdup_printf("res/drawable/%s" ,icon); #else if (! navit_sharedir) navit_sharedir = getenv("NAVIT_SHAREDIR"); ret=g_strdup_printf("%s/xpm/%s", navit_sharedir, icon); #endif } if (wordexp) file_wordexp_destroy(wordexp); return ret; } static int limit_count(struct coord *c, int count) { int i; for (i = 1 ; i < count ; i++) { if (c[i].x == c[0].x && c[i].y == c[0].y) return i+1; } return count; } static void displayitem_draw(struct displayitem *di, void *dummy, struct display_context *dc) { int *width=g_alloca(sizeof(int)*dc->maxlen); struct point *pa=g_alloca(sizeof(struct point)*dc->maxlen); struct graphics *gra=dc->gra; struct graphics_gc *gc=dc->gc; struct element *e=dc->e; struct graphics_image *img=dc->img; struct point p; struct coord *c; char *path; while (di) { int i,count=di->count,mindist=dc->mindist; di->z_order=++(gra->current_z_order); if (! gc) { gc=graphics_gc_new(gra); graphics_gc_set_foreground(gc, &e->color); dc->gc=gc; } if (item_type_is_area(dc->type) && (dc->e->type == element_polyline || dc->e->type == element_text)) count=limit_count(di->c, count); if (dc->type == type_poly_water_tiled) mindist=0; c=di->c; #if 0 if (dc->e->type == element_polygon) { int max=1000; int offset=5600; c+=offset; count-=offset; if (count < 0) count=0; if (count > max) count=max; } #endif if (dc->e->type == element_polyline) count=transform(dc->trans, dc->pro, c, pa, count, mindist, e->u.polyline.width, width); else count=transform(dc->trans, dc->pro, c, pa, count, mindist, 0, NULL); switch (e->type) { case element_polygon: graphics_draw_polygon_clipped(gra, gc, pa, count); break; case element_polyline: { gc->meth.gc_set_linewidth(gc->priv, 1); if (e->u.polyline.width > 0 && e->u.polyline.dash_num > 0) graphics_gc_set_dashes(gc, e->u.polyline.width, e->u.polyline.offset, e->u.polyline.dash_table, e->u.polyline.dash_num); for (i = 0 ; i < count ; i++) { if (width[i] < 2) width[i]=2; } graphics_draw_polyline_clipped(gra, gc, pa, count, width, e->u.polyline.width > 1); } break; case element_circle: if (count) { if (e->u.circle.width > 1) gc->meth.gc_set_linewidth(gc->priv, e->u.polyline.width); graphics_draw_circle(gra, gc, pa, e->u.circle.radius); if (di->label && e->text_size) { struct graphics_font *font=get_font(gra, e->text_size); struct graphics_gc *gc_background=dc->gc_background; if (! gc_background && e->u.circle.background_color.a) { gc_background=graphics_gc_new(gra); graphics_gc_set_foreground(gc_background, &e->u.circle.background_color); dc->gc_background=gc_background; } p.x=pa[0].x+3; p.y=pa[0].y+10; if (font) gra->meth.draw_text(gra->priv, gc->priv, gc_background?gc_background->priv:NULL, font->priv, di->label, &p, 0x10000, 0); else dbg(lvl_error,"Failed to get font with size %d\n",e->text_size); } } break; case element_text: if (count && di->label) { struct graphics_font *font=get_font(gra, e->text_size); struct graphics_gc *gc_background=dc->gc_background; if (! gc_background && e->u.text.background_color.a) { gc_background=graphics_gc_new(gra); graphics_gc_set_foreground(gc_background, &e->u.text.background_color); dc->gc_background=gc_background; } if (font) label_line(gra, gc, gc_background, font, pa, count, di->label); else dbg(lvl_error,"Failed to get font with size %d\n",e->text_size); } break; case element_icon: if (count) { if (!img || item_is_custom_poi(di->item)) { if (item_is_custom_poi(di->item)) { char *icon; char *src; if (img) graphics_image_free(dc->gra, img); src=e->u.icon.src; if (!src || !src[0]) src="%s"; icon=g_strdup_printf(src,di->label+strlen(di->label)+1); path=graphics_icon_path(icon); g_free(icon); } else path=graphics_icon_path(e->u.icon.src); img=graphics_image_new_scaled_rotated(gra, path, e->u.icon.width, e->u.icon.height, e->u.icon.rotation); if (img) dc->img=img; else dbg(lvl_debug,"failed to load icon '%s'\n", path); g_free(path); } if (img) { if (e->u.icon.x != -1 || e->u.icon.y != -1) { p.x=pa[0].x - e->u.icon.x; p.y=pa[0].y - e->u.icon.y; } else { p.x=pa[0].x - img->hot.x; p.y=pa[0].y - img->hot.y; } gra->meth.draw_image(gra->priv, gra->gc[0]->priv, &p, img->priv); } } break; case element_image: dbg(lvl_debug,"image: '%s'\n", di->label); if (gra->meth.draw_image_warp) { img=graphics_image_new_scaled_rotated(gra, di->label, -1, -1, 0); if (img) gra->meth.draw_image_warp(gra->priv, gra->gc[0]->priv, pa, count, img->priv); } else dbg(lvl_error,"draw_image_warp not supported by graphics driver drawing '%s'\n", di->label); break; case element_arrows: display_draw_arrows(gra,gc,pa,count); break; default: dbg(lvl_error, "Unhandled element type %d\n", e->type); } di=di->next; } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_draw_elements(struct graphics *gra, struct displaylist *display_list, struct itemgra *itm) { struct element *e; GList *es,*types; struct display_context *dc=&display_list->dc; struct hash_entry *entry; es=itm->elements; while (es) { e=es->data; dc->e=e; types=itm->type; while (types) { dc->type=GPOINTER_TO_INT(types->data); entry=get_hash_entry(display_list, dc->type); if (entry && entry->di) { displayitem_draw(entry->di, NULL, dc); display_context_free(dc); } types=g_list_next(types); } es=g_list_next(es); } } void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t, char *label) { GList *es; struct display_context dc; int max_coord=32; char *buffer=g_alloca(sizeof(struct displayitem)+max_coord*sizeof(struct coord)); struct displayitem *di=(struct displayitem *)buffer; es=itm->elements; di->item.type=type_none; di->item.id_hi=0; di->item.id_lo=0; di->item.map=NULL; di->z_order=0; di->label=label; dc.gra=gra; dc.gc=NULL; dc.gc_background=NULL; dc.img=NULL; dc.pro=projection_screen; dc.mindist=0; dc.trans=t; dc.type=type_none; dc.maxlen=max_coord; while (es) { struct element *e=es->data; if (e->coord_count) { if (e->coord_count > max_coord) { dbg(lvl_error,"maximum number of coords reached: %d > %d\n",e->coord_count,max_coord); di->count=max_coord; } else di->count=e->coord_count; memcpy(di->c, e->coord, di->count*sizeof(struct coord)); } else { di->c[0].x=0; di->c[0].y=0; di->count=1; } dc.e=e; di->next=NULL; displayitem_draw(di, NULL, &dc); display_context_free(&dc); es=g_list_next(es); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_draw_layer(struct displaylist *display_list, struct graphics *gra, struct layer *lay, int order) { GList *itms; struct itemgra *itm; itms=lay->itemgras; while (itms) { itm=itms->data; if (order >= itm->order.min && order <= itm->order.max) xdisplay_draw_elements(gra, display_list, itm); itms=g_list_next(itms); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static void xdisplay_draw(struct displaylist *display_list, struct graphics *gra, struct layout *l, int order) { GList *lays; struct layer *lay; gra->current_z_order=0; lays=l->layers; while (lays) { lay=lays->data; if (lay->active) { if (lay->ref) lay=lay->ref; xdisplay_draw_layer(display_list, gra, lay, order); } lays=g_list_next(lays); } } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ extern void *route_selection; static void displaylist_update_layers(struct displaylist *displaylist, GList *layers, int order) { while (layers) { struct layer *layer=layers->data; GList *itemgras; if (layer->ref) layer=layer->ref; itemgras=layer->itemgras; while (itemgras) { struct itemgra *itemgra=itemgras->data; GList *types=itemgra->type; if (itemgra->order.min <= order && itemgra->order.max >= order) { while (types) { enum item_type type=(enum item_type) types->data; set_hash_entry(displaylist, type); types=g_list_next(types); } } itemgras=g_list_next(itemgras); } layers=g_list_next(layers); } } static void displaylist_update_hash(struct displaylist *displaylist) { displaylist->max_offset=0; clear_hash(displaylist); displaylist_update_layers(displaylist, displaylist->layout->layers, displaylist->order); dbg(lvl_debug,"max offset %d\n",displaylist->max_offset); } /** * @brief Returns selection structure based on displaylist transform, projection and order. * Use this function to get map selection if you are going to fetch complete item data from the map based on displayitem reference. * @param displaylist * @returns Pointer to selection structure */ struct map_selection *displaylist_get_selection(struct displaylist *displaylist) { return transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order); } /** * @brief Compare displayitems based on their zorder values. * Use with g_list_insert_sorted to sort less shaded items to be before more shaded ones in the result list. */ static int displaylist_cmp_zorder(const struct displayitem *a, const struct displayitem *b) { if(a->z_order>b->z_order) return -1; if(a->z_orderz_order) return 1; return 0; } /** * @brief Returns list of displayitems clicked at given coordinates. The deeper item is in current layout, the deeper it will be in the list. * @param displaylist * @param p clicked point * @param radius radius of clicked area * @returns GList of displayitems */ GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius) { GList *l=NULL; struct displayitem *di; struct displaylist_handle *dlh=graphics_displaylist_open(displaylist); while ((di=graphics_displaylist_next(dlh))) { if (di->z_order>0 && graphics_displayitem_within_dist(displaylist, di, p,radius)) l=g_list_insert_sorted(l,(gpointer) di, (GCompareFunc) displaylist_cmp_zorder); } graphics_displaylist_close(dlh); return l; } static void do_draw(struct displaylist *displaylist, int cancel, int flags) { struct item *item; int count,max=displaylist->dc.maxlen,workload=0; struct coord *ca=g_alloca(sizeof(struct coord)*max); struct attr attr,attr2; enum projection pro; if (displaylist->order != displaylist->order_hashed || displaylist->layout != displaylist->layout_hashed) { displaylist_update_hash(displaylist); displaylist->order_hashed=displaylist->order; displaylist->layout_hashed=displaylist->layout; } profile(0,NULL); pro=transform_get_projection(displaylist->dc.trans); while (!cancel) { if (!displaylist->msh) displaylist->msh=mapset_open(displaylist->ms); if (!displaylist->m) { displaylist->m=mapset_next(displaylist->msh, 1); if (!displaylist->m) { mapset_close(displaylist->msh); displaylist->msh=NULL; break; } displaylist->dc.pro=map_projection(displaylist->m); displaylist->conv=map_requires_conversion(displaylist->m); if (route_selection) displaylist->sel=route_selection; else displaylist->sel=displaylist_get_selection(displaylist); displaylist->mr=map_rect_new(displaylist->m, displaylist->sel); } if (displaylist->mr) { while ((item=map_rect_get_item(displaylist->mr))) { int label_count=0; char *labels[2]; struct hash_entry *entry; if (item == &busy_item) { if (displaylist->workload) return; else continue; } entry=get_hash_entry(displaylist, item->type); if (!entry) continue; count=item_coord_get_within_selection(item, ca, item->type < type_line ? 1: max, displaylist->sel); if (! count) continue; #if 0 dbg(lvl_debug,"%s 0x%x 0x%x\n",item_to_name(item->type), item->id_hi, item->id_lo); #endif if (displaylist->dc.pro != pro) transform_from_to_count(ca, displaylist->dc.pro, ca, pro, count); if (count == max) { dbg(lvl_error,"point count overflow %d for %s "ITEM_ID_FMT"\n", count,item_to_name(item->type),ITEM_ID_ARGS(*item)); displaylist->dc.maxlen=max*2; } if (item_is_custom_poi(*item)) { if (item_attr_get(item, attr_icon_src, &attr2)) labels[1]=map_convert_string(displaylist->m, attr2.u.str); else labels[1]=NULL; label_count=2; } else { labels[1]=NULL; label_count=0; } if (item_attr_get(item, attr_label, &attr)) { labels[0]=attr.u.str; if (!label_count) label_count=2; } else labels[0]=NULL; if (displaylist->conv && label_count) { labels[0]=map_convert_string(displaylist->m, labels[0]); display_add(entry, item, count, ca, labels, label_count); map_convert_free(labels[0]); } else display_add(entry, item, count, ca, labels, label_count); if (labels[1]) map_convert_free(labels[1]); workload++; if (workload == displaylist->workload) return; } map_rect_destroy(displaylist->mr); } if (!route_selection) map_selection_destroy(displaylist->sel); displaylist->mr=NULL; displaylist->sel=NULL; displaylist->m=NULL; } profile(1,"process_selection\n"); if (displaylist->idle_ev) event_remove_idle(displaylist->idle_ev); displaylist->idle_ev=NULL; callback_destroy(displaylist->idle_cb); displaylist->idle_cb=NULL; displaylist->busy=0; graphics_process_selection(displaylist->dc.gra, displaylist); profile(1,"draw\n"); if (! cancel) graphics_displaylist_draw(displaylist->dc.gra, displaylist, displaylist->dc.trans, displaylist->layout, flags); map_rect_destroy(displaylist->mr); if (!route_selection) map_selection_destroy(displaylist->sel); mapset_close(displaylist->msh); displaylist->mr=NULL; displaylist->sel=NULL; displaylist->m=NULL; displaylist->msh=NULL; profile(1,"callback\n"); callback_call_1(displaylist->cb, cancel); profile(0,"end\n"); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags) { int order=transform_get_order(trans); if(displaylist->dc.trans && displaylist->dc.trans!=trans) transform_destroy(displaylist->dc.trans); if(displaylist->dc.trans!=trans) displaylist->dc.trans=transform_dup(trans); displaylist->dc.gra=gra; displaylist->dc.mindist=flags&512?15:2; // FIXME find a better place to set the background color if (l) { graphics_gc_set_background(gra->gc[0], &l->color); graphics_gc_set_foreground(gra->gc[0], &l->color); g_free(gra->default_font); gra->default_font = g_strdup(l->font); } graphics_background_gc(gra, gra->gc[0]); if (flags & 1) callback_list_call_attr_0(gra->cbl, attr_predraw); gra->meth.draw_mode(gra->priv, draw_mode_begin); if (!(flags & 2)) gra->meth.draw_rectangle(gra->priv, gra->gc[0]->priv, &gra->r.lu, gra->r.rl.x-gra->r.lu.x, gra->r.rl.y-gra->r.lu.y); if (l) { order+=l->order_delta; xdisplay_draw(displaylist, gra, l, order>0?order:0); } if (flags & 1) callback_list_call_attr_0(gra->cbl, attr_postdraw); if (!(flags & 4)) gra->meth.draw_mode(gra->priv, draw_mode_end); } static void graphics_load_mapset(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags) { int order=transform_get_order(trans); dbg(lvl_debug,"enter"); if (displaylist->busy) { if (async == 1) return; do_draw(displaylist, 1, flags); } xdisplay_free(displaylist); dbg(lvl_debug,"order=%d\n", order); displaylist->dc.gra=gra; displaylist->ms=mapset; if(displaylist->dc.trans && displaylist->dc.trans!=trans) transform_destroy(displaylist->dc.trans); if(displaylist->dc.trans!=trans) displaylist->dc.trans=transform_dup(trans); displaylist->workload=async ? 100 : 0; displaylist->cb=cb; displaylist->seq++; if (l) order+=l->order_delta; displaylist->order=order>0?order:0; displaylist->busy=1; displaylist->layout=l; if (async) { if (! displaylist->idle_cb) displaylist->idle_cb=callback_new_3(callback_cast(do_draw), displaylist, 0, flags); displaylist->idle_ev=event_add_idle(50, displaylist->idle_cb); } else do_draw(displaylist, 0, flags); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags) { graphics_load_mapset(gra, displaylist, mapset, trans, l, async, cb, flags); } int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist) { if (!displaylist->busy) return 0; do_draw(displaylist, 1, 0); return 1; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displaylist_handle { struct displaylist *dl; struct displayitem *di; int hashidx; }; /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displaylist_handle * graphics_displaylist_open(struct displaylist *displaylist) { struct displaylist_handle *ret; ret=g_new0(struct displaylist_handle, 1); ret->dl=displaylist; return ret; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displayitem * graphics_displaylist_next(struct displaylist_handle *dlh) { struct displayitem *ret; if (!dlh) return NULL; for (;;) { if (dlh->di) { ret=dlh->di; dlh->di=ret->next; break; } if (dlh->hashidx == HASH_SIZE) { ret=NULL; break; } if (dlh->dl->hash_entries[dlh->hashidx].type) dlh->di=dlh->dl->hash_entries[dlh->hashidx].di; dlh->hashidx++; } return ret; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ void graphics_displaylist_close(struct displaylist_handle *dlh) { g_free(dlh); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ struct displaylist * graphics_displaylist_new(void) { struct displaylist *ret=g_new0(struct displaylist, 1); ret->dc.maxlen=16384; return ret; } void graphics_displaylist_destroy(struct displaylist *displaylist) { if(displaylist->dc.trans) transform_destroy(displaylist->dc.trans); g_free(displaylist); } /** * Get the map item which given displayitem is based on. * NOTE: returned structure doesn't contain any attributes or coordinates. type, map, idhi and idlow seem to be the only useable members. * @param di pointer to displayitem structure * @returns Pointer to struct item * @author Martin Schaller (04/2008) */ struct item * graphics_displayitem_get_item(struct displayitem *di) { return &di->item; } /** * Get the number of this item as it was last displayed on the screen, dependent of current layout. Items with lower numbers * are shaded by items with higher ones when they overlap. Zero means item was not displayed at all. If the item is displayed twice, its topmost * occurence is used. * @param di pointer to displayitem structure * @returns z-order of current item. */ int graphics_displayitem_get_z_order(struct displayitem *di) { return di->z_order; } int graphics_displayitem_get_coord_count(struct displayitem *di) { return di->count; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ char * graphics_displayitem_get_label(struct displayitem *di) { return di->label; } int graphics_displayitem_get_displayed(struct displayitem *di) { return 1; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_point(struct point *p0, struct point *p1, int dist) { if (p0->x == 32767 || p0->y == 32767 || p1->x == 32767 || p1->y == 32767) return 0; if (p0->x == -32768 || p0->y == -32768 || p1->x == -32768 || p1->y == -32768) return 0; if ((p0->x-p1->x)*(p0->x-p1->x) + (p0->y-p1->y)*(p0->y-p1->y) <= dist*dist) { return 1; } return 0; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_line(struct point *p, struct point *line_p0, struct point *line_p1, int dist) { int vx,vy,wx,wy; int c1,c2; struct point line_p; if (line_p0->x < line_p1->x) { if (p->x < line_p0->x - dist) return 0; if (p->x > line_p1->x + dist) return 0; } else { if (p->x < line_p1->x - dist) return 0; if (p->x > line_p0->x + dist) return 0; } if (line_p0->y < line_p1->y) { if (p->y < line_p0->y - dist) return 0; if (p->y > line_p1->y + dist) return 0; } else { if (p->y < line_p1->y - dist) return 0; if (p->y > line_p0->y + dist) return 0; } vx=line_p1->x-line_p0->x; vy=line_p1->y-line_p0->y; wx=p->x-line_p0->x; wy=p->y-line_p0->y; c1=vx*wx+vy*wy; if ( c1 <= 0 ) return within_dist_point(p, line_p0, dist); c2=vx*vx+vy*vy; if ( c2 <= c1 ) return within_dist_point(p, line_p1, dist); line_p.x=line_p0->x+vx*c1/c2; line_p.y=line_p0->y+vy*c1/c2; return within_dist_point(p, &line_p, dist); } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_polyline(struct point *p, struct point *line_pnt, int count, int dist, int close) { int i; for (i = 0 ; i < count-1 ; i++) { if (within_dist_line(p,line_pnt+i,line_pnt+i+1,dist)) { return 1; } } if (close) return (within_dist_line(p,line_pnt,line_pnt+count-1,dist)); return 0; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ static int within_dist_polygon(struct point *p, struct point *poly_pnt, int count, int dist) { int i, j, c = 0; for (i = 0, j = count-1; i < count; j = i++) { if ((((poly_pnt[i].y <= p->y) && ( p->y < poly_pnt[j].y )) || ((poly_pnt[j].y <= p->y) && ( p->y < poly_pnt[i].y))) && (p->x < (poly_pnt[j].x - poly_pnt[i].x) * (p->y - poly_pnt[i].y) / (poly_pnt[j].y - poly_pnt[i].y) + poly_pnt[i].x)) c = !c; } if (! c) return within_dist_polyline(p, poly_pnt, count, dist, 1); return c; } /** * FIXME * @param <> * @returns <> * @author Martin Schaller (04/2008) */ int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist) { struct point *pa=g_alloca(sizeof(struct point)*displaylist->dc.maxlen); int count; count=transform(displaylist->dc.trans, displaylist->dc.pro, di->c, pa, di->count, 0, 0, NULL); if (di->item.type < type_line) { return within_dist_point(p, &pa[0], dist); } if (di->item.type < type_area) { return within_dist_polyline(p, pa, count, dist, 0); } return within_dist_polygon(p, pa, count, dist); } static void graphics_process_selection_item(struct displaylist *dl, struct item *item) { #if 0 /* FIXME */ struct displayitem di,*di_res; GHashTable *h; int count,max=dl->dc.maxlen; struct coord ca[max]; struct attr attr; struct map_rect *mr; di.item=*item; di.label=NULL; di.count=0; h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); if (h) { di_res=g_hash_table_lookup(h, &di); if (di_res) { di.item.type=(enum item_type)item->priv_data; display_add(dl, &di.item, di_res->count, di_res->c, NULL, 0); return; } } mr=map_rect_new(item->map, NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); count=item_coord_get(item, ca, item->type < type_line ? 1: max); if (!item_attr_get(item, attr_label, &attr)) attr.u.str=NULL; if (dl->conv && attr.u.str && attr.u.str[0]) { char *str=map_convert_string(item->map, attr.u.str); display_add(dl, item, count, ca, &str, 1); map_convert_free(str); } else display_add(dl, item, count, ca, &attr.u.str, 1); map_rect_destroy(mr); #endif } void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl) { struct item *item_dup=g_new(struct item, 1); *item_dup=*item; item_dup->priv_data=(void *)type; gra->selection=g_list_append(gra->selection, item_dup); if (dl) graphics_process_selection_item(dl, item_dup); } void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl) { GList *curr; int found; for (;;) { curr=gra->selection; found=0; while (curr) { struct item *sitem=curr->data; if (item_is_equal(*item,*sitem)) { #if 0 /* FIXME */ if (dl) { struct displayitem di; GHashTable *h; di.item=*sitem; di.label=NULL; di.count=0; di.item.type=type; h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); if (h) g_hash_table_remove(h, &di); } #endif g_free(sitem); gra->selection=g_list_remove(gra->selection, curr->data); found=1; break; } } if (!found) return; } } void graphics_clear_selection(struct graphics *gra, struct displaylist *dl) { while (gra->selection) { struct item *item=(struct item *)gra->selection->data; graphics_remove_selection(gra, item, (enum item_type)item->priv_data,dl); } } static void graphics_process_selection(struct graphics *gra, struct displaylist *dl) { GList *curr; curr=gra->selection; while (curr) { struct item *item=curr->data; graphics_process_selection_item(dl, item); curr=g_list_next(curr); } } navit-0.5.0+dfsg.1/navit/graphics.h000066400000000000000000000244071264204753600170250ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GRAPHICS_H #define NAVIT_GRAPHICS_H #ifdef __cplusplus extern "C" { #endif struct attr; struct point; struct container; struct color; struct graphics; struct graphics_gc; struct graphics_font; struct graphics_image; struct transformation; struct display_list; struct mapset; /* This enum must be synchronized with the constants in NavitGraphics.java. */ enum draw_mode_num { draw_mode_begin, draw_mode_end }; struct graphics_priv; struct graphics_font_priv; struct graphics_image_priv; struct graphics_gc_priv; struct graphics_font_methods; struct graphics_gc_methods; struct graphics_image_methods; enum graphics_image_type { graphics_image_type_unknown=0, }; struct graphics_image_buffer { char magic[8]; /* buffer:\0 */ enum graphics_image_type type; void *start; int len; }; struct graphics_methods { void (*graphics_destroy)(struct graphics_priv *gr); void (*draw_mode)(struct graphics_priv *gr, enum draw_mode_num mode); void (*draw_lines)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count); void (*draw_polygon)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count); void (*draw_rectangle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h); void (*draw_circle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r); void (*draw_text)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy); void (*draw_image)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img); void (*draw_image_warp)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img); void (*draw_drag)(struct graphics_priv *gr, struct point *p); struct graphics_font_priv *(*font_new)(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags); struct graphics_gc_priv *(*gc_new)(struct graphics_priv *gr, struct graphics_gc_methods *meth); void (*background_gc)(struct graphics_priv *gr, struct graphics_gc_priv *gc); struct graphics_priv *(*overlay_new)(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); struct graphics_image_priv *(*image_new)(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation); void *(*get_data)(struct graphics_priv *gr, const char *type); void (*image_free)(struct graphics_priv *gr, struct graphics_image_priv *priv); void (*get_text_bbox)(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate); void (*overlay_disable)(struct graphics_priv *gr, int disable); void (*overlay_resize)(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound); int (*set_attr)(struct graphics_priv *gr, struct attr *attr); }; struct graphics_font_methods { void (*font_destroy)(struct graphics_font_priv *font); }; struct graphics_font { struct graphics_font_priv *priv; struct graphics_font_methods meth; }; struct graphics_gc_methods { void (*gc_destroy)(struct graphics_gc_priv *gc); void (*gc_set_linewidth)(struct graphics_gc_priv *gc, int width); void (*gc_set_dashes)(struct graphics_gc_priv *gc, int width, int offset, unsigned char dash_list[], int n); void (*gc_set_foreground)(struct graphics_gc_priv *gc, struct color *c); void (*gc_set_background)(struct graphics_gc_priv *gc, struct color *c); }; /** * @brief graphics context * A graphics context encapsulates a set of drawing parameters, such as * linewidth and drawing color. */ struct graphics_gc { struct graphics_gc_priv *priv; struct graphics_gc_methods meth; struct graphics *gra; }; struct graphics_image_methods { void (*image_destroy)(struct graphics_image_priv *img); }; struct graphics_image { struct graphics_image_priv *priv; struct graphics_image_methods meth; int width; int height; struct point hot; }; struct graphics_data_image { void *data; int size; }; /* prototypes */ enum attr_type; enum draw_mode_num; enum item_type; struct attr; struct attr_iter; struct callback; struct color; struct displayitem; struct displaylist; struct displaylist_handle; struct graphics; struct graphics_font; struct graphics_gc; struct graphics_image; struct item; struct itemgra; struct layout; struct mapset; struct point; struct point_rect; struct transformation; int graphics_set_attr(struct graphics *gra, struct attr *attr); void graphics_set_rect(struct graphics *gra, struct point_rect *pr); struct graphics *graphics_new(struct attr *parent, struct attr **attrs); int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct graphics *graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int wraparound); void graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, int wraparound); void graphics_init(struct graphics *this_); void *graphics_get_data(struct graphics *this_, const char *type); void graphics_add_callback(struct graphics *this_, struct callback *cb); void graphics_remove_callback(struct graphics *this_, struct callback *cb); struct graphics_font *graphics_font_new(struct graphics *gra, int size, int flags); struct graphics_font *graphics_named_font_new(struct graphics *gra, char *font, int size, int flags); void graphics_font_destroy(struct graphics_font *gra_font); void graphics_free(struct graphics *gra); void graphics_font_destroy_all(struct graphics *gra); struct graphics_gc *graphics_gc_new(struct graphics *gra); void graphics_gc_destroy(struct graphics_gc *gc); void graphics_gc_set_foreground(struct graphics_gc *gc, struct color *c); void graphics_gc_set_background(struct graphics_gc *gc, struct color *c); void graphics_gc_set_linewidth(struct graphics_gc *gc, int width); void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n); struct graphics_image *graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h); struct graphics_image *graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate); struct graphics_image *graphics_image_new(struct graphics *gra, char *path); void graphics_image_free(struct graphics *gra, struct graphics_image *img); void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode); void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count); void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r); void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h); void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill); void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy); void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate); void graphics_overlay_disable(struct graphics *this_, int disable); int graphics_is_disabled(struct graphics *this_); void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img); int graphics_draw_drag(struct graphics *this_, struct point *p); void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc); void graphics_draw_text_std(struct graphics *this_, int text_size, char *text, struct point *p); char *graphics_icon_path(const char *icon); void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t, char *label); void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags); void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags); int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist); struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist); struct displayitem *graphics_displaylist_next(struct displaylist_handle *dlh); void graphics_displaylist_close(struct displaylist_handle *dlh); struct displaylist *graphics_displaylist_new(void); void graphics_displaylist_destroy(struct displaylist *displaylist); struct map_selection *displaylist_get_selection(struct displaylist *displaylist); GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius); struct item *graphics_displayitem_get_item(struct displayitem *di); int graphics_displayitem_get_coord_count(struct displayitem *di); char *graphics_displayitem_get_label(struct displayitem *di); int graphics_displayitem_get_displayed(struct displayitem *di); int graphics_displayitem_get_z_order(struct displayitem *di); int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist); void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); void graphics_clear_selection(struct graphics *gra, struct displaylist *dl); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/graphics/000077500000000000000000000000001264204753600166455ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/CMakeLists.txt000066400000000000000000000004661264204753600214130ustar00rootroot00000000000000# Create a library called "Hello" which includes the source file "hello.cxx". # The extension is already found. Any number of sources could be listed here. add_subdirectory (ezxml) if (HAVE_API_WIN32_BASE) add_subdirectory (glib) add_subdirectory (win32) endif (HAVE_API_WIN32_BASE) add_subdirectory (zlib) navit-0.5.0+dfsg.1/navit/graphics/Makefile.am000066400000000000000000000005551264204753600207060ustar00rootroot00000000000000SUBDIRS= if GRAPHICS_ANDROID SUBDIRS+=android endif if GRAPHICS_GTK_DRAWING_AREA SUBDIRS+=gtk_drawing_area endif if GRAPHICS_NULL SUBDIRS+=null endif if GRAPHICS_OPENGL SUBDIRS+=opengl endif if GRAPHICS_QT_QPAINTER SUBDIRS+=qt_qpainter endif if GRAPHICS_SDL SUBDIRS+=sdl endif if GRAPHICS_WIN32 SUBDIRS+=win32 endif if GRAPHICS_GD SUBDIRS+=gd endif navit-0.5.0+dfsg.1/navit/graphics/android/000077500000000000000000000000001264204753600202655ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/android/CMakeLists.txt000066400000000000000000000000701264204753600230220ustar00rootroot00000000000000module_add_library(graphics_android graphics_android.c) navit-0.5.0+dfsg.1/navit/graphics/android/Makefile.am000066400000000000000000000005511264204753600223220ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_android if PLUGINS modulegraphics_LTLIBRARIES = libgraphics_android.la else noinst_LTLIBRARIES = libgraphics_android.la endif libgraphics_android_la_SOURCES = graphics_android.c libgraphics_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/graphics/android/graphics_android.c000066400000000000000000000721441264204753600237410ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "config.h" #include "window.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "event.h" #include "debug.h" #include "callback.h" #include "android.h" #include "command.h" int dummy; struct graphics_priv { jclass NavitGraphicsClass; jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, NavitGraphics_draw_image_warp, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera; jclass PaintClass; jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB; jobject NavitGraphics; jobject Paint; jclass BitmapFactoryClass; jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource; jclass BitmapClass; jmethodID Bitmap_getHeight, Bitmap_getWidth, Bitmap_createScaledBitmap; jclass ContextClass; jmethodID Context_getResources; jclass ResourcesClass; jobject Resources; jmethodID Resources_getIdentifier; jobject packageName; struct callback_list *cbl; struct window win; }; struct graphics_font_priv { int size; }; struct graphics_gc_priv { struct graphics_priv *gra; int linewidth; enum draw_mode_num mode; int a,r,g,b; unsigned char *dashes; int ndashes; }; struct graphics_image_priv { jobject Bitmap; int width; int height; struct point hot; }; static GHashTable *image_cache_hash = NULL; static int find_class_global(char *name, jclass *ret) { *ret=(*jnienv)->FindClass(jnienv, name); if (! *ret) { dbg(lvl_error,"Failed to get Class %s\n",name); return 0; } *ret = (*jnienv)->NewGlobalRef(jnienv, *ret); return 1; } static int find_method(jclass class, char *name, char *args, jmethodID *ret) { *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); if (*ret == NULL) { dbg(lvl_error,"Failed to get Method %s with signature %s\n",name,args); return 0; } return 1; } static int find_static_method(jclass class, char *name, char *args, jmethodID *ret) { *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args); if (*ret == NULL) { dbg(lvl_error,"Failed to get static Method %s with signature %s\n",name,args); return 0; } return 1; } static void graphics_destroy(struct graphics_priv *gr) { } static void font_destroy(struct graphics_font_priv *font) { g_free(font); } static struct graphics_font_methods font_methods = { font_destroy }; static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) { struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); *meth=font_methods; ret->size=size; return ret; } static void gc_destroy(struct graphics_gc_priv *gc) { g_free(gc->dashes); g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->linewidth = w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { g_free(gc->dashes); gc->ndashes=n; if(n) { gc->dashes=g_malloc(n); memcpy(gc->dashes, dash_list, n); } else { gc->dashes=NULL; } } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->r = c->r >> 8; gc->g = c->g >> 8; gc->b = c->b >> 8; gc->a = c->a >> 8; } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); *meth=gc_methods; ret->gra = gr; ret->a = ret->r = ret->g = ret->b = 255; ret->linewidth=1; return ret; } static void image_destroy(struct graphics_image_priv *img) { // unused? } static struct graphics_image_methods image_methods = { image_destroy }; static struct graphics_image_priv * image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { struct graphics_image_priv* ret = NULL; ret=g_new0(struct graphics_image_priv, 1); jstring string; jclass localBitmap = NULL; int id; dbg(lvl_debug,"enter %s\n",path); if (!strncmp(path,"res/drawable/",13)) { jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); char *path_noext=g_strdup(path+13); char *pos=strrchr(path_noext, '.'); if (pos) *pos='\0'; dbg(lvl_debug,"path_noext=%s\n",path_noext); string = (*jnienv)->NewStringUTF(jnienv, path_noext); g_free(path_noext); id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, gra->packageName); dbg(lvl_debug,"id=%d\n",id); if (id) localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); (*jnienv)->DeleteLocalRef(jnienv, a); } else { string = (*jnienv)->NewStringUTF(jnienv, path); localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); } if (localBitmap) { ret->width=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getWidth); ret->height=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getHeight); if((*w!=-1 && *w!=ret->width) || (*h!=-1 && *w!=ret->height)) { jclass scaledBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapClass, gra->Bitmap_createScaledBitmap, localBitmap, (*w==-1)?ret->width:*w, (*h==-1)?ret->height:*h, JNI_TRUE); if(!scaledBitmap) { dbg(lvl_error,"Bitmap scaling to %dx%d failed for %s",*w,*h,path); } else { (*jnienv)->DeleteLocalRef(jnienv, localBitmap); localBitmap=scaledBitmap; ret->width=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getWidth); ret->height=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getHeight); } } ret->Bitmap = (*jnienv)->NewGlobalRef(jnienv, localBitmap); (*jnienv)->DeleteLocalRef(jnienv, localBitmap); dbg(lvl_debug,"w=%d h=%d for %s\n",ret->width,ret->height,path); ret->hot.x=ret->width/2; ret->hot.y=ret->height/2; } else { g_free(ret); ret=NULL; dbg(lvl_warning,"Failed to open %s\n",path); } (*jnienv)->DeleteLocalRef(jnienv, string); if (ret) { *w=ret->width; *h=ret->height; if (hot) *hot=ret->hot; } return ret; } static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc) { float wf = gc->linewidth; (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setStrokeWidth, wf); (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b); } static void draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) { int arrsize=1+4+1+gc->ndashes+count*2; jint pc[arrsize]; int i; jintArray points; if (count <= 0) return; points = (*jnienv)->NewIntArray(jnienv,arrsize); pc[0]=gc->linewidth; pc[1]=gc->a; pc[2]=gc->r; pc[3]=gc->g; pc[4]=gc->b; pc[5]=gc->ndashes; for (i = 0 ; i < gc->ndashes ; i++) { pc[6+i] = gc->dashes[i]; } for (i = 0 ; i < count ; i++) { pc[6+gc->ndashes+i*2]=p[i].x; pc[6+gc->ndashes+i*2+1]=p[i].y; } (*jnienv)->SetIntArrayRegion(jnienv, points, 0, arrsize, pc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points); (*jnienv)->DeleteLocalRef(jnienv, points); } static void draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) { int arrsize=1+4+count*2; jint pc[arrsize]; int i; jintArray points; if (count <= 0) return; points = (*jnienv)->NewIntArray(jnienv,arrsize); for (i = 0 ; i < count ; i++) { pc[5+i*2]=p[i].x; pc[5+i*2+1]=p[i].y; } pc[0]=gc->linewidth; pc[1]=gc->a; pc[2]=gc->r; pc[3]=gc->g; pc[4]=gc->b; (*jnienv)->SetIntArrayRegion(jnienv, points, 0, arrsize, pc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points); (*jnienv)->DeleteLocalRef(jnienv, points); } static void draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h) { initPaint(gra, gc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h); } static void draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r) { initPaint(gra, gc); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r); } static void draw_text(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { int bgcolor=0; dbg(lvl_debug,"enter %s\n", text); initPaint(gra, fg); if(bg) bgcolor=(bg->a<<24)| (bg->r<<16) | (bg->g<<8) | bg->b; jstring string = (*jnienv)->NewStringUTF(jnienv, text); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy, bgcolor); (*jnienv)->DeleteLocalRef(jnienv, string); } static void draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { dbg(lvl_debug,"enter %p\n",img); initPaint(gra, fg); (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap); } static void draw_image_warp (struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img) { /* * * * if coord count==3 then top.left top.right bottom.left * */ if (count==3) { initPaint(gr, fg); (*jnienv)->CallVoidMethod(jnienv, gr->NavitGraphics, gr->NavitGraphics_draw_image_warp, fg->gra->Paint, count, p[0].x, p[0].y,p[1].x, p[1].y, p[2].x, p[2].y, img->Bitmap); } else dbg(lvl_debug,"draw_image_warp is called with unsupported count parameter value %d\n", count); } static void draw_drag(struct graphics_priv *gra, struct point *p) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0); } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { } static void draw_mode(struct graphics_priv *gra, enum draw_mode_num mode) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode); } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); static void * get_data(struct graphics_priv *this, const char *type) { if (strcmp(type,"window")) return NULL; return &this->win; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { } static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) { int len = g_utf8_strlen(text, -1); int xMin = 0; int yMin = 0; int yMax = 13*font->size/256; int xMax = 9*font->size*len/256; ret[0].x = xMin; ret[0].y = -yMin; ret[1].x = xMin; ret[1].y = -yMax; ret[2].x = xMax; ret[2].y = -yMax; ret[3].x = xMax; ret[3].y = -yMin; } static void overlay_disable(struct graphics_priv *gra, int disable) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable); } static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int wraparound) { (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, wraparound); } static int set_attr(struct graphics_priv *gra, struct attr *attr) { switch (attr->type) { case attr_use_camera: (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); return 1; default: return 0; } } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, draw_image_warp, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data, image_free, get_text_bbox, overlay_disable, overlay_resize, set_attr, }; static void resize_callback(struct graphics_priv *gra, int w, int h) { dbg(lvl_debug,"w=%d h=%d ok\n",w,h); callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h); } static void motion_callback(struct graphics_priv *gra, int x, int y) { struct point p; p.x=x; p.y=y; callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p); } static void keypress_callback(struct graphics_priv *gra, char *s) { dbg(lvl_debug,"enter %s\n",s); callback_list_call_attr_1(gra->cbl, attr_keypress, s); } static void button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y) { struct point p; p.x=x; p.y=y; callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p); } static int set_activity(jobject graphics) { jclass ActivityClass; jmethodID cid; ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity); dbg(lvl_debug,"at 5\n"); if (ActivityClass == NULL) { dbg(lvl_debug,"no activity class found\n"); return 0; } dbg(lvl_debug,"at 6\n"); cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V"); if (cid == NULL) { dbg(lvl_error,"no setContentView method found\n"); return 0; } dbg(lvl_debug,"at 7\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics); dbg(lvl_debug,"at 8\n"); return 1; } static int graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int wraparound, int use_camera) { struct callback *cb; jmethodID cid, Context_getPackageName; dbg(lvl_debug,"at 2 jnienv=%p\n",jnienv); if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) return 0; if (!find_method(ret->PaintClass, "", "(I)V", &ret->Paint_init)) return 0; if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB)) return 0; if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth)) return 0; if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass)) return 0; if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile)) return 0; if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource)) return 0; if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass)) return 0; if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight)) return 0; if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth)) return 0; if (!find_static_method(ret->BitmapClass, "createScaledBitmap", "(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;", &ret->Bitmap_createScaledBitmap)) return 0; if (!find_class_global("android/content/Context", &ret->ContextClass)) return 0; if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources)) return 0; ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources); if (ret->Resources) ret->Resources = (*jnienv)->NewGlobalRef(jnienv, ret->Resources); if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass)) return 0; if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier)) return 0; if (!find_method(ret->ContextClass, "getPackageName", "()Ljava/lang/String;", &Context_getPackageName)) return 0; ret->packageName=(*jnienv)->CallObjectMethod(jnienv, android_activity, Context_getPackageName); ret->packageName=(*jnienv)->NewGlobalRef(jnienv, ret->packageName); if (!find_class_global("org/navitproject/navit/NavitGraphics", &ret->NavitGraphicsClass)) return 0; dbg(lvl_debug,"at 3\n"); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "", "(Landroid/app/Activity;Lorg/navitproject/navit/NavitGraphics;IIIIII)V"); if (cid == NULL) { dbg(lvl_error,"no method found\n"); return 0; /* exception thrown */ } dbg(lvl_debug,"at 4 android_activity=%p\n",android_activity); ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, wraparound, use_camera); dbg(lvl_debug,"result=%p\n",ret->NavitGraphics); if (ret->NavitGraphics) ret->NavitGraphics = (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics); /* Create a single global Paint, otherwise android will quickly run out * of global refs.*/ /* 0x101 = text kerning (default), antialiasing */ ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101); dbg(lvl_debug,"result=%p\n",ret->Paint); if (ret->Paint) ret->Paint = (*jnienv)->NewGlobalRef(jnienv, ret->Paint); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V"); if (cid == NULL) { dbg(lvl_error,"no SetResizeCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(resize_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V"); if (cid == NULL) { dbg(lvl_error,"no SetButtonCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(button_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V"); if (cid == NULL) { dbg(lvl_error,"no SetMotionCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(motion_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V"); if (cid == NULL) { dbg(lvl_error,"no SetKeypressCallback method found\n"); return 0; /* exception thrown */ } cb=callback_new_1(callback_cast(keypress_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_circle", "(Landroid/graphics/Paint;III)V", &ret->NavitGraphics_draw_circle)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_text", "(Landroid/graphics/Paint;IILjava/lang/String;IIII)V", &ret->NavitGraphics_draw_text)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_image_warp", "(Landroid/graphics/Paint;IIIIIIILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image_warp)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode)) return 0; if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag)) return 0; if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable)) return 0; if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIII)V", &ret->NavitGraphics_overlay_resize)) return 0; if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera)) return 0; #if 0 set_activity(ret->NavitGraphics); #endif return 1; } static jclass NavitClass; static jmethodID Navit_disableSuspend, Navit_exit, Navit_fullscreen, Navit_runOptionsItem; static int graphics_android_fullscreen(struct window *win, int on) { (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_fullscreen, on); return 1; } static void graphics_android_disable_suspend(struct window *win) { dbg(lvl_debug,"enter\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); } static void graphics_android_cmd_runMenuItem(struct graphics_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { int ncmd=0; dbg(0,"Running %s\n",function); if(!strcmp(function,"map_download_dialog")) { ncmd=3; } else if(!strcmp(function,"backup_restore_dialog")) { ncmd=7; } else if(!strcmp(function,"set_map_location")) { ncmd=10; } (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_runOptionsItem, ncmd); } static struct command_table commands[] = { {"map_download_dialog",command_cast(graphics_android_cmd_runMenuItem)}, {"set_map_location",command_cast(graphics_android_cmd_runMenuItem)}, {"backup_restore_dialog",command_cast(graphics_android_cmd_runMenuItem)}, }; static struct graphics_priv * graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct graphics_priv *ret; struct attr *attr; int use_camera=0; if (!event_request_system("android","graphics_android")) return NULL; ret=g_new0(struct graphics_priv, 1); ret->cbl=cbl; *meth=graphics_methods; ret->win.priv=ret; ret->win.fullscreen=graphics_android_fullscreen; ret->win.disable_suspend=graphics_android_disable_suspend; if ((attr=attr_search(attrs, NULL, attr_use_camera))) { use_camera=attr->u.num; } if ((attr=attr_search(attrs, NULL, attr_callback_list))) { command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), ret); } image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, use_camera)) { dbg(lvl_debug,"returning %p\n",ret); return ret; } else { g_free(ret); return NULL; } } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound) { struct graphics_priv *ret=g_new0(struct graphics_priv, 1); *meth=graphics_methods; if (graphics_android_init(ret, gr, p, w, h, wraparound, 0)) { dbg(lvl_debug,"returning %p\n",ret); return ret; } else { g_free(ret); return NULL; } } static void event_android_main_loop_run(void) { dbg(lvl_debug,"enter\n"); } static void event_android_main_loop_quit(void) { dbg(lvl_debug,"enter\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit); } static jclass NavitTimeoutClass; static jmethodID NavitTimeout_init; static jmethodID NavitTimeout_remove; static jclass NavitIdleClass; static jmethodID NavitIdle_init; static jmethodID NavitIdle_remove; static jclass NavitWatchClass; static jmethodID NavitWatch_init; static jmethodID NavitWatch_remove; static void do_poll(JNIEnv *env, int fd, int cond) { struct pollfd pfd; pfd.fd=fd; dbg(lvl_debug,"%p poll called for %d %d\n", fd, cond); switch ((enum event_watch_cond)cond) { case event_watch_cond_read: pfd.events=POLLIN; break; case event_watch_cond_write: pfd.events=POLLOUT; break; case event_watch_cond_except: pfd.events=POLLERR; break; default: pfd.events=0; } pfd.revents=0; poll(&pfd, 1, -1); } static struct event_watch * event_android_add_watch(int h, enum event_watch_cond cond, struct callback *cb) { jobject ret; ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int)do_poll, h, (int) cond, (int)cb); dbg(lvl_debug,"result for %d,%d,%p=%p\n",h,cond,cb,ret); if (ret) ret = (*jnienv)->NewGlobalRef(jnienv, ret); return (struct event_watch *)ret; } static void event_android_remove_watch(struct event_watch *ev) { dbg(lvl_debug,"enter %p\n",ev); if (ev) { jobject obj=(jobject )ev; (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove); (*jnienv)->DeleteGlobalRef(jnienv, obj); } } struct event_timeout { void (*handle_timeout)(struct event_timeout *priv); jobject jni_timeout; int multi; struct callback *cb; }; static void event_android_remove_timeout(struct event_timeout *priv) { if (priv && priv->jni_timeout) { (*jnienv)->CallVoidMethod(jnienv, priv->jni_timeout, NavitTimeout_remove); (*jnienv)->DeleteGlobalRef(jnienv, priv->jni_timeout); priv->jni_timeout = NULL; } } static void event_android_handle_timeout(struct event_timeout *priv) { callback_call_0(priv->cb); if (!priv->multi) event_android_remove_timeout(priv); } static struct event_timeout * event_android_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout *ret = g_new0(struct event_timeout, 1); ret->cb = cb; ret->multi = multi; ret->handle_timeout = event_android_handle_timeout; ret->jni_timeout = (*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)ret); if (ret->jni_timeout) ret->jni_timeout = (*jnienv)->NewGlobalRef(jnienv, ret->jni_timeout); return ret; } static struct event_idle * event_android_add_idle(int priority, struct callback *cb) { #if 0 jobject ret; dbg(lvl_debug,"enter\n"); ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb); dbg(lvl_debug,"result for %p=%p\n",cb,ret); if (ret) ret = (*jnienv)->NewGlobalRef(jnienv, ret); return (struct event_idle *)ret; #endif return (struct event_idle *)event_android_add_timeout(1, 1, cb); } static void event_android_remove_idle(struct event_idle *ev) { #if 0 dbg(lvl_debug,"enter %p\n",ev); if (ev) { jobject obj=(jobject )ev; (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove); (*jnienv)->DeleteGlobalRef(jnienv, obj); } #endif event_android_remove_timeout((struct event_timeout *)ev); } static void event_android_call_callback(struct callback_list *cb) { dbg(lvl_debug,"enter\n"); } static struct event_methods event_android_methods = { event_android_main_loop_run, event_android_main_loop_quit, event_android_add_watch, event_android_remove_watch, event_android_add_timeout, event_android_remove_timeout, event_android_add_idle, event_android_remove_idle, event_android_call_callback, }; static struct event_priv * event_android_new(struct event_methods *meth) { dbg(lvl_debug,"enter\n"); if (!find_class_global("org/navitproject/navit/NavitTimeout", &NavitTimeoutClass)) return NULL; NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "", "(IZI)V"); if (NavitTimeout_init == NULL) return NULL; NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V"); if (NavitTimeout_remove == NULL) return NULL; #if 0 if (!find_class_global("org/navitproject/navit/NavitIdle", &NavitIdleClass)) return NULL; NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "", "(I)V"); if (NavitIdle_init == NULL) return NULL; NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V"); if (NavitIdle_remove == NULL) return NULL; #endif if (!find_class_global("org/navitproject/navit/NavitWatch", &NavitWatchClass)) return NULL; NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "", "(IIII)V"); if (NavitWatch_init == NULL) return NULL; NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); if (NavitWatch_remove == NULL) return NULL; if (!find_class_global("org/navitproject/navit/Navit", &NavitClass)) return NULL; Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V"); if (Navit_disableSuspend == NULL) return NULL; Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V"); if (Navit_exit == NULL) return NULL; Navit_fullscreen = (*jnienv)->GetMethodID(jnienv, NavitClass, "fullscreen", "(I)V"); if (Navit_fullscreen == NULL) return NULL; Navit_runOptionsItem = (*jnienv)->GetMethodID(jnienv, NavitClass, "runOptionsItem", "(I)V"); if (Navit_runOptionsItem == NULL) return NULL; dbg(lvl_debug,"ok\n"); *meth=event_android_methods; return NULL; } void plugin_init(void) { dbg(lvl_debug,"enter\n"); plugin_register_graphics_type("android", graphics_android_new); plugin_register_event_type("android", event_android_new); } navit-0.5.0+dfsg.1/navit/graphics/gd/000077500000000000000000000000001264204753600172375ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/gd/CMakeLists.txt000066400000000000000000000002041264204753600217730ustar00rootroot00000000000000include_directories(${GD_INCLUDE_DIR}) module_add_library(graphics_gd graphics_gd.c) target_link_libraries(graphics_gd ${GD_LIBS}) navit-0.5.0+dfsg.1/navit/graphics/gd/Makefile.am000066400000000000000000000005321264204753600212730ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @GD_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gd libgraphics_gd_la_LDFLAGS = @GD_LIBS@ -module -avoid-version if PLUGINS modulegraphics_LTLIBRARIES = libgraphics_gd.la else noinst_LTLIBRARIES = libgraphics_gd.la endif libgraphics_gd_la_SOURCES = graphics_gd.c navit-0.5.0+dfsg.1/navit/graphics/gd/graphics_gd.c000066400000000000000000000510271264204753600216620ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "callback.h" #include "window.h" #include "navit.h" #include "debug.h" #include "navit/font/freetype/font_freetype.h" #ifdef HAVE_SHMEM #include #include #include #endif #ifdef HAVE_SOCKET #include #include #include #include #endif struct shmem_header { int flag; int w,h,bpp; }; #ifdef HAVE_XPM #define NAVIT_GD_XPM_TRANSPARENCY_HACK #endif static void emit_callback(struct graphics_priv *priv); static void image_setup(struct graphics_priv *gr); static struct shmem_header *shm_next(struct graphics_priv *gr); static void add_overlays(struct graphics_priv *overlay, gdImagePtr im); #ifdef NAVIT_GD_XPM_TRANSPARENCY_HACK #include BGD_DECLARE(gdImagePtr) gdImageCreateFromXpm (char *filename) { XpmInfo info; XpmImage image; int i, j, k, number; char buf[5]; gdImagePtr im = 0; int *pointer; int red = 0, green = 0, blue = 0, alpha = 0; int *colors; int ret; ret = XpmReadFileToXpmImage (filename, &image, &info); if (ret != XpmSuccess) return 0; if (!(im = gdImageCreate (image.width, image.height))) return 0; number = image.ncolors; if (overflow2(sizeof (int), number)) { return 0; } colors = (int *) gdMalloc (sizeof (int) * number); if (colors == NULL) return (0); for (i = 0; i < number; i++) { alpha = 0; switch (strlen (image.colorTable[i].c_color)) { case 4: if (!strcasecmp(image.colorTable[i].c_color,"none")) { red = 0; green = 0; blue = 0; alpha = 127; } else { buf[1] = '\0'; buf[0] = image.colorTable[i].c_color[1]; red = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[3]; green = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[5]; blue = strtol (buf, NULL, 16); } break; case 7: buf[2] = '\0'; buf[0] = image.colorTable[i].c_color[1]; buf[1] = image.colorTable[i].c_color[2]; red = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[3]; buf[1] = image.colorTable[i].c_color[4]; green = strtol (buf, NULL, 16); buf[0] = image.colorTable[i].c_color[5]; buf[1] = image.colorTable[i].c_color[6]; blue = strtol (buf, NULL, 16); break; case 10: buf[3] = '\0'; buf[0] = image.colorTable[i].c_color[1]; buf[1] = image.colorTable[i].c_color[2]; buf[2] = image.colorTable[i].c_color[3]; red = strtol (buf, NULL, 16); red /= 64; buf[0] = image.colorTable[i].c_color[4]; buf[1] = image.colorTable[i].c_color[5]; buf[2] = image.colorTable[i].c_color[6]; green = strtol (buf, NULL, 16); green /= 64; buf[0] = image.colorTable[i].c_color[7]; buf[1] = image.colorTable[i].c_color[8]; buf[2] = image.colorTable[i].c_color[9]; blue = strtol (buf, NULL, 16); blue /= 64; break; case 13: buf[4] = '\0'; buf[0] = image.colorTable[i].c_color[1]; buf[1] = image.colorTable[i].c_color[2]; buf[2] = image.colorTable[i].c_color[3]; buf[3] = image.colorTable[i].c_color[4]; red = strtol (buf, NULL, 16); red /= 256; buf[0] = image.colorTable[i].c_color[5]; buf[1] = image.colorTable[i].c_color[6]; buf[2] = image.colorTable[i].c_color[7]; buf[3] = image.colorTable[i].c_color[8]; green = strtol (buf, NULL, 16); green /= 256; buf[0] = image.colorTable[i].c_color[9]; buf[1] = image.colorTable[i].c_color[10]; buf[2] = image.colorTable[i].c_color[11]; buf[3] = image.colorTable[i].c_color[12]; blue = strtol (buf, NULL, 16); blue /= 256; break; } colors[i] = gdImageColorResolveAlpha(im, red, green, blue, alpha); if (colors[i] == -1) fprintf (stderr, "ARRRGH\n"); } pointer = (int *) image.data; for (i = 0; i < image.height; i++) { for (j = 0; j < image.width; j++) { k = *pointer++; gdImageSetPixel (im, j, i, colors[k]); } } gdFree (colors); return (im); } #endif struct graphics_priv { gdImagePtr im; int w,h,flags,overlay,shmkey,shmsize,shmoffset; void *shm; struct shmem_header *shm_header; struct point p; struct callback *cb; struct callback_list *cbl; struct navit *nav; struct graphics_gc_priv *background; struct font_freetype_methods freetype_methods; struct window window; struct graphics_data_image image; struct graphics_priv *next,*overlays; GList *sockets; }; struct graphics_gc_priv { struct graphics_priv *gr; int color; int bgcolor; int width; struct color color2; unsigned char *dash_list; int dash_count; int dash_list_len; }; struct graphics_image_priv { gdImagePtr im; }; static void graphics_destroy(struct graphics_priv *gr) { gr->freetype_methods.destroy(); g_free(gr); } static void gc_destroy(struct graphics_gc_priv *gc) { if (gc->color != -1) gdImageColorDeallocate(gc->gr->im, gc->color); if (gc->bgcolor != -1) gdImageColorDeallocate(gc->gr->im, gc->bgcolor); g_free(gc->dash_list); g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->width=w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { int i,count=0; g_free(gc->dash_list); gc->dash_list=g_new(unsigned char, n); for (i = 0 ; i < n ; i++) { gc->dash_list[i]=dash_list[i]; count+=dash_list[i]; } gc->dash_list_len=n; gc->dash_count=count; } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->color2=*c; gc->color=gdImageColorAllocate(gc->gr->im, c->r>>8, c->g>>8, c->b>>8); } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { gc->bgcolor=gdImageColorAllocate(gc->gr->im, c->r>>8, c->g>>8, c->b>>8); } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); ret->gr=gr; ret->width=1; ret->color=-1; ret->bgcolor=-1; *meth=gc_methods; return ret; } static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) { FILE *file; struct graphics_image_priv *ret=NULL; gdImagePtr im=NULL; int len; if (! name) return NULL; len=strlen(name); if (len < 4) return NULL; file=fopen(name,"r"); if (file) { if (!strcmp(name+len-4,".png")) #ifdef HAVE_GRAPHICS_GD_PNG im=gdImageCreateFromPng(file); #else im=NULL; #endif else if (!strcmp(name+len-4,".xpm")) im=gdImageCreateFromXpm(name); else if (!strcmp(name+len-4,".gif")) { im=gdImageCreateFromGif(file); } fclose(file); } if (im) { ret=g_new0(struct graphics_image_priv, 1); ret->im=im; *w=im->sx; *h=im->sy; hot->x=im->sx/2; hot->y=im->sy/2; } return ret; } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int color[gc->dash_count],cc; int i,j,k=0; if (gc->dash_count) { cc=gc->color; for (i = 0 ; i < gc->dash_list_len ; i++) { for (j = 0 ; j < gc->dash_list[i] ; j++) { color[k++]=cc; } if (cc == gdTransparent) cc=gc->color; else cc=gdTransparent; } gdImageSetStyle(gr->im, color, gc->dash_count); } gdImageSetThickness(gr->im, gc->width); cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } #ifdef GD_NO_IMAGE_OPEN_POLYGON for (i = 0 ; i < count-1 ; i++) gdImageLine(gr->im, p[i].x, p[i].y, p[i+1].x, p[i+1].y, gc->dash_count ? gdStyled : cc); #else gdImageOpenPolygon(gr->im, (gdPointPtr) p, count, gc->dash_count ? gdStyled : cc); #endif } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } gdImageFilledPolygon(gr->im, (gdPointPtr) p, count, cc); } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { int cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } gdImageFilledRectangle(gr->im, p->x, p->y, p->x+w, p->y+h, cc); } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { int cc=gc->color; if (gr->flags & 8) { gdImageSetAntiAliased(gr->im, cc); cc=gdAntiAliased; } gdImageSetThickness(gr->im, gc->width); gdImageArc(gr->im, p->x, p->y, r, r, 0, 360, cc); } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { struct font_freetype_text *t; struct font_freetype_glyph *g, **gp; gdImagePtr im; int i,x,y,w,h; t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); struct color fgc,bgc,transparent = {0x0, 0x0, 0x0, 0x7f7f}; fgc=fg->color2; fgc.a=0; if (bg) { bgc=bg->color2; bgc.a=0; x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; while (i-- > 0) { g=*gp++; w=g->w; h=g->h; if (w && h) { im=gdImageCreateTrueColor(w+2, h+2); gr->freetype_methods.get_shadow(g,(unsigned char *)(im->tpixels),0,&bgc,&transparent); gdImageCopy(gr->im, im, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, 0, 0, w+2, h+2); gdImageDestroy(im); } x+=g->dx; y+=g->dy; } } else bgc=transparent; x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; while (i-- > 0) { g=*gp++; w=g->w; h=g->h; if (w && h) { im=gdImageCreateTrueColor(w, h); gr->freetype_methods.get_glyph(g,(unsigned char *)(im->tpixels),0,&fgc,&bgc,&transparent); gdImageCopy(gr->im, im, (x+g->x)>>6, (y+g->y)>>6, 0, 0, w, h); gdImageDestroy(im); } x+=g->dx; y+=g->dy; } gr->freetype_methods.text_destroy(t); } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { gdImageCopy(gr->im, img->im, p->x, p->y, 0, 0, img->im->sx, img->im->sy); } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (p) gr->p=*p; else { gr->p.x=0; gr->p.y=0; } } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background=gc; } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { FILE *pngout; #if 0 if (mode == draw_mode_begin && gr->background) { gdImageFilledRectangle(gr->im, 0, 0, gr->w, gr->h, gr->background->color); } #endif if (mode == draw_mode_end && !gr->overlay) { add_overlays(gr->overlays, gr->im); if (!(gr->flags & 1)) { #ifdef HAVE_GRAPHICS_GD_PNG rename("test.png","test.png.old"); pngout=fopen("test.png", "wb"); gdImagePng(gr->im, pngout); fclose(pngout); #else rename("test.gd","test.gd.old"); pngout=fopen("test.gd", "wb"); gdImageGd(gr->im, pngout); fclose(pngout); #endif } if (gr->flags & 2) { struct shmem_header *next=shm_next(gr); gr->shm_header->flag=1; dbg(lvl_debug,"next flag is %d\n",next->flag); if (!next->flag) { gr->shm_header=next; image_setup(gr); } } #ifdef HAVE_GRAPHICS_GD_PNG #ifdef HAVE_SOCKET if (gr->flags & 4) { int size, size_written; void *data=gdImagePngPtr(gr->im, &size); GList *sockets=gr->sockets; while (sockets) { int fd=socket(PF_INET, SOCK_STREAM, 0); if (fd < 0) { dbg(lvl_error,"socket failed\n"); } else { if (connect(fd, (struct sockaddr *)sockets->data, sizeof(struct sockaddr_in)) < 0) { dbg(lvl_error,"connect failed\n"); } else { size_written=write(fd, data, size); dbg(lvl_debug,"size %d vs %d\n",size, size_written); if (shutdown(fd, SHUT_RDWR) < 0) dbg(lvl_error,"shutdown failed\n"); } close(fd); } sockets=g_list_next(sockets); } gdFree(data); } #endif #endif } } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); static void add_overlays(struct graphics_priv *overlay, gdImagePtr im) { while (overlay) { if (overlay->background) { gdImagePtr res,src; int y,x; int bgcol=overlay->background->color; res=gdImageCreateTrueColor(overlay->w,overlay->h); src=gdImageCreateTrueColor(overlay->w,overlay->h); gdImageCopy(src, im, 0, 0, overlay->p.x, overlay->p.y, overlay->w, overlay->h); for (y = 0 ; y < overlay->h ; y++) { unsigned int *res_line=res->tpixels[y]; unsigned int *src_line=src->tpixels[y]; unsigned int *overlay_line=overlay->im->tpixels[y]; for (x = 0 ; x < overlay->w ; x++) { if (overlay_line[x] != bgcol) res_line[x]=overlay_line[x]; else res_line[x]=src_line[x]; } } gdImageCopy(im, res, overlay->p.x, overlay->p.y, 0, 0, overlay->w, overlay->h); gdImageDestroy(res); gdImageDestroy(src); } else gdImageCopy(im, overlay->im, overlay->p.x, overlay->p.y, 0, 0, overlay->w, overlay->h); overlay=overlay->next; } } static void * get_data(struct graphics_priv *this, char *type) { int b; struct point p; gdImagePtr im = this->im; dbg(lvl_debug,"type=%s\n",type); if (!strcmp(type,"window")) return &this->window; if (!strcmp(type,"image_png")) { if (this->overlays) { struct graphics_priv *overlay=this->overlays; im=gdImageCreateTrueColor(this->w,this->h); gdImageCopy(im, this->im, 0, 0, 0, 0, this->w, this->h); add_overlays(overlay, im); } if (this->image.data) gdFree(this->image.data); #ifdef HAVE_GRAPHICS_GD_PNG this->image.data=gdImagePngPtr(im, &this->image.size); #else this->image.data=NULL; #endif if (this->overlays) gdImageDestroy(im); return &this->image; } if (sscanf(type,"click_%d_%d_%d",&p.x,&p.y,&b) == 3) { dbg(lvl_debug,"click %d %d %d\n",p.x,p.y,b); callback_list_call_attr_3(this->cbl, attr_button, (void *)b, (void *)1, (void *)&p); } if (sscanf(type,"move_%d_%d",&p.x,&p.y) == 2) { dbg(lvl_debug,"move %d %d\n",p.x,p.y); callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); } return NULL; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { gdImageDestroy(priv->im); g_free(priv); } static void overlay_disable(struct graphics_priv *gr, int disable) { dbg(lvl_debug,"enter\n"); } static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound) { dbg(lvl_debug,"enter\n"); } struct shmem_header * shm_next(struct graphics_priv *gr) { char *next=(char *)gr->shm_header+gr->shmoffset; if (next+gr->shmoffset > (char *)gr->shm+gr->shmsize) { dbg(lvl_debug,"wraparound\n"); return gr->shm; } dbg(lvl_debug,"next 0x%x (offset 0x%x)\n",next-(char *)gr->shm,gr->shmoffset); return (struct shmem_header *)next; } static void image_setup(struct graphics_priv *gr) { int i,*shm=(int *)(gr->shm_header+1); if (!gr->shmkey) return; for (i = 0 ; i < gr->h ; i++) gr->im->tpixels[i]=shm+gr->w*i; gr->shm_header->w=gr->w; gr->shm_header->h=gr->h; gr->shm_header->bpp=32; gr->shm_header->flag=0; } static void image_create(struct graphics_priv *gr) { dbg(lvl_debug,"shmkey %d\n",gr->shmkey); #ifdef HAVE_SHMEM if (gr->shmkey) { int size=gr->h*gr->w*sizeof(int); int shmid=shmget(gr->shmkey, size, 0666); dbg(lvl_debug,"shmid for key 0x%x is 0x%x\n",gr->shmkey, shmid); if (shmid < 0) dbg(lvl_debug,"shmget\n"); gr->shm=shmat(shmid, NULL, 0); if (!gr->shm) dbg(lvl_debug,"shmat\n"); gr->shm_header=gr->shm; gr->im=g_new0(gdImage,1); gr->im->tpixels=g_new(int *,gr->h); gr->im->sx=gr->w; gr->im->sy=gr->h; gr->im->transparent=-1; gr->im->trueColor=1; gr->im->alphaBlendingFlag=1; gr->im->thick=1; gr->im->cx2=gr->im->sx-1; gr->im->cy2=gr->im->sy-1; image_setup(gr); } else #endif gr->im=gdImageCreateTrueColor(gr->w,gr->h); } static void image_destroy(struct graphics_priv *gr) { #ifdef HAVE_SHMEM if (gr->shmkey) { shmdt(gr->shm); g_free(gr->im->tpixels); g_free(gr->im); } else #endif gdImageDestroy(gr->im); gr->im=NULL; } static int set_attr_do(struct graphics_priv *gr, struct attr *attr, int init) { char *s,*c,*n,*p; switch (attr->type) { case attr_w: if (gr->w != attr->u.num) { gr->w=attr->u.num; if (!init) { if (gr->im) image_destroy(gr); image_create(gr); emit_callback(gr); } } break; case attr_h: if (gr->h != attr->u.num) { gr->h=attr->u.num; if (!init) { if (gr->im) image_destroy(gr); image_create(gr); emit_callback(gr); } } break; case attr_flags: gr->flags=attr->u.num; break; case attr_shmkey: gr->shmkey=attr->u.num; break; case attr_shmsize: gr->shmsize=attr->u.num; break; case attr_shmoffset: gr->shmoffset=attr->u.num; break; #ifdef HAVE_SOCKET case attr_socket: g_list_foreach(gr->sockets, (GFunc)g_free, NULL); g_list_free(gr->sockets); gr->sockets=NULL; c=s=g_strdup(attr->u.str); dbg(lvl_debug,"s=%s\n",s); while (c) { n=strchr(c,','); if (n) *n++='\0'; p=strchr(c,':'); if (p) { *p++='\0'; struct sockaddr_in *sin=g_new(struct sockaddr_in, 1); sin->sin_family=AF_INET; sin->sin_port=ntohs(atoi(p)); if (inet_aton(c, &sin->sin_addr)) { gr->sockets=g_list_append(gr->sockets, sin); } else { dbg(lvl_error,"error in %s\n",c); g_free(sin); } dbg(lvl_debug,"host=%s port=%s\n",c,p); } else dbg(lvl_error,"error in format: %s\n",p); c=n; } g_free(s); #endif default: return 0; } return 1; } static int set_attr(struct graphics_priv *gr, struct attr *attr) { return set_attr_do(gr, attr, 0); } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, NULL, draw_drag, NULL, gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, overlay_disable, overlay_resize, set_attr, }; static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound) { struct font_priv * (*font_freetype_new)(void *meth); struct graphics_priv *ret; dbg(lvl_debug,"enter\n"); ret=g_new0(struct graphics_priv, 1); *meth=graphics_methods; font_freetype_new=plugin_get_font_type("freetype"); if (!font_freetype_new) return NULL; font_freetype_new(&ret->freetype_methods); ret->p=*p; ret->w=w; ret->h=h; ret->overlay=1; ret->flags=1; ret->im=gdImageCreateTrueColor(ret->w,ret->h); ret->next=gr->overlays; gr->overlays=ret; return ret; } static void emit_callback(struct graphics_priv *priv) { callback_list_call_attr_2(priv->cbl, attr_resize, (void *)priv->w, (void *)priv->h); } static struct graphics_priv * graphics_gd_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct font_priv * (*font_freetype_new)(void *meth); struct graphics_priv *ret; event_request_system("glib","graphics_gd_new"); font_freetype_new=plugin_get_font_type("freetype"); if (!font_freetype_new) return NULL; *meth=graphics_methods; ret=g_new0(struct graphics_priv, 1); font_freetype_new(&ret->freetype_methods); meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; meth->get_text_bbox=ret->freetype_methods.get_text_bbox; ret->cb=callback_new_attr_1(callback_cast(emit_callback), attr_navit, ret); navit_add_callback(nav, ret->cb); ret->cbl=cbl; ret->nav=nav; ret->w=800; ret->h=600; while (*attrs) { set_attr_do(ret, *attrs, 1); attrs++; } if (!ret->im) image_create(ret); return ret; } void plugin_init(void) { plugin_register_graphics_type("gd", graphics_gd_new); } navit-0.5.0+dfsg.1/navit/graphics/gtk_drawing_area/000077500000000000000000000000001264204753600221355ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/gtk_drawing_area/CMakeLists.txt000066400000000000000000000002241264204753600246730ustar00rootroot00000000000000set(graphics_gtk_drawing_area_LIBS ${IMLIB2_LDFLAGS} ${GTK2_LIBRARIES}) module_add_library(graphics_gtk_drawing_area graphics_gtk_drawing_area.c) navit-0.5.0+dfsg.1/navit/graphics/gtk_drawing_area/Makefile.am000066400000000000000000000005461264204753600241760ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @GTK2_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gtk_drawing_area modulegraphics_LTLIBRARIES = libgraphics_gtk_drawing_area.la libgraphics_gtk_drawing_area_la_SOURCES = graphics_gtk_drawing_area.c libgraphics_gtk_drawing_area_la_LDFLAGS = @GTK2_LIBS@ @IMLIB2_LIBS@ -module -avoid-version navit-0.5.0+dfsg.1/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c000066400000000000000000000707121264204753600274600ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define GDK_ENABLE_BROKEN #include "config.h" #include #include #include #include #include #include #include #include /* For WIN32 */ #if !defined(GDK_Book) || !defined(GDK_Calendar) #include #endif #ifdef HAVE_IMLIB2 #include #endif #ifndef _WIN32 #include #endif #include "event.h" #include "debug.h" #include "point.h" #include "graphics.h" #include "color.h" #include "item.h" #include "window.h" #include "callback.h" #include "keys.h" #include "plugin.h" #include "navit/font/freetype/font_freetype.h" #include "navit.h" #ifndef GDK_Book #define GDK_Book XF86XK_Book #endif #ifndef GDK_Calendar #define GDK_Calendar XF86XK_Calendar #endif struct graphics_priv { GdkEventButton button_event; int button_timeout; GtkWidget *widget; GtkWidget *win; struct window window; cairo_t *cairo; struct point p; int width; int height; int win_w; int win_h; int visible; int overlay_disabled; int overlay_autodisabled; int wraparound; struct graphics_priv *parent; struct graphics_priv *overlays; struct graphics_priv *next; struct graphics_gc_priv *background_gc; struct callback_list *cbl; struct font_freetype_methods freetype_methods; struct navit *nav; int pid; struct timeval button_press[8]; struct timeval button_release[8]; int timeout; int delay; char *window_title; }; struct graphics_gc_priv { struct graphics_priv *gr; struct color c; double linewidth; double *dashes; int ndashes; double offset; }; struct graphics_image_priv { GdkPixbuf *pixbuf; int w; int h; #ifdef HAVE_IMLIB2 void *image; #endif }; static void graphics_destroy(struct graphics_priv *gr) { dbg(lvl_debug,"enter parent %p\n",gr->parent); gr->freetype_methods.destroy(); if (!gr->parent) { dbg(lvl_debug,"enter win %p\n",gr->win); if (gr->win) gtk_widget_destroy(gr->win); dbg(lvl_debug,"widget %p\n",gr->widget); if (gr->widget) gtk_widget_destroy(gr->widget); g_free(gr->window_title); } g_free(gr); } static void gc_destroy(struct graphics_gc_priv *gc) { g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->linewidth = w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { int i; g_free(gc->dashes); gc->ndashes=n; gc->offset=offset; if(n) { gc->dashes=g_malloc_n(n, sizeof(double)); for (i=0; idashes[i]=dash_list[i]; } } else { gc->dashes=NULL; } } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->c=*c; } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background, }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *gc=g_new(struct graphics_gc_priv, 1); *meth=gc_methods; gc->gr=gr; gc->linewidth=1; gc->c.r=0; gc->c.g=0; gc->c.b=0; gc->c.a=0; gc->dashes=NULL; gc->ndashes=0; gc->offset=0; return gc; } static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) { GdkPixbuf *pixbuf; struct graphics_image_priv *ret; const char *option; if (!strcmp(name,"buffer:")) { struct graphics_image_buffer *buffer=(struct graphics_image_buffer *)name; GdkPixbufLoader *loader=gdk_pixbuf_loader_new(); if (!loader) return NULL; if (*w != -1 || *h != -1) gdk_pixbuf_loader_set_size(loader, *w, *h); gdk_pixbuf_loader_write(loader, buffer->start, buffer->len, NULL); gdk_pixbuf_loader_close(loader, NULL); pixbuf=gdk_pixbuf_loader_get_pixbuf(loader); g_object_ref(pixbuf); g_object_unref(loader); } else { if (*w == -1 && *h == -1) pixbuf=gdk_pixbuf_new_from_file(name, NULL); else pixbuf=gdk_pixbuf_new_from_file_at_size(name, *w, *h, NULL); } if (!pixbuf) return NULL; if (rotation) { GdkPixbuf *tmp; switch (rotation) { case 90: rotation=270; break; case 180: break; case 270: rotation=90; break; default: return NULL; } tmp=gdk_pixbuf_rotate_simple(pixbuf, rotation); if (!tmp) { g_object_unref(pixbuf); return NULL; } g_object_unref(pixbuf); pixbuf=tmp; } ret=g_new0(struct graphics_image_priv, 1); ret->pixbuf=pixbuf; ret->w=gdk_pixbuf_get_width(pixbuf); ret->h=gdk_pixbuf_get_height(pixbuf); *w=ret->w; *h=ret->h; if (hot) { option=gdk_pixbuf_get_option(pixbuf, "x_hot"); if (option) hot->x=atoi(option); else hot->x=ret->w/2-1; option=gdk_pixbuf_get_option(pixbuf, "y_hot"); if (option) hot->y=atoi(option); else hot->y=ret->h/2-1; } return ret; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { g_object_unref(priv->pixbuf); g_free(priv); } static void set_drawing_color(cairo_t *cairo, struct color c) { double col_max = 1<c); cairo_set_dash(cairo, gc->dashes, gc->ndashes, gc->offset); cairo_set_line_width(cairo, gc->linewidth); } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int i; if (!count) return; cairo_move_to(gr->cairo, p[0].x, p[0].y); for (i=1; icairo, p[i].x, p[i].y); } set_stroke_params_from_gc(gr->cairo, gc); cairo_stroke(gr->cairo); } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int i; set_drawing_color(gr->cairo, gc->c); cairo_move_to(gr->cairo, p[0].x, p[0].y); for (i=1; icairo, p[i].x, p[i].y); } cairo_fill(gr->cairo); } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { cairo_save(gr->cairo); // Use OPERATOR_SOURCE to overwrite old contents even when drawing with transparency. // Necessary for OSD drawing. cairo_set_operator(gr->cairo, CAIRO_OPERATOR_SOURCE); cairo_rectangle(gr->cairo, p->x, p->y, w, h); set_drawing_color(gr->cairo, gc->c); cairo_fill(gr->cairo); cairo_restore(gr->cairo); } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { cairo_arc (gr->cairo, p->x, p->y, r/2, 0.0, 2*M_PI); set_stroke_params_from_gc(gr->cairo, gc); cairo_stroke(gr->cairo); } static void draw_rgb_image_buffer(cairo_t *cairo, int buffer_width, int buffer_height, int draw_pos_x, int draw_pos_y, int stride, unsigned char *buffer) { cairo_surface_t *buffer_surface = cairo_image_surface_create_for_data( buffer, CAIRO_FORMAT_ARGB32, buffer_width, buffer_height, stride); cairo_set_source_surface(cairo, buffer_surface, draw_pos_x, draw_pos_y); cairo_paint(cairo); cairo_surface_destroy(buffer_surface); } static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct point *p) { int i,x,y,stride; struct font_freetype_glyph *g, **gp; struct color transparent={0x0,0x0,0x0,0x0}; gp=text->glyph; i=text->glyph_count; x=p->x << 6; y=p->y << 6; while (i-- > 0) { g=*gp++; if (g->w && g->h && bg ) { unsigned char *shadow; stride=cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, g->w+2); shadow=g_malloc(stride*(g->h+2)); gr->freetype_methods.get_shadow(g, shadow, stride, &bg->c, &transparent); draw_rgb_image_buffer(gr->cairo, g->w+2, g->h+2, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, stride, shadow); g_free(shadow); } x+=g->dx; y+=g->dy; } x=p->x << 6; y=p->y << 6; gp=text->glyph; i=text->glyph_count; while (i-- > 0) { g=*gp++; if (g->w && g->h) { unsigned char *glyph; stride=cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, g->w); glyph=g_malloc(stride*g->h); gr->freetype_methods.get_glyph(g, glyph, stride, &fg->c, bg?&bg->c:&transparent, &transparent); draw_rgb_image_buffer(gr->cairo, g->w, g->h, (x+g->x)>>6, (y+g->y)>>6, stride, glyph); g_free(glyph); } x+=g->dx; y+=g->dy; } } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { struct font_freetype_text *t; if (! font) { dbg(lvl_error,"no font, returning\n"); return; } #if 0 /* Temporarily disabled because it destroys text rendering of overlays and in gui internal in some places */ /* This needs an improvement, no one checks if the strings are visible */ if (p->x > gr->width-50 || p->y > gr->height-50) { return; } if (p->x < -50 || p->y < -50) { return; } #endif if (bg && !bg->c.a) bg=NULL; t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); display_text_draw(t, gr, fg, bg, p); gr->freetype_methods.text_destroy(t); } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { gdk_cairo_set_source_pixbuf(gr->cairo, img->pixbuf, p->x, p->y); cairo_paint(gr->cairo); } static unsigned char* create_buffer_with_stride_if_required(unsigned char *input_buffer, int w, int h, size_t bytes_per_pixel, size_t output_stride) { int line; size_t input_offset, output_offset; unsigned char *out_buf; size_t input_stride = w*bytes_per_pixel; if (input_stride == output_stride) { return NULL; } out_buf = g_malloc(h*output_stride); for (line = 0; line < h; line++) { input_offset = line*input_stride; output_offset = line*output_stride; memcpy(out_buf+output_offset, input_buffer+input_offset, input_stride); } return out_buf; } #ifdef HAVE_IMLIB2 static void draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img) { int w,h; DATA32 *intermediate_buffer; unsigned char* intermediate_buffer_aligned; Imlib_Image intermediate_image; size_t stride; dbg(lvl_debug,"draw_image_warp data=%p\n", img); w = img->w; h = img->h; if (!img->image) { int x,y; img->image=imlib_create_image(w, h); imlib_context_set_image(img->image); if (gdk_pixbuf_get_colorspace(img->pixbuf) != GDK_COLORSPACE_RGB || gdk_pixbuf_get_bits_per_sample(img->pixbuf) != 8) { dbg(lvl_error,"implement me\n"); } else if (gdk_pixbuf_get_has_alpha(img->pixbuf) && gdk_pixbuf_get_n_channels(img->pixbuf) == 4) { for (y=0 ; y < h ; y++) { unsigned int *dst=imlib_image_get_data()+y*w; unsigned char *src=gdk_pixbuf_get_pixels(img->pixbuf)+y*gdk_pixbuf_get_rowstride(img->pixbuf); for (x=0 ; x < w ; x++) { *dst++=0xff000000|(src[0] << 16)|(src[1] << 8)|src[2]; src+=4; } } } else if (!gdk_pixbuf_get_has_alpha(img->pixbuf) && gdk_pixbuf_get_n_channels(img->pixbuf) == 3) { for (y=0 ; y < h ; y++) { unsigned int *dst=imlib_image_get_data()+y*w; unsigned char *src=gdk_pixbuf_get_pixels(img->pixbuf)+y*gdk_pixbuf_get_rowstride(img->pixbuf); for (x=0 ; x < w ; x++) { *dst++=0xff000000|(src[0] << 16)|(src[1] << 8)|src[2]; src+=3; } } } else { dbg(lvl_error,"implement me\n"); } } intermediate_buffer = g_malloc0(gr->width*gr->height*4); intermediate_image = imlib_create_image_using_data(gr->width, gr->height, intermediate_buffer); imlib_context_set_image(intermediate_image); imlib_image_set_has_alpha(1); if (count == 3) { /* 0 1 2 */ imlib_blend_image_onto_image_skewed(img->image, 1, 0, 0, w, h, p[0].x, p[0].y, p[1].x-p[0].x, p[1].y-p[0].y, p[2].x-p[0].x, p[2].y-p[0].y); } if (count == 2) { /* 0 1 */ imlib_blend_image_onto_image_skewed(img->image, 1, 0, 0, w, h, p[0].x, p[0].y, p[1].x-p[0].x, 0, 0, p[1].y-p[0].y); } if (count == 1) { /* 0 */ imlib_blend_image_onto_image_skewed(img->image, 1, 0, 0, w, h, p[0].x-w/2, p[0].y-h/2, w, 0, 0, h); } stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, gr->width); intermediate_buffer_aligned = create_buffer_with_stride_if_required( (unsigned char* )intermediate_buffer, gr->width, gr->height, sizeof(DATA32), stride); cairo_surface_t *buffer_surface = cairo_image_surface_create_for_data( intermediate_buffer_aligned ? intermediate_buffer_aligned : (unsigned char*)intermediate_buffer, CAIRO_FORMAT_ARGB32, gr->width, gr->height, stride); cairo_set_source_surface(gr->cairo, buffer_surface, 0, 0); cairo_paint(gr->cairo); cairo_surface_destroy(buffer_surface); imlib_free_image(); g_free(intermediate_buffer); g_free(intermediate_buffer_aligned); } #endif static void overlay_rect(struct graphics_priv *parent, struct graphics_priv *overlay, GdkRectangle *r) { r->x=overlay->p.x; r->y=overlay->p.y; r->width=overlay->width; r->height=overlay->height; if (!overlay->wraparound) return; if (r->x < 0) r->x += parent->width; if (r->y < 0) r->y += parent->height; if (r->width < 0) r->width += parent->width; if (r->height < 0) r->height += parent->height; } static void overlay_draw(struct graphics_priv *parent, struct graphics_priv *overlay, GdkRectangle *re, cairo_t *cairo) { GdkRectangle or, ir; if (parent->overlay_disabled || overlay->overlay_disabled || overlay->overlay_autodisabled) return; overlay_rect(parent, overlay, &or); if (! gdk_rectangle_intersect(re, &or, &ir)) return; or.x-=re->x; or.y-=re->y; cairo_surface_t *overlay_surface = cairo_get_target(overlay->cairo); cairo_set_source_surface(cairo, overlay_surface, or.x, or.y); cairo_paint(cairo); } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (p) gr->p=*p; else { gr->p.x=0; gr->p.y=0; } } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background_gc=gc; } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { if (mode == draw_mode_end) { // Just invalidate the whole window. We could only the invalidate the area of // graphics_priv, but that is probably not significantly faster. gdk_window_invalidate_rect(gr->widget->window, NULL, TRUE); } } /* Events */ static gint configure(GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) { struct graphics_priv *gra=user_data; if (! gra->visible) return TRUE; #ifndef _WIN32 dbg(lvl_debug,"window=%lu\n", GDK_WINDOW_XID(widget->window)); #endif gra->width=widget->allocation.width; gra->height=widget->allocation.height; cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, gra->width, gra->height); if (gra->cairo) cairo_destroy(gra->cairo); gra->cairo = cairo_create(surface); cairo_surface_destroy(surface); cairo_set_antialias (gra->cairo, CAIRO_ANTIALIAS_GOOD); callback_list_call_attr_2(gra->cbl, attr_resize, GINT_TO_POINTER(gra->width), GINT_TO_POINTER(gra->height)); return TRUE; } static gint expose(GtkWidget * widget, GdkEventExpose * event, gpointer user_data) { struct graphics_priv *gra=user_data; struct graphics_gc_priv *background_gc=gra->background_gc; struct graphics_priv *overlay; gra->visible=1; if (! gra->cairo) configure(widget, NULL, user_data); cairo_t *cairo=gdk_cairo_create(widget->window); if (gra->p.x || gra->p.y) { set_drawing_color(cairo, background_gc->c); cairo_paint(cairo); } cairo_set_source_surface(cairo, cairo_get_target(gra->cairo), gra->p.x, gra->p.y); cairo_paint(cairo); overlay = gra->overlays; while (overlay) { overlay_draw(gra,overlay,&event->area,cairo); overlay=overlay->next; } cairo_destroy(cairo); return FALSE; } static int tv_delta(struct timeval *old, struct timeval *new) { if (new->tv_sec-old->tv_sec >= INT_MAX/1000) return INT_MAX; return (new->tv_sec-old->tv_sec)*1000+(new->tv_usec-old->tv_usec)/1000; } static gint button_press(GtkWidget * widget, GdkEventButton * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); if (event->button < 8) { if (tv_delta(&this->button_press[event->button], &tv) < this->timeout) return FALSE; this->button_press[event->button]= tv; this->button_release[event->button].tv_sec=0; this->button_release[event->button].tv_usec=0; } p.x=event->x; p.y=event->y; callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER(event->button), (void *)&p); return FALSE; } static gint button_release(GtkWidget * widget, GdkEventButton * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); if (event->button < 8) { if (tv_delta(&this->button_release[event->button], &tv) < this->timeout) return FALSE; this->button_release[event->button]= tv; this->button_press[event->button].tv_sec=0; this->button_press[event->button].tv_usec=0; } p.x=event->x; p.y=event->y; callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER(event->button), (void *)&p); return FALSE; } static gint scroll(GtkWidget * widget, GdkEventScroll * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; int button; p.x=event->x; p.y=event->y; switch (event->direction) { case GDK_SCROLL_UP: button=4; break; case GDK_SCROLL_DOWN: button=5; break; default: button=-1; break; } if (button != -1) { callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER(button), (void *)&p); callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER(button), (void *)&p); } return FALSE; } static gint motion_notify(GtkWidget * widget, GdkEventMotion * event, gpointer user_data) { struct graphics_priv *this=user_data; struct point p; p.x=event->x; p.y=event->y; callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); return FALSE; } /* * * * Exit navit (X pressed) * * @param widget active widget * * @param event the event (delete_event) * * @param user_data Pointer to private data structure * * @returns TRUE * */ static gint delete(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { struct graphics_priv *this=user_data; dbg(lvl_debug,"enter this->win=%p\n",this->win); if (this->delay & 2) { if (this->win) this->win=NULL; } else { callback_list_call_attr_0(this->cbl, attr_window_closed); } return TRUE; } static gint keypress(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { struct graphics_priv *this=user_data; int len,ucode; char key[8]; ucode=gdk_keyval_to_unicode(event->keyval); len=g_unichar_to_utf8(ucode, key); key[len]='\0'; switch (event->keyval) { case GDK_Up: key[0]=NAVIT_KEY_UP; key[1]='\0'; break; case GDK_Down: key[0]=NAVIT_KEY_DOWN; key[1]='\0'; break; case GDK_Left: key[0]=NAVIT_KEY_LEFT; key[1]='\0'; break; case GDK_Right: key[0]=NAVIT_KEY_RIGHT; key[1]='\0'; break; case GDK_BackSpace: key[0]=NAVIT_KEY_BACKSPACE; key[1]='\0'; break; case GDK_Tab: key[0]='\t'; key[1]='\0'; break; case GDK_Delete: key[0]=NAVIT_KEY_DELETE; key[1]='\0'; break; case GDK_Escape: key[0]=NAVIT_KEY_BACK; key[1]='\0'; break; case GDK_Return: case GDK_KP_Enter: key[0]=NAVIT_KEY_RETURN; key[1]='\0'; break; case GDK_Book: #ifdef USE_HILDON case GDK_F7: #endif key[0]=NAVIT_KEY_ZOOM_IN; key[1]='\0'; break; case GDK_Calendar: #ifdef USE_HILDON case GDK_F8: #endif key[0]=NAVIT_KEY_ZOOM_OUT; key[1]='\0'; break; case GDK_Page_Up: key[0]=NAVIT_KEY_PAGE_UP; key[1]='\0'; break; case GDK_Page_Down: key[0]=NAVIT_KEY_PAGE_DOWN; key[1]='\0'; break; } if (key[0]) callback_list_call_attr_1(this->cbl, attr_keypress, (void *)key); else dbg(lvl_debug,"keyval 0x%x\n", event->keyval); return FALSE; } static struct graphics_priv *graphics_gtk_drawing_area_new_helper(struct graphics_methods *meth); static void overlay_disable(struct graphics_priv *gr, int disabled) { if (!gr->overlay_disabled != !disabled) { gr->overlay_disabled=disabled; if (gr->parent) { GdkRectangle r; overlay_rect(gr->parent, gr, &r); gdk_window_invalidate_rect(gr->parent->widget->window, &r, TRUE); } } } static void overlay_resize(struct graphics_priv *this, struct point *p, int w, int h, int wraparound) { //do not dereference parent for non overlay osds if(!this->parent) { return; } int changed = 0; int w2,h2; if (w == 0) { w2 = 1; } else { w2 = w; } if (h == 0) { h2 = 1; } else { h2 = h; } this->p = *p; if (this->width != w2) { this->width = w2; changed = 1; } if (this->height != h2) { this->height = h2; changed = 1; } this->wraparound = wraparound; if (changed) { cairo_destroy(this->cairo); cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w2, h2); this->cairo=cairo_create(surface); cairo_surface_destroy(surface); if ((w == 0) || (h == 0)) { this->overlay_autodisabled = 1; } else { this->overlay_autodisabled = 0; } callback_list_call_attr_2(this->cbl, attr_resize, GINT_TO_POINTER(this->width), GINT_TO_POINTER(this->height)); } } static void get_data_window(struct graphics_priv *this, unsigned int xid) { if (!xid) this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); else this->win = gtk_plug_new(xid); if (!gtk_widget_get_parent(this->widget)) gtk_widget_ref(this->widget); gtk_window_set_default_size(GTK_WINDOW(this->win), this->win_w, this->win_h); dbg(lvl_debug,"h= %i, w= %i\n",this->win_h, this->win_w); gtk_window_set_title(GTK_WINDOW(this->win), this->window_title); gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", this->window_title); gtk_widget_realize(this->win); if (gtk_widget_get_parent(this->widget)) gtk_widget_reparent(this->widget, this->win); else gtk_container_add(GTK_CONTAINER(this->win), this->widget); gtk_widget_show_all(this->win); GTK_WIDGET_SET_FLAGS (this->widget, GTK_CAN_FOCUS); gtk_widget_set_sensitive(this->widget, TRUE); gtk_widget_grab_focus(this->widget); g_signal_connect(G_OBJECT(this->widget), "key-press-event", G_CALLBACK(keypress), this); g_signal_connect(G_OBJECT(this->win), "delete_event", G_CALLBACK(delete), this); } static int set_attr(struct graphics_priv *gr, struct attr *attr) { dbg(lvl_debug,"enter\n"); switch (attr->type) { case attr_windowid: get_data_window(gr, attr->u.num); return 1; default: return 0; } } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound) { int w2,h2; struct graphics_priv *this=graphics_gtk_drawing_area_new_helper(meth); this->widget=gr->widget; this->p=*p; this->width=w; this->height=h; this->parent=gr; /* If either height or width is 0, we set it to 1 to avoid warnings, and * disable the overlay. */ if (h == 0) { h2 = 1; } else { h2 = h; } if (w == 0) { w2 = 1; } else { w2 = w; } cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w2, h2); this->cairo=cairo_create(surface); cairo_surface_destroy(surface); if ((w == 0) || (h == 0)) { this->overlay_autodisabled = 1; } else { this->overlay_autodisabled = 0; } this->next=gr->overlays; this->wraparound=wraparound; gr->overlays=this; return this; } static int gtk_argc; static char **gtk_argv={NULL}; static int graphics_gtk_drawing_area_fullscreen(struct window *w, int on) { struct graphics_priv *gr=w->priv; if (on) gtk_window_fullscreen(GTK_WINDOW(gr->win)); else gtk_window_unfullscreen(GTK_WINDOW(gr->win)); return 1; } static void graphics_gtk_drawing_area_disable_suspend(struct window *w) { struct graphics_priv *gr=w->priv; #ifndef _WIN32 if (gr->pid) kill(gr->pid, SIGWINCH); #else dbg(lvl_warning, "failed to kill() under Windows\n"); #endif } static void * get_data(struct graphics_priv *this, char const *type) { FILE *f; if (!strcmp(type,"gtk_widget")) return this->widget; #ifndef _WIN32 if (!strcmp(type,"xwindow_id")) return (void *)GDK_WINDOW_XID(this->win ? this->win->window : this->widget->window); #endif if (!strcmp(type,"window")) { char *cp = getenv("NAVIT_XID"); unsigned xid = 0; if (cp) xid = strtol(cp, NULL, 0); if (!(this->delay & 1)) get_data_window(this, xid); this->window.fullscreen=graphics_gtk_drawing_area_fullscreen; this->window.disable_suspend=graphics_gtk_drawing_area_disable_suspend; this->window.priv=this; #if !defined(_WIN32) && !defined(__CEGCC__) f=popen("pidof /usr/bin/ipaq-sleep","r"); if (f) { fscanf(f,"%d",&this->pid); dbg(lvl_debug,"ipaq_sleep pid=%d\n", this->pid); pclose(f); } #endif return &this->window; } return NULL; } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, #ifdef HAVE_IMLIB2 draw_image_warp, #else NULL, #endif draw_drag, NULL, /* font_new */ gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, /* get_text_bbox */ overlay_disable, overlay_resize, set_attr, }; static struct graphics_priv * graphics_gtk_drawing_area_new_helper(struct graphics_methods *meth) { struct font_priv * (*font_freetype_new)(void *meth); font_freetype_new=plugin_get_font_type("freetype"); if (!font_freetype_new) return NULL; struct graphics_priv *this=g_new0(struct graphics_priv,1); font_freetype_new(&this->freetype_methods); *meth=graphics_methods; meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))this->freetype_methods.font_new; meth->get_text_bbox=(void(*)(struct graphics_priv*, struct graphics_font_priv *, char *, int, int, struct point *, int))this->freetype_methods.get_text_bbox; return this; } static struct graphics_priv * graphics_gtk_drawing_area_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { int i; GtkWidget *draw; struct attr *attr; if (! event_request_system("glib","graphics_gtk_drawing_area_new")) return NULL; draw=gtk_drawing_area_new(); struct graphics_priv *this=graphics_gtk_drawing_area_new_helper(meth); this->nav = nav; this->widget=draw; this->win_w=792; if ((attr=attr_search(attrs, NULL, attr_w))) this->win_w=attr->u.num; this->win_h=547; if ((attr=attr_search(attrs, NULL, attr_h))) this->win_h=attr->u.num; this->timeout=100; if ((attr=attr_search(attrs, NULL, attr_timeout))) this->timeout=attr->u.num; this->delay=0; if ((attr=attr_search(attrs, NULL, attr_delay))) this->delay=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_window_title))) this->window_title=g_strdup(attr->u.str); else this->window_title=g_strdup("Navit"); this->cbl=cbl; gtk_widget_set_events(draw, GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_KEY_PRESS_MASK); g_signal_connect(G_OBJECT(draw), "expose_event", G_CALLBACK(expose), this); g_signal_connect(G_OBJECT(draw), "configure_event", G_CALLBACK(configure), this); g_signal_connect(G_OBJECT(draw), "button_press_event", G_CALLBACK(button_press), this); g_signal_connect(G_OBJECT(draw), "button_release_event", G_CALLBACK(button_release), this); g_signal_connect(G_OBJECT(draw), "scroll_event", G_CALLBACK(scroll), this); g_signal_connect(G_OBJECT(draw), "motion_notify_event", G_CALLBACK(motion_notify), this); g_signal_connect(G_OBJECT(draw), "delete_event", G_CALLBACK(delete), nav); for (i = 0; i < 8; i++) { this->button_press[i].tv_sec = 0; this->button_press[i].tv_usec = 0; this->button_release[i].tv_sec = 0; this->button_release[i].tv_usec = 0; } return this; } void plugin_init(void) { gtk_init(>k_argc, >k_argv); gtk_set_locale(); #ifdef HAVE_API_WIN32 setlocale(LC_NUMERIC, "C"); /* WIN32 gtk resets LC_NUMERIC */ #endif plugin_register_graphics_type("gtk_drawing_area", graphics_gtk_drawing_area_new); } navit-0.5.0+dfsg.1/navit/graphics/null/000077500000000000000000000000001264204753600176175ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/null/CMakeLists.txt000066400000000000000000000000621264204753600223550ustar00rootroot00000000000000module_add_library(graphics_null graphics_null.c) navit-0.5.0+dfsg.1/navit/graphics/null/Makefile.am000066400000000000000000000005271264204753600216570ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_null if PLUGINS modulegraphics_LTLIBRARIES = libgraphics_null.la else noinst_LTLIBRARIES = libgraphics_null.la endif libgraphics_null_la_SOURCES = graphics_null.c libgraphics_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/graphics/null/graphics_null.c000066400000000000000000000172151264204753600226230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include "item.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "event.h" #include "debug.h" #include "window.h" #include "callback.h" #if defined(WINDOWS) || defined(WIN32) || defined (HAVE_API_WIN32_CE) #include # define sleep(i) Sleep(i * 1000) #endif static struct callback_list* callbacks; static struct graphics_priv { int dummy; } graphics_priv; static struct graphics_font_priv { int dummy; } graphics_font_priv; static struct graphics_gc_priv { int dummy; } graphics_gc_priv; static struct graphics_image_priv { int dummy; } graphics_image_priv; static void graphics_destroy(struct graphics_priv *gr) { } static void font_destroy(struct graphics_font_priv *font) { } static struct graphics_font_methods font_methods = { font_destroy }; static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) { *meth=font_methods; return &graphics_font_priv; } static void gc_destroy(struct graphics_gc_priv *gc) { } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { *meth=gc_methods; return &graphics_gc_priv; } static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { return &graphics_image_priv; } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { } static void draw_drag(struct graphics_priv *gr, struct point *p) { } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); static void resize_callback(int w, int h) { callback_list_call_attr_2(callbacks, attr_resize, GINT_TO_POINTER(1), GINT_TO_POINTER(1)); } static int graphics_null_fullscreen(struct window *w, int on) { return 1; } static void graphics_null_disable_suspend(struct window *w) { } static void * get_data(struct graphics_priv *this, char const *type) { if (strcmp(type, "window") == 0) { struct window *win; win = g_new0(struct window, 1); win->priv = this; win->fullscreen = graphics_null_fullscreen; win->disable_suspend = graphics_null_disable_suspend; resize_callback(1,1); return win; } return NULL; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { } static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) { } static void overlay_disable(struct graphics_priv *gr, int disable) { } static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound) { } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, NULL, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data, image_free, get_text_bbox, overlay_disable, overlay_resize, }; static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound) { *meth=graphics_methods; return &graphics_priv; } static struct graphics_priv * graphics_null_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct attr *event_loop_system = NULL; *meth=graphics_methods; event_loop_system = attr_search(attrs, NULL, attr_event_loop_system); if (event_loop_system && event_loop_system->u.str) { dbg(lvl_debug, "event_system is %s\n", event_loop_system->u.str); if (!event_request_system(event_loop_system->u.str, "graphics_null")) return NULL; } else { if (!event_request_system("null", "graphics_null")) return NULL; } callbacks = cbl; resize_callback(1,1); return &graphics_priv; } static void event_null_main_loop_run(void) { dbg(lvl_debug,"enter\n"); for (;;) sleep(1); } static void event_null_main_loop_quit(void) { dbg(lvl_debug,"enter\n"); } static struct event_watch * event_null_add_watch(int h, enum event_watch_cond cond, struct callback *cb) { dbg(lvl_debug,"enter\n"); return NULL; } static void event_null_remove_watch(struct event_watch *ev) { dbg(lvl_debug,"enter\n"); } static struct event_timeout * event_null_add_timeout(int timeout, int multi, struct callback *cb) { dbg(lvl_debug,"enter\n"); return NULL; } static void event_null_remove_timeout(struct event_timeout *to) { dbg(lvl_debug,"enter\n"); } static struct event_idle * event_null_add_idle(int priority, struct callback *cb) { dbg(lvl_debug,"enter\n"); return NULL; } static void event_null_remove_idle(struct event_idle *ev) { dbg(lvl_debug,"enter\n"); } static void event_null_call_callback(struct callback_list *cb) { dbg(lvl_debug,"enter\n"); } static struct event_methods event_null_methods = { event_null_main_loop_run, event_null_main_loop_quit, event_null_add_watch, event_null_remove_watch, event_null_add_timeout, event_null_remove_timeout, event_null_add_idle, event_null_remove_idle, event_null_call_callback, }; static struct event_priv * event_null_new(struct event_methods *meth) { *meth=event_null_methods; return NULL; } void plugin_init(void) { plugin_register_graphics_type("null", graphics_null_new); plugin_register_event_type("null", event_null_new); } navit-0.5.0+dfsg.1/navit/graphics/opengl/000077500000000000000000000000001264204753600201315ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/opengl/CMakeLists.txt000066400000000000000000000003531264204753600226720ustar00rootroot00000000000000set(graphics_opengl_SOURCES graphics_opengl.c) if (USE_OPENGLES) LIST(APPEND graphics_opengl_SOURCES graphics_opengl_x11.c graphics_opengl_egl.c) endif (USE_OPENGLES) module_add_library(graphics_opengl ${graphics_opengl_SOURCES}) navit-0.5.0+dfsg.1/navit/graphics/opengl/Makefile.am000066400000000000000000000005401264204753600221640ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @OPENGL_CFLAGS@ @GLC_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_opengl modulegraphics_LTLIBRARIES = libgraphics_opengl.la libgraphics_opengl_la_SOURCES = graphics_opengl.c libgraphics_opengl_la_LIBADD = @OPENGL_LIBS@ @GLC_LIBS@ libgraphics_opengl_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/graphics/opengl/graphics_opengl.c000066400000000000000000001227511264204753600234510ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define USE_FLOAT 0 #define REQUIRES_POWER_OF_2 0 #include #include #include #include #include #include "item.h" #include "attr.h" #include "config.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "event.h" #include "debug.h" #include "callback.h" #include "keys.h" #include "window.h" #include "navit/font/freetype/font_freetype.h" #include "graphics_opengl.h" #if defined(WINDOWS) || defined(WIN32) #define PIXEL_FORMAT GL_RGBA #include # define sleep(i) Sleep(i * 1000) #else #define PIXEL_FORMAT GL_BGRA #endif #if HAVE_FREEIMAGE #include #endif #ifdef USE_OPENGLES #ifdef USE_OPENGLES2 #include #include #undef USE_FLOAT #define USE_FLOAT 1 #else #include #include #endif #ifdef USE_GLUT_FOR_OPENGLES #define APIENTRY #define GLU_TESS_BEGIN 100100 #define GLU_TESS_VERTEX 100101 #define GLU_TESS_END 100102 #define GLU_TESS_COMBINE 100105 typedef struct GLUtesselator GLUtesselator; typedef double GLdouble; #endif #else #define glOrthof glOrtho #undef USE_FLOAT #define USE_FLOAT 1 #ifdef __APPLE__ #include #else #include /* glut.h includes gl.h and glu.h */ #endif #endif #if USE_FLOAT #define glF(x) x #define glD(x) x #define GL_F GL_FLOAT typedef GLfloat GLf; #else #define glF(x) ((GLfixed)((x)*(1<<16))) #define glD(x) glF(x) #define GL_F GL_FIXED typedef GLfixed GLf; #define glClearColor glClearColorx #define glTranslatef glTranslatex #define glRotatef glRotatex #define glMaterialfv glMaterialxv #define glMaterialf glMaterialx #define glOrthof glOrthox #define glScalef glScalex #define glColor4f glColor4x #endif #ifdef FREEGLUT #include #endif #define SCREEN_WIDTH 700 #define SCREEN_HEIGHT 700 //#define MIRRORED_VIEW 1 struct graphics_gc_priv { struct graphics_priv *gr; float fr, fg, fb, fa; float br, bg, bb, ba; int linewidth; unsigned char *dash_list; int dash_count; int dash_mask; } graphics_gc_priv; struct graphics_priv { int button_timeout; struct point p; int width; int height; int library_init; int visible; int overlay_enabled; int overlay_autodisabled; int wraparound; struct graphics_priv *parent; struct graphics_priv *overlays; struct graphics_priv *next; struct graphics_gc_priv *background_gc; enum draw_mode_num mode; void (*resize_callback) (void *data, int w, int h); void *resize_callback_data; void (*motion_callback) (void *data, struct point * p); void *motion_callback_data; void (*button_callback) (void *data, int press, int button, struct point * p); void *button_callback_data; #ifdef USE_OPENGLES GLuint program; GLint mvp_location, position_location, color_location, texture_position_location, use_texture_location, texture_location; #else GLuint DLid; #endif struct callback_list *cbl; struct font_freetype_methods freetype_methods; struct navit *nav; int timeout; int delay; struct window window; int dirty; //display needs to be redrawn (draw on root graphics or overlay is done) int force_redraw; //display needs to be redrawn (draw on root graphics or overlay is done) time_t last_refresh_time; //last display refresh time struct graphics_opengl_window_system *window_system; struct graphics_opengl_window_system_methods *window_system_methods; struct graphics_opengl_platform *platform; struct graphics_opengl_platform_methods *platform_methods; }; static struct graphics_priv *graphics_priv_root; struct graphics_image_priv { int w; int h; int hot_x; int hot_y; unsigned char *data; char *path; } graphics_image_priv; struct mouse_event_queue_element { int button; int state; int x; int y; }; static const int mouse_event_queue_size = 100; static int mouse_event_queue_begin_idx = 0; static int mouse_event_queue_end_idx = 0; static struct mouse_event_queue_element mouse_queue[100]; //hastable for uncompressed image data static GHashTable *hImageData; #ifdef USE_OPENGLES #else /* prototypes */ void APIENTRY tessBeginCB(GLenum which); void APIENTRY tessEndCB(void); void APIENTRY tessErrorCB(GLenum errorCode); void APIENTRY tessVertexCB(const GLvoid * data); void APIENTRY tessVertexCB2(const GLvoid * data); void APIENTRY tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out); const char *getPrimitiveType(GLenum type); #endif static struct graphics_priv *graphics_opengl_new_helper(struct graphics_methods *meth); static void display(void); static void resize_callback(int w, int h); #ifdef USE_OPENGLES static void click_notify_do(struct graphics_priv *priv, int button, int state, int x, int y); #endif static void motion_notify_do(struct graphics_priv *priv, int x, int y); static void resize_callback_do(struct graphics_priv *priv, int w, int h); static void glut_close(void); #ifdef USE_OPENGLES2 const char vertex_src [] = " \ attribute vec2 position; \ attribute vec2 texture_position; \ uniform mat4 mvp; \ varying vec2 v_texture_position; \ \ void main() \ { \ v_texture_position=texture_position; \ gl_Position = mvp*vec4(position, 0.0, 1.0); \ } \ "; const char fragment_src [] = " \ uniform lowp vec4 avcolor; \ uniform sampler2D texture; \ uniform bool use_texture; \ varying vec2 v_texture_position; \ void main() \ { \ if (use_texture) { \ gl_FragColor = texture2D(texture, v_texture_position); \ } else { \ gl_FragColor = avcolor; \ } \ } \ "; #endif static void graphics_destroy(struct graphics_priv *gr) { /*FIXME graphics_destroy is never called */ /*TODO add destroy code for image cache(delete entries in hImageData) */ gr->freetype_methods.destroy(); g_free(gr); gr = NULL; } static void gc_destroy(struct graphics_gc_priv *gc) { g_free(gc); gc = NULL; } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->linewidth = w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int width, int offset, unsigned char *dash_list, int n) { int i; const int cOpenglMaskBits = 16; gc->dash_count = n; if (1 == n) { gc->dash_mask = 0; for (i = 0; i < cOpenglMaskBits; ++i) { gc->dash_mask <<= 1; gc->dash_mask |= (i / n) % 2; } } else if (1 < n) { unsigned char *curr = dash_list; int cnt = 0; //dot counter int dcnt = 0; //dash element counter int sum_dash = 0; gc->dash_mask = 0; for (i = 0; i < n; ++i) { sum_dash += dash_list[i]; } //scale dashlist elements to max size if (sum_dash > cOpenglMaskBits) { int num_error[2] = { 0, 0 }; //count elements rounded to 0 for odd(drawn) and even(masked) for compensation double factor = (1.0 * cOpenglMaskBits) / sum_dash; for (i = 0; i < n; ++i) { //calculate dashlist max and largest common denomiator for scaling dash_list[i] *= factor; if (dash_list[i] == 0) { ++dash_list[i]; ++num_error[i % 2]; } else if (0 < num_error[i % 2] && 2 < dash_list[i]) { ++dash_list[i]; --num_error[i % 2]; } } } //calculate mask for (i = 0; i < cOpenglMaskBits; ++i) { gc->dash_mask <<= 1; gc->dash_mask |= 1 - dcnt % 2; ++cnt; if (cnt == *curr) { cnt = 0; ++curr; ++dcnt; if (dcnt == n) { curr = dash_list; } } } } } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->fr = c->r / 65535.0; gc->fg = c->g / 65535.0; gc->fb = c->b / 65535.0; gc->fa = c->a / 65535.0; } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { gc->br = c->r / 65535.0; gc->bg = c->g / 65535.0; gc->bb = c->b / 65535.0; gc->ba = c->a / 65535.0; } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv * gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *gc = g_new0(struct graphics_gc_priv, 1); *meth = gc_methods; gc->gr = gr; gc->linewidth = 1; return gc; } static struct graphics_image_priv image_error; static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { #if HAVE_FREEIMAGE FIBITMAP *image; RGBQUAD aPixel; unsigned char *data; int width, height, i, j; struct graphics_image_priv *gi; //check if image already exists in hashmap struct graphics_image_priv *curr_elem = g_hash_table_lookup(hImageData, path); if (curr_elem == &image_error) { //found but couldn't be loaded return NULL; } else if (curr_elem) { //found and OK -> use hastable entry *w = curr_elem->w; *h = curr_elem->h; hot->x = curr_elem->w / 2 - 1; hot->y = curr_elem->h / 2 - 1; return curr_elem; } else { if (strlen(path) < 4) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } char *ext_str = path + strlen(path) - 3; if (strstr(ext_str, "png") || strstr(path, "PNG")) { if ((image = FreeImage_Load(FIF_PNG, path, 0)) == NULL) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } } else if (strstr(ext_str, "xpm") || strstr(path, "XPM")) { if ((image = FreeImage_Load(FIF_XPM, path, 0)) == NULL) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } } else if (strstr(ext_str, "svg") || strstr(path, "SVG")) { char path_new[256]; snprintf(path_new, strlen(path) - 3, "%s", path); strcat(path_new, "_48_48.png"); if ((image = FreeImage_Load(FIF_PNG, path_new, 0)) == NULL) { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } } else { g_hash_table_insert(hImageData, g_strdup(path), &image_error); return NULL; } if (FreeImage_GetBPP(image) == 64) { FIBITMAP *image2; image2 = FreeImage_ConvertTo32Bits(image); FreeImage_Unload(image); image = image2; } #if FREEIMAGE_MAJOR_VERSION*100+FREEIMAGE_MINOR_VERSION >= 313 if (rotation) { FIBITMAP *image2; image2 = FreeImage_Rotate(image, rotation, NULL); image = image2; } #endif gi = g_new0(struct graphics_image_priv, 1); width = FreeImage_GetWidth(image); height = FreeImage_GetHeight(image); if ((*w != width || *h != height) && 0 < *w && 0 < *h) { FIBITMAP *image2; image2 = FreeImage_Rescale(image, *w, *h, FILTER_BOX); FreeImage_Unload(image); image = image2; width = *w; height = *h; } data = (unsigned char *) malloc(width * height * 4); RGBQUAD *palette = NULL; if (FreeImage_GetBPP(image) == 8) { palette = FreeImage_GetPalette(image); } for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { unsigned char idx; if (FreeImage_GetBPP(image) == 8) { FreeImage_GetPixelIndex(image, j, height - i - 1, &idx); data[4 * width * i + 4 * j + 0] = palette[idx].rgbRed; data[4 * width * i + 4 * j + 1] = palette[idx].rgbGreen; data[4 * width * i + 4 * j + 2] = palette[idx].rgbBlue; data[4 * width * i + 4 * j + 3] = 255; } else if (FreeImage_GetBPP(image) == 16 || FreeImage_GetBPP(image) == 24 || FreeImage_GetBPP(image) == 32) { FreeImage_GetPixelColor(image, j, height - i - 1, &aPixel); int transparent = (aPixel.rgbRed == 0 && aPixel.rgbBlue == 0 && aPixel.rgbGreen == 0); data[4 * width * i + 4 * j + 0] = transparent ? 0 : (aPixel. rgbRed); data[4 * width * i + 4 * j + 1] = (aPixel.rgbGreen); data[4 * width * i + 4 * j + 2] = transparent ? 0 : (aPixel. rgbBlue); data[4 * width * i + 4 * j + 3] = transparent ? 0 : 255; } } } FreeImage_Unload(image); *w = width; *h = height; gi->w = width; gi->h = height; gi->hot_x = width / 2 - 1; gi->hot_y = height / 2 - 1; hot->x = width / 2 - 1; hot->y = height / 2 - 1; gi->data = data; gi->path = path; //add to hashtable g_hash_table_insert(hImageData, g_strdup(path), gi); return gi; } #else dbg(lvl_error,"FreeImage not available - cannot load any images.\n", path); return NULL; #endif } static void set_color(struct graphics_priv *gr, struct graphics_gc_priv *gc) { #ifdef USE_OPENGLES2 GLfloat col[4]; col[0]=gc->fr; col[1]=gc->fg; col[2]=gc->fb; col[3]=1.0; glUniform4fv(gr->color_location, 1, col); #else glColor4f(glF(gc->fr), glF(gc->fg), glF(gc->fb), glF(gc->fa)); #endif } static void draw_array(struct graphics_priv *gr, struct point *p, int count, GLenum mode) { int i; #ifdef USE_OPENGLES GLf x[count*2]; #else glBegin(mode); #endif for (i = 0 ; i < count ; i++) { #ifdef USE_OPENGLES x[i*2]=glF(p[i].x); x[i*2+1]=glF(p[i].y); #else glVertex2f(p[i].x, p[i].y); #endif } #ifdef USE_OPENGLES #ifdef USE_OPENGLES2 glVertexAttribPointer (gr->position_location, 2, GL_FLOAT, 0, 0, x ); #else glVertexPointer(2, GL_F, 0, x); #endif glDrawArrays(mode, 0, count); #else glEnd(); #endif } static void draw_rectangle_do(struct graphics_priv *gr, struct point *p, int w, int h) { struct point pa[4]; pa[0]=pa[1]=pa[2]=pa[3]=*p; pa[0].x+=w; pa[1].x+=w; pa[1].y+=h; pa[3].y+=h; draw_array(gr, pa, 4, GL_TRIANGLE_STRIP); } #ifdef USE_OPENGLES static int next_power2(int x) { int r=1; while (r < x) r*=2; return r; } static void draw_image_es(struct graphics_priv *gr, struct point *p, int w, int h, unsigned char *data) { GLf x[8]; memset(x, 0, sizeof(x)); #if REQUIRES_POWER_OF_2 int w2=next_power2(w); int h2=next_power2(h); int y; if (w2 != w || h2 != h) { char *newpix=g_malloc0(w2*h2*4); for (y=0 ; y < h ; y++) memcpy(newpix+y*w2*4, data+y*w*4, w*4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2, 0, GL_RGBA, GL_UNSIGNED_BYTE, newpix); g_free(newpix); w=w2; h=h2; } else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); #else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); #endif x[0]+=glF(1); x[2]+=glF(1); x[3]+=glF(1); x[7]+=glF(1); #ifdef USE_OPENGLES2 glUniform1i(gr->use_texture_location, 1); glEnableVertexAttribArray(gr->texture_position_location); glVertexAttribPointer (gr->texture_position_location, 2, GL_FLOAT, 0, 0, x ); #else glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glTexCoordPointer(2, GL_F, 0, x); #endif glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); draw_rectangle_do(gr, p, w, h); #ifdef USE_OPENGLES2 glUniform1i(gr->use_texture_location, 0); glDisableVertexAttribArray(gr->texture_position_location); #else glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); #endif glDisable(GL_BLEND); } #endif static void get_overlay_pos(struct graphics_priv *gr, struct point *point_out) { if (gr->parent == NULL) { point_out->x = 0; point_out->y = 0; return; } point_out->x = gr->p.x; if (point_out->x < 0) { point_out->x += gr->parent->width; } point_out->y = gr->p.y; if (point_out->y < 0) { point_out->y += gr->parent->height; } } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } #if !defined(USE_OPENGLES) || defined(USE_OPENGLES2) glLineWidth(gc->linewidth); #endif set_color(gr, gc); graphics_priv_root->dirty = 1; #ifndef USE_OPENGLES if (!gr->parent && 0 < gc->dash_count) { glLineStipple(1, gc->dash_mask); glEnable(GL_LINE_STIPPLE); } #endif draw_array(gr, p, count, GL_LINE_STRIP); #ifndef USE_OPENGLES if (!gr->parent && 0 < gc->dash_count) { glDisable(GL_LINE_STIPPLE); } #endif } #if !defined(USE_OPENGLES) || defined(USE_GLUT_FOR_OPENGLES) static int tess_count; static struct point tess_array[512]; static GLenum tess_type; const char * getPrimitiveType(GLenum type) { char *ret = ""; switch (type) { case 0x0000: ret = "GL_POINTS"; break; case 0x0001: ret = "GL_LINES"; break; case 0x0002: ret = "GL_LINE_LOOP"; break; case 0x0003: ret = "GL_LINE_STRIP"; break; case 0x0004: ret = "GL_TRIANGLES"; break; case 0x0005: ret = "GL_TRIANGLE_STRIP"; break; case 0x0006: ret = "GL_TRIANGLE_FAN"; break; case 0x0007: ret = "GL_QUADS"; break; case 0x0008: ret = "GL_QUAD_STRIP"; break; case 0x0009: ret = "GL_POLYGON"; break; } return ret; } void APIENTRY tessBeginCB(GLenum which) { dbg(lvl_debug, "glBegin( %s );\n", getPrimitiveType(which)); tess_type=which; tess_count=0; } void APIENTRY tessEndCB(void) { dbg(lvl_debug, "glEnd();\n"); draw_array(graphics_priv_root, tess_array, tess_count, tess_type); } void APIENTRY tessVertexCB(const GLvoid * data) { // cast back to double type const GLdouble *ptr = (const GLdouble *) data; dbg(lvl_debug, " glVertex3d();\n"); tess_array[tess_count].x=ptr[0]; tess_array[tess_count].y=ptr[1]; if (tess_count < 511) tess_count++; else dbg(lvl_error,"overflow\n"); } void APIENTRY tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out) { GLdouble *nv = (GLdouble *) malloc(sizeof(GLdouble) * 3); nv[0] = c[0]; nv[1] = c[1]; nv[2] = c[2]; *out = nv; } #endif static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } set_color(gr, gc); graphics_priv_root->dirty = 1; #if defined(USE_OPENGLES) && !defined(USE_GLUT_FOR_OPENGLES) draw_array(gr, p, count, GL_LINE_STRIP); #else GLUtesselator *tess = gluNewTess(); // create a tessellator if (!tess) return; // failed to create tessellation object, return 0 GLdouble quad1[count][3]; int i; for (i = 0; i < count; i++) { quad1[i][0] = (GLdouble) (p[i].x); quad1[i][1] = (GLdouble) (p[i].y); quad1[i][2] = 0; } // register callback functions gluTessCallback(tess, GLU_TESS_BEGIN, (void (APIENTRY *)(void)) tessBeginCB); gluTessCallback(tess, GLU_TESS_END, (void (APIENTRY *)(void)) tessEndCB); // gluTessCallback(tess, GLU_TESS_ERROR, (void (*)(void))tessErrorCB); gluTessCallback(tess, GLU_TESS_VERTEX, (void (APIENTRY *)(void)) tessVertexCB); gluTessCallback(tess, GLU_TESS_COMBINE, (void (APIENTRY *)(void)) tessCombineCB); // tessellate and compile a concave quad into display list // gluTessVertex() takes 3 params: tess object, pointer to vertex coords, // and pointer to vertex data to be passed to vertex callback. // The second param is used only to perform tessellation, and the third // param is the actual vertex data to draw. It is usually same as the second // param, but It can be more than vertex coord, for example, color, normal // and UV coords which are needed for actual drawing. // Here, we are looking at only vertex coods, so the 2nd and 3rd params are // pointing same address. gluTessBeginPolygon(tess, 0); // with NULL data gluTessBeginContour(tess); for (i = 0; i < count; i++) { gluTessVertex(tess, quad1[i], quad1[i]); } gluTessEndContour(tess); gluTessEndPolygon(tess); gluDeleteTess(tess); // delete after tessellation #endif } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } set_color(gr, gc); draw_rectangle_do(gr, p, w, h); graphics_priv_root->dirty = 1; } static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, int color, struct point *p) { int i, x, y, stride; struct font_freetype_glyph *g, **gp; unsigned char *shadow, *glyph; struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 }; struct color black = { fg->fr * 65535, fg->fg * 65535, fg->fb * 65535, fg->fa * 65535 }; struct color white = { 0xffff, 0xffff, 0xffff, 0xffff }; if (bg) { if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) { black.r = 65535; black.g = 65535; black.b = 65535; black.a = 65535; white.r = 0; white.g = 0; white.b = 0; white.a = 65535; } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) { white.r = 65535; white.g = 65535; white.b = 65535; white.a = 65535; black.r = 0; black.g = 0; black.b = 0; black.a = 65535; } else { white.r = bg->fr; white.g = bg->fg; white.b = bg->fb; white.a = bg->fa; } } else { white.r = 0; white.g = 0; white.b = 0; white.a = 0; } gp = text->glyph; i = text->glyph_count; x = p->x << 6; y = p->y << 6; while (i-- > 0) { g = *gp++; if (g->w && g->h && bg) { stride = (g->w + 2) * 4; if (color) { shadow = g_malloc(stride * (g->h + 2)); gr->freetype_methods.get_shadow(g, shadow, stride, &white, &transparent); #ifdef USE_OPENGLES struct point p; p.x=((x + g->x) >> 6)-1; p.y=((y + g->y) >> 6)-1; draw_image_es(gr, &p, g->w+2, g->h+2, shadow); #else #ifdef MIRRORED_VIEW glPixelZoom(-1.0, -1.0); //mirrored mode #else glPixelZoom(1.0, -1.0); #endif glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6); glDrawPixels(g->w + 2, g->h + 2, PIXEL_FORMAT, GL_UNSIGNED_BYTE, shadow); #endif g_free(shadow); } } x += g->dx; y += g->dy; } x = p->x << 6; y = p->y << 6; gp = text->glyph; i = text->glyph_count; while (i-- > 0) { g = *gp++; if (g->w && g->h) { if (color) { stride = g->w; if (bg) { glyph = g_malloc(stride * g->h * 4); gr->freetype_methods.get_glyph(g, glyph, stride * 4, &black, &white, &transparent); #ifdef USE_OPENGLES struct point p; p.x=(x + g->x) >> 6; p.y=(y + g->y) >> 6; draw_image_es(gr, &p, g->w, g->h, glyph); #else #ifdef MIRRORED_VIEW glPixelZoom(-1.0, -1.0); //mirrored mode #else glPixelZoom(1.0, -1.0); #endif glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6); glDrawPixels(g->w, g->h, PIXEL_FORMAT, GL_UNSIGNED_BYTE, glyph); #endif g_free(glyph); } stride *= 4; glyph = g_malloc(stride * g->h); gr->freetype_methods.get_glyph(g, glyph, stride, &black, &white, &transparent); #ifdef USE_OPENGLES struct point p; p.x=(x + g->x) >> 6; p.y=(y + g->y) >> 6; draw_image_es(gr, &p, g->w, g->h, glyph); #else #ifdef MIRRORED_VIEW glPixelZoom(-1.0, -1.0); //mirrored mode #else glPixelZoom(1.0, -1.0); #endif glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6); glDrawPixels(g->w, g->h, PIXEL_FORMAT, GL_UNSIGNED_BYTE, glyph); #endif g_free(glyph); } } x += g->dx; y += g->dy; } } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } struct font_freetype_text *t; int color = 1; if (!font) { dbg(lvl_error, "no font, returning\n"); return; } graphics_priv_root->dirty = 1; t = gr->freetype_methods.text_new(text, (struct font_freetype_font *) font, dx, dy); struct point p_eff; p_eff.x = p->x; p_eff.y = p->y; display_text_draw(t, gr, fg, bg, color, &p_eff); gr->freetype_methods.text_destroy(t); } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { #ifdef USE_OPENGLES draw_image_es(gr, p, img->w, img->h, img->data); #else if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } if (!img || !img->data) { return; } graphics_priv_root->dirty = 1; struct point p_eff; p_eff.x = p->x + img->hot_x; p_eff.y = p->y + img->hot_y; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glRasterPos2d(p_eff.x - img->hot_x, p_eff.y - img->hot_y); glDrawPixels(img->w, img->h, GL_RGBA, GL_UNSIGNED_BYTE, img->data); #endif } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (p) { gr->p.x = p->x; gr->p.y = p->y; } } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background_gc = gc; } static void handle_mouse_queue(void) { #ifdef USE_OPENGLES #else static int locked = 0; if (!locked) { locked = 1; } else { return; } if (mouse_event_queue_begin_idx < mouse_event_queue_end_idx) { if (mouse_queue[mouse_event_queue_begin_idx].button == GLUT_LEFT_BUTTON && mouse_queue[mouse_event_queue_begin_idx].state == GLUT_UP) { struct point p; p.x = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].x; p.y = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].y; graphics_priv_root->force_redraw = 1; callback_list_call_attr_3(graphics_priv_root->cbl, attr_button, (void *) 0, 1, (void *) &p); } else if (mouse_queue[mouse_event_queue_begin_idx]. button == GLUT_LEFT_BUTTON && mouse_queue[mouse_event_queue_begin_idx]. state == GLUT_DOWN) { struct point p; p.x = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].x; p.y = mouse_queue[mouse_event_queue_begin_idx % mouse_event_queue_size].y; graphics_priv_root->force_redraw = 1; callback_list_call_attr_3(graphics_priv_root->cbl, attr_button, (void *) 1, 1, (void *) &p); } ++mouse_event_queue_begin_idx; } locked = 0; #endif } /*draws root graphics and its overlays*/ static int redraw_screen(struct graphics_priv *gr) { #ifdef USE_OPENGLES #else graphics_priv_root->dirty = 0; glCallList(gr->DLid); //display overlays display list struct graphics_priv *overlay; overlay = gr->overlays; while (gr->overlay_enabled && overlay) { if (overlay->overlay_enabled) { glPushMatrix(); struct point p_eff; get_overlay_pos(overlay, &p_eff); glTranslatef(p_eff.x, p_eff.y, 1); glCallList(overlay->DLid); glPopMatrix(); } overlay = overlay->next; } glutSwapBuffers(); #endif return TRUE; } #ifndef USE_OPENGLES /*filters call to redraw in overlay enabled(map) mode*/ static gboolean redraw_filter(gpointer data) { struct graphics_priv *gr = (struct graphics_priv*) data; if (gr->overlay_enabled && gr->dirty) { redraw_screen(gr); } return 0; } #endif static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { if (gr->parent) { //overlay #ifdef USE_OPENGLES #else if (mode == draw_mode_begin) { glNewList(gr->DLid, GL_COMPILE); } if (mode == draw_mode_end) { glEndList(); } #endif } else { //root graphics if (mode == draw_mode_begin) { #ifdef USE_OPENGLES #else glNewList(gr->DLid, GL_COMPILE); #endif } if (mode == draw_mode_end) { #ifdef USE_OPENGLES gr->platform_methods->swap_buffers(gr->platform); #else glEndList(); gr->force_redraw = 1; if (!gr->overlay_enabled || gr->force_redraw) { redraw_screen(gr); } #endif } } gr->mode = mode; } static struct graphics_priv *overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); static int graphics_opengl_fullscreen(struct window *w, int on) { return 1; } static void graphics_opengl_disable_suspend(struct window *w) { } #ifdef USE_OPENGLES2 static GLuint load_shader(const char *shader_source, GLenum type) { GLuint shader = glCreateShader(type); glShaderSource(shader, 1, &shader_source, NULL); glCompileShader(shader); return shader; } #endif static void * get_data(struct graphics_priv *this, const char *type) { /*TODO initialize gtkglext context when type=="gtk_widget" */ if (!strcmp(type, "gtk_widget")) { fprintf(stderr, "Currently GTK gui is not yet supported with opengl graphics driver\n"); return NULL; } if (strcmp(type, "window") == 0) { struct window *win; #ifdef USE_OPENGLES GLuint vertexShader; GLuint fragmentShader; GLuint textures; GLfloat matrix[16]; int i; this->window_system=graphics_opengl_x11_new(NULL, this->width, this->height, 32, &this->window_system_methods); this->platform=graphics_opengl_egl_new(this->window_system_methods->get_display(this->window_system), this->window_system_methods->get_window(this->window_system), &this->platform_methods); this->window_system_methods->set_callbacks(this->window_system, this, resize_callback_do, click_notify_do, motion_notify_do, NULL); resize_callback(this->width,this->height); #if 0 glClearColor ( 0.4 , 0.4 , 0.4 , 1); #endif glClear ( GL_COLOR_BUFFER_BIT ); #ifdef USE_OPENGLES2 this->program=glCreateProgram(); vertexShader = load_shader(vertex_src, GL_VERTEX_SHADER); fragmentShader = load_shader(fragment_src, GL_FRAGMENT_SHADER); glAttachShader(this->program, vertexShader); glAttachShader(this->program, fragmentShader); glLinkProgram(this->program); glUseProgram(this->program); this->mvp_location=glGetUniformLocation(this->program, "mvp"); this->position_location=glGetAttribLocation(this->program, "position"); glEnableVertexAttribArray(this->position_location); this->texture_position_location=glGetAttribLocation(this->program, "texture_position"); this->color_location=glGetUniformLocation(this->program, "avcolor"); this->texture_location=glGetUniformLocation(this->program, "texture"); this->use_texture_location=glGetUniformLocation(this->program, "use_texture"); glUniform1i(this->use_texture_location, 0); glUniform1i(this->texture_location, 0); for (i = 0 ; i < 16 ; i++) matrix[i]=0.0; matrix[0]=2.0/this->width; matrix[5]=-2.0/this->height; matrix[10]=1; matrix[12]=-1; matrix[13]=1; matrix[15]=1; glUniformMatrix4fv(this->mvp_location, 1, GL_FALSE, matrix); #else glEnableClientState(GL_VERTEX_ARRAY); #endif glGenTextures(1, &textures); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #ifndef USE_OPENGLES2 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); #endif #endif win = g_new0(struct window, 1); win->priv = this; win->fullscreen = graphics_opengl_fullscreen; win->disable_suspend = graphics_opengl_disable_suspend; return win; } else { #ifdef USE_OPENGLES return NULL; #else return &this->DLid; #endif } } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { //TODO free image data in hashtable when graphics is destroyed //currently graphics destroy is not called !!! /* g_free(priv->data); priv->data = NULL; g_free(priv); priv = NULL; */ } static void overlay_disable(struct graphics_priv *gr, int disable) { gr->overlay_enabled = !disable; gr->force_redraw = 1; draw_mode(gr, draw_mode_end); } static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound) { int changed = 0; int w2, h2; if (w == 0) { w2 = 1; } else { w2 = w; } if (h == 0) { h2 = 1; } else { h2 = h; } gr->p = *p; if (gr->width != w2) { gr->width = w2; changed = 1; } if (gr->height != h2) { gr->height = h2; changed = 1; } gr->wraparound = wraparound; if (changed) { if ((w == 0) || (h == 0)) { gr->overlay_autodisabled = 1; } else { gr->overlay_autodisabled = 0; } callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->width), GINT_TO_POINTER(gr->height)); } } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, NULL, draw_text, draw_image, NULL, draw_drag, NULL, gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, overlay_disable, overlay_resize, }; static struct graphics_priv * graphics_opengl_new_helper(struct graphics_methods *meth) { struct font_priv *(*font_freetype_new) (void *meth); font_freetype_new = plugin_get_font_type("freetype"); if (!font_freetype_new) { return NULL; } struct graphics_priv *this = g_new0(struct graphics_priv, 1); font_freetype_new(&this->freetype_methods); *meth = graphics_methods; meth->font_new = (struct graphics_font_priv * (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int)) this->freetype_methods.font_new; meth->get_text_bbox = (void (*) (struct graphics_priv *, struct graphics_font_priv *, char *, int, int, struct point*, int)) this->freetype_methods.get_text_bbox; return this; } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound) { struct graphics_priv *this = graphics_opengl_new_helper(meth); this->p = *p; this->width = w; this->height = h; this->parent = gr; if ((w == 0) || (h == 0)) { this->overlay_autodisabled = 1; } else { this->overlay_autodisabled = 0; } this->overlay_enabled = 1; this->overlay_autodisabled = 0; this->next = gr->overlays; gr->overlays = this; #ifdef USE_OPENGLES #else this->DLid = glGenLists(1); #endif return this; } #ifdef USE_OPENGLES static void click_notify_do(struct graphics_priv *priv, int button, int state, int x, int y) { struct point p={x,y}; dbg(lvl_debug,"enter state %d button %d\n",state,button); callback_list_call_attr_3(priv->cbl, attr_button, (void *) state, (void *)button, (void *) &p); } #endif static void click_notify(int button, int state, int x, int y) { mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].button = button; mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].state = state; #ifdef MIRRORED_VIEW mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x = graphics_priv_root->width - x; #else mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x = x; #endif mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].y = y; ++mouse_event_queue_end_idx; } static void motion_notify_do(struct graphics_priv *priv, int x, int y) { struct point p; #ifdef MIRRORED_VIEW p.x = priv->width - x; #else p.x = x; #endif p.y = y; callback_list_call_attr_1(priv->cbl, attr_motion, (void *) &p); return; } static void motion_notify(int x, int y) { motion_notify_do(graphics_priv_root, x, y); } #ifndef USE_OPENGLES static gboolean graphics_opengl_idle(void *data) { static int opengl_init_ok = 0; if (!opengl_init_ok) { callback_list_call_attr_2(graphics_priv_root->cbl, attr_resize, GINT_TO_POINTER (graphics_priv_root->width), GINT_TO_POINTER (graphics_priv_root->height)); opengl_init_ok = 1; } else { #ifdef FREEGLUT glutMainLoopEvent(); #endif handle_mouse_queue(); } return TRUE; } #endif static void ProcessNormalKeys(unsigned char key_in, int x, int y) { int key = 0; char keybuf[2]; switch (key_in) { case 13: key = NAVIT_KEY_RETURN; break; default: key = key_in; break; } keybuf[0] = key; keybuf[1] = '\0'; graphics_priv_root->force_redraw = 1; callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, (void *) keybuf); } static void ProcessSpecialKeys(int key_in, int x, int y) { int key = 0; char keybuf[2]; switch (key_in) { case 102: key = NAVIT_KEY_RIGHT; break; case 100: key = NAVIT_KEY_LEFT; break; case 103: key = NAVIT_KEY_DOWN; break; case 101: key = NAVIT_KEY_UP; break; case 104: key = NAVIT_KEY_ZOOM_OUT; break; case 105: key = NAVIT_KEY_ZOOM_IN; break; default: break; } //switch graphics_priv_root->force_redraw = 1; keybuf[0] = key; keybuf[1] = '\0'; callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, (void *) keybuf); } static void resize_callback_do(struct graphics_priv *priv, int w, int h) { glViewport(0, 0, w, h); #ifndef USE_OPENGLES2 glMatrixMode(GL_PROJECTION); glLoadIdentity(); #ifdef MIRRORED_VIEW glOrthof(glF(w), glF(0), glF(h), glF(0), glF(1), glF(-1)); #else glOrthof(glF(0), glF(w), glF(h), glF(0), glF(1), glF(-1)); #endif #endif priv->width = w; priv->height = h; callback_list_call_attr_2(priv->cbl, attr_resize, GINT_TO_POINTER(w), GINT_TO_POINTER(h)); } static void resize_callback(int w, int h) { resize_callback_do(graphics_priv_root, w, h); } static void display(void) { graphics_priv_root->force_redraw = 1; redraw_screen(graphics_priv_root); resize_callback(graphics_priv_root->width, graphics_priv_root->height); } static void glut_close(void) { callback_list_call_attr_0(graphics_priv_root->cbl, attr_window_closed); } static struct graphics_priv * graphics_opengl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct attr *attr; if (!event_request_system("glib", "graphics_opengl_new")) return NULL; struct graphics_priv *this = graphics_opengl_new_helper(meth); graphics_priv_root = this; this->nav = nav; this->parent = NULL; this->overlay_enabled = 1; this->width = SCREEN_WIDTH; if ((attr = attr_search(attrs, NULL, attr_w))) this->width = attr->u.num; this->height = SCREEN_HEIGHT; if ((attr = attr_search(attrs, NULL, attr_h))) this->height = attr->u.num; this->timeout = 100; if ((attr = attr_search(attrs, NULL, attr_timeout))) this->timeout = attr->u.num; this->delay = 0; if ((attr = attr_search(attrs, NULL, attr_delay))) this->delay = attr->u.num; this->cbl = cbl; char *cmdline = ""; int argc = 0; #ifndef USE_OPENGLES glutInit(&argc, &cmdline); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize(this->width, this->height); glutInitWindowPosition(0, 0); glutCreateWindow("Navit opengl window"); glutDisplayFunc(display); glutReshapeFunc(resize_callback); resize_callback(this->width, this->height); #endif graphics_priv_root->cbl = cbl; graphics_priv_root->width = this->width; graphics_priv_root->height = this->height; #ifndef USE_OPENGLES glutMotionFunc(motion_notify); glutPassiveMotionFunc(motion_notify); glutMouseFunc(click_notify); glutKeyboardFunc(ProcessNormalKeys); glutSpecialFunc(ProcessSpecialKeys); #ifdef FREEGLUT glutCloseFunc(glut_close); #endif this->DLid = glGenLists(1); g_timeout_add(G_PRIORITY_DEFAULT + 10, graphics_opengl_idle, NULL); /*this will only refresh screen in map(overlay enabled) mode */ g_timeout_add(G_PRIORITY_DEFAULT + 1000, redraw_filter, this); #endif //create hash table for uncompressed image data hImageData = g_hash_table_new(g_str_hash, g_str_equal); return this; } static void event_opengl_main_loop_run(void) { dbg(lvl_info, "enter\n"); } static void event_opengl_main_loop_quit(void) { dbg(lvl_debug, "enter\n"); } static struct event_watch * event_opengl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { dbg(lvl_debug, "enter\n"); return NULL; } static void event_opengl_remove_watch(struct event_watch *ev) { dbg(lvl_debug, "enter\n"); } static struct event_timeout * event_opengl_add_timeout(int timeout, int multi, struct callback *cb) { dbg(lvl_debug, "enter\n"); return NULL; } static void event_opengl_remove_timeout(struct event_timeout *to) { dbg(lvl_debug, "enter\n"); } static struct event_idle * event_opengl_add_idle(int priority, struct callback *cb) { dbg(lvl_debug, "enter\n"); return NULL; } static void event_opengl_remove_idle(struct event_idle *ev) { dbg(lvl_debug, "enter\n"); } static void event_opengl_call_callback(struct callback_list *cb) { dbg(lvl_debug, "enter\n"); } static struct event_methods event_opengl_methods = { event_opengl_main_loop_run, event_opengl_main_loop_quit, event_opengl_add_watch, event_opengl_remove_watch, event_opengl_add_timeout, event_opengl_remove_timeout, event_opengl_add_idle, event_opengl_remove_idle, event_opengl_call_callback, }; static struct event_priv * event_opengl_new(struct event_methods *meth) { *meth = event_opengl_methods; return NULL; } void plugin_init(void) { plugin_register_graphics_type("opengl", graphics_opengl_new); plugin_register_event_type("opengl", event_opengl_new); } navit-0.5.0+dfsg.1/navit/graphics/opengl/graphics_opengl.h000066400000000000000000000016031264204753600234460ustar00rootroot00000000000000struct graphics_opengl_window_system; struct graphics_opengl_platform; struct graphics_opengl_window_system_methods { void (*destroy)(struct graphics_opengl_window_system *); void *(*get_display)(struct graphics_opengl_window_system *); void *(*get_window)(struct graphics_opengl_window_system *); void (*set_callbacks)(struct graphics_opengl_window_system *, void *data, void *resize, void *button, void *motion, void *keypress); }; struct graphics_opengl_platform_methods { void (*destroy)(struct graphics_opengl_platform *); void (*swap_buffers)(struct graphics_opengl_platform *); }; struct graphics_opengl_window_system *graphics_opengl_x11_new(void *displayname, int w, int h, int depth, struct graphics_opengl_window_system_methods **methods); struct graphics_opengl_platform *graphics_opengl_egl_new(void *display, void *window, struct graphics_opengl_platform_methods **methods); navit-0.5.0+dfsg.1/navit/graphics/opengl/graphics_opengl_egl.c000066400000000000000000000047451264204753600243020ustar00rootroot00000000000000#include "config.h" #ifdef USE_OPENGLES2 #include #include #else #include #include #endif #include #include "graphics_opengl.h" #include "debug.h" struct graphics_opengl_platform { EGLSurface eglwindow; EGLDisplay egldisplay; EGLConfig config[1]; EGLContext context; }; static EGLint attributeList[] = { EGL_RED_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, #ifdef USE_OPENGLES2 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, #endif EGL_NONE }; EGLint aEGLContextAttributes[] = { #ifdef USE_OPENGLES2 EGL_CONTEXT_CLIENT_VERSION, 2, #endif EGL_NONE }; static void graphics_opengl_egl_destroy(struct graphics_opengl_platform *egl) { g_free(egl); } static void graphics_opengl_egl_swap_buffers(struct graphics_opengl_platform *egl) { eglSwapBuffers(egl->egldisplay, egl->eglwindow); } struct graphics_opengl_platform_methods graphics_opengl_egl_methods = { graphics_opengl_egl_destroy, graphics_opengl_egl_swap_buffers, }; struct graphics_opengl_platform * graphics_opengl_egl_new(void *display, void *window, struct graphics_opengl_platform_methods **methods) { struct graphics_opengl_platform *ret=g_new0(struct graphics_opengl_platform,1); EGLint major,minor,nconfig; *methods=&graphics_opengl_egl_methods; ret->egldisplay = eglGetDisplay((EGLNativeDisplayType)display); if (!ret->egldisplay) { dbg(lvl_error, "can't get display\n"); goto error; } if (!eglInitialize(ret->egldisplay, &major, &minor)) { dbg(lvl_error, "eglInitialize failed\n"); goto error; } dbg(lvl_debug,"eglInitialize ok with version %d.%d\n",major,minor); eglBindAPI(EGL_OPENGL_ES_API); if (!eglChooseConfig(ret->egldisplay, attributeList, ret->config, sizeof(ret->config)/sizeof(EGLConfig), &nconfig)) { dbg(lvl_error, "eglChooseConfig failed\n"); goto error; } if (nconfig != 1) { dbg(lvl_error, "unexpected number of configs %d\n",nconfig); goto error; } ret->eglwindow = eglCreateWindowSurface(ret->egldisplay, ret->config[0], (NativeWindowType) window, NULL); if (ret->eglwindow == EGL_NO_SURFACE) { dbg(lvl_error, "eglCreateWindowSurface failed"); goto error; } ret->context = eglCreateContext(ret->egldisplay, ret->config[0], EGL_NO_CONTEXT, aEGLContextAttributes); if (ret->context == EGL_NO_CONTEXT) { dbg(lvl_error, "eglCreateContext failed"); goto error; } eglMakeCurrent(ret->egldisplay, ret->eglwindow, ret->eglwindow, ret->context); return ret; error: graphics_opengl_egl_destroy(ret); return NULL; } navit-0.5.0+dfsg.1/navit/graphics/opengl/graphics_opengl_x11.c000066400000000000000000000104431264204753600241340ustar00rootroot00000000000000#include #include #include #include "debug.h" #include "event.h" #include "callback.h" #include "graphics_opengl.h" struct graphics_opengl_window_system { Display *display; int screen; Window window,root_window; XVisualInfo visual; Colormap colormap; struct callback *cb; struct event_watch *watch; void *data; void (*resize)(void *data, int w, int h); void (*button)(void *data, int button, int state, int x, int y); void (*motion)(void *data, int x, int y); void *keypress; }; static void graphics_opengl_x11_destroy(struct graphics_opengl_window_system *x11) { if (x11->watch) event_remove_watch(x11->watch); if (x11->cb) callback_destroy(x11->cb); if (x11->display) { if (x11->window) XDestroyWindow(x11->display, x11->window); if (x11->colormap) XFreeColormap(x11->display, x11->colormap); XCloseDisplay(x11->display); } g_free(x11); } static void * graphics_opengl_get_display(struct graphics_opengl_window_system *x11) { return x11->display; } static void * graphics_opengl_get_window(struct graphics_opengl_window_system *x11) { return (void *)x11->window; } static void graphics_opengl_set_callbacks(struct graphics_opengl_window_system *x11, void *data, void *resize, void *button, void *motion, void *keypress) { x11->data=data; x11->resize=resize; x11->button=button; x11->motion=motion; x11->keypress=keypress; } struct graphics_opengl_window_system_methods graphics_opengl_x11_methods = { graphics_opengl_x11_destroy, graphics_opengl_get_display, graphics_opengl_get_window, graphics_opengl_set_callbacks, }; static void graphics_opengl_x11_watch(struct graphics_opengl_window_system *x11) { XEvent event; while (XPending(x11->display)) { XNextEvent(x11->display, &event); switch(event.type) { case ButtonPress: if (x11->button) x11->button(x11->data,event.xbutton.button,1,event.xbutton.x,event.xbutton.y); break; case ButtonRelease: if (x11->button) x11->button(x11->data,event.xbutton.button,0,event.xbutton.x,event.xbutton.y); break; case ConfigureNotify: dbg(lvl_debug,"ConfigureNotify\n"); break; case Expose: dbg(lvl_debug,"Expose\n"); break; case KeyPress: dbg(lvl_debug,"KeyPress\n"); break; case KeyRelease: dbg(lvl_debug,"KeyRelease\n"); break; case MapNotify: dbg(lvl_debug,"MapNotify\n"); break; case MotionNotify: if (x11->motion) x11->motion(x11->data,event.xmotion.x,event.xmotion.y); break; case ReparentNotify: dbg(lvl_debug,"ReparentNotify\n"); break; default: dbg(lvl_debug,"type %d\n",event.type); } } } struct graphics_opengl_window_system * graphics_opengl_x11_new(void *displayname, int w, int h, int depth, struct graphics_opengl_window_system_methods **methods) { struct graphics_opengl_window_system *ret=g_new0(struct graphics_opengl_window_system, 1); XSetWindowAttributes attributes; unsigned long valuemask; ret->cb=callback_new_1(callback_cast(graphics_opengl_x11_watch), ret); if (!event_request_system("glib", "graphics_opengl_x11_new")) goto error; *methods=&graphics_opengl_x11_methods; ret->display=XOpenDisplay(displayname); if (!ret->display) { dbg(lvl_error,"failed to open display\n"); goto error; } ret->watch=event_add_watch(ConnectionNumber(ret->display), event_watch_cond_read, ret->cb); ret->screen=XDefaultScreen(ret->display); ret->root_window=RootWindow(ret->display, ret->screen); if (!XMatchVisualInfo(ret->display, ret->screen, depth, TrueColor, &ret->visual)) { dbg(lvl_error,"failed to find visual\n"); goto error; } ret->colormap=XCreateColormap(ret->display, ret->root_window, ret->visual.visual, AllocNone); valuemask = /* CWBackPixel | */ CWBorderPixel | CWEventMask | CWColormap ; // | CWBackingStore; attributes.colormap = ret->colormap; attributes.border_pixel = 0; attributes.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonMotionMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask; attributes.backing_store = Always; ret->window=XCreateWindow(ret->display, RootWindow(ret->display, ret->screen), 0, 0, w, h, 0, ret->visual.depth, InputOutput, ret->visual.visual, valuemask, &attributes); XMapWindow(ret->display, ret->window); XFlush(ret->display); graphics_opengl_x11_watch(ret); return ret; error: graphics_opengl_x11_destroy(ret); return NULL; } navit-0.5.0+dfsg.1/navit/graphics/qt_qpainter/000077500000000000000000000000001264204753600211745ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/qt_qpainter/CMakeLists.txt000066400000000000000000000003701264204753600237340ustar00rootroot00000000000000module_add_library(graphics_qt_qpainter ${CMAKE_CURRENT_BINARY_DIR}/RenderArea.moc RenderArea.cpp graphics_qt_qpainter.cpp) QT4_GENERATE_MOC(RenderArea.h ${CMAKE_CURRENT_BINARY_DIR}/RenderArea.moc) include_directories(${CMAKE_CURRENT_BINARY_DIR}) navit-0.5.0+dfsg.1/navit/graphics/qt_qpainter/Makefile.am000066400000000000000000000012321264204753600232260ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @QT_GUI_CFLAGS@ @QT_SVG_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/graphics/qt_qpainter -DMODULE=graphics_qt_qpainter modulegraphics_LTLIBRARIES = libgraphics_qt_qpainter.la libgraphics_qt_qpainter_la_SOURCES = graphics_qt_qpainter.cpp graphics_qt_qpainter.h RenderArea.cpp RenderArea.h RenderArea.moc libgraphics_qt_qpainter_la_LDFLAGS = @QT_GUI_LIBS@ @QT_SVG_LIBS@ -module -avoid-version if GRAPHICS_QT_QPAINTER BUILT_SOURCES = RenderArea.moc RenderArea.moc: @MOC@ $(srcdir)/RenderArea.h >RenderArea.moc || touch RenderArea.moc distclean-local: $(RM) RenderArea.moc endif navit-0.5.0+dfsg.1/navit/graphics/qt_qpainter/RenderArea.cpp000066400000000000000000000233471264204753600237210ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "graphics_qt_qpainter.h" #include "RenderArea.h" #include "RenderArea.moc" #ifdef QT_QPAINTER_USE_EMBEDDING EmbeddedWidget::EmbeddedWidget(struct graphics_priv *priv, QWidget* child, QWidget *parent) : QX11EmbedWidget(parent) { this->gra=priv; this->setWindowTitle(priv->window_title); QStackedLayout* _outerLayout = new QStackedLayout(this); this->setLayout(_outerLayout); _outerLayout->addWidget(child); _outerLayout->setCurrentWidget(child); } void EmbeddedWidget::closeEvent(QCloseEvent* event) { gra->widget->processClose(); } #endif /* QT_QPAINTER_USE_EMBEDDING */ //############################################################################################################## //# Description: Constructor //# Comment: Using a QPixmap for rendering the graphics //# Authors: Martin Schaller (04/2008) //############################################################################################################## RenderArea::RenderArea(struct graphics_priv *priv, QT_QPAINTER_RENDERAREA_PARENT *parent, int w, int h, int overlay) : QT_QPAINTER_RENDERAREA_PARENT(parent) { pixmap = new QPixmap(w, h); #ifndef QT_QPAINTER_NO_WIDGET if (!overlay) { #if QT_VERSION >= 0x040700 grabGesture(Qt::PinchGesture); grabGesture(Qt::SwipeGesture); grabGesture(Qt::PanGesture); #endif setWindowTitle(priv->window_title); } #endif is_overlay=overlay; gra=priv; #ifdef QT_QPAINTER_USE_EVENT_QT timer_type=g_hash_table_new(NULL, NULL); timer_callback=g_hash_table_new(NULL, NULL); watches=g_hash_table_new(NULL, NULL); #ifndef QT_QPAINTER_NO_WIDGET setAttribute(Qt::WA_OpaquePaintEvent, true); #endif #endif } //############################################################################################################## //# Description: QWidget:closeEvent //# Comment: Deletes navit object and stops event loop on graphics shutdown //############################################################################################################## void RenderArea::processClose() { callback_list_call_attr_0(this->cbl, attr_window_closed); } void RenderArea::closeEvent(QCloseEvent* event) { this->processClose(); } bool RenderArea::event(QEvent *event) { #if QT_VERSION >= 0x040700 if (event->type() == QEvent::Gesture) { dbg(lvl_debug,"gesture\n"); return true; } #endif return QWidget::event(event); } //############################################################################################################## //# Description: QWidget:sizeHint //# Comment: This property holds the recommended size for the widget //# Authors: Martin Schaller (04/2008) //############################################################################################################## QSize RenderArea::sizeHint() const { return QSize(gra->w, gra->h); } //############################################################################################################## //# Description: QWidget:paintEvent //# Comment: A paint event is a request to repaint all or part of the widget. //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::paintEvent(QPaintEvent * event) { qt_qpainter_draw(gra, &event->rect(), 1); } void RenderArea::do_resize(QSize size) { if (pixmap->paintingActive()) { pixmap->paintEngine()->painter()->end(); } delete pixmap; pixmap=new QPixmap(size); pixmap->fill(); QPainter painter(pixmap); QBrush brush; painter.fillRect(0, 0, size.width(), size.height(), brush); dbg(lvl_debug,"size %dx%d\n", size.width(), size.height()); dbg(lvl_debug,"pixmap %p %dx%d\n", pixmap, pixmap->width(), pixmap->height()); callback_list_call_attr_2(this->cbl, attr_resize, GINT_TO_POINTER(size.width()), GINT_TO_POINTER(size.height())); } //############################################################################################################## //# Description: QWidget::resizeEvent() //# Comment: When resizeEvent() is called, the widget already has its new geometry. //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::resizeEvent(QResizeEvent * event) { if (!this->is_overlay) { RenderArea::do_resize(event->size()); } } //############################################################################################################## //# Description: Method to handle mouse clicks //# Comment: Delegate of QWidget::mousePressEvent and QWidget::mouseReleaseEvent (see below) //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::mouseEvent(int pressed, QMouseEvent *event) { struct point p; p.x=event->x(); p.y=event->y(); switch (event->button()) { case Qt::LeftButton: callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(pressed), GINT_TO_POINTER(1), GINT_TO_POINTER(&p)); break; case Qt::MidButton: callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(pressed), GINT_TO_POINTER(2), GINT_TO_POINTER(&p)); break; case Qt::RightButton: callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(pressed), GINT_TO_POINTER(3), GINT_TO_POINTER(&p)); break; default: break; } } void RenderArea::mousePressEvent(QMouseEvent *event) { mouseEvent(1, event); } void RenderArea::mouseReleaseEvent(QMouseEvent *event) { mouseEvent(0, event); } //############################################################################################################## //# Description: QWidget::mouseMoveEvent //# Comment: If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed. //# Authors: Martin Schaller (04/2008) //############################################################################################################## void RenderArea::mouseMoveEvent(QMouseEvent *event) { struct point p; p.x=event->x(); p.y=event->y(); callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); } //############################################################################################################## //# Description: Qt Event :: Zoom in/out with the mouse's scrollwheel //# Comment: //# Authors: Stefan Klumpp (04/2008) //############################################################################################################## void RenderArea::wheelEvent(QWheelEvent *event) { struct point p; int button; p.x=event->x(); // xy-coordinates of the mouse pointer p.y=event->y(); if (event->delta() > 0) // wheel movement away from the person button=4; else if (event->delta() < 0) // wheel movement towards the person button=5; else button=-1; if (button != -1) { callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER(button), GINT_TO_POINTER(&p)); callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER(button), GINT_TO_POINTER(&p)); } event->accept(); } #define CASE(x) case x: void RenderArea::keyPressEvent(QKeyEvent *event) { QString str=event->text(); const char *text=str.toUtf8().constData(); dbg(lvl_debug,"enter text='%s' 0x%x (%zu) key=%d\n", text, text[0], strlen(text), event->key()); if (!text || !text[0] || text[0] == 0x7f) { dbg(lvl_debug,"special key\n"); switch (event->key()) { case 4099: { char text_backspace[] = {NAVIT_KEY_BACKSPACE,'\0'}; text=text_backspace; } break; case 4101: #ifdef QT_QPAINTER_CUSTOM_RETURN QT_QPAINTER_CUSTOM_RETURN #endif { char text_return[] = {NAVIT_KEY_RETURN,'\0'}; text=text_return; } break; case 4114: #ifdef QT_QPAINTER_CUSTOM_LEFT QT_QPAINTER_CUSTOM_LEFT #endif { char text_left[] = {NAVIT_KEY_LEFT,'\0'}; text=text_left; } break; case 4115: #ifdef QT_QPAINTER_CUSTOM_UP QT_QPAINTER_CUSTOM_UP #endif { char text_up[] = {NAVIT_KEY_UP,'\0'}; text=text_up; } break; case 4116: #ifdef QT_QPAINTER_CUSTOM_RIGHT QT_QPAINTER_CUSTOM_RIGHT #endif { char text_right[] = {NAVIT_KEY_RIGHT,'\0'}; text=text_right; } break; case 4117: #ifdef QT_QPAINTER_CUSTOM_DOWN QT_QPAINTER_CUSTOM_DOWN #endif { char text_down[] = {NAVIT_KEY_DOWN,'\0'}; text=text_down; } break; } } callback_list_call_attr_1(this->cbl, attr_keypress, (void *)text); event->accept(); } void RenderArea::watchEvent(int fd) { #ifdef QT_QPAINTER_USE_EVENT_QT struct event_watch *ev=(struct event_watch *)g_hash_table_lookup(watches, (void *)fd); dbg(lvl_debug,"fd=%d ev=%p cb=%p\n", fd, ev, ev->cb); callback_call_0(ev->cb); #endif } #ifdef QT_QPAINTER_USE_EVENT_QT void RenderArea::timerEvent(QTimerEvent *event) { int id=event->timerId(); struct callback *cb=(struct callback *)g_hash_table_lookup(timer_callback, (void *)id); if (cb) callback_call_0(cb); if (!g_hash_table_lookup(timer_type, (void *)id)) event_qt_remove_timeout((struct event_timeout *)id); } #endif /* QT_QPAINTER_USE_EVENT_QT */ navit-0.5.0+dfsg.1/navit/graphics/qt_qpainter/RenderArea.h000066400000000000000000000042541264204753600233620ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __RENDERAREA_H #define __RENDERAREA_H #ifdef QT_QPAINTER_USE_EMBEDDING class EmbeddedWidget : public QX11EmbedWidget { struct graphics_priv *gra; public: EmbeddedWidget(struct graphics_priv *priv, QWidget* child, QWidget *parent = NULL); protected: void closeEvent(QCloseEvent *event); }; #endif class RenderArea : public QT_QPAINTER_RENDERAREA_PARENT { Q_OBJECT public: RenderArea(struct graphics_priv *priv, QT_QPAINTER_RENDERAREA_PARENT *parent = 0, int w=800, int h=800, int overlay=0); void do_resize(QSize size); QPixmap *pixmap; struct callback_list *cbl; struct graphics_priv *gra; #ifdef QT_QPAINTER_USE_EVENT_QT GHashTable *timer_type; GHashTable *timer_callback; GHashTable *watches; #endif void processClose(); protected: int is_overlay; QSize sizeHint() const; void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); void mouseEvent(int pressed, QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); void keyPressEvent(QKeyEvent *event); void closeEvent(QCloseEvent *event); bool event(QEvent *event); #ifdef QT_QPAINTER_USE_EVENT_QT void timerEvent(QTimerEvent *event); #endif protected slots: void watchEvent(int fd); }; #endif /* __RENDERAREA_H */ navit-0.5.0+dfsg.1/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp000066400000000000000000000723011264204753600261120ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ //############################################################################################################## //# //# File: graphics_qt_qpainter.cpp //# Description: Graphics interface for internal GUI using Qt (Trolltech.com) //# Comment: //# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) //# //############################################################################################################## #include "graphics_qt_qpainter.h" #include "RenderArea.h" //############################################################################################################## //# Description: RenderArea (QWidget) class for the main window (map, menu, ...) //# Comment: //# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) //############################################################################################################## static void overlay_rect(struct graphics_priv *parent, struct graphics_priv *overlay, int clean, QRect *r) { struct point p; int w,h; if (clean) { p=overlay->pclean; } else { p=overlay->p;; } w=overlay->widget->pixmap->width(); h=overlay->widget->pixmap->height(); if (overlay->wraparound) { if (p.x < 0) p.x+=parent->widget->pixmap->width(); if (p.y < 0) p.y+=parent->widget->pixmap->height(); if (w < 0) w += parent->widget->pixmap->width(); if (h < 0) h += parent->widget->pixmap->height(); } r->setRect(p.x, p.y, w, h); } void qt_qpainter_draw(struct graphics_priv *gr, const QRect *r, int paintev) { if (!paintev) { #ifndef QT_QPAINTER_NO_WIDGET dbg(lvl_debug,"update %d,%d %d x %d\n", r->x(), r->y(), r->width(), r->height()); if (r->x() <= -r->width()) return; if (r->y() <= -r->height()) return; if (r->x() > gr->widget->pixmap->width()) return; if (r->y() > gr->widget->pixmap->height()) return; dbg(lvl_debug,"update valid %d,%d %dx%d\n", r->x(), r->y(), r->width(), r->height()); gr->widget->update(*r); #endif return; } QPixmap pixmap(r->width(),r->height()); QPainter painter(&pixmap); struct graphics_priv *overlay=NULL; if (! gr->overlay_disable) overlay=gr->overlays; if ((gr->p.x || gr->p.y) && gr->background_gc) { painter.setPen(*gr->background_gc->pen); painter.fillRect(0, 0, gr->widget->pixmap->width(), gr->widget->pixmap->height(), *gr->background_gc->brush); } painter.drawPixmap(QPoint(gr->p.x,gr->p.y), *gr->widget->pixmap, *r); while (overlay) { QRect ovr; overlay_rect(gr, overlay, 0, &ovr); if (!overlay->overlay_disable && r->intersects(ovr)) { unsigned char *data; int i,size=ovr.width()*ovr.height(); QImage img=overlay->widget->pixmap->toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied); data=img.bits(); for (i = 0 ; i < size ; i++) { if (data[0] == overlay->rgba[0] && data[1] == overlay->rgba[1] && data[2] == overlay->rgba[2]) data[3]=overlay->rgba[3]; data+=4; } painter.drawImage(QPoint(ovr.x()-r->x(),ovr.y()-r->y()), img); } overlay=overlay->next; } #ifndef QT_QPAINTER_NO_WIDGET QPainter painterw(gr->widget); painterw.drawPixmap(r->x(), r->y(), pixmap); #endif } //############################################################################################################## // General comments: // ----------------- // gr = graphics = draw area // gc = graphics context = pen to paint on the draw area //############################################################################################################## //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_font_priv { QFont *font; }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_image_priv { QPixmap *pixmap; }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void graphics_destroy(struct graphics_priv *gr) { #ifdef QT_QPAINTER_USE_FREETYPE gr->freetype_methods.destroy(); #endif g_free(gr->window_title); g_free(gr); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void font_destroy(struct graphics_font_priv *font) { } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_font_methods font_methods = { font_destroy }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *fontfamily, int size, int flags) { struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); ret->font=new QFont("Arial",size/20); *meth=font_methods; return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_destroy(struct graphics_gc_priv *gc) { delete gc->pen; delete gc->brush; g_free(gc); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->pen->setWidth(w); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { QColor col(c->r >> 8, c->g >> 8, c->b >> 8 /* , c->a >> 8 */); gc->pen->setColor(col); gc->brush->setColor(col); gc->c=*c; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { *meth=gc_methods; struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); ret->pen=new QPen(); ret->brush=new QBrush(Qt::SolidPattern); return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) { struct graphics_image_priv *ret; QPixmap *cachedPixmap; QString key(path); ret=g_new0(struct graphics_image_priv, 1); cachedPixmap=QPixmapCache::find(key); if (!cachedPixmap) { #ifdef HAVE_QT_SVG if(key.endsWith(".svg", Qt::CaseInsensitive)) { QSvgRenderer renderer(key); if (!renderer.isValid()) { g_free(ret); return NULL; } ret->pixmap=new QPixmap(renderer.defaultSize()); ret->pixmap->fill(Qt::transparent); QPainter painter(ret->pixmap); renderer.render(&painter); } else { ret->pixmap=new QPixmap(path); } #else ret->pixmap=new QPixmap(path); #endif /* QT__VERSION */ if (ret->pixmap->isNull()) { g_free(ret); return NULL; } QPixmapCache::insert(key,QPixmap(*ret->pixmap)); } else { ret->pixmap=new QPixmap(*cachedPixmap); } *w=ret->pixmap->width(); *h=ret->pixmap->height(); if (hot) { hot->x=*w/2; hot->y=*h/2; } return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int i; QPolygon polygon; for (i = 0 ; i < count ; i++) polygon.putPoints(i, 1, p[i].x, p[i].y); gr->painter->setPen(*gc->pen); gr->painter->drawPolyline(polygon); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { int i; QPolygon polygon; for (i = 0 ; i < count ; i++) polygon.putPoints(i, 1, p[i].x, p[i].y); gr->painter->setPen(*gc->pen); gr->painter->setBrush(*gc->brush); gr->painter->drawPolygon(polygon); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { dbg(lvl_debug,"gr=%p gc=%p %d,%d,%d,%d\n", gr, gc, p->x, p->y, w, h); gr->painter->fillRect(p->x,p->y, w, h, *gc->brush); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { gr->painter->setPen(*gc->pen); gr->painter->drawArc(p->x-r/2, p->y-r/2, r, r, 0, 360*16); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { QPainter *painter=gr->painter; #ifndef QT_QPAINTER_USE_FREETYPE QString tmp=QString::fromUtf8(text); #ifndef QT_NO_TRANSFORMATIONS QMatrix sav=gr->painter->worldMatrix(); QMatrix m(dx/65535.0,dy/65535.0,-dy/65535.0,dx/65535.0,p->x,p->y); painter->setWorldMatrix(m,TRUE); painter->setPen(*fg->pen); painter->setFont(*font->font); painter->drawText(0, 0, tmp); painter->setWorldMatrix(sav); #else painter->setPen(*fg->pen); painter->setFont(*font->font); painter->drawText(p->x, p->y, tmp); #endif #else struct font_freetype_text *t; struct font_freetype_glyph *g, **gp; struct color transparent = {0x0000, 0x0000, 0x0000, 0x0000}; struct color *fgc=&fg->c, *bgc=&bg->c; int i,x,y; if (! font) return; t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; if (bg) { while (i-- > 0) { g=*gp++; if (g->w && g->h) { unsigned char *data; QImage img(g->w+2, g->h+2, QImage::Format_ARGB32_Premultiplied); data=img.bits(); gr->freetype_methods.get_shadow(g,(unsigned char *)data,img.bytesPerLine(),bgc,&transparent); painter->drawImage(((x+g->x)>>6)-1, ((y+g->y)>>6)-1, img); } x+=g->dx; y+=g->dy; } } else bgc=&transparent; x=p->x << 6; y=p->y << 6; gp=t->glyph; i=t->glyph_count; while (i-- > 0) { g=*gp++; if (g->w && g->h) { unsigned char *data; QImage img(g->w, g->h, QImage::Format_ARGB32_Premultiplied); data=img.bits(); gr->freetype_methods.get_glyph(g,(unsigned char *)data,img.bytesPerLine(),fgc,bgc,&transparent); painter->drawImage((x+g->x)>>6, (y+g->y)>>6, img); } x+=g->dx; y+=g->dy; } gr->freetype_methods.text_destroy(t); #endif } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { gr->painter->drawPixmap(p->x, p->y, *img->pixmap); } static void draw_drag(struct graphics_priv *gr, struct point *p) { if (!gr->cleanup) { gr->pclean=gr->p; gr->cleanup=1; } if (p) gr->p=*p; else { gr->p.x=0; gr->p.y=0; } } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { gr->background_gc=gc; gr->rgba[2]=gc->c.r >> 8; gr->rgba[1]=gc->c.g >> 8; gr->rgba[0]=gc->c.b >> 8; gr->rgba[3]=gc->c.a >> 8; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { dbg(lvl_debug,"mode for %p %d\n", gr, mode); QRect r; if (mode == draw_mode_begin) { if (gr->widget->pixmap->paintingActive()) { gr->widget->pixmap->paintEngine()->painter()->end(); } gr->painter->begin(gr->widget->pixmap); } if (mode == draw_mode_end) { gr->painter->end(); if (gr->parent) { if (gr->cleanup) { overlay_rect(gr->parent, gr, 1, &r); qt_qpainter_draw(gr->parent, &r, 0); gr->cleanup=0; } overlay_rect(gr->parent, gr, 0, &r); qt_qpainter_draw(gr->parent, &r, 0); } else { r.setRect(0, 0, gr->widget->pixmap->width(), gr->widget->pixmap->height()); qt_qpainter_draw(gr, &r, 0); } if (!gr->parent) QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents|QEventLoop::ExcludeSocketNotifiers|QEventLoop::DeferredDeletion|QEventLoop::X11ExcludeTimers); } gr->mode=mode; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int wraparound); static int argc=1; static char *argv[]={NULL,NULL,NULL}; static int fullscreen(struct window *win, int on) { #ifndef QT_QPAINTER_NO_WIDGET struct graphics_priv *this_=(struct graphics_priv *)win->priv; QWidget* _outerWidget; #ifdef QT_QPAINTER_USE_EMBEDDING _outerWidget=(QWidget*)this_->widget->parent(); #else _outerWidget=this_->widget; #endif /* QT_QPAINTER_USE_EMBEDDING */ if (on) _outerWidget->showFullScreen(); else _outerWidget->showMaximized(); #endif return 1; } static void disable_suspend(struct window *win) { #ifdef HAVE_QPE struct graphics_priv *this_=(struct graphics_priv *)win->priv; this_->app->setTempScreenSaverMode(QPEApplication::DisableLightOff); #endif } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void * get_data(struct graphics_priv *this_, const char *type) { struct window *win; QString xid; bool ok; if (!strcmp(type, "resize")) { dbg(lvl_debug,"resize %d %d\n",this_->w,this_->h); QSize size(this_->w,this_->h); this_->widget->do_resize(size); } if (!strcmp(type, "qt_widget")) return this_->widget; if (!strcmp(type, "qt_pixmap")) return this_->widget->pixmap; if (!strcmp(type, "window")) { win=g_new(struct window, 1); #ifndef QT_QPAINTER_NO_WIDGET #ifdef QT_QPAINTER_USE_EMBEDDING EmbeddedWidget* _outerWidget=new EmbeddedWidget(this_,this_->widget,NULL); xid=getenv("NAVIT_XID"); if (xid.length()>0) { _outerWidget->embedInto(xid.toULong(&ok,0)); } _outerWidget->show(); #endif /* QT_QPAINTER_USE_EMBEDDING */ if (this_->w && this_->h) this_->widget->show(); else this_->widget->showMaximized(); #endif /* QT_QPAINTER_NO_WIDGET */ win->priv=this_; win->fullscreen=fullscreen; win->disable_suspend=disable_suspend; return win; } return NULL; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { delete priv->pixmap; g_free(priv); } static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) { QPainter *painter=gr->painter; QString tmp=QString::fromUtf8(text); painter->setFont(*font->font); QRect r=painter->boundingRect(0,0,gr->w,gr->h,0,tmp); ret[0].x=0; ret[0].y=-r.height(); ret[1].x=0; ret[1].y=0; ret[2].x=r.width(); ret[2].y=0; ret[3].x=r.width(); ret[3].y=-r.height(); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void overlay_disable(struct graphics_priv *gr, int disable) { gr->overlay_disable=disable; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static int set_attr(struct graphics_priv *gr, struct attr *attr) { switch (attr->type) { case attr_w: gr->w=attr->u.num; if (gr->w != 0 && gr->h != 0) { QSize size(gr->w,gr->h); gr->widget->do_resize(size); } break; case attr_h: gr->h=attr->u.num; if (gr->w != 0 && gr->h != 0) { QSize size(gr->w,gr->h); gr->widget->do_resize(size); } break; default: return 0; } return 1; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, draw_circle, draw_text, draw_image, NULL, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data, image_free, get_text_bbox, overlay_disable, NULL, set_attr, }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int wraparound) { *meth=graphics_methods; struct graphics_priv *ret=g_new0(struct graphics_priv, 1); #ifdef QT_QPAINTER_USE_FREETYPE if (gr->font_freetype_new) { ret->font_freetype_new=gr->font_freetype_new; gr->font_freetype_new(&ret->freetype_methods); meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; meth->get_text_bbox=(void (*)(struct graphics_priv*, struct graphics_font_priv*, char*, int, int, struct point*, int))ret->freetype_methods.get_text_bbox; } #endif ret->widget= new RenderArea(ret,gr->widget,w,h,1); ret->wraparound=wraparound; ret->painter=new QPainter; ret->p=*p; ret->parent=gr; ret->next=gr->overlays; gr->overlays=ret; #ifndef QT_QPAINTER_NO_WIDGET ret->widget->hide(); #endif return ret; } #ifdef QT_QPAINTER_USE_EVENT_QT static struct graphics_priv *event_gr; static void event_qt_main_loop_run(void) { event_gr->app->exec(); } static void event_qt_main_loop_quit(void) { dbg(lvl_debug,"enter\n"); exit(0); } static struct event_watch * event_qt_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { dbg(lvl_debug,"enter fd=%d\n",(int)(long)fd); struct event_watch *ret=g_new0(struct event_watch, 1); ret->fd=fd; ret->cb=cb; g_hash_table_insert(event_gr->widget->watches, GINT_TO_POINTER(fd), ret); ret->sn=new QSocketNotifier(fd, QSocketNotifier::Read, event_gr->widget); QObject::connect(ret->sn, SIGNAL(activated(int)), event_gr->widget, SLOT(watchEvent(int))); return ret; } static void event_qt_remove_watch(struct event_watch *ev) { g_hash_table_remove(event_gr->widget->watches, GINT_TO_POINTER(ev->fd)); delete(ev->sn); g_free(ev); } static struct event_timeout * event_qt_add_timeout(int timeout, int multi, struct callback *cb) { int id; id=event_gr->widget->startTimer(timeout); g_hash_table_insert(event_gr->widget->timer_callback, (void *)id, cb); g_hash_table_insert(event_gr->widget->timer_type, (void *)id, (void *)!!multi); return (struct event_timeout *)id; } void event_qt_remove_timeout(struct event_timeout *ev) { event_gr->widget->killTimer((int)(long)ev); g_hash_table_remove(event_gr->widget->timer_callback, ev); g_hash_table_remove(event_gr->widget->timer_type, ev); } static struct event_idle * event_qt_add_idle(int priority, struct callback *cb) { dbg(lvl_debug,"enter\n"); return (struct event_idle *)event_qt_add_timeout(0, 1, cb); } static void event_qt_remove_idle(struct event_idle *ev) { dbg(lvl_debug,"enter\n"); event_qt_remove_timeout((struct event_timeout *) ev); } static void event_qt_call_callback(struct callback_list *cb) { dbg(lvl_debug,"enter\n"); } static struct event_methods event_qt_methods = { event_qt_main_loop_run, event_qt_main_loop_quit, event_qt_add_watch, event_qt_remove_watch, event_qt_add_timeout, event_qt_remove_timeout, event_qt_add_idle, event_qt_remove_idle, event_qt_call_callback, }; struct event_priv { }; struct event_priv * event_qt_new(struct event_methods *meth) { dbg(lvl_debug,"enter\n"); *meth=event_qt_methods; return NULL; } #endif //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct graphics_priv * graphics_qt_qpainter_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct graphics_priv *ret; struct font_priv * (*font_freetype_new)(void *meth); struct attr *attr; dbg(lvl_debug,"enter\n"); #ifdef QT_QPAINTER_USE_EVENT_QT if (event_gr) return NULL; if (! event_request_system("qt","graphics_qt_qpainter_new")) return NULL; #endif #ifdef QT_QPAINTER_USE_EVENT_GLIB if (! event_request_system("glib","graphics_qt_qpainter_new")) return NULL; #endif #ifdef QT_QPAINTER_USE_FREETYPE font_freetype_new=(struct font_priv *(*)(void *))plugin_get_font_type("freetype"); if (!font_freetype_new) { dbg(lvl_error,"no freetype\n"); return NULL; } #endif ret=g_new0(struct graphics_priv, 1); *meth=graphics_methods; ret->nav=nav; #ifdef QT_QPAINTER_USE_FREETYPE ret->font_freetype_new=font_freetype_new; font_freetype_new(&ret->freetype_methods); meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; meth->get_text_bbox=(void (*)(struct graphics_priv*, struct graphics_font_priv*, char*, int, int, struct point*, int))ret->freetype_methods.get_text_bbox; #endif #if defined QT_QPAINTER_USE_EMBEDDING && QT_VERSION >= 0x040500 if ((attr=attr_search(attrs, NULL, attr_gc_type))) QApplication::setGraphicsSystem(attr->u.str); else QApplication::setGraphicsSystem("raster"); #endif argv[0]=(char*)malloc(255); strcpy(argv[0], "navit"); if ((attr=attr_search(attrs, NULL, attr_flags))) ret->flags=attr->u.num; if (ret->flags & 1) { argv[1]=(char*)malloc(255); strcpy(argv[1], "-qws"); argc++; } #ifndef QT_QPAINTER_NO_APP #ifdef HAVE_QPE ret->app = new QPEApplication(argc, argv); #else ret->app = new QApplication(argc, argv); #endif #endif ret->widget= new RenderArea(ret); ret->widget->cbl=cbl; ret->painter = new QPainter; #ifdef QT_QPAINTER_USE_EVENT_QT event_gr=ret; #endif ret->w=800; ret->h=600; if ((attr=attr_search(attrs, NULL, attr_w))) ret->w=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_h))) ret->h=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_window_title))) ret->window_title=g_strdup(attr->u.str); else ret->window_title=g_strdup("Navit"); dbg(lvl_debug,"return\n"); return ret; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## void plugin_init(void) { plugin_register_graphics_type("qt_qpainter", graphics_qt_qpainter_new); #ifdef QT_QPAINTER_USE_EVENT_QT plugin_register_event_type("qt", event_qt_new); #endif } // *** EOF *** navit-0.5.0+dfsg.1/navit/graphics/qt_qpainter/graphics_qt_qpainter.h000066400000000000000000000070651264204753600255640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __GRAPHICS_QT_QPAINTER_H #define __GRAPHICS_QT_QPAINTER_H #include #include #include #include "config.h" #include "navit/point.h" #include "navit/item.h" #include "navit/graphics.h" #include "navit/color.h" #include "navit/debug.h" #include "navit/plugin.h" #include "navit/callback.h" #include "navit/event.h" #include "navit/window.h" #include "navit/keys.h" #include "navit/navit.h" #include #if QT_VERSION < 0x040000 #error "Support for Qt 3 was dropped in rev 5999." #endif #ifndef QT_QPAINTER_USE_FREETYPE #define QT_QPAINTER_USE_FREETYPE 1 #endif #ifdef QT_QPAINTER_USE_FREETYPE #include "navit/font/freetype/font_freetype.h" #endif #include #include #if QT_VERSION >= 0x040200 #include #include #endif #include #include #include #include #include #include #include #include #ifdef HAVE_QT_SVG #include #endif #ifndef QT_QPAINTER_USE_EVENT_GLIB #define QT_QPAINTER_USE_EVENT_GLIB 1 #endif #ifdef Q_WS_X11 #ifndef QT_QPAINTER_USE_EMBEDDING #define QT_QPAINTER_USE_EMBEDDING 1 #endif #endif #ifdef QT_QPAINTER_USE_EMBEDDING #include #endif #ifndef QT_QPAINTER_RENDERAREA_PARENT #define QT_QPAINTER_RENDERAREA_PARENT QWidget #endif class RenderArea; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_gc_priv { QPen *pen; QBrush *brush; struct color c; }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct graphics_priv { #ifdef HAVE_QPE QPEApplication *app; #else QApplication *app; #endif RenderArea *widget; QPainter *painter; struct graphics_gc_priv *background_gc; unsigned char rgba[4]; enum draw_mode_num mode; struct graphics_priv *parent,*overlays,*next; struct point p,pclean; int cleanup; int overlay_disable; int wraparound; #ifdef QT_QPAINTER_USE_FREETYPE struct font_priv * (*font_freetype_new)(void *meth); struct font_freetype_methods freetype_methods; #endif int w,h,flags; struct navit* nav; char *window_title; }; void qt_qpainter_draw(struct graphics_priv *gr, const QRect *r, int paintev); struct event_watch { QSocketNotifier *sn; struct callback *cb; int fd; }; void event_qt_remove_timeout(struct event_timeout *ev); #endif /* __GRAPHICS_QT_QPAINTER_H */ navit-0.5.0+dfsg.1/navit/graphics/sdl/000077500000000000000000000000001264204753600174275ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/graphics/sdl/CMakeLists.txt000066400000000000000000000000731264204753600221670ustar00rootroot00000000000000module_add_library(graphics_sdl graphics_sdl.c raster.c) navit-0.5.0+dfsg.1/navit/graphics/sdl/Makefile.am000066400000000000000000000005711264204753600214660ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @FREETYPE2_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_sdl modulegraphics_LTLIBRARIES = libgraphics_sdl.la libgraphics_sdl_la_SOURCES = graphics_sdl.c raster.c raster.h libgraphics_sdl_la_LDFLAGS = @SDL_LIBS@ @SDL_IMAGE_LIBS@ @FREETYPE2_LIBS@ @LIBPDL_LIBS@ -module -avoid-version navit-0.5.0+dfsg.1/navit/graphics/sdl/event.c000066400000000000000000000225641264204753600207250ustar00rootroot00000000000000/* * event.c * * Created on: 01.05.2011 * Author: norad */ #include "webos/webos.h" struct event_timeout { SDL_TimerID id; int multi; struct callback *cb; }; struct idle_task { int priority; struct callback *cb; }; struct event_watch { struct pollfd *pfd; struct callback *cb; }; static void event_sdl_watch_thread(GPtrArray *); static void event_sdl_watch_startthread(GPtrArray *watch_list); static void event_sdl_watch_stopthread(void); static struct event_watch *event_sdl_add_watch(int, enum event_watch_cond, struct callback *); static void event_sdl_remove_watch(struct event_watch *); static struct event_timeout *event_sdl_add_timeout(int, int, struct callback *); static void event_sdl_remove_timeout(struct event_timeout *); static struct event_idle *event_sdl_add_idle(int, struct callback *); static void event_sdl_remove_idle(struct event_idle *); static void event_sdl_call_callback(struct callback_list *); # ifdef USE_WEBOS_ACCELEROMETER static unsigned int sdl_orientation_count = 2 ^ 16; static char sdl_next_orientation = WEBOS_ORIENTATION_PORTRAIT; static SDL_Joystick *accelerometer = NULL; static unsigned int orientation = WEBOS_ORIENTATION_PORTRAIT; static void sdl_accelerometer_handler(void* param) { struct graphics_priv *gr = (struct graphics_priv *) param; int xAxis = SDL_JoystickGetAxis(accelerometer, 0); int yAxis = SDL_JoystickGetAxis(accelerometer, 1); int zAxis = SDL_JoystickGetAxis(accelerometer, 2); unsigned char new_orientation; dbg(lvl_info, "x(%d) y(%d) z(%d) c(%d)\n", xAxis, yAxis, zAxis, sdl_orientation_count); if (zAxis > -30000) { if (xAxis < -15000 && yAxis > -5000 && yAxis < 5000) new_orientation = WEBOS_ORIENTATION_LANDSCAPE; else if (yAxis > 15000 && xAxis > -5000 && xAxis < 5000) new_orientation = WEBOS_ORIENTATION_PORTRAIT; else return; } else return; if (new_orientation == sdl_next_orientation) { if (sdl_orientation_count < 3) sdl_orientation_count++; } else { sdl_orientation_count = 0; sdl_next_orientation = new_orientation; return; } if (sdl_orientation_count == 3) { sdl_orientation_count++; if (new_orientation != orientation) { dbg(lvl_debug, "x(%d) y(%d) z(%d) o(%d)\n", xAxis, yAxis, zAxis, new_orientation); orientation = new_orientation; SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_ROTATE; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } } } #endif /* ---------- SDL Eventhandling ---------- */ static Uint32 sdl_timer_callback(Uint32 interval, void* param) { struct event_timeout *timeout = (struct event_timeout*) param; dbg(lvl_debug, "timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_TIMER; userevent.data1 = timeout->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); if (timeout->multi == 0) { g_free(timeout); timeout = NULL; return 0; // cancel timer } return interval; // reactivate timer } /* SDL Mainloop */ static void event_sdl_main_loop_run(void) { #ifdef USE_WEBOS_ACCELEROMETER struct callback* accel_cb = NULL; struct event_timeout* accel_to = NULL; if (PDL_GetPDKVersion() > 100) { accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr); accel_to = event_add_timeout(200, 1, accel_cb); } #endif graphics_sdl_idle(NULL); event_sdl_watch_stopthread(); #ifdef USE_WEBOS_ACCELEROMETER SDL_JoystickClose(accelerometer); if (PDL_GetPDKVersion() > 100) { event_remove_timeout(accel_to); callback_destroy(accel_cb); } #endif } static void event_sdl_main_loop_quit(void) { quit_event_loop = 1; } /* Watch */ static void event_sdl_watch_thread(GPtrArray *watch_list) { struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); struct event_watch *ew; int ret; int idx; for (idx = 0; idx < watch_list->len; idx++) { ew = g_ptr_array_index(watch_list, idx); g_memmove(&pfds[idx], ew->pfd, sizeof(struct pollfd)); } while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { for (idx = 0; idx < watch_list->len; idx++) { if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ ew = g_ptr_array_index(watch_list, idx); dbg(lvl_debug, "watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_WATCH; userevent.data1 = ew->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } } } g_free(pfds); pthread_exit(0); } static void event_sdl_watch_startthread(GPtrArray *watch_list) { dbg(lvl_debug, "enter\n"); if (sdl_watch_thread) event_sdl_watch_stopthread(); int ret; ret = pthread_create(&sdl_watch_thread, NULL, (void *) event_sdl_watch_thread, (void *) watch_list); dbg_assert(ret == 0); } static void event_sdl_watch_stopthread() { dbg(lvl_debug, "enter\n"); if (sdl_watch_thread) { /* Notify the watch thread that the list of FDs will change */ pthread_kill(sdl_watch_thread, SIGUSR1); pthread_join(sdl_watch_thread, NULL); sdl_watch_thread = 0; } } static struct event_watch * event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { dbg(lvl_debug, "fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); event_sdl_watch_stopthread(); if (!sdl_watch_list) sdl_watch_list = g_ptr_array_new(); struct event_watch *new_ew = g_new0 (struct event_watch, 1); struct pollfd *pfd = g_new0 (struct pollfd, 1); pfd->fd = fd; /* Modify watchlist here */ switch (cond) { case event_watch_cond_read: pfd->events = POLLIN; break; case event_watch_cond_write: pfd->events = POLLOUT; break; case event_watch_cond_except: pfd->events = POLLERR | POLLHUP; break; } new_ew->pfd = (struct pollfd*) pfd; new_ew->cb = cb; g_ptr_array_add(sdl_watch_list, (gpointer) new_ew); event_sdl_watch_startthread(sdl_watch_list); return new_ew; } static void event_sdl_remove_watch(struct event_watch *ew) { dbg(lvl_debug, "enter %p\n", ew); event_sdl_watch_stopthread(); g_ptr_array_remove(sdl_watch_list, ew); g_free(ew->pfd); g_free(ew); if (sdl_watch_list->len > 0) event_sdl_watch_startthread(sdl_watch_list); } /* Timeout */ static struct event_timeout * event_sdl_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout * ret = g_new0(struct event_timeout, 1); if (!ret) return ret; dbg(lvl_debug, "timer(%p) multi(%d) interval(%d) cb(%p) added\n", ret, multi, timeout, cb); ret->multi = multi; ret->cb = cb; ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); return ret; } static void event_sdl_remove_timeout(struct event_timeout *to) { dbg(lvl_info, "enter %p\n", to); if (to != NULL) { int ret = to->id ? SDL_RemoveTimer(to->id) : SDL_TRUE; if (ret == SDL_FALSE) { dbg(lvl_debug, "SDL_RemoveTimer (%p) failed\n", to->id); } else { g_free(to); dbg(lvl_debug, "timer(%p) removed\n", to); } } } /* Idle */ /* sort ptr_array by priority, increasing order */ static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) { struct idle_task *a = (struct idle_task *) parama; struct idle_task *b = (struct idle_task *) paramb; if (a->priority < b->priority) return -1; if (a->priority > b->priority) return 1; return 0; } static struct event_idle * event_sdl_add_idle(int priority, struct callback *cb) { dbg(lvl_debug, "add idle priority(%d) cb(%p)\n", priority, cb); struct idle_task *task = g_new0(struct idle_task, 1); task->priority = priority; task->cb = cb; g_ptr_array_add(idle_tasks, (gpointer) task); if (idle_tasks->len < 2) { SDL_Event event; SDL_UserEvent userevent; dbg(lvl_debug, "poking eventloop because of new idle_events\n"); userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } else // more than one entry => sort the list g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); return (struct event_idle *) task; } static void event_sdl_remove_idle(struct event_idle *task) { dbg(lvl_debug, "remove task(%p)\n", task); g_ptr_array_remove(idle_tasks, (gpointer) task); } /* callback */ static void event_sdl_call_callback(struct callback_list *cbl) { dbg(lvl_debug, "call_callback cbl(%p)\n", cbl); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; userevent.data1 = cbl; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } static struct event_methods event_sdl_methods = { event_sdl_main_loop_run, event_sdl_main_loop_quit, event_sdl_add_watch, event_sdl_remove_watch, event_sdl_add_timeout, event_sdl_remove_timeout, event_sdl_add_idle, event_sdl_remove_idle, event_sdl_call_callback, }; static struct event_priv * event_sdl_new(struct event_methods* methods) { idle_tasks = g_ptr_array_new(); *methods = event_sdl_methods; return NULL; } /* ---------- SDL Eventhandling ---------- */ void sdl_event_init(void) { plugin_register_event_type("sdl", event_sdl_new); } navit-0.5.0+dfsg.1/navit/graphics/sdl/event_sdl.c000066400000000000000000000205101264204753600215540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "event.h" #include "event_sdl.h" #include "graphics_sdl.h" #include "debug.h" #include "callback.h" #include "plugin.h" static pthread_t sdl_watch_thread = 0; static GPtrArray *sdl_watch_list = NULL; static void event_sdl_watch_startthread(GPtrArray *); static void event_sdl_watch_stopthread(void); static struct event_watch *event_sdl_add_watch(int, enum event_watch_cond, struct callback *); static void event_sdl_remove_watch(struct event_watch *); static struct event_timeout *event_sdl_add_timeout(int, int, struct callback *); static void event_sdl_remove_timeout(struct event_timeout *); static struct event_idle *event_sdl_add_idle(int, struct callback *); static void event_sdl_remove_idle(struct event_idle *); static void event_sdl_call_callback(struct callback_list *); static Uint32 sdl_timer_callback(Uint32 interval, void* param) { struct event_timeout *timeout=(struct event_timeout*)param; dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_TIMER; userevent.data1 = timeout->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); if (timeout->multi == 0) { timeout->id = 0; return 0; // cancel timer } return interval; // reactivate timer } /* SDL Mainloop */ static void event_sdl_main_loop_run(void) { graphics_sdl_idle(NULL); event_sdl_watch_stopthread(); } static void event_sdl_main_loop_quit(void) { quit_event_loop = 1; } /* Watch */ void event_sdl_watch_thread (GPtrArray *watch_list) { struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); struct event_watch *ew; int ret; int idx; for (idx = 0; idx < watch_list->len; idx++ ) { ew = g_ptr_array_index (watch_list, idx); g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd)); } while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { for (idx = 0; idx < watch_list->len; idx++ ) { if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ ew = g_ptr_array_index (watch_list, idx); dbg(lvl_debug,"watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_WATCH; userevent.data1 = ew->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } } } g_free(pfds); pthread_exit(0); } static void event_sdl_watch_startthread(GPtrArray *watch_list) { dbg(lvl_debug,"enter\n"); if (sdl_watch_thread) event_sdl_watch_stopthread(); int ret; ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list); dbg_assert (ret == 0); } static void event_sdl_watch_stopthread() { dbg(lvl_debug,"enter\n"); if (sdl_watch_thread) { /* Notify the watch thread that the list of FDs will change */ pthread_kill(sdl_watch_thread, SIGUSR1); pthread_join(sdl_watch_thread, NULL); sdl_watch_thread = 0; } } static struct event_watch * event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { dbg(lvl_debug,"fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); event_sdl_watch_stopthread(); if (!sdl_watch_list) sdl_watch_list = g_ptr_array_new(); struct event_watch *new_ew = g_new0 (struct event_watch, 1); struct pollfd *pfd = g_new0 (struct pollfd, 1); pfd->fd = fd; /* Modify watchlist here */ switch (cond) { case event_watch_cond_read: pfd->events = POLLIN; break; case event_watch_cond_write: pfd->events = POLLOUT; break; case event_watch_cond_except: pfd->events = POLLERR|POLLHUP; break; } new_ew->pfd = (struct pollfd*) pfd; new_ew->cb = cb; g_ptr_array_add (sdl_watch_list, (gpointer)new_ew); event_sdl_watch_startthread(sdl_watch_list); return new_ew; } static void event_sdl_remove_watch(struct event_watch *ew) { dbg(lvl_debug,"enter %p\n",ew); event_sdl_watch_stopthread(); g_ptr_array_remove (sdl_watch_list, ew); g_free (ew->pfd); g_free (ew); if (sdl_watch_list->len > 0) event_sdl_watch_startthread(sdl_watch_list); } /* Timeout */ static struct event_timeout * event_sdl_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout * ret = g_new0(struct event_timeout, 1); if(!ret) { dbg(lvl_error,"g_new0 failed\n"); return ret; } dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) cb(%p) added\n",ret, multi, timeout, cb); ret->multi = multi; ret->cb = cb; ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); return ret; } static void event_sdl_remove_timeout(struct event_timeout *to) { dbg(lvl_info,"enter %p\n", to); if(to) { /* do not SDL_RemoveTimer if oneshot timer has already fired */ int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id); if (ret == SDL_FALSE) dbg(lvl_error,"SDL_RemoveTimer (%p) failed\n", to->id); g_free(to); dbg(lvl_debug,"timer(%p) removed\n", to); } } /* Idle */ /* sort ptr_array by priority, increasing order */ static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) { struct idle_task *a = (struct idle_task *)parama; struct idle_task *b = (struct idle_task *)paramb; if (a->priority < b->priority) return -1; if (a->priority > b->priority) return 1; return 0; } static struct event_idle * event_sdl_add_idle(int priority, struct callback *cb) { dbg(lvl_debug,"add idle priority(%d) cb(%p)\n", priority, cb); struct idle_task *task = g_new0(struct idle_task, 1); task->priority = priority; task->cb = cb; g_ptr_array_add(idle_tasks, (gpointer)task); if (idle_tasks->len < 2) { SDL_Event event; SDL_UserEvent userevent; dbg(lvl_debug,"poking eventloop because of new idle_events\n"); userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } else // more than one entry => sort the list g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); return (struct event_idle *)task; } static void event_sdl_remove_idle(struct event_idle *task) { dbg(lvl_debug,"remove task(%p)\n", task); g_ptr_array_remove(idle_tasks, (gpointer)task); } /* callback */ static void event_sdl_call_callback(struct callback_list *cbl) { dbg(lvl_debug,"call_callback cbl(%p)\n",cbl); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; userevent.data1 = cbl; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } static struct event_methods event_sdl_methods = { event_sdl_main_loop_run, event_sdl_main_loop_quit, event_sdl_add_watch, event_sdl_remove_watch, event_sdl_add_timeout, event_sdl_remove_timeout, event_sdl_add_idle, event_sdl_remove_idle, event_sdl_call_callback, }; static struct event_priv * event_sdl_new(struct event_methods* methods) { idle_tasks = g_ptr_array_new(); *methods = event_sdl_methods; return NULL; } void event_sdl_register(void) { plugin_register_event_type("sdl", event_sdl_new); } navit-0.5.0+dfsg.1/navit/graphics/sdl/event_sdl.h000066400000000000000000000014741264204753600215710ustar00rootroot00000000000000 #ifndef __EVENT_SDL_H #define __EVENT_SDL_H #include #include "config.h" #include "callback.h" #include "event.h" #include "graphics_sdl.h" #ifdef USE_WEBOS # define SDL_USEREVENT_CODE_TIMER 0x1 # define SDL_USEREVENT_CODE_CALL_CALLBACK 0x2 # define SDL_USEREVENT_CODE_IDLE_EVENT 0x4 # define SDL_USEREVENT_CODE_WATCH 0x8 # ifdef USE_WEBOS_ACCELEROMETER # define SDL_USEREVENT_CODE_ROTATE 0xA # endif #endif struct event_timeout { SDL_TimerID id; int multi; struct callback *cb; }; struct idle_task { int priority; struct callback *cb; }; struct event_watch { struct pollfd *pfd; struct callback *cb; }; int quit_event_loop = 0; // quit the main event loop static GPtrArray *idle_tasks = NULL; void event_sdl_watch_thread (GPtrArray *); void event_sdl_register(void); #endif navit-0.5.0+dfsg.1/navit/graphics/sdl/graphics_sdl.c000066400000000000000000001331061264204753600222410ustar00rootroot00000000000000/* graphics_sdl.c -- barebones sdl graphics layer copyright (c) 2008 bryan rittmeyer license: GPLv2 TODO: - dashed lines - proper image transparency (libsdl-image xpm does not work) - valgrind revision history: 2008-06-01 initial 2008-06-15 SDL_DOUBLEBUF+SDL_Flip for linux fb. fix FT leaks. 2008-06-18 defer initial resize_callback 2008-06-21 linux touchscreen 2008-07-04 custom rastering */ #include #include #include #include #include "config.h" #include "debug.h" #include "point.h" #include "graphics.h" #include "color.h" #include "plugin.h" #include "window.h" #include "navit.h" #include "keys.h" #include "item.h" #include "attr.h" #include "callback.h" #include "font/freetype/font_freetype.h" #include #include #ifdef USE_WEBOS # include "vehicle.h" # include # define USE_WEBOS_ACCELEROMETER #endif #ifdef USE_WEBOS #define DISPLAY_W 0 #define DISPLAY_H 0 #else #define DISPLAY_W 800 #define DISPLAY_H 600 #endif #define OVERLAY_MAX 32 #include "raster.h" #include #include #include /* TODO: union overlay + non-overlay to reduce size */ struct graphics_priv; struct graphics_priv { SDL_Surface *screen; int aa; /* video modes */ uint32_t video_flags; int video_bpp; /* */ int overlay_mode; int overlay_x; int overlay_y; struct graphics_priv *overlay_parent; int overlay_idx; /* */ /*

*/ struct graphics_priv *overlay_array[OVERLAY_MAX]; int overlay_enable; enum draw_mode_num draw_mode; int resize_callback_initial; struct navit *nav; struct callback_list *cbl; #ifdef USE_WEBOS_ACCELEROMETER SDL_Joystick *accelerometer; char orientation; int real_w, real_h; #endif struct font_freetype_methods freetype_methods; /*
*/ }; static int dummy; #ifdef USE_WEBOS # define WEBOS_KEY_SHIFT 0x130 # define WEBOS_KEY_SYM 0x131 # define WEBOS_KEY_ORANGE 0x133 # define WEBOS_KEY_MOD_SHIFT 0x1 # define WEBOS_KEY_MOD_ORANGE 0x2 # define WEBOS_KEY_MOD_SYM 0x4 # define WEBOS_KEY_MOD_SHIFT_STICKY 0x11 # define WEBOS_KEY_MOD_ORANGE_STICKY 0x22 # define WEBOS_KEY_MOD_SYM_STICKY 0x44 # ifdef USE_WEBOS_ACCELEROMETER # define WEBOS_ORIENTATION_PORTRAIT 0x1 # define WEBOS_ORIENTATION_LANDSCAPE 0x2 # endif # define SDL_USEREVENT_CODE_TIMER 0x1 # define SDL_USEREVENT_CODE_CALL_CALLBACK 0x2 # define SDL_USEREVENT_CODE_IDLE_EVENT 0x4 # define SDL_USEREVENT_CODE_WATCH 0x8 # ifdef USE_WEBOS_ACCELEROMETER # define SDL_USEREVENT_CODE_ROTATE 0xA # endif struct event_timeout { SDL_TimerID id; int multi; struct callback *cb; }; struct idle_task { int priority; struct callback *cb; }; struct event_watch { struct pollfd *pfd; struct callback *cb; }; static struct graphics_priv* the_graphics = NULL; static int quit_event_loop = 0; // quit the main event loop static int the_graphics_count = 0; // count how many graphics objects are created static GPtrArray *idle_tasks = NULL; static pthread_t sdl_watch_thread = 0; static GPtrArray *sdl_watch_list = NULL; static void event_sdl_watch_thread (GPtrArray *); static void event_sdl_watch_startthread(GPtrArray *watch_list); static void event_sdl_watch_stopthread(void); static struct event_watch *event_sdl_add_watch(int, enum event_watch_cond, struct callback *); static void event_sdl_remove_watch(struct event_watch *); static struct event_timeout *event_sdl_add_timeout(int, int, struct callback *); static void event_sdl_remove_timeout(struct event_timeout *); static struct event_idle *event_sdl_add_idle(int, struct callback *); static void event_sdl_remove_idle(struct event_idle *); static void event_sdl_call_callback(struct callback_list *); # ifdef USE_WEBOS_ACCELEROMETER static unsigned int sdl_orientation_count = 2^16; static char sdl_next_orientation = 0; # endif #endif unsigned char *ft_buffer = NULL; unsigned int ft_buffer_size = 0; struct graphics_gc_priv { struct graphics_priv *gr; Uint8 fore_r; Uint8 fore_g; Uint8 fore_b; Uint8 fore_a; Uint8 back_r; Uint8 back_g; Uint8 back_b; Uint8 back_a; int linewidth; }; struct graphics_image_priv { SDL_Surface *img; }; static void graphics_destroy(struct graphics_priv *gr) { dbg(lvl_debug, "graphics_destroy %p %u\n", gr, gr->overlay_mode); if(gr->overlay_mode) { SDL_FreeSurface(gr->screen); gr->overlay_parent->overlay_array[gr->overlay_idx] = NULL; } else { g_free (ft_buffer); gr->freetype_methods.destroy(); #ifdef USE_WEBOS_ACCELEROMETER SDL_JoystickClose(gr->accelerometer); #endif #ifdef USE_WEBOS PDL_Quit(); #endif SDL_Quit(); } g_free(gr); } /* graphics_gc */ static void gc_destroy(struct graphics_gc_priv *gc) { g_free(gc); } static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { dbg(lvl_debug, "gc_set_linewidth %p %d\n", gc, w); gc->linewidth = w; } static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { /* TODO */ } static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { dbg(lvl_debug, "gc_set_foreground: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b); gc->fore_r = c->r/256; gc->fore_g = c->g/256; gc->fore_b = c->b/256; gc->fore_a = c->a/256; } static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { dbg(lvl_debug, "gc_set_background: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b); gc->back_r = c->r/256; gc->back_g = c->g/256; gc->back_b = c->b/256; gc->back_a = c->a/256; } static struct graphics_gc_methods gc_methods = { gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { struct graphics_gc_priv *gc=g_new0(struct graphics_gc_priv, 1); *meth=gc_methods; gc->gr=gr; gc->linewidth=1; /* upper layer should override anyway? */ return gc; } static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) { struct graphics_image_priv *gi; /* FIXME: meth is not used yet.. so gi leaks. at least xpm is small */ gi = g_new0(struct graphics_image_priv, 1); gi->img = IMG_Load(name); if(gi->img) { /* TBD: improves blit performance? */ #if !SDL_VERSION_ATLEAST(1,3,0) SDL_SetColorKey(gi->img, SDL_RLEACCEL, gi->img->format->colorkey); #endif *w=gi->img->w; *h=gi->img->h; hot->x=*w/2; hot->y=*h/2; } else { /* TODO: debug "colour parse errors" on xpm */ dbg(lvl_error,"image_new on '%s' failed: %s\n", name, IMG_GetError()); g_free(gi); gi = NULL; } return gi; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv * gi) { SDL_FreeSurface(gi->img); g_free(gi); } static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } Sint16 *vx, *vy; Sint16 x, y; int i; vx = alloca(count * sizeof(Sint16)); vy = alloca(count * sizeof(Sint16)); for(i = 0; i < count; i++) { x = (Sint16)p[i].x; y = (Sint16)p[i].y; vx[i] = x; vy[i] = y; dbg(lvl_debug, "draw_polygon: %p %i %d,%d\n", gc, i, p[i].x, p[i].y); } if(gr->aa) { raster_aapolygon(gr->screen, count, vx, vy, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } else { raster_polygon(gr->screen, count, vx, vy, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } } static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } dbg(lvl_debug, "draw_rectangle: %d %d %d %d r=%d g=%d b=%d a=%d\n", p->x, p->y, w, h, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); if(w > gr->screen->w) { w = gr->screen->w; } if(h > gr->screen->h) { h = gr->screen->h; } raster_rect(gr->screen, p->x, p->y, w, h, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } /* FIXME: does not quite match gtk */ /* hack for osd compass.. why is this needed!? */ if(gr->overlay_mode) { r = r / 2; } if(gr->aa) { raster_aacircle(gr->screen, p->x, p->y, r, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } else { raster_circle(gr->screen, p->x, p->y, r, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } } static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } /* you might expect lines to be simpler than the other shapes. but, that would be wrong. 1 line can generate 1 polygon + 2 circles and even worse, we have to calculate their parameters! go dust off your trigonometry hat. */ /* sort of based on graphics_opengl.c::draw_lines */ /* FIXME: should honor ./configure flag for no fp. this could be 100% integer code pretty easily, except that i am lazy */ struct point vert[4]; int lw = gc->linewidth; //int lw = 1; int i; for(i = 0; i < count-1; i++) { float dx=p[i+1].x-p[i].x; float dy=p[i+1].y-p[i].y; float angle; int x_lw_adj, y_lw_adj; if(lw == 1) { if(gr->aa) { raster_aaline(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } else { raster_line(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, SDL_MapRGBA(gr->screen->format, gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a)); } } else { /* there is probably a much simpler way but this works ok */ /* FIXME: float + double mixture */ /* FIXME: lrint(round())? */ if(dy == 0.0) { angle = 0.0; x_lw_adj = 0; y_lw_adj = round((float)lw/2.0); } else if(dx == 0.0) { angle = 0.0; x_lw_adj = round((float)lw/2.0); y_lw_adj = 0; } else { angle = (M_PI/2.0) - atan(abs(dx)/abs(dy)); x_lw_adj = round(sin(angle)*(float)lw/2.0); y_lw_adj = round(cos(angle)*(float)lw/2.0); if((x_lw_adj < 0) || (y_lw_adj < 0)) { dbg(lvl_debug, "i=%d\n", i); dbg(lvl_debug, " %d,%d->%d,%d\n", p[i].x, p[i].y, p[i+1].x, p[i+1].y); dbg(lvl_debug, " lw=%d angle=%f\n", lw, 180.0 * angle / M_PI); dbg(lvl_debug, " x_lw_adj=%d y_lw_adj=%d\n", x_lw_adj, y_lw_adj); } } if(p[i+1].x > p[i].x) { x_lw_adj = -x_lw_adj; } if(p[i+1].y > p[i].y) { y_lw_adj = -y_lw_adj; } /* FIXME: draw a circle/square if p[i]==p[i+1]? */ /* FIXME: clipping, check for neg values. hoping sdl-gfx does this */ vert[0].x = p[i].x + x_lw_adj; vert[0].y = p[i].y - y_lw_adj; vert[1].x = p[i].x - x_lw_adj; vert[1].y = p[i].y + y_lw_adj; vert[2].x = p[i+1].x - x_lw_adj; vert[2].y = p[i+1].y + y_lw_adj; vert[3].x = p[i+1].x + x_lw_adj; vert[3].y = p[i+1].y - y_lw_adj; draw_polygon(gr, gc, vert, 4); /* draw small circles at the ends. this looks better than nothing, and slightly * better than the triangle used by graphics_opengl, but is more expensive. * should have an ifdef/xml attr? */ /* FIXME: should just draw a half circle */ /* now some circular endcaps, if the width is over 2 */ if(lw > 2) { if(i == 0) { draw_circle(gr, gc, &p[i], lw/2); } /* we truncate on the divide on purpose, so we don't go outside the line */ draw_circle(gr, gc, &p[i+1], lw/2); } } } } static void set_pixel(SDL_Surface *surface, int x, int y, Uint8 r2, Uint8 g2, Uint8 b2, Uint8 a2) { if(x<0 || y<0 || x>=surface->w || y>=surface->h) { return; } void *target_pixel = ((Uint8*)surface->pixels + y * surface->pitch + x * surface->format->BytesPerPixel); Uint8 r1,g1,b1,a1; switch(surface->format->BytesPerPixel) { case 2: { SDL_GetRGBA(*(Uint16 *)target_pixel, surface->format, &r1, &g1, &b1, &a1); *(Uint16 *)target_pixel = SDL_MapRGBA(surface->format, (r1*(0xff-a2)/0xff) + (r2*a2/0xff), (g1*(0xff-a2)/0xff) + (g2*a2/0xff), (b1*(0xff-a2)/0xff) + (b2*a2/0xff), a2 + a1*(0xff-a2)/0xff ); break; } case 4: { SDL_GetRGBA(*(Uint32 *)target_pixel, surface->format, &r1, &g1, &b1, &a1); *(Uint32 *)target_pixel = SDL_MapRGBA(surface->format, (r1*(0xff-a2)/0xff) + (r2*a2/0xff), (g1*(0xff-a2)/0xff) + (g2*a2/0xff), (b1*(0xff-a2)/0xff) + (b2*a2/0xff), a2 + a1*(0xff-a2)/0xff ); break; } } } static void resize_ft_buffer (unsigned int new_size) { if (new_size > ft_buffer_size) { g_free (ft_buffer); ft_buffer = g_malloc (new_size); dbg(lvl_debug, "old_size(%u) new_size(%u) ft_buffer(%p)\n", ft_buffer_size, new_size, ft_buffer); ft_buffer_size = new_size; } } static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, int color, struct point *p) { int i, x, y, stride; struct font_freetype_glyph *g, **gp; struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 }; struct color black = { fg->fore_r * 255, fg->fore_g * 255, fg->fore_b * 255, fg->fore_a * 255 }; struct color white = { 0xffff, 0xffff, 0xffff, 0xffff }; if (bg) { if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) { black.r = 65535; black.g = 65535; black.b = 65535; black.a = 65535; white.r = 0; white.g = 0; white.b = 0; white.a = 65535; } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) { white.r = 65535; white.g = 65535; white.b = 65535; white.a = 65535; black.r = 0; black.g = 0; black.b = 0; black.a = 65535; } else { white.r = bg->fore_r * 255; white.g = bg->fore_g * 255; white.b = bg->fore_b * 255; white.a = bg->fore_a * 255; } } else { white.r = 0; white.g = 0; white.b = 0; white.a = 0; } gp = text->glyph; i = text->glyph_count; x = p->x << 6; y = p->y << 6; while (i-- > 0) { g = *gp++; if (g->w && g->h && bg) { stride = (g->w + 2) * 4; if (color) { resize_ft_buffer(stride * (g->h + 2)); gr->freetype_methods.get_shadow(g, ft_buffer, stride, &white, &transparent); SDL_Surface *glyph_surface = SDL_CreateRGBSurfaceFrom(ft_buffer, g->w + 2, g->h + 2, 32, stride, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); if (glyph_surface) { SDL_Rect r; r.x = (x + g->x) >> 6; r.y = (y + g->y) >> 6; r.w = g->w + 2; r.h = g->h + 2; SDL_BlitSurface(glyph_surface, NULL, gr->screen, &r); SDL_FreeSurface(glyph_surface); } } } x += g->dx; y += g->dy; } gp = text->glyph; i = text->glyph_count; x = p->x << 6; y = p->y << 6; while (i-- > 0) { g = *gp++; if (g->w && g->h) { if (color) { stride = g->w; if (bg) { resize_ft_buffer(stride * g->h * 4); gr->freetype_methods.get_glyph(g, ft_buffer, stride * 4, &black, &white, &transparent); SDL_Surface *glyph_surface = SDL_CreateRGBSurfaceFrom(ft_buffer, g->w, g->h, 32, stride * 4, 0x000000ff,0x0000ff00, 0x00ff0000,0xff000000); if (glyph_surface) { SDL_Rect r; r.x = (x + g->x) >> 6; r.y = (y + g->y) >> 6; r.w = g->w; r.h = g->h; SDL_BlitSurface(glyph_surface, NULL, gr->screen,&r); SDL_FreeSurface(glyph_surface); } } stride *= 4; resize_ft_buffer(stride * g->h); gr->freetype_methods.get_glyph(g, ft_buffer, stride, &black, &white, &transparent); int ii, jj; unsigned char* pGlyph = ft_buffer; for (jj = 0; jj < g->h; ++jj) { for (ii = 0; ii < g->w; ++ii) { if(*(pGlyph+3) > 0) { set_pixel(gr->screen, ii+((x + g->x) >> 6), jj+((y + g->y) >> 6), *(pGlyph+2), // Pixels are in BGRA format *(pGlyph+1), *(pGlyph+0), *(pGlyph+3) ); } pGlyph += 4; } } } } x += g->dx; y += g->dy; } } static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable)) { return; } struct font_freetype_text *t; int color = 1; if (!font) { dbg(lvl_error, "no font, returning\n"); return; } t = gr->freetype_methods.text_new(text, (struct font_freetype_font *) font, dx, dy); struct point p_eff; p_eff.x = p->x; p_eff.y = p->y; display_text_draw(t, gr, fg, bg, color, &p_eff); gr->freetype_methods.text_destroy(t); } static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) { return; } SDL_Rect r; r.x = p->x; r.y = p->y; r.w = img->img->w; r.h = img->img->h; SDL_BlitSurface(img->img, NULL, gr->screen, &r); } static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { dbg(lvl_debug, "background_gc\n"); } static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { struct graphics_priv *ov; SDL_Rect rect; int i; if(gr->overlay_mode) { /* will be drawn below */ } else { dbg(lvl_debug, "draw_mode: %d\n", mode); if(mode == draw_mode_end) { if((gr->draw_mode == draw_mode_begin) && gr->overlay_enable) { for(i = 0; i < OVERLAY_MAX; i++) { ov = gr->overlay_array[i]; if(ov && ov->overlay_enable) { rect.x = ov->overlay_x; if(rect.x<0) rect.x += gr->screen->w; rect.y = ov->overlay_y; if(rect.y<0) rect.y += gr->screen->h; rect.w = ov->screen->w; rect.h = ov->screen->h; SDL_BlitSurface(ov->screen, NULL, gr->screen, &rect); } } } SDL_Flip(gr->screen); } gr->draw_mode = mode; } } static void overlay_disable(struct graphics_priv *gr, int disable) { gr->overlay_enable = !disable; struct graphics_priv *curr_gr = gr; if(gr->overlay_parent) { curr_gr = gr->overlay_parent; } draw_mode(curr_gr,draw_mode_end); } static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); static int window_fullscreen(struct window *win, int on) { struct graphics_priv *gr=(struct graphics_priv *)win->priv; /* Update video flags */ if(on) { gr->video_flags |= SDL_FULLSCREEN; } else { gr->video_flags &= ~SDL_FULLSCREEN; } /* Update video mode */ gr->screen = SDL_SetVideoMode(gr->screen->w, gr->screen->h, gr->video_bpp, gr->video_flags); if(gr->screen == NULL) { navit_destroy(gr->nav); } else { callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h)); } return 1; } static void * get_data(struct graphics_priv *this, char const *type) { if(strcmp(type, "window") == 0) { struct window *win; win=g_new(struct window, 1); win->priv=this; win->fullscreen=window_fullscreen; win->disable_suspend=NULL; return win; } else { return &dummy; } } static void draw_drag(struct graphics_priv *gr, struct point *p) { if(p) { gr->overlay_x = p->x; gr->overlay_y = p->y; } } static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, draw_lines, draw_polygon, draw_rectangle, NULL /* draw_circle */, draw_text, draw_image, NULL, /*draw_image_warp */ draw_drag, NULL, /* font_new */ gc_new, background_gc, overlay_new, image_new, get_data, image_free, NULL, /* get_text_bbox */ overlay_disable, NULL, /* overlay_resize */ NULL, /* set_attr */ }; static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int wraparound) { struct graphics_priv *ov; Uint32 rmask, gmask, bmask, amask; int i; for(i = 0; i < OVERLAY_MAX; i++) { if(gr->overlay_array[i] == NULL) { break; } } if(i == OVERLAY_MAX) { dbg(lvl_error, "too many overlays! increase OVERLAY_MAX\n"); return NULL; } dbg(lvl_debug, "overlay_new %d %d %d %u %u (%x, %x, %x ,%x, %d)\n", i, p->x, p->y, w, h, gr->screen->format->Rmask, gr->screen->format->Gmask, gr->screen->format->Bmask, gr->screen->format->Amask, gr->screen->format->BitsPerPixel ); ov = g_new0(struct graphics_priv, 1); switch(gr->screen->format->BitsPerPixel) { case 8: rmask = 0xc0; gmask = 0x30; bmask = 0x0c; amask = 0x03; break; case 16: rmask = 0xf000; gmask = 0x0f00; bmask = 0x00f0; amask = 0x000f; break; case 32: rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; break; default: rmask = gr->screen->format->Rmask; gmask = gr->screen->format->Gmask; bmask = gr->screen->format->Bmask; amask = gr->screen->format->Amask; } ov->screen = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, gr->screen->format->BitsPerPixel, rmask, gmask, bmask, amask); ov->overlay_mode = 1; ov->overlay_enable = 1; ov->overlay_x = p->x; ov->overlay_y = p->y; ov->overlay_parent = gr; ov->overlay_idx = i; gr->overlay_array[i] = ov; struct font_priv *(*font_freetype_new) (void *meth); font_freetype_new = plugin_get_font_type ("freetype"); if (!font_freetype_new) { return NULL; } font_freetype_new (&ov->freetype_methods); *meth=graphics_methods; meth->font_new = (struct graphics_font_priv * (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int)) ov->freetype_methods.font_new; meth->get_text_bbox = (void *)ov->freetype_methods.get_text_bbox; return ov; } static gboolean graphics_sdl_idle(void *data) { struct graphics_priv *gr = (struct graphics_priv *)data; struct point p; SDL_Event ev; int ret; char key_mod = 0; char keybuf[8]; #ifdef USE_WEBOS if(data==NULL) { if(the_graphics!=NULL) { gr = the_graphics; } else { dbg(lvl_error,"graphics_idle: graphics not set!\n"); return FALSE; } } #endif /* generate the initial resize callback, so the gui knows W/H its unsafe to do this directly inside register_resize_callback; graphics_gtk does it during Configure, but SDL does not have an equivalent event, so we use our own flag */ if(gr->resize_callback_initial != 0) { callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h)); gr->resize_callback_initial = 0; } #ifdef USE_WEBOS_ACCELEROMETER struct callback* accel_cb = NULL; struct event_timeout* accel_to = NULL; if (PDL_GetPDKVersion() > 100) { accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr); accel_to = event_add_timeout(200, 1, accel_cb); } #endif #ifdef USE_WEBOS unsigned int idle_tasks_idx=0; unsigned int idle_tasks_cur_priority=0; struct idle_task *task; while(!quit_event_loop) #else while(1) #endif { #ifdef USE_WEBOS ret = 0; if(idle_tasks->len > 0) { while (!(ret = SDL_PollEvent(&ev)) && idle_tasks->len > 0) { if (idle_tasks_idx >= idle_tasks->len) idle_tasks_idx = 0; dbg(lvl_debug,"idle_tasks_idx(%d)\n",idle_tasks_idx); task = (struct idle_task *)g_ptr_array_index(idle_tasks,idle_tasks_idx); if (idle_tasks_idx == 0) // only execute tasks with lowest priority value idle_tasks_cur_priority = task->priority; if (task->priority > idle_tasks_cur_priority) idle_tasks_idx = 0; else { callback_call_0(task->cb); idle_tasks_idx++; } } } if (!ret) // If we get here there are no idle_tasks and we have no events pending ret = SDL_WaitEvent(&ev); #else ret = SDL_PollEvent(&ev); #endif if(ret == 0) { break; } #ifdef USE_WEBOS dbg(lvl_debug,"SDL_Event %d\n", ev.type); #endif switch(ev.type) { case SDL_MOUSEMOTION: { p.x = ev.motion.x; p.y = ev.motion.y; callback_list_call_attr_1(gr->cbl, attr_motion, (void *)&p); break; } case SDL_KEYDOWN: { memset(keybuf, 0, sizeof(keybuf)); switch(ev.key.keysym.sym) { case SDLK_LEFT: { keybuf[0] = NAVIT_KEY_LEFT; break; } case SDLK_RIGHT: { keybuf[0] = NAVIT_KEY_RIGHT; break; } case SDLK_BACKSPACE: { keybuf[0] = NAVIT_KEY_BACKSPACE; break; } case SDLK_RETURN: { keybuf[0] = NAVIT_KEY_RETURN; break; } case SDLK_DOWN: { keybuf[0] = NAVIT_KEY_DOWN; break; } case SDLK_PAGEUP: { keybuf[0] = NAVIT_KEY_ZOOM_OUT; break; } case SDLK_UP: { keybuf[0] = NAVIT_KEY_UP; break; } case SDLK_PAGEDOWN: { keybuf[0] = NAVIT_KEY_ZOOM_IN; break; } #ifdef USE_WEBOS case WEBOS_KEY_SHIFT: { if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) == WEBOS_KEY_MOD_SHIFT_STICKY) key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY); else if ((key_mod & WEBOS_KEY_MOD_SHIFT) == WEBOS_KEY_MOD_SHIFT) key_mod |= WEBOS_KEY_MOD_SHIFT_STICKY; else key_mod |= WEBOS_KEY_MOD_SHIFT; break; } case WEBOS_KEY_ORANGE: { if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) == WEBOS_KEY_MOD_ORANGE_STICKY) key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY); else if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) key_mod |= WEBOS_KEY_MOD_ORANGE_STICKY; else key_mod |= WEBOS_KEY_MOD_ORANGE; break; } case WEBOS_KEY_SYM: { /* Toggle the on-screen keyboard */ //callback_list_call_attr_1(gr->cbl, attr_keyboard_toggle); // Not implemented yet break; } case PDLK_GESTURE_BACK: { keybuf[0] = NAVIT_KEY_BACK; break; } case PDLK_GESTURE_FORWARD: case PDLK_GESTURE_AREA: { break; } #endif default: { #ifdef USE_WEBOS if (ev.key.keysym.unicode < 0x80 && ev.key.keysym.unicode > 0) { keybuf[0] = (char)ev.key.keysym.unicode; if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) { switch(keybuf[0]) { case 'e': keybuf[0] = '1'; break; case 'r': keybuf[0] = '2'; break; case 't': keybuf[0] = '3'; break; case 'd': keybuf[0] = '4'; break; case 'f': keybuf[0] = '5'; break; case 'g': keybuf[0] = '6'; break; case 'x': keybuf[0] = '7'; break; case 'c': keybuf[0] = '8'; break; case 'v': keybuf[0] = '9'; break; case '@': keybuf[0] = '0'; break; case ',': keybuf[0] = '-'; break; case 'u': strncpy(keybuf, "ü", sizeof(keybuf)); break; case 'a': strncpy(keybuf, "ä", sizeof(keybuf)); break; case 'o': strncpy(keybuf, "ö", sizeof(keybuf)); break; case 's': strncpy(keybuf, "ß", sizeof(keybuf)); break; } } if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) != WEBOS_KEY_MOD_SHIFT_STICKY) key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY); if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) != WEBOS_KEY_MOD_ORANGE_STICKY) key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY); } else { dbg(lvl_error,"Unknown key sym: %x\n", ev.key.keysym.sym); } #else /* return unicode chars when they can be converted to ascii */ keybuf[0] = ev.key.keysym.unicode<=127 ? ev.key.keysym.unicode : 0; #endif break; } } dbg(lvl_info,"key mod: 0x%x\n", key_mod); if (keybuf[0]) { callback_list_call_attr_1(gr->cbl, attr_keypress, (void *)keybuf); } break; } case SDL_KEYUP: { break; } case SDL_MOUSEBUTTONDOWN: { dbg(lvl_debug, "SDL_MOUSEBUTTONDOWN %d %d %d %d %d\n", ev.button.which, ev.button.button, ev.button.state, ev.button.x, ev.button.y); p.x = ev.button.x; p.y = ev.button.y; callback_list_call_attr_3(gr->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER((int)ev.button.button), (void *)&p); break; } case SDL_MOUSEBUTTONUP: { dbg(lvl_debug, "SDL_MOUSEBUTTONUP %d %d %d %d %d\n", ev.button.which, ev.button.button, ev.button.state, ev.button.x, ev.button.y); p.x = ev.button.x; p.y = ev.button.y; callback_list_call_attr_3(gr->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER((int)ev.button.button), (void *)&p); break; } case SDL_QUIT: { #ifdef USE_WEBOS quit_event_loop = 1; navit_destroy(gr->nav); #endif break; } case SDL_VIDEORESIZE: { gr->screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, gr->video_bpp, gr->video_flags); if(gr->screen == NULL) { navit_destroy(gr->nav); } else { callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h)); } break; } #ifdef USE_WEBOS case SDL_USEREVENT: { SDL_UserEvent userevent = ev.user; dbg(lvl_info,"received SDL_USEREVENT type(%x) code(%x)\n",userevent.type,userevent.code); if (userevent.type != SDL_USEREVENT) break; if (userevent.code == PDL_GPS_UPDATE) { struct attr vehicle_attr; struct vehicle *v; navit_get_attr(gr->nav, attr_vehicle, &vehicle_attr, NULL); v = vehicle_attr.u.vehicle; if (v) { struct attr attr; attr.type = attr_pdl_gps_update; attr.u.data = userevent.data1; vehicle_set_attr(v, &attr); } } else if(userevent.code == SDL_USEREVENT_CODE_TIMER) { struct callback *cb = (struct callback *)userevent.data1; dbg(lvl_debug, "SDL_USEREVENT timer received cb(%p)\n", cb); callback_call_0(cb); } else if(userevent.code == SDL_USEREVENT_CODE_WATCH) { struct callback *cb = (struct callback *)userevent.data1; dbg(lvl_debug, "SDL_USEREVENT watch received cb(%p)\n", cb); callback_call_0(cb); } else if(userevent.code == SDL_USEREVENT_CODE_CALL_CALLBACK) { struct callback_list *cbl = (struct callback_list *)userevent.data1; dbg(lvl_debug, "SDL_USEREVENT call_callback received cbl(%p)\n", cbl); callback_list_call_0(cbl); } else if(userevent.code == SDL_USEREVENT_CODE_IDLE_EVENT) { dbg(lvl_debug, "SDL_USEREVENT idle_event received\n"); } #ifdef USE_WEBOS_ACCELEROMETER else if(userevent.code == SDL_USEREVENT_CODE_ROTATE) { dbg(lvl_debug, "SDL_USEREVENT rotate received\n"); switch(gr->orientation) { case WEBOS_ORIENTATION_PORTRAIT: gr->screen = SDL_SetVideoMode(gr->real_w, gr->real_h, gr->video_bpp, gr->video_flags); PDL_SetOrientation(PDL_ORIENTATION_0); break; case WEBOS_ORIENTATION_LANDSCAPE: gr->screen = SDL_SetVideoMode(gr->real_h, gr->real_w, gr->video_bpp, gr->video_flags); PDL_SetOrientation(PDL_ORIENTATION_270); break; } if(gr->screen == NULL) { navit_destroy(gr->nav); } else { callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); } } #endif else dbg(lvl_warning, "unknown SDL_USEREVENT\n"); break; } #endif default: { dbg(lvl_debug, "SDL_Event %d\n", ev.type); break; } } } #ifdef USE_WEBOS event_sdl_watch_stopthread(); #endif #ifdef USE_WEBOS_ACCELEROMETER if (PDL_GetPDKVersion() > 100) { event_remove_timeout(accel_to); callback_destroy(accel_cb); } #endif return TRUE; } static struct graphics_priv * graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct graphics_priv *this=g_new0(struct graphics_priv, 1); struct font_priv *(*font_freetype_new) (void *meth); struct attr *attr; int ret; int w=DISPLAY_W,h=DISPLAY_H; this->nav = nav; this->cbl = cbl; /* initialize fonts */ font_freetype_new = plugin_get_font_type("freetype"); if (!font_freetype_new) { g_free(this); return NULL; } font_freetype_new(&this->freetype_methods); *meth = graphics_methods; meth->font_new = (struct graphics_font_priv * (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int)) this->freetype_methods.font_new; meth->get_text_bbox = (void*) this->freetype_methods.get_text_bbox; dbg(lvl_debug,"Calling SDL_Init\n"); #ifdef USE_WEBOS # ifdef USE_WEBOS_ACCELEROMETER ret = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_JOYSTICK); # else ret = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); # endif #else ret = SDL_Init(SDL_INIT_VIDEO); #endif if(ret < 0) { dbg(lvl_error,"SDL_Init failed %d\n", ret); this->freetype_methods.destroy(); g_free(this); return NULL; } #ifdef USE_WEBOS dbg(lvl_debug,"Calling PDL_Init(0)\n"); ret = PDL_Init(0); if(ret < 0) { dbg(lvl_error,"PDL_Init failed %d\n", ret); this->freetype_methods.destroy(); g_free(this); return NULL; } if (! event_request_system("sdl","graphics_sdl_new")) { #else if (! event_request_system("glib","graphics_sdl_new")) { #endif dbg(lvl_error,"event_request_system failed"); this->freetype_methods.destroy(); g_free(this); return NULL; } #ifdef USE_WEBOS this->video_bpp = 0; this->video_flags = SDL_SWSURFACE | SDL_ANYFORMAT | SDL_RESIZABLE; #else this->video_bpp = 16; this->video_flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE; #endif if ((attr=attr_search(attrs, NULL, attr_w))) w=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_h))) h=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_bpp))) this->video_bpp=attr->u.num; if ((attr=attr_search(attrs, NULL, attr_flags))) { if (attr->u.num & 1) this->video_flags = SDL_SWSURFACE; } if ((attr=attr_search(attrs, NULL, attr_frame))) { if(!attr->u.num) this->video_flags |= SDL_NOFRAME; } this->screen = SDL_SetVideoMode(w, h, this->video_bpp, this->video_flags); if(this->screen == NULL) { dbg(lvl_error,"SDL_SetVideoMode failed\n"); this->freetype_methods.destroy(); g_free(this); #ifdef USE_WEBOS PDL_Quit(); #endif SDL_Quit(); return NULL; } /* Use screen size instead of requested */ w = this->screen->w; h = this->screen->h; dbg(lvl_debug, "using screen %ix%i@%i\n", this->screen->w, this->screen->h, this->screen->format->BytesPerPixel * 8); #ifdef USE_WEBOS_ACCELEROMETER if ( w > h ) { this->orientation = WEBOS_ORIENTATION_LANDSCAPE; this->real_w = h; this->real_h = w; } else { this->orientation = WEBOS_ORIENTATION_PORTRAIT; this->real_w = w; this->real_h = h; } this->accelerometer = SDL_JoystickOpen(0); #endif SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); #ifdef USE_WEBOS PDL_SetOrientation(PDL_ORIENTATION_0); #endif SDL_EnableUNICODE(1); SDL_WM_SetCaption("navit", NULL); #ifdef USE_WEBOS if(the_graphics!=NULL) { dbg(lvl_debug,"graphics_sdl_new: graphics struct already set: %d!\n", the_graphics_count); } the_graphics = this; the_graphics_count++; #else g_timeout_add(G_PRIORITY_DEFAULT+10, graphics_sdl_idle, this); #endif this->overlay_enable = 1; this->aa = 1; if((attr=attr_search(attrs, NULL, attr_antialias))) this->aa = attr->u.num; this->resize_callback_initial=1; return this; } #ifdef USE_WEBOS /* ---------- SDL Eventhandling ---------- */ static Uint32 sdl_timer_callback(Uint32 interval, void* param) { struct event_timeout *timeout=(struct event_timeout*)param; dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_TIMER; userevent.data1 = timeout->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); if (timeout->multi == 0) { timeout->id = 0; return 0; // cancel timer } return interval; // reactivate timer } /* SDL Mainloop */ static void event_sdl_main_loop_run(void) { PDL_ScreenTimeoutEnable(PDL_FALSE); graphics_sdl_idle(NULL); PDL_ScreenTimeoutEnable(PDL_TRUE); } static void event_sdl_main_loop_quit(void) { quit_event_loop = 1; } /* Watch */ static void event_sdl_watch_thread (GPtrArray *watch_list) { struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); struct event_watch *ew; int ret; int idx; for (idx = 0; idx < watch_list->len; idx++ ) { ew = g_ptr_array_index (watch_list, idx); g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd)); } while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { for (idx = 0; idx < watch_list->len; idx++ ) { if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ ew = g_ptr_array_index (watch_list, idx); dbg(lvl_debug,"watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_WATCH; userevent.data1 = ew->cb; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } } } g_free(pfds); pthread_exit(0); } static void event_sdl_watch_startthread(GPtrArray *watch_list) { dbg(lvl_debug,"enter\n"); if (sdl_watch_thread) event_sdl_watch_stopthread(); int ret; ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list); dbg_assert (ret == 0); } static void event_sdl_watch_stopthread() { dbg(lvl_debug,"enter\n"); if (sdl_watch_thread) { /* Notify the watch thread that the list of FDs will change */ pthread_kill(sdl_watch_thread, SIGUSR1); pthread_join(sdl_watch_thread, NULL); sdl_watch_thread = 0; } } static struct event_watch * event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { dbg(lvl_debug,"fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); event_sdl_watch_stopthread(); if (!sdl_watch_list) sdl_watch_list = g_ptr_array_new(); struct event_watch *new_ew = g_new0 (struct event_watch, 1); struct pollfd *pfd = g_new0 (struct pollfd, 1); pfd->fd = fd; /* Modify watchlist here */ switch (cond) { case event_watch_cond_read: pfd->events = POLLIN; break; case event_watch_cond_write: pfd->events = POLLOUT; break; case event_watch_cond_except: pfd->events = POLLERR|POLLHUP; break; } new_ew->pfd = (struct pollfd*) pfd; new_ew->cb = cb; g_ptr_array_add (sdl_watch_list, (gpointer)new_ew); event_sdl_watch_startthread(sdl_watch_list); return new_ew; } static void event_sdl_remove_watch(struct event_watch *ew) { dbg(lvl_debug,"enter %p\n",ew); event_sdl_watch_stopthread(); g_ptr_array_remove (sdl_watch_list, ew); g_free (ew->pfd); g_free (ew); if (sdl_watch_list->len > 0) event_sdl_watch_startthread(sdl_watch_list); } /* Timeout */ static struct event_timeout * event_sdl_add_timeout(int timeout, int multi, struct callback *cb) { struct event_timeout * ret = g_new0(struct event_timeout, 1); if(!ret) { dbg(lvl_error,"g_new0 failed\n"); return ret; } dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) cb(%p) added\n",ret, multi, timeout, cb); ret->multi = multi; ret->cb = cb; ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); return ret; } static void event_sdl_remove_timeout(struct event_timeout *to) { dbg(lvl_info,"enter %p\n", to); if(to) { /* do not SDL_RemoveTimer if oneshot timer has already fired */ int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id); if (ret == SDL_FALSE) dbg(lvl_error,"SDL_RemoveTimer (%p) failed\n", to->id); g_free(to); dbg(lvl_debug,"timer(%p) removed\n", to); } } /* Idle */ /* sort ptr_array by priority, increasing order */ static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) { struct idle_task *a = (struct idle_task *)parama; struct idle_task *b = (struct idle_task *)paramb; if (a->priority < b->priority) return -1; if (a->priority > b->priority) return 1; return 0; } static struct event_idle * event_sdl_add_idle(int priority, struct callback *cb) { dbg(lvl_debug,"add idle priority(%d) cb(%p)\n", priority, cb); struct idle_task *task = g_new0(struct idle_task, 1); task->priority = priority; task->cb = cb; g_ptr_array_add(idle_tasks, (gpointer)task); if (idle_tasks->len < 2) { SDL_Event event; SDL_UserEvent userevent; dbg(lvl_debug,"poking eventloop because of new idle_events\n"); userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } else // more than one entry => sort the list g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); return (struct event_idle *)task; } static void event_sdl_remove_idle(struct event_idle *task) { dbg(lvl_debug,"remove task(%p)\n", task); g_ptr_array_remove(idle_tasks, (gpointer)task); } /* callback */ static void event_sdl_call_callback(struct callback_list *cbl) { dbg(lvl_debug,"call_callback cbl(%p)\n",cbl); SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; userevent.data1 = cbl; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent (&event); } static struct event_methods event_sdl_methods = { event_sdl_main_loop_run, event_sdl_main_loop_quit, event_sdl_add_watch, event_sdl_remove_watch, event_sdl_add_timeout, event_sdl_remove_timeout, event_sdl_add_idle, event_sdl_remove_idle, event_sdl_call_callback, }; static struct event_priv * event_sdl_new(struct event_methods* methods) { idle_tasks = g_ptr_array_new(); *methods = event_sdl_methods; return NULL; } /* ---------- SDL Eventhandling ---------- */ #endif void plugin_init(void) { #ifdef USE_WEBOS plugin_register_event_type("sdl", event_sdl_new); #endif plugin_register_graphics_type("sdl", graphics_sdl_new); } // vim: sw=4 ts=8 navit-0.5.0+dfsg.1/navit/graphics/sdl/graphics_sdl.h000066400000000000000000000002551264204753600222440ustar00rootroot00000000000000 #ifndef __GRAPHICS_SDL_H #define __GRAPHICS_SDL_H #include #ifdef USE_WEBOS # define USE_WEBOS_ACCELEROMETER #endif gboolean graphics_sdl_idle(void *); #endif navit-0.5.0+dfsg.1/navit/graphics/sdl/raster.c000066400000000000000000001246261264204753600211060ustar00rootroot00000000000000/* raster.c -- line/rect/circle/poly rasterization copyright (c) 2008 bryan rittmeyer license: LGPLv2 based on SDL_gfx (c) A. Schiffler and SGE (c)1999-2003 Anders Lindström + added filled anti-aliased polygons + fixed some bugs and improved performance revision history 2008-07-05 initial 2008-07-06 aacircle */ #include #include "raster.h" #undef DEBUG #undef PARANOID /* raster_rect */ static inline void raster_rect_inline(SDL_Surface *dst, int16_t x1, int16_t y1, int16_t w, int16_t h, uint32_t color) { /* sge */ SDL_Rect rect; #if 1 if((w <= 0) || (h <= 0)) { return; } #if 0 if(x1 < 0) { if((x1 + w) < 0) { return; } else { w = w + x1; x1 = 0; } } if(y1 < 0) { if((y1 + h) < 0) { return; } else { h = h + y1; y1 = 0; } } if(x1 + w >= dst->w) { w = dst->w - x1; } if(y1 + h >= dst->h) { h = dst->h - y1; } #endif rect.x = x1; rect.y = y1; rect.w = w; rect.h = h; /* will clip internally */ SDL_FillRect(dst, &rect, color); #else x2 = x1 + w; y2 = y1 + h; /* * Order coordinates to ensure that * x1<=x2 and y1<=y2 */ if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; } if (y1 > y2) { tmp = y1; y1 = y2; y2 = tmp; } /* * Get clipping boundary and * check visibility */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return(0); } /* Clip all points */ if (x1right) { x1=right; } if (x2right) { x2=right; } if (y1bottom) { y1=bottom; } if (y2bottom) { y2=bottom; } #if 0 /* * Test for special cases of straight line or single point */ if (x1 == x2) { if (y1 == y2) { return (pixelColor(dst, x1, y1, color)); } else { return (vlineColor(dst, x1, y1, y2, color)); } } if (y1 == y2) { return (hlineColor(dst, x1, x2, y1, color)); } #endif /* * Calculate width&height */ w = x2 - x1; h = y2 - y1; /* * No alpha-blending required */ #if 0 /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } #endif /* * Lock surface */ SDL_LockSurface(dst); /* * More variable setup */ dx = w; dy = h; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; pixellast = pixel + pixx * dx + pixy * dy; dx++; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: for (; pixel <= pixellast; pixel += pixy) { memset(pixel, (Uint8) color, dx); } break; case 2: pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { *(Uint16*) pixel = color; pixel += pixx; } } break; case 3: pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } pixel += pixx; } } break; default: /* case 4 */ pixy -= (pixx * dx); for (; pixel <= pixellast; pixel += pixy) { for (x = 0; x < dx; x++) { *(Uint32 *) pixel = color; pixel += pixx; } } break; } /* * Unlock surface */ SDL_UnlockSurface(dst); #endif } void raster_rect(SDL_Surface *s, int16_t x, int16_t y, int16_t w, int16_t h, uint32_t col) { raster_rect_inline(s, x, y, w, h, col); } #define raster_rect_inline raster_rect /* raster :: pixel */ #define MODIFIED_ALPHA_PIXEL_ROUTINE #define clip_xmin(surface) surface->clip_rect.x #define clip_xmax(surface) surface->clip_rect.x+surface->clip_rect.w-1 #define clip_ymin(surface) surface->clip_rect.y #define clip_ymax(surface) surface->clip_rect.y+surface->clip_rect.h-1 static void raster_PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) { if(x>=clip_xmin(surface) && x<=clip_xmax(surface) && y>=clip_ymin(surface) && y<=clip_ymax(surface)){ switch (surface->format->BytesPerPixel) { case 1: { /* Assuming 8-bpp */ *((Uint8 *)surface->pixels + y*surface->pitch + x) = color; } break; case 2: { /* Probably 15-bpp or 16-bpp */ *((Uint16 *)surface->pixels + y*surface->pitch/2 + x) = color; } break; case 3: { /* Slow 24-bpp mode, usually not used */ Uint8 *pix = (Uint8 *)surface->pixels + y * surface->pitch + x*3; /* Gack - slow, but endian correct */ *(pix+surface->format->Rshift/8) = color>>surface->format->Rshift; *(pix+surface->format->Gshift/8) = color>>surface->format->Gshift; *(pix+surface->format->Bshift/8) = color>>surface->format->Bshift; *(pix+surface->format->Ashift/8) = color>>surface->format->Ashift; } break; case 4: { /* Probably 32-bpp */ *((Uint32 *)surface->pixels + y*surface->pitch/4 + x) = color; } break; } } } /* PutPixel routine with alpha blending, input color in destination format */ /* New, faster routine - default blending pixel */ static void raster_PutPixelAlpha(SDL_Surface * surface, Sint16 x, Sint16 y, Uint32 color, Uint8 alpha) { /* sdl-gfx */ Uint32 Rmask = surface->format->Rmask, Gmask = surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask; Uint32 R = 0, G = 0, B = 0, A = 0; if (x >= clip_xmin(surface) && x <= clip_xmax(surface) && y >= clip_ymin(surface) && y <= clip_ymax(surface)) { switch (surface->format->BytesPerPixel) { case 1:{ /* Assuming 8-bpp */ if (alpha == 255) { *((Uint8 *) surface->pixels + y * surface->pitch + x) = color; } else { Uint8 *pixel = (Uint8 *) surface->pixels + y * surface->pitch + x; Uint8 dR = surface->format->palette->colors[*pixel].r; Uint8 dG = surface->format->palette->colors[*pixel].g; Uint8 dB = surface->format->palette->colors[*pixel].b; Uint8 sR = surface->format->palette->colors[color].r; Uint8 sG = surface->format->palette->colors[color].g; Uint8 sB = surface->format->palette->colors[color].b; dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); *pixel = SDL_MapRGB(surface->format, dR, dG, dB); } } break; case 2:{ /* Probably 15-bpp or 16-bpp */ if (alpha == 255) { *((Uint16 *) surface->pixels + y * surface->pitch / 2 + x) = color; } else { Uint16 *pixel = (Uint16 *) surface->pixels + y * surface->pitch / 2 + x; Uint32 dc = *pixel; R = ((dc & Rmask) + (((color & Rmask) - (dc & Rmask)) * alpha >> 8)) & Rmask; G = ((dc & Gmask) + (((color & Gmask) - (dc & Gmask)) * alpha >> 8)) & Gmask; B = ((dc & Bmask) + (((color & Bmask) - (dc & Bmask)) * alpha >> 8)) & Bmask; if (Amask) A = ((dc & Amask) + (((color & Amask) - (dc & Amask)) * alpha >> 8)) & Amask; *pixel = R | G | B | A; } } break; case 3:{ /* Slow 24-bpp mode, usually not used */ Uint8 *pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; Uint8 rshift8 = surface->format->Rshift / 8; Uint8 gshift8 = surface->format->Gshift / 8; Uint8 bshift8 = surface->format->Bshift / 8; Uint8 ashift8 = surface->format->Ashift / 8; if (alpha == 255) { *(pix + rshift8) = color >> surface->format->Rshift; *(pix + gshift8) = color >> surface->format->Gshift; *(pix + bshift8) = color >> surface->format->Bshift; *(pix + ashift8) = color >> surface->format->Ashift; } else { Uint8 dR, dG, dB, dA = 0; Uint8 sR, sG, sB, sA = 0; pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; dR = *((pix) + rshift8); dG = *((pix) + gshift8); dB = *((pix) + bshift8); dA = *((pix) + ashift8); sR = (color >> surface->format->Rshift) & 0xff; sG = (color >> surface->format->Gshift) & 0xff; sB = (color >> surface->format->Bshift) & 0xff; sA = (color >> surface->format->Ashift) & 0xff; dR = dR + ((sR - dR) * alpha >> 8); dG = dG + ((sG - dG) * alpha >> 8); dB = dB + ((sB - dB) * alpha >> 8); dA = dA + ((sA - dA) * alpha >> 8); *((pix) + rshift8) = dR; *((pix) + gshift8) = dG; *((pix) + bshift8) = dB; *((pix) + ashift8) = dA; } } break; #ifdef ORIGINAL_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ if (alpha == 255) { *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; } else { Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; Uint32 dc = *pixel; Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; R = ((dc & Rmask) + (((((color & Rmask) - (dc & Rmask)) >> Rshift) * alpha >> 8) << Rshift)) & Rmask; G = ((dc & Gmask) + (((((color & Gmask) - (dc & Gmask)) >> Gshift) * alpha >> 8) << Gshift)) & Gmask; B = ((dc & Bmask) + (((((color & Bmask) - (dc & Bmask)) >> Bshift) * alpha >> 8) << Bshift)) & Bmask; if (Amask) A = ((dc & Amask) + (((((color & Amask) - (dc & Amask)) >> Ashift) * alpha >> 8) << Ashift)) & Amask; *pixel = R | G | B | A; } } break; #endif #ifdef MODIFIED_ALPHA_PIXEL_ROUTINE case 4:{ /* Probably :-) 32-bpp */ if (alpha == 255) { *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; } else { Uint32 Rshift, Gshift, Bshift, Ashift; Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; Uint32 dc = *pixel; Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask); Uint32 surfaceAlpha, preMultR, preMultG, preMultB; Uint32 aTmp; Rshift = surface->format->Rshift; Gshift = surface->format->Gshift; Bshift = surface->format->Bshift; Ashift = surface->format->Ashift; preMultR = (alpha * (dR>>Rshift)); preMultG = (alpha * (dG>>Gshift)); preMultB = (alpha * (dB>>Bshift)); surfaceAlpha = ((dc & Amask) >> Ashift); aTmp = (255 - alpha); if ((A = 255 - ((aTmp * (255 - surfaceAlpha)) >> 8 ))) { aTmp *= surfaceAlpha; R = (preMultR + ((aTmp * ((dc & Rmask) >> Rshift)) >> 8)) / A << Rshift & Rmask; G = (preMultG + ((aTmp * ((dc & Gmask) >> Gshift)) >> 8)) / A << Gshift & Gmask; B = (preMultB + ((aTmp * ((dc & Bmask) >> Bshift)) >> 8)) / A << Bshift & Bmask; } *pixel = R | G | B | (A << Ashift & Amask); } } break; #endif } } } /* FIXME: eliminate these 2 functions */ static int raster_pixelColorNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) { int result = 0; #if 0 /* * Setup color */ alpha = color & 0x000000ff; mcolor = SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); #endif /* * Draw */ raster_PutPixel(dst, x, y, color); return (result); } /* Pixel - using alpha weight on color for AA-drawing - no locking */ static int raster_pixelColorWeightNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color, Uint32 weight) { #if 0 Uint32 a; /* * Get alpha */ a = (color & (Uint32) 0x000000ff); /* * Modify Alpha by weight */ a = ((a * weight) >> 8); #endif raster_PutPixelAlpha(dst, x, y, color, weight); return 0; } /* raster :: line */ static inline void raster_hline(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) { #if 1 SDL_Rect l; /* sge */ if(x1>x2){Sint16 tmp=x1; x1=x2; x2=tmp;} l.x=x1; l.y=y; l.w=x2-x1+1; l.h=1; SDL_FillRect(dst, &l, color); #else /* sdl_gfx */ Sint16 left, right, top, bottom; Uint8 *pixel, *pixellast; int dx; int pixx, pixy; Sint16 w; Sint16 xtmp; int result = -1; #if 0 int i; union { double d; uint16_t col[4]; } doub; for(i = 0; i < 4; i++) { doub.col[i] = color; } #endif /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Swap x1, x2 if required to ensure x1<=x2 */ if (x1 > x2) { xtmp = x1; x1 = x2; x2 = xtmp; } /* * Get clipping boundary and * check visibility of hline */ left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return(0); } top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; if ((ybottom)) { return (0); } /* * Clip x */ if (x1 < left) { x1 = left; } if (x2 > right) { x2 = right; } /* * Calculate width */ w = x2 - x1; #if 0 printf("raster_hline %d %d %d %d\n", x1, x2, y, w); #endif /* * Lock surface */ if (SDL_MUSTLOCK(dst)) { SDL_LockSurface(dst); } /* * More variable setup */ dx = w; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y; /* * Draw */ switch (dst->format->BytesPerPixel) { case 1: memset(pixel, color, dx); break; case 2: pixellast = pixel + dx + dx; #if 0 for (; (pixel+3) <= pixellast; pixel += 4*pixx) { *(double *)pixel = doub.d; } #endif for (; pixel <= pixellast; pixel += pixx) { *(Uint16 *) pixel = color; } break; case 3: pixellast = pixel + dx + dx + dx; for (; pixel <= pixellast; pixel += pixx) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { pixel[0] = (color >> 16) & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = color & 0xff; } else { pixel[0] = color & 0xff; pixel[1] = (color >> 8) & 0xff; pixel[2] = (color >> 16) & 0xff; } } break; default: /* case 4 */ dx = dx + dx; pixellast = pixel + dx + dx; for (; pixel <= pixellast; pixel += pixx) { *(Uint32 *) pixel = color; } break; } /* * Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } /* * Set result code */ result = 0; return (result); #endif } static void raster_vline(SDL_Surface *dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color) { SDL_Rect l; if(y1>y2){Sint16 tmp=y1; y1=y2; y2=tmp;} l.x=x; l.y=y1; l.w=1; l.h=y2-y1+1; SDL_FillRect(dst, &l, color); } /* raster_line */ #define CLIP_LEFT_EDGE 0x1 #define CLIP_RIGHT_EDGE 0x2 #define CLIP_BOTTOM_EDGE 0x4 #define CLIP_TOP_EDGE 0x8 #define CLIP_INSIDE(a) (!a) #define CLIP_REJECT(a,b) (a&b) #define CLIP_ACCEPT(a,b) (!(a|b)) static int clipEncode(Sint16 x, Sint16 y, Sint16 left, Sint16 top, Sint16 right, Sint16 bottom) { int code = 0; if (x < left) { code |= CLIP_LEFT_EDGE; } else if (x > right) { code |= CLIP_RIGHT_EDGE; } if (y < top) { code |= CLIP_TOP_EDGE; } else if (y > bottom) { code |= CLIP_BOTTOM_EDGE; } return code; } static int clipLine(SDL_Surface * dst, Sint16 * x1, Sint16 * y1, Sint16 * x2, Sint16 * y2) { Sint16 left, right, top, bottom; int code1, code2; int draw = 0; Sint16 swaptmp; float m; /* * Get clipping boundary */ left = dst->clip_rect.x; right = dst->clip_rect.x + dst->clip_rect.w - 1; top = dst->clip_rect.y; bottom = dst->clip_rect.y + dst->clip_rect.h - 1; while (1) { code1 = clipEncode(*x1, *y1, left, top, right, bottom); code2 = clipEncode(*x2, *y2, left, top, right, bottom); if (CLIP_ACCEPT(code1, code2)) { draw = 1; break; } else if (CLIP_REJECT(code1, code2)) break; else { if (CLIP_INSIDE(code1)) { swaptmp = *x2; *x2 = *x1; *x1 = swaptmp; swaptmp = *y2; *y2 = *y1; *y1 = swaptmp; swaptmp = code2; code2 = code1; code1 = swaptmp; } if (*x2 != *x1) { m = (*y2 - *y1) / (float) (*x2 - *x1); } else { m = 1.0f; } if (code1 & CLIP_LEFT_EDGE) { *y1 += (Sint16) ((left - *x1) * m); *x1 = left; } else if (code1 & CLIP_RIGHT_EDGE) { *y1 += (Sint16) ((right - *x1) * m); *x1 = right; } else if (code1 & CLIP_BOTTOM_EDGE) { if (*x2 != *x1) { *x1 += (Sint16) ((bottom - *y1) / m); } *y1 = bottom; } else if (code1 & CLIP_TOP_EDGE) { if (*x2 != *x1) { *x1 += (Sint16) ((top - *y1) / m); } *y1 = top; } } } return draw; } void raster_line(SDL_Surface *dst, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t color) { /* sdl-gfx */ int pixx, pixy; int x, y; int dx, dy; int sx, sy; int swaptmp; void *pixel; /* * Clip line and test if we have to draw */ if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { return; } /* * Test for special cases of straight lines or single point */ if (x1 == x2) { if (y1 < y2) { raster_vline(dst, x1, y1, y2, color); return; } else if (y1 > y2) { raster_vline(dst, x1, y2, y1, color); return; } else { raster_PutPixel(dst, x1, y1, color); return; } } if (y1 == y2) { if (x1 < x2) { raster_hline(dst, x1, x2, y1, color); return; } else if (x1 > x2) { raster_hline(dst, x2, x1, y1, color); return; } } /* * Variable setup */ dx = x2 - x1; dy = y2 - y1; sx = (dx >= 0) ? 1 : -1; sy = (dy >= 0) ? 1 : -1; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return; } } /* * No alpha blending - use fast pixel routines */ #if 0 /* * Setup color */ colorptr = (Uint8 *) & color; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); } else { color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); } #endif /* * More variable setup */ dx = sx * dx + 1; dy = sy * dy + 1; pixx = dst->format->BytesPerPixel; pixy = dst->pitch; pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; pixx *= sx; pixy *= sy; if (dx < dy) { swaptmp = dx; dx = dy; dy = swaptmp; swaptmp = pixx; pixx = pixy; pixy = swaptmp; } /* * Draw */ x = 0; y = 0; switch (dst->format->BytesPerPixel) { case 1: for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { *(Uint8 *)pixel = color; y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; case 2: for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { *(Uint16 *) pixel = color; y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; case 3: for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { *(Uint8 *)pixel = (color >> 16) & 0xff; *((Uint8 *)pixel+1) = (color >> 8) & 0xff; *((Uint8 *)pixel+2) = color & 0xff; } else { *(Uint8 *)pixel = color & 0xff; *((Uint8 *)pixel+1) = (color >> 8) & 0xff; *((Uint8 *)pixel+2) = (color >> 16) & 0xff; } y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; default: /* case 4 */ for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { *(Uint32 *) pixel = color; y += dy; if (y >= dx) { y -= dx; pixel = (Uint8 *)pixel + pixy; } } break; } /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return; } #define AAlevels 256 #define AAbits 8 static void raster_aalineColorInt(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color, int draw_endpoint) { Sint32 xx0, yy0, xx1, yy1; Uint32 intshift, erracc, erradj; Uint32 erracctmp, wgt; int dx, dy, tmp, xdir, y0p1, x0pxdir; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Clip line and test if we have to draw */ if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { return; } /* * Keep on working with 32bit numbers */ xx0 = x1; yy0 = y1; xx1 = x2; yy1 = y2; /* * Reorder points if required */ if (yy0 > yy1) { tmp = yy0; yy0 = yy1; yy1 = tmp; tmp = xx0; xx0 = xx1; xx1 = tmp; } /* * Calculate distance */ dx = xx1 - xx0; dy = yy1 - yy0; /* * Adjust for negative dx and set xdir */ if (dx >= 0) { xdir = 1; } else { xdir = -1; dx = (-dx); } /* * Check for special cases */ if (dx == 0) { /* * Vertical line */ raster_vline(dst, x1, y1, y2, color); return; } else if (dy == 0) { /* * Horizontal line */ raster_hline(dst, x1, x2, y1, color); return; } else if (dx == dy) { /* * Diagonal line */ raster_line(dst, x1, y1, x2, y2, color); return; } /* * Zero accumulator */ erracc = 0; /* * # of bits by which to shift erracc to get intensity level */ intshift = 32 - AAbits; /* Lock surface */ if (SDL_MUSTLOCK(dst)) { if (SDL_LockSurface(dst) < 0) { return; } } /* * Draw the initial pixel in the foreground color */ raster_pixelColorNolock(dst, x1, y1, color); /* * x-major or y-major? */ if (dy > dx) { /* * y-major. Calculate 16-bit fixed point fractional part of a pixel that * X advances every time Y advances 1 pixel, truncating the result so that * we won't overrun the endpoint along the X axis */ /* * Not-so-portable version: erradj = ((Uint64)dx << 32) / (Uint64)dy; */ erradj = ((dx << 16) / dy) << 16; /* * draw all pixels other than the first and last */ x0pxdir = xx0 + xdir; while (--dy) { erracctmp = erracc; erracc += erradj; if (erracc <= erracctmp) { /* * rollover in error accumulator, x coord advances */ xx0 = x0pxdir; x0pxdir += xdir; } yy0++; /* y-major so always advance Y */ /* * the AAbits most significant bits of erracc give us the intensity * weighting for this pixel, and the complement of the weighting for * the paired pixel. */ wgt = (erracc >> intshift) & 255; raster_pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); raster_pixelColorWeightNolock (dst, x0pxdir, yy0, color, wgt); } } else { /* * x-major line. Calculate 16-bit fixed-point fractional part of a pixel * that Y advances each time X advances 1 pixel, truncating the result so * that we won't overrun the endpoint along the X axis. */ /* * Not-so-portable version: erradj = ((Uint64)dy << 32) / (Uint64)dx; */ erradj = ((dy << 16) / dx) << 16; /* * draw all pixels other than the first and last */ y0p1 = yy0 + 1; while (--dx) { erracctmp = erracc; erracc += erradj; if (erracc <= erracctmp) { /* * Accumulator turned over, advance y */ yy0 = y0p1; y0p1++; } xx0 += xdir; /* x-major so always advance X */ /* * the AAbits most significant bits of erracc give us the intensity * weighting for this pixel, and the complement of the weighting for * the paired pixel. */ wgt = (erracc >> intshift) & 255; raster_pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); raster_pixelColorWeightNolock (dst, xx0, y0p1, color, wgt); } } /* * Do we have to draw the endpoint */ if (draw_endpoint) { /* * Draw final pixel, always exactly intersected by the line and doesn't * need to be weighted. */ raster_pixelColorNolock (dst, x2, y2, color); } /* Unlock surface */ if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } } void raster_aaline(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col) { raster_aalineColorInt(s, x1, y1, x2, y2, col, 1); } /* raster :: circle */ void raster_circle(SDL_Surface *dst, int16_t x, int16_t y, int16_t r, uint32_t color) { /* sdl-gfx */ Sint16 left, right, top, bottom; Sint16 x1, y1, x2, y2; Sint16 cx = 0; Sint16 cy = r; Sint16 ocx = (Sint16) 0xffff; Sint16 ocy = (Sint16) 0xffff; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; Sint16 xpcx, xmcx, xpcy, xmcy; Sint16 ypcy, ymcy, ypcx, ymcx; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Sanity check radius */ if (r < 0) { return; } /* * Special case for r=0 - draw a point */ if (r == 0) { return (raster_PutPixel(dst, x, y, color)); } /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + r; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return; } y2 = y + r; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return; } /* * Draw */ do { xpcx = x + cx; xmcx = x - cx; xpcy = x + cy; xmcy = x - cy; if (ocy != cy) { if (cy > 0) { ypcy = y + cy; ymcy = y - cy; raster_hline(dst, xmcx, xpcx, ypcy, color); raster_hline(dst, xmcx, xpcx, ymcy, color); // raster_rect_inline(dst, xmcx, ypcy, 2*cx, 1, color); // raster_rect_inline(dst, xmcx, ymcy, 2*cx, 1, color); } else { raster_hline(dst, xmcx, xpcx, y, color); // raster_rect_inline(dst, xmcx, y, 2*cx, 1, color); } ocy = cy; } if (ocx != cx) { if (cx != cy) { if (cx > 0) { ypcx = y + cx; ymcx = y - cx; raster_hline(dst, xmcy, xpcy, ymcx, color); raster_hline(dst, xmcy, xpcy, ypcx, color); //raster_rect_inline(dst, xmcy, ymcx, 2*cy, 1, color); //raster_rect_inline(dst, xmcy, ypcx, 2*cy, 1, color); } else { raster_hline(dst, xmcy, xpcy, y, color); //raster_rect_inline(dst, xmcy, y, 2*cy, 1, color); } } ocx = cx; } /* * Update */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); } /* FIXME: convert to fixed pt */ static void raster_AAFilledEllipse(SDL_Surface *surface, Sint16 xc, Sint16 yc, Sint16 rx, Sint16 ry, Uint32 color) { /* sge */ /* Sanity check */ if (rx < 1) rx = 1; if (ry < 1) ry = 1; int a2 = rx * rx; int b2 = ry * ry; int ds = 2 * a2; int dt = 2 * b2; int dxt = (int)(a2 / sqrt(a2 + b2)); int t = 0; int s = -2 * a2 * ry; int d = 0; Sint16 x = xc; Sint16 y = yc - ry; Sint16 xs, ys, dyt; float cp, is, ip, imax = 1.0; /* Lock surface */ if ( SDL_MUSTLOCK(surface) ) if ( SDL_LockSurface(surface) < 0 ) return; /* "End points" */ raster_PutPixel(surface, x, y, color); raster_PutPixel(surface, 2*xc-x, y, color); raster_PutPixel(surface, x, 2*yc-y, color); raster_PutPixel(surface, 2*xc-x, 2*yc-y, color); /* unlock surface */ if (SDL_MUSTLOCK(surface) ) SDL_UnlockSurface(surface); raster_vline(surface, x, y+1, 2*yc-y-1, color); int i; for (i = 1; i <= dxt; i++) { x--; d += t - b2; if (d >= 0) ys = y - 1; else if ((d - s - a2) > 0) { if ((2 * d - s - a2) >= 0) ys = y + 1; else { ys = y; y++; d -= s + a2; s += ds; } } else { y++; ys = y + 1; d -= s + a2; s += ds; } t -= dt; /* Calculate alpha */ cp = (float) abs(d) / abs(s); is = cp * imax; ip = imax - is; /* Lock surface */ if ( SDL_MUSTLOCK(surface) ) if ( SDL_LockSurface(surface) < 0 ) return; /* Upper half */ raster_PutPixelAlpha(surface, x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, x, ys, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-x, ys, color, (Uint8)(is*255)); /* Lower half */ raster_PutPixelAlpha(surface, x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, x, 2*yc-ys, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-ys, color, (Uint8)(is*255)); /* unlock surface */ if (SDL_MUSTLOCK(surface) ) SDL_UnlockSurface(surface); /* Fill */ raster_vline(surface, x, y+1, 2*yc-y-1, color); raster_vline(surface, 2*xc-x, y+1, 2*yc-y-1, color); raster_vline(surface, x, ys+1, 2*yc-ys-1, color); raster_vline(surface, 2*xc-x, ys+1, 2*yc-ys-1, color); } dyt = abs(y - yc); for (i = 1; i <= dyt; i++) { y++; d -= s + a2; if (d <= 0) xs = x + 1; else if ((d + t - b2) < 0) { if ((2 * d + t - b2) <= 0) xs = x - 1; else { xs = x; x--; d += t - b2; t -= dt; } } else { x--; xs = x - 1; d += t - b2; t -= dt; } s += ds; /* Calculate alpha */ cp = (float) abs(d) / abs(t); is = cp * imax; ip = imax - is; /* Lock surface */ if ( SDL_MUSTLOCK(surface) ) if ( SDL_LockSurface(surface) < 0 ) return; /* Upper half */ raster_PutPixelAlpha(surface, x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, xs, y, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-xs, y, color, (Uint8)(is*255)); /* Lower half*/ raster_PutPixelAlpha(surface, x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-y, color, (Uint8)(ip*255)); raster_PutPixelAlpha(surface, xs, 2*yc-y, color, (Uint8)(is*255)); raster_PutPixelAlpha(surface, 2*xc-xs, 2*yc-y, color, (Uint8)(is*255)); /* unlock surface */ if (SDL_MUSTLOCK(surface) ) SDL_UnlockSurface(surface); /* Fill */ raster_hline(surface, x+1, 2*xc-x-1, y, color); raster_hline(surface, xs+1, 2*xc-xs-1, y, color); raster_hline(surface, x+1, 2*xc-x-1, 2*yc-y, color); raster_hline(surface, xs+1, 2*xc-xs-1, 2*yc-y, color); } } void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col) { raster_AAFilledEllipse(s, x, y, r, r, col); } #if 0 void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col) { /* sdl-gfx */ Sint16 left, right, top, bottom; int result; Sint16 x1, y1, x2, y2; Sint16 cx = 0; Sint16 cy = r; Sint16 ocx = (Sint16) 0xffff; Sint16 ocy = (Sint16) 0xffff; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; Sint16 xpcx, xmcx, xpcy, xmcy; Sint16 ypcy, ymcy, ypcx, ymcx; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Sanity check radius */ if (r < 0) { return; } #if 0 /* * Special case for r=0 - draw a point */ if (r == 0) { return (pixelColor(dst, x, y, color)); } #endif /* * Get circle and clipping boundary and * test if bounding box of circle is visible */ x2 = x + r; left = dst->clip_rect.x; if (x2clip_rect.x + dst->clip_rect.w - 1; if (x1>right) { return; } y2 = y + r; top = dst->clip_rect.y; if (y2clip_rect.y + dst->clip_rect.h - 1; if (y1>bottom) { return; } /* * Draw */ result = 0; do { xpcx = x + cx; xmcx = x - cx; xpcy = x + cy; xmcy = x - cy; if (ocy != cy) { if (cy > 0) { ypcy = y + cy; ymcy = y - cy; raster_hlineColor(dst, xmcx, xpcx, ypcy, color); raster_hlineColor(dst, xmcx, xpcx, ymcy, color); // raster_rect_inline(dst, xmcx, ypcy, 2*cx, 1, color); // raster_rect_inline(dst, xmcx, ymcy, 2*cx, 1, color); } else { raster_hlineColor(dst, xmcx, xpcx, y, color); // raster_rect_inline(dst, xmcx, y, 2*cx, 1, color); } ocy = cy; } if (ocx != cx) { if (cx != cy) { if (cx > 0) { ypcx = y + cx; ymcx = y - cx; raster_hlineColor(dst, xmcy, xpcy, ymcx, color); raster_hlineColor(dst, xmcy, xpcy, ypcx, color); //raster_rect_inline(dst, xmcy, ymcx, 2*cy, 1, color); //raster_rect_inline(dst, xmcy, ypcx, 2*cy, 1, color); } else { raster_hlineColor(dst, xmcy, xpcy, y, color); //raster_rect_inline(dst, xmcy, y, 2*cy, 1, color); } } ocx = cx; } /* * Update */ if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; } cx++; } while (cx <= cy); #if 0 /* sge */ Sint16 cx = 0; Sint16 cy = r; int draw=1; Sint16 df = 1 - r; Sint16 d_e = 3; Sint16 d_se = -2 * r + 5; #ifdef DEBUG printf("raster_circle %d %d %d\n", x, y, r); #endif if(r < 0) { return; } do { if(draw) { raster_rect_inline(s, x-cx, y+cy, 2*cx, 1, col); raster_rect_inline(s, x-cx, y-cy, 2*cx, 1, col); draw=0; } if(cx!=cy) { if(cx) { raster_rect_inline(s, x-cy, y-cx, 2*cy, 1, col); raster_rect_inline(s, x-cy, y+cx, 2*cy, 1, col); } else { raster_rect_inline(s, x-cy, y, 2*cy, 1, col); } } if (df < 0) { df += d_e; d_e += 2; d_se += 2; } else { df += d_se; d_e += 2; d_se += 4; cy--; draw=1; } cx++; } while(cx <= cy); #endif } #endif /* raster :: poly */ /* ---- Filled Polygon */ /* Helper qsort callback for polygon drawing */ static int gfxPrimitivesCompareInt(const void *a, const void *b) { return (*(const int *) a) - (*(const int *) b); } /* Global vertex array to use if optional parameters are not given in polygon calls. */ static int *gfxPrimitivesPolyIntsGlobal = NULL; static int gfxPrimitivesPolyAllocatedGlobal = 0; /* (Note: The last two parameters are optional; but required for multithreaded operation.) */ static inline int raster_filledPolygonColorMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color, int **polyInts, int *polyAllocated) { /* sdl-gfx */ int result; int i; int y, xa, xb; int miny, maxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int *gfxPrimitivesPolyInts = NULL; int gfxPrimitivesPolyAllocated = 0; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return(0); } /* * Sanity check number of edges */ if (n < 3) { return -1; } /* * Map polygon cache */ if ((polyInts==NULL) || (polyAllocated==NULL)) { /* Use global cache */ gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; } else { /* Use local cache */ gfxPrimitivesPolyInts = *polyInts; gfxPrimitivesPolyAllocated = *polyAllocated; } /* * Allocate temp array, only grow array */ if (!gfxPrimitivesPolyAllocated) { gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } else { if (gfxPrimitivesPolyAllocated < n) { gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } } /* * Check temp array */ if (gfxPrimitivesPolyInts==NULL) { gfxPrimitivesPolyAllocated = 0; } /* * Update cache variables */ if ((polyInts==NULL) || (polyAllocated==NULL)) { gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; } else { *polyInts = gfxPrimitivesPolyInts; *polyAllocated = gfxPrimitivesPolyAllocated; } /* * Check temp array again */ if (gfxPrimitivesPolyInts==NULL) { return(-1); } /* * Determine Y maxima */ miny = vy[0]; maxy = vy[0]; for (i = 1; (i < n); i++) { if (vy[i] < miny) { miny = vy[i]; } else if (vy[i] > maxy) { maxy = vy[i]; } } /* * Draw, scanning y */ result = 0; for (y = miny; (y <= maxy); y++) { ints = 0; for (i = 0; (i < n); i++) { if (!i) { ind1 = n - 1; ind2 = 0; } else { ind1 = i - 1; ind2 = i; } y1 = vy[ind1]; y2 = vy[ind2]; if (y1 < y2) { x1 = vx[ind1]; x2 = vx[ind2]; } else if (y1 > y2) { y2 = vy[ind1]; y1 = vy[ind2]; x2 = vx[ind1]; x1 = vx[ind2]; } else { continue; } if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); } } qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); for (i = 0; (i < ints); i += 2) { xa = gfxPrimitivesPolyInts[i] + 1; xa = (xa >> 16) + ((xa & 32768) >> 15); xb = gfxPrimitivesPolyInts[i+1] - 1; xb = (xb >> 16) + ((xb & 32768) >> 15); raster_hline(dst, xa, xb, y, color); // raster_rect_inline(dst, xa, y, xb - xa, 1, color); } } return (result); } void raster_polygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col) { raster_filledPolygonColorMT(s, vx, vy, n, col, NULL, NULL); } void raster_aapolygon(SDL_Surface *dst, int16_t n, int16_t *vx, int16_t *vy, uint32_t color) { /* sdl-gfx + sge w/ rphlx changes: basically, draw aaline border, then fill. the output is not perfect yet but usually looks better than aliasing */ int i; int y, xa, xb; int miny, maxy; int x1, y1; int x2, y2; int ind1, ind2; int ints; int *gfxPrimitivesPolyInts = NULL; int gfxPrimitivesPolyAllocated = 0; const Sint16 *px1, *py1, *px2, *py2; int **polyInts; int *polyAllocated; polyInts = NULL; polyAllocated = NULL; /* * Check visibility of clipping rectangle */ if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { return; } /* * Sanity check number of edges */ if (n < 3) { return; } /* * Pointer setup */ px1 = px2 = vx; py1 = py2 = vy; px2++; py2++; /* * Draw */ for (i = 1; i < n; i++) { raster_aalineColorInt(dst, *px1, *py1, *px2, *py2, color, 0); px1 = px2; py1 = py2; px2++; py2++; } raster_aalineColorInt(dst, *px1, *py1, *vx, *vy, color, 0); /* * Map polygon cache */ if ((polyInts==NULL) || (polyAllocated==NULL)) { /* Use global cache */ gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; } else { /* Use local cache */ gfxPrimitivesPolyInts = *polyInts; gfxPrimitivesPolyAllocated = *polyAllocated; } /* * Allocate temp array, only grow array */ if (!gfxPrimitivesPolyAllocated) { gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } else { if (gfxPrimitivesPolyAllocated < n) { gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); gfxPrimitivesPolyAllocated = n; } } /* * Check temp array */ if (gfxPrimitivesPolyInts==NULL) { gfxPrimitivesPolyAllocated = 0; } /* * Update cache variables */ if ((polyInts==NULL) || (polyAllocated==NULL)) { gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; } else { *polyInts = gfxPrimitivesPolyInts; *polyAllocated = gfxPrimitivesPolyAllocated; } /* * Check temp array again */ if (gfxPrimitivesPolyInts==NULL) { return; } /* * Determine Y maxima */ miny = vy[0]; maxy = vy[0]; for (i = 1; (i < n); i++) { if (vy[i] < miny) { miny = vy[i]; } else if (vy[i] > maxy) { maxy = vy[i]; } } /* * Draw, scanning y */ for (y = miny; (y <= maxy); y++) { ints = 0; for (i = 0; (i < n); i++) { if (!i) { ind1 = n - 1; ind2 = 0; } else { ind1 = i - 1; ind2 = i; } y1 = vy[ind1]; y2 = vy[ind2]; if (y1 < y2) { x1 = vx[ind1]; x2 = vx[ind2]; } else if (y1 > y2) { y2 = vy[ind1]; y1 = vy[ind2]; x2 = vx[ind1]; x1 = vx[ind2]; } else { continue; } if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); } } qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); // o = p = -1; for (i = 0; (i < ints); i +=2) { #if 0 xa = gfxPrimitivesPolyInts[i] + 1; xa = (xa >> 16) + ((xa & 32768) >> 15); xb = gfxPrimitivesPolyInts[i+1] - 1; xb = (xb >> 16) + ((xb & 32768) >> 15); #else xa = (gfxPrimitivesPolyInts[i] >> 16); xb = (gfxPrimitivesPolyInts[i+1] >> 16); #endif #if 0 if(o < 0) { o = xa+1; } else if(p < 0) { p = xa; } if( (o >= 0) && (p >= 0)) { if(p-o < 0) { o = p = -1; continue; } raster_hlineColor(dst, o, p, y, color); o = p = -1; } #else raster_hline(dst, xa+1, xb, y, color); #endif // raster_rect_inline(dst, xa, y, xb - xa, 1, color); } } } navit-0.5.0+dfsg.1/navit/graphics/sdl/raster.h000066400000000000000000000015531264204753600211040ustar00rootroot00000000000000/* raster.h -- line/rect/circle/poly rasterization copyright (c) 2008 bryan rittmeyer license: LGPLv2 */ #ifndef __RASTER_H #define __RASTER_H #include #include void raster_rect(SDL_Surface *s, int16_t x, int16_t y, int16_t w, int16_t h, uint32_t col); void raster_line(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col); void raster_circle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col); void raster_polygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col); void raster_aaline(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col); void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col); void raster_aapolygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col); #endif /* __RASTER_H */ navit-0.5.0+dfsg.1/navit/gtkext.h000066400000000000000000000015671264204753600165350ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GTKEXT_H #define NAVIT_GTKEXT_H void gdk_gc_set_fill_rule(GdkGC *gc, GdkFillRule fill_rule); #endif navit-0.5.0+dfsg.1/navit/gui.c000066400000000000000000000104521264204753600157770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "callback.h" #include "gui.h" #include "menu.h" #include "data_window.h" #include "item.h" #include "plugin.h" struct gui { struct gui_methods meth; struct gui_priv *priv; struct attr **attrs; struct attr parent; }; struct gui * gui_new(struct attr *parent, struct attr **attrs) { struct gui *this_; struct attr *type_attr; struct gui_priv *(*guitype_new)(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui); struct attr cbl; if (! (type_attr=attr_search(attrs, NULL, attr_type))) { return NULL; } guitype_new=plugin_get_gui_type(type_attr->u.str); if (! guitype_new) return NULL; this_=g_new0(struct gui, 1); this_->attrs=attr_list_dup(attrs); cbl.type=attr_callback_list; cbl.u.callback_list=callback_list_new(); this_->attrs=attr_generic_add_attr(this_->attrs, &cbl); this_->priv=guitype_new(parent->u.navit, &this_->meth, this_->attrs, this_); this_->parent=*parent; return this_; } int gui_get_attr(struct gui *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret; if (this_->meth.get_attr) { ret=this_->meth.get_attr(this_->priv, type, attr); if (ret) return ret; } if (type == this_->parent.type) { *attr=this_->parent; return 1; } return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int gui_set_attr(struct gui *this_, struct attr *attr) { int ret=1; if (this_->meth.set_attr) ret=this_->meth.set_attr(this_->priv, attr); if (ret == 1) this_->attrs=attr_generic_set_attr(this_->attrs, attr); return ret != 0; } int gui_add_attr(struct gui *this_, struct attr *attr) { int ret=0; if (this_->meth.add_attr) ret=this_->meth.add_attr(this_->priv, attr); return ret; } struct menu * gui_menubar_new(struct gui *gui) { struct menu *this_; if (! gui->meth.menubar_new) return NULL; this_=g_new0(struct menu, 1); this_->priv=gui->meth.menubar_new(gui->priv, &this_->meth); if (! this_->priv) { g_free(this_); return NULL; } return this_; } struct menu * gui_popup_new(struct gui *gui) { struct menu *this_; if (!gui || ! gui->meth.popup_new) return NULL; this_=g_new0(struct menu, 1); this_->priv=gui->meth.popup_new(gui->priv, &this_->meth); if (! this_->priv) { g_free(this_); return NULL; } return this_; } struct datawindow * gui_datawindow_new(struct gui *gui, const char *name, struct callback *click, struct callback *close) { struct datawindow *this_; if (! gui->meth.datawindow_new) return NULL; this_=g_new0(struct datawindow, 1); this_->priv=gui->meth.datawindow_new(gui->priv, name, click, close, &this_->meth); if (! this_->priv) { g_free(this_); return NULL; } return this_; } int gui_add_bookmark(struct gui *gui, struct pcoord *c, char *description) { int ret; dbg(lvl_info,"enter\n"); if (! gui->meth.add_bookmark) return 0; ret=gui->meth.add_bookmark(gui->priv, c, description); dbg(lvl_info,"ret=%d\n", ret); return ret; } int gui_set_graphics(struct gui *this_, struct graphics *gra) { if (! this_->meth.set_graphics) { dbg(lvl_error, "cannot set graphics, method 'set_graphics' not available\n"); return 1; } return this_->meth.set_graphics(this_->priv, gra); } void gui_disable_suspend(struct gui *this_) { if (this_->meth.disable_suspend) this_->meth.disable_suspend(this_->priv); } int gui_has_main_loop(struct gui *this_) { if (! this_->meth.run_main_loop) return 0; return 1; } int gui_run_main_loop(struct gui *this_) { if (! gui_has_main_loop(this_)) return 1; return this_->meth.run_main_loop(this_->priv); } navit-0.5.0+dfsg.1/navit/gui.h000066400000000000000000000053261264204753600160100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GUI_H #define NAVIT_GUI_H #ifdef __cplusplus extern "C" { #endif struct navit; struct gui_priv; struct menu_methods; struct datawindow_methods; struct callback; struct graphics; struct coord; struct pcoord; struct gui_methods { struct menu_priv *(*menubar_new)(struct gui_priv *priv, struct menu_methods *meth); struct menu_priv *(*popup_new)(struct gui_priv *priv, struct menu_methods *meth); int (*set_graphics)(struct gui_priv *priv, struct graphics *gra); int (*run_main_loop)(struct gui_priv *priv); struct datawindow_priv *(*datawindow_new)(struct gui_priv *priv, const char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth); int (*add_bookmark)(struct gui_priv *priv, struct pcoord *c, char *description); void (*disable_suspend)(struct gui_priv *priv); int (*get_attr)(struct gui_priv *priv, enum attr_type type, struct attr *attr); int (*add_attr)(struct gui_priv *priv, struct attr *attr); int (*set_attr)(struct gui_priv *priv, struct attr *attr); }; /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct callback; struct datawindow; struct graphics; struct gui; struct menu; struct pcoord; struct gui *gui_new(struct attr *parent, struct attr **attrs); int gui_get_attr(struct gui *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int gui_set_attr(struct gui *this_, struct attr *attr); int gui_add_attr(struct gui *this_, struct attr *attr); struct menu *gui_menubar_new(struct gui *gui); struct menu *gui_popup_new(struct gui *gui); struct datawindow *gui_datawindow_new(struct gui *gui, const char *name, struct callback *click, struct callback *close); int gui_add_bookmark(struct gui *gui, struct pcoord *c, char *description); int gui_set_graphics(struct gui *this_, struct graphics *gra); void gui_disable_suspend(struct gui *this_); int gui_has_main_loop(struct gui *this_); int gui_run_main_loop(struct gui *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/gui/000077500000000000000000000000001264204753600156315ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/gui/Makefile.am000066400000000000000000000002361264204753600176660ustar00rootroot00000000000000SUBDIRS= if GUI_INTERNAL SUBDIRS += internal endif if GUI_GTK SUBDIRS += gtk endif if GUI_WIN32 SUBDIRS += win32 endif if GUI_QML SUBDIRS += qml endifnavit-0.5.0+dfsg.1/navit/gui/gtk/000077500000000000000000000000001264204753600164165ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/gui/gtk/CMakeLists.txt000066400000000000000000000001741264204753600211600ustar00rootroot00000000000000module_add_library(gui_gtk datawindow.c destination.c gui_gtk_statusbar.c gui_gtk_action.c gui_gtk_window.c gui_gtk_poi.c) navit-0.5.0+dfsg.1/navit/gui/gtk/Makefile.am000066400000000000000000000006141264204753600204530ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = -I$(top_srcdir)/navit @NAVIT_CFLAGS@ @HILDON_CFLAGS@ @GTK2_CFLAGS@ -DMODULE=gui_gtk modulegui_LTLIBRARIES = libgui_gtk.la libgui_gtk_la_SOURCES = datawindow.c destination.c gui_gtk_statusbar.c gui_gtk_action.c gui_gtk_window.c gui_gtk_poi.c gui_gtk.h gui_gtk_poi.h libgui_gtk_la_LIBADD = @GTK2_LIBS@ libgui_gtk_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/gui/gtk/datawindow.c000066400000000000000000000142061264204753600207260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "debug.h" #include "callback.h" #include "param.h" #include "data_window.h" #include "gui_gtk.h" struct datawindow_priv { GtkWidget *window; GtkWidget *scrolled_window; GtkWidget *treeview; GtkWidget *button; GtkListStore *liststore; GtkTreeModel *sortmodel; struct callback *click, *close; struct gui_priv *gui; }; static GValue value; static void select_row(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, struct datawindow_priv *win) { char *cols[20]; GtkTreeIter iter; GtkTreeModel *model; int i; dbg(lvl_debug,"win=%p\n", win); model=gtk_tree_view_get_model(tree); gtk_tree_model_get_iter(model, &iter, path); for (i=0;iclick, cols); } static void gui_gtk_datawindow_add(struct datawindow_priv *win, struct param_list *param, int count) { int i; GtkCellRenderer *cell; GtkTreeIter iter; GType types[count]; if (! win->treeview) { win->treeview=gtk_tree_view_new(); gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), NULL); gtk_container_add(GTK_CONTAINER(win->scrolled_window), win->treeview); gtk_widget_show_all(GTK_WIDGET(win->window)); gtk_widget_grab_focus(GTK_WIDGET(win->treeview)); /* add column names to treeview */ for(i=0;itreeview),-1,param[i].name, cell,"text",i, NULL); } } #if 0 g_signal_connect(G_OBJECT(win->treeview), "click-column", G_CALLBACK(click_column), NULL); #endif g_signal_connect(G_OBJECT(win->treeview), "row-activated", G_CALLBACK(select_row), win); } /* find data storage and create a new one if none is there */ if (gtk_tree_view_get_model(GTK_TREE_VIEW (win->treeview)) == NULL) { for(i=0;iliststore=gtk_list_store_newv(count,types); if (! strcmp(param[0].name, "Distance")) { win->sortmodel=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(win->liststore)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (win->sortmodel), 0, GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), GTK_TREE_MODEL(win->sortmodel)); } else gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), GTK_TREE_MODEL(win->liststore)); } gtk_list_store_append(win->liststore,&iter); /* add data to data storage */ for(i=0;iliststore,&iter,i,atoi(param[i].value),-1); } else { gtk_list_store_set(win->liststore,&iter,i,param[i].value,-1); } } } static void gui_gtk_datawindow_mode(struct datawindow_priv *win, int start) { if (start) { if (win && win->treeview) { gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), NULL); } } } static gboolean gui_gtk_datawindow_delete(GtkWidget *widget, GdkEvent *event, struct datawindow_priv *win) { callback_call_0(win->close); if (win->button) { gtk_toggle_action_set_active (GTK_TOGGLE_ACTION(win->button), FALSE); } return FALSE; } void gui_gtk_datawindow_destroy(struct datawindow_priv *win) { if ((!win->gui) || (!win->gui->datawindow)) { return; } gui_gtk_datawindow_delete(NULL, NULL, win); gtk_widget_destroy(win->window); win->gui->datawindow = NULL; return; } void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn) { this_->button = btn; } static gboolean keypress(GtkWidget *widget, GdkEventKey *event, struct datawindow_priv *win) { if (event->type != GDK_KEY_PRESS) return FALSE; if (event->keyval == GDK_Cancel) { gui_gtk_datawindow_delete(widget, (GdkEvent *)event, win); gtk_widget_destroy(win->window); } return FALSE; } static struct datawindow_methods gui_gtk_datawindow_meth = { gui_gtk_datawindow_destroy, gui_gtk_datawindow_add, gui_gtk_datawindow_mode, }; struct datawindow_priv * gui_gtk_datawindow_new(struct gui_priv *gui, const char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth) { struct datawindow_priv *win; if (!gui) return NULL; *meth=gui_gtk_datawindow_meth; win=g_new0(struct datawindow_priv, 1); win->window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(win->window), 320, 200); gtk_window_set_title(GTK_WINDOW(win->window), name); gtk_window_set_wmclass (GTK_WINDOW (win->window), "navit", "Navit"); win->scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (win->scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(win->window), win->scrolled_window); g_signal_connect(G_OBJECT(win->window), "key-press-event", G_CALLBACK(keypress), win); win->treeview=NULL; win->click=click; win->close=close; gtk_window_set_transient_for(GTK_WINDOW((GtkWidget *)(win->window)), GTK_WINDOW(gui->win)); g_signal_connect(G_OBJECT(win->window), "delete-event", G_CALLBACK(gui_gtk_datawindow_delete), win); gtk_widget_show_all(win->window); win->gui = gui; gui->datawindow = win; return win; } navit-0.5.0+dfsg.1/navit/gui/gtk/destination.c000066400000000000000000000441521264204753600211110ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "debug.h" #include "destination.h" #include "navit.h" #include "item.h" #include "coord.h" #include "track.h" #include "country.h" #include "search.h" #include "projection.h" #include "navit_nls.h" #include "bookmarks.h" #define COL_COUNT 8 static struct search_param { struct navit *nav; struct mapset *ms; struct search_list *sl; struct attr attr; int partial; GtkWidget *entry_country, *entry_postal, *entry_city, *entry_district; GtkWidget *entry_street, *entry_number; GtkWidget *listbox; GtkWidget *treeview; GtkListStore *liststore; GtkTreeModel *liststore2; } search_param; static void button_map(GtkWidget *widget, struct search_param *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; struct pcoord *c=NULL; GtkTreeIter iter; gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(search->liststore2, &iter, path)) return; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); if (c) { navit_set_center(search->nav, c, 1); } } static char *description(struct search_param *search, GtkTreeIter *iter) { char *desc,*car,*postal,*town,*street; char empty='\0'; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 0, &car, -1); gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 1, &postal, -1); gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 2, &town, -1); gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 4, &street, -1); /* protect against nulls */ if (car==0) car=∅ if (postal==0) postal=∅ if (town==0) town=∅ if (street==0) street=∅ if (search->attr.type == attr_town_name) desc=g_strdup_printf("%s-%s %s", car, postal, town); else desc=g_strdup_printf("%s-%s %s, %s", car, postal, town, street); return desc; } static void button_destination(GtkWidget *widget, struct search_param *search) { struct pcoord *c=NULL; GtkTreeIter iter; char *desc; if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (search->liststore2), &iter)) return; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); if (c) { desc=description(search, &iter); navit_set_destination(search->nav, c, desc, 1); g_free(desc); } } static void button_bookmark(GtkWidget *widget, struct search_param *search) { struct pcoord *c=NULL; GtkTreeIter iter; char *desc; struct attr attr; if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (search->liststore2), &iter)) return; gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); if (c) { navit_get_attr(search->nav, attr_bookmarks, &attr, NULL); desc=description(search, &iter); bookmarks_add_bookmark(attr.u.bookmarks, c, desc); g_free(desc); } } char **columns_text[] = { (char *[]){_n("Car"),_n("Iso2"),_n("Iso3"),_n("Country"),NULL}, (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),NULL}, (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),_n("Street"),NULL}, (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),_n("Street"),_n("Number"),NULL}, }; static void set_columns(struct search_param *param, int mode) { GList *columns_list,*columns; char **column_text=columns_text[mode]; int i=0; columns_list=gtk_tree_view_get_columns(GTK_TREE_VIEW(param->treeview)); columns=columns_list; while (columns) { gtk_tree_view_remove_column(GTK_TREE_VIEW(param->treeview), columns->data); columns=g_list_next(columns); } g_list_free(columns_list); while (*column_text) { GtkCellRenderer *cell=gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (param->treeview),-1, navit_nls_gettext(*column_text), cell, "text", i, NULL); i++; column_text++; } } static void row_activated(GtkWidget *widget, GtkTreePath *p1, GtkTreeViewColumn *c, struct search_param *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; GtkWidget *entry_widget; char *str; int column; dbg(lvl_debug,"enter\n"); gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(search->liststore2, &iter, path)) return; switch(search->attr.type) { case attr_country_all: entry_widget=search->entry_country; column=3; break; case attr_town_name: entry_widget=search->entry_city; column=2; break; case attr_street_name: entry_widget=search->entry_street; column=4; break; default: dbg(lvl_debug,"Unknown mode\n"); return; } gtk_tree_model_get(search->liststore2, &iter, column, &str, -1); dbg(lvl_debug,"str=%s\n", str); search->partial=0; gtk_entry_set_text(GTK_ENTRY(entry_widget), str); } static void tree_view_button_release(GtkWidget *widget, GdkEventButton *event, struct search_param *search) { GtkTreePath *path; GtkTreeViewColumn *column; gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &column); gtk_tree_view_row_activated(GTK_TREE_VIEW(search->treeview), path, column); } static void next_focus(struct search_param *search, GtkWidget *widget) { if (widget == search->entry_country) gtk_widget_grab_focus(search->entry_city); if (widget == search->entry_city) gtk_widget_grab_focus(search->entry_street); if (widget == search->entry_street) gtk_widget_grab_focus(search->entry_number); } static void changed(GtkWidget *widget, struct search_param *search) { struct search_list_result *res; GtkTreeIter iter; search->attr.u.str=(char *)gtk_entry_get_text(GTK_ENTRY(widget)); printf("changed %s partial %d\n", search->attr.u.str, search->partial); if (widget == search->entry_country) { gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING); dbg(lvl_debug,"country\n"); search->attr.type=attr_country_all; set_columns(search, 0); } if (widget == search->entry_postal) { gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 1, GTK_SORT_ASCENDING); dbg(lvl_debug,"postal\n"); search->attr.type=attr_town_postal; if (strlen(search->attr.u.str) < 2) return; set_columns(search, 1); } if (widget == search->entry_city) { gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 2, GTK_SORT_ASCENDING); dbg(lvl_debug,"town\n"); search->attr.type=attr_town_name; if (strlen(search->attr.u.str) < 3) return; set_columns(search, 1); } if (widget == search->entry_street) { dbg(lvl_debug,"street\n"); search->attr.type=attr_street_name; // Searching for a street by just its first letter generates too many hits to be useful, // plus it causes the GUI to become unresponsive because the search is single-threaded. // So we only start searching once we have two letters. if (strlen(search->attr.u.str) < 2) return; set_columns(search, 2); } search_list_search(search->sl, &search->attr, search->partial); gtk_list_store_clear(search->liststore); while((res=search_list_get_result(search->sl))) { gtk_list_store_append(search->liststore,&iter); gtk_list_store_set(search->liststore,&iter,COL_COUNT,res->c,-1); if (widget == search->entry_country) { if (res->country) { gtk_list_store_set(search->liststore,&iter,0,res->country->car,-1); gtk_list_store_set(search->liststore,&iter,1,res->country->iso3,-1); gtk_list_store_set(search->liststore,&iter,2,res->country->iso2,-1); gtk_list_store_set(search->liststore,&iter,3,res->country->name,-1); } } else { if (res->country) gtk_list_store_set(search->liststore,&iter,0,res->country->car,-1); else gtk_list_store_set(search->liststore,&iter,0,"",-1); if (res->town) { gtk_list_store_set(search->liststore,&iter,1,res->town->common.postal,-1); gtk_list_store_set(search->liststore,&iter,2,res->town->common.town_name,-1); gtk_list_store_set(search->liststore,&iter,3,res->town->common.district_name,-1); } else { gtk_list_store_set(search->liststore,&iter,1,"",-1); gtk_list_store_set(search->liststore,&iter,2,"",-1); gtk_list_store_set(search->liststore,&iter,3,"",-1); } if (res->street) gtk_list_store_set(search->liststore,&iter,4,res->street->name,-1); else gtk_list_store_set(search->liststore,&iter,4,"",-1); } } if(! search->partial) { if( widget == search->entry_country ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); } if( widget == search->entry_city ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), TRUE); } if( widget == search->entry_street ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), TRUE); } } else { if( widget == search->entry_country ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); } if( widget == search->entry_city ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); } if( widget == search->entry_street ) { gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); } } if (! search->partial) next_focus(search, widget); search->partial=1; } /* borrowed from gpe-login */ #define MAX_ARGS 8 static void parse_xkbd_args (const char *cmd, char **argv) { const char *p = cmd; char buf[strlen (cmd) + 1], *bufp = buf; int nargs = 0; int escape = 0, squote = 0, dquote = 0; while (*p) { if (escape) { *bufp++ = *p; escape = 0; } else { switch (*p) { case '\\': escape = 1; break; case '"': if (squote) *bufp++ = *p; else dquote = !dquote; break; case '\'': if (dquote) *bufp++ = *p; else squote = !squote; break; case ' ': if (!squote && !dquote) { *bufp = 0; if (nargs < MAX_ARGS) argv[nargs++] = strdup (buf); bufp = buf; break; } default: *bufp++ = *p; break; } } p++; } if (bufp != buf) { *bufp = 0; if (nargs < MAX_ARGS) argv[nargs++] = strdup (buf); } argv[nargs] = NULL; } int kbd_pid; static int spawn_xkbd (char *xkbd_path, char *xkbd_str) { #ifdef _WIN32 // AF FIXME for WIN32 #ifndef F_SETFD #define F_SETFD 2 #endif #else char *xkbd_args[MAX_ARGS + 1]; int fd[2]; char buf[256]; char c; int a = 0; size_t n; pipe (fd); kbd_pid = fork (); if (kbd_pid == 0) { close (fd[0]); if (dup2 (fd[1], 1) < 0) perror ("dup2"); close (fd[1]); if (fcntl (1, F_SETFD, 0)) perror ("fcntl"); xkbd_args[0] = (char *)xkbd_path; xkbd_args[1] = "-xid"; if (xkbd_str) parse_xkbd_args (xkbd_str, xkbd_args + 2); else xkbd_args[2] = NULL; execvp (xkbd_path, xkbd_args); perror (xkbd_path); _exit (1); } close (fd[1]); do { n = read (fd[0], &c, 1); if (n) { buf[a++] = c; } } while (n && (c != 10) && (a < (sizeof (buf) - 1))); if (a) { buf[a] = 0; return atoi (buf); } #endif return 0; } int destination_address(struct navit *nav) { GtkWidget *window2, *keyboard, *vbox, *table; GtkWidget *label_country; GtkWidget *label_postal, *label_city, *label_district; GtkWidget *label_street, *label_number; GtkWidget *button1,*button2,*button3; int i; struct search_param *search=&search_param; struct attr search_attr, country_name, *country_attr; struct tracking *tracking; struct country_search *cs; struct item *item; search->nav=nav; search->ms=navit_get_mapset(nav); search->sl=search_list_new(search->ms); window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window2),_("Enter Destination")); gtk_window_set_wmclass (GTK_WINDOW (window2), "navit", "Navit"); gtk_window_set_default_size (GTK_WINDOW (window2),0,300); vbox = gtk_vbox_new(FALSE, 0); table = gtk_table_new(3, 8, FALSE); search->entry_country = gtk_entry_new(); label_country = gtk_label_new(_("Country")); search->entry_postal = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_postal), FALSE); label_postal = gtk_label_new(_("Zip Code")); search->entry_city = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), FALSE); label_city = gtk_label_new(_("City")); search->entry_district = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_district), FALSE); label_district = gtk_label_new(_("District/Township")); search->entry_street = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); label_street = gtk_label_new(_("Street")); search->entry_number = gtk_entry_new(); gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); label_number = gtk_label_new(_("Number")); search->treeview=gtk_tree_view_new(); search->listbox = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (search->listbox), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview), NULL); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(search->listbox),search->treeview); { GType types[COL_COUNT+1]; for(i=0;iliststore=gtk_list_store_newv(COL_COUNT+1,types); search->liststore2=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(search->liststore)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview), GTK_TREE_MODEL(search->liststore2)); } button1 = gtk_button_new_with_label(_("Map")); button2 = gtk_button_new_with_label(_("Bookmark")); button3 = gtk_button_new_with_label(_("Destination")); gtk_table_attach(GTK_TABLE(table), label_country, 0, 1, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_postal, 1, 2, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_city, 2, 3, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_country, 0, 1, 1, 2, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_postal, 1, 2, 1, 2, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_city, 2, 3, 1, 2, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_district, 0, 1, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_street, 1, 2, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_number, 2, 3, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_district, 0, 1, 3, 4, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_street, 1, 2, 3, 4, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_number, 2, 3, 3, 4, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->listbox, 0, 3, 4, 5, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); gtk_table_attach(GTK_TABLE(table), button1, 0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), button2, 1, 2, 5, 6, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), button3, 2, 3, 5, 6, GTK_FILL, GTK_FILL, 0, 0); g_signal_connect(G_OBJECT(search->entry_country), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_postal), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_city), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_district), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_street), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(search->entry_number), "changed", G_CALLBACK(changed), search); g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(button_map), search); g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(button_bookmark), search); g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(button_destination), search); g_signal_connect(G_OBJECT(search->treeview), "button-release-event", G_CALLBACK(tree_view_button_release), search); g_signal_connect(G_OBJECT(search->treeview), "row_activated", G_CALLBACK(row_activated), search); gtk_widget_grab_focus(search->entry_city); gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); keyboard=gtk_socket_new(); gtk_box_pack_end(GTK_BOX(vbox), keyboard, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(window2), vbox); #if 0 g_signal_connect(G_OBJECT(listbox), "select-row", G_CALLBACK(select_row), NULL); #endif gtk_widget_show_all(window2); #ifndef _WIN32 gtk_socket_steal(GTK_SOCKET(keyboard), spawn_xkbd("xkbd","-geometry 200x100")); #endif country_attr=country_default(); tracking=navit_get_tracking(nav); if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) country_attr=&search_attr; if (country_attr) { cs=country_search_new(country_attr, 0); item=country_search_get_item(cs); if (item && item_attr_get(item, attr_country_name, &country_name)) gtk_entry_set_text(GTK_ENTRY(search->entry_country), country_name.u.str); country_search_destroy(cs); } else { dbg(lvl_error,"warning: no default country found\n"); } search->partial=1; return 0; } navit-0.5.0+dfsg.1/navit/gui/gtk/gui_gtk.h000066400000000000000000000041201264204753600202150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "coord.h" struct menu_methods; struct datawindow_methods; struct navit; struct callback; struct statusbar_priv; struct gui_priv { struct navit *nav; GtkWidget *win; GtkWidget *dialog_win; GtkWidget *dialog_entry; struct pcoord dialog_coord; GtkWidget *vbox; GtkWidget *menubar; GtkActionGroup *base_group; GtkActionGroup *debug_group; GtkActionGroup *dyn_group; GtkUIManager *ui_manager; GSList *layout_group; GSList *projection_group; GSList *vehicle_group; GList *dest_menuitems; GList *bookmarks_menuitems; GList *vehicle_menuitems; GtkUIManager *menu_manager; // old struct statusbar_priv *statusbar; int menubar_enable; int toolbar_enable; int statusbar_enable; int dyn_counter; struct datawindow_priv *datawindow; }; void gui_gtk_ui_init(struct gui_priv *this); struct menu_priv *gui_gtk_menubar_new(struct gui_priv *gui, struct menu_methods *meth); struct statusbar_priv *gui_gtk_statusbar_new(struct gui_priv *gui); struct menu_priv *gui_gtk_popup_new(struct gui_priv *gui, struct menu_methods *meth); struct datawindow_priv *gui_gtk_datawindow_new(struct gui_priv *gui, const char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth); void gui_gtk_datawindow_destroy(struct datawindow_priv *win); void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn); navit-0.5.0+dfsg.1/navit/gui/gtk/gui_gtk_action.c000066400000000000000000000463151264204753600215610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "navit.h" #include "gui_gtk.h" #ifdef __APPLE__ #include "navit/menu.h" #else #include "menu.h" #endif #include "coord.h" #include "item.h" #include "attr.h" #include "callback.h" #include "debug.h" #include "destination.h" #include "navit_nls.h" #include "gui_gtk_poi.h" struct menu_priv { char *path; GtkAction *action; struct gui_priv *gui; enum menu_type type; struct callback *cb; struct menu_priv *child; struct menu_priv *sibling; gulong handler_id; guint merge_id; GtkWidget *widget; }; /* Create callbacks that implement our Actions */ static void zoom_in_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_zoom_in(gui->nav, 2, NULL); } static void zoom_out_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_zoom_out(gui->nav, 2, NULL); } static void refresh_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_draw(gui->nav); } // Forward declarations, these should not be visible outside the GUI, so // they are not in the header files, but here void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn); void gui_gtk_datawindow_destroy(struct datawindow_priv *win); static void roadbook_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { if (! gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) { gui_gtk_datawindow_destroy(gui->datawindow); } else { navit_window_roadbook_new(gui->nav); if (gui->datawindow) { gui_gtk_datawindow_set_button(gui->datawindow, w); } } } static void autozoom_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr autozoom_attr; autozoom_attr.type = attr_autozoom_active; if (! gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) { autozoom_attr.u.num = 0; } else { autozoom_attr.u.num = 1; } navit_set_attr(gui->nav, &autozoom_attr); } static void cursor_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr attr; attr.type=attr_cursor; attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); if(!navit_set_attr(gui->nav, &attr)) { dbg(lvl_error, "Failed to set attr_cursor\n"); } } static void tracking_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr attr; attr.type=attr_tracking; attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); if(!navit_set_attr(gui->nav, &attr)) { dbg(lvl_error, "Failed to set attr_tracking\n"); } } static void orient_north_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { struct attr attr; attr.type=attr_orientation; attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)) ? 0:-1; if(!navit_set_attr(gui->nav, &attr)) { dbg(lvl_error, "Failed to set attr_orientation\n"); } } static void window_fullscreen_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { if(gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) gtk_window_fullscreen(GTK_WINDOW(gui->win)); else gtk_window_unfullscreen(GTK_WINDOW(gui->win)); } #include #include "point.h" #include "transform.h" static void info_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { char buffer[512]; int mw,mh; struct coord lt, rb; struct point p; struct transformation *t; t=navit_get_trans(gui->nav); transform_get_size(t, &mw, &mh); p.x=0; p.y=0; transform_reverse(t, &p, <); p.x=mw; p.y=mh; transform_reverse(t, &p, &rb); sprintf(buffer,"./info.sh %d,%d 0x%x,0x%x 0x%x,0x%x", mw, mh, lt.x, lt.y, rb.x, rb.y); system(buffer); } static void route_clear_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_set_destination(gui->nav, NULL, NULL, 0); } static void poi_search_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { gtk_gui_poi(gui->nav); } static void destination_action(GtkWidget *w, struct gui_priv *gui, void *dummy) { destination_address(gui->nav); } static void quit_action (GtkWidget *w, struct gui_priv *gui, void *dummy) { navit_destroy(gui->nav); exit(0); } static GtkActionEntry entries[] = { /* TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). */ { "DisplayMenuAction", NULL, _n("_Display") }, { "RouteMenuAction", NULL, _n("_Route") }, { "FormerDestinationMenuAction", NULL, _n("_Former Destinations") }, { "BookmarkMenuAction", NULL, _n("_Bookmarks") }, { "MapMenuAction", NULL, _n("_Map") }, { "LayoutMenuAction", NULL, _n("_Layout") }, { "ProjectionMenuAction", NULL, _n("_Projection") }, { "VehicleMenuAction", NULL, _n("_Vehicle") }, { "ZoomOutAction", GTK_STOCK_ZOOM_OUT, _n("Zoom_Out"), "minus", _n("Decrease zoom level"), G_CALLBACK(zoom_out_action) }, { "ZoomInAction", GTK_STOCK_ZOOM_IN, _n("Zoom_In"), "plus", _n("Increase zoom level"), G_CALLBACK(zoom_in_action) }, { "RefreshAction", GTK_STOCK_REFRESH, _n("_Recalculate"), "R", _n("Redraw map"), G_CALLBACK(refresh_action) }, #ifdef GTK_STOCK_INFO { "InfoAction", GTK_STOCK_INFO, _n("_Info"), NULL, NULL, G_CALLBACK(info_action) }, #else { "InfoAction", NULL, _n("_Info"), NULL, NULL, G_CALLBACK(info_action) }, #endif /*GTK_STOCK_INFO*/ { "DestinationAction", "flag_icon", _n("Set _destination"), "D", _n("Opens address search dialog"), G_CALLBACK(destination_action) }, { "POIAction", "flag_icon", _n("_POI search"), "P", _n("Opens POI search dialog"), G_CALLBACK(poi_search_action) }, { "RouteClearAction", NULL, _n("_Stop Navigation"), "S", NULL, G_CALLBACK(route_clear_action) }, { "Test", NULL, _n("Test"), NULL, NULL, G_CALLBACK(destination_action) }, { "QuitAction", GTK_STOCK_QUIT, _n("_Quit"), "Q",_n("Quit the application"), G_CALLBACK (quit_action) } }; static guint n_entries = G_N_ELEMENTS (entries); static GtkToggleActionEntry toggleentries[] = { { "CursorAction", "cursor_icon",_n("Show position _cursor"), NULL, NULL, G_CALLBACK(cursor_action),TRUE }, { "TrackingAction", NULL ,_n("_Lock on Road"), NULL, NULL, G_CALLBACK(tracking_action),TRUE }, { "OrientationAction", "orientation_icon", _n("_Keep orientation to the North"), NULL, _n("Switches map orientation to the north or the vehicle"), G_CALLBACK(orient_north_action),FALSE }, { "RoadbookAction", GTK_STOCK_JUSTIFY_FILL, _n("_Roadbook"), "B", _n("Show/hide route description"), G_CALLBACK(roadbook_action), FALSE }, { "AutozoomAction", GTK_STOCK_ZOOM_FIT, _n("_Autozoom"), "A", _n("Enable/disable automatic zoom level changing"), G_CALLBACK(autozoom_action), FALSE }, #ifdef GTK_STOCK_FULLSCREEN { "FullscreenAction",GTK_STOCK_FULLSCREEN, _n("_Fullscreen"), "F", NULL, G_CALLBACK(window_fullscreen_action), FALSE } #else { "FullscreenAction", NULL, _n("_Fullscreen"), "F", NULL, G_CALLBACK(window_fullscreen_action), FALSE } #endif /*GTK_STOCK_FULLSCREEN*/ }; static guint n_toggleentries = G_N_ELEMENTS (toggleentries); static GtkActionEntry debug_entries[] = { { "DataMenuAction", NULL, _n("Data") }, }; static guint n_debug_entries = G_N_ELEMENTS (debug_entries); static const char * cursor_xpm[] = { "22 22 2 1", " c None", ". c #0000FF", " ", " ", " ", " .. ", " .. .. ", " .. .. ", " . . ", " . . ", " . ... . ", " . ... . . ", " . ... . . ", " . .. . . ", " . . . ", " . . . ", " . . . ", " . . . ", " .. .. ", " .. .. ", " .. ", " ", " ", " "}; static const char * north_xpm[] = { "22 22 2 1", " c None", ". c #000000", " ", " ", " . ", " ... ", " . . . ", " . . . ", " . ", " .... . .... ", " .... . .... ", " .... . .. ", " .. .. .. ", " .. .. .. ", " .. .. .. ", " .. .. .. ", " .. . .... ", " .... . .... ", " .... . .... ", " . ", " . ", " . ", " ", " "}; static const char * flag_xpm[] = { "22 22 2 1", " c None", "+ c #000000", "+++++++ ", "+ +++++++++ ", "+ +++ +++++++++ ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ + ", "+ ++++++ +++ + ", "+ +++ ++++++ + ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++++++++ +++ + ", "+ +++++++++ + ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; static struct { gchar *stockid; const char **icon_xpm; } stock_icons[] = { {"cursor_icon", cursor_xpm }, {"orientation_icon", north_xpm }, {"flag_icon", flag_xpm } }; static gint n_stock_icons = G_N_ELEMENTS (stock_icons); static void register_my_stock_icons (void) { GtkIconFactory *icon_factory; GtkIconSet *icon_set; GdkPixbuf *pixbuf; gint i; icon_factory = gtk_icon_factory_new (); for (i = 0; i < n_stock_icons; i++) { pixbuf = gdk_pixbuf_new_from_xpm_data(stock_icons[i].icon_xpm); icon_set = gtk_icon_set_new_from_pixbuf (pixbuf); g_object_unref(pixbuf); gtk_icon_factory_add (icon_factory, stock_icons[i].stockid, icon_set); gtk_icon_set_unref (icon_set); } gtk_icon_factory_add_default(icon_factory); g_object_unref(icon_factory); } static char layout[] = "\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "; static void activate(void *dummy, struct menu_priv *menu) { if (menu->cb) callback_call_0(menu->cb); } static struct menu_methods menu_methods; static struct menu_priv * add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb) { struct menu_priv *ret; char *dynname; ret=g_new0(struct menu_priv, 1); *meth=menu_methods; if (! strcmp(menu->path, "/ui/MenuBar") && !strcmp(name,"Route")) { dynname=g_strdup("Route"); } else if (! strcmp(menu->path, "/ui/MenuBar") && !strcmp(name,"Data")) { dynname=g_strdup("Data"); } else { dynname=g_strdup_printf("%d", menu->gui->dyn_counter++); if (type == menu_type_toggle) ret->action=GTK_ACTION(gtk_toggle_action_new(dynname, name, NULL, NULL)); else ret->action=gtk_action_new(dynname, name, NULL, NULL); if (cb) ret->handler_id=g_signal_connect(ret->action, "activate", G_CALLBACK(activate), ret); gtk_action_group_add_action(menu->gui->dyn_group, ret->action); ret->merge_id=gtk_ui_manager_new_merge_id(menu->gui->ui_manager); gtk_ui_manager_add_ui( menu->gui->ui_manager, ret->merge_id, menu->path, dynname, dynname, type == menu_type_submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE); } ret->gui=menu->gui; ret->path=g_strdup_printf("%s/%s", menu->path, dynname); ret->type=type; ret->cb=cb; ret->sibling=menu->child; menu->child=ret; g_free(dynname); return ret; } static void remove_menu(struct menu_priv *item, int recursive) { if (recursive) { struct menu_priv *next,*child=item->child; while (child) { next=child->sibling; remove_menu(child, recursive); child=next; } } if (item->action) { gtk_ui_manager_remove_ui(item->gui->ui_manager, item->merge_id); gtk_action_group_remove_action(item->gui->dyn_group, item->action); #if 0 if (item->callback) g_signal_handler_disconnect(item->action, item->handler_id); #endif g_object_unref(item->action); } g_free(item->path); g_free(item); } static void set_toggle(struct menu_priv *menu, int active) { gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(menu->action), active); } static int get_toggle(struct menu_priv *menu) { return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(menu->action)); } static struct menu_methods menu_methods = { #if 1 add_menu, set_toggle, get_toggle, #else NULL, NULL, NULL #endif }; static void popup_deactivate(GtkWidget *widget, struct menu_priv *menu) { g_signal_handler_disconnect(widget, menu->handler_id); remove_menu(menu, 1); } static void popup_activate(struct menu_priv *menu) { #ifdef _WIN32 menu->widget=gtk_ui_manager_get_widget(menu->gui->ui_manager, menu->path ); #endif gtk_menu_popup(GTK_MENU(menu->widget), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ()); menu->handler_id=g_signal_connect(menu->widget, "selection-done", G_CALLBACK(popup_deactivate), menu); } void gui_gtk_ui_init(struct gui_priv *this) { GError *error = NULL; struct attr attr; GtkToggleAction *toggle_action; this->base_group = gtk_action_group_new ("BaseActions"); this->debug_group = gtk_action_group_new ("DebugActions"); this->dyn_group = gtk_action_group_new ("DynamicActions"); register_my_stock_icons(); this->ui_manager = gtk_ui_manager_new (); gtk_action_group_set_translation_domain(this->base_group,"navit"); gtk_action_group_set_translation_domain(this->debug_group,"navit"); gtk_action_group_set_translation_domain(this->dyn_group,"navit"); gtk_action_group_add_actions (this->base_group, entries, n_entries, this); gtk_action_group_add_toggle_actions (this->base_group, toggleentries, n_toggleentries, this); gtk_ui_manager_insert_action_group (this->ui_manager, this->base_group, 0); gtk_action_group_add_actions (this->debug_group, debug_entries, n_debug_entries, this); gtk_ui_manager_insert_action_group (this->ui_manager, this->debug_group, 0); gtk_ui_manager_add_ui_from_string (this->ui_manager, layout, strlen(layout), &error); gtk_ui_manager_insert_action_group (this->ui_manager, this->dyn_group, 0); if (error) { g_message ("building menus failed: %s", error->message); g_error_free (error); } if (navit_get_attr(this->nav, attr_cursor, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "CursorAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } if (navit_get_attr(this->nav, attr_orientation, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "OrientationAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num != -1); } if (navit_get_attr(this->nav, attr_tracking, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "TrackingAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "RoadbookAction")); gtk_toggle_action_set_active(toggle_action, 0); if (navit_get_attr(this->nav, attr_autozoom_active, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "AutozoomAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } } static struct menu_priv * gui_gtk_ui_new (struct gui_priv *this, struct menu_methods *meth, char *path, int popup, GtkWidget **widget_ret) { struct menu_priv *ret; GtkWidget *widget; *meth=menu_methods; ret=g_new0(struct menu_priv, 1); ret->path=g_strdup(path); ret->gui=this; widget=gtk_ui_manager_get_widget(this->ui_manager, path); GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); if (widget_ret) *widget_ret=widget; if (! popup) { gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); gtk_widget_show (widget); } else { ret->widget=widget; meth->popup=popup_activate; } return ret; } #if 0 struct menu_priv * gui_gtk_menubar_new(struct gui_priv *this, struct menu_methods *meth) { return gui_gtk_ui_new(this, meth, "/ui/MenuBar", 0, &this->menubar); } #endif struct menu_priv * gui_gtk_popup_new(struct gui_priv *this, struct menu_methods *meth) { return gui_gtk_ui_new(this, meth, "/ui/PopUp", 1, NULL); } navit-0.5.0+dfsg.1/navit/gui/gtk/gui_gtk_poi.c000066400000000000000000000367241264204753600210760ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2013 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "gui_gtk_poi.h" #include "popup.h" #include "debug.h" #include "navit_nls.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "navit.h" #include "item.h" #include "map.h" #include "mapset.h" #include "transform.h" #include "attr.h" #include "util.h" static struct gtk_poi_search{ GtkWidget *entry_distance; GtkWidget *label_distance; GtkWidget *treeview_cat; GtkWidget *treeview_poi; GtkWidget *button_visit, *button_destination, *button_map; GtkListStore *store_poi; GtkListStore *store_cat; GtkTreeModel *store_poi_sorted; GtkTreeModel *store_cat_sorted; char *selected_cat; struct navit *nav; } gtk_poi_search; static GdkPixbuf * geticon(const char *name){ GdkPixbuf *icon=NULL; GError *error=NULL; icon=gdk_pixbuf_new_from_file(graphics_icon_path(name),&error); if (error) { dbg(lvl_error, "failed to load icon '%s': %s\n", name, error->message); } return icon; } /** Build the category list model with icons. */ static GtkTreeModel * category_list_model(struct gtk_poi_search *search) { GtkTreeIter iter; gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter, 0,geticon("pharmacy.png"), 1, _("Pharmacy"), 2, "poi_pharmacy", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter, 0, geticon("restaurant.png"), 1, _("Restaurant"), 2, "poi_restaurant", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("restaurant.png"), 1, _("Restaurant. Fast food"), 2, "poi_fastfood", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("hotel.png"), 1, _("Hotel"), 2, "poi_hotel", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("parking.png"), 1, _("Car parking"), 2, "poi_car_parking", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("fuel.png"), 1, _("Fuel station"), 2, "poi_fuel", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("bank.png"), 1, _("Bank"), 2, "poi_bank", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("hospital.png"), 1, _("Hospital"), 2, "poi_hospital", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("cinema.png"), 1, _("Cinema"), 2, "poi_cinema", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("rail_station.png"), 1, _("Train station"), 2, "poi_rail_station", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("school.png"), 1, _("School"), 2, "poi_school", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("police.png"), 1, _("Police"), 2, "poi_police", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("justice.png"), 1, _("Justice"), 2, "poi_justice", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("taxi.png"), 1, _("Taxi"), 2, "poi_taxi", -1); gtk_list_store_append(search->store_cat, &iter); gtk_list_store_set(search->store_cat, &iter,0, geticon("shopping.png"), 1, _("Shopping"), 2, "poi_shopping", -1); return GTK_TREE_MODEL (search->store_cat_sorted); } /** Construct model of POIs from map information. */ static GtkTreeModel * model_poi (struct gtk_poi_search *search) { GtkTreeIter iter; struct map_selection *sel,*selm; struct coord coord_item,center; struct pcoord pc; struct mapset_handle *h; int search_distance_meters,idist; struct map *m; struct map_rect *mr; struct item *item; struct point cursor_position; enum item_type selected; search_distance_meters=1000*atoi((char *) gtk_entry_get_text(GTK_ENTRY(search->entry_distance))); cursor_position.x=navit_get_width(search->nav)/2; cursor_position.y=navit_get_height(search->nav)/2; gtk_label_set_text(GTK_LABEL(search->label_distance),_("Distance from screen center (km)")); transform_reverse(navit_get_trans(search->nav), &cursor_position, ¢er); pc.pro = transform_get_projection(navit_get_trans(search->nav)); pc.x = center.x; pc.y = center.y; //Search in the map, for pois sel=map_selection_rect_new(&pc ,search_distance_meters*transform_scale(abs(center.y)+search_distance_meters*1.5),18); gtk_list_store_clear(search->store_poi); h=mapset_open(navit_get_mapset(search->nav)); selected=item_from_name(search->selected_cat); while ((m=mapset_next(h, 1))) { selm=map_selection_dup_pro(sel, projection_mg, map_projection(m)); mr=map_rect_new(m, selm); if (mr) { while ((item=map_rect_get_item(mr))) { struct attr label_attr; item_attr_get(item,attr_label,&label_attr); item_coord_get(item,&coord_item,1); idist=transform_distance(1,¢er,&coord_item); if (item->type==selected && idist<=search_distance_meters){ char direction[5]; gtk_list_store_append(search->store_poi, &iter); get_compass_direction(direction,transform_get_angle_delta(¢er,&coord_item,0),1); gtk_list_store_set(search->store_poi, &iter, 0,direction, 1,idist, 2,g_strdup(label_attr.u.str), 3,coord_item.x, 4,coord_item.y ,-1); } } map_rect_destroy(mr); } map_selection_destroy(selm); } map_selection_destroy(sel); mapset_close(h); return GTK_TREE_MODEL (search->store_poi_sorted); } /** Enable button if there is a selected row. */ static void treeview_poi_changed(GtkWidget *widget, struct gtk_poi_search *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview_cat), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(GTK_TREE_MODEL(search->store_cat_sorted), &iter, path)) return; gtk_widget_set_sensitive(search->button_visit,TRUE); gtk_widget_set_sensitive(search->button_map,TRUE); gtk_widget_set_sensitive(search->button_destination,TRUE); } /** Reload the POI list and disable buttons. */ static void treeview_poi_reload(GtkWidget *widget, struct gtk_poi_search *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; gtk_widget_set_sensitive(search->button_visit,FALSE); gtk_widget_set_sensitive(search->button_map,FALSE); gtk_widget_set_sensitive(search->button_destination,FALSE); gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview_cat), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(GTK_TREE_MODEL(search->store_cat_sorted), &iter, path)) return; gtk_tree_model_get(GTK_TREE_MODEL(search->store_cat_sorted), &iter, 2, &search->selected_cat, -1); gtk_tree_view_set_model(GTK_TREE_VIEW (search->treeview_poi), model_poi(search)); } /** Set the selected POI as destination. */ static void button_destination_clicked(GtkWidget *widget, struct gtk_poi_search *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; long int lat, lon; char *label; char *category; char buffer[2000]; //Get category gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview_cat), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(GTK_TREE_MODEL(search->store_cat_sorted), &iter, path)) return; gtk_tree_model_get(GTK_TREE_MODEL(search->store_cat_sorted), &iter, 1, &category, -1); //Get label, lat, lon gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview_poi), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(GTK_TREE_MODEL(search->store_poi_sorted), &iter, path)) return; gtk_tree_model_get(GTK_TREE_MODEL(search->store_poi_sorted), &iter, 2, &label, -1); gtk_tree_model_get(GTK_TREE_MODEL(search->store_poi_sorted), &iter, 3, &lat, -1); gtk_tree_model_get(GTK_TREE_MODEL(search->store_poi_sorted), &iter, 4, &lon, -1); sprintf(buffer, _("POI %s. %s"), category, label); struct pcoord dest; dest.x=lat; dest.y=lon; dest.pro=1; navit_set_destination(search->nav, &dest, buffer, 1); dbg(lvl_debug,_("Set destination to %ld, %ld \n"),lat,lon); } /* Show the POI's position in the map. */ static void button_map_clicked(GtkWidget *widget, struct gtk_poi_search *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; long int lat,lon; gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview_poi), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(GTK_TREE_MODEL(search->store_poi_sorted), &iter, path)) return; gtk_tree_model_get(GTK_TREE_MODEL(search->store_poi_sorted), &iter, 3, &lat, -1); gtk_tree_model_get(GTK_TREE_MODEL(search->store_poi_sorted), &iter, 4, &lon, -1); struct pcoord dest; dest.x=lat; dest.y=lon; dest.pro=1; navit_set_center(search->nav, &dest,1); dbg(lvl_debug,_("Set map to %ld, %ld \n"),lat,lon); } /** Set POI as the first "visit before". */ static void button_visit_clicked(GtkWidget *widget, struct gtk_poi_search *search) { GtkTreePath *path; GtkTreeViewColumn *focus_column; GtkTreeIter iter; long int lat,lon; gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview_poi), &path, &focus_column); if(!path) return; if(!gtk_tree_model_get_iter(GTK_TREE_MODEL(search->store_poi_sorted), &iter, path)) return; gtk_tree_model_get(GTK_TREE_MODEL(search->store_poi_sorted), &iter, 3, &lat, -1); gtk_tree_model_get(GTK_TREE_MODEL(search->store_poi_sorted), &iter, 4, &lon, -1); dbg(lvl_debug,_("Set next visit to %ld, %ld \n"),lat,lon); struct pcoord dest; dest.x=lat; dest.y=lon; dest.pro=1; popup_set_visitbefore(search->nav,&dest,0); } /** Create UI and connect objects to functions. */ void gtk_gui_poi(struct navit *nav) { GtkWidget *window2,*vbox, *keyboard, *table; GtkWidget *label_category, *label_poi; GtkWidget *listbox_cat, *listbox_poi; GtkCellRenderer *renderer; struct gtk_poi_search *search=>k_poi_search; search->nav=nav; window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window2),_("POI search")); gtk_window_set_wmclass (GTK_WINDOW (window2), "navit", "Navit"); gtk_window_set_default_size (GTK_WINDOW (window2),700,550); vbox = gtk_vbox_new(FALSE, 0); table = gtk_table_new(4, 4, FALSE); label_category = gtk_label_new(_("Select a category")); search->label_distance = gtk_label_new(_("Select a distance to look for (km)")); label_poi=gtk_label_new(_("Select a POI")); search->entry_distance=gtk_entry_new_with_max_length(2); gtk_entry_set_text(GTK_ENTRY(search->entry_distance),"10"); search->treeview_cat=gtk_tree_view_new(); listbox_cat = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listbox_cat), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(listbox_cat),search->treeview_cat); search->store_cat = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); renderer=gtk_cell_renderer_pixbuf_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (search->treeview_cat),-1, _(" "), renderer, "pixbuf", 0, NULL); renderer=gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (search->treeview_cat),-1, _("Category"), renderer, "text", 1, NULL); search->store_cat_sorted=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(search->store_cat)); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(search->store_cat_sorted),1,GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview_cat), category_list_model(search)); search->treeview_poi=gtk_tree_view_new(); listbox_poi = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listbox_poi), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(listbox_poi),search->treeview_poi); search->store_poi = gtk_list_store_new (5, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_LONG, G_TYPE_LONG); renderer=gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (search->treeview_poi),-1, _("Direction"), renderer, "text",0,NULL); renderer=gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (search->treeview_poi),-1, _("Distance(m)"), renderer, "text", 1, NULL); renderer=gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (search->treeview_poi),-1, _("Name"), renderer, "text", 2, NULL); search->store_poi_sorted=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(search->store_poi)); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(search->store_poi_sorted),1,GTK_SORT_ASCENDING); search->button_visit = gtk_button_new_with_label(_("Visit Before")); search->button_destination = gtk_button_new_with_label(_("Destination")); search->button_map = gtk_button_new_with_label(_("Map")); gtk_widget_set_sensitive(search->button_visit,FALSE); gtk_widget_set_sensitive(search->button_map,FALSE); gtk_widget_set_sensitive(search->button_destination,FALSE); gtk_table_attach(GTK_TABLE(table), search->label_distance, 0, 1, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->entry_distance, 1, 2, 0, 1, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), label_category, 0, 1, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), listbox_cat, 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); gtk_table_attach(GTK_TABLE(table), label_poi, 1, 4, 2, 3, 0, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), listbox_poi, 1, 4, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); gtk_table_attach(GTK_TABLE(table), search->button_map, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->button_visit, 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(table), search->button_destination, 2, 3, 4, 5, GTK_FILL, GTK_FILL, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(search->entry_distance), "changed", G_CALLBACK(treeview_poi_reload), search); g_signal_connect(G_OBJECT(search->button_visit), "clicked", G_CALLBACK(button_visit_clicked), search); g_signal_connect(G_OBJECT(search->button_map), "clicked", G_CALLBACK(button_map_clicked), search); g_signal_connect(G_OBJECT(search->button_destination), "clicked", G_CALLBACK(button_destination_clicked), search); g_signal_connect(G_OBJECT(search->treeview_cat), "cursor_changed", G_CALLBACK(treeview_poi_reload), search); g_signal_connect(G_OBJECT(search->treeview_poi), "cursor_changed", G_CALLBACK(treeview_poi_changed), search); keyboard=gtk_socket_new(); gtk_box_pack_end(GTK_BOX(vbox), keyboard, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(window2), vbox); gtk_widget_show_all(window2); } navit-0.5.0+dfsg.1/navit/gui/gtk/gui_gtk_poi.h000066400000000000000000000015761264204753600211000ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2013 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_GTK_POI_H #define NAVIT_GTK_POI_H struct navit; struct pcoord; void gtk_gui_poi(struct navit *nav); #endif navit-0.5.0+dfsg.1/navit/gui/gtk/gui_gtk_statusbar.c000066400000000000000000000126401264204753600223060ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "item.h" #include "coord.h" #include "debug.h" #include "vehicle.h" #include "callback.h" #include "route.h" #include "transform.h" #include "navit.h" #include "map.h" #include "navigation.h" #include "gui_gtk.h" #include "navit_nls.h" struct statusbar_priv { struct gui_priv *gui; GtkWidget *hbox; char gps_text[128]; GtkWidget *gps; char route_text[128]; GtkWidget *route; struct callback *vehicle_cb; }; #if 0 static void statusbar_destroy(struct statusbar_priv *this) { g_free(this); } static void statusbar_gps_update(struct statusbar_priv *this, int sats, int qual, double lng, double lat, double height, double direction, double speed) { char *dirs[]={_("N"),_("NE"),_("E"),_("SE"),_("S"),_("SW"),_("W"),_("NW"),_("N")}; char *dir; int dir_idx; char pos_text[36]; coord_format(lat,lng,DEGREES_MINUTES_SECONDS,pos_text,sizeof(pos_text)); dir=dirs[dir_idx]; sprintf(this->gps_text, "GPS %02d/%02d %s %4.0fm %3.0f°%-2s %3.0fkm/h", sats, qual, pos_text, height, direction, dir, speed); gtk_label_set_text(GTK_LABEL(this->gps), this->gps_text); } #endif static const char *status_fix2str(int type) { switch(type) { case 0: return _("No"); case 1: return _("2D"); case 3: return _("3D"); default: return _("OT"); } } static void statusbar_route_update(struct statusbar_priv *this, struct navit *navit, struct vehicle *v) { struct navigation *nav=NULL; struct map *map=NULL; struct map_rect *mr=NULL; struct item *item=NULL; struct attr attr; double route_len=0; time_t eta; struct tm *eta_tm=NULL; char buffer[128]; double lng, lat, direction=0, height=0, speed=0, hdop=0; int sats=0, qual=0; int status=0; const char *dirs[]={_("N"),_("NE"),_("E"),_("SE"),_("S"),_("SW"),_("W"),_("NW"),_("N")}; const char *dir; int dir_idx; if (navit) nav=navit_get_navigation(navit); if (nav) map=navigation_get_map(nav); if (map) mr=map_rect_new(map, NULL); if (mr) item=map_rect_get_item(mr); if (item) { if (item_attr_get(item, attr_destination_length, &attr)) route_len=attr.u.num; if (item_attr_get(item, attr_destination_time, &attr)) { eta=time(NULL)+attr.u.num/10; eta_tm=localtime(&eta); } } if (mr) map_rect_destroy(mr); sprintf(buffer,_("Route %4.0fkm %02d:%02d ETA" ),route_len/1000, eta_tm ? eta_tm->tm_hour : 0 , eta_tm ? eta_tm->tm_min : 0); if (strcmp(buffer, this->route_text)) { strcpy(this->route_text, buffer); gtk_label_set_text(GTK_LABEL(this->route), this->route_text); } if (!vehicle_get_attr(v, attr_position_coord_geo, &attr, NULL)) return; lng=attr.u.coord_geo->lng; lat=attr.u.coord_geo->lat; if (vehicle_get_attr(v, attr_position_fix_type, &attr, NULL)) status=attr.u.num; if (vehicle_get_attr(v, attr_position_direction, &attr, NULL)) direction=*(attr.u.numd); direction=fmod(direction,360); if (direction < 0) direction+=360; dir_idx=(direction+22.5)/45; dir=dirs[dir_idx]; if (vehicle_get_attr(v, attr_position_height, &attr, NULL)) height=*(attr.u.numd); if (vehicle_get_attr(v, attr_position_hdop, &attr, NULL)) hdop=*(attr.u.numd); if (vehicle_get_attr(v, attr_position_speed, &attr, NULL)) speed=*(attr.u.numd); if (vehicle_get_attr(v, attr_position_sats_used, &attr, NULL)) sats=attr.u.num; if (vehicle_get_attr(v, attr_position_qual, &attr, NULL)) qual=attr.u.num; coord_format(lat,lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); sprintf(this->gps_text,"GPS:%s %02d/%02d HD:%02.2f %s %4.0fm %3.0f°%-2s %3.0fkm/h", status_fix2str(status), sats, qual, hdop, buffer, height, direction, dir, speed); gtk_label_set_text(GTK_LABEL(this->gps), this->gps_text); } struct statusbar_priv * gui_gtk_statusbar_new(struct gui_priv *gui) { struct statusbar_priv *this=g_new0(struct statusbar_priv, 1); this->gui=gui; this->hbox=gtk_hbox_new(FALSE, 1); this->gps=gtk_label_new( "GPS 00/0 0000.0000N 00000.0000E 0000m 000°NO 000km/h" ); gtk_label_set_justify(GTK_LABEL(this->gps), GTK_JUSTIFY_LEFT); this->route=gtk_label_new( _( "Route 0000km 0+00:00 ETA" ) ); gtk_label_set_justify(GTK_LABEL(this->route), GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(this->hbox), this->gps, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(this->hbox), gtk_vseparator_new(), TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(this->hbox), this->route, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (this->hbox, GTK_CAN_FOCUS); gtk_box_pack_end(GTK_BOX(gui->vbox), this->hbox, FALSE, FALSE, 0); gtk_widget_show_all(this->hbox); /* add a callback for position updates */ this->vehicle_cb=callback_new_attr_1(callback_cast(statusbar_route_update), attr_position_coord_geo, this); navit_add_callback(gui->nav, this->vehicle_cb); return this; } navit-0.5.0+dfsg.1/navit/gui/gtk/gui_gtk_window.c000066400000000000000000000570621264204753600216140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #if !defined(GDK_Book) || !defined(GDK_Calendar) #include #endif #include #include "config.h" #include "item.h" #include "xmlconfig.h" #include "navit.h" #include "debug.h" #include "gui.h" #include "coord.h" #include "point.h" #include "plugin.h" #include "graphics.h" #include "gui_gtk.h" #include "transform.h" #include "config.h" #include "callback.h" #include "layout.h" #include "vehicle.h" #include "map.h" #include "coord.h" #include "event.h" #include "bookmarks.h" #include "route.h" #include "navit_nls.h" #ifdef USE_HILDON #include "hildon/hildon-defines.h" #define KEY_ZOOM_IN HILDON_HARDKEY_INCREASE #define KEY_ZOOM_OUT HILDON_HARDKEY_DECREASE #define KEY_UP HILDON_HARDKEY_UP #define KEY_DOWN HILDON_HARDKEY_DOWN #define KEY_LEFT HILDON_HARDKEY_LEFT #define KEY_RIGHT HILDON_HARDKEY_RIGHT #else #ifndef GDK_Book #define GDK_Book XF86XK_Book #endif #ifndef GDK_Calendar #define GDK_Calendar XF86XK_Calendar #endif #define KEY_ZOOM_IN GDK_Book #define KEY_ZOOM_OUT GDK_Calendar #define KEY_UP GDK_Up #define KEY_DOWN GDK_Down #define KEY_LEFT GDK_Left #define KEY_RIGHT GDK_Right #endif static gboolean keypress(GtkWidget *widget, GdkEventKey *event, struct gui_priv *this) { int w,h; struct transformation *t; #ifdef USE_HILDON GtkToggleAction *action; gboolean *fullscreen; #endif /*HILDON*/ struct point p; if (event->type != GDK_KEY_PRESS) return FALSE; dbg(lvl_debug,"keypress 0x%x\n", event->keyval); transform_get_size(navit_get_trans(this->nav), &w, &h); switch (event->keyval) { case GDK_KP_Enter: gtk_menu_shell_select_first(GTK_MENU_SHELL(this->menubar), TRUE); break; case KEY_UP: p.x=w/2; p.y=0; navit_set_center_screen(this->nav, &p, 1); break; case KEY_DOWN: p.x=w/2; p.y=h; navit_set_center_screen(this->nav, &p, 1); break; case KEY_LEFT: p.x=0; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case KEY_RIGHT: p.x=w; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case KEY_ZOOM_IN: navit_zoom_in(this->nav, 2, NULL); break; case KEY_ZOOM_OUT: navit_zoom_out(this->nav, 2, NULL); break; case 'a': t=navit_get_trans(this->nav); transform_set_yaw(t, (transform_get_yaw(t)+15)%360); navit_draw(this->nav); break; case 'd': t=navit_get_trans(this->nav); transform_set_yaw(t, (transform_get_yaw(t)-15)%360); navit_draw(this->nav); break; case 'w': t=navit_get_trans(this->nav); transform_set_pitch(t, (transform_get_pitch(t)+5)%360); navit_draw(this->nav); break; case 'x': t=navit_get_trans(this->nav); transform_set_pitch(t, (transform_get_pitch(t)-5)%360); navit_draw(this->nav); break; case 'r': t=navit_get_trans(this->nav); transform_set_distance(t, (transform_get_distance(t)-5)); navit_draw(this->nav); break; case 'f': t=navit_get_trans(this->nav); transform_set_distance(t, (transform_get_distance(t)+5)); navit_draw(this->nav); break; case 'z': t=navit_get_trans(this->nav); transform_set_hog(t, (transform_get_hog(t)+1)); navit_draw(this->nav); break; case 'h': t=navit_get_trans(this->nav); transform_set_hog(t, (transform_get_hog(t)-1)); navit_draw(this->nav); break; case 't': { struct coord *p; struct pcoord pc; t=navit_get_trans(this->nav); p=transform_center(t); pc.pro=projection_mg; p->y+=50*cos(transform_get_yaw(t)*M_PI/180); p->x+=50*sin(transform_get_yaw(t)*M_PI/180); pc.x=p->x; pc.y=p->y; navit_set_center(this->nav, &pc, 1); } break; case 'g': { struct coord *p; struct pcoord pc; t=navit_get_trans(this->nav); p=transform_center(t); pc.pro=projection_mg; p->y-=50*cos(transform_get_yaw(t)*M_PI/180); p->x-=50*sin(transform_get_yaw(t)*M_PI/180); pc.x=p->x; pc.y=p->y; navit_set_center(this->nav, &pc, 1); } break; #ifdef USE_HILDON case HILDON_HARDKEY_FULLSCREEN: action = GTK_TOGGLE_ACTION (gtk_action_group_get_action (this->base_group, "FullscreenAction")); if ( gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action))) { fullscreen = 0; } else { fullscreen = 1; } gtk_toggle_action_set_active (action, fullscreen); break; #endif /*HILDON*/ default: return FALSE; } return TRUE; } static int gui_gtk_set_graphics(struct gui_priv *this, struct graphics *gra) { GtkWidget *graphics; graphics=graphics_get_data(gra, "gtk_widget"); if (! graphics) return 1; GTK_WIDGET_SET_FLAGS (graphics, GTK_CAN_FOCUS); gtk_widget_set_sensitive(graphics, TRUE); g_signal_connect(G_OBJECT(graphics), "key-press-event", G_CALLBACK(keypress), this); gtk_box_pack_end(GTK_BOX(this->vbox), graphics, TRUE, TRUE, 0); gtk_widget_show_all(graphics); gtk_widget_grab_focus(graphics); return 0; } static void gui_gtk_route_callback(struct gui_priv *gui) { struct attr route_attr; GtkAction *roadbookAction=gtk_ui_manager_get_action (gui->ui_manager,"/ui/ToolBar/ToolItems/Roadbook"); if (roadbookAction) { if (navit_get_attr(gui->nav,attr_route,&route_attr,NULL)) { struct attr route_status_attr; if (route_get_attr(route_attr.u.route, attr_route_status,&route_status_attr,NULL) ) { if (route_status_attr.u.num>2) { gtk_action_set_sensitive(roadbookAction,1); } else { gtk_action_set_sensitive(roadbookAction,0); } } } } } static void gui_gtk_add_bookmark_do(struct gui_priv *gui) { struct attr attr; navit_get_attr(gui->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, &gui->dialog_coord, gtk_entry_get_text(GTK_ENTRY(gui->dialog_entry))); gtk_widget_destroy(gui->dialog_win); } static int gui_gtk_add_bookmark(struct gui_priv *gui, struct pcoord *c, char *description) { GtkWidget *button_ok,*button_cancel,*label,*vbox,*hbox; gui->dialog_coord=*c; gui->dialog_win=gtk_window_new(GTK_WINDOW_TOPLEVEL); vbox=gtk_vbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (gui->dialog_win), vbox); gtk_window_set_title(GTK_WINDOW(gui->dialog_win),_("Add Bookmark")); gtk_window_set_wmclass (GTK_WINDOW (gui->dialog_win), "navit", "Navit"); gtk_window_set_transient_for(GTK_WINDOW(gui->dialog_win), GTK_WINDOW(gui->win)); gtk_window_set_modal(GTK_WINDOW(gui->dialog_win), TRUE); label=gtk_label_new(_("Name")); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); gui->dialog_entry=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(gui->dialog_entry), description); gtk_box_pack_start(GTK_BOX(vbox), gui->dialog_entry, TRUE, TRUE, 0); hbox=gtk_hbox_new(FALSE, 0); button_ok = gtk_button_new_from_stock (GTK_STOCK_OK); gtk_box_pack_start(GTK_BOX(hbox), button_ok, TRUE, TRUE, 10); button_cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL); gtk_box_pack_start(GTK_BOX(hbox), button_cancel, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 10); gtk_widget_show_all(gui->dialog_win); GTK_WIDGET_SET_FLAGS (button_ok, GTK_CAN_DEFAULT); gtk_widget_grab_default(button_ok); g_signal_connect_swapped (G_OBJECT (button_cancel), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (gui->dialog_win)); g_signal_connect_swapped (G_OBJECT (gui->dialog_entry), "activate", G_CALLBACK (gui_gtk_add_bookmark_do), gui); g_signal_connect_swapped(G_OBJECT (button_ok), "clicked", G_CALLBACK (gui_gtk_add_bookmark_do), gui); return 1; } struct gui_methods gui_gtk_methods = { NULL, gui_gtk_popup_new, gui_gtk_set_graphics, NULL, gui_gtk_datawindow_new, gui_gtk_add_bookmark, }; static gboolean gui_gtk_delete(GtkWidget *widget, GdkEvent *event, struct navit *nav) { /* FIXME remove attr_navit callback */ navit_destroy(nav); exit(0); return TRUE; } static void gui_gtk_toggle_init(struct gui_priv *this) { struct attr attr; GtkToggleAction *toggle_action; if (navit_get_attr(this->nav, attr_cursor, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "CursorAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } else { dbg(lvl_warning, "Unable to locate CursorAction\n"); } if (navit_get_attr(this->nav, attr_orientation, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "OrientationAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num != -1); } else { dbg(lvl_error, "Unable to locate OrientationAction\n"); } if (navit_get_attr(this->nav, attr_tracking, &attr, NULL)) { toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "TrackingAction")); gtk_toggle_action_set_active(toggle_action, attr.u.num); } else { dbg(lvl_error, "Unable to locate TrackingAction\n"); } } struct action_cb_data { struct gui_priv *gui; struct attr attr; }; static void gui_gtk_action_activate(GtkAction *action, struct action_cb_data *data) { if(data->attr.type == attr_destination) { char * label; g_object_get(G_OBJECT(action), "label", &label,NULL); navit_set_destination(data->gui->nav, data->attr.u.pcoord, label, 1); g_free(label); } } struct gui_menu_info { guint merge_id; GtkAction *action; }; static void gui_gtk_del_menu(struct gui_priv *this, struct gui_menu_info *meninfo) { gtk_action_group_remove_action(this->dyn_group, meninfo->action); gtk_ui_manager_remove_ui(this->ui_manager, meninfo->merge_id); } static struct gui_menu_info gui_gtk_add_menu(struct gui_priv *this, char *name, char *label, char *path, int submenu, struct action_cb_data *data) { struct gui_menu_info meninfo; GtkAction *action; guint merge_id; action=gtk_action_new(name, label, NULL, NULL); meninfo.action = action; if (data) g_signal_connect(action, "activate", G_CALLBACK(gui_gtk_action_activate), data); gtk_action_group_add_action(this->dyn_group, action); merge_id =gtk_ui_manager_new_merge_id(this->ui_manager); meninfo.merge_id = merge_id; gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE); return meninfo; } static void gui_gtk_action_toggled(GtkToggleAction *action, struct action_cb_data *data) { struct attr active; active.type=attr_active; active.u.num=gtk_toggle_action_get_active(action); map_set_attr(data->attr.u.map, &active); navit_draw(data->gui->nav); } static void gui_gtk_add_toggle_menu(struct gui_priv *this, char *name, char *label, char *path, struct action_cb_data *data, gboolean active) { GtkToggleAction *toggle_action; guint merge_id; toggle_action=gtk_toggle_action_new(name, label, NULL, NULL); gtk_toggle_action_set_active(toggle_action, active); g_signal_connect(GTK_ACTION(toggle_action), "toggled", G_CALLBACK(gui_gtk_action_toggled), data); gtk_action_group_add_action(this->dyn_group, GTK_ACTION(toggle_action)); merge_id=gtk_ui_manager_new_merge_id(this->ui_manager); gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, GTK_UI_MANAGER_MENUITEM, FALSE); } static void gui_gtk_action_changed(GtkRadioAction *action, GtkRadioAction *current, struct action_cb_data *data) { if (action == current) { navit_set_attr(data->gui->nav, &data->attr); } } static struct gui_menu_info gui_gtk_add_radio_menu(struct gui_priv *this, char *name, char *label, char *path, struct action_cb_data *data, GSList **g) { struct gui_menu_info meninfo; GtkRadioAction *radio_action; guint merge_id; radio_action=gtk_radio_action_new(name, label, NULL, NULL, 0); meninfo.action = (GtkAction *)radio_action; gtk_radio_action_set_group(radio_action, *g); *g=gtk_radio_action_get_group(radio_action); g_signal_connect(GTK_ACTION(radio_action), "changed", G_CALLBACK(gui_gtk_action_changed), data); gtk_action_group_add_action(this->dyn_group, GTK_ACTION(radio_action)); merge_id=gtk_ui_manager_new_merge_id(this->ui_manager); meninfo.merge_id = merge_id; gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, GTK_UI_MANAGER_MENUITEM, FALSE); return meninfo; } static void gui_gtk_layouts_init(struct gui_priv *this) { struct attr_iter *iter; struct attr attr; struct action_cb_data *data; int count=0; char *name; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_layout, &attr, iter)) { name=g_strdup_printf("Layout %d", count++); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_layout; data->attr.u.layout=attr.u.layout; gui_gtk_add_radio_menu(this, name, attr.u.layout->name, "/ui/MenuBar/Map/Layout/LayoutMenuAdditions", data, &this->layout_group); g_free(name); } navit_attr_iter_destroy(iter); } static void gui_gtk_projections_init(struct gui_priv *this) { struct action_cb_data *data; data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_projection; data->attr.u.projection=projection_mg; gui_gtk_add_radio_menu(this, "Projection mg", "Map & Guide", "/ui/MenuBar/Map/Projection/ProjectionMenuAdditions", data, &this->projection_group); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_projection; data->attr.u.projection=projection_garmin; gui_gtk_add_radio_menu(this, "Projection garmin", "Garmin", "/ui/MenuBar/Map/Projection/ProjectionMenuAdditions", data, &this->projection_group); } static void gui_gtk_vehicles_update(struct gui_priv *this) { struct attr_iter *iter; struct attr attr,vattr; struct action_cb_data *data; int count=0; char *name; GList *curr; struct gui_menu_info *meninfo; dbg(lvl_debug,"enter\n"); curr = g_list_first(this->vehicle_menuitems); while (curr) { gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); g_free((struct gui_menu_info *)curr->data); curr = g_list_next(curr); }; g_list_free(this->vehicle_menuitems); this->vehicle_menuitems = NULL; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_vehicle, &attr, iter)) { vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); name=g_strdup_printf("Vehicle %d", count++); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_vehicle; data->attr.u.vehicle=attr.u.vehicle; meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_radio_menu(this, name, vattr.u.str, "/ui/MenuBar/Map/Vehicle/VehicleMenuAdditions", data, &this->vehicle_group); this->vehicle_menuitems = g_list_prepend(this->vehicle_menuitems, meninfo); g_free(name); } navit_attr_iter_destroy(iter); } static void gui_gtk_vehicles_init(struct gui_priv *this) { navit_add_callback(this->nav, callback_new_attr_1(callback_cast(gui_gtk_vehicles_update), attr_vehicle, this)); gui_gtk_vehicles_update(this); } static void gui_gtk_maps_init(struct gui_priv *this) { struct attr_iter *iter; struct attr attr,active,type,data; struct action_cb_data *cb_data; int count=0; char *name, *label; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_map, &attr, iter)) { name=g_strdup_printf("Map %d", count++); if (! map_get_attr(attr.u.map, attr_type, &type, NULL)) type.u.str=""; if (! map_get_attr(attr.u.map, attr_data, &data, NULL)) data.u.str=""; label=g_strdup_printf("%s:%s", type.u.str, data.u.str); cb_data=g_new(struct action_cb_data, 1); cb_data->gui=this; cb_data->attr.type=attr_map; cb_data->attr.u.map=attr.u.map; if (! map_get_attr(attr.u.map, attr_active, &active, NULL)) active.u.num=1; gui_gtk_add_toggle_menu(this, name, label, "/ui/MenuBar/Map/MapMenuAdditions", cb_data, active.u.num); g_free(name); g_free(label); } navit_attr_iter_destroy(iter); } static void gui_gtk_destinations_update(struct gui_priv *this) { GList *curr; struct attr attr; struct action_cb_data *data; struct map_rect *mr=NULL; struct item *item; struct gui_menu_info *meninfo; struct coord c; int count=0; char *name, *label; curr = g_list_first(this->dest_menuitems); while (curr) { gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); g_free((struct gui_menu_info *)curr->data); curr = g_list_next(curr); }; g_list_free(this->dest_menuitems); this->dest_menuitems = NULL; if(navit_get_attr(this->nav, attr_former_destination_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { while ((item=map_rect_get_item(mr))) { if (item->type != type_former_destination) continue; name=g_strdup_printf("Destination %d", count++); item_attr_get(item, attr_label, &attr); label=attr.u.str; item_coord_get(item, &c, 1); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_destination; data->attr.u.pcoord=g_new(struct pcoord, 1); data->attr.u.pcoord->pro=projection_mg; data->attr.u.pcoord->x=c.x; data->attr.u.pcoord->y=c.y; meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_menu(this, name, label, "/ui/MenuBar/Route/FormerDestinations/FormerDestinationMenuAdditions",0,data); this->dest_menuitems = g_list_prepend(this->dest_menuitems, meninfo); g_free(name); } map_rect_destroy(mr); } } static void gui_gtk_destinations_init(struct gui_priv *this) { navit_add_callback(this->nav, callback_new_attr_1(callback_cast(gui_gtk_destinations_update), attr_destination, this)); gui_gtk_destinations_update(this); } static void gui_gtk_bookmarks_update(struct gui_priv *this) { GList *curr; struct attr attr; struct action_cb_data *data; struct map_rect *mr=NULL; struct gui_menu_info *meninfo; struct item *item; struct coord c; int count=0; char *parent, *name, *label, *label_full, *menu_label, *tmp_parent, *s; GHashTable *hash; curr = g_list_first(this->bookmarks_menuitems); while (curr) { gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); g_free((struct gui_menu_info *)curr->data); curr = g_list_next(curr); }; g_list_free(this->bookmarks_menuitems); this->bookmarks_menuitems = NULL; if(navit_get_attr(this->nav, attr_bookmark_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); while ((item=map_rect_get_item(mr))) { if (item->type != type_bookmark) continue; item_attr_get(item, attr_label, &attr); label_full=attr.u.str; item_coord_get(item, &c, 1); menu_label=g_malloc(strlen(label_full)+1); label=label_full; parent=g_strdup("/ui/MenuBar/Route/Bookmarks/BookmarkMenuAdditions"); while ((s=strchr(label, '/'))) { strcpy(menu_label, label_full); menu_label[s-label_full]='\0'; if ((tmp_parent=g_hash_table_lookup(hash, menu_label))) { tmp_parent=g_strdup(tmp_parent); } else { name=g_strdup_printf("Bookmark %d", count++); meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_menu(this, name, menu_label+(label-label_full),parent,1,NULL); this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); tmp_parent=g_strdup_printf("%s/%s", parent, name); g_hash_table_insert(hash, g_strdup(menu_label), g_strdup(tmp_parent)); g_free(name); } g_free(parent); parent=tmp_parent; label=s+1; } g_free(menu_label); data=g_new(struct action_cb_data, 1); data->gui=this; data->attr.type=attr_destination; data->attr.u.pcoord=g_new(struct pcoord, 1); data->attr.u.pcoord->pro=projection_mg; data->attr.u.pcoord->x=c.x; data->attr.u.pcoord->y=c.y; name=g_strdup_printf("Bookmark %d", count++); meninfo = g_new(struct gui_menu_info, 1); *meninfo = gui_gtk_add_menu(this, name, label, parent,0,data); this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); g_free(name); g_free(parent); } g_hash_table_destroy(hash); } } static void gui_gtk_bookmarks_init(struct gui_priv *this) { struct attr attr; navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_callback(attr.u.bookmarks, callback_new_attr_1(callback_cast(gui_gtk_bookmarks_update), attr_bookmark_map, this)); gui_gtk_bookmarks_update(this); } static void gui_gtk_init(struct gui_priv *this, struct navit *nav) { struct attr route_attr; gui_gtk_toggle_init(this); gui_gtk_layouts_init(this); gui_gtk_projections_init(this); gui_gtk_vehicles_init(this); gui_gtk_maps_init(this); gui_gtk_destinations_init(this); gui_gtk_bookmarks_init(this); if (navit_get_attr(nav,attr_route,&route_attr,NULL)) { struct attr callback; callback.type=attr_callback; callback.u.callback=callback_new_attr_1(callback_cast(gui_gtk_route_callback), attr_route_status, this); route_add_attr(route_attr.u.route, &callback); } gui_gtk_route_callback(this); //Set initial state } static struct gui_priv * gui_gtk_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) { struct gui_priv *this; int w=792, h=547; char *cp = getenv("NAVIT_XID"); unsigned xid = 0; struct attr *attr; GtkWidget *widget; int fullscreen = 0; if (! event_request_system("glib","gui_gtk_new")) return NULL; if (cp) { xid = strtol(cp, NULL, 0); } this=g_new0(struct gui_priv, 1); this->nav=nav; attr = attr_search(attrs, NULL, attr_menubar); if (attr) { this->menubar_enable=attr->u.num; } else { this->menubar_enable=1; } attr=attr_search(attrs, NULL, attr_toolbar); if (attr) { this->toolbar_enable=attr->u.num; } else { this->toolbar_enable=1; } attr=attr_search(attrs, NULL, attr_statusbar); if (attr) { this->statusbar_enable=attr->u.num; } else { this->statusbar_enable=1; } *meth=gui_gtk_methods; if (!xid) this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); else this->win = gtk_plug_new(xid); g_signal_connect(G_OBJECT(this->win), "delete-event", G_CALLBACK(gui_gtk_delete), nav); this->vbox = gtk_vbox_new(FALSE, 0); gtk_window_set_default_size(GTK_WINDOW(this->win), w, h); gtk_window_set_title(GTK_WINDOW(this->win), "Navit"); gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", "Navit"); gtk_widget_realize(this->win); gui_gtk_ui_init(this); if (this->menubar_enable) { widget=gtk_ui_manager_get_widget(this->ui_manager, "/ui/MenuBar"); GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); gtk_widget_show (widget); this->menubar=widget; } if (this->toolbar_enable) { widget=gtk_ui_manager_get_widget(this->ui_manager, "/ui/ToolBar"); GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); gtk_widget_show (widget); } if (this->statusbar_enable) { this->statusbar=gui_gtk_statusbar_new(this); } gtk_window_add_accel_group (GTK_WINDOW (this->win), gtk_ui_manager_get_accel_group(this->ui_manager)); gtk_container_add(GTK_CONTAINER(this->win), this->vbox); gtk_widget_show_all(this->win); navit_add_callback(nav, callback_new_attr_1(callback_cast(gui_gtk_init), attr_navit, this)); if ((attr=attr_search(attrs, NULL, attr_fullscreen))) fullscreen=attr->u.num; if (fullscreen) { GtkToggleAction *action; action = GTK_TOGGLE_ACTION (gtk_action_group_get_action (this->base_group, "FullscreenAction")); gtk_toggle_action_set_active (action, fullscreen); } return this; } static int gtk_argc; static char **gtk_argv={NULL}; void plugin_init(void) { gtk_init(>k_argc, >k_argv); gtk_set_locale(); #ifdef HAVE_API_WIN32 setlocale(LC_NUMERIC,"C"); #endif plugin_register_gui_type("gtk", gui_gtk_new); } navit-0.5.0+dfsg.1/navit/gui/internal/000077500000000000000000000000001264204753600174455ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/gui/internal/CMakeLists.txt000066400000000000000000000003651264204753600222110ustar00rootroot00000000000000module_add_library(gui_internal gui_internal.c gui_internal_bookmark.c gui_internal_command.c gui_internal_gesture.c gui_internal_html.c gui_internal_menu.c gui_internal_poi.c gui_internal_search.c gui_internal_widget.c gui_internal_keyboard.c) navit-0.5.0+dfsg.1/navit/gui/internal/Makefile.am000066400000000000000000000015041264204753600215010ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ -DMODULE=gui_internal if PLUGINS modulegui_LTLIBRARIES = libgui_internal.la else noinst_LTLIBRARIES = libgui_internal.la endif libgui_internal_la_SOURCES = gui_internal_bookmark.c gui_internal.c gui_internal_command.c gui_internal_gesture.c gui_internal_html.c gui_internal_keyboard.c gui_internal_menu.c gui_internal_poi.c gui_internal_search.c gui_internal_widget.c gui_internal_bookmark.h gui_internal_command.h gui_internal_gesture.h gui_internal.h gui_internal_html.h gui_internal_keyboard.h gui_internal_menu.h gui_internal_poi.h gui_internal_priv.h gui_internal_search.h gui_internal_widget.h libgui_internal_la_LIBADD = libgui_internal_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal.c000066400000000000000000003052651264204753600223040ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ //############################################################################################################## //# //# File: gui_internal.c //# Description: New "internal" GUI for use with any graphics library //# Comment: Trying to make a touchscreen friendly GUI //# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) //# //############################################################################################################## #include #include #include #include #include #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_API_WIN32_BASE #include #endif #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "item.h" #include "xmlconfig.h" #include "file.h" #include "navit.h" #include "navit_nls.h" #include "gui.h" #include "coord.h" #include "point.h" #include "plugin.h" #include "graphics.h" #include "transform.h" #include "color.h" #include "map.h" #include "callback.h" #include "vehicle.h" #include "vehicleprofile.h" #include "window.h" #include "config_.h" #include "keys.h" #include "mapset.h" #include "route.h" #include "navit/search.h" #include "track.h" #include "country.h" #include "config.h" #include "event.h" #include "navit_nls.h" #include "navigation.h" #include "gui_internal.h" #include "command.h" #include "util.h" #include "bookmarks.h" #include "linguistics.h" #include "debug.h" #include "fib.h" #include "types.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_bookmark.h" #include "gui_internal_menu.h" #include "gui_internal_search.h" #include "gui_internal_gesture.h" #include "gui_internal_poi.h" #include "gui_internal_command.h" /** * Indexes into the config_profiles array. */ const int LARGE_PROFILE=0; const int MEDIUM_PROFILE=1; const int SMALL_PROFILE=2; /** * The default config profiles. * * [0] => LARGE_PROFILE (screens 640 in one dimension) * [1] => MEDIUM PROFILE (screens larger than 320 in one dimension * [2] => Small profile (default) */ static struct gui_config_settings config_profiles[]={ {545,32,48,96,10} , {300,32,48,64,3} ,{200,16,32,48,2} }; static void gui_internal_cmd_view_in_browser(struct gui_priv *this, struct widget *wm, void *data); static int gui_internal_is_active_vehicle(struct gui_priv *this, struct vehicle *vehicle); /** * @brief Displays an image scaled to a specific size * * Searches for scaleable and pre-scaled image * * @param this Our gui context * @param name image name * @param w desired width of image * @param h desired height of image * * @return image_struct Ptr to scaled image struct or NULL if not scaled or found */ static struct graphics_image * image_new_scaled(struct gui_priv *this, const char *name, int w, int h) { struct graphics_image *ret=NULL; char *full_path=NULL; full_path=graphics_icon_path(name); ret=graphics_image_new_scaled(this->gra, full_path, w, h); dbg(lvl_debug,"Trying to load image '%s' (w=%d, h=%d): %s\n", name, w, h, ret ? "OK" : "NOT FOUND"); g_free(full_path); if (!ret) { dbg(lvl_error,"Failed to load image for '%s' (w=%d, h=%d)\n", name, w, h); full_path=graphics_icon_path("unknown"); ret=graphics_image_new_scaled(this->gra, full_path, w, h); g_free(full_path); } return ret; } #if 0 static struct graphics_image * image_new_o(struct gui_priv *this, char *name) { return image_new_scaled(this, name, -1, -1); } #endif /** * @brief Displays an image scaled to xs (extra small) size * * This image size can be too small to click it on some devices. * * @param this Our gui context * @param name image name * * @return image_struct Ptr to scaled image struct or NULL if not scaled or found */ struct graphics_image * image_new_xs(struct gui_priv *this, const char *name) { return image_new_scaled(this, name, this->icon_xs, this->icon_xs); } /** * @brief Displays an image scaled to s (small) size * * @param this Our gui context * @param name image name * * @return image_struct Ptr to scaled image struct or NULL if not scaled or found */ struct graphics_image * image_new_s(struct gui_priv *this, const char *name) { return image_new_scaled(this, name, this->icon_s, this->icon_s); } /** * @brief Displays an image scaled to l (large) size * @param this Our gui context * @param name image name * * @return image_struct Ptr to scaled image struct or NULL if not scaled or found */ struct graphics_image * image_new_l(struct gui_priv *this, const char *name) { return image_new_scaled(this, name, this->icon_l, this->icon_l); } static int gui_internal_button_attr_update(struct gui_priv *this, struct widget *w) { struct widget *wi; int is_on=0; struct attr curr; GList *l; if (w->get_attr(w->instance, w->on.type, &curr, NULL)) is_on=curr.u.data == w->on.u.data; else is_on=w->deflt; if (is_on != w->is_on) { if (w->redraw) this->redraw=1; w->is_on=is_on; l=g_list_first(w->children); if (l) { wi=l->data; if (wi->img) graphics_image_free(this->gra, wi->img); wi->img=image_new_xs(this, is_on ? "gui_active" : "gui_inactive"); } if (w->is_on && w->off.type == attr_none) w->state &= ~STATE_SENSITIVE; else w->state |= STATE_SENSITIVE; return 1; } return 0; } static void gui_internal_button_attr_callback(struct gui_priv *this, struct widget *w) { if (gui_internal_button_attr_update(this, w)) gui_internal_widget_render(this, w); } static void gui_internal_button_attr_pressed(struct gui_priv *this, struct widget *w, void *data) { if (w->is_on) w->set_attr(w->instance, &w->off); else w->set_attr(w->instance, &w->on); gui_internal_button_attr_update(this, w); } struct widget * gui_internal_button_navit_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct attr *on, struct attr *off) { struct graphics_image *image=NULL; struct widget *ret; if (!on && !off) return NULL; image=image_new_xs(this, "gui_inactive"); ret=gui_internal_button_new_with_callback(this, text, image, flags, gui_internal_button_attr_pressed, NULL); if (on) ret->on=*on; if (off) ret->off=*off; ret->get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navit_get_attr; ret->set_attr=(int (*)(void *, struct attr *))navit_set_attr; ret->remove_cb=(void (*)(void *, struct callback *))navit_remove_callback; ret->instance=this->nav; ret->cb=callback_new_attr_2(callback_cast(gui_internal_button_attr_callback), on?on->type:off->type, this, ret); navit_add_callback(this->nav, ret->cb); gui_internal_button_attr_update(this, ret); return ret; } struct widget * gui_internal_button_map_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct map *map, struct attr *on, struct attr *off, int deflt) { struct graphics_image *image=NULL; struct widget *ret; image=image_new_xs(this, "gui_inactive"); if (!on && !off) return NULL; ret=gui_internal_button_new_with_callback(this, text, image, flags, gui_internal_button_attr_pressed, NULL); if (on) ret->on=*on; if (off) ret->off=*off; ret->deflt=deflt; ret->get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))map_get_attr; ret->set_attr=(int (*)(void *, struct attr *))map_set_attr; ret->remove_cb=(void (*)(void *, struct callback *))map_remove_callback; ret->instance=map; ret->redraw=1; ret->cb=callback_new_attr_2(callback_cast(gui_internal_button_attr_callback), on?on->type:off->type, this, ret); map_add_callback(map, ret->cb); gui_internal_button_attr_update(this, ret); return ret; } /* * @brief Calculate movement vector and timing of the gesture. * @param in this gui context * @param in msec time in milliseconds to find gesture within * @param out p0 pointer to the point object, where gesture starting point coordinates should be placed. Can be NULL. * @param out dx pointer to variable to store horizontal movement of the gesture. * @param out dy pointer to variable to store vertical movement of the gesture. * @return amount of time the actual movement took. */ /* FIXME where is the implementation? */ static void gui_internal_motion_cb(struct gui_priv *this) { this->motion_timeout_event=NULL; gui_internal_gesture_ring_add(this, &(this->current)); /* Check for scrollable table below the highligted item if there's a movement with the button pressed */ if (this->pressed && this->highlighted) { struct widget *wt=NULL; struct widget *wr=NULL; int dx,dy; /* Guard against accidental scrolling when user is likely going to swipe */ gui_internal_gesture_get_vector(this, 1000, NULL, &dx, &dy); if(abs(dx)>abs(dy) || abs(dy)icon_s) return; if(this->highlighted) for(wr=this->highlighted;wr && wr->type!=widget_table_row;wr=wr->parent); if(wr) wt=wr->parent; if(wt && wt->type==widget_table && (wt->state & STATE_SCROLLABLE)) { struct table_data *td=wt->data; GList *top=NULL; GList *btm=NULL; GList *ttop, *tbtm; if(!wr || !wr->h) return; if(this->current.y < wr->p.y && wr!=td->top_row->data ) { int n=(wr->p.y-this->current.y)/wr->h+1; btm=td->bottom_row; top=td->top_row; while(n-->0 && (tbtm=gui_internal_widget_table_next_row(btm))!=NULL && (ttop=gui_internal_widget_table_next_row(top))!=NULL) { top=ttop; btm=tbtm; if(top->data==wr) break; } this->pressed=2; } else if (this->current.y > wr->p.y + wr->h ) { int y=wt->p.y+wt->h-wr->h; int n; if(td->scroll_buttons.button_box && td->scroll_buttons.button_box->p.y!=0) y=td->scroll_buttons.button_box->p.y - td->scroll_buttons.button_box->h; if(y>this->current.y) y=this->current.y; n=(y - wr->p.y )/wr->h; btm=td->bottom_row; top=td->top_row; while(n-->0 && (ttop=gui_internal_widget_table_prev_row(top))!=NULL && (tbtm=gui_internal_widget_table_prev_row(btm))!=NULL) { btm=tbtm; top=ttop; if(btm->data==wr) break; } this->pressed=2; } if( top && btm && (td->top_row!=top || td->bottom_row!=btm) ) { gui_internal_table_hide_rows(wt->data); td->top_row=top; td->bottom_row=btm; graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_widget_render(this,wt); graphics_draw_mode(this->gra, draw_mode_end); } return; } } /* Else, just move highlight after pointer if there's nothing to scroll */ gui_internal_highlight(this); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_call_highlighted(struct gui_priv *this) { if (! this->highlighted || ! this->highlighted->func) return; this->highlighted->reason=gui_internal_reason_click; this->highlighted->func(this, this->highlighted, this->highlighted->data); } void gui_internal_say(struct gui_priv *this, struct widget *w, int questionmark) { char *text=w->speech; if (! this->speech) return; if (!text) text=w->text; if (!text) text=w->name; if (text) { text=g_strdup_printf("%s%c", text, questionmark ? '?':'\0'); navit_say(this->nav, text); g_free(text); } } void gui_internal_back(struct gui_priv *this, struct widget *w, void *data) { gui_internal_prune_menu_count(this, 1, 1); } void gui_internal_cmd_return(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_prune_menu(this, wm->data); } void gui_internal_cmd_main_menu(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w=this->root.children->data; if (w && w->menu_data && w->menu_data->href && !strcmp(w->menu_data->href,"#Main Menu")) gui_internal_prune_menu(this, w); else gui_internal_html_main_menu(this); } struct widget * gui_internal_time_help(struct gui_priv *this) { struct widget *w,*wc,*wcn; char timestr[64]; struct tm *tm; time_t timep; w=gui_internal_box_new(this, gravity_right_center|orientation_horizontal|flags_fill); w->bl=this->spacing; w->spx=this->spacing; w->spx=10; w->bl=10; w->br=10; w->bt=6; w->bb=6; if (this->flags & 64) { wc=gui_internal_box_new(this, gravity_right_top|orientation_vertical|flags_fill); wc->bl=10; wc->br=20; wc->bt=6; wc->bb=6; timep=time(NULL); tm=localtime(&timep); strftime(timestr, 64, "%H:%M %d.%m.%Y", tm); wcn=gui_internal_label_new(this, timestr); gui_internal_widget_append(wc, wcn); gui_internal_widget_append(w, wc); } if (this->flags & 128) { wcn=gui_internal_button_new_with_callback(this, _("Help"), image_new_l(this, "gui_help"), gravity_center|orientation_vertical|flags_fill, NULL, NULL); gui_internal_widget_append(w, wcn); } return w; } /** * Applies the configuration values to this based on the settings * specified in the configuration file (this->config) and * the most approriate default profile based on screen resolution. * * This function should be run after this->root is setup and could * be rerun after the window is resized. * * @author Steve Singer (09/2008) */ void gui_internal_apply_config(struct gui_priv *this) { struct gui_config_settings * current_config=0; dbg(lvl_debug,"w=%d h=%d\n", this->root.w, this->root.h); /* * Select default values from profile based on the screen. */ if((this->root.w > 320 || this->root.h > 320) && this->root.w > 240 && this->root.h > 240) { if((this->root.w > 640 || this->root.h > 640) && this->root.w > 480 && this->root.h > 480 ) { current_config = &config_profiles[LARGE_PROFILE]; } else { current_config = &config_profiles[MEDIUM_PROFILE]; } } else { current_config = &config_profiles[SMALL_PROFILE]; } /* * Apply override values from config file */ if(this->config.font_size == -1 ) { this->font_size = current_config->font_size; } else { this->font_size = this->config.font_size; } if(this->config.icon_xs == -1 ) { this->icon_xs = current_config->icon_xs; } else { this->icon_xs = this->config.icon_xs; } if(this->config.icon_s == -1 ) { this->icon_s = current_config->icon_s; } else { this->icon_s = this->config.icon_s; } if(this->config.icon_l == -1 ) { this->icon_l = current_config->icon_l; } else { this->icon_l = this->config.icon_l; } if(this->config.spacing == -1 ) { this->spacing = current_config->spacing; } else { this->spacing = current_config->spacing; } if (!this->fonts[0]) { int i,sizes[]={100,66,50}; for (i = 0 ; i < 3 ; i++) { if (this->font_name) this->fonts[i]=graphics_named_font_new(this->gra,this->font_name,this->font_size*sizes[i]/100,1); else this->fonts[i]=graphics_font_new(this->gra,this->font_size*sizes[i]/100,1); } } } static void gui_internal_cmd_set_destination(struct gui_priv *this, struct widget *wm, void *data) { char *name=data; dbg(lvl_info,"c=%d:0x%x,0x%x\n", wm->c.pro, wm->c.x, wm->c.y); navit_set_destination(this->nav, &wm->c, name, 1); if (this->flags & 512) { struct attr follow; follow.type=attr_follow; follow.u.num=180; navit_set_attr(this->nav, &this->osd_configuration); navit_set_attr(this->nav, &follow); navit_zoom_to_route(this->nav, 0); } gui_internal_prune_menu(this, NULL); } static void gui_internal_cmd_insert_destination_do(struct gui_priv *this, struct widget *wm, void *data) { char *name=data; int dstcount=navit_get_destination_count(this->nav)+1; int pos,i; struct pcoord *dst=g_alloca(dstcount*sizeof(struct pcoord)); dstcount=navit_get_destinations(this->nav,dst,dstcount); pos=dstcount-wm->datai; if(pos<0) pos=0; for(i=dstcount;i>pos;i--) dst[i]=dst[i-1]; dst[pos]=wm->c; navit_add_destination_description(this->nav,&wm->c,(char*)data); navit_set_destinations(this->nav,dst,dstcount+1,name,1); gui_internal_prune_menu(this, NULL); } /* * @brief Displays a waypoint list to the user. * * This display a waypoint list to the user. When the user chooses an item from the list, the callback * function passed as {@code cmd} will be called. * * Widget passed as wm parameter of the called cmd function will have item set to user chosen waypoint item. Its data will be set * to zero-based choosen waypoint number, counting from the route end. Coordinates to wm->c will be copied from wm_->c if wm_ is not null. Otherwise, * waypoint coordinates will be copied to wm->c. * * @param this gui context * @param title Menu title * @param hint Text to display above the waypoint list describing the action to be performed, can be NULL * @param wm_ The called widget pointer. Can be NULL. * @param cmd Callback function which will be called on item selection * @param data data argument to be passed to the callback function */ void gui_internal_select_waypoint(struct gui_priv *this, const char *title, const char *hint, struct widget *wm_, void(*cmd)(struct gui_priv *priv, struct widget *widget, void *data),void *data) { struct widget *wb,*w,*wtable,*row,*wc; struct map *map; struct map_rect *mr; struct item *item; char *text; int i; int dstcount=navit_get_destination_count(this->nav)+1; map=route_get_map(navit_get_route(this->nav)); if(!map) return; mr = map_rect_new(map, NULL); if(!mr) return; wb=gui_internal_menu(this, title); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); if(hint) gui_internal_widget_append(w, gui_internal_label_new(this, hint)); wtable = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(w,wtable); i=0; while((item = map_rect_get_item(mr))!=NULL) { struct attr attr; if(item->type!=type_waypoint && item->type!=type_route_end) continue; if (item_attr_get(item, attr_label, &attr)) { text=g_strdup_printf(_("Waypoint %s"), map_convert_string_tmp(item->map, attr.u.str)); } else continue; gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_button_new_with_callback(this, text, image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, cmd, data)); wc->item=*item; if(wm_) wc->c=wm_->c; else { struct coord c; item_coord_get(item,&c,1); wc->c.x=c.x; wc->c.y=c.y; wc->c.pro=map_projection(item->map); } i++; wc->datai=dstcount-i; g_free(text); } map_rect_destroy(mr); gui_internal_menu_render(this); } static void gui_internal_cmd_insert_destination(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_select_waypoint(this, data, _("Select waypoint to insert the new one before"), wm, gui_internal_cmd_insert_destination_do, data); } static void gui_internal_cmd_set_position(struct gui_priv *this, struct widget *wm, void *data) { struct attr v; if(data) { v.type=attr_vehicle; v.u.vehicle=NULL; navit_set_attr(this->nav, &v); } navit_set_position(this->nav, &wm->c); gui_internal_prune_menu(this, NULL); } /** * @brief Generic notification function for Editable widgets to call Another widget notification function when Enter is pressed in editable field. * The Editable widget should have data member pointing to the Another widget. */ void gui_internal_call_linked_on_finish(struct gui_priv *this, struct widget *wm, void *data) { if (wm->reason==gui_internal_reason_keypress_finish && data) { struct widget *w=data; if(w->func) w->func(this, w, w->data); } } struct widget * gui_internal_keyboard(struct gui_priv *this, int mode); static void gui_internal_cmd_delete_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_delete_bookmark(mattr.u.bookmarks,wm->text); l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } /** * Get a utf-8 string, return the same prepared for case insensitive search. Result should be g_free()d after use. */ char * removecase(char *s) { char *r; r=linguistics_casefold(s); return r; } static void gui_internal_cmd_view_on_map(struct gui_priv *this, struct widget *wm, void *data) { if (wm->item.type != type_none) { enum item_type type; if (wm->item.type < type_line) type=type_selected_point; else if (wm->item.type < type_area) type=type_selected_point; else type=type_selected_area; graphics_clear_selection(this->gra, NULL); graphics_add_selection(this->gra, &wm->item, type, NULL); } navit_set_center(this->nav, &wm->c, 1); gui_internal_prune_menu(this, NULL); } static void gui_internal_cmd_view_attribute_details(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb; struct map_rect *mr; struct item *item; struct attr attr; char *text,*url; int i; text=g_strdup_printf("Attribute %s",wm->name); wb=gui_internal_menu(this, text); g_free(text); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); for (i = 0 ; i < wm->datai ; i++) { item_attr_get(item, attr_any, &attr); } if (item_attr_get(item, attr_any, &attr)) { url=NULL; switch (attr.type) { case attr_osm_nodeid: url=g_strdup_printf("http://www.openstreetmap.org/browse/node/"LONGLONG_FMT"\n",*attr.u.num64); break; case attr_osm_wayid: url=g_strdup_printf("http://www.openstreetmap.org/browse/way/"LONGLONG_FMT"\n",*attr.u.num64); break; case attr_osm_relationid: url=g_strdup_printf("http://www.openstreetmap.org/browse/relation/"LONGLONG_FMT"\n",*attr.u.num64); break; default: break; } if (url) { gui_internal_widget_append(w, wb=gui_internal_button_new_with_callback(this, _("View in Browser"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_in_browser, NULL)); wb->name=url; } } map_rect_destroy(mr); gui_internal_menu_render(this); } static void gui_internal_cmd_view_attributes(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb; struct map_rect *mr; struct item *item; struct attr attr; char *text; int count=0; dbg(lvl_info,"item=%p 0x%x 0x%x\n", wm->item.map,wm->item.id_hi, wm->item.id_lo); wb=gui_internal_menu(this, "Attributes"); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); dbg(lvl_info,"item=%p\n", item); if (item) { text=g_strdup_printf("%s:%s", _("Item type"), item_to_name(item->type)); gui_internal_widget_append(w, wb=gui_internal_button_new(this, text, NULL, gravity_left_center|orientation_horizontal|flags_fill)); wb->name=g_strdup(text); wb->item=wm->item; g_free(text); while(item_attr_get(item, attr_any, &attr)) { char *attrtxt; text=g_strdup_printf("%s:%s", attr_to_name(attr.type), attrtxt=attr_to_text(&attr, wm->item.map, 1)); g_free(attrtxt); gui_internal_widget_append(w, wb=gui_internal_button_new_with_callback(this, text, NULL, gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_attribute_details, NULL)); wb->name=g_strdup(text); wb->item=wm->item; wb->datai=count++; g_free(text); } text=g_strdup_printf("%s:0x%x,0x%x", "ID", item->id_hi, item->id_lo); gui_internal_widget_append(w, wb=gui_internal_button_new(this, text, NULL, gravity_left_center|orientation_horizontal|flags_fill)); wb->name=text; wb->item=wm->item; } map_rect_destroy(mr); gui_internal_menu_render(this); } static void gui_internal_cmd_view_in_browser(struct gui_priv *this, struct widget *wm, void *data) { struct map_rect *mr; struct item *item; struct attr attr; char *cmd=NULL; if (!wm->name) { dbg(lvl_info,"item=%p 0x%x 0x%x\n", wm->item.map,wm->item.id_hi, wm->item.id_lo); mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); dbg(lvl_info,"item=%p\n", item); if (item) { while(item_attr_get(item, attr_url_local, &attr)) { if (! cmd) cmd=g_strdup_printf("navit-browser.sh '%s' &",map_convert_string_tmp(item->map,attr.u.str)); } } map_rect_destroy(mr); } else { cmd=g_strdup_printf("navit-browser.sh '%s' &",wm->name); } if (cmd) { #ifdef HAVE_SYSTEM system(cmd); #else dbg(lvl_error,"Error: External commands were disabled during compilation, cannot call '%s'.\n",cmd); #endif g_free(cmd); } } /* * @brief Transfers search results to a map. * * @param this The graphics context. * @param wm called widget. * @param data event data (pointer to the table widget containing results, or NULL to clean the result map without adding any new data). */ static void gui_internal_cmd_results_to_map(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w; struct mapset *ms; struct map *map; struct map_rect *mr; struct item *item; GList *l; struct coord_rect r; struct attr a; int count; ms=navit_get_mapset(this->nav); if(!ms) return; map=mapset_get_map_by_name(ms, "search_results"); if(!map) { struct attr *attrs[10], attrmap; enum attr_type types[]={attr_position_longitude,attr_position_latitude,attr_label,attr_none}; int i; attrs[0]=g_new0(struct attr,1); attrs[0]->type=attr_type; attrs[0]->u.str="csv"; attrs[1]=g_new0(struct attr,1); attrs[1]->type=attr_name; attrs[1]->u.str="search_results"; attrs[2]=g_new0(struct attr,1); attrs[2]->type=attr_charset; attrs[2]->u.str="utf-8"; attrs[3]=g_new0(struct attr,1); attrs[3]->type=attr_item_type; attrs[3]->u.num=type_found_item; attrs[4]=g_new0(struct attr,1); attrs[4]->type=attr_attr_types; attrs[4]->u.attr_types=types; attrs[5]=NULL; attrmap.type=attr_map; map=attrmap.u.map=map_new(NULL,attrs); if(map) mapset_add_attr(ms,&attrmap); for(i=0;attrs[i];i++) g_free(attrs[i]); } if(!map) return; mr = map_rect_new(map, NULL); if(!mr) return; /* Clean the map */ while((item = map_rect_get_item(mr))!=NULL) { item_type_set(item,type_none); } this->results_map_population=0; /* Find the table to pupulate the map */ for(w=data; w && w->type!=widget_table;w=w->parent); if(!w) { map_rect_destroy(mr); dbg(lvl_warning,"Can't find the results table - only map clean up is done.\n"); return; } /* Populate the map with search results*/ for(l=w->children, count=0;l;l=g_list_next(l)) { struct widget *wr=l->data; if(wr->type==widget_table_row) { struct widget *wi=wr->children->data; struct item* it; if(wi->name==NULL) continue; dbg(lvl_info,"%s\n",wi->name); it=map_rect_create_item(mr,type_found_item); if(it) { struct coord c; struct attr a; c.x=wi->c.x; c.y=wi->c.y; item_coord_set(it, &c, 1, change_mode_modify); a.type=attr_label; a.u.str=wi->name; item_attr_set(it, &a, change_mode_modify); if(!count++) r.lu=r.rl=c; else coord_rect_extend(&r,&c); } } } map_rect_destroy(mr); if(!count) return; a.type=attr_orientation; a.u.num=0; navit_set_attr(this->nav,&a); navit_zoom_to_rect(this->nav,&r); gui_internal_prune_menu(this, NULL); this->results_map_population=count; } /* * @brief Removes search results from a map. * * @param this The graphics context. * @param wm called widget. * @param data event data */ static void gui_internal_cmd_results_map_clean(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_cmd_results_to_map(this,wm,NULL); gui_internal_prune_menu(this, NULL); navit_draw(this->nav); } static void gui_internal_cmd_delete_waypoint(struct gui_priv *this, struct widget *wm, void *data) { int dstcount=navit_get_destination_count(this->nav); int i; struct map_rect *mr; struct item *item; struct pcoord *dst=g_alloca(dstcount*sizeof(struct pcoord)); dstcount=navit_get_destinations(this->nav,dst,dstcount); mr=map_rect_new(wm->item.map, NULL); i=0; while((item=map_rect_get_item(mr))!=NULL) { struct coord c; if(item->type!=type_waypoint && item->type!=type_route_end) continue; if(item_is_equal_id(*item,wm->item)) continue; item_coord_get_pro(item,&c,1,projection_mg); dst[i].x=c.x; dst[i].y=c.y; dst[i].pro=projection_mg; i++; } map_rect_destroy(mr); navit_set_destinations(this->nav,dst,i,NULL,1); gui_internal_prune_menu(this, NULL); } /** * @brief Displays the commands available for a location. * * This displays the available commands for the given location in a dialog from which the user can * choose an action. The location can be supplied either in projected coordinates via the {@code pc_in} * argument or in WGS84 coordinates (i.e. latitude and longitude in degrees) via the {@code g_in} * argument. One of these must be supplied, the other should be {@code NULL}. * * @param this The internal GUI instance * @param pc_in Projected coordinates of the position * @param g_in WGS84 coordinates of the position * @param wm * @param name The display name for the position * @param flags Flags specifying the operations available from the GUI */ /* meaning of the bits in "flags": * 1: "Streets" * 2: "House numbers" * 4: "View in Browser", "View Attributes" * 8: "Set as dest." * 16: "Set as pos." * 32: "Add as bookm." * 64: "POIs" * 128: "View on Map" * 256: POIs around this point, "Drop search results from the map" * 512: "Cut/Copy... bookmark" * 1024: "Jump to attributes of top item within this->radius pixels of this point (implies flags|=256)" * 2048: "Show search results on the map" * TODO define constants for these values */ void gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, const char *name, int flags) { struct widget *wb,*w,*wtable,*row,*wc,*wbc,*wclosest=NULL; struct coord_geo g; struct pcoord pc; struct coord c; char *coord; if (pc_in) { pc=*pc_in; c.x=pc.x; c.y=pc.y; dbg(lvl_info,"x=0x%x y=0x%x\n", c.x, c.y); transform_to_geo(pc.pro, &c, &g); } else if (g_in) { struct attr attr; if (!navit_get_attr(this->nav, attr_projection, &attr, NULL)) return; g=*g_in; pc.pro=attr.u.projection; transform_from_geo(pc.pro, &g, &c); pc.x=c.x; pc.y=c.y; } else return; wb=gui_internal_menu(this, name); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); coord=gui_internal_coordinates(&pc, ' '); gui_internal_widget_append(w, gui_internal_label_new(this, coord)); g_free(coord); wtable = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(w,wtable); if ((flags & 1) && wm) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_button_new_with_callback(this, _("Streets"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_search_street_in_town, wm)); wc->item=wm->item; wc->selection_id=wm->selection_id; } if ((flags & 2) && wm) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_button_new_with_callback(this, _("House numbers"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_search_house_number_in_street, wm)); wc->item=wm->item; wc->selection_id=wm->selection_id; } if ((flags & 4) && wm) { struct map_rect *mr; struct item *item; struct attr attr; mr=map_rect_new(wm->item.map, NULL); item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); if (item) { if (item_attr_get(item, attr_description, &attr)) gui_internal_widget_append(w, gui_internal_label_new(this, map_convert_string_tmp(item->map,attr.u.str))); if (item_attr_get(item, attr_url_local, &attr)) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wb=gui_internal_button_new_with_callback(this, _("View in Browser"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_in_browser, NULL)); wb->item=wm->item; } gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wb=gui_internal_button_new_with_callback(this, _("View Attributes"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_attributes, NULL)); wb->item=wm->item; } map_rect_destroy(mr); } if (flags & 8) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Set as destination"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_destination, g_strdup(name))); wbc->data_free=g_free_func; wbc->c=pc; if(navit_get_destination_count(this->nav)>=1) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Visit before..."), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_insert_destination, g_strdup(name))); wbc->data_free=g_free_func; wbc->c=pc; } } if (flags & 16) { const char *text; struct attr vehicle, source; int deactivate=0; if (navit_get_attr(this->nav, attr_vehicle, &vehicle, NULL) && vehicle.u.vehicle && !(vehicle_get_attr(vehicle.u.vehicle, attr_source, &source, NULL) && source.u.str && !strcmp("demo://",source.u.str))) deactivate=1; text=deactivate? _("Set as position (and deactivate vehicle)") : _("Set as position"); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, text, image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_position, (void*)(long)deactivate)); wbc->c=pc; } if (flags & 32) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Add as bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_add_bookmark2, g_strdup(name))); wbc->data_free=g_free_func; wbc->c=pc; } #ifndef _MSC_VER //POIs are not operational under MSVC yet if (flags & 64) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("POIs"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_pois, NULL)); wbc->c=pc; } #endif /* _MSC_VER */ #if 0 gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new(this, "Add to tour", image_new_o(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill)); #endif if (flags & 128) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("View on map"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_on_map, NULL)); wbc->c=pc; if ((flags & 4) && wm) wbc->item=wm->item; else wbc->item.type=type_none; } if(flags & 256 && this->results_map_population) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Remove search results from the map"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_results_map_clean, NULL)); wbc->data=wm; } if(flags & 2048) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Show results on the map"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_results_to_map, NULL)); wbc->data=wm; } if ((flags & 256) || (flags & 1024)) { struct displaylist_handle *dlh; struct displaylist *display; struct attr attr; struct point p; struct transformation *trans; char *text; struct map_selection *sel; GList *l, *ll; c.x=pc.x; c.y=pc.y; trans=navit_get_trans(this->nav); transform(trans,pc.pro,&c,&p,1,0,0,0); display=navit_get_displaylist(this->nav); dlh=graphics_displaylist_open(display); sel=displaylist_get_selection(display); l=displaylist_get_clicked_list(display, &p, this->radius); for(ll=l;ll;ll=g_list_next(ll)) { struct displayitem *di; struct item *item; struct map_rect *mr; struct item *itemo; di=(struct displayitem*)ll->data; item=graphics_displayitem_get_item(di); mr=map_rect_new(item->map, sel); itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if(!itemo) { map_rect_destroy(mr); continue; } if (item_attr_get(itemo, attr_label, &attr)) { text=g_strdup(map_convert_string_tmp(itemo->map, attr.u.str)); } else text=g_strdup(item_to_name(item->type)); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wc=gui_internal_cmd_pois_item(this, NULL, itemo, NULL, NULL, -1, text)); wc->c=pc; g_free(wc->name); wc->name=g_strdup(text); wc->item=*itemo; g_free(text); map_rect_destroy(mr); if(!wclosest) wclosest=wc; } g_list_free(l); map_selection_destroy(sel); graphics_displaylist_close(dlh); } if (flags & 512) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Cut Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_cut_bookmark, NULL)); wbc->text=g_strdup(wm->text); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Copy Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_copy_bookmark, NULL)); wbc->text=g_strdup(wm->text); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Rename Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_rename_bookmark, NULL)); wbc->text=g_strdup(wm->text); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Paste Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_paste_bookmark, NULL)); gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Delete Bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_delete_bookmark, NULL)); wbc->text=g_strdup(wm->text); } if (wm && (wm->item.type==type_waypoint || wm->item.type==type_route_end)) { gui_internal_widget_append(wtable,row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wbc=gui_internal_button_new_with_callback(this, _("Delete waypoint"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_delete_waypoint, NULL)); wbc->item=wm->item; } gui_internal_menu_render(this); if((flags & 1024) && wclosest) gui_internal_cmd_view_attributes(this,wclosest,wclosest->data); } /* wm->data: 0 Nothing special 1 Map Point 2 Item 3 Town 4 County 5 Street 6 House number 7 Bookmark 8 Former destination 9 Item from the POI list */ void gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) { int flags; if(!data) data=wm->data; switch ((long) data) { case 0: flags=8|16|32|64|128|256; break; case 1: flags=8|16|32|64|256; break; case 2: flags=4|8|16|32|64|128; break; case 3: flags=1|4|8|16|32|64|128|2048; flags &= this->flags_town; break; case 4: gui_internal_search_town_in_country(this, wm); return; case 5: flags=2|8|16|32|64|128|2048; flags &= this->flags_street; break; case 6: flags=8|16|32|64|128|2048; flags &= this->flags_house_number; break; case 7: flags=8|16|64|128|512; break; case 8: flags=8|16|32|64|128; break; case 9: flags=4|8|16|32|64|128|2048; break; default: return; } switch (flags) { case 2: gui_internal_search_house_number_in_street(this, wm, NULL); return; case 8: gui_internal_cmd_set_destination(this, wm, NULL); return; } gui_internal_cmd_position_do(this, &wm->c, NULL, wm, wm->name ? wm->name : wm->text, flags); } /** * The "Bookmarks" section of the OSD * */ void gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data) { struct attr attr,mattr; struct item *item; char *label_full,*prefix=0; int plen=0,hassub,found=0; struct widget *wb,*w,*wbm; struct coord c; struct widget *tbl, *row; if (data) prefix=g_strdup(data); else { if (wm && wm->prefix) prefix=g_strdup(wm->prefix); } if ( prefix ) plen=strlen(prefix); gui_internal_prune_menu_count(this, 1, 0); wb=gui_internal_menu(this, _("Bookmarks")); wb->background=this->background; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); //w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if(navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL) ) { if (!plen) { bookmarks_move_root(mattr.u.bookmarks); } else { if (!strcmp(prefix,"..")) { bookmarks_move_up(mattr.u.bookmarks); g_free(prefix); prefix=g_strdup(bookmarks_item_cwd(mattr.u.bookmarks)); if (prefix) { plen=strlen(prefix); } else { plen=0; } } else { bookmarks_move_down(mattr.u.bookmarks,prefix); } // "Back" button, when inside a bookmark folder if (plen) { wbm=gui_internal_button_new_with_callback(this, "..", image_new_xs(this, "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_bookmarks, NULL); wbm->prefix=g_strdup(".."); gui_internal_widget_append(w, wbm); // load bookmark folder as Waypoints, if any if (bookmarks_get_bookmark_count(mattr.u.bookmarks) > 0){ wbm=gui_internal_button_new_with_callback(this, _("Bookmarks as waypoints"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_load_bookmarks_as_waypoints, NULL); wbm->prefix=g_strdup(prefix); gui_internal_widget_append(w, wbm); } // save Waypoints in bookmark folder, if route exists if (navit_get_destination_count(this->nav) > 0){ if (bookmarks_get_bookmark_count(mattr.u.bookmarks)==0){ wbm=gui_internal_button_new_with_callback(this, _("Save waypoints"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_replace_bookmarks_from_waypoints, NULL); }else{ wbm=gui_internal_button_new_with_callback(this, _("Replace with waypoints"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_replace_bookmarks_from_waypoints, NULL); } wbm->prefix=g_strdup(prefix); gui_internal_widget_append(w, wbm); } // delete empty folder if (bookmarks_get_bookmark_count(mattr.u.bookmarks)==0){ gui_internal_widget_append(w, wbm=gui_internal_button_new_with_callback(this, _("Delete Folder"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_delete_bookmark_folder, NULL)); wbm->prefix=g_strdup(prefix); } } } // Adds the Bookmark folders wbm=gui_internal_button_new_with_callback(this, _("Add Bookmark folder"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_add_bookmark_folder2, NULL); gui_internal_widget_append(w, wbm); // Pastes the Bookmark wbm=gui_internal_button_new_with_callback(this, _("Paste bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_paste_bookmark, NULL); gui_internal_widget_append(w, wbm); bookmarks_item_rewind(mattr.u.bookmarks); tbl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(w,tbl); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { if (!item_attr_get(item, attr_label, &attr)) continue; label_full=map_convert_string_tmp(item->map,attr.u.str); dbg(lvl_info,"full_labled: %s\n",label_full); // hassub == 1 if the item type is a sub-folder if (item->type == type_bookmark_folder) { hassub=1; } else { hassub=0; } row=gui_internal_widget_table_row_new(this,gravity_left| flags_fill| orientation_horizontal); gui_internal_widget_append(tbl, row); wbm=gui_internal_button_new_with_callback(this, label_full, image_new_xs(this, hassub ? "gui_inactive" : "gui_active" ), gravity_left_center|orientation_horizontal|flags_fill, hassub ? gui_internal_cmd_bookmarks : gui_internal_cmd_position, NULL); gui_internal_widget_append(row,wbm); if (item_coord_get(item, &c, 1)) { wbm->c.x=c.x; wbm->c.y=c.y; wbm->c.pro=bookmarks_get_projection(mattr.u.bookmarks); wbm->name=g_strdup_printf(_("Bookmark %s"),label_full); wbm->text=g_strdup(label_full); if (!hassub) { wbm->data=(void*)7;//Mark us as a bookmark } wbm->prefix=g_strdup(label_full); } else { gui_internal_widget_destroy(this, row); } } } g_free(prefix); if (found) gui_internal_check_exit(this); else gui_internal_menu_render(this); } static void gui_internal_keynav_highlight_next(struct gui_priv *this, int dx, int dy, int rotary); static int gui_internal_keynav_find_next(struct widget *wi, struct widget *current_highlight, struct widget **result); static int gui_internal_keynav_find_prev(struct widget *wi, struct widget *current_highlight, struct widget **result); static struct widget* gui_internal_keynav_find_next_sensitive_child(struct widget *wi); void gui_internal_keypress_do(struct gui_priv *this, char *key) { struct widget *wi,*menu,*search_list; int len=0; char *text=NULL; menu=g_list_last(this->root.children)->data; wi=gui_internal_find_widget(menu, NULL, STATE_EDIT); if (wi) { /* select first item of the searchlist */ if (*key == NAVIT_KEY_RETURN) { search_list=gui_internal_menu_data(this)->search_list; if(search_list) { GList *l=gui_internal_widget_table_top_row(this, search_list); if (l && l->data) { struct widget *w=l->data; this->current.x=w->p.x+w->w/2; this->current.y=w->p.y+w->h/2; gui_internal_highlight(this); } } else { wi->reason=gui_internal_reason_keypress_finish; wi->func(this, wi, wi->data); } return; } else if (*key == NAVIT_KEY_BACKSPACE) { dbg(lvl_debug,"backspace\n"); if (wi->text && wi->text[0]) { len=g_utf8_prev_char(wi->text+strlen(wi->text))-wi->text; wi->text[len]='\0'; text=g_strdup(wi->text); } } else { if (wi->state & STATE_CLEAR) { dbg(lvl_info,"wi->state=0x%x\n", wi->state); g_free(wi->text); wi->text=NULL; wi->state &= ~STATE_CLEAR; dbg(lvl_info,"wi->state=0x%x\n", wi->state); } text=g_strdup_printf("%s%s", wi->text ? wi->text : "", key); } g_free(wi->text); wi->text=text; if (wi->func) { wi->reason=gui_internal_reason_keypress; wi->func(this, wi, wi->data); } gui_internal_widget_render(this, wi); } } char * gui_internal_cmd_match_expand(char *pattern, struct attr **in) { char p,*ret=g_strdup(pattern),*r=ret,*a; int len; while ((p=*pattern++)) { switch (p) { case '*': *r='\0'; a=attr_to_text(*in++,NULL,0); len=strlen(ret)+strlen(a)+strlen(pattern)+1; r=g_malloc(len); strcpy(r, ret); strcat(r, a); g_free(ret); g_free(a); ret=r; r=ret+strlen(ret); break; case '\\': p=*pattern++; default: *r++=p; } } *r++='\0'; return ret; } static int gui_internal_match(const char *pattern, const char *string) { char p,s; while ((p=*pattern++)) { switch (p) { case '*': while ((s=*string)) { if (gui_internal_match(pattern,string)) return 1; string++; } break; case '\\': p=*pattern++; default: if (*string++ != p) return 0; } } return 1; } int gui_internal_set(char *remove, char *add) { char *gui_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal.txt", NULL); char *gui_file_new=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal_new.txt", NULL); FILE *fo=fopen(gui_file_new,"w"); FILE *fi=fopen(gui_file,"r"); char *line=NULL; int ret; size_t size=0; if (fi != NULL){ while (getline(&line,&size,fi) > 0) { int len=strlen(line); if (len > 0 && line[len-1] == '\n') line[len-1]='\0'; dbg(lvl_debug,"line=%s\n",line); if (!gui_internal_match(remove, line)) fprintf(fo,"%s\n",line); } if (line) free(line); fclose(fi); } if (add) fprintf(fo,"%s;\n",add); fclose(fo); unlink(gui_file); ret=(rename(gui_file_new, gui_file)==0); g_free(gui_file_new); g_free(gui_file); return ret; } static void gui_internal_window_closed(struct gui_priv *this) { gui_internal_cmd2_quit(this, NULL, NULL, NULL, NULL); } static void gui_internal_cmd_map_download_do(struct gui_priv *this, struct widget *wm, void *data) { char *text=g_strdup_printf(_("Download %s"),wm->name); struct widget *w, *wb; struct map *map=data; double bllon,bllat,trlon,trlat; wb=gui_internal_menu(this, text); g_free(text); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if (sscanf(wm->prefix,"%lf,%lf,%lf,%lf",&bllon,&bllat,&trlon,&trlat) == 4) { struct coord_geo g; struct map_selection sel; struct map_rect *mr; struct item *item; sel.next=NULL; sel.order=255; g.lng=bllon; g.lat=trlat; transform_from_geo(projection_mg, &g, &sel.u.c_rect.lu); g.lng=trlon; g.lat=bllat; transform_from_geo(projection_mg, &g, &sel.u.c_rect.rl); sel.range.min=type_none; sel.range.max=type_last; mr=map_rect_new(map, &sel); while ((item=map_rect_get_item(mr))) { dbg(lvl_info,"item\n"); } map_rect_destroy(mr); } dbg(lvl_info,"bbox=%s\n",wm->prefix); gui_internal_menu_render(this); } void gui_internal_cmd_map_download(struct gui_priv *this, struct widget *wm, void *data) { struct attr on, off, download_enabled, download_disabled; struct widget *w,*wb,*wma; struct map *map=data; FILE *f; char *search,buffer[256]; int found,sp_match=0; dbg(lvl_debug,"wm=%p prefix=%s\n",wm,wm->prefix); search=wm->prefix; if (search) { found=0; while(search[sp_match] == ' ') sp_match++; sp_match++; } else { found=1; } on.type=off.type=attr_active; on.u.num=1; off.u.num=0; wb=gui_internal_menu(this, wm->name?wm->name:_("Map Download")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if (!search) { wma=gui_internal_button_map_attr_new(this, _("Active"), gravity_left_center|orientation_horizontal|flags_fill, map, &on, &off, 1); gui_internal_widget_append(w, wma); } download_enabled.type=download_disabled.type=attr_update; download_enabled.u.num=1; download_disabled.u.num=0; wma=gui_internal_button_map_attr_new(this , _("Download Enabled") , gravity_left_center|orientation_horizontal|flags_fill , map , &download_enabled , &download_disabled , 0); gui_internal_widget_append(w, wma); f=fopen("maps/areas.tsv","r"); while (f && fgets(buffer, sizeof(buffer), f)) { char *nl,*description,*description_size,*bbox,*size=NULL; int sp=0; if ((nl=strchr(buffer,'\n'))) *nl='\0'; if ((nl=strchr(buffer,'\r'))) *nl='\0'; while(buffer[sp] == ' ') sp++; if ((bbox=strchr(buffer,'\t'))) *bbox++='\0'; if (bbox && (size=strchr(bbox,'\t'))) *size++='\0'; if (search && !strcmp(buffer, search)) { wma=gui_internal_button_new_with_callback(this, _("Download completely"), NULL, gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download_do, map); wma->name=g_strdup(buffer+sp); wma->prefix=g_strdup(bbox); gui_internal_widget_append(w, wma); found=1; } else if (sp < sp_match) found=0; if (sp == sp_match && found && buffer[sp]) { description=g_strdup(buffer+sp); if (size) description_size=g_strdup_printf("%s (%s)",description,size); else description_size=g_strdup(description); wma=gui_internal_button_new_with_callback(this, description_size, NULL, gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download, map); g_free(description_size); wma->prefix=g_strdup(buffer); wma->name=description; gui_internal_widget_append(w, wma); } } gui_internal_menu_render(this); } static void gui_internal_cmd_set_active_vehicle(struct gui_priv *this, struct widget *wm, void *data) { struct attr vehicle = {attr_vehicle,{wm->data}}; navit_set_attr(this->nav, &vehicle); } static void gui_internal_cmd_show_satellite_status(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*row; struct attr attr,sat_attr; struct vehicle *v=wm->data; char *str; int i; enum attr_type types[]={attr_sat_prn, attr_sat_elevation, attr_sat_azimuth, attr_sat_snr}; wb=gui_internal_menu(this, _("Show Satellite Status")); gui_internal_menu_data(this)->redisplay=gui_internal_cmd_show_satellite_status; gui_internal_menu_data(this)->redisplay_widget=wm; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); w = gui_internal_widget_table_new(this,gravity_center | orientation_vertical | flags_expand | flags_fill, 0); row = gui_internal_widget_table_row_new(this,gravity_left_top); gui_internal_widget_append(row, gui_internal_label_new(this, " PRN ")); gui_internal_widget_append(row, gui_internal_label_new(this, _(" Elevation "))); gui_internal_widget_append(row, gui_internal_label_new(this, _(" Azimuth "))); gui_internal_widget_append(row, gui_internal_label_new(this, " SNR ")); gui_internal_widget_append(w,row); while (vehicle_get_attr(v, attr_position_sat_item, &attr, NULL)) { row = gui_internal_widget_table_row_new(this,gravity_left_top); for (i = 0 ; i < sizeof(types)/sizeof(enum attr_type) ; i++) { if (item_attr_get(attr.u.item, types[i], &sat_attr)) str=g_strdup_printf("%ld", sat_attr.u.num); else str=g_strdup(""); gui_internal_widget_append(row, gui_internal_label_new(this, str)); g_free(str); } gui_internal_widget_append(w,row); } gui_internal_widget_append(wb, w); gui_internal_menu_render(this); } static void gui_internal_cmd_show_nmea_data(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb; struct attr attr; struct vehicle *v=wm->data; wb=gui_internal_menu(this, _("Show NMEA Data")); gui_internal_menu_data(this)->redisplay=gui_internal_cmd_show_nmea_data; gui_internal_menu_data(this)->redisplay_widget=wm; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); if (vehicle_get_attr(v, attr_position_nmea, &attr, NULL)) gui_internal_widget_append(w, gui_internal_text_new(this, attr.u.str, gravity_left_center|orientation_vertical)); gui_internal_menu_render(this); } /** * A container to hold the selected vehicle and the desired profile in * one data item. */ struct vehicle_and_profilename { struct vehicle *vehicle; char *profilename; }; /** * Figures out whether the given vehicle is the active vehicle. * * @return true if the vehicle is active, false otherwise. */ static int gui_internal_is_active_vehicle(struct gui_priv *this, struct vehicle *vehicle) { struct attr active_vehicle; if (!navit_get_attr(this->nav, attr_vehicle, &active_vehicle, NULL)) active_vehicle.u.vehicle=NULL; return active_vehicle.u.vehicle == vehicle; } static void save_vehicle_xml(struct vehicle *v) { struct attr attr; struct attr_iter *iter=vehicle_attr_iter_new(); int childs=0; printf("\n"); printf("\n"); } else printf(" />\n"); vehicle_attr_iter_destroy(iter); } /** * Reacts to a button press that changes a vehicle's active profile. * * @see gui_internal_add_vehicle_profile */ static void gui_internal_cmd_set_active_profile(struct gui_priv *this, struct widget *wm, void *data) { struct vehicle_and_profilename *vapn = data; struct vehicle *v = vapn->vehicle; char *profilename = vapn->profilename; struct attr vehicle_name_attr; char *vehicle_name = NULL; struct attr profilename_attr; // Get the vehicle name vehicle_get_attr(v, attr_name, &vehicle_name_attr, NULL); vehicle_name = vehicle_name_attr.u.str; dbg(lvl_debug, "Changing vehicle %s to profile %s\n", vehicle_name, profilename); // Change the profile name profilename_attr.type = attr_profilename; profilename_attr.u.str = profilename; if(!vehicle_set_attr(v, &profilename_attr)) { dbg(lvl_error, "Unable to set the vehicle's profile name\n"); } // Notify Navit that the routing should be re-done if this is the // active vehicle. if (gui_internal_is_active_vehicle(this, v)) { struct attr vehicle; vehicle.type=attr_vehicle; vehicle.u.vehicle=v; navit_set_attr(this->nav, &vehicle); } save_vehicle_xml(v); gui_internal_prune_menu_count(this, 1, 0); gui_internal_menu_vehicle_settings(this, v, vehicle_name); } /** * Adds the vehicle profile to the GUI, allowing the user to pick a * profile for the currently selected vehicle. */ static void gui_internal_add_vehicle_profile(struct gui_priv *this, struct widget *parent, struct vehicle *v, struct vehicleprofile *profile) { // Just here to show up in the translation file, nice and close to // where the translations are actually used. struct attr profile_attr; struct attr *attr = NULL; char *name = NULL; char *active_profile = NULL; char *label = NULL; int active; struct vehicle_and_profilename *context = NULL; #ifdef ONLY_FOR_TRANSLATION char *translations[] = {_n("car"), _n("bike"), _n("pedestrian")}; #endif // Figure out the profile name attr = attr_search(profile->attrs, NULL, attr_name); if (!attr) { dbg(lvl_error, "Adding vehicle profile failed. attr==NULL"); return; } name = attr->u.str; // Determine whether the profile is the active one if (vehicle_get_attr(v, attr_profilename, &profile_attr, NULL)) active_profile = profile_attr.u.str; active = active_profile != NULL && !strcmp(name, active_profile); dbg(lvl_debug, "Adding vehicle profile %s, active=%s/%i\n", name, active_profile, active); // Build a translatable label. if(active) { label = g_strdup_printf(_("Current profile: %s"), _(name)); } else { label = g_strdup_printf(_("Change profile to: %s"), _(name)); } // Create the context object (the vehicle and the desired profile) context = g_new0(struct vehicle_and_profilename, 1); context->vehicle = v; context->profilename = name; // Add the button gui_internal_widget_append(parent, gui_internal_button_new_with_callback( this, label, image_new_xs(this, active ? "gui_active" : "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_active_profile, context)); free(label); } void gui_internal_menu_vehicle_settings(struct gui_priv *this, struct vehicle *v, char *name) { struct widget *w,*wb,*row; struct attr attr; struct vehicleprofile *profile = NULL; GList *profiles; wb=gui_internal_menu(this, name); w=gui_internal_widget_table_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill,1); gui_internal_widget_append(wb, w); // Add the "Set as active" button if this isn't the active // vehicle. if (!gui_internal_is_active_vehicle(this, v)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new_with_callback(this, _("Set as active"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_active_vehicle, v)); } if (vehicle_get_attr(v, attr_position_sat_item, &attr, NULL)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new_with_callback(this, _("Show Satellite status"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_show_satellite_status, v)); } if (vehicle_get_attr(v, attr_position_nmea, &attr, NULL)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, gui_internal_button_new_with_callback(this, _("Show NMEA data"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_show_nmea_data, v)); } // Add all the possible vehicle profiles to the menu profiles = navit_get_vehicleprofiles(this->nav); while(profiles) { profile = (struct vehicleprofile *)profiles->data; gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_add_vehicle_profile(this, row, v, profile); profiles = g_list_next(profiles); } callback_list_call_attr_2(this->cbl, attr_vehicle, w, v); gui_internal_menu_render(this); } void gui_internal_cmd_vehicle_settings(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_menu_vehicle_settings(this, wm->data, wm->text); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_motion(void *data, struct point *p) { struct gui_priv *this=data; if (!this->root.children) { navit_handle_motion(this->nav, p); return; } if (!this->pressed) return; this->current=*p; if(!this->motion_timeout_callback) this->motion_timeout_callback=callback_new_1(callback_cast(gui_internal_motion_cb), this); if(!this->motion_timeout_event) this->motion_timeout_event=event_add_timeout(30,0, this->motion_timeout_callback); } void gui_internal_evaluate(struct gui_priv *this, const char *command) { if (command) command_evaluate(&this->self, command); } void gui_internal_enter(struct gui_priv *this, int ignore) { struct graphics *gra=this->gra; if (ignore != -1) this->ignore_button=ignore; navit_block(this->nav, 1); graphics_overlay_disable(gra, 1); this->root.p.x=0; this->root.p.y=0; this->root.background=this->background; } void gui_internal_leave(struct gui_priv *this) { graphics_draw_mode(this->gra, draw_mode_end); } void gui_internal_set_click_coord(struct gui_priv *this, struct point *p) { struct coord c; struct coord_geo g; struct attr attr; struct transformation *trans; attr_free(this->click_coord_geo); this->click_coord_geo=NULL; if (p) { trans=navit_get_trans(this->nav); transform_reverse(trans, p, &c); dbg(lvl_debug,"x=0x%x y=0x%x\n", c.x, c.y); this->clickp.pro=transform_get_projection(trans); this->clickp.x=c.x; this->clickp.y=c.y; transform_to_geo(this->clickp.pro, &c, &g); attr.u.coord_geo=&g; attr.type=attr_click_coord_geo; this->click_coord_geo=attr_dup(&attr); } } static void gui_internal_set_position_coord(struct gui_priv *this) { struct transformation *trans; struct attr attr,attrp; struct coord c; attr_free(this->position_coord_geo); this->position_coord_geo=NULL; if (navit_get_attr(this->nav, attr_vehicle, &attr, NULL) && attr.u.vehicle && vehicle_get_attr(attr.u.vehicle, attr_position_coord_geo, &attrp, NULL)) { trans=navit_get_trans(this->nav); this->position_coord_geo=attr_dup(&attrp); this->vehiclep.pro=transform_get_projection(trans); transform_from_geo(this->vehiclep.pro, attrp.u.coord_geo, &c); this->vehiclep.x=c.x; this->vehiclep.y=c.y; } } void gui_internal_enter_setup(struct gui_priv *this) { if (!this->mouse_button_clicked_on_map) gui_internal_set_position_coord(this); } void gui_internal_cmd_menu(struct gui_priv *this, int ignore, char *href) { dbg(lvl_debug,"enter\n"); gui_internal_enter(this, ignore); gui_internal_enter_setup(this); // draw menu if (href) gui_internal_html_load_href(this, href, 0); else gui_internal_html_main_menu(this); } static void gui_internal_cmd_log_do(struct gui_priv *this, struct widget *widget) { if (widget->text && strlen(widget->text)) { if (this->position_coord_geo) navit_textfile_debug_log_at(this->nav, &this->vehiclep, "type=log_entry label=\"%s\"",widget->text); else navit_textfile_debug_log(this->nav, "type=log_entry label=\"%s\"",widget->text); } g_free(widget->text); widget->text=NULL; gui_internal_prune_menu(this, NULL); gui_internal_check_exit(this); } void gui_internal_cmd_log_clicked(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_cmd_log_do(this, widget->data); } void gui_internal_check_exit(struct gui_priv *this) { struct graphics *gra=this->gra; if (! this->root.children) { gui_internal_search_idle_end(this); gui_internal_search_list_destroy(this); graphics_overlay_disable(gra, 0); if (!navit_block(this->nav, 0)) { if (this->redraw) navit_draw(this->nav); else navit_draw_displaylist(this->nav); } } } static int gui_internal_get_attr(struct gui_priv *this, enum attr_type type, struct attr *attr) { switch (type) { case attr_active: attr->u.num=this->root.children != NULL; break; case attr_click_coord_geo: if (!this->click_coord_geo) return 0; *attr=*this->click_coord_geo; break; case attr_position_coord_geo: if (!this->position_coord_geo) return 0; *attr=*this->position_coord_geo; break; case attr_pitch: attr->u.num=this->pitch; break; case attr_button: attr->u.num=this->mouse_button_clicked_on_map; break; case attr_navit: attr->u.navit=this->nav; break; case attr_fullscreen: attr->u.num=(this->fullscreen > 0); break; default: return 0; } attr->type=type; return 1; } static int gui_internal_add_attr(struct gui_priv *this, struct attr *attr) { switch (attr->type) { case attr_xml_text: g_free(this->html_text); this->html_text=g_strdup(attr->u.str); return 1; default: return 0; } } static int gui_internal_set_attr(struct gui_priv *this, struct attr *attr) { switch (attr->type) { case attr_fullscreen: if ((this->fullscreen > 0) != (attr->u.num > 0)) { graphics_draw_mode(this->gra, draw_mode_end); this->win->fullscreen(this->win, attr->u.num > 0); graphics_draw_mode(this->gra, draw_mode_begin); } this->fullscreen=attr->u.num; return 1; case attr_menu_on_map_click: this->menu_on_map_click=attr->u.num; return 1; case attr_on_map_click: g_free(this->on_map_click); this->on_map_click=g_strdup(attr->u.str); return 1; default: dbg(lvl_error,"Unknown attribute: %s\n",attr_to_name(attr->type)); return 1; } } static void gui_internal_dbus_signal(struct gui_priv *this, struct point *p) { struct displaylist_handle *dlh; struct displaylist *display; struct displayitem *di; struct attr cb,**attr_list=NULL; int valid=0; display=navit_get_displaylist(this->nav); dlh=graphics_displaylist_open(display); while ((di=graphics_displaylist_next(dlh))) { struct item *item=graphics_displayitem_get_item(di); if (item_is_point(*item) && graphics_displayitem_get_displayed(di) && graphics_displayitem_within_dist(display, di, p, this->radius)) { struct map_rect *mr=map_rect_new(item->map, NULL); struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); struct attr attr; if (itemo && item_attr_get(itemo, attr_data, &attr)) attr_list=attr_generic_add_attr(attr_list, &attr); map_rect_destroy(mr); } } graphics_displaylist_close(dlh); if (attr_list && navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); attr_list_free(attr_list); } /** * @brief Converts one geo coordinate in human readable form to double value. * * @author Martin Bruns (05/2012), mdankov */ static int gui_internal_coordinate_parse(char *s, char plus, char minus, double *x) { int sign=0; char *degree, *minute, *second; double tmp; if(!s) return 0; if (strchr(s, minus)!=NULL) sign=-1; else if (strchr(s, plus)!=NULL) sign=1; if(!sign) return 0; /* Can't just use strtok here because ° is multibyte sequence in utf8 */ degree=s; minute=strstr(s,"°"); if(minute) { *minute=0; minute+=strlen("°"); } sscanf(degree, "%lf", x); if(strchr(degree, plus) || strchr(degree, minus)) { dbg(lvl_debug,"degree %c/%c found\n",plus,minus); } else {/* DEGREES_MINUTES */ if(!minute) return 0; minute = strtok(minute,"'"); sscanf(minute, "%lf", &tmp); *x+=tmp/60; if(strchr(minute, plus) || strchr(minute, minus)) { dbg(lvl_debug,"minute %c/%c found\n",plus,minus); } else { /* DEGREES_MINUTES_SECONDS */ second=strtok(NULL,""); if(!second) return 0; sscanf(second, "%lf", &tmp); *x+=tmp/3600; } } *x *= sign; return 1; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Bruns (05/2012) //############################################################################################################## static void gui_internal_cmd_enter_coord_do(struct gui_priv *this, struct widget *widget) { char *lat, *lng; char *widgettext; double latitude, longitude; dbg(lvl_debug,"text entered:%s\n", widget->text); /* possible entry can be identical to coord_format output but only space between lat and lng is allowed */ widgettext=g_ascii_strup(widget->text,-1); lat=strtok(widgettext," "); lng=strtok(NULL,""); if(!lat || !lng){ g_free(widgettext); return; } if( gui_internal_coordinate_parse(lat, 'N', 'S', &latitude) && gui_internal_coordinate_parse(lng, 'E', 'W', &longitude) ) { g_free(widgettext); widgettext=g_strdup_printf("%lf %lf", longitude, latitude); pcoord_parse(widgettext, projection_mg, &widget->c ); } else if(!pcoord_parse(widget->text, projection_mg, &widget->c )) { g_free(widgettext); return; } g_free(widgettext); gui_internal_cmd_position(this, widget, (void*)8); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Bruns (05/2012) //############################################################################################################## void gui_internal_cmd_enter_coord_clicked(struct gui_priv *this, struct widget *widget, void *data) { dbg(lvl_debug,"entered\n"); gui_internal_cmd_enter_coord_do(this, widget->data); } /** * @brief Handles mouse clicks and scroll wheel movement * * @author Martin Schaller (04/2008), Stefan Klumpp (04/2008) */ static void gui_internal_button(void *data, int pressed, int button, struct point *p) { struct gui_priv *this=data; struct graphics *gra=this->gra; dbg(lvl_debug,"enter %d %d\n", pressed, button); // if still on the map (not in the menu, yet): dbg(lvl_debug,"children=%p ignore_button=%d\n",this->root.children,this->ignore_button); if (!this->root.children || this->ignore_button) { this->ignore_button=0; // check whether the position of the mouse changed during press/release OR if it is the scrollwheel if (!navit_handle_button(this->nav, pressed, button, p, NULL)) { dbg(lvl_debug,"navit has handled button\n"); return; } dbg(lvl_debug,"menu_on_map_click=%d\n",this->menu_on_map_click); if (button != 1) return; if (this->on_map_click || this->menu_on_map_click) { this->mouse_button_clicked_on_map=1; gui_internal_set_click_coord(this, p); gui_internal_set_position_coord(this); if (this->on_map_click) command_evaluate(&this->self, this->on_map_click); else gui_internal_cmd_menu(this, 0, NULL); this->mouse_button_clicked_on_map=0; } else if (this->signal_on_map_click) { gui_internal_dbus_signal(this, p); return; } return; } /* * If already in the menu: */ if (pressed) { this->pressed=1; this->current=*p; gui_internal_gesture_ring_clear(this); gui_internal_gesture_ring_add(this, p); gui_internal_highlight(this); } else { int dx,dy; gui_internal_gesture_ring_add(this, p); gui_internal_gesture_get_vector(this, 300, NULL, &dx, &dy); this->current.x=-1; this->current.y=-1; graphics_draw_mode(gra, draw_mode_begin); if(!gui_internal_gesture_do(this) && this->pressed!=2 && abs(dx)icon_s && abs(dy)icon_s) gui_internal_call_highlighted(this); this->pressed=0; if (!event_main_loop_has_quit()) { gui_internal_highlight(this); graphics_draw_mode(gra, draw_mode_end); gui_internal_check_exit(this); } } } static void gui_internal_setup(struct gui_priv *this) { struct color cbh={0x9fff,0x9fff,0x9fff,0xffff}; struct color cf={0xbfff,0xbfff,0xbfff,0xffff}; struct graphics *gra=this->gra; unsigned char *buffer; char *gui_file; int size; if (this->background) return; this->background=graphics_gc_new(gra); this->background2=graphics_gc_new(gra); this->highlight_background=graphics_gc_new(gra); graphics_gc_set_foreground(this->highlight_background, &cbh); this->foreground=graphics_gc_new(gra); graphics_gc_set_foreground(this->foreground, &cf); this->text_background=graphics_gc_new(gra); this->text_foreground=graphics_gc_new(gra); graphics_gc_set_foreground(this->background, &this->background_color); graphics_gc_set_foreground(this->background2, &this->background2_color); graphics_gc_set_foreground(this->text_background, &this->text_background_color); graphics_gc_set_foreground(this->text_foreground, &this->text_foreground_color); gui_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal.txt", NULL); if (file_get_contents(gui_file,&buffer,&size)) { char *command=g_malloc(size+1); strncpy(command,(const char *)buffer,size); command[size]=0; command_evaluate(&this->self, command); g_free(command); g_free(buffer); } g_free(gui_file); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_resize(void *data, int w, int h) { struct gui_priv *this=data; int changed=0; gui_internal_setup(this); if (this->root.w != w || this->root.h != h) { this->root.w=w; this->root.h=h; changed=1; } dbg(lvl_debug,"w=%d h=%d children=%p\n", w, h, this->root.children); navit_handle_resize(this->nav, w, h); if (this->root.children) { if (changed) { gui_internal_html_main_menu(this); } else { gui_internal_menu_render(this); } } } static void gui_internal_keynav_point(struct widget *w, int dx, int dy, struct point *p) { p->x=w->p.x+w->w/2; p->y=w->p.y+w->h/2; if (dx < 0) p->x=w->p.x; if (dx > 0) p->x=w->p.x+w->w; if (dy < 0) p->y=w->p.y; if (dy > 0) p->y=w->p.y+w->h; } static struct widget* gui_internal_keynav_find_next_sensitive_child(struct widget *wi) { GList *l=wi->children; if (wi && wi->state & STATE_SENSITIVE) return wi; while (l) { struct widget* tmp = gui_internal_keynav_find_next_sensitive_child(l->data); if (tmp) return tmp; l=g_list_next(l); } return NULL; } static int gui_internal_keynav_find_next(struct widget *wi, struct widget *current_highlight, struct widget **result) { GList *l=wi->children; if (wi == current_highlight) return 1; while (l) { struct widget *child=l->data; l=g_list_next(l); if (gui_internal_keynav_find_next(child, current_highlight, result)) { while (l) { struct widget *new = gui_internal_keynav_find_next_sensitive_child(l->data); if (new) { *result = new; /* Found one! */ return 0; } l=g_list_next(l); } /* Try parent */ return 1; } } return 0; } #define RESULT_FOUND 1 #define NO_RESULT_YET 0 static int gui_internal_keynav_find_prev(struct widget *wi, struct widget *current_highlight, struct widget **result) { if (wi == current_highlight && *result) { // Reached current widget; last widget found is the result. return RESULT_FOUND; } if (wi->state & STATE_SENSITIVE) *result= wi; GList *l=wi->children; while (l) { struct widget *child=l->data; if (gui_internal_keynav_find_prev(child, current_highlight, result) == RESULT_FOUND) { return RESULT_FOUND; } l=g_list_next(l); } // If no sensitive widget is found before "current_highlight", return the last sensitive widget when // recursion terminates. return NO_RESULT_YET; } static void gui_internal_keynav_find_closest(struct widget *wi, struct point *p, int dx, int dy, int *distance, struct widget **result) { GList *l=wi->children; // Skip hidden elements if (wi->p.x==0 && wi->p.y==0 && wi->w==0 && wi->h==0) return; if ((wi->state & STATE_SENSITIVE) ) { int dist1,dist2; struct point wp; gui_internal_keynav_point(wi, -dx, -dy, &wp); if (dx) { dist1=(wp.x-p->x)*dx; dist2=wp.y-p->y; } else if (dy) { dist1=(wp.y-p->y)*dy; dist2=wp.x-p->x; } else { dist2=wp.x-p->x; dist1=wp.y-p->y; if (dist1 < 0) dist1=-dist1; } dbg(lvl_debug,"checking %d,%d %d %d against %d,%d-%d,%d result %d,%d\n", p->x, p->y, dx, dy, wi->p.x, wi->p.y, wi->p.x+wi->w, wi->p.y+wi->h, dist1, dist2); if (dist1 >= 0) { if (dist2 < 0) dist1-=dist2; else dist1+=dist2; if (dist1 < *distance) { *result=wi; *distance=dist1; } } } while (l) { struct widget *child=l->data; gui_internal_keynav_find_closest(child, p, dx, dy, distance, result); l=g_list_next(l); } } /** * @brief Move keyboard focus to the next widget. * * Move keyboard focus to the appropriate next widget, depending on the direction of focus * movement. * * @param this GUI context * @param this dx horizontal movement (-1=left, +1=right), unless rotary==1 * @param this dy vertical movement (+1=up, -1=down) * @param rotary (0/1) input from rotary encoder - dx indicates forwards/backwards movement * through all widgets */ static void gui_internal_keynav_highlight_next(struct gui_priv *this, int dx, int dy, int rotary) { struct widget *result,*menu=g_list_last(this->root.children)->data; struct widget *current_highlight = NULL; struct point p; int distance; if (this->highlighted && this->highlighted_menu == menu) { gui_internal_keynav_point(this->highlighted, dx, dy, &p); current_highlight = this->highlighted; } else { p.x=0; p.y=0; distance=INT_MAX; result=NULL; gui_internal_keynav_find_closest(menu, &p, 0, 0, &distance, &result); if (result) { gui_internal_keynav_point(result, dx, dy, &p); dbg(lvl_debug,"result origin=%p p=%d,%d\n", result, p.x, p.y); current_highlight = result; } } result=NULL; distance=INT_MAX; if (rotary && dx > 0) gui_internal_keynav_find_next(menu, current_highlight, &result); else if (rotary && dx < 0) gui_internal_keynav_find_prev(menu, current_highlight, &result); else gui_internal_keynav_find_closest(menu, &p, dx, dy, &distance, &result); dbg(lvl_debug,"result=%p\n", result); if (! result) { if (dx < 0) { p.x=this->root.w; if (rotary) p.y = this->root.h; } if (dx > 0) { p.x=0; if (rotary) p.y = 0; } if (dy < 0) p.y=this->root.h; if (dy > 0) p.y=0; result=NULL; distance=INT_MAX; gui_internal_keynav_find_closest(menu, &p, dx, dy, &distance, &result); dbg(lvl_debug,"wraparound result=%p\n", result); } gui_internal_highlight_do(this, result); if (result) gui_internal_say(this, result, 1); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static void gui_internal_keypress(void *data, char *key) { struct gui_priv *this=data; int w,h; struct point p; if (!this->root.children) { transform_get_size(navit_get_trans(this->nav), &w, &h); switch (*key) { case NAVIT_KEY_UP: p.x=w/2; p.y=0; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_DOWN: p.x=w/2; p.y=h; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_LEFT: p.x=0; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_RIGHT: p.x=w; p.y=h/2; navit_set_center_screen(this->nav, &p, 1); break; case NAVIT_KEY_ZOOM_IN: navit_zoom_in(this->nav, 2, NULL); break; case NAVIT_KEY_ZOOM_OUT: navit_zoom_out(this->nav, 2, NULL); break; case NAVIT_KEY_RETURN: case NAVIT_KEY_MENU: gui_internal_set_click_coord(this, NULL); gui_internal_cmd_menu(this, 0, NULL); break; } return; } graphics_draw_mode(this->gra, draw_mode_begin); switch (*key) { case NAVIT_KEY_PAGE_DOWN: gui_internal_keynav_highlight_next(this,1,0,1); break; case NAVIT_KEY_PAGE_UP: gui_internal_keynav_highlight_next(this,-1,0,1); break; case NAVIT_KEY_LEFT: gui_internal_keynav_highlight_next(this,-1,0,0); break; case NAVIT_KEY_RIGHT: gui_internal_keynav_highlight_next(this,1,0,0); break; case NAVIT_KEY_UP: gui_internal_keynav_highlight_next(this,0,-1,0); break; case NAVIT_KEY_DOWN: gui_internal_keynav_highlight_next(this,0,1,0); break; case NAVIT_KEY_BACK: if (g_list_length(this->root.children) > 1) gui_internal_back(this, NULL, NULL); else gui_internal_prune_menu(this, NULL); break; case NAVIT_KEY_RETURN: if (this->highlighted && this->highlighted_menu == g_list_last(this->root.children)->data) gui_internal_call_highlighted(this); else gui_internal_keypress_do(this, key); break; default: gui_internal_keypress_do(this, key); } if (!event_main_loop_has_quit()) { graphics_draw_mode(this->gra, draw_mode_end); gui_internal_check_exit(this); } } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static int gui_internal_set_graphics(struct gui_priv *this, struct graphics *gra) { struct window *win; struct transformation *trans=navit_get_trans(this->nav); win=graphics_get_data(gra, "window"); if (! win) { dbg(lvl_error, "failed to obtain window from graphics plugin, cannot set graphics\n"); return 1; } navit_ignore_graphics_events(this->nav, 1); this->gra=gra; this->win=win; navit_ignore_graphics_events(this->nav, 1); transform_get_size(trans, &this->root.w, &this->root.h); this->resize_cb=callback_new_attr_1(callback_cast(gui_internal_resize), attr_resize, this); graphics_add_callback(gra, this->resize_cb); this->button_cb=callback_new_attr_1(callback_cast(gui_internal_button), attr_button, this); graphics_add_callback(gra, this->button_cb); this->motion_cb=callback_new_attr_1(callback_cast(gui_internal_motion), attr_motion, this); graphics_add_callback(gra, this->motion_cb); this->keypress_cb=callback_new_attr_1(callback_cast(gui_internal_keypress), attr_keypress, this); graphics_add_callback(gra, this->keypress_cb); this->window_closed_cb=callback_new_attr_1(callback_cast(gui_internal_window_closed), attr_window_closed, this); graphics_add_callback(gra, this->window_closed_cb); // set fullscreen if needed if (this->fullscreen) this->win->fullscreen(this->win, this->fullscreen != 0); /* Was resize callback already issued? */ if (navit_get_ready(this->nav) & 2) gui_internal_setup(this); return 0; } static void gui_internal_disable_suspend(struct gui_priv *this) { if (this->win->disable_suspend) this->win->disable_suspend(this->win); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct gui_methods gui_internal_methods = { NULL, NULL, gui_internal_set_graphics, NULL, NULL, NULL, gui_internal_disable_suspend, gui_internal_get_attr, gui_internal_add_attr, gui_internal_set_attr, }; static void gui_internal_add_callback(struct gui_priv *priv, struct callback *cb) { callback_list_add(priv->cbl, cb); } static void gui_internal_remove_callback(struct gui_priv *priv, struct callback *cb) { callback_list_remove(priv->cbl, cb); } static struct gui_internal_methods gui_internal_methods_ext = { gui_internal_add_callback, gui_internal_remove_callback, gui_internal_menu_render, image_new_xs, image_new_l, }; static enum flags gui_internal_get_flags(struct widget *widget) { return widget->flags; } static void gui_internal_set_flags(struct widget *widget, enum flags flags) { widget->flags=flags; } static int gui_internal_get_state(struct widget *widget) { return widget->state; } static void gui_internal_set_state(struct widget *widget, int state) { widget->state=state; } static void gui_internal_set_func(struct widget *widget, void (*func)(struct gui_priv *priv, struct widget *widget, void *data)) { widget->func=func; } static void gui_internal_set_data(struct widget *widget, void *data) { widget->data=data; } static void gui_internal_set_default_background(struct gui_priv *this, struct widget *widget) { widget->background=this->background; } static struct gui_internal_widget_methods gui_internal_widget_methods = { gui_internal_widget_append, gui_internal_button_new, gui_internal_button_new_with_callback, gui_internal_box_new, gui_internal_label_new, gui_internal_image_new, gui_internal_keyboard, gui_internal_menu, gui_internal_get_flags, gui_internal_set_flags, gui_internal_get_state, gui_internal_set_state, gui_internal_set_func, gui_internal_set_data, gui_internal_set_default_background, }; /* * @brief Displays Route information */ /* FIXME where is the implementation? */ int line_intersection(struct coord* a1, struct coord *a2, struct coord * b1, struct coord *b2, struct coord *res) { int n, a, b; int adx=a2->x-a1->x; int ady=a2->y-a1->y; int bdx=b2->x-b1->x; int bdy=b2->y-b1->y; n = bdy * adx - bdx * ady; a = bdx * (a1->y - b1->y) - bdy * (a1->x - b1->x); b = adx * (a1->y - b1->y) - ady * (a1->x - b1->x); if (n < 0) { n = -n; a = -a; b = -b; } if (a < 0 || b < 0) return 0; if (a > n || b > n) return 0; if (n == 0) { dbg(lvl_info,"a=%d b=%d n=%d\n", a, b, n); dbg(lvl_info,"a1=0x%x,0x%x ad %d,%d\n", a1->x, a1->y, adx, ady); dbg(lvl_info,"b1=0x%x,0x%x bd %d,%d\n", b1->x, b1->y, bdx, bdy); dbg_assert(n != 0); } res->x = a1->x + a * adx / n; res->y = a1->y + a * ady / n; return 1; } struct heightline * item_get_heightline(struct item *item) { struct heightline *ret=NULL; struct street_data *sd; struct attr attr; int i,height; if (item_attr_get(item, attr_label, &attr)) { height=atoi(attr.u.str); sd=street_get_data(item); if (sd && sd->count > 1) { ret=g_malloc(sizeof(struct heightline)+sd->count*sizeof(struct coord)); ret->bbox.lu=sd->c[0]; ret->bbox.rl=sd->c[0]; ret->count=sd->count; ret->height=height; for (i = 0 ; i < sd->count ; i++) { ret->c[i]=sd->c[i]; coord_rect_extend(&ret->bbox, sd->c+i); } } street_data_free(sd); } return ret; } /* * @brief Displays Route Height Profile * * @li The name of the active vehicle * @param wm The button that was pressed. * @param v Unused */ /* FIXME where is the implementation? */ /** * @brief Called when the route is updated. */ void gui_internal_route_update(struct gui_priv * this, struct navit * navit, struct vehicle *v) { if(this->route_data.route_showing) { gui_internal_populate_route_table(this,navit); graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } } /** * @brief Called when the route screen is closed (deallocated). * * The main purpose of this function is to remove the widgets from * references route_data because those widgets are about to be freed. */ void gui_internal_route_screen_free(struct gui_priv * this_,struct widget * w) { if(this_) { this_->route_data.route_showing=0; this_->route_data.route_table=NULL; g_free(w); } } /** * @brief Populates the route table with route information * * @param this The gui context * @param navit The navit object */ void gui_internal_populate_route_table(struct gui_priv * this, struct navit * navit) { struct map * map=NULL; struct map_rect * mr=NULL; struct navigation * nav = NULL; struct item * item =NULL; struct attr attr,route; struct widget * label = NULL; struct widget * row = NULL; struct coord c; nav = navit_get_navigation(navit); if(!nav) { return; } map = navigation_get_map(nav); if(map) mr = map_rect_new(map,NULL); if(mr) { GList *toprow; struct item topitem={0}; toprow=gui_internal_widget_table_top_row(this, this->route_data.route_table); if(toprow && toprow->data) topitem=((struct widget*)toprow->data)->item; gui_internal_widget_table_clear(this,this->route_data.route_table); if (navit_get_attr(navit, attr_route, &route, NULL)) { struct attr destination_length, destination_time; char *length=NULL,*time=NULL,*length_time; if (route_get_attr(route.u.route, attr_destination_length, &destination_length, NULL)) length=attr_to_text_ext(&destination_length, NULL, attr_format_with_units, attr_format_default, NULL); if (route_get_attr(route.u.route, attr_destination_time, &destination_time, NULL)) time=attr_to_text_ext(&destination_time, NULL, attr_format_with_units, attr_format_default, NULL); row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); gui_internal_widget_append(this->route_data.route_table,row); length_time=g_strdup_printf("%s %s",length,time); label = gui_internal_label_new(this,length_time); g_free(length_time); g_free(length); g_free(time); gui_internal_widget_append(row,label); } while((item = map_rect_get_item(mr))) { if(item_attr_get(item,attr_navigation_long,&attr)) { row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); gui_internal_widget_append(this->route_data.route_table,row); label = gui_internal_label_new(this,map_convert_string_tmp(item->map,attr.u.str)); gui_internal_widget_append(row,label); label->item=*item; row->item=*item; item_coord_get(item, &c, 1); label->c.x=c.x; label->c.y=c.y; label->c.pro=map_projection(map); label->func=gui_internal_cmd_position; label->state|=STATE_SENSITIVE; label->data=(void*)2; if(toprow && item->id_hi==topitem.id_hi && item->id_lo==topitem.id_lo && item->map==topitem.map) gui_internal_widget_table_set_top_row(this, this->route_data.route_table, row); } } map_rect_destroy(mr); } } /* * Command interface wrapper for commands which can be used both from gui html and to enter internal gui (for example, from osd or dbus). * Set first command argument to integer 1, if this command was called by mouse click from oustside of gui (default). Set it to 0 * if command is called by some other means (dbus signal, for example). If first argument is non integer, it's passed on * to actual handler. * */ //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) { struct color color_white={0xffff,0xffff,0xffff,0xffff}; struct color color_black={0x0,0x0,0x0,0xffff}; struct color back2_color={0x4141,0x4141,0x4141,0xffff}; struct gui_priv *this; struct attr *attr; *meth=gui_internal_methods; this=g_new0(struct gui_priv, 1); this->nav=nav; this->self.type=attr_gui; this->self.u.gui=gui; if ((attr=attr_search(attrs, NULL, attr_menu_on_map_click))) this->menu_on_map_click=attr->u.num; else this->menu_on_map_click=1; if ((attr=attr_search(attrs, NULL, attr_on_map_click))) this->on_map_click=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_signal_on_map_click))) this->signal_on_map_click=attr->u.num; gui_internal_command_init(this, attrs); if( (attr=attr_search(attrs,NULL,attr_font_size))) { this->config.font_size=attr->u.num; } else { this->config.font_size=-1; } if( (attr=attr_search(attrs,NULL,attr_icon_xs))) { this->config.icon_xs=attr->u.num; } else { this->config.icon_xs=-1; } if( (attr=attr_search(attrs,NULL,attr_icon_l))) { this->config.icon_l=attr->u.num; } else { this->config.icon_l=-1; } if( (attr=attr_search(attrs,NULL,attr_icon_s))) { this->config.icon_s=attr->u.num; } else { this->config.icon_s=-1; } if( (attr=attr_search(attrs,NULL,attr_spacing))) { this->config.spacing=attr->u.num; } else { this->config.spacing=-1; } if( (attr=attr_search(attrs,NULL,attr_gui_speech))) { this->speech=attr->u.num; } if( (attr=attr_search(attrs,NULL,attr_keyboard))) this->keyboard=attr->u.num; else this->keyboard=1; if( (attr=attr_search(attrs,NULL,attr_fullscreen))) this->fullscreen=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_flags))) this->flags=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_background_color))) this->background_color=*attr->u.color; else this->background_color=color_black; if( (attr=attr_search(attrs,NULL,attr_background_color2))) this->background2_color=*attr->u.color; else this->background2_color=back2_color; if( (attr=attr_search(attrs,NULL,attr_text_color))) this->text_foreground_color=*attr->u.color; else this->text_foreground_color=color_white; if( (attr=attr_search(attrs,NULL,attr_text_background))) this->text_background_color=*attr->u.color; else this->text_background_color=color_black; if( (attr=attr_search(attrs,NULL,attr_columns))) this->cols=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_osd_configuration))) this->osd_configuration=*attr; if( (attr=attr_search(attrs,NULL,attr_pitch))) this->pitch=attr->u.num; else this->pitch=20; if( (attr=attr_search(attrs,NULL,attr_flags_town))) this->flags_town=attr->u.num; else this->flags_town=-1; if( (attr=attr_search(attrs,NULL,attr_flags_street))) this->flags_street=attr->u.num; else this->flags_street=-1; if( (attr=attr_search(attrs,NULL,attr_flags_house_number))) this->flags_house_number=attr->u.num; else this->flags_house_number=-1; if( (attr=attr_search(attrs,NULL,attr_radius))) this->radius=attr->u.num; else this->radius=10; if( (attr=attr_search(attrs,NULL,attr_font))) this->font_name=g_strdup(attr->u.str); this->data.priv=this; this->data.gui=&gui_internal_methods_ext; this->data.widget=&gui_internal_widget_methods; this->cbl=callback_list_new(); return this; } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## void plugin_init(void) { plugin_register_gui_type("internal", gui_internal_new); } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal.h000066400000000000000000000057051264204753600223050ustar00rootroot00000000000000struct widget; // defined in gui_internal.c struct graphics_image; struct gui_priv; #define STATE_VISIBLE 1 #define STATE_SELECTED 2 #define STATE_HIGHLIGHTED 4 #define STATE_SENSITIVE 8 #define STATE_EDIT 16 #define STATE_CLEAR 32 #define STATE_EDITABLE 64 #define STATE_SCROLLABLE 128 #define GESTURE_RINGSIZE 100 enum widget_type { widget_box=1, widget_button, widget_label, widget_image, widget_table, widget_table_row }; enum flags { gravity_none=0x00, gravity_left=1, gravity_xcenter=2, gravity_right=4, gravity_top=8, gravity_ycenter=16, gravity_bottom=32, gravity_left_top=gravity_left|gravity_top, gravity_top_center=gravity_xcenter|gravity_top, gravity_right_top=gravity_right|gravity_top, gravity_left_center=gravity_left|gravity_ycenter, gravity_center=gravity_xcenter|gravity_ycenter, gravity_right_center=gravity_right|gravity_ycenter, gravity_left_bottom=gravity_left|gravity_bottom, gravity_bottom_center=gravity_xcenter|gravity_bottom, gravity_right_bottom=gravity_right|gravity_bottom, flags_expand=0x100, flags_fill=0x200, flags_swap=0x400, flags_scrollx=0x800, flags_scrolly=0x1000, orientation_horizontal=0x10000, orientation_vertical=0x20000, orientation_horizontal_vertical=0x40000, }; struct gui_internal_methods { void (*add_callback)(struct gui_priv *priv, struct callback *cb); void (*remove_callback)(struct gui_priv *priv, struct callback *cb); void (*menu_render)(struct gui_priv *this); struct graphics_image * (*image_new_xs)(struct gui_priv *this, const char *name); struct graphics_image * (*image_new_l)(struct gui_priv *this, const char *name); }; struct gui_internal_widget_methods { void (*append)(struct widget *parent, struct widget *child); struct widget * (*button_new)(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags); struct widget * (*button_new_with_callback)(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data); struct widget * (*box_new)(struct gui_priv *this, enum flags flags); struct widget * (*label_new)(struct gui_priv *this, const char *text); struct widget * (*image_new)(struct gui_priv *this, struct graphics_image *image); struct widget * (*keyboard)(struct gui_priv *this, int mode); struct widget * (*menu)(struct gui_priv *this, const char *label); enum flags (*get_flags)(struct widget *widget); void (*set_flags)(struct widget *widget, enum flags flags); int (*get_state)(struct widget *widget); void (*set_state)(struct widget *widget, int state); void (*set_func)(struct widget *widget, void (*func)(struct gui_priv *priv, struct widget *widget, void *data)); void (*set_data)(struct widget *widget, void *data); void (*set_default_background)(struct gui_priv *this, struct widget *widget); }; struct gui_internal_data { struct gui_priv *priv; struct gui_internal_methods *gui; struct gui_internal_widget_methods *widget; }; navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_bookmark.c000066400000000000000000000236211264204753600241620ustar00rootroot00000000000000#include #include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "bookmarks.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_bookmark.h" static void gui_internal_cmd_add_bookmark_do(struct gui_priv *this, struct widget *widget) { GList *l; struct attr attr; dbg(lvl_debug,"text='%s'\n", widget->text); if (widget->text && strlen(widget->text)){ navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, &widget->c, widget->text); } g_free(widget->text); widget->text=NULL; l=g_list_previous(g_list_last(this->root.children)); gui_internal_prune_menu(this, l->data); } static void gui_internal_cmd_add_bookmark_folder_do(struct gui_priv *this, struct widget *widget) { GList *l; struct attr attr; dbg(lvl_debug,"text='%s'\n", widget->text); if (widget->text && strlen(widget->text)){ navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, NULL, widget->text); } g_free(widget->text); widget->text=NULL; l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } static void gui_internal_cmd_add_bookmark_clicked(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_cmd_add_bookmark_do(this, widget->data); } static void gui_internal_cmd_add_bookmark_folder_clicked(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_cmd_add_bookmark_folder_do(this, widget->data); } static void gui_internal_cmd_rename_bookmark_clicked(struct gui_priv *this, struct widget *widget,void *data) { struct widget *w=(struct widget*)widget->data; GList *l; struct attr attr; dbg(lvl_debug,"text='%s'\n", w->text); if (w->text && strlen(w->text)){ navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_rename_bookmark(attr.u.bookmarks, w->name, w->text); } g_free(w->text); g_free(w->name); w->text=NULL; w->name=NULL; l=g_list_previous(g_list_previous(g_list_previous(g_list_last(this->root.children)))); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_add_bookmark2(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*wk,*wl,*we,*wnext; char *name=data; wb=gui_internal_menu(this,_("Add Bookmark")); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; wk->c=wm->c; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_add_bookmark_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); } void gui_internal_cmd_add_bookmark_folder2(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*wk,*wl,*we,*wnext; char *name=data; wb=gui_internal_menu(this,_("Add Bookmark folder")); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; wk->c=wm->c; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_add_bookmark_folder_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); } void gui_internal_cmd_rename_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w,*wb,*wk,*wl,*we,*wnext; char *name=wm->text; wb=gui_internal_menu(this,_("Rename")); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; wk->c=wm->c; wk->name=g_strdup(name); gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_rename_bookmark_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); } void gui_internal_cmd_cut_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_cut_bookmark(mattr.u.bookmarks,wm->text); l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_copy_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_copy_bookmark(mattr.u.bookmarks,wm->text); l=g_list_previous(g_list_previous(g_list_last(this->root.children))); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_paste_bookmark(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_paste_bookmark(mattr.u.bookmarks); l=g_list_previous(g_list_last(this->root.children)); if(l) gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_delete_bookmark_folder(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; GList *l; navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_up(mattr.u.bookmarks); bookmarks_delete_bookmark(mattr.u.bookmarks,wm->prefix); l=g_list_first(this->root.children); gui_internal_prune_menu(this, l->data); } void gui_internal_cmd_load_bookmarks_as_waypoints(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; if(navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL) ) { struct attr attr; struct item *item; struct coord c; struct pcoord *pc; enum projection pro=bookmarks_get_projection(mattr.u.bookmarks); int i, bm_count; navit_set_destination(this->nav, NULL, NULL, 0); bm_count=bookmarks_get_bookmark_count(mattr.u.bookmarks); pc=g_alloca(bm_count*sizeof(struct pcoord)); bookmarks_item_rewind(mattr.u.bookmarks); i=0; while ((item=bookmarks_get_item(mattr.u.bookmarks))) { if (!item_attr_get(item, attr_label, &attr)) continue; if (item->type == type_bookmark) { if (item_coord_get(item, &c, 1)) { pc[i].x=c.x; pc[i].y=c.y; pc[i].pro=pro; navit_add_destination_description(this->nav,&pc[i],attr.u.str); i++; } } } bm_count=i; if (bm_count>0){ navit_set_destinations(this->nav, pc, bm_count, wm->prefix, 1); if (this->flags & 512) { struct attr follow; follow.type=attr_follow; follow.u.num=180; navit_set_attr(this->nav, &this->osd_configuration); navit_set_attr(this->nav, &follow); navit_zoom_to_route(this->nav, 0); } } } gui_internal_prune_menu(this, NULL); } void gui_internal_cmd_replace_bookmarks_from_waypoints(struct gui_priv *this, struct widget *wm, void *data) { struct attr mattr; if(navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL) ) { struct attr attr; char *desc=NULL; struct pcoord *pc; int i, bm_count; if (bookmarks_get_bookmark_count(mattr.u.bookmarks)>0){ struct item *item; bookmarks_item_rewind(mattr.u.bookmarks); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { if (!item_attr_get(item, attr_label, &attr)) continue; if (item->type == type_bookmark) bookmarks_delete_bookmark(mattr.u.bookmarks, attr.u.str); bookmarks_move_down(mattr.u.bookmarks,wm->prefix); } } bookmarks_item_rewind(mattr.u.bookmarks); bm_count=navit_get_destination_count(this->nav); pc=g_alloca(bm_count*sizeof(struct pcoord)); navit_get_destinations(this->nav, pc, bm_count); for (i=0; inav, i); desc=g_strdup_printf("%s WP%d", tmp, i+1); g_free(tmp); navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, &pc[i], desc); bookmarks_move_down(mattr.u.bookmarks,wm->prefix); g_free(desc); } } gui_internal_prune_menu(this, NULL); } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_bookmark.h000066400000000000000000000016571264204753600241740ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct widget; void gui_internal_cmd_add_bookmark2(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_add_bookmark_folder2(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_rename_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_cut_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_copy_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_paste_bookmark(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_delete_bookmark_folder(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_load_bookmarks_as_waypoints(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_replace_bookmarks_from_waypoints(struct gui_priv *this, struct widget *wm, void *data); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_command.c000066400000000000000000001154721264204753600240010ustar00rootroot00000000000000#include #include #include #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #endif #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "command.h" #include "attr.h" #include "xmlconfig.h" #include "event.h" #include "config_.h" #include "map.h" #include "mapset.h" #include "transform.h" #include "search.h" #include "route.h" #include "vehicle.h" #include "vehicleprofile.h" #include "layout.h" #include "util.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_search.h" #include "gui_internal_poi.h" #include "gui_internal_command.h" extern char *version; /** * @brief Converts a WGS84 coordinate pair to its string representation. * * This function takes a coordinate pair with latitude and longitude in degrees and converts them to a * string of the form {@code 45°28'0" N 9°11'26" E}. * * @param gc A WGS84 coordinate pair * @param sep The separator character to insert between latitude and longitude * * @return The coordinates as a formatted string */ static char * coordinates_geo(const struct coord_geo *gc, char sep) { char latc='N',lngc='E'; int lat_deg,lat_min,lat_sec; int lng_deg,lng_min,lng_sec; struct coord_geo g=*gc; if (g.lat < 0) { g.lat=-g.lat; latc='S'; } if (g.lng < 0) { g.lng=-g.lng; lngc='W'; } lat_sec=fmod(g.lat*3600+0.5,60); lat_min=fmod(g.lat*60-lat_sec/60.0+0.5,60); lat_deg=g.lat-lat_min/60.0-lat_sec/3600.0+0.5; lng_sec=fmod(g.lng*3600+0.5,60); lng_min=fmod(g.lng*60-lng_sec/60.0+0.5,60); lng_deg=g.lng-lng_min/60.0-lng_sec/3600.0+0.5;; return g_strdup_printf("%d°%d'%d\" %c%c%d°%d'%d\" %c",lat_deg,lat_min,lat_sec,latc,sep,lng_deg,lng_min,lng_sec,lngc); } /** * @brief Converts a coordinate pair to its WGS84 string representation. * * This function takes a coordinate pair, transforms it to WGS84 and converts it to a string of the form * {@code 45°28'0" N 9°11'26" E}. * * @param gc A coordinate pair * @param sep The separator character to insert between latitude and longitude * * @return The coordinates as a formatted string */ char * gui_internal_coordinates(struct pcoord *pc, char sep) { struct coord_geo g; struct coord c; c.x=pc->x; c.y=pc->y; transform_to_geo(pc->pro, &c, &g); return coordinates_geo(&g, sep); } enum escape_mode { escape_mode_none=0, escape_mode_string=1, escape_mode_quote=2, escape_mode_html=4, escape_mode_html_quote=8, escape_mode_html_apos=16, }; /* todo &=&, < = < */ static char * gui_internal_escape(enum escape_mode mode, char *in) { int len=mode & escape_mode_string ? 3:1; char *dst,*out,*src=in; char *quot="""; char *apos="'"; while (*src) { if ((*src == '"' || *src == '\\') && (mode & (escape_mode_string | escape_mode_quote))) len++; if (*src == '"' && mode == escape_mode_html_quote) len+=strlen(quot); else if (*src == '\'' && mode == escape_mode_html_apos) len+=strlen(apos); else len++; src++; } src=in; out=dst=g_malloc(len); if (mode & escape_mode_string) *dst++='"'; while (*src) { if ((*src == '"' || *src == '\\') && (mode & (escape_mode_string | escape_mode_quote))) *dst++='\\'; if (*src == '"' && mode == escape_mode_html_quote) { strcpy(dst,quot); src++; dst+=strlen(quot); } else if (*src == '\'' && mode == escape_mode_html_apos) { strcpy(dst,apos); src++; dst+=strlen(apos); } else *dst++=*src++; } if (mode & escape_mode_string) *dst++='"'; *dst++='\0'; return out; } static void gui_internal_cmd_escape(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr escaped; if (!in || !in[0]) { dbg(lvl_error,"first parameter missing or wrong type\n"); return; } if (!out) { dbg(lvl_error,"output missing\n"); return; } if (ATTR_IS_STRING(in[0]->type)) { escaped.type=in[0]->type; escaped.u.str=gui_internal_escape(escape_mode_string,in[0]->u.str); } else if (ATTR_IS_INT(in[0]->type)) { escaped.type=attr_type_string_begin; escaped.u.str=g_strdup_printf("%ld",in[0]->u.num); } else { dbg(lvl_error,"first parameter wrong type\n"); return; } dbg(lvl_debug,"in %s result %s\n",in[0]->u.str,escaped.u.str); *out=attr_generic_add_attr(*out, attr_dup(&escaped)); g_free(escaped.u.str); } static void gui_internal_cmd2_about(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *menu,*wb,*w; char *text; graphics_draw_mode(this->gra, draw_mode_begin); menu=gui_internal_menu(this, _("About Navit")); menu->spx=this->spacing*10; wb=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand); gui_internal_widget_append(menu, wb); //Icon gui_internal_widget_append(wb, w=gui_internal_image_new(this, image_new_xs(this, "navit"))); w->flags=gravity_top_center|orientation_horizontal|flags_fill; //app name text=g_strdup_printf("%s",PACKAGE_NAME); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_top_center|orientation_horizontal|flags_expand; g_free(text); //Version text=g_strdup_printf("%s",version); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_top_center|orientation_horizontal|flags_expand; g_free(text); //Site text=g_strdup_printf("http://www.navit-project.org/"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_top_center|orientation_horizontal|flags_expand; g_free(text); //Authors text=g_strdup_printf("%s:",_("By")); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Martin Schaller"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Michael Farmbauer"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Alexander Atanasov"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("Pierre Grandin"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); //Contributors text=g_strdup_printf("%s",_("And all the Navit Team")); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); text=g_strdup_printf("%s",_("members and contributors.")); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; g_free(text); gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } static void gui_internal_cmd2_waypoints(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { gui_internal_select_waypoint(this, _("Waypoints"), NULL, NULL, gui_internal_cmd_position, (void*)2); } static void gui_internal_cmd_enter_coord(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *w, *wb, *wk, *wr, *we, *wnext, *row; wb=gui_internal_menu(this, _("Enter Coordinates")); w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wr); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(wr, we); /* w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we);*/ gui_internal_widget_append(we, wk=gui_internal_label_new(this, _("Latitude Longitude"))); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_enter_coord_clicked; wnext->data=wk; wk->data=wnext; row=gui_internal_text_new(this, _("Enter coordinates, for example:"), gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); row=gui_internal_text_new(this, "52.5219N 19.4127E", gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); row=gui_internal_text_new(this, "52°31.3167N 19°24.7667E", gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); row=gui_internal_text_new(this, "52°31'19N 19°24'46E", gravity_top_center|flags_fill|orientation_vertical); gui_internal_widget_append(wr,row); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_DEGREE)); gui_internal_menu_render(this); } static void gui_internal_cmd2_town(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (this->sl) search_list_select(this->sl, attr_country_all, 0, 0); gui_internal_search(this,_("Town"),"Town",1); } static void gui_internal_cmd2_setting_vehicle(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr,attr2,vattr; struct widget *w,*wb,*wl; struct attr_iter *iter; struct attr active_vehicle; iter=navit_attr_iter_new(); if (navit_get_attr(this->nav, attr_vehicle, &attr, iter) && !navit_get_attr(this->nav, attr_vehicle, &attr2, iter)) { vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); navit_attr_iter_destroy(iter); gui_internal_menu_vehicle_settings(this, attr.u.vehicle, vattr.u.str); return; } navit_attr_iter_destroy(iter); wb=gui_internal_menu(this, _("Vehicle")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); if (!navit_get_attr(this->nav, attr_vehicle, &active_vehicle, NULL)) active_vehicle.u.vehicle=NULL; iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_vehicle, &attr, iter)) { vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); wl=gui_internal_button_new_with_callback(this, vattr.u.str, image_new_xs(this, attr.u.vehicle == active_vehicle.u.vehicle ? "gui_active" : "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_vehicle_settings, attr.u.vehicle); wl->text=g_strdup(vattr.u.str); gui_internal_widget_append(w, wl); } navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } static void gui_internal_cmd2_setting_rules(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *wb,*w; struct attr on,off; wb=gui_internal_menu(this, _("Rules")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); on.u.num=1; off.u.num=0; on.type=off.type=attr_tracking; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Lock on road"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); on.u.num=0; off.u.num=-1; on.type=off.type=attr_orientation; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Northing"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); on.u.num=1; off.u.num=0; on.type=off.type=attr_follow_cursor; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Map follows Vehicle"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); on.u.num=1; off.u.num=0; on.type=off.type=attr_waypoints_flag; gui_internal_widget_append(w, gui_internal_button_navit_attr_new(this, _("Plan with Waypoints"), gravity_left_center|orientation_horizontal|flags_fill, &on, &off)); gui_internal_menu_render(this); } static void gui_internal_cmd2_setting_maps(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr, on, off, description, type, data, url, active; struct widget *w,*wb,*row,*wma; char *label; struct attr_iter *iter; wb=gui_internal_menu(this, _("Maps")); //w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); //w->spy=this->spacing*3; w = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); gui_internal_widget_append(wb, w); iter=navit_attr_iter_new(); on.type=off.type=attr_active; on.u.num=1; off.u.num=0; while(navit_get_attr(this->nav, attr_map, &attr, iter)) { if (map_get_attr(attr.u.map, attr_description, &description, NULL)) { label=g_strdup(description.u.str); } else { if (!map_get_attr(attr.u.map, attr_type, &type, NULL)) type.u.str=""; if (!map_get_attr(attr.u.map, attr_data, &data, NULL)) data.u.str=""; label=g_strdup_printf("%s:%s", type.u.str, data.u.str); } if (map_get_attr(attr.u.map, attr_url, &url, NULL)) { if (!map_get_attr(attr.u.map, attr_active, &active, NULL)) active.u.num=1; wma=gui_internal_button_new_with_callback(this, label, image_new_xs(this, active.u.num ? "gui_active" : "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download, attr.u.map); } else { wma=gui_internal_button_map_attr_new(this, label, gravity_left_center|orientation_horizontal|flags_fill, attr.u.map, &on, &off, 1); } gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); gui_internal_widget_append(row, wma); g_free(label); } navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } static void gui_internal_cmd2_setting_layout(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr; struct widget *w,*wb,*wl,*row; struct attr_iter *iter; wb=gui_internal_menu(this, _("Layout")); w=gui_internal_widget_table_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill,1); gui_internal_widget_append(wb, w); iter=navit_attr_iter_new(); while(navit_get_attr(this->nav, attr_layout, &attr, iter)) { gui_internal_widget_append(w, row=gui_internal_widget_table_row_new(this,gravity_left|orientation_horizontal|flags_fill)); wl=gui_internal_button_navit_attr_new(this, attr.u.layout->name, gravity_left_center|orientation_horizontal|flags_fill, &attr, NULL); gui_internal_widget_append(row, wl); } navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } static void gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget * menu, *box; struct map * map=NULL; struct map_rect * mr=NULL; struct route * route; struct item * item =NULL; struct mapset *ms; struct mapset_handle *msh; int x,i,first=1,dist=0; struct coord c,last,res; struct coord_rect rbbox,dbbox; struct map_selection sel; struct heightline *heightline,*heightlines=NULL; struct diagram_point *min,*diagram_point,*diagram_points=NULL; sel.next=NULL; sel.order=18; sel.range.min=type_height_line_1; sel.range.max=type_height_line_3; menu=gui_internal_menu(this,_("Height Profile")); box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); gui_internal_widget_append(menu, box); route = navit_get_route(this->nav); if (route) map = route_get_map(route); if(map) mr = map_rect_new(map,NULL); if(mr) { while((item = map_rect_get_item(mr))) { while (item_coord_get(item, &c, 1)) { if (first) { first=0; sel.u.c_rect.lu=c; sel.u.c_rect.rl=c; } else coord_rect_extend(&sel.u.c_rect, &c); } } map_rect_destroy(mr); ms=navit_get_mapset(this->nav); if (!first && ms) { msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { mr=map_rect_new(map, &sel); if (mr) { while((item = map_rect_get_item(mr))) { if (item->type >= sel.range.min && item->type <= sel.range.max) { heightline=item_get_heightline(item); if (heightline) { heightline->next=heightlines; heightlines=heightline; } } } map_rect_destroy(mr); } } mapset_close(msh); } } map=NULL; mr=NULL; if (route) map = route_get_map(route); if(map) mr = map_rect_new(map,NULL); if(mr && heightlines) { while((item = map_rect_get_item(mr))) { first=1; while (item_coord_get(item, &c, 1)) { if (first) first=0; else { heightline=heightlines; rbbox.lu=last; rbbox.rl=last; coord_rect_extend(&rbbox, &c); while (heightline) { if (coord_rect_overlap(&rbbox, &heightline->bbox)) { for (i = 0 ; i < heightline->count - 1; i++) { if (heightline->c[i].x != heightline->c[i+1].x || heightline->c[i].y != heightline->c[i+1].y) { if (line_intersection(heightline->c+i, heightline->c+i+1, &last, &c, &res)) { diagram_point=g_new(struct diagram_point, 1); diagram_point->c.x=dist+transform_distance(projection_mg, &last, &res); diagram_point->c.y=heightline->height; diagram_point->next=diagram_points; diagram_points=diagram_point; dbg(lvl_info,"%d %d\n", diagram_point->c.x, diagram_point->c.y); } } } } heightline=heightline->next; } dist+=transform_distance(projection_mg, &last, &c); } last=c; } } } if(mr) map_rect_destroy(mr); gui_internal_menu_render(this); if(!diagram_points) return; first=1; diagram_point=diagram_points; while (diagram_point) { if (first) { dbbox.lu=diagram_point->c; dbbox.rl=diagram_point->c; first=0; } else coord_rect_extend(&dbbox, &diagram_point->c); diagram_point=diagram_point->next; } dbg(lvl_info,"%d %d %d %d\n", dbbox.lu.x, dbbox.lu.y, dbbox.rl.x, dbbox.rl.y); if (dbbox.rl.x > dbbox.lu.x && dbbox.lu.x*100/(dbbox.rl.x-dbbox.lu.x) <= 25) dbbox.lu.x=0; if (dbbox.lu.y > dbbox.rl.y && dbbox.rl.y*100/(dbbox.lu.y-dbbox.rl.y) <= 25) dbbox.rl.y=0; dbg(lvl_info,"%d,%d %dx%d\n", box->p.x, box->p.y, box->w, box->h); x=dbbox.lu.x; first=1; for (;;) { struct point p[2]; min=NULL; diagram_point=diagram_points; while (diagram_point) { if (diagram_point->c.x >= x && (!min || min->c.x > diagram_point->c.x)) min=diagram_point; diagram_point=diagram_point->next; } if (! min) break; p[1].x=(min->c.x-dbbox.lu.x)*(box->w-10)/(dbbox.rl.x-dbbox.lu.x)+box->p.x+5; p[1].y=(min->c.y-dbbox.rl.y)*(box->h-10)/(dbbox.lu.y-dbbox.rl.y)+box->p.y+5; dbg(lvl_info,"%d,%d=%d,%d\n",min->c.x, min->c.y, p[1].x,p[1].y); graphics_draw_circle(this->gra, this->foreground, &p[1], 2); if (first) first=0; else graphics_draw_lines(this->gra, this->foreground, p, 2); p[0]=p[1]; x=min->c.x+1; } } static void gui_internal_cmd2_route_description(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget * menu; struct widget * box; if(! this->vehicle_cb) { /** * Register the callback on vehicle updates. */ this->vehicle_cb = callback_new_attr_1(callback_cast(gui_internal_route_update), attr_position_coord_geo,this); navit_add_callback(this->nav,this->vehicle_cb); } this->route_data.route_table = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); menu=gui_internal_menu(this,_("Route Description")); menu->wfree=gui_internal_route_screen_free; this->route_data.route_showing=1; this->route_data.route_table->spx = this->spacing; box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); gui_internal_widget_append(box,this->route_data.route_table); box->w=menu->w; box->spx = this->spacing; this->route_data.route_table->w=box->w; gui_internal_widget_append(menu,box); gui_internal_populate_route_table(this,this->nav); gui_internal_menu_render(this); } static void gui_internal_cmd2_pois(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *w; struct poi_param *param; struct attr pro; struct coord c; dbg(lvl_debug,"enter\n"); if (!in || !in[0]) return; if (!ATTR_IS_COORD_GEO(in[0]->type)) return; if (!navit_get_attr(this->nav, attr_projection, &pro, NULL)) return; w=g_new0(struct widget,1); param=g_new0(struct poi_param,1); if (in[1] && ATTR_IS_STRING(in[1]->type)) { gui_internal_poi_param_set_filter(param, in[1]->u.str); if (in[2] && ATTR_IS_INT(in[2]->type)) param->AddressFilterType=in[2]->u.num; } transform_from_geo(pro.u.projection,in[0]->u.coord_geo,&c); w->c.x=c.x; w->c.y=c.y; w->c.pro=pro.u.projection; gui_internal_cmd_pois(this, w, param); g_free(w); gui_internal_poi_param_free(param); } static void gui_internal_cmd2_locale(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *menu,*wb,*w; char *text; graphics_draw_mode(this->gra, draw_mode_begin); menu=gui_internal_menu(this, _("Show Locale")); menu->spx=this->spacing*10; wb=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(menu, wb); text=g_strdup_printf("LANG=%1$s (1=%3$s 2=%2$s)",getenv("LANG"),"2","1"); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_left_center|orientation_horizontal|flags_fill; g_free(text); #ifdef HAVE_API_WIN32_BASE { char country[32],lang[32]; #ifdef HAVE_API_WIN32_CE wchar_t wcountry[32],wlang[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, wlang, sizeof(wlang)); WideCharToMultiByte(CP_ACP,0,wlang,-1,lang,sizeof(lang),NULL,NULL); #else GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, lang, sizeof(lang)); #endif text=g_strdup_printf("LOCALE_SABBREVLANGNAME=%s",lang); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_left_center|orientation_horizontal|flags_fill; g_free(text); #ifdef HAVE_API_WIN32_CE GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, wcountry, sizeof(wcountry)); WideCharToMultiByte(CP_ACP,0,wcountry,-1,country,sizeof(country),NULL,NULL); #else GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, country, sizeof(country)); #endif text=g_strdup_printf("LOCALE_SABBREVCTRYNAME=%s",country); gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); w->flags=gravity_left_center|orientation_horizontal|flags_fill; g_free(text); } #endif gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } static void gui_internal_cmd_formerdests(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *wb,*w,*wbm,*tbl=NULL; struct map *formerdests; struct map_rect *mr_formerdests; struct item *item; struct attr attr; char *label_full; enum projection projection; if(!navit_get_attr(this->nav, attr_former_destination_map, &attr, NULL)) return; formerdests=attr.u.map; if(!formerdests) return; mr_formerdests=map_rect_new(formerdests, NULL); if(!mr_formerdests) return; projection = map_projection(formerdests); gui_internal_prune_menu_count(this, 1, 0); wb=gui_internal_menu(this, _("Former Destinations")); wb->background=this->background; w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*2; gui_internal_widget_append(wb, w); while ((item=map_rect_get_item(mr_formerdests))) { struct coord c; struct widget *row; if (item->type!=type_former_destination) continue; if (!item_attr_get(item, attr_label, &attr)) continue; if(!tbl) { tbl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand | orientation_vertical,1); gui_internal_widget_append(w,tbl); } row=gui_internal_widget_table_row_new(this,gravity_left| flags_fill| orientation_vertical); gui_internal_widget_prepend(tbl, row); label_full=attr.u.str; wbm=gui_internal_button_new_with_callback(this, label_full, image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_position, NULL); gui_internal_widget_append(row,wbm); if (item_coord_get(item, &c, 1)) { wbm->c.x=c.x; wbm->c.y=c.y; wbm->c.pro=projection; wbm->name=g_strdup(label_full); wbm->text=g_strdup(label_full); wbm->data=(void*)8; //Mark us as a former destination wbm->prefix=g_strdup(label_full); } } if (!tbl){ wbm=gui_internal_text_new(this, _("- No former destinations available -"), gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, wbm); } gui_internal_menu_render(this); map_rect_destroy(mr_formerdests); } static void gui_internal_cmd2_bookmarks(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str=NULL; if (in && in[0] && ATTR_IS_STRING(in[0]->type)) { str=in[0]->u.str; } gui_internal_cmd_bookmarks(this, NULL, str); } static void gui_internal_cmd2_abort_navigation(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { navit_set_destination(this->nav, NULL, NULL, 0); } static void gui_internal_cmd2_back(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_back(this, NULL, NULL); graphics_draw_mode(this->gra, draw_mode_end); gui_internal_check_exit(this); } static void gui_internal_cmd2_back_to_map(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { gui_internal_prune_menu(this, NULL); gui_internal_check_exit(this); } static void gui_internal_get_data(struct gui_priv *priv, char *command, struct attr **in, struct attr ***out) { struct attr private_data = { attr_private_data, {(void *)&priv->data}}; if (out) *out=attr_generic_add_attr(*out, &private_data); } static void gui_internal_cmd_log(struct gui_priv *this) { struct widget *w,*wb,*wk,*wl,*we,*wnext; gui_internal_enter(this, 1); gui_internal_set_click_coord(this, NULL); gui_internal_enter_setup(this); wb=gui_internal_menu(this, "Log Message"); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, _("Message"))); wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_call_linked_on_finish; gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wnext->state |= STATE_SENSITIVE; wnext->func = gui_internal_cmd_log_clicked; wnext->data=wk; wk->data=wnext; wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); gui_internal_menu_render(this); gui_internal_leave(this); } static void gui_internal_cmd_menu2(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *href=NULL; int i=0, ignore=0, replace=0; if (in && in[i] && ATTR_IS_INT(in[i]->type)) ignore=in[i++]->u.num; if (in && in[i] && ATTR_IS_STRING(in[i]->type)) { href=in[i++]->u.str; if (in[i] && ATTR_IS_INT(in[i]->type)) replace=in[i++]->u.num; } if (this->root.children) { if (!href) return; gui_internal_html_load_href(this, href, replace); return; } gui_internal_cmd_menu(this, ignore, href); } static void gui_internal_cmd2_position(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { const char *name=_("Position"); int flags=-1; dbg(lvl_debug,"enter\n"); if (!in || !in[0]) return; if (!ATTR_IS_COORD_GEO(in[0]->type)) return; if (in[1] && ATTR_IS_STRING(in[1]->type)) { name=in[1]->u.str; if (in[2] && ATTR_IS_INT(in[2]->type)) flags=in[2]->u.num; } dbg(lvl_debug,"flags=0x%x\n",flags); gui_internal_cmd_position_do(this, NULL, in[0]->u.coord_geo, NULL, name, flags); } static void gui_internal_cmd_redraw_map(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { this->redraw=1; } static void gui_internal_cmd2_refresh(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *href=g_strdup(this->href); gui_internal_html_load_href(this, href, 1); g_free(href); } static void gui_internal_cmd2_set(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { char *pattern,*command=NULL; if (!in || !in[0] || !ATTR_IS_STRING(in[0]->type)) { dbg(lvl_error,"first parameter missing or wrong type\n"); return; } pattern=in[0]->u.str; dbg(lvl_debug,"pattern %s\n",pattern); if (in[1]) { command=gui_internal_cmd_match_expand(pattern, in+1); dbg(lvl_debug,"expand %s\n",command); gui_internal_set(pattern, command); command_evaluate(&this->self, command); g_free(command); } else { gui_internal_set(pattern, NULL); } } void gui_internal_cmd2_quit(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr navit; gui_internal_prune_menu(this, NULL); navit.type=attr_navit; navit.u.navit=this->nav; config_remove_attr(config, &navit); event_main_loop_quit(); } static char * gui_internal_append_attr(char *str, enum escape_mode mode, char *pre, struct attr *attr, char *post) { char *astr=NULL; if (ATTR_IS_STRING(attr->type)) astr=gui_internal_escape(mode, attr->u.str); else if (ATTR_IS_COORD_GEO(attr->type)) { char *str2=coordinates_geo(attr->u.coord_geo, '\n'); astr=gui_internal_escape(mode, str2); g_free(str2); } else if (ATTR_IS_INT(attr->type)) astr=g_strdup_printf("%ld",attr->u.num); else astr=g_strdup_printf("Unsupported type %s",attr_to_name(attr->type)); str=g_strconcat_printf(str,"%s%s%s",pre,astr,post); g_free(astr); return str; } static void gui_internal_cmd_write(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str=NULL; dbg(lvl_debug,"enter %s %p %p %p\n",function,in,out,valid); if (!in) return; while (*in) { str=gui_internal_append_attr(str, escape_mode_none, "", *in, ""); in++; } if (str) { str=g_strdup_printf("%s\n",str); #if 0 dbg(lvl_debug,"%s\n",str); #endif gui_internal_html_parse_text(this, str); } g_free(str); } static void gui_internal_onclick(struct attr ***in, char **onclick, char *set) { struct attr **i=*in; char *c,*str=NULL,*args=NULL,*sep=""; if (!*i || !ATTR_IS_STRING((*i)->type) || !(*i)->u.str) goto error; str=g_strdup((*i)->u.str); i++; c=str; while (*c) { if (c[0] == '%' && c[1] == '{') { char format[4],*end=strchr(c+2,'}'),*replacement=NULL,*new_str; int is_arg; if (!end) { dbg(lvl_error,"Missing closing brace in format string %s\n",c); goto error; } if (end-c > sizeof(format)) { dbg(lvl_error,"Invalid format string %s\n",c); goto error; } strncpy(format, c+2, end-c-2); format[end-c-2]='\0'; is_arg=end[1] == '*'; c[0]='\0'; if (!strcmp(format,"d")) { replacement=gui_internal_append_attr(NULL, escape_mode_string, "", *i++, ""); if (is_arg) { args=g_strconcat_printf(args, "%s%s", args ? "," : "", replacement); g_free(replacement); replacement=g_strdup(""); } } if (!strcmp(format,"se")) { replacement=gui_internal_append_attr(NULL, escape_mode_string, "", *i++, ""); if (is_arg) { char *arg=gui_internal_escape(escape_mode_string, replacement); args=g_strconcat_printf(args, "%s%s", args ? "," : "", arg); g_free(replacement); g_free(arg); replacement=g_strdup(""); } } if (!replacement) { dbg(lvl_error,"Unsupported format string %s\n",format); goto error; } new_str=g_strconcat(str, replacement, end+1, NULL); c=new_str+strlen(str)+strlen(replacement); g_free(str); g_free(replacement); str=new_str; } c++; } *in=i; if (*onclick && strlen(*onclick)) sep=";"; if (str && strlen(str)) { char *old=*onclick; if (set) { char *setstr=gui_internal_escape(escape_mode_string,str); char *argssep=""; if (args && strlen(args)) argssep=","; *onclick=g_strconcat(old,sep,set,"(",setstr,argssep,args,")",NULL); } else { *onclick=g_strconcat(old,sep,str,NULL); } g_free(old); } error: g_free(str); g_free(args); return; } static void gui_internal_cmd_img(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str=g_strdup("type)) { if ((*in)->u.str && strlen((*in)->u.str)) str=gui_internal_append_attr(str, escape_mode_string|escape_mode_html, " class=", *in, ""); in++; } else { dbg(lvl_error,"argument error: class argument not string\n"); goto error; } if (ATTR_IS_STRING((*in)->type) && (*in)->u.str) { if ((*in)->u.str && strlen((*in)->u.str)) { str=gui_internal_append_attr(str, escape_mode_string|escape_mode_html, " src=", *in, ""); } in++; } else { dbg(lvl_error,"argument error: image argument not string\n"); goto error; } if (ATTR_IS_STRING((*in)->type) && (*in)->u.str) { if ((*in)->u.str && strlen((*in)->u.str)) { suffix=gui_internal_append_attr(NULL, escape_mode_html, ">", *in, ""); } else { suffix=g_strdup("/>"); } in++; } else { dbg(lvl_error,"argument error: text argument not string\n"); goto error; } gui_internal_onclick(&in,&onclick,NULL); gui_internal_onclick(&in,&onclick,"set"); gui_internal_onclick(&in,&onclick,NULL); if (strlen(onclick)) { char *tmp=gui_internal_escape(escape_mode_html_apos, onclick); str=g_strconcat_printf(str," onclick='%s'",tmp); g_free(tmp); } g_free(onclick); html=g_strdup_printf("%s%s\n",str,suffix); dbg(lvl_debug,"return %s",html); gui_internal_html_parse_text(this, html); g_free(html); error: g_free(suffix); g_free(str); return; } static void gui_internal_cmd_debug(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str; dbg(lvl_debug,"begin\n"); if (in) { while (*in) { str=attr_to_text(*in, NULL, 0); dbg(lvl_debug,"%s:%s\n",attr_to_name((*in)->type),str); in++; g_free(str); } } dbg(lvl_debug,"done\n"); } static void gui_internal_cmd2(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { int entering=0; int ignore=1; if (in && in[0] && ATTR_IS_INT(in[0]->type)) { ignore=in[0]->u.num; in++; } if(!this->root.children) { entering=1; gui_internal_apply_config(this); gui_internal_enter(this, ignore); gui_internal_enter_setup(this); } if(!strcmp(function, "bookmarks")) gui_internal_cmd2_bookmarks(this, function, in, out, valid); else if(!strcmp(function, "formerdests")) gui_internal_cmd_formerdests(this, function, in, out, valid); else if(!strcmp(function, "locale")) gui_internal_cmd2_locale(this, function, in, out, valid); else if(!strcmp(function, "position")) gui_internal_cmd2_position(this, function, in, out, valid); else if(!strcmp(function, "pois")) gui_internal_cmd2_pois(this, function, in, out, valid); else if(!strcmp(function, "route_description")) gui_internal_cmd2_route_description(this, function, in, out, valid); else if(!strcmp(function, "route_height_profile")) gui_internal_cmd2_route_height_profile(this, function, in, out, valid); else if(!strcmp(function, "setting_layout")) gui_internal_cmd2_setting_layout(this, function, in, out, valid); else if(!strcmp(function, "setting_maps")) gui_internal_cmd2_setting_maps(this, function, in, out, valid); else if(!strcmp(function, "setting_rules")) gui_internal_cmd2_setting_rules(this, function, in, out, valid); else if(!strcmp(function, "setting_vehicle")) gui_internal_cmd2_setting_vehicle(this, function, in, out, valid); else if(!strcmp(function, "town")) gui_internal_cmd2_town(this, function, in, out, valid); else if(!strcmp(function, "enter_coord")) gui_internal_cmd_enter_coord(this, function, in, out, valid); else if(!strcmp(function, "waypoints")) gui_internal_cmd2_waypoints(this, function, in, out, valid); else if(!strcmp(function, "about")) gui_internal_cmd2_about(this, function, in, out, valid); if(entering) graphics_draw_mode(this->gra, draw_mode_end); } static struct command_table commands[] = { {"E",command_cast(gui_internal_cmd_escape)}, {"abort_navigation",command_cast(gui_internal_cmd2_abort_navigation)}, {"back",command_cast(gui_internal_cmd2_back)}, {"back_to_map",command_cast(gui_internal_cmd2_back_to_map)}, {"bookmarks",command_cast(gui_internal_cmd2)}, {"debug",command_cast(gui_internal_cmd_debug)}, {"formerdests",command_cast(gui_internal_cmd2)}, {"get_data",command_cast(gui_internal_get_data)}, {"img",command_cast(gui_internal_cmd_img)}, {"locale",command_cast(gui_internal_cmd2)}, {"log",command_cast(gui_internal_cmd_log)}, {"menu",command_cast(gui_internal_cmd_menu2)}, {"position",command_cast(gui_internal_cmd2_position)}, {"pois",command_cast(gui_internal_cmd2)}, {"redraw_map",command_cast(gui_internal_cmd_redraw_map)}, {"refresh",command_cast(gui_internal_cmd2_refresh)}, {"route_description",command_cast(gui_internal_cmd2)}, {"route_height_profile",command_cast(gui_internal_cmd2)}, {"set",command_cast(gui_internal_cmd2_set)}, {"setting_layout",command_cast(gui_internal_cmd2)}, {"setting_maps",command_cast(gui_internal_cmd2)}, {"setting_rules",command_cast(gui_internal_cmd2)}, {"setting_vehicle",command_cast(gui_internal_cmd2)}, {"town",command_cast(gui_internal_cmd2)}, {"enter_coord",command_cast(gui_internal_cmd2)}, {"quit",command_cast(gui_internal_cmd2_quit)}, {"waypoints",command_cast(gui_internal_cmd2)}, {"write",command_cast(gui_internal_cmd_write)}, {"about",command_cast(gui_internal_cmd2)}, }; void gui_internal_command_init(struct gui_priv *this, struct attr **attrs) { struct attr *attr; if ((attr=attr_search(attrs, NULL, attr_callback_list))) { command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this); } } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_command.h000066400000000000000000000005251264204753600237760ustar00rootroot00000000000000/* prototypes */ struct attr; struct gui_priv; struct pcoord; char *gui_internal_coordinates(struct pcoord *pc, char sep); void gui_internal_cmd2_quit(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid); void gui_internal_command_init(struct gui_priv *this, struct attr **attrs); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_gesture.c000066400000000000000000000064551264204753600240410ustar00rootroot00000000000000#include #include #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #endif #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "types.h" #include "navit_nls.h" #include "event.h" #include "search.h" #include "country.h" #include "track.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_gesture.h" void gui_internal_gesture_ring_clear(struct gui_priv *this) { this->gesture_ring_last=this->gesture_ring_first=0; }; static struct gesture_elem * gui_internal_gesture_ring_get(struct gui_priv *this, int i) { int n=(this->gesture_ring_last-i+GESTURE_RINGSIZE)%GESTURE_RINGSIZE; if(n==this->gesture_ring_first) return NULL; return this->gesture_ring+n; }; void gui_internal_gesture_ring_add(struct gui_priv *this, struct point *p) { long long msec; #ifndef HAVE_API_WIN32_CE struct timeval tv; gettimeofday(&tv,NULL); msec=((long long)tv.tv_sec)*1000+tv.tv_usec/1000; #else msec=GetTickCount(); #endif this->gesture_ring_last++; this->gesture_ring_last%=GESTURE_RINGSIZE; if(this->gesture_ring_last==this->gesture_ring_first) { this->gesture_ring_first++; this->gesture_ring_first%=GESTURE_RINGSIZE; } this->gesture_ring[this->gesture_ring_last].p=*p; this->gesture_ring[this->gesture_ring_last].msec=msec; dbg(lvl_info,"msec="LONGLONG_FMT" x=%d y=%d\n",msec,p->x,p->y); }; int gui_internal_gesture_get_vector(struct gui_priv *this, long long msec, struct point *p0, int *dx, int *dy) { struct gesture_elem *g; int x,y,dt; int i; dt=0; if(dx) *dx=0; if(dy) *dy=0; if(p0) { p0->x=-1; p0->y=-1; } g=gui_internal_gesture_ring_get(this,0); if(!g) return 0; x=g->p.x; y=g->p.y; if(p0) { *p0=g->p; } msec=g->msec; dbg(lvl_info,LONGLONG_FMT" %d %d\n",g->msec, g->p.x, g->p.y); for(i=1;(g=gui_internal_gesture_ring_get(this,i))!=NULL;i++) { if( msec-g->msec > 1000 ) break; dt=msec-g->msec; if(dx) *dx=x-g->p.x; if(dy) *dy=y-g->p.y; if(p0) { *p0=g->p; } dbg(lvl_info,LONGLONG_FMT" %d %d\n",g->msec, g->p.x, g->p.y); } return dt; } int gui_internal_gesture_do(struct gui_priv *this) { int dt; int dx,dy; dt=gui_internal_gesture_get_vector(this, 1000, NULL, &dx, &dy); if( abs(dx) > this->icon_s*3 && abs(dy) < this->icon_s ) { struct widget *wt; dbg(lvl_debug,"horizontal dx=%d dy=%d\n",dx,dy); /* Prevent swiping if widget was scrolled beforehand */ if(this->pressed==2) return 0; for(wt=this->highlighted;wt && wt->type!=widget_table;wt=wt->parent); if(!wt || wt->type!=widget_table || !wt->data) return 0; if(this->highlighted) { this->highlighted->state &= ~STATE_HIGHLIGHTED; this->highlighted=NULL; } if(dx<0) gui_internal_table_button_next(this,NULL,wt); else gui_internal_table_button_prev(this,NULL,wt); return 1; } else if( abs(dy) > this->icon_s*3 && abs(dx) < this->icon_s ) { dbg(lvl_debug,"vertical dx=%d dy=%d\n",dx,dy); } else if (dt>300 && abs(dx) icon_s && abs(dy) icon_s ) { dbg(lvl_debug,"longtap dx=%d dy=%d\n",dx,dy); } else { dbg(lvl_debug,"none dx=%d dy=%d\n",dx,dy); } return 0; }; navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_gesture.h000066400000000000000000000005651264204753600240420ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct point; void gui_internal_gesture_ring_clear(struct gui_priv *this); void gui_internal_gesture_ring_add(struct gui_priv *this, struct point *p); int gui_internal_gesture_get_vector(struct gui_priv *this, long long msec, struct point *p0, int *dx, int *dy); int gui_internal_gesture_do(struct gui_priv *this); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_html.c000066400000000000000000000335141264204753600233230ustar00rootroot00000000000000#include #include #include #include "callback.h" #include "debug.h" #include "coord.h" #include "point.h" #include "color.h" #include "graphics.h" #include "xmlconfig.h" #include "navit_nls.h" #include "gui.h" #include "command.h" struct gui_priv; #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_keyboard.h" #include "gui_internal_menu.h" struct form { char *onsubmit; }; struct html_tag_map { char *tag_name; enum html_tag tag; } html_tag_map[] = { {"a",html_tag_a}, {"h1",html_tag_h1}, {"html",html_tag_html}, {"img",html_tag_img}, {"script",html_tag_script}, {"form",html_tag_form}, {"input",html_tag_input}, {"div",html_tag_div}, }; static const char * find_attr(const char **names, const char **values, const char *name) { while (*names) { if (!g_ascii_strcasecmp(*names, name)) return *values; names+=XML_ATTR_DISTANCE; values+=XML_ATTR_DISTANCE; } return NULL; } static char * find_attr_dup(const char **names, const char **values, const char *name) { return g_strdup(find_attr(names, values, name)); } void gui_internal_html_main_menu(struct gui_priv *this) { gui_internal_prune_menu(this, NULL); gui_internal_html_load_href(this, "#Main Menu", 0); } static void gui_internal_html_command(struct gui_priv *this, struct widget *w, void *data) { gui_internal_evaluate(this,w->command); } static void gui_internal_html_submit_set(struct gui_priv *this, struct widget *w, struct form *form) { GList *l; if (w->form == form && w->name) { struct attr *attr=attr_new_from_text(w->name, w->text?w->text:""); if (attr) gui_set_attr(this->self.u.gui, attr); attr_free(attr); } l=w->children; while (l) { w=l->data; gui_internal_html_submit_set(this, w, form); l=g_list_next(l); } } static void gui_internal_html_submit(struct gui_priv *this, struct widget *w, void *data) { struct widget *menu; GList *l; dbg(lvl_debug,"enter form %p %s\n",w->form,w->form->onsubmit); l=g_list_last(this->root.children); menu=l->data; graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_highlight_do(this, NULL); gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); gui_internal_html_submit_set(this, menu, w->form); gui_internal_evaluate(this,w->form->onsubmit); } void gui_internal_html_load_href(struct gui_priv *this, char *href, int replace) { if (replace) gui_internal_prune_menu_count(this, 1, 0); if (href && href[0] == '#') { dbg(lvl_debug,"href=%s\n",href); g_free(this->href); this->href=g_strdup(href); gui_internal_html_menu(this, this->html_text, href+1); } } void gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data) { gui_internal_html_load_href(this, w->command, 0); } struct div_flags_map { char *attr; char *val; enum flags flags; } div_flags_map[] = { {"gravity","none",gravity_none}, {"gravity","left",gravity_left}, {"gravity","xcenter",gravity_xcenter}, {"gravity","right",gravity_right}, {"gravity","top",gravity_top}, {"gravity","ycenter",gravity_ycenter}, {"gravity","bottom",gravity_bottom}, {"gravity","left_top",gravity_left_top}, {"gravity","top_center",gravity_top_center}, {"gravity","right_top",gravity_right_top}, {"gravity","left_center",gravity_left_center}, {"gravity","center",gravity_center}, {"gravity","right_center",gravity_right_center}, {"gravity","left_bottom",gravity_left_bottom}, {"gravity","bottom_center",gravity_bottom_center}, {"gravity","right_bottom",gravity_right_bottom}, {"expand","1",flags_expand}, {"fill","1",flags_fill}, {"orientation","horizontal",orientation_horizontal}, {"orientation","vertical",orientation_vertical}, {"orientation","horizontal_vertical",orientation_horizontal_vertical}, }; static enum flags div_flag(const char **names, const char **values, char *name) { int i; enum flags ret=0; const char *value=find_attr(names, values, name); if (!value) return ret; for (i = 0 ; i < sizeof(div_flags_map)/sizeof(struct div_flags_map); i++) { if (!strcmp(div_flags_map[i].attr,name) && !strcmp(div_flags_map[i].val,value)) ret|=div_flags_map[i].flags; } return ret; } static enum flags div_flags(const char **names, const char **values) { enum flags flags; flags = div_flag(names, values, "gravity"); flags |= div_flag(names, values, "orientation"); flags |= div_flag(names, values, "expand"); flags |= div_flag(names, values, "fill"); return flags; } static struct widget * html_image(struct gui_priv *this, const char **names, const char **values) { const char *src, *size; struct graphics_image *img=NULL; src=find_attr(names, values, "src"); if (!src) return NULL; size=find_attr(names, values, "size"); if (!size) { const char *class=find_attr(names, values, "class"); if (class && !strcasecmp(class,"centry")) size="xs"; else size="l"; } if (!strcmp(size,"l")) img=image_new_l(this, src); else if (!strcmp(size,"s")) img=image_new_s(this, src); else if (!strcmp(size,"xs")) img=image_new_xs(this, src); if (!img) return NULL; return gui_internal_image_new(this, img); } static void gui_internal_html_start(xml_context *dummy, const char *tag_name, const char **names, const char **values, void *data, GError **error) { struct gui_priv *this=data; int i; enum html_tag tag=html_tag_none; struct html *html=&this->html[this->html_depth]; const char *cond, *type, *font_size; if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) return; html->skip=0; html->command=NULL; html->name=NULL; html->href=NULL; html->refresh_cond=NULL; html->w=NULL; html->container=NULL; html->font_size=0; cond=find_attr(names, values, "cond"); if (cond && !this->html_skip) { if (!command_evaluate_to_boolean(&this->self, cond, NULL)) html->skip=1; } for (i=0 ; i < sizeof(html_tag_map)/sizeof(struct html_tag_map); i++) { if (!g_ascii_strcasecmp(html_tag_map[i].tag_name, tag_name)) { tag=html_tag_map[i].tag; break; } } html->tag=tag; html->class=find_attr_dup(names, values, "class"); if (!this->html_skip && !html->skip) { switch (tag) { case html_tag_a: html->name=find_attr_dup(names, values, "name"); if (html->name) { html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0; if (!html->skip) this->html_anchor_found=1; } html->command=find_attr_dup(names, values, "onclick"); html->href=find_attr_dup(names, values, "href"); html->refresh_cond=find_attr_dup(names, values, "refresh_cond"); break; case html_tag_img: html->command=find_attr_dup(names, values, "onclick"); html->w=html_image(this, names, values); break; case html_tag_form: this->form=g_new0(struct form, 1); this->form->onsubmit=find_attr_dup(names, values, "onsubmit"); break; case html_tag_input: type=find_attr_dup(names, values, "type"); if (!type) break; if (!strcmp(type,"image")) { html->w=html_image(this, names, values); if (html->w) { html->w->state|=STATE_SENSITIVE; html->w->func=gui_internal_html_submit; } } if (!strcmp(type,"text") || !strcmp(type,"password")) { const char *value=find_attr(names, values, "value"); html->w=gui_internal_label_new(this, value); html->w->background=this->background; html->w->flags |= div_flags(names, values); html->w->state|=STATE_EDITABLE; if (!this->editable) { this->editable=html->w; html->w->state|=STATE_EDIT; } this->keyboard_required=1; if (!strcmp(type,"password")) html->w->flags2 |= 1; } if (html->w) { html->w->form=this->form; html->w->name=find_attr_dup(names, values, "name"); } break; case html_tag_div: html->w=gui_internal_box_new(this, div_flags(names, values)); font_size=find_attr(names, values, "font"); if (font_size) html->font_size=atoi(font_size); html->container=this->html_container; this->html_container=html->w; break; default: break; } } this->html_skip+=html->skip; this->html_depth++; } static void gui_internal_html_end(xml_context *dummy, const char *tag_name, void *data, GError **error) { struct gui_priv *this=data; struct html *html; struct html *parent=NULL; if (!g_ascii_strcasecmp(tag_name,"text") || !g_ascii_strcasecmp(tag_name,"p")) return; this->html_depth--; html=&this->html[this->html_depth]; if (this->html_depth > 0) parent=&this->html[this->html_depth-1]; if (!this->html_skip) { if (html->command && html->w) { html->w->state |= STATE_SENSITIVE; html->w->command=html->command; html->w->func=gui_internal_html_command; html->command=NULL; } if (parent && (parent->href || parent->command) && html->w) { html->w->state |= STATE_SENSITIVE; if (parent->command) { html->w->command=g_strdup(parent->command); html->w->func=gui_internal_html_command; } else { html->w->command=g_strdup(parent->href); html->w->func=gui_internal_html_href; } } switch (html->tag) { case html_tag_div: this->html_container=html->container; case html_tag_img: case html_tag_input: gui_internal_widget_append(this->html_container, html->w); break; case html_tag_form: this->form=NULL; break; default: break; } } this->html_skip-=html->skip; g_free(html->command); g_free(html->name); g_free(html->href); g_free(html->class); g_free(html->refresh_cond); } static void gui_internal_refresh_callback_called(struct gui_priv *this, struct menu_data *menu_data) { if (gui_internal_menu_data(this) == menu_data) { char *href=g_strdup(menu_data->href); gui_internal_html_load_href(this, href, 1); g_free(href); } } static void gui_internal_set_refresh_callback(struct gui_priv *this, char *cond) { dbg(lvl_info,"cond=%s\n",cond); if (cond) { enum attr_type type; struct object_func *func; struct menu_data *menu_data=gui_internal_menu_data(this); dbg(lvl_info,"navit=%p\n",this->nav); type=command_evaluate_to_attr(&this->self, cond, NULL, &menu_data->refresh_callback_obj); if (type == attr_none) { dbg(lvl_error,"can't get type of '%s'\n",cond); return; } func=object_func_lookup(menu_data->refresh_callback_obj.type); if (!func) dbg(lvl_error,"'%s' has no functions\n",cond); if (func && !func->add_attr) dbg(lvl_error,"'%s' has no add_attr function\n",cond); if (!func || !func->add_attr) return; menu_data->refresh_callback.type=attr_callback; menu_data->refresh_callback.u.callback=callback_new_attr_2(callback_cast(gui_internal_refresh_callback_called),type,this,menu_data); func->add_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); } } static void gui_internal_html_text(xml_context *dummy, const char *text, gsize len, void *data, GError **error) { struct gui_priv *this=data; struct widget *w; int depth=this->html_depth-1; struct html *html=&this->html[depth]; gchar *text_stripped; if (this->html_skip) return; while (isspace(text[0])) { text++; len--; } while (len > 0 && isspace(text[len-1])) len--; text_stripped = g_strndup(text, len); if (html->tag == html_tag_html && depth > 2) { if (this->html[depth-1].tag == html_tag_script) { html=&this->html[depth-2]; } } switch (html->tag) { case html_tag_a: if (html->name && len) { if (html->class && !strcasecmp(html->class,"clist")) this->html_container=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill /* |flags_scrolly */); else this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); gui_internal_menu_data(this)->href=g_strdup(this->href); gui_internal_set_refresh_callback(this, html->refresh_cond); this->html_container->spx=this->spacing*10; } break; case html_tag_h1: if (!this->html_container) { this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); this->html_container->spx=this->spacing*10; } break; case html_tag_img: if (len) { if (html->class && !strcasecmp(html->class, "centry")) w=gui_internal_box_new(this, gravity_left_top|orientation_horizontal|flags_fill); else w=gui_internal_box_new(this, gravity_center|orientation_vertical); gui_internal_widget_append(w, html->w); gui_internal_widget_append(w, gui_internal_text_new(this, _(text_stripped), gravity_left_top|orientation_vertical|flags_fill)); html->w=w; } break; case html_tag_div: if (len) { gui_internal_widget_append(html->w, gui_internal_text_font_new(this, _(text_stripped), html->font_size, gravity_center|orientation_vertical)); } break; case html_tag_script: dbg(lvl_debug,"execute %s\n",text_stripped); gui_internal_evaluate(this,text_stripped); break; default: break; } g_free(text_stripped); } void gui_internal_html_parse_text(struct gui_priv *this, char *doc) { xml_parse_text(doc, this, gui_internal_html_start, gui_internal_html_end, gui_internal_html_text); } void gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor) { char *doc=g_strdup(document); graphics_draw_mode(this->gra, draw_mode_begin); this->html_container=NULL; this->html_depth=0; this->html_anchor=anchor; this->html_anchor_found=0; this->form=NULL; this->keyboard_required=0; this->editable=NULL; callback_list_call_attr_2(this->cbl,attr_gui,anchor,&doc); gui_internal_html_parse_text(this, doc); g_free(doc); if (this->keyboard_required && this->keyboard) { this->html_container->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; gui_internal_widget_append(this->html_container, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); } gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_html.h000066400000000000000000000005721264204753600233260ustar00rootroot00000000000000void gui_internal_html_main_menu(struct gui_priv *this); void gui_internal_html_load_href(struct gui_priv *this, char *href, int replace); void gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data); void gui_internal_html_parse_text(struct gui_priv *this, char *doc); void gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor); navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_keyboard.c000066400000000000000000000361461264204753600241630ustar00rootroot00000000000000#include #include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" void gui_internal_keyboard_to_upper_case(struct gui_priv *this) { struct menu_data *md; md=gui_internal_menu_data(this); // Switch to lowercase after the first key is pressed if (md->keyboard_mode == 10) // Latin gui_internal_keyboard_do(this, md->keyboard, 2); if (md->keyboard_mode == 34) // Umlaut gui_internal_keyboard_do(this, md->keyboard, 26); if (md->keyboard_mode == 50) // Russian/Ukrainian/Belorussian gui_internal_keyboard_do(this, md->keyboard, 42); } void gui_internal_keyboard_to_lower_case(struct gui_priv *this) { struct menu_data *md; md=gui_internal_menu_data(this); // Switch to lowercase after the first key is pressed if (md->keyboard_mode == (VKBD_LATIN_UPPER | VKBD_FLAG_2)) // Latin gui_internal_keyboard_do(this, md->keyboard, VKBD_LATIN_LOWER | VKBD_FLAG_2); if (md->keyboard_mode == (VKBD_UMLAUT_UPPER | VKBD_FLAG_2)) // Umlaut gui_internal_keyboard_do(this, md->keyboard, VKBD_UMLAUT_LOWER | VKBD_FLAG_2); if (md->keyboard_mode == (VKBD_CYRILLIC_UPPER | VKBD_FLAG_2)) // Russian/Ukrainian/Belorussian gui_internal_keyboard_do(this, md->keyboard, VKBD_CYRILLIC_LOWER | VKBD_FLAG_2); } /** * @brief Processes a key press on the internal GUI keyboard * * If the keyboard is currently in uppercase mode and {@code VKBD_MODE_2} is set, it is then switched to * the corresponding lowercase mode. * * @param this The internal GUI instance * @param wm * @param data Not used */ static void gui_internal_cmd_keypress(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_keypress_do(this, (char *) wm->data); } static struct widget * gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char *text, int font, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data, void (*data_free)(void *data), int w, int h) { struct widget *wk; gui_internal_widget_append(wkbd, wk=gui_internal_button_font_new_with_callback(this, text, font, NULL, gravity_center|orientation_vertical, func, data)); wk->data_free=data_free; wk->background=this->background; wk->bl=0; wk->br=0; wk->bt=0; wk->bb=0; wk->w=w; wk->h=h; return wk; } static struct widget * gui_internal_keyboard_key(struct gui_priv *this, struct widget *wkbd, char *text, char *key, int w, int h) { return gui_internal_keyboard_key_data(this, wkbd, text, 0, gui_internal_cmd_keypress, g_strdup(key), g_free_func,w,h); } static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data); /** * @struct gui_internal_keyb_mode * @brief Describes a keyboard mode */ /** * @var gui_internal_keyb_modes * @brief A list of all available keyboard modes */ struct gui_internal_keyb_mode { char title[16]; /**< Label to be displayed on keys that switch to it */ int font; /**< Font size of label */ int case_mode; /**< Mode to switch to when case CHANGE() key is pressed. */ int umlaut_mode; /**< Mode to switch to when UMLAUT() key is pressed. */ } gui_internal_keyb_modes[]= { /* 0: VKBD_LATIN_UPPER */ {"ABC", 2, VKBD_LATIN_LOWER, VKBD_UMLAUT_UPPER}, /* 8: VKBD_LATIN_LOWER */ {"abc", 2, VKBD_LATIN_UPPER, VKBD_UMLAUT_LOWER}, /*16: VKBD_NUMERIC */ {"123", 2, VKBD_LATIN_UPPER, VKBD_UMLAUT_UPPER}, /*24: VKBD_UMLAUT_UPPER */ {"ÄÖÜ", 2, VKBD_UMLAUT_LOWER, VKBD_LATIN_UPPER}, /*32: VKBD_UMLAUT_LOWER */ {"äöü", 2, VKBD_UMLAUT_UPPER, VKBD_LATIN_LOWER}, /*40: VKBD_CYRILLIC_UPPER*/ {"АБВ", 2, VKBD_CYRILLIC_UPPER, VKBD_LATIN_UPPER}, /*48: VKBD_CYRILLIC_LOWER*/ {"абв", 2, VKBD_CYRILLIC_UPPER, VKBD_LATIN_LOWER}, /*56: VKBD_DEGREE */ {"DEG", 2, VKBD_FLAG_2, VKBD_FLAG_2} }; // Some macros that make the keyboard layout easier to visualise in // the source code. The macros are #undef'd after this function. #define KEY(x) gui_internal_keyboard_key(this, wkbd, (x), (x), max_w, max_h) #define SPACER() gui_internal_keyboard_key_data(this, wkbd, "", 0, NULL, NULL, NULL,max_w,max_h) #define MODE(x) gui_internal_keyboard_key_data(this, wkbd, \ gui_internal_keyb_modes[(x)/8].title, \ gui_internal_keyb_modes[(x)/8].font, \ gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h) \ -> datai = (mode & VKBD_MASK_7) | ((x) & VKBD_LAYOUT_MASK) #define SWCASE() MODE(gui_internal_keyb_modes[mode/8].case_mode) #define UMLAUT() MODE(gui_internal_keyb_modes[mode/8].umlaut_mode) /** * @brief Creates a new keyboard widget or switches the layout of an existing widget * * This is an internal helper function that is not normally called directly. To create a new keyboard * widget, GUI widgets should call {@link gui_internal_keyboard(struct gui_priv *, struct widget *, int)}. * * @param this The internal GUI instance * @param wkbdb The existing keyboard widget whose layout is to be switched, or {@code NULL} to create a * new keyboard widget * @param mode The new keyboard mode, see {@link gui_internal_keyboard(struct gui_priv *, struct widget *, int)} * for a description of possible values * * @return {@code wkbdb} if a non-NULL value was passed, else a new keyboard widget will be returned. */ struct widget * gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) { struct widget *wkbd,*wk; struct menu_data *md=gui_internal_menu_data(this); int i, max_w=this->root.w, max_h=this->root.h; int render=0; char *space="_"; char *backspace="←"; char *hide="▼"; char *unhide="▲"; if (wkbdb) { this->current.x=-1; this->current.y=-1; gui_internal_highlight(this); if (md->keyboard_mode & VKBD_FLAG_1024) render=2; else render=1; gui_internal_widget_children_destroy(this, wkbdb); } else wkbdb=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); md->keyboard=wkbdb; md->keyboard_mode=mode; wkbd=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); wkbd->background=this->background; wkbd->cols=8; wkbd->spx=0; wkbd->spy=0; max_w=max_w/8; max_h=max_h/8; // Allows 3 results in the list when searching for Towns wkbd->p.y=max_h*2; if (((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_UPPER) || ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_LOWER)) { // Russian/Ukrainian/Belarussian layout needs more space... max_h=max_h*4/5; max_w=max_w*8/9; wkbd->cols=9; } if ((mode & VKBD_LAYOUT_MASK) == VKBD_LATIN_UPPER) { for (i = 0 ; i < 26 ; i++) { char text[]={'A'+i,'\0'}; KEY(text); } gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); if (!(mode & VKBD_MASK_7)) { KEY("-"); KEY("'"); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; } else { wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; SWCASE(); MODE(VKBD_NUMERIC); } UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if ((mode & VKBD_LAYOUT_MASK) == VKBD_LATIN_LOWER) { for (i = 0 ; i < 26 ; i++) { char text[]={'a'+i,'\0'}; KEY(text); } gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); if (!(mode & VKBD_MASK_7)) { KEY("-"); KEY("'"); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; } else { wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; SWCASE(); MODE(VKBD_NUMERIC); } UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if ((mode & VKBD_LAYOUT_MASK) == VKBD_NUMERIC) { for (i = 0 ; i < 10 ; i++) { char text[]={'0'+i,'\0'}; KEY(text); } /* ("8") ("9")*/KEY("."); KEY("°"); KEY("'"); KEY("\"");KEY("-"); KEY("+"); KEY("*"); KEY("/"); KEY("("); KEY(")"); KEY("="); KEY("?"); KEY(":"); SPACER(); if (!(mode & VKBD_MASK_7)) { SPACER(); KEY("-"); KEY("'"); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; SPACER(); SPACER(); } else { SPACER(); MODE(VKBD_CYRILLIC_UPPER); MODE(VKBD_CYRILLIC_LOWER); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; MODE(VKBD_LATIN_UPPER); MODE(VKBD_LATIN_LOWER); } UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if ((mode & VKBD_LAYOUT_MASK) == VKBD_UMLAUT_UPPER) { KEY("Ä"); KEY("Ë"); KEY("Ï"); KEY("Ö"); KEY("Ü"); KEY("Æ"); KEY("Ø"); KEY("Å"); KEY("Á"); KEY("É"); KEY("Í"); KEY("Ó"); KEY("Ú"); KEY("Š"); KEY("Č"); KEY("Ž"); KEY("À"); KEY("È"); KEY("Ì"); KEY("Ò"); KEY("Ù"); KEY("Ś"); KEY("Ć"); KEY("Ź"); KEY("Â"); KEY("Ê"); KEY("Î"); KEY("Ô"); KEY("Û"); SPACER(); UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if ((mode & VKBD_LAYOUT_MASK) == VKBD_UMLAUT_LOWER) { KEY("ä"); KEY("ë"); KEY("ï"); KEY("ö"); KEY("ü"); KEY("æ"); KEY("ø"); KEY("å"); KEY("á"); KEY("é"); KEY("í"); KEY("ó"); KEY("ú"); KEY("š"); KEY("č"); KEY("ž"); KEY("à"); KEY("è"); KEY("ì"); KEY("ò"); KEY("ù"); KEY("ś"); KEY("ć"); KEY("ź"); KEY("â"); KEY("ê"); KEY("î"); KEY("ô"); KEY("û"); KEY("ß"); UMLAUT(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_UPPER) { KEY("А"); KEY("Б"); KEY("В"); KEY("Г"); KEY("Д"); KEY("Е"); KEY("Ж"); KEY("З"); KEY("И"); KEY("Й"); KEY("К"); KEY("Л"); KEY("М"); KEY("Н"); KEY("О"); KEY("П"); KEY("Р"); KEY("С"); KEY("Т"); KEY("У"); KEY("Ф"); KEY("Х"); KEY("Ц"); KEY("Ч"); KEY("Ш"); KEY("Щ"); KEY("Ъ"); KEY("Ы"); KEY("Ь"); KEY("Э"); KEY("Ю"); KEY("Я"); KEY("Ё"); KEY("І"); KEY("Ї"); KEY("Ў"); SPACER(); SPACER(); SPACER(); gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; SWCASE(); MODE(VKBD_NUMERIC); SPACER(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if ((mode & VKBD_LAYOUT_MASK) == VKBD_CYRILLIC_LOWER) { KEY("а"); KEY("б"); KEY("в"); KEY("г"); KEY("д"); KEY("е"); KEY("ж"); KEY("з"); KEY("и"); KEY("й"); KEY("к"); KEY("л"); KEY("м"); KEY("н"); KEY("о"); KEY("п"); KEY("р"); KEY("с"); KEY("т"); KEY("у"); KEY("ф"); KEY("х"); KEY("ц"); KEY("ч"); KEY("ш"); KEY("щ"); KEY("ъ"); KEY("ы"); KEY("ь"); KEY("э"); KEY("ю"); KEY("я"); KEY("ё"); KEY("і"); KEY("ї"); KEY("ў"); SPACER(); SPACER(); SPACER(); gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; SWCASE(); MODE(VKBD_NUMERIC); SPACER(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if(md->search_list && md->search_list->type==widget_table) { struct table_data *td=(struct table_data*)(md->search_list->data); td->scroll_buttons.button_box_hide = !(mode & VKBD_FLAG_1024); } if ((mode & VKBD_LAYOUT_MASK) == VKBD_DEGREE) { /* special case for coordinates input screen (enter_coord) */ KEY("0"); KEY("1"); KEY("2"); KEY("3"); KEY("4"); SPACER(); KEY("N"); KEY("S"); KEY("5"); KEY("6"); KEY("7"); KEY("8"); KEY("9"); SPACER(); KEY("E"); KEY("W"); KEY("°"); KEY("."); KEY("'"); gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); SPACER(); wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai = mode | VKBD_FLAG_1024; SPACER(); gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode & VKBD_FLAG_1024) { char *text=NULL; int font=0; struct widget *wkl; mode &= ~VKBD_FLAG_1024; text=gui_internal_keyb_modes[mode/8].title; font=gui_internal_keyb_modes[mode/8].font; wk=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_fill); wk->func=gui_internal_keyboard_change; wk->data=wkbdb; wk->background=this->background; wk->bl=0; wk->br=0; wk->bt=0; wk->bb=0; wk->w=max_w; wk->h=max_h; wk->datai=mode; wk->state |= STATE_SENSITIVE; gui_internal_widget_append(wk, wkl=gui_internal_label_new(this, unhide)); wkl->background=NULL; gui_internal_widget_append(wk, wkl=gui_internal_label_font_new(this, text, font)); wkl->background=NULL; gui_internal_widget_append(wkbd, wk); if (render) render=2; } gui_internal_widget_append(wkbdb, wkbd); if (render == 1) { gui_internal_widget_pack(this, wkbdb); gui_internal_widget_render(this, wkbdb); } else if (render == 2) { gui_internal_menu_reset_pack(this); gui_internal_menu_render(this); } return wkbdb; } #undef KEY #undef SPACER #undef SWCASE #undef UMLAUT #undef MODE /** * @brief Creates a keyboard widget. * * This function creates a widget to display the internal GUI keyboard. * * The {@code mode} argument specifies the type of keyboard which should initially be displayed. Refer * to {@link enum vkbd_mode} for a list of possible modes and their meaning. * * @param this The internal GUI instance * @param mode The mode for the keyboard * * @return A new keyboard widget */ struct widget * gui_internal_keyboard(struct gui_priv *this, int mode) { if (! this->keyboard) return NULL; return gui_internal_keyboard_do(this, NULL, mode); } static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data) { gui_internal_keyboard_do(this, key->data, key->datai); } /** * @brief Returns the default keyboard mode for a country. * * The return value can be passed to {@link gui_internal_keyboard(struct gui_priv *, int)} and related * functions. * * @param lang The two-letter country code * * @return {@code VKBD_CYRILLIC_UPPER} for countries using the Cyrillic alphabet, * {@code VKBD_LATIN_UPPER} otherwise */ int gui_internal_keyboard_init_mode(char *lang) { int ret=0; /* Converting to upper case here is required for Android */ lang=g_ascii_strup(lang,-1); /* * Set cyrillic keyboard for countries using Cyrillic alphabet */ if (strstr(lang,"RU")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"UA")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"BY")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"RS")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"BG")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"MK")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"KZ")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"KG")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"TJ")) ret = VKBD_CYRILLIC_UPPER; else if (strstr(lang,"MN")) ret = VKBD_CYRILLIC_UPPER; g_free(lang); return ret; } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_keyboard.h000066400000000000000000000027271264204753600241660ustar00rootroot00000000000000/** * Modes for the on-screen keyboard */ enum vkbd_mode { /* layouts */ VKBD_LATIN_UPPER = 0, /*!< Latin uppercase characters */ VKBD_LATIN_LOWER = 8, /*!< Latin lowercase characters */ VKBD_NUMERIC = 16, /*!< Numeric keyboard */ VKBD_UMLAUT_UPPER = 24, /*!< Extended Latin uppercase characters */ VKBD_UMLAUT_LOWER = 32, /*!< Extended Latin lowercase characters */ VKBD_CYRILLIC_UPPER = 40, /*!< Cyrillic uppercase characters */ VKBD_CYRILLIC_LOWER = 48, /*!< Cyrillic lowercase characters */ VKBD_DEGREE = 56, /*!< Numeric keyboard with extra characters (NESW, degree, minute) for coordinate input */ /* modifiers and masks */ VKBD_FLAG_2 = 2, /* FIXME seems to show alpha/num switch (VKBD_NUMERIC and VKBD_LATIN_* only) and switches to lowercase after first character */ VKBD_MASK_7 = 7, /* FIXME modifiers for layout? */ VKBD_FLAG_1024 = 1024, /* FIXME what is this for? Seems to have to do something with scroll box visibility */ VKBD_LAYOUT_MASK = ~7, /* when XORed with the mode, preserves only the layout FIXME document properly */ }; /* prototypes */ struct gui_priv; struct widget; struct widget *gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode); struct widget *gui_internal_keyboard(struct gui_priv *this, int mode); int gui_internal_keyboard_init_mode(char *lang); void gui_internal_keyboard_to_upper_case(struct gui_priv *this); void gui_internal_keyboard_to_lower_case(struct gui_priv *this); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_menu.c000066400000000000000000000217461264204753600233270ustar00rootroot00000000000000#include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "xmlconfig.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_search.h" #include "gui_internal_menu.h" extern char *version; static void gui_internal_menu_destroy(struct gui_priv *this, struct widget *w) { struct menu_data *menu_data=w->menu_data; if (menu_data) { if (menu_data->refresh_callback_obj.type) { struct object_func *func; func=object_func_lookup(menu_data->refresh_callback_obj.type); if (func && func->remove_attr) func->remove_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); } if (menu_data->refresh_callback.u.callback) callback_destroy(menu_data->refresh_callback.u.callback); g_free(menu_data->href); g_free(menu_data); } gui_internal_widget_destroy(this, w); this->root.children=g_list_remove(this->root.children, w); } static void gui_internal_prune_menu_do(struct gui_priv *this, struct widget *w, int render) { GList *l; struct widget *wr,*wd; gui_internal_search_idle_end(this); while ((l = g_list_last(this->root.children))) { wd=l->data; if (wd == w) { void (*redisplay)(struct gui_priv *priv, struct widget *widget, void *data); if (!render) return; gui_internal_say(this, w, 0); redisplay=w->menu_data->redisplay; wr=w->menu_data->redisplay_widget; if (!w->menu_data->redisplay && !w->menu_data->href) { gui_internal_widget_render(this, w); return; } if (redisplay) { gui_internal_menu_destroy(this, w); redisplay(this, wr, wr->data); } else { char *href=g_strdup(w->menu_data->href); gui_internal_menu_destroy(this, w); gui_internal_html_load_href(this, href, 0); g_free(href); } return; } gui_internal_menu_destroy(this, wd); } } void gui_internal_prune_menu(struct gui_priv *this, struct widget *w) { gui_internal_prune_menu_do(this, w, 1); } void gui_internal_prune_menu_count(struct gui_priv *this, int count, int render) { GList *l=g_list_last(this->root.children); struct widget *w=NULL; while (l && count-- > 0) l=g_list_previous(l); if (l) { w=l->data; gui_internal_prune_menu_do(this, w, render); } } struct widget * gui_internal_menu(struct gui_priv *this, const char *label) { struct widget *menu,*w,*w1,*topbox; gui_internal_search_idle_end(this); topbox=gui_internal_box_new_with_label(this, 0, label); topbox->w=this->root.w; topbox->h=this->root.h; gui_internal_widget_append(&this->root, topbox); menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); menu->w=this->root.w; menu->h=this->root.h; menu->background=this->background; gui_internal_apply_config(this); topbox->menu_data=g_new0(struct menu_data, 1); gui_internal_widget_append(topbox, menu); w=gui_internal_top_bar(this); gui_internal_widget_append(menu, w); w=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); w->spx=4*this->spacing; w->w=menu->w; gui_internal_widget_append(menu, w); if (this->flags & 16 && !(this->flags & 1024)) { struct widget *wlb,*wb,*wm=w; wm->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; w=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_expand|flags_fill); dbg(lvl_info,"topbox->menu_data=%p\n", topbox->menu_data); gui_internal_widget_append(wm, w); wb=gui_internal_box_new(this, gravity_right_center|orientation_horizontal|flags_fill); wb->bl=6; wb->br=6; wb->bb=6; wb->bt=6; wb->spx=6; topbox->menu_data->button_bar=wb; gui_internal_widget_append(wm, wb); wlb=gui_internal_button_label(this,_("Back"),1); wlb->func=gui_internal_back; wlb->state |= STATE_SENSITIVE; } if (this->flags & 192) { menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); menu->w=this->root.w; menu->h=this->root.h; w1=gui_internal_time_help(this); gui_internal_widget_append(menu, w1); w1=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); gui_internal_widget_append(menu, w1); gui_internal_widget_append(topbox, menu); menu->background=NULL; } gui_internal_widget_pack(this, topbox); gui_internal_widget_reset_pack(this, topbox); topbox->w=this->root.w; topbox->h=this->root.h; menu->w=this->root.w; menu->h=this->root.h; return w; } struct menu_data * gui_internal_menu_data(struct gui_priv *this) { GList *l; struct widget *menu; l=g_list_last(this->root.children); menu=l->data; return menu->menu_data; } void gui_internal_menu_reset_pack(struct gui_priv *this) { GList *l; struct widget *top_box; l=g_list_last(this->root.children); top_box=l->data; gui_internal_widget_reset_pack(this, top_box); } void gui_internal_menu_render(struct gui_priv *this) { GList *l; struct widget *menu; l=g_list_last(this->root.children); menu=l->data; gui_internal_say(this, menu, 0); gui_internal_widget_pack(this, menu); gui_internal_widget_render(this, menu); } struct widget * gui_internal_top_bar(struct gui_priv *this) { struct widget *w,*wm,*wh,*wc,*wcn; int dots_len, sep_len; GList *res=NULL,*l; int width,width_used=0,use_sep=0,incomplete=0; struct graphics_gc *foreground=(this->flags & 256 ? this->background : this->text_foreground); /* flags 1:Don't expand bar to screen width 2:Don't show Map Icon 4:Don't show Home Icon 8:Show only current menu 16:Don't use menu titles as button 32:Show navit version 64:Show time 128:Show help 256:Use background for menu headline 512:Set osd_configuration and zoom to route when setting position 1024:Don't show back button 2048:No highlighting of keyboard 4096:Center menu title */ w=gui_internal_box_new(this, (this->flags & 4096 ? gravity_center : gravity_left_center)|orientation_horizontal|(this->flags & 1 ? 0:flags_fill)); w->bl=this->spacing; w->spx=this->spacing; w->background=this->background2; if ((this->flags & 6) == 6) { w->bl=10; w->br=10; w->bt=6; w->bb=6; } width=this->root.w-w->bl; if (! (this->flags & 2)) { wm=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, "gui_map"), gravity_center|orientation_vertical, gui_internal_cmd_return, NULL); wm->speech=g_strdup(_("Back to map")); gui_internal_widget_pack(this, wm); gui_internal_widget_append(w, wm); width-=wm->w; } if (! (this->flags & 4)) { wh=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, "gui_home"), gravity_center|orientation_vertical, gui_internal_cmd_main_menu, NULL); wh->speech=g_strdup(_("Main Menu")); gui_internal_widget_pack(this, wh); gui_internal_widget_append(w, wh); width-=wh->w; } if (!(this->flags & 6)) width-=w->spx; l=g_list_last(this->root.children); wcn=gui_internal_label_new(this,".. »"); wcn->foreground=foreground; dots_len=wcn->w; gui_internal_widget_destroy(this, wcn); wcn=gui_internal_label_new(this,"»"); wcn->foreground=foreground; sep_len=wcn->w; gui_internal_widget_destroy(this, wcn); while (l) { if (g_list_previous(l) || !g_list_next(l)) { wc=l->data; wcn=gui_internal_label_new(this, wc->text); wcn->foreground=foreground; if (g_list_next(l)) use_sep=1; else use_sep=0; dbg(lvl_debug,"%d (%s) + %d + %d + %d > %d\n", wcn->w, wc->text, width_used, w->spx, use_sep ? sep_len : 0, width); if (wcn->w + width_used + w->spx + (use_sep ? sep_len : 0) + (g_list_previous(l) ? dots_len : 0) > width) { incomplete=1; gui_internal_widget_destroy(this, wcn); break; } if (use_sep) { struct widget *wct=gui_internal_label_new(this, "»"); wct->foreground=foreground; res=g_list_prepend(res, wct); width_used+=sep_len+w->spx; } width_used+=wcn->w; if (!(this->flags & 16)) { wcn->func=gui_internal_cmd_return; wcn->data=wc; wcn->state |= STATE_SENSITIVE; } res=g_list_prepend(res, wcn); if (this->flags & 8) break; } l=g_list_previous(l); } if (incomplete) { if (! res) { wcn=gui_internal_label_new_abbrev(this, wc->text, width-width_used-w->spx-dots_len); wcn->foreground=foreground; wcn->func=gui_internal_cmd_return; wcn->data=wc; wcn->state |= STATE_SENSITIVE; res=g_list_prepend(res, wcn); l=g_list_previous(l); wc=l?l->data:NULL; } if(wc) { wcn=gui_internal_label_new(this, ".. »"); wcn->foreground=foreground; wcn->func=gui_internal_cmd_return; wcn->data=wc; wcn->state |= STATE_SENSITIVE; res=g_list_prepend(res, wcn); } } l=res; while (l) { gui_internal_widget_append(w, l->data); l=g_list_next(l); } if (this->flags & 32) { char *version_text=g_strdup_printf("Navit %s",version); wcn=gui_internal_label_new(this, version_text); g_free(version_text); wcn->flags=gravity_right_center|flags_expand; gui_internal_widget_append(w, wcn); } #if 0 if (dots) gui_internal_widget_destroy(this, dots); #endif return w; } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_menu.h000066400000000000000000000010551264204753600233230ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct menu_data; struct widget; void gui_internal_prune_menu(struct gui_priv *this, struct widget *w); void gui_internal_prune_menu_count(struct gui_priv *this, int count, int render); struct widget *gui_internal_menu(struct gui_priv *this, const char *label); struct menu_data *gui_internal_menu_data(struct gui_priv *this); void gui_internal_menu_reset_pack(struct gui_priv *this); void gui_internal_menu_render(struct gui_priv *this); struct widget *gui_internal_top_bar(struct gui_priv *this); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_poi.c000066400000000000000000000607041264204753600231470ustar00rootroot00000000000000#include #include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "mapset.h" #include "layout.h" #include "route.h" #include "transform.h" #include "linguistics.h" #include "fib.h" #include "util.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_poi.h" struct item_data { int dist; char *label; struct item item; struct coord c; }; struct selector { char *icon; char *name; enum item_type *types; }; static enum item_type selectors_BankTypes[]={type_poi_bank,type_poi_bank, type_poi_atm,type_poi_atm, type_none}; static enum item_type selectors_FuelTypes[]={type_poi_fuel,type_poi_fuel,type_none}; static enum item_type selectors_HotelTypes[]={type_poi_hotel,type_poi_camp_rv,type_poi_camping,type_poi_camping, type_poi_resort,type_poi_resort,type_poi_motel,type_poi_hostel,type_none}; static enum item_type selectors_RestaurantTypes[]={type_poi_bar,type_poi_picnic,type_poi_burgerking,type_poi_fastfood, type_poi_restaurant,type_poi_restaurant,type_poi_cafe,type_poi_cafe,type_poi_pub,type_poi_pub,type_none}; static enum item_type selectors_ShoppingTypes[]={type_poi_mall,type_poi_mall,type_poi_shop_grocery,type_poi_shop_grocery, type_poi_shopping,type_poi_shopping,type_poi_shop_butcher,type_poi_shop_baker,type_poi_shop_fruit, type_poi_shop_fruit,type_poi_shop_beverages,type_poi_shop_beverages,type_none}; static enum item_type selectors_ServiceTypes[]={type_poi_marina,type_poi_marina,type_poi_hospital,type_poi_hospital, type_poi_public_utilities,type_poi_public_utilities,type_poi_police,type_poi_autoservice,type_poi_information, type_poi_information,type_poi_pharmacy,type_poi_pharmacy,type_poi_personal_service,type_poi_repair_service, type_poi_restroom,type_poi_restroom,type_none}; static enum item_type selectors_ParkingTypes[]={type_poi_car_parking,type_poi_car_parking,type_none}; static enum item_type selectors_LandFeaturesTypes[]={type_poi_land_feature,type_poi_rock,type_poi_dam,type_poi_dam, type_poi_peak,type_poi_peak,type_none}; static enum item_type selectors_OtherTypes[]={type_point_unspecified,type_poi_land_feature-1,type_poi_rock+1,type_poi_fuel-1, type_poi_marina+1,type_poi_shopping-1,type_poi_shopping+1,type_poi_car_parking-1,type_poi_car_parking+1, type_poi_bar-1,type_poi_bank+1,type_poi_dam-1,type_poi_dam+1,type_poi_information-1,type_poi_information+1, type_poi_mall-1,type_poi_mall+1,type_poi_personal_service-1,type_poi_pharmacy+1,type_poi_repair_service-1, type_poi_repair_service+1,type_poi_restaurant-1,type_poi_restaurant+1,type_poi_restroom-1,type_poi_restroom+1, type_poi_shop_grocery-1,type_poi_shop_grocery+1,type_poi_peak-1,type_poi_peak+1,type_poi_motel-1,type_poi_hostel+1, type_poi_shop_butcher-1,type_poi_shop_baker+1,type_poi_shop_fruit-1,type_poi_shop_fruit+1,type_poi_shop_beverages-1, type_poi_shop_beverages+1,type_poi_pub-1,type_poi_atm+1,type_line-1,type_none}; /*static enum item_type selectors_UnknownTypes[]={type_point_unkn,type_point_unkn,type_none};*/ struct selector selectors[]={ {"bank","Bank",selectors_BankTypes}, {"fuel","Fuel",selectors_FuelTypes}, {"hotel","Hotel",selectors_HotelTypes}, {"restaurant","Restaurant",selectors_RestaurantTypes}, {"shopping","Shopping",selectors_ShoppingTypes}, {"hospital","Service",selectors_ServiceTypes}, {"parking","Parking",selectors_ParkingTypes}, {"peak","Land Features",selectors_LandFeaturesTypes}, {"unknown","Other",selectors_OtherTypes}, /* {"unknown","Unknown",selectors_UnknownTypes},*/ }; /** * @brief Get icon for given POI type. * * @param this pointer to gui context * @param type POI type * @return Pointer to graphics_image object, or NULL if no picture available. */ static struct graphics_image * gui_internal_poi_icon(struct gui_priv *this, struct item *item) { struct attr layout; struct attr icon_src; GList *layer; navit_get_attr(this->nav, attr_layout, &layout, NULL); layer=layout.u.layout->layers; while(layer) { GList *itemgra=((struct layer *)layer->data)->itemgras; while(itemgra) { GList *types=((struct itemgra *)itemgra->data)->type; while(types) { if((long)types->data==item->type) { GList *element=((struct itemgra *)itemgra->data)->elements; while(element) { struct element * el=element->data; if(el->type==element_icon) { char *src; char *icon; struct graphics_image *img; if(item_is_custom_poi(*item)) { struct map_rect *mr=map_rect_new(item->map, NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if(item_attr_get(item, attr_icon_src, &icon_src)) { src=el->u.icon.src; if(!src || !src[0]) src="%s"; icon=g_strdup_printf(src,map_convert_string_tmp(item->map,icon_src.u.str)); } else { icon=g_strdup(el->u.icon.src); } } else { icon=g_strdup(el->u.icon.src); } char *dot=g_strrstr(icon,"."); dbg(lvl_debug,"%s %s\n", item_to_name(item->type),icon); if(dot) *dot=0; img=image_new_xs(this,icon); g_free(icon); if(img) return img; } element=g_list_next(element); } } types=g_list_next(types); } itemgra=g_list_next(itemgra); } layer=g_list_next(layer); } return NULL; } /** * @brief Free poi_param structure. * * @param p reference to the object to be freed. */ void gui_internal_poi_param_free(void *p) { if(((struct poi_param *)p)->filterstr) g_free(((struct poi_param *)p)->filterstr); if(((struct poi_param *)p)->filter) g_list_free(((struct poi_param *)p)->filter); g_free(p); }; /** * @brief Clone poi_param structure. * * @param p reference to the object to be cloned. * @return Cloned object reference. */ static struct poi_param * gui_internal_poi_param_clone(struct poi_param *p) { struct poi_param *r=g_new(struct poi_param,1); GList *l=p->filter; memcpy(r,p,sizeof(struct poi_param)); r->filter=NULL; r->filterstr=NULL; if(p->filterstr) { char *last=g_list_last(l)->data; int len=(last - p->filterstr) + strlen(last)+1; r->filterstr=g_memdup(p->filterstr,len); } while(l) { r->filter=g_list_append(r->filter, r->filterstr + ((char*)(l->data) - p->filterstr) ); l=g_list_next(l); } return r; }; /** * @brief Set POIs filter data in poi_param structure. * @param param poi_param structure with unset filter data. * @param text filter text. */ void gui_internal_poi_param_set_filter(struct poi_param *param, char *text) { char *s1, *s2; param->filterstr=removecase(text); s1=param->filterstr; do { s2=g_utf8_strchr(s1,-1,' '); if(s2) *s2++=0; param->filter=g_list_append(param->filter,s1); if(s2) { while(*s2==' ') s2++; } s1=s2; } while(s2 && *s2); } static struct widget * gui_internal_cmd_pois_selector(struct gui_priv *this, struct pcoord *c, int pagenb) { struct widget *wl,*wb; int nitems,nrows; int i; //wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal_vertical|flags_fill); wl->background=this->background; wl->w=this->root.w; wl->cols=this->root.w/this->icon_s; nitems=sizeof(selectors)/sizeof(struct selector); nrows=nitems/wl->cols + (nitems%wl->cols>0); wl->h=this->icon_l*nrows; for (i = 0 ; i < nitems ; i++) { struct poi_param *p=g_new0(struct poi_param,1); p->sel = 1; p->selnb = i; p->pagenb = pagenb; p->dist = 0; p->filter=NULL; p->filterstr=NULL; gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, selectors[i].icon), gravity_left_center|orientation_vertical, gui_internal_cmd_pois, p)); wb->c=*c; wb->data_free=gui_internal_poi_param_free; wb->bt=10; } gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL, image_new_s(this, "gui_search"), gravity_left_center|orientation_vertical, gui_internal_cmd_pois_filter, NULL)); wb->c=*c; wb->bt=10; gui_internal_widget_pack(this,wl); return wl; } /** * @brief Widget to display POI item. * * @param this pointer to gui context * @param center reference to the standing point where angle to be counted from * @param item POI item reference * @param c POI coordinates * @param dist precomputed distance to POI (or -1 if it's not to be displayed) * @param name POI name * @return Pointer to new widget. */ static void format_dist(int dist, char *distbuf) { if (dist > 10000) sprintf(distbuf,"%d ", dist/1000); else if (dist>0) sprintf(distbuf,"%d.%d ", dist/1000, (dist%1000)/100); } struct widget * gui_internal_cmd_pois_item(struct gui_priv *this, struct coord *center, struct item *item, struct coord *c, struct route *route, int dist, char* name) { char distbuf[32]=""; char dirbuf[32]=""; char routedistbuf[32]=""; char *type; struct widget *wl; char *text; struct graphics_image *icon; format_dist(dist,distbuf); if(c) { int len; get_compass_direction(dirbuf, transform_get_angle_delta(center, c, 0), 1); len=strlen(dirbuf); dirbuf[len]=' '; dirbuf[len+1]=0; if (route) { route_get_distances(route, c, 1, &dist); if (dist != INT_MAX) format_dist(dist, routedistbuf); } } type=item_to_name(item->type); icon=gui_internal_poi_icon(this,item); if(!icon && item->type==type_house_number) icon=image_new_xs(this,"post"); if(!icon) { icon=image_new_xs(this,"gui_inactive"); text=g_strdup_printf("%s%s%s%s %s", distbuf, dirbuf, routedistbuf, type, name); } else if(strlen(name)>0) text=g_strdup_printf("%s%s%s%s", distbuf, dirbuf, routedistbuf, name); else text=g_strdup_printf("%s%s%s%s", distbuf, dirbuf, routedistbuf, type); wl=gui_internal_button_new_with_callback(this, text, icon, gravity_left_center|orientation_horizontal|flags_fill, NULL, NULL); wl->datai=dist; g_free(text); if (name[0]) { wl->name=g_strdup_printf("%s %s",type,name); } else { wl->name=g_strdup(type); } wl->func=gui_internal_cmd_position; wl->data=(void *)9; wl->item=*item; wl->state|= STATE_SENSITIVE; return wl; } /** * @brief Get string representation of item address suitable for doing search and for display in POI list. * * @param item reference to item. * @return Pointer to string representation of address. To be g_free()d after use. */ char * gui_internal_compose_item_address_string(struct item *item, int prependPostal) { char *s=g_strdup(""); struct attr attr; if(prependPostal && item_attr_get(item, attr_postal, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_house_number, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_street_name, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_street_name_systematic, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_district_name, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_town_name, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_county_name, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_country_name, &attr)) s=g_strjoin(" ",s,map_convert_string_tmp(item->map,attr.u.str),NULL); if(item_attr_get(item, attr_address, &attr)) s=g_strjoin(" ",s,"|",map_convert_string_tmp(item->map,attr.u.str),NULL); return s; } static int gui_internal_cmd_pois_item_selected(struct poi_param *param, struct item *item) { enum item_type *types; struct selector *sel = param->sel? &selectors[param->selnb]: NULL; enum item_type type=item->type; struct attr attr; int match=0; if (type >= type_line && param->filter==NULL) return 0; if (! sel || !sel->types) { match=1; } else { types=sel->types; while (*types != type_none) { if (item->type >= types[0] && item->type <= types[1]) { return 1; } types+=2; } } if(type == type_house_number && !param->filter) return 0; if (param->filter) { char *long_name, *s; GList *f; int i; if (param->AddressFilterType>0) { s=gui_internal_compose_item_address_string(item,param->AddressFilterType==2?1:0); } else if (item_attr_get(item, attr_label, &attr)) { s=g_strdup_printf("%s %s", item_to_name(item->type), map_convert_string_tmp(item->map,attr.u.str)); } else { s=g_strdup(item_to_name(item->type)); } long_name=removecase(s); g_free(s); match=0; for(i=0;i<3 && !match;i++) { char *long_name_exp=linguistics_expand_special(long_name, i); for(s=long_name_exp,f=param->filter;f && s;f=g_list_next(f)) { s=strstr(s,f->data); if(!s) { break; } s=g_utf8_strchr(s,-1,' '); } g_free(long_name_exp); if(!f) match=1; } g_free(long_name); } return match; } /** * @brief Event handler for POIs list "more" element. * * @param this The graphics context. * @param wm called widget. * @param data event data. */ static void gui_internal_cmd_pois_more(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w=g_new0(struct widget,1); w->data=wm->data; w->c=wm->c; w->w=wm->w; wm->data_free=NULL; gui_internal_back(this, NULL, NULL); gui_internal_cmd_pois(this, w, w->data); free(w); } /** * @brief Event to apply POIs text filter. * * @param this The graphics context. * @param wm called widget. * @param data event data (pointer to editor widget containg filter text). */ static void gui_internal_cmd_pois_filter_do(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w=data; struct poi_param *param; if(!w->text) return; if(w->data) { param=gui_internal_poi_param_clone(w->data); param->pagenb=0; } else { param=g_new0(struct poi_param,1); } if(!strcmp(wm->name,"AddressFilter")) param->AddressFilterType=1; else if(!strcmp(wm->name,"AddressFilterZip")) param->AddressFilterType=2; else param->AddressFilterType=0; gui_internal_poi_param_set_filter(param, w->text); gui_internal_cmd_pois(this,w,param); gui_internal_poi_param_free(param); } /** * @brief POIs filter dialog. * Event to handle '\r' '\n' keys pressed. * */ static void gui_internal_cmd_pois_filter_changed(struct gui_priv *this, struct widget *wm, void *data) { if (wm->text && wm->reason==gui_internal_reason_keypress_finish) { gui_internal_cmd_pois_filter_do(this, wm, wm); } } /** * @brief POIs filter dialog. * * @param this The graphics context. * @param wm called widget. * @param data event data. */ void gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *data) { struct widget *wb, *w, *wr, *wk, *we; int keyboard_mode; keyboard_mode = VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")); wb=gui_internal_menu(this,"Filter"); w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wr); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(wr, we); gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL)); wk->state |= STATE_EDIT|STATE_EDITABLE; wk->func=gui_internal_cmd_pois_filter_changed; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->name=g_strdup("POIsFilter"); wk->c=wm->c; gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); wb->state |= STATE_SENSITIVE; wb->func = gui_internal_cmd_pois_filter_do; wb->name=g_strdup("NameFilter"); wb->data=wk; gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "post"))); wb->state |= STATE_SENSITIVE; wb->name=g_strdup("AddressFilter"); wb->func = gui_internal_cmd_pois_filter_do; wb->data=wk; gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "zipcode"))); wb->state |= STATE_SENSITIVE; wb->name=g_strdup("AddressFilterZip"); wb->func = gui_internal_cmd_pois_filter_do; wb->data=wk; if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, keyboard_mode)); gui_internal_menu_render(this); } /** * @brief Do POI search specified by poi_param and display POIs found * * @param this The graphics context. * @param wm called widget. * @param data event data, reference to poi_param or NULL. */ void gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data) { struct map_selection *sel,*selm; struct coord c,center; struct mapset_handle *h; struct map *m; struct map_rect *mr; struct item *item; struct widget *wi,*w,*w2,*wb, *wtable, *row; enum projection pro=wm->c.pro; struct poi_param *param; int param_free=0; int idist,dist; struct selector *isel; int pagenb; int prevdist; // Starting value and increment of count of items to be extracted const int pagesize = 50; int maxitem, it = 0, i; struct item_data *items; struct fibheap* fh = fh_makekeyheap(); int cnt = 0; struct table_data *td; struct widget *wl,*wt; char buffer[32]; struct poi_param *paramnew; struct attr route; dbg(lvl_debug,"POIs..."); if(data) { param = data; } else { param = g_new0(struct poi_param,1); param_free=1; } if (navit_get_attr(this->nav, attr_route, &route, NULL)) { struct attr route_status; if (!route_get_attr(route.u.route, attr_route_status, &route_status, NULL) || (route_status.u.num != route_status_path_done_new && route_status.u.num != route_status_path_done_incremental)) route.u.route=NULL; } else route.u.route=NULL; dist=10000*(param->dist+1); isel = param->sel? &selectors[param->selnb]: NULL; pagenb = param->pagenb; prevdist=param->dist*10000; maxitem = pagesize*(pagenb+1); items= g_new0( struct item_data, maxitem); dbg(lvl_debug, "Params: sel = %i, selnb = %i, pagenb = %i, dist = %i, filterstr = %s, AddressFilterType= %d\n", param->sel, param->selnb, param->pagenb, param->dist, param->filterstr, param->AddressFilterType); wb=gui_internal_menu(this, isel ? isel->name : _("POIs")); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); if (!isel && !param->filter) gui_internal_widget_append(w, gui_internal_cmd_pois_selector(this,&wm->c,pagenb)); w2=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, w2); sel=map_selection_rect_new(&wm->c,dist*transform_scale(abs(wm->c.y)+dist*1.5),18); center.x=wm->c.x; center.y=wm->c.y; h=mapset_open(navit_get_mapset(this->nav)); while ((m=mapset_next(h, 1))) { selm=map_selection_dup_pro(sel, pro, map_projection(m)); mr=map_rect_new(m, selm); dbg(lvl_debug,"mr=%p\n", mr); if (mr) { while ((item=map_rect_get_item(mr))) { if (gui_internal_cmd_pois_item_selected(param, item) && item_coord_get_pro(item, &c, 1, pro) && coord_rect_contains(&sel->u.c_rect, &c) && (idist=transform_distance(pro, ¢er, &c)) < dist) { struct item_data *data; struct attr attr; char *label; item_attr_rewind(item); if (item->type==type_house_number) { label=gui_internal_compose_item_address_string(item,1); } else if (item_attr_get(item, attr_label, &attr)) { label=map_convert_string(item->map,attr.u.str); // Buildings which label is equal to addr:housenumber value // are duplicated by item_house_number. Don't include such // buildings into the list. This is true for OSM maps created with // maptool patched with #859 latest patch. // FIXME: For non-OSM maps, we probably would better don't skip these items. if(item->type==type_poly_building && item_attr_get(item, attr_house_number, &attr) ) { if(strcmp(label,map_convert_string_tmp(item->map,attr.u.str))==0) { g_free(label); continue; } } } else { label=g_strdup(""); } if(it>=maxitem) { data = fh_extractmin(fh); g_free(data->label); data->label=NULL; } else { data = &items[it++]; } data->label=label; data->item = *item; data->c = c; data->dist = idist; // Key expression is a workaround to fight // probable heap collisions when two objects // are at the same distance. But it destroys // right order of POIs 2048 km away from cener // and if table grows more than 1024 rows. fh_insertkey(fh, -((idist<<10) + cnt++), data); if (it == maxitem) dist = (-fh_minkey(fh))>>10; } } map_rect_destroy(mr); } map_selection_destroy(selm); } map_selection_destroy(sel); mapset_close(h); wtable = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); td=wtable->data; gui_internal_widget_append(w2,wtable); // Move items from heap to the table for(i=0;;i++) { int key = fh_minkey(fh); struct item_data *data = fh_extractmin(fh); if (data == NULL) { dbg(lvl_debug, "Empty heap: maxitem = %i, it = %i, dist = %i\n", maxitem, it, dist); break; } dbg(lvl_debug, "dist1: %i, dist2: %i\n", data->dist, (-key)>>10); if(i==(it-pagesize*pagenb) && data->dist>prevdist) prevdist=data->dist; wi=gui_internal_cmd_pois_item(this, ¢er, &data->item, &data->c, route.u.route, data->dist, data->label); wi->c.x=data->c.x; wi->c.y=data->c.y; wi->c.pro=pro; wi->background=this->background; row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); gui_internal_widget_append(row,wi); row->datai=data->dist; gui_internal_widget_prepend(wtable,row); g_free(data->label); } fh_deleteheap(fh); free(items); // Add an entry for more POI row = gui_internal_widget_table_row_new(this, gravity_left | flags_fill | orientation_horizontal); row->datai=100000000; // Really far away for Earth, but won't work for bigger planets. gui_internal_widget_append(wtable,row); wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(row,wl); if (it == maxitem) { paramnew=gui_internal_poi_param_clone(param); paramnew->pagenb++; paramnew->count=it; snprintf(buffer, sizeof(buffer), "Get more (up to %d items)...", (paramnew->pagenb+1)*pagesize); wt=gui_internal_label_new(this, buffer); gui_internal_widget_append(wl, wt); wt->func=gui_internal_cmd_pois_more; wt->data=paramnew; wt->data_free=gui_internal_poi_param_free; wt->state |= STATE_SENSITIVE; wt->c = wm->c; } else { static int dist[]={1,5,10,0}; wt=gui_internal_label_new(this, "Set distance to"); gui_internal_widget_append(wl, wt); for(i=0;dist[i];i++) { paramnew=gui_internal_poi_param_clone(param); paramnew->dist+=dist[i]; paramnew->count=it; snprintf(buffer, sizeof(buffer), " %i ", 10*(paramnew->dist+1)); wt=gui_internal_label_new(this, buffer); gui_internal_widget_append(wl, wt); wt->func=gui_internal_cmd_pois_more; wt->data=paramnew; wt->data_free=gui_internal_poi_param_free; wt->state |= STATE_SENSITIVE; wt->c = wm->c; } wt=gui_internal_label_new(this, "km."); gui_internal_widget_append(wl, wt); } // Rendering now is needed to have table_data->bottomrow filled in. gui_internal_menu_render(this); td=wtable->data; if(td->bottom_row!=NULL) { #if 0 while(((struct widget*)td->bottom_row->data)->datai<=prevdist && (td->next_button->state & STATE_SENSITIVE)) { gui_internal_table_button_next(this, td->next_button, NULL); } #else int firstrow=g_list_index(wtable->children, td->top_row->data); while(firstrow>=0) { int currow=g_list_index(wtable->children, td->bottom_row->data) - firstrow; if(currow<0) { dbg(lvl_debug,"Can't find bottom row in children list. Stop paging.\n"); break; } if(currow>=param->count) break; if(!(td->scroll_buttons.next_button->state & STATE_SENSITIVE)) { dbg(lvl_debug,"Reached last page but item %i not found. Stop paging.\n",param->count); break; } gui_internal_table_button_next(this, td->scroll_buttons.next_button, NULL); } #endif } gui_internal_menu_render(this); if(param_free) g_free(param); } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_poi.h000066400000000000000000000031011264204753600231400ustar00rootroot00000000000000 /** * POI search/filtering parameters. * */ struct poi_param { /** * =1 if selnb is defined, 0 otherwize. */ unsigned char sel; /** * Index to struct selector selectors[], shows what type of POIs is defined. */ unsigned char selnb; /** * Page number to display. */ unsigned char pagenb; /** * Radius (number of 10-kilometer intervals) to search for POIs. */ unsigned char dist; /** * Should filter phrase be compared to postal address of the POI. * =0 - name filter, =1 - address filter, =2 - address filter, including postal code */ unsigned char AddressFilterType; /** * Filter string, casefold()ed and divided into substrings at the spaces, which are replaced by ASCII 0*. */ char *filterstr; /** * list of pointers to individual substrings of filterstr. */ GList *filter; /** * Number of POIs in this list */ int count; }; /* prototypes */ struct coord; struct gui_priv; struct item; struct poi_param; struct widget; void gui_internal_poi_param_free(void *p); void gui_internal_poi_param_set_filter(struct poi_param *param, char *text); struct widget *gui_internal_cmd_pois_item(struct gui_priv *this, struct coord *center, struct item *item, struct coord *c, struct route *route, int dist, char *name); char *gui_internal_compose_item_address_string(struct item *item, int prependPostal); void gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_priv.h000066400000000000000000000200501264204753600233330ustar00rootroot00000000000000/** * @brief A structure to store configuration values. * * This structure stores configuration values for how gui elements in the internal GUI * should be drawn. */ struct gui_config_settings { /** * The base size (in fractions of a point) to use for text. */ int font_size; /** * The size (in pixels) that xs style icons should be scaled to. * This icon size is typically used in various lists and should be set to value which allows a list row to be easily cliked or dragged. */ int icon_xs; /** * The size (in pixels) that s style icons (small) should be scaled to, used for the menu top row icons */ int icon_s; /** * The size (in pixels) that l style icons should be scaled to, used for icons defined in the menu html */ int icon_l; /** * The default amount of spacing (in pixels) to place between GUI elements. */ int spacing; }; struct route_data { struct widget * route_table; int route_showing; }; /** * Private data for the internal GUI. * * @author Martin Schaller (04/2008) */ struct gui_priv { struct navit *nav; struct attr self; struct window *win; struct graphics *gra; struct graphics_gc *background; struct graphics_gc *background2; struct graphics_gc *highlight_background; struct graphics_gc *foreground; struct graphics_gc *text_foreground; struct graphics_gc *text_background; struct color background_color, background2_color, text_foreground_color, text_background_color; int spacing; int font_size; char *font_name; int fullscreen; struct graphics_font *fonts[3]; int icon_xs; /**< The size (in pixels) that xs style icons should be scaled to. * This icon size can be too small to click it on some devices. */ int icon_s; /**< The size (in pixels) that s style icons (small) should be scaled to */ int icon_l; /**< The size (in pixels) that l style icons should be scaled to */ int pressed; struct widget *widgets; int widgets_count; int redraw; struct widget root; struct widget *highlighted,*editable; struct widget *highlighted_menu; struct pcoord clickp, vehiclep; struct attr *click_coord_geo, *position_coord_geo; struct search_list *sl; int ignore_button; int menu_on_map_click; char *on_map_click; int signal_on_map_click; char *country_iso2; int speech; int keyboard; /**< Whether the internal GUI keyboard is enabled */ int keyboard_required; /**< Whether keyboard input is needed. This is only used by the * HTML menu, text entry dialogs do not use this member. */ struct gui_config_settings config; /**< The setting information read from the configuration file. * values of -1 indicate no value was specified in the config file. */ struct event_idle *idle; struct callback *motion_cb,*button_cb,*resize_cb,*keypress_cb,*window_closed_cb,*idle_cb, *motion_timeout_callback; struct event_timeout *motion_timeout_event; struct point current; struct callback * vehicle_cb; struct route_data route_data; /**< Stores information about the route. */ struct gui_internal_data data; struct callback_list *cbl; int flags; int cols; struct attr osd_configuration; /**< The OSD configuration, a set of flags controlling which OSD * items will be visible. */ int pitch; /**< The pitch for the 3D map view. */ int flags_town,flags_street,flags_house_number; int radius; int mouse_button_clicked_on_map; /* html */ char *html_text; int html_depth; struct widget *html_container; int html_skip; char *html_anchor; char *href; int html_anchor_found; struct form *form; struct html { int skip; enum html_tag { html_tag_none, html_tag_a, html_tag_h1, html_tag_html, html_tag_img, html_tag_script, html_tag_form, html_tag_input, html_tag_div, } tag; char *command; char *name; char *href; char *refresh_cond; char *class; int font_size; struct widget *w; struct widget *container; } html[10]; /* gestures */ struct gesture_elem { long long msec; struct point p; } gesture_ring[GESTURE_RINGSIZE]; int gesture_ring_last, gesture_ring_first; int results_map_population; }; struct menu_data { struct widget *search_list; struct widget *keyboard; struct widget *button_bar; struct widget *menu; int keyboard_mode; void (*redisplay)(struct gui_priv *priv, struct widget *widget, void *data); struct widget *redisplay_widget; char *href; struct attr refresh_callback_obj,refresh_callback; }; struct heightline { struct heightline *next; int height; struct coord_rect bbox; int count; struct coord c[0]; }; struct diagram_point { struct diagram_point *next; struct coord c; }; /* prototypes */ enum flags; struct attr; struct coord; struct coord_geo; struct graphics_image; struct gui_priv; struct heightline; struct item; struct map; struct navit; struct pcoord; struct point; struct vehicle; struct widget; struct graphics_image *image_new_xs(struct gui_priv *this, const char *name); struct graphics_image *image_new_s(struct gui_priv *this, const char *name); struct graphics_image *image_new_l(struct gui_priv *this, const char *name); struct widget *gui_internal_button_navit_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct attr *on, struct attr *off); struct widget *gui_internal_button_map_attr_new(struct gui_priv *this, const char *text, enum flags flags, struct map *map, struct attr *on, struct attr *off, int deflt); void gui_internal_say(struct gui_priv *this, struct widget *w, int questionmark); void gui_internal_back(struct gui_priv *this, struct widget *w, void *data); void gui_internal_cmd_return(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_main_menu(struct gui_priv *this, struct widget *wm, void *data); struct widget *gui_internal_time_help(struct gui_priv *this); void gui_internal_apply_config(struct gui_priv *this); void gui_internal_select_waypoint(struct gui_priv *this, const char *title, const char *hint, struct widget *wm_, void (*cmd)(struct gui_priv *priv, struct widget *widget, void *data), void *data); void gui_internal_call_linked_on_finish(struct gui_priv *this, struct widget *wm, void *data); char *removecase(char *s); void gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, const char *name, int flags); void gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_keypress_do(struct gui_priv *this, char *key); char *gui_internal_cmd_match_expand(char *pattern, struct attr **in); int gui_internal_set(char *remove, char *add); void gui_internal_cmd_map_download(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_menu_vehicle_settings(struct gui_priv *this, struct vehicle *v, char *name); void gui_internal_cmd_vehicle_settings(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_evaluate(struct gui_priv *this, const char *command); void gui_internal_enter(struct gui_priv *this, int ignore); void gui_internal_leave(struct gui_priv *this); void gui_internal_set_click_coord(struct gui_priv *this, struct point *p); void gui_internal_enter_setup(struct gui_priv *this); void gui_internal_cmd_menu(struct gui_priv *this, int ignore, char *href); void gui_internal_cmd_log_clicked(struct gui_priv *this, struct widget *widget, void *data); void gui_internal_check_exit(struct gui_priv *this); void gui_internal_cmd_enter_coord_clicked(struct gui_priv *this, struct widget *widget, void *data); int line_intersection(struct coord *a1, struct coord *a2, struct coord *b1, struct coord *b2, struct coord *res); struct heightline *item_get_heightline(struct item *item); void gui_internal_route_update(struct gui_priv *this, struct navit *navit, struct vehicle *v); void gui_internal_route_screen_free(struct gui_priv *this_, struct widget *w); void gui_internal_populate_route_table(struct gui_priv *this, struct navit *navit); void plugin_init(void); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_search.c000066400000000000000000000466301264204753600236270ustar00rootroot00000000000000#include #include #include "config.h" #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit.h" #include "navit_nls.h" #include "event.h" #include "search.h" #include "country.h" #include "track.h" #include "linguistics.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_html.h" #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" #include "gui_internal_search.h" static void gui_internal_search_country(struct gui_priv *this, struct widget *widget, void *data) { gui_internal_prune_menu_count(this, 1, 0); gui_internal_search(this,_("Country"),"Country",0); } static void gui_internal_search_town(struct gui_priv *this, struct widget *wm, void *data) { if (this->sl) search_list_select(this->sl, attr_country_all, 0, 0); g_free(this->country_iso2); this->country_iso2=NULL; gui_internal_search(this,_("Town"),"Town",0); } static void gui_internal_search_street(struct gui_priv *this, struct widget *widget, void *data) { search_list_select(this->sl, attr_town_or_district_name, 0, 0); gui_internal_search(this,_("Street"),"Street",0); } static void gui_internal_search_house_number(struct gui_priv *this, struct widget *widget, void *data) { search_list_select(this->sl, attr_street_name, 0, 0); gui_internal_search(this,_("House number"),"House number",0); } void gui_internal_search_idle_end(struct gui_priv *this) { if (this->idle) { event_remove_idle(this->idle); this->idle=NULL; } if (this->idle_cb) { callback_destroy(this->idle_cb); this->idle_cb=NULL; } } static int gui_internal_search_cmp(gconstpointer _a, gconstpointer _b) { struct widget *a=(struct widget *)_a, *b=(struct widget *)_b; char *sa,*sb; int r; if(!b) if((!a || a->type!=widget_table_row || !a->text) && (!b || b->type!=widget_table_row || !b->text)) return 0; if(!a || a->type!=widget_table_row || !a->text) return -1; if(!b || b->type!=widget_table_row || !b->text) return 1; r=a->datai-b->datai; if(r<0) return -1; if(r>0) return 1; sa=removecase(a->text); sb=removecase(b->text); r=strcmp(sa,sb); dbg(lvl_debug,"%s %s %d\n",sa,sb,r); g_free(sa); g_free(sb); return r; } static char * postal_str(struct search_list_result *res, int level) { char *ret=NULL; if (res->town->common.postal) ret=res->town->common.postal; if (res->town->common.postal_mask) ret=res->town->common.postal_mask; if (level == 1) return ret; if (res->street->common.postal) ret=res->street->common.postal; if (res->street->common.postal_mask) ret=res->street->common.postal_mask; if (level == 2) return ret; if (res->house_number->common.postal) ret=res->house_number->common.postal; if (res->house_number->common.postal_mask) ret=res->house_number->common.postal_mask; return ret; } static char * get_string_from_attr_list(struct attr **attrs, enum attr_type type, char *dflt) { struct attr attr; if(attr_generic_get_attr(attrs,NULL,type,&attr,NULL)) return attr.u.str; else return dflt; } static char * district_str(struct search_list_result *res, int level, enum attr_type district, char *dflt) { char *ret=dflt; ret=get_string_from_attr_list(res->town->common.attrs, district, ret); if (level == 1) return ret; ret=get_string_from_attr_list(res->street->common.attrs, district, ret); if (level == 2) return ret; ret=get_string_from_attr_list(res->house_number->common.attrs, district, ret); return ret; } static char * town_display_label(struct search_list_result *res, int level, int flags) { char *town=district_str(res, level,attr_town_name,""); char *district=district_str(res, level,attr_district_name,NULL); char *postal=postal_str(res, level); char *postal_sep=" "; char *district_begin=" ("; char *district_end=")"; char *county_sep = ", "; char *county = res->town->common.county_name; if (!postal) postal_sep=postal=""; if (!district || (flags & 1)) district_begin=district_end=district=""; if (!county || !strcmp(county, town)) county_sep=county=""; if(level==1 ) { if(flags & 2) { int n=0; char *s[10]={NULL}; s[n]=district_str(res, level, attr_state_name, NULL); if(s[n]) n++; s[n]=district_str(res, level, attr_county_name, NULL); if(s[n]) n++; s[n]=district_str(res, level, attr_municipality_name, NULL); if(s[n]) n++; return g_strjoinv(", ",s); } county=county_sep=""; } return g_strdup_printf("%s%s%s%s%s%s%s%s", postal, postal_sep, town, district_begin, district, district_end, county_sep, county); } static void gui_internal_find_next_possible_key(char *search_text, char *wm_name, char *possible_keys, char *item_name) { gchar* trunk_name; if (item_name) { trunk_name = g_strrstr(item_name, search_text); if (trunk_name) { char next_char = trunk_name[strlen(search_text)]; int i; int len = strlen(possible_keys); for(i = 0; (ikeyboard && !(this->flags & 2048)) { GList *lk=md->keyboard->children; graphics_draw_mode(this->gra, draw_mode_begin); while (lk) { struct widget *child=lk->data; GList *lk2=child->children; while (lk2) { struct widget *child_=lk2->data; lk2=g_list_next(lk2); if (child_->data && strcmp("\b", child_->data)) { // FIXME don't disable special keys if ( (strlen(possible_keys) == 0) || (g_strrstr(possible_keys, child_->data)!=NULL ) ) { child_->state|= STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SENSITIVE|STATE_CLEAR ; } else { child_->state&= ~(STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SELECTED) ; } gui_internal_widget_render(this,child_); } } lk=g_list_next(lk); } gui_internal_widget_render(this,md->keyboard); graphics_draw_mode(this->gra, draw_mode_end); } } static int gui_internal_get_match_quality(char *item_name, char* search_text, int is_house_number_without_street) { enum match_quality { full_string_match, word_match, substring_match, housenum_but_no_street_match } match_quality; if (is_house_number_without_street) { match_quality=housenum_but_no_street_match; } else if(item_name) { int i; char *folded_name=linguistics_casefold(item_name); char *folded_query=linguistics_casefold(search_text); match_quality=substring_match; for(i=0; i<3 ;i++) { char *exp=linguistics_expand_special(folded_name,i); char *p; if(!exp) continue; if(!strcmp(exp,folded_query)) { dbg(lvl_debug,"exact match for the whole string %s\n", exp); match_quality=full_string_match; g_free(exp); break; } if((p=strstr(exp,folded_query))!=NULL) { p+=strlen(folded_query); if(!*p||strchr(LINGUISTICS_WORD_SEPARATORS_ASCII,*p)) { dbg(lvl_debug,"exact matching word found inside string %s\n",exp); match_quality=word_match; } } g_free(exp); } g_free(folded_name); g_free(folded_query); } return match_quality; } static struct widget* gui_internal_create_resultlist_entry(struct gui_priv *this, struct search_list_result *res, char *result_main_label, char *result_sublabel, void *param, char *widget_name, struct item *item) { struct widget *resultlist_entry; if(result_sublabel) { struct widget *entry_sublabel; resultlist_entry=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(resultlist_entry, gui_internal_image_new(this, image_new_xs(this, res->country->flag))); entry_sublabel=gui_internal_box_new(this, gravity_left_center|orientation_vertical|flags_fill); gui_internal_widget_append(resultlist_entry, entry_sublabel); gui_internal_widget_append(entry_sublabel, gui_internal_label_new(this, result_main_label)); gui_internal_widget_append(entry_sublabel, gui_internal_label_font_new(this, result_sublabel, 1)); resultlist_entry->func=gui_internal_cmd_position; resultlist_entry->data=param; resultlist_entry->state |= STATE_SENSITIVE; resultlist_entry->speech=g_strdup(result_main_label); } else { resultlist_entry=gui_internal_button_new_with_callback(this, result_main_label, image_new_xs(this, res->country->flag), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_position, param); } resultlist_entry->name=widget_name; if (res->c) resultlist_entry->c=*res->c; resultlist_entry->selection_id=res->id; if (item) resultlist_entry->item=*item; return resultlist_entry; } /** * @brief List of possible next keys/characters given the current result list of the incremental search. */ char possible_keys_incremental_search[256]=""; static void gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *search_list, void *param) { char *result_main_label=NULL,*result_sublabel=NULL,*item_name=NULL, *widget_name=NULL, *search_text; struct search_list_result *res; struct item *item=NULL; struct widget *search_input=NULL; struct widget *menu, *resultlist_row, *resultlist_entry; res=search_list_get_result(this->sl); if (!res) { gui_internal_search_idle_end(this); gui_internal_highlight_possible_keys(this, possible_keys_incremental_search); return; } if (! strcmp(wm_name,"Country")) { item_name=res->country->name; item=&res->country->common.item; result_main_label=g_strdup_printf("%s", res->country->name); } else if (! strcmp(wm_name,"Town")) { item=&res->town->common.item; item_name=res->town->common.town_name; result_main_label=town_display_label(res, 1, 0); result_sublabel=town_display_label(res, 1, 2); } else if (! strcmp(wm_name,"Street")) { item_name=res->street->name; item=&res->street->common.item; result_main_label=g_strdup(res->street->name); result_sublabel=town_display_label(res, 2, 1); } else if (! strcmp(wm_name,"House number")) { item_name=res->house_number->house_number; result_main_label=g_strdup_printf("%s, %s", item_name, res->street->name); result_sublabel=town_display_label(res, 3, 0); widget_name=g_strdup(result_main_label); } if(!item_name) { dbg(lvl_error, "Skipping nameless item in search (search type: %s). Please report this as a bug.\n", wm_name); return; } if(!widget_name) widget_name=g_strdup(item_name); menu=g_list_last(this->root.children)->data; search_input=gui_internal_find_widget(menu, NULL, STATE_EDIT); dbg_assert(search_input); search_text=search_input->text; gui_internal_find_next_possible_key(search_text, wm_name, possible_keys_incremental_search, item_name); resultlist_row=gui_internal_widget_table_row_new(this, gravity_left|orientation_horizontal|flags_fill); if (!result_sublabel) resultlist_row->text=g_strdup(result_main_label); else resultlist_row->text=g_strdup_printf("%s %s",item_name,result_sublabel); int is_house_number_without_street=!strcmp(wm_name,"House number") && !res->street->name; resultlist_row->datai=gui_internal_get_match_quality(item_name, search_text, is_house_number_without_street); gui_internal_widget_insert_sorted(search_list, resultlist_row, gui_internal_search_cmp); resultlist_entry=gui_internal_create_resultlist_entry( this, res, result_main_label, result_sublabel, param, widget_name, item); gui_internal_widget_append(resultlist_row, resultlist_entry); gui_internal_widget_pack(this, search_list); graphics_draw_mode(this->gra, draw_mode_begin); gui_internal_widget_render(this, menu); graphics_draw_mode(this->gra, draw_mode_end); g_free(result_main_label); g_free(result_sublabel); } static void gui_internal_search_idle_start(struct gui_priv *this, char *wm_name, struct widget *search_list, void *param) { this->idle_cb=callback_new_4(callback_cast(gui_internal_search_idle), this, wm_name, search_list, param); this->idle=event_add_idle(50,this->idle_cb); callback_call_0(this->idle_cb); } static void gui_internal_search_changed(struct gui_priv *this, struct widget *wm, void *data) { GList *l; struct widget *search_list=gui_internal_menu_data(this)->search_list; void *param=(void *)3; gui_internal_widget_table_clear(this, search_list); possible_keys_incremental_search[0]='\0'; if (! strcmp(wm->name,"Country")) param=(void *)4; if (! strcmp(wm->name,"Street")) param=(void *)5; if (! strcmp(wm->name,"House number")) param=(void *)6; dbg(lvl_debug,"%s now '%s'\n", wm->name, wm->text); gui_internal_search_idle_end(this); if (wm->text && g_utf8_strlen(wm->text, -1) > 0) { struct attr search_attr; dbg(lvl_debug,"process\n"); if (! strcmp(wm->name,"Country")) search_attr.type=attr_country_all; if (! strcmp(wm->name,"Town")) search_attr.type=attr_town_or_district_name; if (! strcmp(wm->name,"Street")) search_attr.type=attr_street_name; if (! strcmp(wm->name,"House number")) search_attr.type=attr_house_number; search_attr.u.str=wm->text; search_list_search(this->sl, &search_attr, 1); // Text is not necessarily entered via the on-screen keyboard, // but we now switch it to lower case anyway. gui_internal_keyboard_to_lower_case(this); gui_internal_search_idle_start(this, wm->name, search_list, param); } else { // If not enough content is entered, we highlight all keys. gui_internal_keyboard_to_upper_case(this); gui_internal_highlight_possible_keys(this, ""); } l=g_list_last(this->root.children); gui_internal_widget_render(this, l->data); } static void gui_internal_search_list_set_default_country(struct gui_priv *this) { struct attr search_attr, country_name, country_iso2, *country_attr; struct item *item; struct country_search *cs; struct tracking *tracking; struct search_list_result *res; country_attr=country_default(); tracking=navit_get_tracking(this->nav); if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) country_attr=&search_attr; if (country_attr) { cs=country_search_new(country_attr, 0); item=country_search_get_item(cs); if (item && item_attr_get(item, attr_country_name, &country_name)) { search_attr.type=attr_country_all; dbg(lvl_debug,"country %s\n", country_name.u.str); search_attr.u.str=country_name.u.str; search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); if(this->country_iso2) { g_free(this->country_iso2); this->country_iso2=NULL; } if (item_attr_get(item, attr_country_iso2, &country_iso2)) this->country_iso2=g_strdup(country_iso2.u.str); } country_search_destroy(cs); } else { dbg(lvl_error,"warning: no default country found\n"); if (this->country_iso2) { dbg(lvl_debug,"attempting to use country '%s'\n",this->country_iso2); search_attr.type=attr_country_iso2; search_attr.u.str=this->country_iso2; search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); } } } static void gui_internal_search_list_new(struct gui_priv *this) { struct mapset *ms=navit_get_mapset(this->nav); if (! this->sl) { this->sl=search_list_new(ms); gui_internal_search_list_set_default_country(this); } } void gui_internal_search_list_destroy(struct gui_priv *this) { if (this->sl) { search_list_destroy(this->sl); this->sl=NULL; } } void gui_internal_search(struct gui_priv *this, const char *what, const char *type, int flags) { struct widget *wb,*wk,*w,*wr,*we,*wl,*wnext=NULL; char *country; int keyboard_mode; gui_internal_search_list_new(this); keyboard_mode = VKBD_FLAG_2 | gui_internal_keyboard_init_mode(this->country_iso2 ? this->country_iso2 : getenv("LANG")); wb=gui_internal_menu(this, what); w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(w, wr); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(wr, we); if (!strcmp(type,"Country")) { wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_town")); wnext->func=gui_internal_search_town; } else if (!strcmp(type,"Town")) { if (this->country_iso2) { #ifdef HAVE_API_ANDROID char country_iso2[strlen(this->country_iso2)+1]; strtolower(country_iso2, this->country_iso2); country=g_strdup_printf("country_%s", country_iso2); #else country=g_strdup_printf("country_%s", this->country_iso2); #endif } else country=g_strdup("gui_select_country"); gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, country))); wb->state |= STATE_SENSITIVE; if (flags) wb->func = gui_internal_search_country; else wb->func = gui_internal_back; wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_street")); wnext->func=gui_internal_search_street; g_free(country); } else if (!strcmp(type,"Street")) { gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_town"))); wb->state |= STATE_SENSITIVE; wb->func = gui_internal_back; wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_house_number")); wnext->func=gui_internal_search_house_number; } else if (!strcmp(type,"House number")) { gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_street"))); wb->state |= STATE_SENSITIVE; wb->func = gui_internal_back; keyboard_mode = VKBD_NUMERIC | VKBD_FLAG_2; } gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL)); if (wnext) { gui_internal_widget_append(we, wnext); wnext->state |= STATE_SENSITIVE; } wl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1);//gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wr, wl); gui_internal_menu_data(this)->search_list=wl; wk->state |= STATE_EDIT|STATE_EDITABLE; wk->background=this->background; wk->flags |= flags_expand|flags_fill; wk->func = gui_internal_search_changed; wk->name=g_strdup(type); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, keyboard_mode)); gui_internal_menu_render(this); } void gui_internal_search_house_number_in_street(struct gui_priv *this, struct widget *widget, void *data) { dbg(lvl_info,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_street_name, 0, 0); search_list_select(this->sl, attr_street_name, widget->selection_id, 1); gui_internal_search(this,_("House number"),"House number",0); } void gui_internal_search_street_in_town(struct gui_priv *this, struct widget *widget, void *data) { dbg(lvl_info,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_town_or_district_name, 0, 0); search_list_select(this->sl, attr_town_or_district_name, widget->selection_id, 1); gui_internal_search(this,_("Street"),"Street",0); } void gui_internal_search_town_in_country(struct gui_priv *this, struct widget *widget) { struct search_list_common *slc; dbg(lvl_info,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_country_all, 0, 0); slc=search_list_select(this->sl, attr_country_all, widget->selection_id, 1); if (slc) { g_free(this->country_iso2); this->country_iso2=g_strdup(((struct search_list_country *)slc)->iso2); } gui_internal_search(this,widget->name,"Town",0); } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_search.h000066400000000000000000000011071264204753600236220ustar00rootroot00000000000000/* prototypes */ struct gui_priv; struct widget; void gui_internal_search_idle_end(struct gui_priv *this); void gui_internal_search_list_destroy(struct gui_priv *this); void gui_internal_search(struct gui_priv *this, const char *what, const char *type, int flags); void gui_internal_search_house_number_in_street(struct gui_priv *this, struct widget *widget, void *data); void gui_internal_search_street_in_town(struct gui_priv *this, struct widget *widget, void *data); void gui_internal_search_town_in_country(struct gui_priv *this, struct widget *widget); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_widget.c000066400000000000000000001114661264204753600236450ustar00rootroot00000000000000#include #include "color.h" #include "coord.h" #include "point.h" #include "callback.h" #include "graphics.h" #include "debug.h" #include "navit_nls.h" #include "gui_internal.h" #include "gui_internal_widget.h" #include "gui_internal_priv.h" #include "gui_internal_menu.h" static void gui_internal_scroll_buttons_init(struct gui_priv *this, struct widget *widget, struct scroll_buttons *sb); static void gui_internal_background_render(struct gui_priv *this, struct widget *w) { struct point pnt=w->p; if (w->state & STATE_HIGHLIGHTED) graphics_draw_rectangle(this->gra, this->highlight_background, &pnt, w->w, w->h); else { if (w->background) graphics_draw_rectangle(this->gra, w->background, &pnt, w->w, w->h); } } struct widget * gui_internal_label_font_new(struct gui_priv *this, const char *text, int font) { struct point p[4]; int w=0; int h=0; struct widget *widget=g_new0(struct widget, 1); widget->type=widget_label; widget->font_idx=font; if (text) { widget->text=g_strdup(text); graphics_get_text_bbox(this->gra, this->fonts[font], widget->text, 0x10000, 0x0, p, 0); w=p[2].x-p[0].x; h=p[0].y-p[2].y; } widget->h=h+this->spacing; widget->texth=h; widget->w=w+this->spacing; widget->textw=w; widget->flags=gravity_center; widget->foreground=this->text_foreground; widget->text_background=this->text_background; return widget; } struct widget * gui_internal_label_new(struct gui_priv *this, const char *text) { return gui_internal_label_font_new(this, text, 0); } struct widget * gui_internal_label_new_abbrev(struct gui_priv *this, const char *text, int maxwidth) { struct widget *ret=NULL; char *tmp=g_malloc(strlen(text)+3); const char *p; p=text+strlen(text); while ((p=g_utf8_find_prev_char(text, p)) >= text) { int i=p-text; strcpy(tmp, text); strcpy(tmp+i,".."); ret=gui_internal_label_new(this, tmp); if (ret->w < maxwidth) break; gui_internal_widget_destroy(this, ret); ret=NULL; } if(!ret) ret=gui_internal_label_new(this, ""); g_free(tmp); return ret; } struct widget * gui_internal_image_new(struct gui_priv *this, struct graphics_image *image) { struct widget *widget=g_new0(struct widget, 1); widget->type=widget_image; widget->img=image; if (image) { widget->w=image->width; widget->h=image->height; } return widget; } static void gui_internal_image_render(struct gui_priv *this, struct widget *w) { struct point pnt; gui_internal_background_render(this, w); if (w->img) { pnt=w->p; pnt.x+=w->w/2-w->img->hot.x; pnt.y+=w->h/2-w->img->hot.y; graphics_draw_image(this->gra, this->foreground, &pnt, w->img); } } /** * @brief Renders a label. * * @param this The internal GUI instance * @param w The widget to render */ static void gui_internal_label_render(struct gui_priv *this, struct widget *w) { struct point pnt=w->p; gui_internal_background_render(this, w); if (w->state & STATE_EDIT) graphics_draw_rectangle(this->gra, this->highlight_background, &pnt, w->w, w->h); if (w->text) { char *text; char *startext=(char*)g_alloca(strlen(w->text)+1); text=w->text; if (w->flags2 & 1) { int i; for (i = 0 ; i < strlen(text); i++) startext[i]='*'; startext[i]='\0'; text=startext; } if (w->flags & gravity_right) { pnt.y+=w->h-this->spacing; pnt.x+=w->w-w->textw-this->spacing; graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], text, &pnt, 0x10000, 0x0); } else { pnt.y+=w->h-this->spacing; graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], text, &pnt, 0x10000, 0x0); } } } /** * @brief Creates a text box. * * A text box is a widget that renders a text string containing newlines. * The string will be broken up into label widgets at each newline with a vertical layout. * * @param this The internal GUI instance * @param text The text to be displayed in the text box * @param font The font to use for the text * @param flags */ struct widget * gui_internal_text_font_new(struct gui_priv *this, const char *text, int font, enum flags flags) { char *s=g_strdup(text),*s2,*tok; struct widget *ret=gui_internal_box_new(this, flags); s2=s; while ((tok=strtok(s2,"\n"))) { gui_internal_widget_append(ret, gui_internal_label_font_new(this, tok, font)); s2=NULL; } gui_internal_widget_pack(this,ret); g_free(s); return ret; } struct widget * gui_internal_text_new(struct gui_priv *this, const char *text, enum flags flags) { return gui_internal_text_font_new(this, text, 0, flags); } struct widget * gui_internal_button_font_new_with_callback(struct gui_priv *this, const char *text, int font, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) { struct widget *ret=NULL; ret=gui_internal_box_new(this, flags); if (ret) { if (image && !(flags & flags_swap)) gui_internal_widget_append(ret, gui_internal_image_new(this, image)); if (text) gui_internal_widget_append(ret, gui_internal_text_font_new(this, text, font, gravity_center|orientation_vertical)); if (image && (flags & flags_swap)) gui_internal_widget_append(ret, gui_internal_image_new(this, image)); ret->func=func; ret->data=data; if (func) { ret->state |= STATE_SENSITIVE; ret->speech=g_strdup(text); } } return ret; } struct widget * gui_internal_button_new_with_callback(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) { return gui_internal_button_font_new_with_callback(this, text, 0, image, flags, func, data); } struct widget * gui_internal_button_new(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags) { return gui_internal_button_new_with_callback(this, text, image, flags, NULL, NULL); } struct widget * gui_internal_find_widget(struct widget *wi, struct point *p, int flags) { struct widget *ret,*child; GList *l=wi->children; if (p) { if (wi->p.x > p->x ) return NULL; if (wi->p.y > p->y ) return NULL; if ( wi->p.x + wi->w < p->x) return NULL; if ( wi->p.y + wi->h < p->y) return NULL; } if (wi->state & flags) return wi; while (l) { child=l->data; ret=gui_internal_find_widget(child, p, flags); if (ret) { return ret; } l=g_list_next(l); } return NULL; } void gui_internal_highlight_do(struct gui_priv *this, struct widget *found) { if (found == this->highlighted) return; graphics_draw_mode(this->gra, draw_mode_begin); if (this->highlighted) { this->highlighted->state &= ~STATE_HIGHLIGHTED; if (this->root.children && this->highlighted_menu == g_list_last(this->root.children)->data) gui_internal_widget_render(this, this->highlighted); this->highlighted=NULL; this->highlighted_menu=NULL; } if (found) { this->highlighted=found; this->highlighted_menu=g_list_last(this->root.children)->data; this->highlighted->state |= STATE_HIGHLIGHTED; gui_internal_widget_render(this, this->highlighted); dbg(lvl_debug,"%d,%d %dx%d\n", found->p.x, found->p.y, found->w, found->h); } graphics_draw_mode(this->gra, draw_mode_end); } //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## void gui_internal_highlight(struct gui_priv *this) { struct widget *menu,*found=NULL; if (this->current.x > -1 && this->current.y > -1) { menu=g_list_last(this->root.children)->data; found=gui_internal_find_widget(menu, &this->current, STATE_SENSITIVE); if (!found) { found=gui_internal_find_widget(menu, &this->current, STATE_EDITABLE); if (found) { if (this->editable && this->editable != found) { this->editable->state &= ~ STATE_EDIT; gui_internal_widget_render(this, this->editable); } found->state |= STATE_EDIT; gui_internal_widget_render(this, found); this->editable=found; found=NULL; } } } gui_internal_highlight_do(this, found); this->motion_timeout_event=NULL; } struct widget * gui_internal_box_new_with_label(struct gui_priv *this, enum flags flags, const char *label) { struct widget *widget=g_new0(struct widget, 1); if (label) widget->text=g_strdup(label); widget->type=widget_box; widget->flags=flags; return widget; } struct widget * gui_internal_box_new(struct gui_priv *this, enum flags flags) { return gui_internal_box_new_with_label(this, flags, NULL); } static void gui_internal_box_render(struct gui_priv *this, struct widget *w) { struct widget *wc; GList *l; gui_internal_background_render(this, w); if (w->foreground && w->border) { struct point pnt[5]; pnt[0]=w->p; pnt[1].x=pnt[0].x+w->w; pnt[1].y=pnt[0].y; pnt[2].x=pnt[0].x+w->w; pnt[2].y=pnt[0].y+w->h; pnt[3].x=pnt[0].x; pnt[3].y=pnt[0].y+w->h; pnt[4]=pnt[0]; graphics_gc_set_linewidth(w->foreground, w->border ? w->border : 1); graphics_draw_lines(this->gra, w->foreground, pnt, 5); graphics_gc_set_linewidth(w->foreground, 1); } l=w->children; while (l) { wc=l->data; gui_internal_widget_render(this, wc); l=g_list_next(l); } if (w->scroll_buttons) gui_internal_widget_render(this, w->scroll_buttons->button_box); } /** * @brief Computes the size and location for the widget. * * @param this The internal GUI instance * @param w The widget to render */ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) { struct widget *wc; int x0,x=0,y=0,width=0,height=0,owidth=0,oheight=0,expand=0,expandd=1,count=0,rows=0,cols=w->cols ? w->cols : 0; int hb=w->scroll_buttons?w->scroll_buttons->button_box->h:0; GList *l; int orientation=w->flags & 0xffff0000; if (!cols) cols=this->cols; if (!cols) { if ( this->root.w > this->root.h ) cols=3; else cols=2; width=0; height=0; } /* * count the number of children */ l=w->children; while (l) { count++; l=g_list_next(l); } if (orientation == orientation_horizontal_vertical && count <= cols) orientation=orientation_horizontal; switch (orientation) { case orientation_horizontal: /* * For horizontal orientation: * pack each child and find the largest height and * compute the total width. x spacing (spx) is considered * * If any children want to be expanded * we keep track of this */ l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); if (height < wc->h) height=wc->h; width+=wc->w; if (wc->flags & flags_expand) expand+=wc->w ? wc->w : 1; l=g_list_next(l); if (l) width+=w->spx; } owidth=width; if (expand && w->w) { expandd=w->w-width+expand; owidth=w->w; } else expandd=expand=1; break; case orientation_vertical: /* * For vertical layouts: * We pack each child and compute the largest width and * the total height. y spacing (spy) is considered * * If the expand flag is set then teh expansion amount * is computed. */ l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); if (width < wc->w) width=wc->w; height+=wc->h; if (wc->flags & flags_expand) expand+=wc->h ? wc->h : 1; l=g_list_next(l); if (l) height+=w->spy; } oheight=height; if (expand && w->h) { expandd=w->h-hb-height+expand; oheight=w->h-hb; } else expandd=expand=1; break; case orientation_horizontal_vertical: /* * For horizontal_vertical orientation * pack the children. * Compute the largest height and largest width. * Layout the widgets based on having the * number of columns specified by (cols) */ count=0; l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); if (height < wc->h) height=wc->h; if (width < wc->w) width=wc->w; l=g_list_next(l); count++; } if (count < cols) cols=count; rows=(count+cols-1)/cols; width*=cols; height*=rows; width+=w->spx*(cols-1); height+=w->spy*(rows-1); owidth=width; oheight=height; expandd=expand=1; break; default: /* * No orientation was specified. * width and height are both 0. * The width & height of this widget * will be used. */ if(!w->w && !w->h) dbg(lvl_error,"Warning width and height of a widget are 0"); break; } if (! w->w && ! w->h) { w->w=w->bl+w->br+width; w->h=w->bt+w->bb+height+hb; w->packed=1; } #if 0 if (expand < 100) expand=100; #endif /* * At this stage the width and height of this * widget has been computed. * We now make a second pass assigning heights, * widths and coordinates to each child widget. */ if (w->flags & gravity_left) x=w->p.x+w->bl; if (w->flags & gravity_xcenter) x=w->p.x+w->w/2-owidth/2; if (w->flags & gravity_right) x=w->p.x+w->w-w->br-owidth; if (w->flags & gravity_top) y=w->p.y+w->bt; if (w->flags & gravity_ycenter) y=w->p.y+(w->h-hb)/2-oheight/2; if (w->flags & gravity_bottom) y=w->p.y+(w->h-hb)-w->bb-oheight; l=w->children; switch (orientation) { case orientation_horizontal: l=w->children; while (l) { wc=l->data; wc->p.x=x; if (wc->flags & flags_fill) wc->h=w->h-hb; if (wc->flags & flags_expand) { if (! wc->w) wc->w=1; wc->w=wc->w*expandd/expand; } if (w->flags & gravity_top) wc->p.y=y; if (w->flags & gravity_ycenter) wc->p.y=y-wc->h/2; if (w->flags & gravity_bottom) wc->p.y=y-wc->h; x+=wc->w+w->spx; l=g_list_next(l); } break; case orientation_vertical: l=w->children; while (l) { wc=l->data; wc->p.y=y; if (wc->flags & flags_fill) wc->w=w->w; if (wc->flags & flags_expand) { if (! wc->h) wc->h=1; wc->h=wc->h*expandd/expand; } if (w->flags & gravity_left) wc->p.x=x; if (w->flags & gravity_xcenter) wc->p.x=x-wc->w/2; if (w->flags & gravity_right) wc->p.x=x-wc->w; y+=wc->h+w->spy; l=g_list_next(l); } break; case orientation_horizontal_vertical: l=w->children; x0=x; count=0; width/=cols; height/=rows; while (l) { wc=l->data; wc->p.x=x; wc->p.y=y; if (wc->flags & flags_fill) { wc->w=width; wc->h=height; } if (w->flags & gravity_left) wc->p.x=x; if (w->flags & gravity_xcenter) wc->p.x=x+(width-wc->w)/2; if (w->flags & gravity_right) wc->p.x=x+width-wc->w; if (w->flags & gravity_top) wc->p.y=y; if (w->flags & gravity_ycenter) wc->p.y=y+(height-wc->h)/2; if (w->flags & gravity_bottom) wc->p.y=y-height-wc->h; x+=width; if (++count == cols) { count=0; x=x0; y+=height; } l=g_list_next(l); } break; default: break; } if ((w->flags & flags_scrolly) && y > w->h+w->p.y && !w->scroll_buttons) { w->scroll_buttons=g_new0(struct scroll_buttons, 1); gui_internal_scroll_buttons_init(this, w, w->scroll_buttons); w->scroll_buttons->button_box->w=w->w; w->scroll_buttons->button_box->p.x=w->p.x; w->scroll_buttons->button_box->p.y=w->p.y+w->h-w->scroll_buttons->button_box->h; gui_internal_widget_pack(this, w->scroll_buttons->button_box); dbg(lvl_debug,"needs buttons %d vs %d\n",y,w->h); gui_internal_box_pack(this, w); return; } /* * Call pack again on each child, * the child has now had its size and coordinates * set so they can repack their children. */ l=w->children; while (l) { wc=l->data; gui_internal_widget_pack(this, wc); l=g_list_next(l); } } void gui_internal_widget_reset_pack(struct gui_priv *this, struct widget *w) { struct widget *wc; GList *l; l=w->children; while (l) { wc=l->data; gui_internal_widget_reset_pack(this, wc); l=g_list_next(l); } if (w->packed) { w->w=0; w->h=0; } } /** * @brief Adds a child widget to a parent widget, making it the last child. * * @param parent The parent widget * @param child The child widget */ void gui_internal_widget_append(struct widget *parent, struct widget *child) { if (! child) return; if (! child->background) child->background=parent->background; parent->children=g_list_append(parent->children, child); child->parent=parent; } /** * @brief Adds a child widget to a parent widget, making it the first child. * * @param parent The parent widget * @param child The child widget */ void gui_internal_widget_prepend(struct widget *parent, struct widget *child) { if (! child->background) child->background=parent->background; parent->children=g_list_prepend(parent->children, child); child->parent=parent; } /** * @brief Adds a child widget to a parent widget. * * Placement of the child widget among its siblings depends on the comparison function {@code func}. * * @param parent The parent widget * @param child The child widget * @param func The comparison function */ void gui_internal_widget_insert_sorted(struct widget *parent, struct widget *child, GCompareFunc func) { if (! child->background) child->background=parent->background; parent->children=g_list_insert_sorted(parent->children, child, func); child->parent=parent; } /** * @brief Destroys all child widgets. * * This function is recursive, destroying all widgets in the child hierarchy of {@code w}. * * @param this The internal GUI instance * @param w The widget whose children are to be destroyed */ void gui_internal_widget_children_destroy(struct gui_priv *this, struct widget *w) { GList *l; struct widget *wc; l=w->children; while (l) { wc=l->data; gui_internal_widget_destroy(this, wc); l=g_list_next(l); } g_list_free(w->children); w->children=NULL; } /** * @brief Destroys a widget. * * This function also takes care of recursively destroying the entire child widget hierarchy of * {@code w} prior to destroying {@code w} itself. * * @param this The internal GUI instance * @param w The widget to destroy */ void gui_internal_widget_destroy(struct gui_priv *this, struct widget *w) { gui_internal_widget_children_destroy(this, w); g_free(w->command); g_free(w->speech); g_free(w->text); if (w->img) graphics_image_free(this->gra, w->img); if (w->prefix) g_free(w->prefix); if (w->name) g_free(w->name); if (w->data_free) w->data_free(w->data); if (w->cb && w->remove_cb) w->remove_cb(w->instance, w->cb); if (w==this->highlighted) this->highlighted=NULL; if(w->wfree) w->wfree(this,w); else g_free(w); } void gui_internal_widget_render(struct gui_priv *this, struct widget *w) { if(w->p.x > this->root.w || w->p.y > this->root.h) return; switch (w->type) { case widget_box: gui_internal_box_render(this, w); break; case widget_label: gui_internal_label_render(this, w); break; case widget_image: gui_internal_image_render(this, w); break; case widget_table: gui_internal_table_render(this,w); break; default: break; } } void gui_internal_widget_pack(struct gui_priv *this, struct widget *w) { switch (w->type) { case widget_box: gui_internal_box_pack(this, w); break; case widget_table: gui_internal_table_pack(this,w); default: break; } } struct widget * gui_internal_button_label(struct gui_priv *this, const char *label, int mode) { struct widget *wl,*wlb; struct widget *wb=gui_internal_menu_data(this)->button_bar; wlb=gui_internal_box_new(this, gravity_right_center|orientation_vertical); wl=gui_internal_label_new(this, label); wlb->border=1; wlb->foreground=this->text_foreground; wlb->bl=20; wlb->br=20; wlb->bb=6; wlb->bt=6; gui_internal_widget_append(wlb, wl); if (mode == 1) gui_internal_widget_prepend(wb, wlb); if (mode == -1) gui_internal_widget_append(wb, wlb); return wlb; } static void gui_internal_scroll_buttons_init(struct gui_priv *this, struct widget *widget, struct scroll_buttons *sb) { sb->next_button = gui_internal_button_new_with_callback(this, _("Next"), image_new_xs(this, "gui_arrow_right"), gravity_center|orientation_horizontal|flags_swap, gui_internal_table_button_next, widget); sb->prev_button = gui_internal_button_new_with_callback(this, _("Prev"), image_new_xs(this, "gui_arrow_left"), gravity_center|orientation_horizontal, gui_internal_table_button_prev, widget); sb->button_box=gui_internal_box_new(this, gravity_center|orientation_horizontal); sb->button_box->background=this->background; sb->prev_button->state &= ~STATE_SENSITIVE; sb->next_button->state &= ~STATE_SENSITIVE; gui_internal_widget_append(sb->button_box, sb->prev_button); gui_internal_widget_append(sb->button_box, sb->next_button); sb->button_box->bl=this->spacing; gui_internal_widget_pack(this,sb->button_box); } /** * @brief Creates a new table widget. * * Creates and returns a new table widget. This function will * setup next/previous buttons as children. * * @param this The graphics context. * @param flags widget sizing flags. * @return The newly created widget */ struct widget * gui_internal_widget_table_new(struct gui_priv * this, enum flags flags, int buttons) { struct widget * widget = g_new0(struct widget,1); struct table_data * data = NULL; widget->type=widget_table; widget->flags=flags; widget->state=STATE_SCROLLABLE; widget->data=g_new0(struct table_data,1); widget->data_free=gui_internal_table_data_free; // We have to set background here explicitly // because it will be used by inner elements created later in this // function (navigation buttons). Else that elements won't have // any background. widget->background=this->background; data = (struct table_data*)widget->data; if (buttons) { gui_internal_scroll_buttons_init(this, widget, &data->scroll_buttons); gui_internal_widget_append(widget, data->scroll_buttons.button_box); } return widget; } /** * @brief Clears all the rows from the table. * * This function removes all rows from a table. * New rows can later be added to the table. * * @param this The internal GUI instance * @param table The table widget */ void gui_internal_widget_table_clear(struct gui_priv * this,struct widget * table) { GList * iter; struct table_data * table_data = (struct table_data* ) table->data; iter = table->children; while(iter ) { if(iter->data != table_data->scroll_buttons.button_box) { struct widget * child = (struct widget*)iter->data; gui_internal_widget_destroy(this,child); if(table->children == iter) { table->children = g_list_remove(iter,iter->data); iter=table->children; } else iter = g_list_remove(iter,iter->data); } else { iter = g_list_next(iter); } } table_data->top_row=NULL; table_data->bottom_row=NULL; } /** * @brief Moves GList pointer to the next table row, skipping other table children (button box, for example). * * @param row GList pointer into the children list * * @return GList pointer to the next row in the children list, or NULL if there are no any rows left. */ GList * gui_internal_widget_table_next_row(GList * row) { while((row=g_list_next(row))!=NULL) { if(row->data && ((struct widget *)(row->data))->type == widget_table_row) break; } return row; } /** * @brief Moves GList pointer to the previous table row, skipping other table children (button box, for example). * * @param row GList pointer into the children list * * @return GList pointer to the previous row in the children list, or NULL if there are no any rows left. */ GList * gui_internal_widget_table_prev_row(GList * row) { while((row=g_list_previous(row))!=NULL) { if(row->data && ((struct widget *)(row->data))->type == widget_table_row) break; } return row; } /** * @brief Moves GList pointer to the first table row, skipping other table children (button box, for example). * * @param row GList pointer into the children list * * @return GList pointer to the first row in the children list, or NULL if table is empty. */ GList * gui_internal_widget_table_first_row(GList * row) { if(!row) return NULL; if(row->data && ((struct widget *)(row->data))->type == widget_table_row) return row; return gui_internal_widget_table_next_row(row); } /** * @brief Gets GList pointer to the table row drawn on the top of the screen. * * @return GList pointer to the top row in the children list, or NULL. */ GList * gui_internal_widget_table_top_row(struct gui_priv *this, struct widget * table) { if(table && table->type==widget_table) { struct table_data *d=table->data; return gui_internal_widget_table_first_row(d->top_row); } return NULL; } /** * @brief Sets internal top row pointer of the table to point to a given row widget. * * @return GList pointer to the top row in the children list of the table. */ GList * gui_internal_widget_table_set_top_row(struct gui_priv *this, struct widget * table, struct widget *row) { if(table && table->type==widget_table) { struct table_data *d=table->data; d->top_row=table->children; while(d->top_row && d->top_row->data!=row) d->top_row=g_list_next(d->top_row); if(!d->top_row) d->top_row=gui_internal_widget_table_first_row(table->children); return d->top_row; } return NULL; } /** * @brief Creates a new table_row widget. * * @param this The graphics context * @param flags Sizing flags for the row * * @return The new table_row widget. */ struct widget * gui_internal_widget_table_row_new(struct gui_priv * this, enum flags flags) { struct widget * widget = g_new0(struct widget,1); widget->type=widget_table_row; widget->flags=flags; return widget; } /** * @brief Computes the column dimensions for the table. * * @param this The internal GUI instance * @param w The table widget to compute dimensions for. * * This function examines all of the rows and columns for the table w * and returns a list (GList) of table_column_desc elements that * describe each column of the table. * * The caller is responsible for freeing the returned list. */ static GList * gui_internal_compute_table_dimensions(struct gui_priv * this,struct widget * w) { GList * column_desc = NULL; GList * current_desc=NULL; GList * cur_row = w->children; struct widget * cur_row_widget=NULL; GList * cur_column=NULL; struct widget * cell_w=NULL; struct table_column_desc * current_cell=NULL; struct table_data * table_data=NULL; int height=0; int width=0; int total_width=0; int column_count=0; /* * Scroll through the the table and * 1. Compute the maximum width + height of each column across all rows. */ table_data = (struct table_data*) w->data; for(cur_row=w->children; cur_row ; cur_row = g_list_next(cur_row) ) { cur_row_widget = (struct widget*) cur_row->data; current_desc = column_desc; if(cur_row_widget == table_data->scroll_buttons.button_box) { continue; } column_count=0; for(cur_column = cur_row_widget->children; cur_column; cur_column=g_list_next(cur_column)) { cell_w = (struct widget*) cur_column->data; gui_internal_widget_pack(this,cell_w); if(current_desc == 0) { current_cell = g_new0(struct table_column_desc,1); column_desc = g_list_append(column_desc,current_cell); current_desc = g_list_last(column_desc); current_cell->height=cell_w->h; current_cell->width=cell_w->w; total_width+=cell_w->w; } else { current_cell = current_desc->data; height = cell_w->h; width = cell_w->w; if(current_cell->height < height ) { current_cell->height = height; } if(current_cell->width < width) { total_width += (width-current_cell->width); current_cell->width = width; } current_desc = g_list_next(current_desc); } column_count++; }/* column loop */ } /*row loop */ /* * If the width of all columns is less than the width off * the table expand each cell proportionally. * */ if(total_width+(this->spacing*column_count) < w->w ) { for(current_desc=column_desc; current_desc; current_desc=g_list_next(current_desc)) { current_cell = (struct table_column_desc*) current_desc->data; current_cell->width= ( (current_cell->width+this->spacing)/(float)total_width) * w->w ; } } return column_desc; } /** * @brief Computes the height and width for the table. * * The height and width are computed to display all cells in the table * at the requested height/width. * * @param this The graphics context * @param w The widget to pack. */ void gui_internal_table_pack(struct gui_priv * this, struct widget * w) { int height=0; int width=0; int count=0; GList * column_data = gui_internal_compute_table_dimensions(this,w); GList * current=0; struct table_column_desc * cell_desc=0; struct table_data * table_data = (struct table_data*)w->data; for(current = column_data; current; current=g_list_next(current)) { if(table_data->scroll_buttons.button_box == current->data ) { continue; } cell_desc = (struct table_column_desc *) current->data; width = width + cell_desc->width + this->spacing; if(height < cell_desc->height) { height = cell_desc->height ; } } for(current=w->children; current; current=g_list_next(current)) { if(current->data!= table_data->scroll_buttons.button_box) { count++; } } w->w = width; if(w->w + w->c.x > this->root.w) { w->w = this->root.w - w->c.x; } if(w->h + w->c.y > this->root.h ) { /* * Do not allow the widget to exceed the screen. * */ w->h = this->root.h- w->c.y - height; } if (table_data->scroll_buttons.button_box) { gui_internal_widget_pack(this,table_data->scroll_buttons.button_box); } /* * Deallocate column descriptions. */ g_list_foreach(column_data,(GFunc)g_free,NULL); g_list_free(column_data); } /** * @brief Invalidates coordinates for previously rendered table widget rows. * * @param table_data Data from the table object. */ void gui_internal_table_hide_rows(struct table_data * table_data) { GList*cur_row; for(cur_row=table_data->top_row; cur_row ; cur_row = g_list_next(cur_row)) { struct widget * cur_row_widget = (struct widget*)cur_row->data; if (cur_row_widget->type!=widget_table_row) continue; cur_row_widget->p.x=0; cur_row_widget->p.y=0; cur_row_widget->w=0; cur_row_widget->h=0; if(cur_row==table_data->bottom_row) break; } } /** * @brief Renders a table widget. * * @param this The graphics context * @param w The table widget to render. */ void gui_internal_table_render(struct gui_priv * this, struct widget * w) { int x; int y; GList * column_desc=NULL; GList * cur_row = NULL; GList * current_desc=NULL; struct table_data * table_data = (struct table_data*)w->data; int drawing_space_left=1; int is_first_page=1; struct table_column_desc * dim=NULL; dbg_assert(table_data); column_desc = gui_internal_compute_table_dimensions(this,w); if(!column_desc) return; y=w->p.y; gui_internal_table_hide_rows(table_data); /* * Skip rows that are on previous pages. */ cur_row = w->children; if(table_data->top_row && table_data->top_row != w->children && !table_data->scroll_buttons.button_box_hide) { cur_row = table_data->top_row; is_first_page=0; } else { table_data->top_row=NULL; } /* First, let's deactivate all columns that are in rows which are *before* * our current page. * */ GList *row = w->children; while (row != cur_row) { struct widget * cur_row_widget = (struct widget*)row->data; GList * cur_column=NULL; if(cur_row_widget == table_data->scroll_buttons.button_box) { row = g_list_next(row); continue; } for(cur_column = cur_row_widget->children; cur_column; cur_column=g_list_next(cur_column)) { struct widget * cur_widget = (struct widget*) cur_column->data; cur_widget->state &= ~STATE_SENSITIVE; } row = g_list_next(row); } /* * Loop through each row. Drawing each cell with the proper sizes, * at the proper positions. */ for(table_data->top_row=cur_row; cur_row; cur_row = g_list_next(cur_row)) { int max_height=0, bbox_height=0; struct widget * cur_row_widget; GList * cur_column=NULL; current_desc = column_desc; cur_row_widget = (struct widget*)cur_row->data; x =w->p.x+this->spacing; if(cur_row_widget == table_data->scroll_buttons.button_box) { continue; } dim = (struct table_column_desc*)current_desc->data; if (table_data->scroll_buttons.button_box && !table_data->scroll_buttons.button_box_hide) bbox_height=table_data->scroll_buttons.button_box->h; if( y + dim->height + bbox_height + this->spacing >= w->p.y + w->h ) { drawing_space_left=0; } for(cur_column = cur_row_widget->children; cur_column; cur_column=g_list_next(cur_column)) { struct widget * cur_widget = (struct widget*) cur_column->data; dim = (struct table_column_desc*)current_desc->data; if (drawing_space_left) { cur_widget->p.x=x; cur_widget->w=dim->width; cur_widget->p.y=y; cur_widget->h=dim->height; x=x+cur_widget->w; max_height = dim->height; /* We pack the widget before rendering to ensure that the x and y * coordinates get pushed down. */ cur_widget->state |= STATE_SENSITIVE; gui_internal_widget_pack(this,cur_widget); gui_internal_widget_render(this,cur_widget); if(dim->height > max_height) { max_height = dim->height; } } else { /* Deactivate contents that we don't have space for. */ cur_widget->state &= ~STATE_SENSITIVE; } } if (drawing_space_left) { /* Row object should have its coordinates in actual * state to be able to pass mouse clicks to Column objects */ cur_row_widget->p.x=w->p.x; cur_row_widget->w=w->w; cur_row_widget->p.y=y; cur_row_widget->h=max_height; y = y + max_height; table_data->bottom_row=cur_row; current_desc = g_list_next(current_desc); } } /* By default, hide all scroll buttons. */ table_data->scroll_buttons.next_button->state&= ~STATE_SENSITIVE; table_data->scroll_buttons.prev_button->state&= ~STATE_SENSITIVE; if(table_data->scroll_buttons.button_box && (!drawing_space_left || !is_first_page) && !table_data->scroll_buttons.button_box_hide ) { table_data->scroll_buttons.button_box->p.y =w->p.y+w->h-table_data->scroll_buttons.button_box->h - this->spacing; if(table_data->scroll_buttons.button_box->p.y < y ) { table_data->scroll_buttons.button_box->p.y=y; } table_data->scroll_buttons.button_box->p.x = w->p.x; table_data->scroll_buttons.button_box->w = w->w; gui_internal_widget_pack(this,table_data->scroll_buttons.button_box); if(table_data->scroll_buttons.next_button->p.y > w->p.y + w->h + table_data->scroll_buttons.next_button->h) { table_data->scroll_buttons.button_box->p.y = w->p.y + w->h - table_data->scroll_buttons.button_box->h; } if(!drawing_space_left) { table_data->scroll_buttons.next_button->state|= STATE_SENSITIVE; } if(table_data->top_row != w->children) { table_data->scroll_buttons.prev_button->state|= STATE_SENSITIVE; } gui_internal_widget_render(this,table_data->scroll_buttons.button_box); } /* * Deallocate column descriptions. */ g_list_foreach(column_desc,(GFunc)g_free,NULL); g_list_free(column_desc); } /** * @brief Handles the 'next page' table event. * * A callback function that is invoked when the 'next page' button is pressed * to advance the contents of a table widget. * * @param this The graphics context. * @param wm The button widget that was pressed. * @param data */ void gui_internal_table_button_next(struct gui_priv * this, struct widget * wm, void *data) { struct widget * table_widget=NULL; struct table_data * table_data = NULL; if(wm) table_widget = (struct widget * ) wm->data; else table_widget = data; if(table_widget && table_widget->type==widget_table) table_data = (struct table_data*) table_widget->data; if(table_data) { GList *l=g_list_next(table_data->bottom_row); if(l) { gui_internal_table_hide_rows(table_data); table_data->top_row=l; } } if(wm) wm->state&= ~STATE_HIGHLIGHTED; gui_internal_menu_render(this); } /** * @brief Handles the 'previous page' table event. * * A callback function that is invoked when the 'previous page' button is pressed * to go back in the contents of a table widget. * * @param this The graphics context. * @param wm The button widget that was pressed. */ void gui_internal_table_button_prev(struct gui_priv * this, struct widget * wm, void *data) { struct widget * table_widget = NULL; struct table_data * table_data = NULL; if(wm) table_widget=(struct widget * ) wm->data; else table_widget=(struct widget * ) data; if(table_widget && table_widget->type==widget_table) table_data = (struct table_data*) table_widget->data; if(table_data) { int bottomy=table_widget->p.y+table_widget->h; int n; GList *top=table_data->top_row; struct widget *w=(struct widget*)top->data; if(table_data->scroll_buttons.button_box->p.y!=0) { bottomy=table_data->scroll_buttons.button_box->p.y; } n=(bottomy-w->p.y)/w->h; while(n-- > 0 && (top=g_list_previous(top))!=NULL); gui_internal_table_hide_rows(table_data); table_data->top_row=top; } if(wm) wm->state&= ~STATE_HIGHLIGHTED; gui_internal_menu_render(this); } /** * @brief Deallocates a table_data structure. * * @note button_box and its children (next_button,prev_button) * have their memory managed by the table itself. * * @param p The table_data structure */ void gui_internal_table_data_free(void * p) { g_free(p); } navit-0.5.0+dfsg.1/navit/gui/internal/gui_internal_widget.h000066400000000000000000000160201264204753600236400ustar00rootroot00000000000000enum gui_internal_reason { gui_internal_reason_click=1, gui_internal_reason_keypress, gui_internal_reason_keypress_finish }; //############################################################################################################## //# Description: //# Comment: //# Authors: Martin Schaller (04/2008) //############################################################################################################## struct widget { enum widget_type type; struct graphics_gc *background,*text_background; struct graphics_gc *foreground_frame; struct graphics_gc *foreground; char *text; struct graphics_image *img; /** * A function to be invoked on actions. * @li widget The widget that is receiving the button press. * */ void (*func)(struct gui_priv *priv, struct widget *widget, void *data); enum gui_internal_reason reason; int datai; void *data; /** * @brief A function to deallocate data */ void (*data_free)(void *data); /** * @brief a function that will be called as the widget is being destroyed. * This function can act as a destructor for the widget. It allows for * on deallocation actions to be specified on a per widget basis. * This function will call g_free on the widget (if required). */ void (*wfree) (struct gui_priv *this_, struct widget * w); char *prefix; char *name; char *speech; char *command; struct pcoord c; struct item item; int selection_id; int state; struct point p; int wmin,hmin; int w,h; int textw,texth; int font_idx; int bl,br,bt,bb,spx,spy; int border; int packed; /** * The number of widgets to layout horizontally when doing * a orientation_horizontal_vertical layout */ int cols; enum flags flags; int flags2; void *instance; int (*set_attr)(void *, struct attr *); int (*get_attr)(void *, enum attr_type, struct attr *, struct attr_iter *); void (*remove_cb)(void *, struct callback *cb); struct callback *cb; struct attr on; struct attr off; int deflt; int is_on; int redraw; struct menu_data *menu_data; struct form *form; GList *children; struct widget *parent; struct scroll_buttons *scroll_buttons; }; struct scroll_buttons { /** * Button box should not be displayed if button_box_hide is not zero. */ int button_box_hide; /** * A container box that is the child of the table widget that contains+groups * the next and previous button. */ struct widget * button_box; /** * A button widget to handle 'next page' requests */ struct widget * next_button; /** * A button widget to handle 'previous page' requests. */ struct widget * prev_button; /** * a pointer to the gui context. * This is needed by the free function to destroy the buttons. */ struct gui_priv * this; }; /** * @brief A structure to store information about a table. * * The table_data widget stores pointers to extra information needed by the * table widget. * * The table_data structure needs to be freed with data_free along with the widget. * */ struct table_data { /** * A GList pointer into a widget->children list that indicates the row * currently being rendered at the top of the table. */ GList * top_row; /** * A Glist pointer into a widget->children list that indicates the row * currently being rendered at the bottom of the table. */ GList * bottom_row; struct scroll_buttons scroll_buttons; }; /** * A data structure that holds information about a column that makes up a table. * * */ struct table_column_desc { /** * The computed height of a cell in the table. */ int height; /** * The computed width of a cell in the table. */ int width; }; /* prototypes */ enum flags; struct graphics_image; struct gui_priv; struct point; struct table_data; struct widget; struct widget *gui_internal_label_font_new(struct gui_priv *this, const char *text, int font); struct widget *gui_internal_label_new(struct gui_priv *this, const char *text); struct widget *gui_internal_label_new_abbrev(struct gui_priv *this, const char *text, int maxwidth); struct widget *gui_internal_image_new(struct gui_priv *this, struct graphics_image *image); struct widget *gui_internal_text_font_new(struct gui_priv *this, const char *text, int font, enum flags flags); struct widget *gui_internal_text_new(struct gui_priv *this, const char *text, enum flags flags); struct widget *gui_internal_button_font_new_with_callback(struct gui_priv *this, const char *text, int font, struct graphics_image *image, enum flags flags, void (*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data); struct widget *gui_internal_button_new_with_callback(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags, void (*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data); struct widget *gui_internal_button_new(struct gui_priv *this, const char *text, struct graphics_image *image, enum flags flags); struct widget *gui_internal_find_widget(struct widget *wi, struct point *p, int flags); void gui_internal_highlight_do(struct gui_priv *this, struct widget *found); void gui_internal_highlight(struct gui_priv *this); struct widget *gui_internal_box_new_with_label(struct gui_priv *this, enum flags flags, const char *label); struct widget *gui_internal_box_new(struct gui_priv *this, enum flags flags); void gui_internal_widget_reset_pack(struct gui_priv *this, struct widget *w); void gui_internal_widget_append(struct widget *parent, struct widget *child); void gui_internal_widget_prepend(struct widget *parent, struct widget *child); void gui_internal_widget_insert_sorted(struct widget *parent, struct widget *child, GCompareFunc func); void gui_internal_widget_children_destroy(struct gui_priv *this, struct widget *w); void gui_internal_widget_destroy(struct gui_priv *this, struct widget *w); void gui_internal_widget_render(struct gui_priv *this, struct widget *w); void gui_internal_widget_pack(struct gui_priv *this, struct widget *w); struct widget *gui_internal_button_label(struct gui_priv *this, const char *label, int mode); struct widget *gui_internal_widget_table_new(struct gui_priv *this, enum flags flags, int buttons); void gui_internal_widget_table_clear(struct gui_priv *this, struct widget *table); GList *gui_internal_widget_table_next_row(GList *row); GList *gui_internal_widget_table_prev_row(GList *row); GList *gui_internal_widget_table_first_row(GList *row); GList *gui_internal_widget_table_top_row(struct gui_priv *this, struct widget *table); GList *gui_internal_widget_table_set_top_row(struct gui_priv *this, struct widget * table, struct widget *row); struct widget *gui_internal_widget_table_row_new(struct gui_priv *this, enum flags flags); void gui_internal_table_pack(struct gui_priv *this, struct widget *w); void gui_internal_table_hide_rows(struct table_data *table_data); void gui_internal_table_render(struct gui_priv *this, struct widget *w); void gui_internal_table_button_next(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_table_button_prev(struct gui_priv *this, struct widget *wm, void *data); void gui_internal_table_data_free(void *p); /* end of prototypes */ navit-0.5.0+dfsg.1/navit/gui/qml/000077500000000000000000000000001264204753600164225ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/gui/qml/CMakeLists.txt000066400000000000000000000023031264204753600211600ustar00rootroot00000000000000file(COPY "skins" DESTINATION ".") add_definitions( -DMODULE=gui_qml ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) QT4_GENERATE_MOC(proxy.h ${CMAKE_CURRENT_BINARY_DIR}/proxy.moc) QT4_GENERATE_MOC(ngqpoint.h ${CMAKE_CURRENT_BINARY_DIR}/ngqpoint.moc) QT4_GENERATE_MOC(searchProxy.h ${CMAKE_CURRENT_BINARY_DIR}/searchProxy.moc) QT4_GENERATE_MOC(bookmarksProxy.h ${CMAKE_CURRENT_BINARY_DIR}/bookmarksProxy.moc) QT4_GENERATE_MOC(vehicleProxy.h ${CMAKE_CURRENT_BINARY_DIR}/vehicleProxy.moc) QT4_GENERATE_MOC(navitProxy.h ${CMAKE_CURRENT_BINARY_DIR}/navitProxy.moc) QT4_GENERATE_MOC(guiProxy.h ${CMAKE_CURRENT_BINARY_DIR}/guiProxy.moc) QT4_GENERATE_MOC(routeProxy.h ${CMAKE_CURRENT_BINARY_DIR}/routeProxy.moc) QT4_GENERATE_MOC(gui_qml.cpp ${CMAKE_CURRENT_BINARY_DIR}/gui_qml.moc) module_add_library(gui_qml gui_qml.cpp ${CMAKE_CURRENT_BINARY_DIR}/proxy.moc ${CMAKE_CURRENT_BINARY_DIR}/ngqpoint.moc ${CMAKE_CURRENT_BINARY_DIR}/searchProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/bookmarksProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/vehicleProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/navitProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/guiProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/routeProxy.moc ${CMAKE_CURRENT_BINARY_DIR}/gui_qml.moc ) navit-0.5.0+dfsg.1/navit/gui/qml/Makefile.am000066400000000000000000000015251264204753600204610ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @QT_DECLARATIVE_CFLAGS@ @QT_GUI_CFLAGS@ @QT_XML_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=gui_qml modulegui_LTLIBRARIES = libgui_qml.la libgui_qml_la_SOURCES = proxy.moc proxy.h ngqpoint.moc ngqpoint.h searchProxy.moc routeProxy.h searchProxy.h bookmarksProxy.moc bookmarksProxy.h vehicleProxy.moc vehicleProxy.h navitProxy.moc navitProxy.h guiProxy.moc guiProxy.h gui_qml.moc gui_qml.cpp libgui_qml_la_LDFLAGS = @QT_DECLARATIVE_LIBS@ @QT_GUI_LIBS@ @QT_XML_LIBS@ -module -avoid-version BUILT_SOURCES = gui_qml.moc proxy.moc ngqpoint.moc routeProxy.moc searchProxy.moc bookmarksProxy.moc vehicleProxy.moc navitProxy.moc guiProxy.moc %.moc: %.h @MOC@ $(srcdir)/$< > $@ || touch $@ %.moc: %.cpp @MOC@ $(srcdir)/$< > $@ || touch $@ distclean-local: -$(RM) *.moc SUBDIRS=skins navit-0.5.0+dfsg.1/navit/gui/qml/bookmarksProxy.h000066400000000000000000000133201264204753600216240ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_BOOKMARKSPROXY_H #define NAVIT_GUI_QML_BOOKMARKSPROXY_H class NGQProxyBookmarks : public NGQProxy { Q_OBJECT; public: NGQProxyBookmarks(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; public slots: void moveRoot() { struct attr mattr; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_root(mattr.u.bookmarks); } void moveUp() { struct attr mattr; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_up(mattr.u.bookmarks); } void moveDown(QString path) { struct attr mattr; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_move_down(mattr.u.bookmarks,path.toLocal8Bit().constData()); } QString getBookmarks() { struct attr attr,mattr; struct item* item; struct coord c; QDomDocument retDoc("bookmarks"); QDomElement entries; entries=retDoc.createElement("bookmarks"); retDoc.appendChild(entries); navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); if (bookmarks_item_cwd(mattr.u.bookmarks)) { QDomElement entry=retDoc.createElement("bookmark"); entry.appendChild(this->_fieldValueHelper(retDoc,"label","..")); entry.appendChild(this->_fieldValueHelper(retDoc,"path","..")); entry.appendChild(this->_fieldValueHelper(retDoc,"type",QString(item_to_name(type_bookmark_folder)))); entry.appendChild(this->_fieldValueHelper(retDoc,"distance","")); entry.appendChild(this->_fieldValueHelper(retDoc,"direction","")); entry.appendChild(this->_fieldValueHelper(retDoc,"coords",QString("%1 %2").arg(0).arg(0))); entries.appendChild(entry); } bookmarks_item_rewind(mattr.u.bookmarks); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { QString label; QString path; if (item->type != type_bookmark && item->type != type_bookmark_folder) continue; if (!item_attr_get(item, attr_label, &attr)) continue; label=QString::fromLocal8Bit(attr.u.str); if (!item_attr_get(item, attr_path, &attr)) { path=""; } path=QString::fromLocal8Bit(attr.u.str); item_coord_get(item, &c, 1); QDomElement entry=retDoc.createElement("bookmark"); entry.appendChild(this->_fieldValueHelper(retDoc,"label",label)); entry.appendChild(this->_fieldValueHelper(retDoc,"path",path)); entry.appendChild(this->_fieldValueHelper(retDoc,"type",QString(item_to_name(item->type)))); //entry.appendChild(this->_fieldValueHelper(retDoc,"distance",QString::number(idist/1000))); entry.appendChild(this->_fieldValueHelper(retDoc,"distance","100500")); //entry.appendChild(this->_fieldValueHelper(retDoc,"direction",dirbuf)); entry.appendChild(this->_fieldValueHelper(retDoc,"direction","nahut")); entry.appendChild(this->_fieldValueHelper(retDoc,"coords",QString("%1 %2").arg(c.x).arg(c.y))); entries.appendChild(entry); } dbg(lvl_info,"%s\n",retDoc.toString().toLocal8Bit().constData()); return retDoc.toString(); } QString AddFolder(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_add_bookmark(attr.u.bookmarks, NULL, description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString AddBookmark(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_add_bookmark(attr.u.bookmarks, this->object->currentPoint->pc(), description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString Cut(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_cut_bookmark(attr.u.bookmarks, description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString Copy(QString description) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_copy_bookmark(attr.u.bookmarks, description.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } QString Paste() { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_paste_bookmark(attr.u.bookmarks) ) { return "Failed!"; } else { return "Success"; } } QString Delete(QString bookmark) { struct attr attr; navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); if (!bookmarks_delete_bookmark(attr.u.bookmarks, bookmark.toLocal8Bit().constData()) ) { return "Failed!"; } else { return "Success"; } } void setPoint(QString bookmark) { struct attr attr, mattr; struct item* item; struct coord c; navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); bookmarks_item_rewind(mattr.u.bookmarks); while ((item=bookmarks_get_item(mattr.u.bookmarks))) { QString label; if (item->type != type_bookmark) continue; if (!item_attr_get(item, attr_label, &attr)) continue; label=QString::fromLocal8Bit(attr.u.str); dbg(lvl_debug,"Bookmark is %s\n",bookmark.toStdString().c_str()); if (label.compare(bookmark)) continue; item_coord_get(item, &c, 1); if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint=new NGQPoint(this->object,&c,bookmark,Bookmark,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } return; } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return 0; } int setAttrFunc(struct attr* attr) {return 0; } struct attr_iter* getIterFunc() { return NULL; }; void dropIterFunc(struct attr_iter* iter) { return; }; private: }; #include "bookmarksProxy.moc" #endif /* NAVIT_GUI_QML_BOOKMARKSPROXY_H */ navit-0.5.0+dfsg.1/navit/gui/qml/guiProxy.h000066400000000000000000000110021264204753600204130ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_GUIPROXY_H #define NAVIT_GUI_QML_GUIPROXY_H class NGQProxyGui : public NGQProxy { Q_OBJECT; Q_PROPERTY(QString iconPath READ iconPath CONSTANT); Q_PROPERTY(QString commandFunction READ commandFunction CONSTANT); Q_PROPERTY(QString localeName READ localeName CONSTANT); Q_PROPERTY(QString langName READ langName CONSTANT); Q_PROPERTY(QString ctryName READ ctryName CONSTANT); Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthSignal STORED false); Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightSignal STORED false); private: QStringList returnPath; public: NGQProxyGui(struct gui_priv* this_,QObject *parent) : NGQProxy(this_, parent) { this->source=QString(""); } void setNewPoint(struct point* p,NGQPointTypes type) { if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint = new NGQPoint(this->object,p,type,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } void setNewPoint(struct coord* c,NGQPointTypes type) { if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint = new NGQPoint(this->object,c,type,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } void setNewPoint(struct pcoord* pc,NGQPointTypes type) { if (this->object->currentPoint!=NULL) { delete this->object->currentPoint; } this->object->currentPoint = new NGQPoint(this->object,pc,type,NULL); this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); } void processCommand(QString function) { //QDeclarativeExpression commandJS(this->object->guiWidget->rootContext(),QString(),qobject_cast(this->object->guiWidget->rootObject())); //commandJS.setSourceLocation("command.js",0); //this->function=function; //commandJS.eval(qobject_cast(this->object->guiWidget->rootObject())); } signals: void widthSignal(int); void heightSignal(int); public slots: void pushPage(QString page) { returnPath.push_front(page); } QString popPage() { if (!returnPath.empty()) { if (returnPath.length()>1) { returnPath.pop_front(); } return returnPath.first(); } return QString(); } int lengthPage() { return returnPath.length(); } void backToMap() { if (this->object->graphicsWidget) { this->object->graphicsWidget->setFocus(Qt::ActiveWindowFocusReason); this->object->switcherWidget->setCurrentWidget(this->object->graphicsWidget); this->object->graphicsWidget->show(); } } void switchToMenu(struct point* p) { if (!this->object->lazy) { this->returnPath.clear(); this->object->guiWidget->setSource(QUrl::fromLocalFile(QString(this->object->source)+"/"+this->object->skin+"/main.qml")); } this->setNewPoint(p,MapPoint); this->object->guiWidget->setFocus(Qt::ActiveWindowFocusReason); this->object->switcherWidget->setCurrentWidget(this->object->guiWidget); } //Properties QString iconPath() { return QString(this->object->icon_src); } int width() { return this->object->w; } void setWidth(int w) { this->object->w=w; this->widthSignal(w); } int height() { return this->object->h; } void setHeight(int h) { this->object->h=h; this->heightSignal(h); } QString commandFunction() { return this->function; } //Locale properties QString localeName() { return QString()+"LANG="+getenv("LANG"); } QString langName() { #ifdef HAVE_API_WIN32_BASE char str[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, str, sizeof(str)); return QString()+"LOCALE_SABBREVLANGNAME="+str; #else return QString(); #endif } QString ctryName() { #ifdef HAVE_API_WIN32_BASE char str[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, str, sizeof(str)); return QString()+"LOCALE_SABBREVCTRYNAME="+str; #else return QString(); #endif } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return gui_get_attr(this->object->gui, type, attr, iter); } int setAttrFunc(struct attr* attr) {return gui_set_attr(this->object->gui,attr); } private: QString source; QString function; }; void __setNewPoint(struct gui_priv* this_,struct coord* c, NGQPointTypes type) { this_->guiProxy->setNewPoint(c,type); } void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type) { this_->guiProxy->setNewPoint(pc,type); } #include "guiProxy.moc" #endif /* NAVIT_GUI_QML_GUIPROXY_H */ navit-0.5.0+dfsg.1/navit/gui/qml/gui_qml.cpp000066400000000000000000000317561264204753600205770ustar00rootroot00000000000000#include #include #include #include #include #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #endif #include "plugin.h" #include "item.h" #include "attr.h" #include "xmlconfig.h" #include "color.h" #include "gui.h" #include "callback.h" #include "debug.h" #include "navit.h" #include "point.h" #include "graphics.h" #include "event.h" #include "map.h" #include "coord.h" #include "vehicle.h" #include "coord.h" #include "transform.h" #include "mapset.h" #include "route.h" #include "country.h" #include "track.h" #include "search.h" #include "bookmarks.h" #include "command.h" #include "keys.h" #include "layout.h" struct gui_priv { struct navit *nav; struct gui *gui; struct attr self; struct vehicle* currVehicle; //configuration items int fullscreen; int menu_on_map_click; int signal_on_map_click; int w; int h; char *source; char *skin; char* icon_src; int radius; int pitch; int lazy; //When TRUE - menu state will not be changed during map/menu switches, FALSE - menu will be always reset to main.qml //Interface stuff struct callback_list *cbl; QCoreApplication *app; struct window *win; struct graphics *gra; QWidget *mainWindow; QWidget *graphicsWidget; QDeclarativeView *guiWidget; QDeclarativeView *prevGuiWidget; QStackedLayout *switcherWidget; struct callback *button_cb; struct callback *motion_cb; struct callback *resize_cb; struct callback *keypress_cb; struct callback *window_closed_cb; //Proxy objects class NGQProxyGui* guiProxy; class NGQProxyNavit* navitProxy; class NGQProxyVehicle* vehicleProxy; class NGQProxySearch* searchProxy; class NGQProxyBookmarks* bookmarksProxy; class NGQProxyRoute* routeProxy; class NGQPoint* currentPoint; }; #include "proxy.h" #include "ngqpoint.h" #include "searchProxy.h" #include "routeProxy.h" #include "bookmarksProxy.h" #include "vehicleProxy.h" #include "navitProxy.h" #include "guiProxy.h" //Main window class for resizeEvent handling #ifdef Q_WS_X11 #include class NGQMainWindow : public QX11EmbedWidget { #else class NGQMainWindow : public QWidget { #endif /* Q_WS_X11 */ public: #ifdef Q_WS_X11 NGQMainWindow(struct gui_priv* this_,QWidget *parent) : QX11EmbedWidget(parent) { #else NGQMainWindow(struct gui_priv* this_,QWidget *parent) : QWidget(parent) { #endif /* Q_WS_X11 */ this->object=this_; } protected: void resizeEvent(QResizeEvent *) { this->object->w=this->width(); this->object->h=this->height(); //YES, i KNOW about signal/slot thing this->object->guiProxy->setWidth(this->width()); this->object->guiProxy->setHeight(this->height()); } void closeEvent(QCloseEvent* event) { this->object->graphicsWidget->close(); } private: struct gui_priv* object; }; //Meta object #include "gui_qml.moc" static void gui_qml_dbus_signal(struct gui_priv *this_, struct point *p) { struct displaylist_handle *dlh; struct displaylist *display; struct displayitem *di; display=navit_get_displaylist(this_->nav); dlh=graphics_displaylist_open(display); while ((di=graphics_displaylist_next(dlh))) { struct item *item=graphics_displayitem_get_item(di); if (item_is_point(*item) && graphics_displayitem_get_displayed(di) && graphics_displayitem_within_dist(display, di, p, 10)) { struct map_rect *mr=map_rect_new(item->map, NULL); struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); struct attr attr; if (item_attr_get(itemo, attr_data, &attr)) { struct attr cb,*attr_list[2]; int valid=0; attr.type=attr_data; attr_list[0]=&attr; attr_list[1]=NULL; if (navit_get_attr(this_->nav, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); } map_rect_destroy(mr); } } graphics_displaylist_close(dlh); } static void gui_qml_button(void *data, int pressed, int button, struct point *p) { struct gui_priv *this_=(struct gui_priv*)data; // check whether the position of the mouse changed during press/release OR if it is the scrollwheel if (!navit_handle_button(this_->nav, pressed, button, p, NULL)) { dbg(lvl_debug,"navit has handled button\n"); return; } dbg(lvl_debug,"enter %d %d\n", pressed, button); if (this_->signal_on_map_click) { gui_qml_dbus_signal(this_, p); return; } if ( button == 1 && this_->menu_on_map_click ) { this_->guiProxy->switchToMenu(p); } } static void gui_qml_motion(void *data, struct point *p) { struct gui_priv *this_=(struct gui_priv*)data; navit_handle_motion(this_->nav, p); return; } static void gui_qml_resize(void *data, int w, int h) { struct gui_priv *this_=(struct gui_priv*)data; navit_handle_resize(this_->nav, w, h); } static void gui_qml_keypress(void *data, char *key) { struct gui_priv *this_=(struct gui_priv*) data; int w,h; struct point p; transform_get_size(navit_get_trans(this_->nav), &w, &h); switch (*key) { case NAVIT_KEY_UP: p.x=w/2; p.y=0; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_DOWN: p.x=w/2; p.y=h; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_LEFT: p.x=0; p.y=h/2; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_RIGHT: p.x=w; p.y=h/2; navit_set_center_screen(this_->nav, &p, 1); break; case NAVIT_KEY_ZOOM_IN: navit_zoom_in(this_->nav, 2, NULL); break; case NAVIT_KEY_ZOOM_OUT: navit_zoom_out(this_->nav, 2, NULL); break; case NAVIT_KEY_RETURN: case NAVIT_KEY_MENU: p.x=w/2; p.y=h/2; this_->guiProxy->switchToMenu(&p); break; } return; } static void gui_qml_window_closed(struct gui_priv *data) { struct gui_priv *this_=(struct gui_priv*) data; this_->navitProxy->quit(); } //GUI interface calls static int argc=1; static char *argv[]={(char *)"navit",NULL}; static int gui_qml_set_graphics(struct gui_priv *this_, struct graphics *gra) { QString xid; NGQMainWindow* _mainWindow; bool ok; this_->gra=gra; //Check if we are already in Qt environment if (QApplication::instance()==NULL) { //Not yet this_->app=new QApplication(argc,argv); } else { this_->app=QApplication::instance(); } //Link graphics events this_->button_cb=callback_new_attr_1(callback_cast(gui_qml_button), attr_button, this_); graphics_add_callback(gra, this_->button_cb); this_->motion_cb=callback_new_attr_1(callback_cast(gui_qml_motion), attr_motion, this_); graphics_add_callback(gra, this_->motion_cb); this_->resize_cb=callback_new_attr_1(callback_cast(gui_qml_resize), attr_resize, this_); graphics_add_callback(gra, this_->resize_cb); this_->keypress_cb=callback_new_attr_1(callback_cast(gui_qml_keypress), attr_keypress, this_); graphics_add_callback(gra, this_->keypress_cb); this_->window_closed_cb=callback_new_attr_1(callback_cast(gui_qml_window_closed), attr_window_closed, this_); graphics_add_callback(gra, this_->window_closed_cb); //Create main window this_->switcherWidget = new QStackedLayout(); _mainWindow = new NGQMainWindow(this_, NULL); #ifdef Q_WS_X11 xid=getenv("NAVIT_XID"); if (xid.length()>0) { _mainWindow->embedInto(xid.toULong(&ok,0)); }else{ dbg(lvl_error, "\nFATAL: Environment variable NAVIT_XID not set.\n" " Please set NAVIT_XID to the window ID of the window to embed into.\n"); exit(1); } #endif /* Q_WS_X11 */ this_->mainWindow=_mainWindow; if ( this_->w && this_->h ) { this_->mainWindow->resize(this_->w,this_->h); } if ( this_->fullscreen ) { this_->mainWindow->showFullScreen(); } this_->mainWindow->setLayout(this_->switcherWidget); //Create proxy object and bind them to gui widget this_->guiProxy = new NGQProxyGui(this_,this_->mainWindow); this_->navitProxy = new NGQProxyNavit(this_,this_->mainWindow); this_->vehicleProxy = new NGQProxyVehicle(this_,this_->mainWindow); this_->searchProxy = new NGQProxySearch(this_,this_->mainWindow); this_->bookmarksProxy = new NGQProxyBookmarks(this_,this_->mainWindow); this_->routeProxy = new NGQProxyRoute(this_,this_->mainWindow); //Check, if we have compatible graphics this_->graphicsWidget = (QWidget*)graphics_get_data(gra,"qt_widget"); if (this_->graphicsWidget == NULL ) { this_->graphicsWidget = new QLabel(QString("Sorry, current graphics type is incompatible with this gui.")); } this_->switcherWidget->addWidget(this_->graphicsWidget); //Instantiate qml components this_->guiWidget = new QDeclarativeView(NULL); this_->guiWidget->setResizeMode(QDeclarativeView::SizeRootObjectToView); this_->guiWidget->rootContext()->setContextProperty("gui",this_->guiProxy); this_->guiWidget->rootContext()->setContextProperty("navit",this_->navitProxy); this_->guiWidget->rootContext()->setContextProperty("vehicle",this_->vehicleProxy); this_->guiWidget->rootContext()->setContextProperty("search",this_->searchProxy); this_->guiWidget->rootContext()->setContextProperty("bookmarks",this_->bookmarksProxy); this_->guiWidget->rootContext()->setContextProperty("route",this_->routeProxy); this_->guiWidget->rootContext()->setContextProperty("point",this_->currentPoint); QString mainQml = QString(this_->source)+"/"+this_->skin+"/main.qml"; if (!QFile(mainQml).exists()){ dbg(lvl_error, "FATAL: QML file %s not found. Navit is not installed correctly.\n", mainQml.toAscii().constData()); exit(1); } this_->guiWidget->setSource(QUrl::fromLocalFile(mainQml)); this_->switcherWidget->addWidget(this_->guiWidget); //Switch to graphics navit_draw(this_->nav); this_->switcherWidget->setCurrentWidget(this_->graphicsWidget); this_->mainWindow->show(); return 0; } static int gui_qml_get_attr(struct gui_priv *this_, enum attr_type type, struct attr *attr) { switch (type) { case attr_fullscreen: attr->u.num=this_->fullscreen; break; case attr_skin: attr->u.str=this_->skin; break; case attr_pitch: attr->u.num=this_->pitch; break; case attr_radius: attr->u.num=this_->radius; break; default: return 0; } attr->type=type; return 1; } static int gui_qml_set_attr(struct gui_priv *this_, struct attr *attr) { switch (attr->type) { case attr_fullscreen: if (!(this_->fullscreen) && (attr->u.num)) { this_->mainWindow->showFullScreen(); } if ((this_->fullscreen) && !(attr->u.num)) { this_->mainWindow->showNormal(); } this_->fullscreen=attr->u.num; return 1; case attr_pitch: this_->pitch=attr->u.num; return 1; case attr_radius: this_->radius=attr->u.num; return 1; default: dbg(lvl_error,"unknown attr: %s\n",attr_to_name(attr->type)); return 1; } } struct gui_methods gui_qml_methods = { NULL, NULL, gui_qml_set_graphics, NULL, NULL, NULL, NULL, gui_qml_get_attr, NULL, gui_qml_set_attr, }; static void gui_qml_command(struct gui_priv *this_, char *function, struct attr **in, struct attr ***out, int *valid) { this_->guiProxy->processCommand(function); } static struct command_table commands[] = { {"*",command_cast(gui_qml_command)}, }; static struct gui_priv * gui_qml_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) { struct gui_priv *this_; struct attr *attr; *meth=gui_qml_methods; this_=g_new0(struct gui_priv, 1); this_->nav=nav; this_->gui=gui; this_->self.type=attr_gui; this_->self.u.gui=gui; navit_ignore_graphics_events(this_->nav, 1); this_->fullscreen = 0; //NO by default if( (attr=attr_search(attrs,NULL,attr_fullscreen))) this_->fullscreen=attr->u.num; this_->menu_on_map_click = 1; //YES by default; if( (attr=attr_search(attrs,NULL,attr_menu_on_map_click))) this_->menu_on_map_click=attr->u.num; this_->signal_on_map_click = 0; //YES by default; if( (attr=attr_search(attrs,NULL,attr_signal_on_map_click))) this_->signal_on_map_click=attr->u.num; this_->radius = 10; //Default value if( (attr=attr_search(attrs,NULL,attr_radius))) this_->radius=attr->u.num; this_->pitch = 20; //Default value if( (attr=attr_search(attrs,NULL,attr_pitch))) this_->pitch=attr->u.num; this_->lazy = 1; //YES by default if( (attr=attr_search(attrs,NULL,attr_lazy))) this_->lazy=attr->u.num; this_->w=800; //Default value if( (attr=attr_search(attrs,NULL,attr_width))) this_->w=attr->u.num; this_->h=600; //Default value if( (attr=attr_search(attrs,NULL,attr_height))) this_->h=attr->u.num; if( (attr=attr_search(attrs,NULL,attr_source))) this_->source=attr->u.str; if( (attr=attr_search(attrs,NULL,attr_skin))) this_->skin=attr->u.str; if( (attr=attr_search(attrs,NULL,attr_icon_src))) this_->icon_src=attr->u.str; if ( this_->source==NULL ) { this_->source=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"),"/gui/qml/skins",NULL); } if ( this_->skin==NULL ) { this_->skin=g_strdup("navit"); } if ( this_->icon_src==NULL ) { this_->icon_src=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"),"/xpm/",NULL); } if ((attr=attr_search(attrs, NULL, attr_callback_list))) { command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this_); } this_->cbl=callback_list_new(); return this_; } void plugin_init(void) { plugin_register_gui_type("qml",gui_qml_new); } navit-0.5.0+dfsg.1/navit/gui/qml/navitProxy.h000066400000000000000000000111741264204753600207620ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_NAVIT_H #define NAVIT_GUI_QML_NAVIT_H void __setNewPoint(struct gui_priv* this_,struct coord* c, NGQPointTypes type); class NGQProxyNavit : public NGQProxy { Q_OBJECT; public: NGQProxyNavit(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; public slots: void quit() { struct attr navit; navit.type=attr_navit; navit.u.navit=this->object->nav; navit_destroy(navit.u.navit); event_main_loop_quit(); } void setObjectByName(const QString& attr_name,const QString& attr_value) { if (attr_name=="layout") { navit_set_layout_by_name(this->object->nav,attr_value.toStdString().c_str()); } if (attr_name=="vehicle") { navit_set_vehicle_by_name(this->object->nav,attr_value.toStdString().c_str()); } return; } QString getAttrList(const QString &attr_name) { struct attr attr; struct attr_iter *iter; int counter=0; QString currentValue; QDomDocument retDoc; QDomElement entries; entries=retDoc.createElement("attributes"); retDoc.appendChild(entries); //Find current value getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, NULL) ; if (attr.type==attr_layout) { currentValue=attr.u.layout->name; } //Fill da list iter=getIterFunc(); if (iter == NULL) { return QString(); } while (getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, iter) ) { QStandardItem* curItem=new QStandardItem(); //Listed attributes are usualy have very complex structure if (attr.type==attr_layout) { curItem->setData(QVariant(counter),NGQStandardItemModel::ItemId); curItem->setData(QVariant(attr.u.layout->name),NGQStandardItemModel::ItemName); curItem->setData(QVariant(attr.u.layout->name),NGQStandardItemModel::ItemValue); if (currentValue==attr.u.layout->name) { this->_itemId=counter; } } if (attr.type==attr_vehicle) { QStandardItem* curItem=new QStandardItem(); QDomElement entry=retDoc.createElement("vehicle"); entries.appendChild(entry); this->object->currVehicle=attr.u.vehicle; curItem->setData(QVariant(this->object->vehicleProxy->getAttr("name")),NGQStandardItemModel::ItemName); entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString(this->object->vehicleProxy->getAttr("name")))); //Detecting current vehicle struct attr vehicle_attr; navit_get_attr(this->object->nav, attr_vehicle, &vehicle_attr, NULL); if (vehicle_attr.u.vehicle==attr.u.vehicle) { this->_itemId=counter; } } counter++; } dropIterFunc(iter); dbg(lvl_debug,QString::number(_itemId).toStdString().c_str()); return retDoc.toString(); } QString getDestination() { struct attr attr; struct coord c; if (getAttrFunc(attr_destination, &attr, NULL) ) { c.x=attr.u.pcoord->x; c.y=attr.u.pcoord->y; __setNewPoint(this->object,&c,Destination); return this->object->currentPoint->pointName(); } return QString(); } void setDestination() { navit_set_destination(this->object->nav,this->object->currentPoint->pc(),this->object->currentPoint->coordString().toStdString().c_str(),1); } void stopNavigation() { navit_set_destination(this->object->nav,NULL,NULL,0); } QString getPosition() { struct attr attr; struct pcoord pc; struct coord c; struct transformation *trans; trans=navit_get_trans(this->object->nav); getAttrFunc(attr_vehicle, &attr, NULL); this->object->currVehicle=attr.u.vehicle; if (vehicle_get_attr(this->object->currVehicle, attr_position_coord_geo, &attr, NULL)) { pc.pro=transform_get_projection(trans); transform_from_geo(pc.pro, attr.u.coord_geo, &c); __setNewPoint(this->object,&c,Position); return this->object->currentPoint->pointName(); } return QString(); } void setPosition() { navit_set_position(this->object->nav,this->object->currentPoint->pc()); } void setCenter() { navit_set_center(this->object->nav,this->object->currentPoint->pc(),1); } void command(QString command) { struct attr navit; navit.type=attr_navit; navit.u.navit=this->object->nav; command_evaluate(&navit,command.toLocal8Bit().constData()); } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return navit_get_attr(this->object->nav, type, attr, iter); } int setAttrFunc(struct attr* attr) {return navit_set_attr(this->object->nav,attr); } struct attr_iter* getIterFunc() { return navit_attr_iter_new(); }; void dropIterFunc(struct attr_iter* iter) { navit_attr_iter_destroy(iter); }; private: }; #include "navitProxy.moc" #endif /* NAVIT_GUI_QML_NAVITPROXY_H */ navit-0.5.0+dfsg.1/navit/gui/qml/ngqpoint.h000066400000000000000000000422271264204753600204410ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_POINT_H #define NAVIT_GUI_QML_POINT_H static void get_direction(char *buffer, int angle, int mode) { angle=angle%360; switch (mode) { case 0: sprintf(buffer,"%d",angle); break; case 1: if (angle < 69 || angle > 291) *buffer++='N'; if (angle > 111 && angle < 249) *buffer++='S'; if (angle > 22 && angle < 158) *buffer++='E'; if (angle > 202 && angle < 338) *buffer++='W'; *buffer++='\0'; break; case 2: angle=(angle+15)/30; if (! angle) angle=12; sprintf(buffer,"%d H", angle); break; } } enum NGQPointTypes {MapPoint,Bookmark,Position,Destination,PointOfInterest}; class NGQPoint : public QObject { Q_OBJECT; Q_PROPERTY(QString coordString READ coordString CONSTANT); Q_PROPERTY(QString pointName READ pointName CONSTANT); Q_PROPERTY(QString pointType READ pointType CONSTANT); Q_PROPERTY(QUrl pointUrl READ pointUrl CONSTANT); public: NGQPoint(struct gui_priv* this_,struct point* p,NGQPointTypes type=MapPoint,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; transform_reverse(navit_get_trans(this->object->nav), p, &co); transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); c.pro = transform_get_projection(navit_get_trans(this->object->nav)); c.x = co.x; c.y = co.y; this->p.x=p->x; this->p.y=p->y; this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } NGQPoint(struct gui_priv* this_,struct coord* c,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; this->co.x=c->x; this->co.y=c->y; transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); this->c.x = c->x; this->c.y = c->y; this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } NGQPoint(struct gui_priv* this_,struct pcoord* pc,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; this->c.pro = pc->pro; this->c.x = pc->x; this->c.y = pc->y; this->co.x=pc->x; this->co.y=pc->y; transform_to_geo(this->c.pro, &co, &g); this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } NGQPoint(struct gui_priv* this_,struct coord* c,QString name,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { this->object=this_; this->item.map=0; this->co.x=c->x; this->co.y=c->y; transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); this->c.x = c->x; this->c.y = c->y; this->type=type; this->name=name; this->coord=this->_coordString(); } struct pcoord* pc() { return &c; } public slots: void setNewPoint(QString coord,NGQPointTypes type=PointOfInterest) { this->item.map=0; QStringList coordSplit=coord.split(" ",QString::SkipEmptyParts); this->co.x=coordSplit[0].toInt(); this->co.y=coordSplit[1].toInt(); transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); this->c.x = coordSplit[0].toInt(); this->c.y = coordSplit[1].toInt(); this->type=type; this->name=this->_coordName(); this->coord=this->_coordString(); } QString pointName() { return this->name; } QString coordString() { return this->coord; } QString pointType() { switch(this->type) { case MapPoint: return QString("MapPoint"); case Bookmark: return QString("Bookmark"); case Position: return QString("Position"); case Destination: return QString("Destination"); case PointOfInterest: return QString("PointOfInterest"); } return QString(""); } QUrl pointUrl() { return this->url; } QString getInformation() { struct map_rect *mr; struct item* item; struct attr attr; QDomDocument retDoc; QDomElement entries; entries=retDoc.createElement("point"); retDoc.appendChild(entries); if (this->type!=Bookmark and this->item.map) { mr=map_rect_new(this->item.map, NULL); item = map_rect_get_item_byid(mr, this->item.id_hi, this->item.id_lo); if (item) { while(item_attr_get(item, attr_any, &attr)) { entries.appendChild(this->_fieldValueHelper(retDoc,QString::fromLocal8Bit(attr_to_name(attr.type)), QString::fromLocal8Bit(attr_to_text(&attr,this->item.map, 1)))); } } map_rect_destroy(mr); } return retDoc.toString(); } QString getPOI(const QString &attr_name) { struct attr attr; struct item* item; struct mapset_handle *h; struct map_selection *sel,*selm; struct map_rect *mr; struct map *m; int idist,dist; struct coord center; QDomDocument retDoc(attr_name); QDomElement entries; char dirbuf[32]; if (!gui_get_attr(this->object->gui,attr_radius,&attr,NULL)) { return QString(); } dist=attr.u.num*1000; sel=map_selection_rect_new(&this->c, dist, 18); center.x=this->c.x; center.y=this->c.y; h=mapset_open(navit_get_mapset(this->object->nav)); entries=retDoc.createElement(attr_name); retDoc.appendChild(entries); while ((m=mapset_next(h, 1))) { selm=map_selection_dup_pro(sel, this->c.pro, map_projection(m)); mr=map_rect_new(m, selm); if (mr) { while ((item=map_rect_get_item(mr))) { struct coord c; if ( item_coord_get_pro(item, &c, 1, this->c.pro) && coord_rect_contains(&sel->u.c_rect, &c) && (idist=transform_distance(this->c.pro, ¢er, &c)) < dist && item->typetype)).startsWith(QString("poi_"))) { rs=QString::fromLocal8Bit(item_to_name(item->type)); rs=rs.remove(QString("poi_")); rs+=QString(" ")+QString::fromLocal8Bit(label); } else if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) { rs=QString::fromLocal8Bit(item_to_name(item->type)); rs=rs.remove(QString("poly_")); rs+=QString(" ")+QString::fromLocal8Bit(label); } else if (QString(item_to_name(item->type)).startsWith(QString("street_"))) { rs="Street "; rs+=QString::fromLocal8Bit(label); } map_convert_free(label); } else rs=item_to_name(item->type); get_direction(dirbuf, transform_get_angle_delta(¢er, &c, 0), 1); if (rs.length()>0) { QDomElement entry=retDoc.createElement("point"); QDomElement nameTag=retDoc.createElement("name"); QDomElement typeTag=retDoc.createElement("type"); QDomElement distTag=retDoc.createElement("distance"); QDomElement directTag=retDoc.createElement("direction"); QDomElement coordsTag=retDoc.createElement("coords"); QDomText nameT=retDoc.createTextNode(rs); QDomText typeT=retDoc.createTextNode(QString(item_to_name(item->type))); QDomText distT=retDoc.createTextNode(QString::number(idist/1000)); QDomText directT=retDoc.createTextNode(dirbuf); QDomText coordsT=retDoc.createTextNode(QString("%1 %2").arg(c.x).arg(c.y)); nameTag.appendChild(nameT); typeTag.appendChild(typeT); distTag.appendChild(distT); directTag.appendChild(directT); coordsTag.appendChild(coordsT); entry.appendChild(nameTag); entry.appendChild(typeTag); entry.appendChild(distTag); entry.appendChild(directTag); entry.appendChild(coordsTag); entries.appendChild(entry); } } } } map_selection_destroy(selm); } map_selection_destroy(sel); mapset_close(h); dbg(lvl_info,"%s\n",retDoc.toString().toLocal8Bit().constData()); return retDoc.toString(); } protected: QDomElement _fieldValueHelper(QDomDocument doc, QString field,QString value) { QDomElement fieldTag=doc.createElement(field); QDomText valueText=doc.createTextNode(value); fieldTag.appendChild(valueText); return fieldTag; } QString _coordString() { char latc='N',lngc='E'; int lat_deg,lat_min,lat_sec; int lng_deg,lng_min,lng_sec; struct coord_geo g=this->g; if (g.lat < 0) { g.lat=-g.lat; latc='S'; } if (g.lng < 0) { g.lng=-g.lng; lngc='W'; } lat_deg=g.lat; lat_min=fmod(g.lat*60,60); lat_sec=fmod(g.lat*3600,60); lng_deg=g.lng; lng_min=fmod(g.lng*60,60); lng_sec=fmod(g.lng*3600,60); return QString(QString::fromLocal8Bit("%1°%2'%3\" %4%5%6°%7'%8\" %9")).arg(lat_deg).arg(lat_min).arg(lat_sec).arg(latc).arg(' ').arg(lng_deg).arg(lng_min).arg(lng_sec).arg(lngc); } QString _coordName() { int dist=10; struct mapset *ms; struct mapset_handle *h; struct map_rect *mr; struct map *m; struct item *item; struct street_data *data; struct map_selection sel; struct transformation *trans; enum projection pro; struct attr attr; char *label; QString ret; trans=navit_get_trans(this->object->nav); pro=transform_get_projection(trans); transform_from_geo(pro, &g, &co); ms=navit_get_mapset(this->object->nav); sel.next=NULL; sel.u.c_rect.lu.x=c.x-dist; sel.u.c_rect.lu.y=c.y+dist; sel.u.c_rect.rl.x=c.x+dist; sel.u.c_rect.rl.y=c.y-dist; sel.order=18; sel.range=item_range_all; h=mapset_open(ms); while ((m=mapset_next(h,1))) { mr=map_rect_new(m, &sel); if (! mr) continue; while ((item=map_rect_get_item(mr))) { data=street_get_data(item); if (transform_within_dist_item(&co, item->type, data->c, data->count, dist)) { if (item_attr_get(item, attr_label, &attr)) { label=map_convert_string(m, attr.u.str); this->item=*item; this->_setUrl(item); if (QString(item_to_name(item->type)).startsWith(QString("poi_"))) { ret=QString::fromLocal8Bit(item_to_name(item->type)); ret=ret.remove(QString("poi_")); ret+=QString(" ")+QString::fromLocal8Bit(label); } if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) { ret=QString::fromLocal8Bit(item_to_name(item->type)); ret=ret.remove(QString("poly_")); ret+=QString(" ")+QString::fromLocal8Bit(label); } if (QString(item_to_name(item->type)).startsWith(QString("street_"))) { ret="Street "; ret+=QString::fromLocal8Bit(label); } map_convert_free(label); street_data_free(data); map_rect_destroy(mr); mapset_close(h); return ret; } else this->item=*item; this->_setUrl(item); ret=item_to_name(item->type); } street_data_free(data); } map_rect_destroy(mr); } mapset_close(h); return ret; } void _setUrl(struct item *item) { struct attr attr; if (item_attr_get(item,attr_osm_nodeid,&attr)) { url.setUrl(QString("http://www.openstreetmap.org/browse/node/%1").arg(*attr.u.num64)); } else if (item_attr_get(item,attr_osm_wayid,&attr)) { url.setUrl(QString("http://www.openstreetmap.org/browse/way/%1").arg(*attr.u.num64)); } else if (item_attr_get(item,attr_osm_relationid,&attr)) { url.setUrl(QString("http://www.openstreetmap.org/browse/relation/%1").arg(*attr.u.num64)); } else { url.clear(); } } private: struct gui_priv* object; NGQPointTypes type; struct coord_geo g; struct coord co; struct pcoord c; struct point p; struct item item; QString name; QString coord; QUrl url; }; #include "ngqpoint.moc" #endif /* NAVIT_GUI_QML_POINT_H */ navit-0.5.0+dfsg.1/navit/gui/qml/proxy.h000066400000000000000000000057131264204753600177620ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_PROXY_H #define NAVIT_GUI_QML_PROXY_H class NGQStandardItemModel : public QStandardItemModel { public: NGQStandardItemModel(QObject* parent) : QStandardItemModel(parent) { //Populate role list roleNames.insert(NGQStandardItemModel::ItemId, "itemId"); roleNames.insert(NGQStandardItemModel::ItemName, "itemName"); roleNames.insert(NGQStandardItemModel::ItemIcon, "itemIcon"); roleNames.insert(NGQStandardItemModel::ItemPath, "itemPath"); roleNames.insert(NGQStandardItemModel::ItemValue, "itemValue"); this->setRoleNames(roleNames); } enum listRoles {ItemId=Qt::UserRole+1,ItemName=Qt::UserRole+2,ItemIcon=Qt::UserRole+3,ItemPath=Qt::UserRole+4,ItemValue=Qt::UserRole+5}; private: QHash roleNames; }; class NGQProxy : public QObject { Q_OBJECT; Q_PROPERTY(int itemId READ itemId NOTIFY itemIdSignal); public: NGQProxy(struct gui_priv* this_,QObject *parent) : QObject(parent) { this->object=this_; } signals: void itemIdSignal(int itemId); public slots: //Attribute read/write QString getAttr(const QString &attr_name) { QString ret; struct attr attr; getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, NULL); if (ATTR_IS_INT(attr.type)) { ret.setNum(attr.u.num); } if (ATTR_IS_DOUBLE(attr.type)) { ret.setNum(*attr.u.numd); } if (ATTR_IS_STRING(attr.type)) { ret=attr.u.str; } if (attr.type==attr_layout) { ret=attr.u.layout->name; } return ret; } void setAttr(const QString &attr_name, const QString &attr_string) { struct attr attr_value; double *helper; dbg(lvl_debug,"Setting %s to %s\n",attr_name.toStdString().c_str(),attr_string.toStdString().c_str()); getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr_value, NULL); if (ATTR_IS_INT(attr_value.type)) { //Special handling for "true"/"false" if (attr_string=="true") { attr_value.u.num=1; } else if (attr_string=="false") { attr_value.u.num=0; } else { attr_value.u.num=attr_string.toInt(); } } if (ATTR_IS_DOUBLE(attr_value.type)) { helper = g_new0(double,1); *helper=attr_string.toDouble(); attr_value.u.numd=helper; } if (ATTR_IS_STRING(attr_value.type)) { attr_value.u.str=(char*)attr_string.toStdString().c_str(); } setAttrFunc(&attr_value); return; } int itemId() { return _itemId; } protected: struct gui_priv* object; int _itemId; virtual int setAttrFunc(struct attr *attr)=0; virtual int getAttrFunc(enum attr_type type, struct attr *attr, struct attr_iter *iter)=0; virtual struct attr_iter* getIterFunc() { return NULL; }; virtual void dropIterFunc(struct attr_iter*) { return; }; QDomElement _fieldValueHelper(QDomDocument doc, QString field,QString value) { QDomElement fieldTag=doc.createElement(field); QDomText valueText=doc.createTextNode(value); fieldTag.appendChild(valueText); return fieldTag; } }; #include "proxy.moc" #endif /* NAVIT_GUI_QML_PROXY_H */ navit-0.5.0+dfsg.1/navit/gui/qml/routeProxy.h000066400000000000000000000042231264204753600207740ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_ROUTEPROXY_H #define NAVIT_GUI_QML_ROUTEPROXY_H class NGQProxyRoute : public NGQProxy { Q_OBJECT; public: NGQProxyRoute(struct gui_priv* this_,QObject* parent) : NGQProxy(this_,parent) { }; public slots: void addDestination() { int counter=0; QList destinations=this->_routeDestinations(); struct pcoord *coords=(struct pcoord*)malloc(sizeof(struct pcoord)*(destinations.size()+1)); //Additional destination included for (QList::const_iterator iter=destinations.begin();iter!=destinations.end();iter++) { coords[counter]=*(iter->u.pcoord); counter++; } //Add new one coords[counter]=*(this->object->currentPoint->pc()); //Propagate to route engine route_set_destinations(navit_get_route(this->object->nav),coords,counter+1,1); } QString getDestinations() { QList destinations=this->_routeDestinations(); for (QList::const_iterator iter=destinations.begin();iter!=destinations.end();iter++) { NGQPoint helperPoint(this->object,iter->u.pcoord,MapPoint); dbg(lvl_debug,"Added destination %s\n",helperPoint.coordString().toLocal8Bit().constData()); } //dbg(lvl_debug,QString::number(_itemId).toStdString().c_str()); //return retDoc.toString(); return QString(); } protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) {return route_get_attr(navit_get_route(this->object->nav), type, attr, iter); } int setAttrFunc(struct attr* attr) {return route_set_attr(navit_get_route(this->object->nav),attr); } struct attr_iter* getIterFunc() { return route_attr_iter_new(); }; void dropIterFunc(struct attr_iter* iter) { route_attr_iter_destroy(iter); }; QList _routeDestinations() { QList ret; struct attr attr; struct attr_iter *iter; //Fill da list iter=getIterFunc(); if (iter == NULL) { return ret; } while (getAttrFunc(attr_destination, &attr, iter) ) { struct attr c_attr=attr; ret.push_front(c_attr); //List is reversed in route engine } dropIterFunc(iter); return ret; } }; #include "routeProxy.moc" #endif /* NAVIT_GUI_QML_ROUTEPROXY_H */ navit-0.5.0+dfsg.1/navit/gui/qml/searchProxy.h000066400000000000000000000162721264204753600211120ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_SEARCHPROXY_H #define NAVIT_GUI_QML_SEARCHPROXY_H void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type); class NGQProxySearch : public NGQProxy { Q_OBJECT; Q_PROPERTY(QString countryName READ countryName WRITE setCountryName NOTIFY countryNameSignal); Q_PROPERTY(QString countryISO2 READ countryISO2 WRITE setCountryISO2 NOTIFY countryISO2Signal); Q_PROPERTY(QString townName READ townName WRITE setTownName NOTIFY townNameSignal); Q_PROPERTY(QString streetName READ streetName WRITE setStreetName NOTIFY streetNameSignal); Q_PROPERTY(QString searchContext READ searchContext WRITE setSearchContext); public: NGQProxySearch(struct gui_priv* this_,QObject* parent) : NGQProxy(this_,parent) { struct attr search_attr, country_name, country_iso2, *country_attr; struct item *item; struct country_search *cs; struct tracking *tracking; struct search_list_result *res; this->sl=search_list_new(navit_get_mapset(this->object->nav)); this->search_context="country"; country_attr=country_default(); tracking=navit_get_tracking(this->object->nav); if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) country_attr=&search_attr; if (country_attr) { cs=country_search_new(country_attr, 0); item=country_search_get_item(cs); if (item && item_attr_get(item, attr_country_name, &country_name)) { search_attr.type=attr_country_all; dbg(lvl_debug,"country %s\n", country_name.u.str); this->country_name=QString::fromLocal8Bit(country_name.u.str); search_attr.u.str=country_name.u.str; search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); if (item_attr_get(item, attr_country_iso2, &country_iso2)) { this->country_iso2=QString::fromLocal8Bit(country_iso2.u.str); } } country_search_destroy(cs); } else { dbg(lvl_error,"warning: no default country found\n"); if (!this->country_iso2.isEmpty()) { dbg(lvl_debug,"attempting to use country '%s'\n",this->country_iso2.toStdString().c_str()); search_attr.type=attr_country_iso2; search_attr.u.str=(char*)this->country_iso2.toStdString().c_str(); search_list_search(this->sl, &search_attr, 0); while((res=search_list_get_result(this->sl))); } } } ~NGQProxySearch() { search_list_destroy(this->sl); } signals: void countryNameSignal(QString); void countryISO2Signal(QString); void townNameSignal(QString); void streetNameSignal(QString); public slots: void setPointToResult() { struct attr attr; struct search_list_result *res; if (this->street_name.length()>0) { attr.type=attr_street_name; attr.u.str=this->street_name.toLocal8Bit().data(); } else if (this->town_name.length()>0) { attr.type=attr_town_or_district_name; attr.u.str=this->town_name.toLocal8Bit().data(); } else if (this->country_name.length()>0) { attr.type=attr_country_name; attr.u.str=this->country_name.toLocal8Bit().data(); } search_list_search(this->sl,&attr,0); if ((res=search_list_get_result(this->sl))) { __setNewPoint(this->object,res->c,PointOfInterest); } return; } QString searchXml() { NGQStandardItemModel* ret=new NGQStandardItemModel(this); struct attr attr; struct search_list_result *res; int counter=0; QDomDocument retDoc; QDomElement entries; entries=retDoc.createElement("search"); retDoc.appendChild(entries); if (this->search_context=="country") { attr.type=attr_country_name; attr.u.str=this->country_name.toLocal8Bit().data(); } if (this->search_context=="town") { if (this->town_name.length()<3) { return retDoc.toString(); } attr.type=attr_town_or_district_name; attr.u.str=this->town_name.toLocal8Bit().data(); } if (this->search_context=="street") { attr.type=attr_street_name; attr.u.str=this->street_name.toLocal8Bit().data(); } search_list_search(this->sl,&attr,1); while ((res=search_list_get_result(this->sl))) { QStandardItem* curItem=new QStandardItem(); QDomElement entry=retDoc.createElement("item"); entries.appendChild(entry); //Result processing depends on search type if (this->search_context=="country") { entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->country->name))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("icon"), QString("country_%1%2").arg(res->country->iso2).arg(".svgz"))); } if (this->search_context=="town") { entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); if (res->town->common.town_name) { entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->town->common.town_name))); } if (res->town->common.district_name) { entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->town->common.district_name))); } } if (this->search_context=="street") { entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->street->name))); } counter++; ret->appendRow(curItem); } return retDoc.toString(); } QString countryName() { return this->country_name; } void setCountryName(QString countryName) { this->country_name=countryName; struct attr attr; struct search_list_result *res; //We need to update ISO2 attr.type=attr_country_name; attr.u.str=countryName.toLocal8Bit().data(); search_list_search(this->sl,&attr,0); while ((res=search_list_get_result(this->sl))) { this->setCountryISO2(QString::fromLocal8Bit(res->country->iso2)); } //...and current town this->town_name=""; this->street_name=""; countryNameSignal(countryName); } QString countryISO2() { return this->country_iso2; } void setCountryISO2(QString countryISO2) { this->country_iso2=countryISO2; countryISO2Signal(countryISO2); } QString townName() { return this->town_name; } void setTownName(QString townName) { struct attr attr; this->town_name=townName; //Specialize search attr.type=attr_town_or_district_name; attr.u.str=townName.toLocal8Bit().data(); search_list_search(this->sl,&attr,0); //...and street this->street_name=""; townNameSignal(townName); } QString streetName() { return this->street_name; } void setStreetName(QString streetName) { struct attr attr; this->street_name=streetName; //Specialize search attr.type=attr_street_name; attr.u.str=streetName.toLocal8Bit().data(); search_list_search(this->sl,&attr,0); streetNameSignal(streetName); } QString searchContext() { return this->search_context; } void setSearchContext(QString searchContext) { this->search_context=searchContext; } protected: virtual int getAttrFunc(enum attr_type type, struct attr *attr, struct attr_iter *iter) { return 0; } virtual int setAttrFunc(struct attr *attr) { return 0; } private: struct search_list *sl; QString search_context; QString country_iso2,country_name,town_name,street_name; }; #include "searchProxy.moc" #endif /* NAVIT_GUI_QML_SEARCHPROXY_H */ navit-0.5.0+dfsg.1/navit/gui/qml/skins/000077500000000000000000000000001264204753600175515ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/gui/qml/skins/Makefile.am000066400000000000000000000000151264204753600216010ustar00rootroot00000000000000SUBDIRS=navitnavit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/000077500000000000000000000000001264204753600206725ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/ButtonIcon.qml000066400000000000000000000024021264204753600234670ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: container signal clicked property string text: "Button" property string icon: "Icon.png" color: "black"; smooth: true; opacity: 0.75 width: imgItem.width+20; height: txtItem.height + 6 + imgItem.height; transformOrigin: Rectangle.Center; MouseArea { id: mr; anchors.fill: parent; onClicked: container.clicked() } Image { id: imgItem; source: gui.iconPath+container.icon; anchors.top: container.top; anchors.horizontalCenter: container.horizontalCenter; width: gui.height/4; height: gui.height/4 } Text { id: txtItem; text: container.text; anchors.top: imgItem.bottom; anchors.horizontalCenter: container.horizontalCenter; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } states: [ State { name: "Pressed"; when: mr.pressed == true PropertyChanges { target: container; scale: 2.0 } PropertyChanges { target: container; opacity: 1 } } ] transitions: Transition { NumberAnimation { properties: "scale"; easing.type: "OutExpo"; duration: 200 } NumberAnimation { properties: "opacity"; easing.type: "InQuad"; duration: 200 } } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/Cellar.qml000066400000000000000000000017761264204753600226220ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { function onStartup(currentPage) { btnBack.opacity=0; btnQuit.opacity=0; if ( gui.lengthPage() > 1 ) { btnBack.opacity=1; } if ( gui.lengthPage() == 1 && currentPage == "PageMain.qml" ) { btnQuit.opacity=1; } } ButtonIcon { id: btnMap; icon: "gui_map.svg"; text:"Map"; onClicked: gui.backToMap(); anchors.left: parent.left; anchors.leftMargin: 3 anchors.bottom: parent.bottom; anchors.bottomMargin: 3 } ButtonIcon { id: btnBack; icon: "gui_arrow_left.svg"; text: "Back"; onClicked: Navit.back(); anchors.right: parent.right; anchors.leftMargin: 3 anchors.bottom: parent.bottom; anchors.bottomMargin: 3 opacity: 0; } ButtonIcon { id: btnQuit; icon: "gui_quit.svg"; text: "Quit"; onClicked: navit.quit() anchors.right: parent.right; anchors.leftMargin: 3 anchors.bottom: parent.bottom; anchors.bottomMargin: 3 opacity: 0; } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/CommonHighlight.qml000066400000000000000000000001301264204753600244570ustar00rootroot00000000000000import Qt 4.7 Component { Rectangle { color: "lightsteelblue" radius: 5 } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/ListSelector.qml000066400000000000000000000024721264204753600240260ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: listselector width: parent.width; height: parent.height color: "Black" property string text: "ListSelector" property string value: "" property int itemId: 0 property bool showScroller: false signal changed function startup() { if (listselector.showScroller == true) { listScroller.opacity=0.5; } } Component.onCompleted: startup(); Text { id: labelTxt; text: listselector.text; color: "White"; font.pointSize: 22; anchors.horizontalCenter: list.horizontalCenter anchors.verticalCenter: listselector.top } ListView { id: list; width: listselector.width*0.8; height: listselector.height anchors.top: labelTxt.bottom; anchors.left: listselector.left model: listModel delegate: listDelegate highlight: listHighlight clip: true highlightFollowsCurrentItem: true keyNavigationWraps: true Component.onCompleted: { list.currentIndex=listselector.itemId; } } Rectangle { id: listScroller opacity: 0; anchors.left: list.right; anchors.leftMargin: 4; width: 6 y: (list.visibleArea.yPosition * list.height)+(list.visibleArea.heightRatio * list.height/4) height: list.visibleArea.heightRatio * list.height } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/Makefile.am000066400000000000000000000011041264204753600227220ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc SKIN = navit qmldir=$(skinsdir)/$(SKIN) qml_DATA = ButtonIcon.qml ToggleSwitch.qml ToggleButton.qml ListSelector.qml Slider.qml CommonHighlight.qml Cellar.qml main.qml PageMain.qml PageNavigate.qml PageAbout.qml PageBookmarksAdd.qml PageBookmarks.qml PageRoute.qml PageSearch.qml PageSearchSelector.qml PageSettingsDisplay.qml PageSettingsLocale.qml PageSettings.qml PageSettingsRules.qml PageSettingsTools.qml PageSettingsVehicle.qml PagePoi.qml PagePointInfo.qml qml_DATA += background.svg knob.svg qml_DATA += command.js pagenavigation.js navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageAbout.qml000066400000000000000000000025141264204753600232560ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: navitText; anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: urlText.top; text: "Navit"; color: "White"; font.pointSize: gui.height/32 } Text { id: urlText; anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; text: "http://www.navit-project.org/"; color: "White"; font.pointSize: gui.height/32 } Text { id: authorsText; anchors.horizontalCenter: parent.horizontalCenter; anchors.top: urlText.bottom; text: "By: Martin Schaller, Michael Farmbauer, Alexander Atanasov, Pierre Grandin"; color: "White"; font.pointSize: gui.height/32 } Text { id: contributorsText; anchors.horizontalCenter: parent.horizontalCenter; anchors.top: authorsText.bottom; text: "and all the Navit Team members and contributors"; color: "White"; font.pointSize: gui.height/32 } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageBookmarks.qml000066400000000000000000000107761264204753600241450ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function bookmarkReload() { listModel.xml=bookmarks.getBookmarks(); listModel.query="/bookmarks/bookmark"; listModel.reload(); } function bookmarkClick(itemName,itemType,itemCoord) { if (itemType=="bookmark_folder") { if ( itemName==".." ) { bookmarks.moveUp(); } else { bookmarks.moveDown(itemName); } bookmarkReload(); } else { bookmarks.setPoint(itemName); pageLoader.source="PageNavigate.qml"; } } function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } ButtonIcon { id: folderBtn; text: "New folder"; icon: "gui_active.svg"; onClicked: folderDialog.opacity=1 anchors.top: parent.top; anchors.topMargin: page.height/16; anchors.left: parent.left; anchors.leftMargin: page.width/16 } ButtonIcon { id: pasteBtn; text: "Paste"; icon: "gui_active.svg"; onClicked: { bookmarks.Paste(); bookmarkReload(); } anchors.top: parent.top; anchors.topMargin: page.height/16; anchors.left: folderBtn.right; anchors.leftMargin: page.width/16 } XmlListModel { id: listModel xml: bookmarks.getBookmarks("bookmarks") query: "/bookmarks/bookmark" XmlRole { name: "itemName"; query: "label/string()" } XmlRole { name: "itemType"; query: "type/string()" } XmlRole { name: "itemDistance"; query: "distance/string()" } XmlRole { name: "itemDirection"; query: "direction/string()" } XmlRole { name: "itemValue"; query: "coords/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Text { id: txtItem; text: itemName; color: {itemType== "bookmark" ? "White" : "Yellow"} font.bold: {itemType!= "bookmark" } width: list.width-imgDelete.width MouseArea { id:delegateMouse anchors.fill: parent onClicked: bookmarkClick(itemName,itemType,itemValue); } } Image { id: imgCut; source: gui.iconPath+"zoom_out.svg"; anchors.right: imgCopy.left;anchors.rightMargin: 5; width: 20; height: 20; MouseArea { id:delegateMouseCut anchors.fill: parent onClicked: { bookmarks.Cut(itemName); bookmarkReload(); } } } Image { id: imgCopy; source: gui.iconPath+"zoom_in.svg"; anchors.right: imgDelete.left;anchors.rightMargin: 5; width: 20; height: 20; MouseArea { id:delegateMouseCopy anchors.fill: parent onClicked: { bookmarks.Copy(itemName); bookmarkReload(); } } } Image { id: imgDelete; source: gui.iconPath+"gui_inactive.svg"; anchors.right: wrapper.right;anchors.rightMargin: 5; width: 20; height: 20; MouseArea { id:delegateMouseDelete anchors.fill: parent onClicked: { bookmarks.Delete(itemName); bookmarkReload(); } } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: "" anchors.top: pasteBtn.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height*0.25 } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } Rectangle { id: folderDialog opacity:0 anchors.horizontalCenter: page.horizontalCenter; anchors.verticalCenter: page.verticalCenter; width: page.width; height:page.height/3 color: "Grey"; TextInput{ id: folderTxt; text: "Enter folder name here..." anchors.top: parent.top;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false } ButtonIcon { id: btnOk; text: "Add"; icon: "gui_active.svg"; onClicked: { bookmarks.AddFolder(folderTxt.text); bookmarkReload(); folderDialog.opacity=0 } anchors.top: folderTxt.bottom;anchors.topMargin: 5;anchors.right:parent.horizontalCenter;anchors.rightMargin:10 } ButtonIcon { id: btnCancel; text: "Cancel"; icon: "gui_inactive.svg"; onClicked: folderDialog.opacity=0; anchors.top: folderTxt.bottom;anchors.topMargin: 5;anchors.left:parent.horizontalCenter;anchors.leftMargin:10 } } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageBookmarksAdd.qml000066400000000000000000000041011264204753600245370ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 Timer { id: backTimer interval: 2000; onTriggered: Navit.back(); } function add(description) { resultTxt.text=bookmarks.AddBookmark(description); btnOk.opacity=0; btnCancel.opacity=0; resultTxt.opacity=1; backTimer.start() } function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: infoTxt; text: point.coordString; color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.horizontalCenter:parent.horizontalCenter } Text { id: nameTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:infoTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } TextInput{ id: searchTxt; text: "Enter bookmark name..." anchors.top: nameTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false } ButtonIcon { id: btnOk; text: "Add"; icon: "gui_active.svg"; onClicked: add(searchTxt.text) anchors.top: searchTxt.bottom;anchors.topMargin: 5;anchors.right:parent.horizontalCenter;anchors.rightMargin:10 } ButtonIcon { id: btnCancel; text: "Cancel"; icon: "gui_inactive.svg"; onClicked: gui.backToPrevPage(); anchors.top: searchTxt.bottom;anchors.topMargin: 5;anchors.left:parent.horizontalCenter;anchors.leftMargin:10 } Text { id: resultTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:btnCancel.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter opacity: 0 } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageMain.qml000066400000000000000000000016771264204753600231010ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: main.width; height: main.height color: "Black" Grid { columns: 2; rows: 2 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: page.top;anchors.topMargin:page.height/10 spacing: parent.height/6 ButtonIcon { id: btnDestination; text: "Drive to\npoint on map"; icon: "gui_active.svg"; onClicked: { route.addDestination(); gui.backToMap() } } ButtonIcon { id: btnNavigate; text: "Navigate\nto . . ."; icon: "cursor.svg"; onClicked: Navit.load("PageNavigate.qml"); } ButtonIcon { id: btnRoute; text: "Route\ninformation"; icon: "nav_destination_wh.svg"; onClicked: Navit.load("PageRoute.qml"); } ButtonIcon { id: btnSettings; text: "Settings"; icon: "gui_settings.svg"; onClicked: Navit.load("PageSettings.qml"); } } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageNavigate.qml000066400000000000000000000062031264204753600237410ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { if (point.pointType!="Bookmark") { btnAddBookmark.opacity=1; } if (point.pointType!="MapPoint") { btnView.opacity=1; } if (point.pointType!="Position") { btnPosition.opacity=1; } if (point.pointType!="Destination") { btnDestination.opacity=1; } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: infoTxt; text: point.coordString; color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.horizontalCenter:parent.horizontalCenter } Text { id: nameTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:infoTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } ButtonIcon { id: btnView; text: "View on map"; icon: "gui_maps.svg"; onClicked: { navit.setCenter(); gui.backToMap(); } opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:page.left;anchors.leftMargin: gui.height/6 } ButtonIcon { id: btnPosition; text: "Set as\nposition"; icon: "gui_active.svg"; onClicked: { navit.setPosition(); gui.backToMap() } opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:btnView.right;anchors.leftMargin: gui.height/6 } ButtonIcon { id: btnDestination; text: "Set as\ndestination"; icon: "gui_active.svg"; onClicked: { route.addDestination(); gui.backToMap() } opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:btnPosition.right;anchors.leftMargin: gui.height/6 } ButtonIcon { id: btnAddBookmark; text: "Add as\na bookmark"; icon: "gui_active.svg"; onClicked: Navit.load("PageBookmarksAdd.qml"); opacity: 0 anchors.top: nameTxt.bottom;anchors.topMargin:gui.height/32 anchors.left:btnDestination.right;anchors.leftMargin: gui.height/6 } Grid { columns: 4;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: btnDestination.bottom;anchors.topMargin:gui.height/32 spacing: gui.height/6 ButtonIcon { id: btnBookmarks; text: "Bookmarks"; icon: "gui_bookmark.svg"; onClicked: {bookmarks.moveRoot(); Navit.load("PageBookmarks.qml"); } } ButtonIcon { id: btnPOI; text: "Nearest\nPOIs"; icon: "attraction.svg"; onClicked: Navit.load("PagePoi.qml"); } ButtonIcon { id: btnSearch; text: "Address\nSearch"; icon: "gui_town.svg"; onClicked: Navit.load("PageSearch.qml"); } ButtonIcon { id: btnInfo; text: "Point\ninformation"; icon: "gui_menu.svg"; onClicked: Navit.load("PagePointInfo.qml"); } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PagePoi.qml000066400000000000000000000124561264204753600227410ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page property string poiFilter: "" width: gui.width; height: gui.height color: "Black" opacity: 0 function calculateFilter() { page.poiFilter='/points/point[type="point_begin" or '; if (bankBtn.state=="on") { page.poiFilter+='type="poi_bank" or '; } if (fuelBtn.state=="on") { page.poiFilter+='type="poi_fuel" or '; page.poiFilter+='type="poi_autoservice" or '; page.poiFilter+='type="poi_repair_service" or '; } if (hotelBtn.state=="on") { page.poiFilter+='type="poi_hotel" or '; page.poiFilter+='type="poi_camp_rv" or '; page.poiFilter+='type="poi_camping" or '; page.poiFilter+='type="poi_resort" or '; page.poiFilter+='type="poi_motel" or '; page.poiFilter+='type="poi_hostel" or '; } if (foodBtn.state=="on") { page.poiFilter+='type="poi_bar" or '; page.poiFilter+='type="poi_picnic" or '; page.poiFilter+='type="poi_burgerking" or '; page.poiFilter+='type="poi_fastfood" or '; page.poiFilter+='type="poi_restaurant" or '; } if (shopBtn.state=="on") { page.poiFilter+='type="poi_shop_grocery" or '; page.poiFilter+='type="poi_mall" or '; } if (serviceBtn.state=="on") { page.poiFilter+='type="poi_marina" or '; page.poiFilter+='type="poi_hospital" or '; page.poiFilter+='type="poi_public_utilities" or '; page.poiFilter+='type="poi_police" or '; page.poiFilter+='type="poi_information" or '; page.poiFilter+='type="poi_personal_service" or '; page.poiFilter+='type="poi_restroom" or '; } if (parkingBtn.state=="on") { page.poiFilter+='type="poi_car_parking" or '; } if (landBtn.state=="on") { page.poiFilter+='type="poi_land_feature" or '; page.poiFilter+='type="poi_rock" or '; page.poiFilter+='type="poi_dam" or '; } page.poiFilter+='type="point_end"]'; listModel.query=page.poiFilter; listModel.reload(); } function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: labelTxt; text: "Points of interest"; color: "White"; font.pointSize: 14; anchors.horizontalCenter: page.horizontalCenter anchors.top: page.top } VisualItemModel { id: selectorsModel ToggleButton { id: bankBtn; text: "Bank"; icon: "bank.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: fuelBtn; text: "Fuel"; icon: "fuel.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: hotelBtn; text: "Hotel"; icon: "bar.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: foodBtn; text: "Food"; icon: "fastfood.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: shopBtn; text: "Shop"; icon: "shopping.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: serviceBtn; text: "Service"; icon: "hospital.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: parkingBtn; text: "Parking"; icon: "police.svg";stOn: "true"; onChanged: calculateFilter(); } ToggleButton { id: landBtn; text: "Land features"; icon: "peak.svg";stOn: "true"; onChanged: calculateFilter(); } } ListView { id: selectorsList; model: selectorsModel focus: true; clip: true; orientation: Qt.Horizontal anchors.horizontalCenter: page.horizontalCenter; anchors.top: labelTxt.bottom width: page.width; height: bankBtn.height*2 } Slider { id: distanceSlider; minValue: 1; maxValue: 250; value: gui.getAttr("radius"); text: "Distance"; onChanged: { gui.setAttr("radius",distanceSlider.value); listModel.xml=point.getPOI("points"); listModel.reload(); } anchors.top: selectorsList.bottom; anchors.horizontalCenter: page.horizontalCenter; } XmlListModel { id: listModel xml: point.getPOI("points") query: "/points/point" XmlRole { name: "itemName"; query: "name/string()" } XmlRole { name: "itemType"; query: "type/string()" } XmlRole { name: "itemDistance"; query: "distance/string()" } XmlRole { name: "itemDirection"; query: "direction/string()" } XmlRole { name: "itemValue"; query: "coords/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Column { x: 5; y: 5 Text { id: txtItemName; text: itemName; color: "White" } Text { id: txtItemDist; text: itemDistance; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemName.right;anchors.top: txtItemName.top } Text { id: txtItemDirect; text: itemDirection; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemDist.right;anchors.top: txtItemDist.top } } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { point.setNewPoint(itemValue); gui.returnSource="/main.qml"; Navit.load("PageNavigate.qml"); } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: "" anchors.top: distanceSlider.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height*0.25 } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PagePointInfo.qml000066400000000000000000000043751264204753600241200ustar00rootroot00000000000000import Qt 4.7 import org.webkit 1.0 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: infoTxt; text: point.coordString; color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.horizontalCenter:parent.horizontalCenter } Text { id: nameTxt; text: point.pointName; color: "White"; font.pointSize: gui.height/20; anchors.top:infoTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } Text { id: typeTxt; text: point.pointType; color: "White"; font.pointSize: gui.height/20; anchors.top:nameTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } Text { id: urlTxt; text: point.pointUrl; color: "Blue"; font.pointSize: gui.height/20;font.underline: true; anchors.top:typeTxt.bottom;anchors.topMargin: 5;anchors.horizontalCenter:parent.horizontalCenter } XmlListModel { id: listModel xml: point.getInformation(); query: "/point/element()" XmlRole { name: "itemType"; query: "name()" } XmlRole { name: "itemAttribute"; query: "string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Column { x: 5; y: 5 Text { id: txtItemType; text: itemType; color: "White"; font.bold: true; } Text { id: txtItemAttribute; text: itemAttribute; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemType.right;anchors.top: txtItemType.top } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: "Attributes"; anchors.top: urlTxt.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height*0.25 } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageRoute.qml000066400000000000000000000063311264204753600233030ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; if (navit.getPosition().length>0) { btnPoi.opacity=0.8; } if (navit.getDestination().length>0 && navit.getPosition().length>0) { btnRouteView.opacity=0.8; btnRouteBook.opacity=0.8; btnRouteHeight.opacity=0.8; } route.getDestinations(); } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Text { id: statusTxt; text: route.getAttr("route_status"); color: "White"; font.pointSize: gui.height/20; anchors.top:parent.top;anchors.left:parent.left;anchors.topMargin: gui.height/20;anchors.leftMargin: gui.height/20; } Text { id: timeLabel; text: "Time to drive route: "; color: "White"; font.pointSize: gui.height/20; anchors.top:statusTxt.top;anchors.left:statusTxt.right;anchors.leftMargin: gui.height/20; } Text { id: timeTxt; text: route.getAttr("destination_time"); color: "White"; font.pointSize: gui.height/20; anchors.top:timeLabel.top;anchors.left:timeLabel.right;anchors.leftMargin: gui.height/20; } Text { id: lengthLabel; text: "Route length: "; color: "White"; font.pointSize: gui.height/20; anchors.top:timeTxt.top;anchors.left:timeTxt.right;anchors.leftMargin: gui.height/20; } Text { id: lengthTxt; text: route.getAttr("destination_length"); color: "White"; font.pointSize: gui.height/20; anchors.top:lengthLabel.top;anchors.left:lengthLabel.right;anchors.leftMargin: gui.height/20; } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.verticalCenter; anchors.bottomMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnRouteView; text: "View route"; icon: "gui_town.svg"; onClicked: { navit.command("zoom_to_route()"), gui.backToMap(); } opacity: 0; } ButtonIcon { id: btnRouteBook; text: "Roadbook"; icon: "gui_log.svg"; onClicked: console.log("Implement me!"); opacity: 0; } ButtonIcon { id: btnRouteHeight; text: "Height profile"; icon: "peak.svg"; onClicked: console.log("Implement me!"); opacity: 0; } } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: parent.verticalCenter; anchors.topMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnView; text: "View position\non map"; icon: "gui_maps.svg"; onClicked: { navit.getPosition();navit.setCenter();gui.backToMap(); } } ButtonIcon { id: btnPoi; text: "POIs near\nPosition"; icon: "attraction.svg"; onClicked: Navit.load("PagePoi.qml"); opacity: 0; } ButtonIcon { id: btnStop; text: "Stop"; icon: "gui_stop.svg"; onClicked: { navit.stopNavigation(); Navit.back(); } opacity: 0; } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSearch.qml000066400000000000000000000056541264204753600234210ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function pageOpen() { if ( search.countryName.length>0 ) { gridCity.opacity = 1; } if ( search.townName.length>0 ) { gridStreet.opacity = 1; } if ( search.streetName.length>0 ) { gridAddress.opacity = 0; //Disabled ,because housenamuber search is broken } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 2;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.verticalCenter; anchors.bottomMargin: gui.height/16; spacing: gui.width/12 Grid { columns: 1;rows: 2; id: gridCountry; Text { id: txtItemCountry; text: "Country"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnCountry; text: search.countryName; icon: "country_"+search.countryISO2+".svgz"; onClicked: { search.searchContext="country"; Navit.load("PageSearchSelector.qml"); } } } Grid { columns: 1; rows: 2; id: gridCity opacity: 0; Text { id: txtItemCity; text: "Town"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnCity; text: search.townName; icon: "gui_bookmark.svg"; onClicked: { search.searchContext="town"; Navit.load("PageSearchSelector.qml"); } } } } Grid { columns: 2;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: parent.verticalCenter; anchors.topMargin: gui.height/16; spacing: gui.width/12 Grid { columns: 1; rows: 2; id: gridStreet opacity: 0; Text { id: txtItemStreet; text: "Street"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnStreet; text: search.streetName; icon: "gui_town.svg"; onClicked: { search.searchContext="street"; Navit.load("PageSearchSelector.qml"); } } } Grid { columns: 1; rows: 2; id: gridAddress; opacity: 0; Text { id: txtItemAddress; text: "Address"; color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter } ButtonIcon { id: btnAddress; text: "Address"; icon: "attraction.svg"; onClicked: console.log("Implement me!"); } } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSearchSelector.qml000066400000000000000000000067641264204753600251250ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height color: "Black" opacity: 0 function setSearchResult(listValue) { if (search.searchContext=="country") { search.countryName=listValue; Navit.back; } if (search.searchContext=="town") { search.townName=listValue; Navit.back(); } if (search.searchContext=="street") { search.streetName=listValue; search.setPointToResult(); Navit.returnSource="main.qml"; Navit.load("PageNavigate.qml"); } } function pageOpen() { if (search.searchContext=="country") { searchTxt.text=search.countryName; countryBinding.when=true; } if (search.searchContext=="town") { searchTxt.text=search.townName; townBinding.when=true; } if (search.searchContext=="street") { searchTxt.text=search.streetName; streetBinding.when=true; } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } TextInput{ id: searchTxt; anchors.top: parent.top; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false; cursorVisible: true; } Binding {id: countryBinding; target: search; property: "countryName"; value: searchTxt.text; when: false} Binding {id: townBinding; target: search; property: "townName"; value: searchTxt.text; when: false} Binding {id: streetBinding; target: search; property: "streetName"; value: searchTxt.text; when: false} Connections { target: search; onCountryNameSignal: {listModel.xml=search.searchXml(); listModel.query="/search/item"; listModel.reload(); } } Connections { target: search; onTownNameSignal: {listModel.xml=search.searchXml(); listModel.query="/search/item"; listModel.reload(); } } Connections { target: search; onStreetNameSignal: {listModel.xml=search.searchXml(); listModel.query="/search/item"; listModel.reload(); } } XmlListModel { id: listModel xml: search.searchXml(); query: "/search/item" XmlRole { name: "itemId"; query: "id/string()" } XmlRole { name: "itemName"; query: "name/string()" } XmlRole { name: "itemIcon"; query: "icon/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Image { id: imgIcon; source: gui.iconPath+itemIcon width: 20; height: 20; } Text { id: txtItemName; text: itemName; color: "White"; anchors.left: imgIcon.right;anchors.leftMargin: 5 width: list.width-imgIcon.width } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { setSearchResult(itemName); } } } } Component { id: listHighlight Rectangle { opacity: 0 } } ListSelector { id:layoutList; text: search.searchContext; onChanged: setSearchResult() anchors.top: searchTxt.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width; height: page.height/2-cellar.height } Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSettings.qml000066400000000000000000000034061264204753600240050ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.verticalCenter; anchors.bottomMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnDisplay; text: "Display"; icon: "gui_display.svg"; onClicked: Navit.load("PageSettingsDisplay.qml"); } ButtonIcon { id: btnMap; text: "Map"; icon: "gui_maps.svg"; onClicked: console.log("Implement me!"); } ButtonIcon { id: btnVehicle; text: "Vehicle"; icon: "gui_vehicle.svg"; onClicked: Navit.load("PageSettingsVehicle.qml"); } } Grid { columns: 3;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.top: parent.verticalCenter; anchors.topMargin: gui.height/16; spacing: gui.width/12 ButtonIcon { id: btnRules; text: "Rules"; icon: "gui_rules.svg"; onClicked: Navit.load("PageSettingsRules.qml"); } ButtonIcon { id: btnTools; text: "Tools"; icon: "gui_tools.svg"; onClicked: Navit.load("PageSettingsTools.qml"); } ButtonIcon { id: btnAbout; text: "About"; icon: "gui_about.svg"; onClicked: Navit.load("PageAbout.qml"); } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSettingsDisplay.qml000066400000000000000000000054521264204753600253360ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function setTripleD(flag) { if ( flag=="true" ) { navit.setAttr("pitch",gui.getAttr("pitch")); pitchSlider.value = navit.getAttr("pitch"); pitchSlider.startup(); pitchSlider.opacity = 1 } else { navit.setAttr("pitch","0"); pitchSlider.opacity = 0 } } function isTripleD() { if ( navit.getAttr("pitch") == "0" ) return "0"; else return "1"; } function pageOpen() { if ( isTripleD() == "1" ) { pitchSlider.opacity = 1 } page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Component { id: listDelegate Item { id: wrapper width: list.width; height: 20 Column { x: 5; y: 5 Text { id: txtItemName; text: itemName; color: "White" } Text { id: txtItemDist; text: itemDistance; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemName.right;anchors.top: txtItemName.top } Text { id: txtItemDirect; text: itemDirection; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemDist.right;anchors.top: txtItemDist.top } } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { list.currentIndex=itemId; listselector.value=itemValue; listselector.changed() } } } } CommonHighlight { id: listHighlight} ListSelector { id:layoutList; text: "Current layout"; itemId: navit.getAttrList("layout"); onChanged: navit.setObjectByName("layout",layoutList.value) anchors.top: parent.top; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 width: page.width/2; height: page.height*0.25 } Grid { columns: 1; rows: 3 anchors.right: parent.right anchors.top: parent.top; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 spacing: gui.width/12 ToggleSwitch { id: fullscreenSw; stOn: gui.getAttr("fullscreen"); text: "Fullscreen"; onChanged: gui.setAttr("fullscreen",fullscreenSw.stOn) } ToggleSwitch { id: tripledSw; stOn: page.isTripleD(); text: "2D/3D"; onChanged: setTripleD(tripledSw.stOn) } Slider { id: pitchSlider; minValue: 5; maxValue: 90; value: navit.getAttr("pitch"); text: "Pitch"; onChanged: { navit.setAttr("pitch",pitchSlider.value); gui.setAttr("pitch",pitchSlider.value) } opacity: 0 } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSettingsLocale.qml000066400000000000000000000016551264204753600251310ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 1;rows: 3 anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; Text { id: lang; text: gui.localeName; color: "White";font.pointSize: gui.height/24 } Text { id: langname; text: gui.langName; color: "White";font.pointSize: gui.height/24 } Text { id: ctryname; text: gui.ctryName; color: "White";font.pointSize: gui.height/24 } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSettingsRules.qml000066400000000000000000000027521264204753600250230ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } VisualItemModel { id: selectorsModel ToggleSwitch { id: trackingSw; stOn: navit.getAttr("tracking"); text: "Lock on road"; onChanged: navit.setAttr("tracking",trackingSw.stOn) } ToggleSwitch { id: orientationSw; stOn: navit.getAttr("orientation"); text: "Northing"; onChanged: navit.setAttr("orientation",orientationSw.stOn) } ToggleSwitch { id: followcursorSw; stOn: navit.getAttr("follow_cursor"); text: "Map follows Vehicle"; onChanged: navit.setAttr("follow_cursor",followcursorSw.stOn) } ToggleSwitch { id: autozoomSw; stOn: navit.getAttr("autozoom_active"); text: "Auto zoom"; onChanged: navit.setAttr("autozoom_active",autozoomSw.stOn) } } ListView { id: selectorsList; model: selectorsModel focus: true; clip: true; orientation: Qt.Vertical anchors.verticalCenter: parent.verticalCenter; anchors.horizontalCenter: parent.horizontalCenter; width: trackingSw.width*1.5; height: trackingSw.height*4 } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSettingsTools.qml000066400000000000000000000014701264204753600250250ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Grid { columns: 1;rows: 1 anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; ButtonIcon { id: btnDisplay; text: "Locale"; icon: "gui_actions.svg"; onClicked: Navit.load("PageSettingsLocale.qml"); } } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/PageSettingsVehicle.qml000066400000000000000000000035051264204753600253050ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: page width: gui.width; height: gui.height border.width: 1 color: "Black" opacity: 0 function pageOpen() { page.opacity = 1; } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } XmlListModel { id: listModel xml: navit.getAttrList("vehicle"); query: "/attributes/vehicle" XmlRole { name: "itemId"; query: "id/string()" } XmlRole { name: "itemName"; query: "name/string()" } } Component { id: listDelegate Item { id: wrapper width: list.width; height: txtItemName.height Column { x: 5; y: 5 Text { id: txtItemName; text: itemName; color: "White"; font.pointSize: 42 } } MouseArea { id:delegateMouse anchors.fill: parent onClicked: { list.currentIndex=itemId; listselector.value=itemName; listselector.changed() } } } } CommonHighlight { id: listHighlight} ListSelector { id:vehicleList; text: "Current vehicle profile"; itemId: navit.itemId; onChanged: {navit.setObjectByName("vehicle",vehicleList.value) } anchors.top: parent.top; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32 anchors.left: parent.left; width: page.width/2;height: page.height/2 } ButtonIcon { id: btnVehicle; text: navit.getAttr("vehicle"); icon: "gui_vehicle.svg"; onClicked: Navit.load("PageSettingsVehicleOptions.qml"); anchors.verticalCenter: vehicleList.verticalCenter; anchors.leftMargin: gui.width/32 anchors.left: vehicleList.right; } Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/Slider.qml000066400000000000000000000042431264204753600226320ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: slider width: background.width + label.width + gui.width/24; height: label.height color: "Black" property int minValue: 0 property int value: 50 property int maxValue: 100 property string text: "Slider" signal changed function toSlider(inputVal) { return 2+(((inputVal-minValue)/(maxValue-minValue))*(background.width-knob.width-2)); } function fromSlider(inputVal) { return minValue+(((inputVal-2)/(background.width-knob.width-2))*(maxValue-minValue)); } function startup () { if ( slider.value < slider.minValue ) { slider.value = slider.minValue; } if ( slider.value > slider.maxValue ) { slider.value = slider.maxValue; } knob.x = toSlider(slider.value); } Component.onCompleted: startup(); Rectangle { id: background x: 20; width: gui.width/5; height: gui.height/24 gradient: Gradient { GradientStop { position: 0.0; color: "steelblue" } GradientStop { position: 1.0; color: "lightsteelblue" } } MouseArea { anchors.fill: parent onReleased: { knob.x=mouse.x-15; slider.value=Math.round(fromSlider(knob.x)); slider.changed(); } } radius: 8; opacity: 0.7 Rectangle { id: knob x: 2; y: 2; width: gui.width/26; height: gui.height/35 radius: 6 gradient: Gradient { GradientStop { position: 0.0; color: "lightgray" } GradientStop { position: 1.0; color: "gray" } } MouseArea { anchors.fill: parent drag.target: parent; drag.axis: "XAxis"; drag.minimumX: 2; drag.maximumX: background.width-knob.width onPositionChanged: slider.value=Math.round(fromSlider(knob.x)) onReleased: slider.changed() } } Text { id: valueTxt; text: slider.value; color: "White"; font.pointSize: gui.height/32; anchors.horizontalCenter: knob.horizontalCenter; anchors.verticalCenter: knob.verticalCenter } } Text { id: label; text: slider.text; color: "White"; font.pointSize: gui.height/24; anchors.left: background.right; anchors.leftMargin: gui.width/24; anchors.verticalCenter: background.verticalCenter } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/ToggleButton.qml000066400000000000000000000040761264204753600240310ustar00rootroot00000000000000import Qt 4.7 Item { id: togglebutton width: imgItem.width + txtItem.width + gui.width/24; height: imgItem.height property string stOn: "false" property string text: "Toggle button" property string icon: "Icon.png" signal changed function toggle() { if (togglebutton.state == "on") togglebutton.state = "off"; else togglebutton.state = "on"; } function startup () { if (togglebutton.stOn == "1" ) togglebutton.stOn = "true"; else if (togglebutton.stOn == "0" ) togglebutton.stOn = "false"; if (togglebutton.stOn == "true") togglebutton.state = "on"; else togglebutton.state = "off"; } Component.onCompleted: startup(); MouseArea { id: mr; anchors.fill: parent; onReleased: toggle() } Image { id: imgItem; source: gui.iconPath+togglebutton.icon; anchors.top: togglebutton.top; anchors.horizontalCenter: togglebutton.horizontalCenter; width: gui.height/32; height: gui.height/32 } Text { id: txtItem; text: togglebutton.text; anchors.top: imgItem.bottom; anchors.horizontalCenter: togglebutton.horizontalCenter; color: "White"; font.pointSize: gui.height/64; horizontalAlignment: Qt.AlignHCenter } states: [ State { name: "on" PropertyChanges { target: imgItem; opacity: 1 } PropertyChanges { target: txtItem; opacity: 1 } PropertyChanges { target: togglebutton; stOn: "true" } StateChangeScript { script: togglebutton.changed(); } }, State { name: "off" PropertyChanges { target: imgItem; opacity: 0.3 } PropertyChanges { target: txtItem; opacity: 0.3 } PropertyChanges { target: togglebutton; stOn: "false" } StateChangeScript { script: togglebutton.changed(); } } ] transitions: Transition { NumberAnimation { properties: "scale"; easing.type: "OutExpo"; duration: 200 } NumberAnimation { properties: "opacity"; easing.type: "InQuad"; duration: 200 } } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/ToggleSwitch.qml000066400000000000000000000041271264204753600240140ustar00rootroot00000000000000import Qt 4.7 Item { id: toggleswitch width: background.width + label.width + gui.width/24; height: background.height property string stOn: "false" property string text: "Toggle switch" signal changed function toggle() { if (toggleswitch.state == "on") toggleswitch.state = "off"; else toggleswitch.state = "on"; } function startup () { if (toggleswitch.stOn == "1" ) toggleswitch.stOn = "true"; else if (toggleswitch.stOn == "0" ) toggleswitch.stOn = "false"; if (toggleswitch.stOn == "true") toggleswitch.state = "on"; else toggleswitch.state = "off"; } Component.onCompleted: startup(); Text { id: label; text: toggleswitch.text; color: "White"; font.pointSize: gui.height/20; anchors.left: background.right; anchors.leftMargin: gui.width/24; anchors.verticalCenter: background.verticalCenter } Image { id: background; source: "background.svg" MouseArea { anchors.fill: parent; onClicked: toggle() } height: gui.height/6; width: height*2.4; } Image { id: knob; source: "knob.svg"; x: 1; y: 2 height: gui.height/6; width: gui.height/6; MouseArea { anchors.fill: parent drag.target: knob; drag.axis: "XAxis"; drag.minimumX: 1; drag.maximumX: background.width-knob.width hoverEnabled: false; onReleased: toggle() } } states: [ State { name: "on" PropertyChanges { target: knob; x: background.width-knob.width } PropertyChanges { target: toggleswitch; stOn: "true" } StateChangeScript { script: toggleswitch.changed(); } }, State { name: "off" PropertyChanges { target: knob; x: 1 } PropertyChanges { target: toggleswitch; stOn: "false" } StateChangeScript { script: toggleswitch.changed(); } } ] transitions: Transition { NumberAnimation { properties: "x"; easing.type: "InOutQuad"; duration: 200 } } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/background.svg000066400000000000000000000027661264204753600235450ustar00rootroot00000000000000 ]> navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/command.js000066400000000000000000000006361264204753600226530ustar00rootroot00000000000000import Qt 4.7 Rectangle { id: page function pageOpen(command) { if ( command=="menu") { gui.returnSource=""; Loader {source: "main.qml"}; } if (command=="quit") { navit.quit(); } } Component.onCompleted: pageOpen(gui.commandFunction); Text { id: myText; anchors.centerIn: parent; text: "Hi, i'm Navit!"; color: "Black"; font.pointSize: gui.height/32 } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/knob.svg000066400000000000000000000425531264204753600223550ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/main.qml000066400000000000000000000013421264204753600223310ustar00rootroot00000000000000import Qt 4.7 import "pagenavigation.js" as Navit Rectangle { id: main property variant returnPath:[ "test" ] width: gui.width; height: gui.height color: "Black" function pageOpen() { Navit.load("PageMain.qml"); } Component.onCompleted: pageOpen(); Behavior on opacity { NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true } } Loader { id: pageLoader; width: gui.width; height: gui.height-cellar.height; anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; } Cellar {id: cellar;anchors.bottom: main.bottom; anchors.horizontalCenter: main.horizontalCenter; width: main.width } } navit-0.5.0+dfsg.1/navit/gui/qml/skins/navit/pagenavigation.js000066400000000000000000000004061264204753600242240ustar00rootroot00000000000000var returnPath=new Array(); function load(page) { gui.pushPage(page); pageLoader.source=page; cellar.onStartup(page); } function back() { var page=gui.popPage(); console.log(page); pageLoader.source=page; cellar.onStartup(page); } navit-0.5.0+dfsg.1/navit/gui/qml/vehicleProxy.h000066400000000000000000000013511264204753600212540ustar00rootroot00000000000000#ifndef NAVIT_GUI_QML_VEHICLEPROXY_H #define NAVIT_GUI_QML_VEHICLEPROXY_H class NGQProxyVehicle : public NGQProxy { Q_OBJECT; public: NGQProxyVehicle(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; public slots: protected: int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return vehicle_get_attr(this->object->currVehicle, type, attr, iter); } int setAttrFunc(struct attr* attr) {return vehicle_set_attr(this->object->currVehicle,attr); } struct attr_iter* getIterFunc() { return vehicle_attr_iter_new(); }; void dropIterFunc(struct attr_iter* iter) { vehicle_attr_iter_destroy(iter); }; private: }; #include "vehicleProxy.moc" #endif /* NAVIT_GUI_QML_VEHICLEPROXY_H */ navit-0.5.0+dfsg.1/navit/item.c000066400000000000000000000277571264204753600161710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "coord.h" #include "debug.h" #include "item.h" #include "map.h" #include "transform.h" struct item_name { enum item_type item; char *name; }; struct item_range item_range_all = { type_none, type_last }; struct default_flags { enum item_type type; int flags; }; struct item busy_item; struct default_flags default_flags2[]={ {type_street_nopass, AF_PBH}, {type_street_0, AF_ALL}, {type_street_1_city, AF_ALL}, {type_street_2_city, AF_ALL}, {type_street_3_city, AF_ALL}, {type_street_4_city, AF_ALL}, {type_highway_city, AF_MOTORIZED_FAST}, {type_street_1_land, AF_ALL}, {type_street_2_land, AF_ALL}, {type_street_3_land, AF_ALL}, {type_street_4_land, AF_ALL}, {type_street_n_lanes, AF_MOTORIZED_FAST}, {type_highway_land, AF_MOTORIZED_FAST}, {type_ramp, AF_MOTORIZED_FAST}, {type_roundabout, AF_ALL}, {type_ferry, AF_ALL}, {type_cycleway, AF_PBH}, {type_track_paved, AF_ALL}, {type_track_gravelled, AF_ALL}, {type_track_unpaved, AF_ALL}, {type_track_ground, AF_ALL}, {type_track_grass, AF_ALL}, {type_footway, AF_PBH}, {type_living_street, AF_ALL}, {type_street_service, AF_ALL}, {type_street_parking_lane, AF_ALL}, {type_bridleway, AF_PBH}, {type_path, AF_PBH}, {type_steps, AF_PBH}, {type_street_pedestrian, AF_PBH}, {type_hiking_mountain, AF_PEDESTRIAN}, {type_hiking_mountain_demanding, AF_PEDESTRIAN}, {type_hiking, AF_PEDESTRIAN}, {type_hiking_alpine, AF_PEDESTRIAN}, {type_hiking_alpine_demanding, AF_PEDESTRIAN}, {type_hiking_alpine_difficult, AF_PEDESTRIAN}, }; struct item_name item_names[]={ #define ITEM2(x,y) ITEM(y) #define ITEM(x) { type_##x, #x }, #include "item_def.h" #undef ITEM2 #undef ITEM }; static GHashTable *default_flags_hash; static GHashTable *item_hash; void item_create_hash(void) { int i; item_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { g_hash_table_insert(item_hash, item_names[i].name, GINT_TO_POINTER(item_names[i].item)); } } void item_destroy_hash(void) { g_hash_table_destroy(item_hash); item_hash=NULL; } int * item_get_default_flags(enum item_type type) { if (!default_flags_hash) { int i; default_flags_hash=g_hash_table_new(NULL, NULL); for (i = 0 ; i < sizeof(default_flags2)/sizeof(struct default_flags); i++) { g_hash_table_insert(default_flags_hash, (void *)(long)default_flags2[i].type, &default_flags2[i].flags); } } return g_hash_table_lookup(default_flags_hash, (void *)(long)type); } void item_cleanup(void) { if (default_flags_hash) g_hash_table_destroy(default_flags_hash); } /** * @brief Resets the "coordinate pointer" of an item * * This function resets the "coordinate pointer" of an item to point to the first coordinate pair, * so that at the next call to {@code item_coord_get()} the first coordinates will be returned. * * @param it The map item whose pointer is to be reset. This must be the active item, i.e. the last one retrieved from the * {@code map_rect}. There can only be one active item per {@code map_rect}. */ void item_coord_rewind(struct item *it) { it->meth->item_coord_rewind(it->priv_data); } /** * @brief Gets the next coordinates from an item * * This function returns a list of coordinates from an item and advances the "coordinate pointer" * by the number of coordinates returned, so that at the next call the next coordinates will be returned. * * Coordinates are stored in the projection of the item's map. If you need them in a different projection, * call {@code item_coord_get_pro()} instead. * * @param it The map item whose coordinates to retrieve. This must be the active item, i.e. the last one retrieved from the * {@code map_rect}. There can only be one active item per {@code map_rect}. * @param c Points to a buffer that will receive the coordinates. * The buffer must be at least {@code count * sizeof(struct coord)} bytes in size. * @param count The number of coordinates to retrieve. Attempts to read past the * end are handled gracefully and only the available number of coordinates is * returned. * * @return The number of coordinates actually retrieved and stored in {@code c} */ int item_coord_get(struct item *it, struct coord *c, int count) { return it->meth->item_coord_get(it->priv_data, c, count); } int item_coord_set(struct item *it, struct coord *c, int count, enum change_mode mode) { if (!it->meth->item_coord_set) return 0; return it->meth->item_coord_set(it->priv_data, c, count, mode); } int item_coord_get_within_selection(struct item *it, struct coord *c, int count, struct map_selection *sel) { int i,ret=it->meth->item_coord_get(it->priv_data, c, count); struct coord_rect r; struct map_selection *curr; if (ret <= 0 || !sel) return ret; r.lu=c[0]; r.rl=c[0]; for (i = 1 ; i < ret ; i++) { if (r.lu.x > c[i].x) r.lu.x=c[i].x; if (r.rl.x < c[i].x) r.rl.x=c[i].x; if (r.rl.y > c[i].y) r.rl.y=c[i].y; if (r.lu.y < c[i].y) r.lu.y=c[i].y; } curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; if (r.lu.x <= sr->rl.x && r.rl.x >= sr->lu.x && r.lu.y >= sr->rl.y && r.rl.y <= sr->lu.y) return ret; curr=curr->next; } return 0; } /** * @brief Gets the next coordinates from an item and reprojects them * * This function returns a list of coordinates from an item and advances the "coordinate pointer" * by the number of coordinates returned, so that at the next call the next coordinates will be returned. * * @param it The map item whose coordinates to retrieve. This must be the active item, i.e. the last one retrieved from the * {@code map_rect}. There can only be one active item per {@code map_rect}. * @param c Points to a buffer that will receive the coordinates. * The buffer must be at least {@code count * sizeof(struct coord)} bytes in size. * @param count The number of coordinates to retrieve. Attempts to read past the * end are handled gracefully and only the available number of coordinates is * returned. * @param projection The projection into which the coordinates will be transformed * * @return The number of coordinates actually retrieved and stored in {@code c} */ int item_coord_get_pro(struct item *it, struct coord *c, int count, enum projection to) { int ret=item_coord_get(it, c, count); int i; enum projection from=map_projection(it->map); if (from != to) for (i = 0 ; i < count ; i++) transform_from_to(c+i, from, c+i, to); return ret; } int item_coord_is_node(struct item *it) { if (it->meth->item_coord_is_node) return it->meth->item_coord_is_node(it->priv_data); return 0; } void item_attr_rewind(struct item *it) { it->meth->item_attr_rewind(it->priv_data); } int item_attr_get(struct item *it, enum attr_type attr_type, struct attr *attr) { return it->meth->item_attr_get(it->priv_data, attr_type, attr); } int item_attr_set(struct item *it, struct attr *attr, enum change_mode mode) { if (!it->meth->item_attr_set) return 0; return it->meth->item_attr_set(it->priv_data, attr, mode); } /** * @brief Set map item type. * * @param it reference to the item. * @param type New type for the item. Setting it to type_none is expected to delete item from the map. * @return Non-zero if this action is supported by the map and type is set successfully, 0 on error. */ int item_type_set(struct item *it, enum item_type type) { if (!it->meth->item_type_set) return 0; return it->meth->item_type_set(it->priv_data, type); } struct item * item_new(char *type, int zoom) { struct item * it; it = g_new0(struct item, 1); /* FIXME evaluate arguments */ return it; } enum item_type item_from_name(const char *name) { int i; if (item_hash) return GPOINTER_TO_INT(g_hash_table_lookup(item_hash, name)); for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { if (! strcmp(item_names[i].name, name)) return item_names[i].item; } return type_none; } char * item_to_name(enum item_type item) { int i; for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { if (item_names[i].item == item) return item_names[i].name; } return NULL; } struct item_hash { GHashTable *h; }; static guint item_hash_hash(gconstpointer key) { const struct item *itm=key; gconstpointer hashkey=(gconstpointer)GINT_TO_POINTER(itm->id_hi^itm->id_lo^(GPOINTER_TO_INT(itm->map))); return g_direct_hash(hashkey); } static gboolean item_hash_equal(gconstpointer a, gconstpointer b) { const struct item *itm_a=a; const struct item *itm_b=b; if (item_is_equal(*itm_a, *itm_b)) return TRUE; return FALSE; } unsigned int item_id_hash(const void *key) { const struct item_id *id=key; return id->id_hi^id->id_lo; } int item_id_equal(const void *a, const void *b) { const struct item_id *id_a=a; const struct item_id *id_b=b; return (id_a->id_hi == id_b->id_hi && id_a->id_lo == id_b->id_lo); } /** * @brief Derive item id_lo and id_hi from pointer, considering pointer could be 32 or 64 bit wide but both ids are 32 bit. * * @param it reference to the item. * @param id pointer to derive item id from. * @return Nothing. */ void item_id_from_ptr(struct item *item, void *id) { #if !defined(__LP64__) && !defined(__LLP64__) && !defined(WIN64) item->id_lo=(int) id; item->id_hi=0; #else # ifndef _MSC_VER item->id_lo=((long long)id)&0xFFFFFFFFll; # else item->id_lo=((long long)id)&0xFFFFFFFFi64; # endif item->id_hi=((long long)id)>>32; #endif } struct item_hash * item_hash_new(void) { struct item_hash *ret=g_new(struct item_hash, 1); ret->h=g_hash_table_new_full(item_hash_hash, item_hash_equal, g_free, NULL); return ret; } void item_hash_insert(struct item_hash *h, struct item *item, void *val) { struct item *hitem=g_new(struct item, 1); *hitem=*item; dbg(lvl_info,"inserting (0x%x,0x%x) into %p\n", item->id_hi, item->id_lo, h->h); g_hash_table_insert(h->h, hitem, val); } int item_hash_remove(struct item_hash *h, struct item *item) { int ret; dbg(lvl_info,"removing (0x%x,0x%x) from %p\n", item->id_hi, item->id_lo, h->h); ret=g_hash_table_remove(h->h, item); dbg(lvl_info,"ret=%d\n", ret); return ret; } void * item_hash_lookup(struct item_hash *h, struct item *item) { return g_hash_table_lookup(h->h, item); } void item_hash_destroy(struct item_hash *h) { g_hash_table_destroy(h->h); g_free(h); } int item_range_intersects_range(struct item_range *range1, struct item_range *range2) { if (range1->max < range2->min) return 0; if (range1->min > range2->max) return 0; return 1; } int item_range_contains_item(struct item_range *range, enum item_type type) { if (type >= range->min && type <= range->max) return 1; return 0; } void item_dump_attr(struct item *item, struct map *map, FILE *out) { struct attr attr; fprintf(out,"type=%s", item_to_name(item->type)); while (item_attr_get(item, attr_any, &attr)) fprintf(out," %s='%s'", attr_to_name(attr.type), attr_to_text(&attr, map, 1)); } void item_dump_filedesc(struct item *item, struct map *map, FILE *out) { int i,count,max=16384; struct coord *ca=g_alloca(sizeof(struct coord)*max); count=item_coord_get(item, ca, item->type < type_line ? 1: max); if (item->type < type_line) fprintf(out,"mg:0x%x 0x%x ", ca[0].x, ca[0].y); item_dump_attr(item, map, out); fprintf(out,"\n"); if (item->type >= type_line) for (i = 0 ; i < count ; i++) fprintf(out,"mg:0x%x 0x%x\n", ca[i].x, ca[i].y); } navit-0.5.0+dfsg.1/navit/item.h000066400000000000000000000140251264204753600161560ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_ITEM_H #define NAVIT_ITEM_H #ifdef __cplusplus extern "C" { #endif #include enum item_type { #define ITEM2(x,y) type_##y=x, #define ITEM(x) type_##x, #include "item_def.h" #undef ITEM2 #undef ITEM }; #define route_item_first type_street_0 #define route_item_last type_street_parking_lane extern int default_flags[]; #include "attr.h" /* NOTE: we treat districts as towns for now, since a) navit does not implement district search yet b) OSM "place=suburb" maps to type_district in maptool. with the OSM USA maps, there are many "suburbs" that users will consider towns (not districts/counties); we want navit's town search to find them */ #define item_type_is_area(type) ((type) >= type_area) #define item_is_town(item) ((item).type >= type_town_label && (item).type <= type_district_label_1e7) #define item_is_district(item) ((item).type >= type_district_label && (item).type <= type_district_label_1e7) #define item_is_poly_place(item) ((item).type >= type_poly_place1 && (item).type <= type_poly_place6) #define item_is_point(item) ((item).type < type_line) #define item_is_custom_poi(item) ((item).type >= type_poi_customg && (item).type < type_line) #define item_is_street(item) (((item).type >= type_street_nopass && (item).type <= type_roundabout) \ || (item).type == type_street_service \ || ((item).type >= type_street_pedestrian && (item).type <= type_track_grass) \ || (item).type == type_living_street \ || (item).type == type_street_construction \ || (item).type == type_path \ || (item).type == type_street_parking_lane \ || (item).type == type_footway ) #define item_is_equal_id(a,b) ((a).id_hi == (b).id_hi && (a).id_lo == (b).id_lo) #define item_is_equal(a,b) (item_is_equal_id(a,b) && (a).map == (b).map) struct coord; enum change_mode { change_mode_delete, change_mode_modify, change_mode_append, change_mode_prepend, }; struct item_methods { void (*item_coord_rewind)(void *priv_data); int (*item_coord_get)(void *priv_data, struct coord *c, int count); void (*item_attr_rewind)(void *priv_data); int (*item_attr_get)(void *priv_data, enum attr_type attr_type, struct attr *attr); int (*item_coord_is_node)(void *priv_data); int (*item_attr_set)(void *priv_data, struct attr *attr, enum change_mode mode); int (*item_coord_set)(void *priv_data, struct coord *c, int count, enum change_mode mode); int (*item_type_set)(void *priv_data, enum item_type type); }; struct item_id { int id_hi; int id_lo; }; #define ITEM_ID_FMT "(0x%x,0x%x)" #define ITEM_ID_ARGS(x) (x).id_hi,(x).id_lo /** * Represents an object on a map, such as a POI, a building, a way or a boundary. */ struct item { enum item_type type; /**< Type of the item.*/ int id_hi; /**< First part of the ID of the item (item IDs have two parts).*/ int id_lo; /**< Second part of the ID of the item.*/ struct map *map; /**< The map this items belongs to.*/ struct item_methods *meth; /**< Methods to manipulate this item.*/ void *priv_data; /**< Private item data, only used by the map plugin which supplied this item.*/ }; extern struct item_range { enum item_type min,max; } item_range_all; extern struct item busy_item; /* prototypes */ enum attr_type; enum change_mode; enum item_type; enum projection; struct attr; struct coord; struct item; struct item_hash; struct item_range; struct map; struct map_selection; void item_create_hash(void); void item_destroy_hash(void); int *item_get_default_flags(enum item_type type); void item_coord_rewind(struct item *it); int item_coord_get(struct item *it, struct coord *c, int count); int item_coord_set(struct item *it, struct coord *c, int count, enum change_mode mode); int item_coord_get_within_selection(struct item *it, struct coord *c, int count, struct map_selection *sel); int item_coord_get_pro(struct item *it, struct coord *c, int count, enum projection to); int item_coord_is_node(struct item *it); void item_attr_rewind(struct item *it); int item_attr_get(struct item *it, enum attr_type attr_type, struct attr *attr); int item_attr_set(struct item *it, struct attr *attr, enum change_mode mode); int item_type_set(struct item *it, enum item_type type); struct item *item_new(char *type, int zoom); enum item_type item_from_name(const char *name); char *item_to_name(enum item_type item); unsigned int item_id_hash(const void *key); int item_id_equal(const void *a, const void *b); void item_id_from_ptr(struct item *item, void *id); struct item_hash *item_hash_new(void); void item_hash_insert(struct item_hash *h, struct item *item, void *val); int item_hash_remove(struct item_hash *h, struct item *item); void *item_hash_lookup(struct item_hash *h, struct item *item); void item_hash_destroy(struct item_hash *h); int item_range_intersects_range(struct item_range *range1, struct item_range *range2); int item_range_contains_item(struct item_range *range, enum item_type type); void item_dump_attr(struct item *item, struct map *map, FILE *out); void item_dump_filedesc(struct item *item, struct map *map, FILE *out); void item_cleanup(void); /* end of prototypes */ #ifdef __cplusplus } /* __cplusplus */ #endif /* NAVIT_ITEM_H */ #endif navit-0.5.0+dfsg.1/navit/item_def.h000066400000000000000000000326041264204753600167770ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* This file is generated from http://wiki.navit-project.org/index.php/Item_def.h, do not edit it, edit the wiki page instead */ ITEM2(0x00000000,none) ITEM2(0x00000001,point_unspecified) ITEM(town_streets) ITEM(street_name) ITEM(street_name_numbers) ITEM(street_number) ITEM(position_sat) /* Point */ ITEM2(0x00010000,town_label) ITEM2(0x00010001,town_label_0e0) ITEM2(0x00010002,town_label_1e0) ITEM2(0x00010003,town_label_2e0) ITEM2(0x00010004,town_label_5e0) ITEM2(0x00010005,town_label_1e1) ITEM2(0x00010006,town_label_2e1) ITEM2(0x00010007,town_label_5e1) ITEM2(0x00010008,town_label_1e2) ITEM2(0x00010009,town_label_2e2) ITEM2(0x0001000a,town_label_5e2) ITEM2(0x0001000b,town_label_1e3) ITEM2(0x0001000c,town_label_2e3) ITEM2(0x0001000d,town_label_5e3) ITEM2(0x0001000e,town_label_1e4) ITEM2(0x0001000f,town_label_2e4) ITEM2(0x00010010,town_label_5e4) ITEM2(0x00010011,town_label_1e5) ITEM2(0x00010012,town_label_2e5) ITEM2(0x00010013,town_label_5e5) ITEM2(0x00010014,town_label_1e6) ITEM2(0x00010015,town_label_2e6) ITEM2(0x00010016,town_label_5e6) ITEM2(0x00010017,town_label_1e7) ITEM2(0x00010100,district_label) ITEM2(0x00010101,district_label_0e0) ITEM2(0x00010102,district_label_1e0) ITEM2(0x00010103,district_label_2e0) ITEM2(0x00010104,district_label_5e0) ITEM2(0x00010105,district_label_1e1) ITEM2(0x00010106,district_label_2e1) ITEM2(0x00010107,district_label_5e1) ITEM2(0x00010108,district_label_1e2) ITEM2(0x00010109,district_label_2e2) ITEM2(0x0001010a,district_label_5e2) ITEM2(0x0001010b,district_label_1e3) ITEM2(0x0001010c,district_label_2e3) ITEM2(0x0001010d,district_label_5e3) ITEM2(0x0001010e,district_label_1e4) ITEM2(0x0001010f,district_label_2e4) ITEM2(0x00010110,district_label_5e4) ITEM2(0x00010111,district_label_1e5) ITEM2(0x00010112,district_label_2e5) ITEM2(0x00010113,district_label_5e5) ITEM2(0x00010114,district_label_1e6) ITEM2(0x00010115,district_label_2e6) ITEM2(0x00010116,district_label_5e6) ITEM2(0x00010117,district_label_1e7) ITEM(country_label) ITEM(town_ghost) ITEM(highway_exit_label) ITEM(port_label) ITEM(label_unkn) ITEM(highway_exit) ITEM(poi_lake) ITEM(poi_island) ITEM(poi) ITEM(waypoint) ITEM(trackpoint) ITEM(bookmark) ITEM(former_destination) ITEM(poi_land_feature) ITEM(poi_cape) ITEM(poi_rock) ITEM(poi_airport) ITEM(poi_toll_booth) ITEM(poi_fuel) ITEM(poi_hotel) ITEM(poi_camp_rv) ITEM(poi_marina) ITEM(poi_attraction) ITEM(poi_museum_history) ITEM(poi_shopping) ITEM(poi_car_dealer_parts) ITEM(poi_car_parking) ITEM(poi_wreck) ITEM(poi_building) ITEM(poi_bridge) ITEM(poi_park) ITEM(poi_water_feature) ITEM(poi_bar) ITEM(poi_picnic) ITEM(poi_hospital) ITEM(poi_camping) ITEM(poi_public_utilities) ITEM(poi_burgerking) ITEM(poi_kfc) ITEM(poi_mcdonalds) ITEM(poi_wienerwald) ITEM(poi_dining) ITEM(poi_fastfood) ITEM(poi_police) ITEM(poi_auto_club) ITEM(poi_autoservice) ITEM(poi_bank) ITEM(poi_bay) ITEM(poi_bend) ITEM(poi_boat_ramp) ITEM(poi_border_station) ITEM(poi_bowling) ITEM(poi_bus_station) ITEM(poi_bus_stop) ITEM(poi_business_service) ITEM(poi_car_rent) ITEM(poi_car_wash) ITEM(poi_casino) ITEM(poi_cemetery) ITEM(poi_church) ITEM(poi_cinema) ITEM(poi_civil_removeme) ITEM(poi_communication) ITEM(poi_concert) ITEM(poi_cove) ITEM(poi_crossing) ITEM(poi_dam) ITEM(poi_danger_area) ITEM(poi_danger_sea_wreck) ITEM(poi_daymark) ITEM(poi_diving) ITEM(poi_drinking_water) ITEM(poi_emergency) ITEM(poi_fair) ITEM(poi_firebrigade) ITEM(poi_fish) ITEM(poi_forbidden_area) ITEM(poi_shop_gps) ITEM(poi_golf) ITEM(poi_government_building) ITEM(poi_height) ITEM(poi_heliport) ITEM(poi_hotspring) ITEM(poi_icesport) ITEM(poi_information) ITEM(poi_justice) ITEM(poi_landmark) ITEM(poi_levee) ITEM(poi_library) ITEM(poi_locale) ITEM(poi_loudspeaker) ITEM(poi_mall) ITEM(poi_manmade_feature) ITEM(poi_marine) ITEM(poi_marine_type) ITEM(poi_mark) ITEM(poi_military) ITEM(poi_mine) ITEM(poi_nondangerous) ITEM(poi_oil_field) ITEM(poi_personal_service) ITEM(poi_pharmacy) ITEM(poi_post_removeme) ITEM(poi_public_office) ITEM(poi_repair_service) ITEM(poi_resort) ITEM(poi_rest_room_removeme) ITEM(poi_restaurant) ITEM(poi_restricted_area) ITEM(poi_restroom) ITEM(poi_sailing) ITEM(poi_scenic_area) ITEM(poi_school) ITEM(poi_service) ITEM(poi_shop_apparel) ITEM(poi_shop_computer) ITEM(poi_shop_department) ITEM(poi_shop_furnish_removeme) ITEM(poi_shop_grocery) ITEM(poi_shop_handg) ITEM(poi_shop_merchandise) ITEM(poi_shop_retail) ITEM(poi_shower) ITEM(poi_skiing) ITEM(poi_social_service) ITEM(poi_sounding) ITEM(poi_sport) ITEM(poi_stadium) ITEM(poi_subdivision_removeme) ITEM(poi_swimming) ITEM(poi_telephone) ITEM(poi_theater) ITEM(poi_tide) ITEM(poi_tower) ITEM(poi_trail) ITEM(poi_truck_stop) ITEM(poi_tunnel) ITEM(poi_wine) ITEM(poi_worship) ITEM(poi_wrecker) ITEM(poi_zoo) ITEM(rg_point) ITEM(point_unkn) ITEM(traffic_signals) ITEM(poi_gc_multi) ITEM(poi_gc_tradi) ITEM(poi_gc_event) ITEM(poi_gc_mystery) ITEM(poi_gc_question) ITEM(poi_gc_stages) ITEM(poi_gc_reference) ITEM(poi_gc_webcam) ITEM(poi_cafe) ITEM(nav_straight) ITEM(nav_turnaround) ITEM(nav_right_1) ITEM(nav_right_2) ITEM(nav_right_3) ITEM(nav_left_1) ITEM(nav_left_2) ITEM(nav_left_3) ITEM(nav_roundabout_r1) ITEM(nav_roundabout_r2) ITEM(nav_roundabout_r3) ITEM(nav_roundabout_r4) ITEM(nav_roundabout_r5) ITEM(nav_roundabout_r6) ITEM(nav_roundabout_r7) ITEM(nav_roundabout_r8) ITEM(nav_roundabout_l1) ITEM(nav_roundabout_l2) ITEM(nav_roundabout_l3) ITEM(nav_roundabout_l4) ITEM(nav_roundabout_l5) ITEM(nav_roundabout_l6) ITEM(nav_roundabout_l7) ITEM(nav_roundabout_l8) ITEM(poi_peak) ITEM(poi_rail_station) ITEM(poi_image) ITEM(mini_roundabout) ITEM(turning_circle) ITEM(poi_townhall) ITEM(poi_level_crossing) ITEM(poi_rail_halt) ITEM(poi_rail_tram_stop) ITEM(poi_wifi) ITEM(poi_bench) ITEM(poi_biergarten) ITEM(poi_boundary_stone) ITEM(poi_castle) ITEM(poi_hunting_stand) ITEM(poi_memorial) ITEM(poi_monument) ITEM(poi_shelter) ITEM(poi_fountain) ITEM(poi_potable_water) ITEM(poi_toilets) ITEM(poi_viewpoint) ITEM(poi_ruins) ITEM(nav_none) ITEM(nav_position) ITEM(nav_destination) ITEM(tec_common) ITEM(trackpoint_tracked) ITEM(announcement) ITEM(poi_post_box) ITEM(poi_post_office) ITEM(poi_school_university) ITEM(poi_school_college) ITEM(poi_motel) ITEM(poi_guesthouse) ITEM(poi_hostel) ITEM(poi_taxi) ITEM(poi_prison) ITEM(poi_kindergarten) ITEM(poi_shop_butcher) ITEM(poi_shop_baker) ITEM(poi_shop_kiosk) ITEM(poi_soccer) ITEM(poi_basketball) ITEM(poi_baseball) ITEM(poi_climbing) ITEM(poi_motor_sport) ITEM(poi_tennis) ITEM(house_number) ITEM(route_start) ITEM(route_end) ITEM(selected_point) ITEM(power_tower) ITEM(route_start_reverse) ITEM(log_entry) ITEM(poi_playground) ITEM(barrier_cycle) ITEM(barrier_bollard) ITEM(poi_vending_machine) ITEM(poi_recycling) ITEM(poi_hairdresser) ITEM(poi_shop_fruit) ITEM(poi_shop_bicycle) ITEM(poi_shop_florist) ITEM(poi_shop_optician) ITEM(poi_shop_beverages) ITEM(poi_nightclub) ITEM(poi_shop_shoes) ITEM(power_substation) ITEM(barrier_lift_gate) ITEM(traffic_sign_stop) ITEM(traffic_sign_city_limit) ITEM(poi_tree) ITEM(poi_shop_furniture) ITEM(poi_shop_parfum) ITEM(poi_bicycle_rental) ITEM(poi_bicycle_parking) ITEM(poi_car_sharing) ITEM(poi_shop_drugstore) ITEM(poi_shop_photo) ITEM(ch_node) ITEM(place_label) ITEM(vehicle) ITEM(vehicle_pedestrian) ITEM(bookmark_folder) ITEM(poi_pub) ITEM(poi_atm) ITEM(poi_taoist) ITEM(poi_sikh) ITEM(poi_shinto) ITEM(poi_pastafarian) ITEM(poi_pagan) ITEM(poi_jewish) ITEM(poi_jain) ITEM(poi_islamic) ITEM(poi_hindu) ITEM(poi_buddhist) ITEM(poi_bahai) ITEM(found_item) ITEM(nav_merge_left) ITEM(nav_merge_right) ITEM(nav_turnaround_left) ITEM(nav_turnaround_right) ITEM(nav_exit_left) ITEM(nav_exit_right) ITEM(nav_keep_left) ITEM(nav_keep_right) ITEM2(0x7fffffe0,poi_customg) ITEM(poi_customh) ITEM(poi_customi) ITEM(poi_customj) ITEM(poi_customk) ITEM(poi_customl) ITEM(poi_customm) ITEM(poi_customn) ITEM(poi_customo) ITEM(poi_customp) ITEM(poi_customq) ITEM(poi_customr) ITEM(poi_customs) ITEM(poi_customt) ITEM(poi_customu) ITEM(poi_customv) ITEM(poi_custom0) ITEM(poi_custom1) ITEM(poi_custom2) ITEM(poi_custom3) ITEM(poi_custom4) ITEM(poi_custom5) ITEM(poi_custom6) ITEM(poi_custom7) ITEM(poi_custom8) ITEM(poi_custom9) ITEM(poi_customa) ITEM(poi_customb) ITEM(poi_customc) ITEM(poi_customd) ITEM(poi_custome) ITEM(poi_customf) /* Line */ ITEM2(0x80000000,line) ITEM2(0x80000001,line_unspecified) ITEM(border_country) ITEM(border_state) ITEM(rail) ITEM(water_line) ITEM(street_nopass) ITEM(street_0) ITEM(street_1_city) ITEM(street_2_city) ITEM(street_3_city) ITEM(street_4_city) ITEM(highway_city) ITEM(street_1_land) ITEM(street_2_land) ITEM(street_3_land) ITEM(street_4_land) ITEM(street_n_lanes) ITEM(highway_land) ITEM(ramp) ITEM(roundabout) ITEM(ferry) ITEM(roadbook) ITEM(street_unkn) ITEM(street_route) ITEM(height_line_1) ITEM(height_line_2) ITEM(track) ITEM(height_line_3) ITEM(depth_line_1) ITEM(depth_line_2) ITEM(depth_line_3) ITEM(powerline) ITEM(pipeline) ITEM(time_zone) ITEM(marine_boundary) ITEM(marine_hazard) ITEM(rg_segment) ITEM(aeroway_runway) ITEM(aeroway_taxiway) ITEM(street_service) ITEM(coverage) ITEM(street_pedestrian) ITEM(bridge) ITEM(tunnel) ITEM(bridleway) ITEM(cycleway) ITEM(footway) ITEM(steps) ITEM(track_paved) ITEM(track_gravelled) ITEM(track_unpaved) ITEM(track_ground) ITEM(track_grass) ITEM(rail_narrow_gauge) ITEM(rail_light) ITEM(rail_subway) ITEM(rail_mono) ITEM(rail_tram) ITEM(rail_preserved) ITEM(rail_disused) ITEM(rail_abandoned) ITEM(lift_cable_car) ITEM(lift_chair) ITEM(lift_drag) ITEM(living_street) ITEM(bus_guideway) ITEM(street_construction) ITEM(border_civil) ITEM(border_political) ITEM(border_national_park) ITEM(water_river) ITEM(water_canal) ITEM(water_stream) ITEM(water_drain) ITEM(path) ITEM(hiking) ITEM(hiking_mountain) ITEM(hiking_mountain_demanding) ITEM(hiking_alpine) ITEM(hiking_alpine_demanding) ITEM(hiking_alpine_difficult) ITEM(street_parking_lane) ITEM(piste_nordic) ITEM(piste_downhill_novice) ITEM(piste_downhill_easy) ITEM(piste_downhill_intermediate) ITEM(piste_downhill_advanced) ITEM(piste_downhill_expert) ITEM(piste_downhill_freeride) ITEM(footway_and_piste_nordic) ITEM(tracking_0) ITEM(tracking_10) ITEM(tracking_20) ITEM(tracking_30) ITEM(tracking_40) ITEM(tracking_50) ITEM(tracking_60) ITEM(tracking_70) ITEM(tracking_80) ITEM(tracking_90) ITEM(tracking_100) ITEM(track_tracked) ITEM(house_number_interpolation_even) ITEM(house_number_interpolation_odd) ITEM(house_number_interpolation_all) ITEM(house_number_interpolation_alphabetic) ITEM(ditch) ITEM(hedge) ITEM(fence) ITEM(wall) ITEM(retaining_wall) ITEM(city_wall) ITEM(street_turn_restriction_no) ITEM(street_turn_restriction_only) ITEM(border_city) ITEM(border_county) ITEM(selected_line) ITEM(traffic_distortion) ITEM(street_route_occluded) ITEM(forest_way_1) ITEM(forest_way_2) ITEM(forest_way_3) ITEM(forest_way_4) ITEM(former_itinerary) ITEM(former_itinerary_part) /* Area */ ITEM2(0xc0000000,area) ITEM2(0xc0000001,area_unspecified) ITEM(poly_wood) ITEM(poly_water) ITEM(poly_town) ITEM(poly_cemetery) ITEM(poly_car_parking) ITEM(poly_industry) ITEM(poly_airport) ITEM(poly_hospital) ITEM(poly_park) ITEM(poly_sport) ITEM(poly_museum) ITEM(image) ITEM(image_path) ITEM(poly_commercial_center) ITEM(poly_golf_course) ITEM(poly_university) ITEM(poly_national_park) ITEM(poly_nature_park) ITEM(poly_flats) ITEM(poly_scrub) ITEM(poly_military_zone) ITEM(poly_marine) ITEM(plantation) ITEM(tundra) ITEM(tile) ITEM(submap) ITEM(poly_building) ITEM(poly_place) ITEM(poly_station) ITEM(poly_farm) ITEM(poly_sport_tennis) ITEM(poly_apron) ITEM(poly_terminal) ITEM(countryindex) ITEM(poly_sports_centre) ITEM(poly_sports_stadium) ITEM(poly_sports_track) ITEM(poly_sports_pitch) ITEM(poly_water_park) ITEM(poly_marina) ITEM(poly_fishing) ITEM(poly_theme_park) ITEM(poly_attraction) ITEM(poly_ruins) ITEM(poly_archaeological_site) ITEM(poly_artwork) ITEM(poly_zoo) ITEM(poly_camp_site) ITEM(poly_caravan_site) ITEM(poly_picnic_site) ITEM(poly_playground) ITEM(poly_allotments) ITEM(poly_village_green) ITEM(poly_recreation_ground) ITEM(poly_common) ITEM(poly_garden) ITEM(poly_nature_reserve) ITEM(poly_glacier) ITEM(poly_scree) ITEM(poly_fell) ITEM(poly_heath) ITEM(poly_marsh) ITEM(poly_mud) ITEM(poly_land) ITEM(poly_beach) ITEM(poly_quarry) ITEM(poly_landfill) ITEM(poly_retail) ITEM(poly_commercial) ITEM(poly_brownfield) ITEM(poly_greenfield) ITEM(poly_construction) ITEM(poly_railway) ITEM(poly_military) ITEM(poly_airfield) ITEM(poly_barracks) ITEM(poly_danger_area) ITEM(poly_range) ITEM(poly_naval_base) ITEM(poly_basin) ITEM(poly_reservoir) ITEM(poly_college) ITEM(poly_battlefield) ITEM(poly_pedestrian) ITEM(poly_plaza) ITEM(poly_service) ITEM(poly_street_1) ITEM(poly_street_2) ITEM(poly_street_3) ITEM(poly_wetland) ITEM(poly_aeroway_runway) ITEM(map_information) ITEM(selected_area) ITEM(poly_place1) ITEM(poly_place2) ITEM(poly_place3) ITEM(poly_place4) ITEM(poly_place5) ITEM(poly_place6) ITEM(poly_water_tiled) ITEM(poly_meadow) ITEM2(0xffffffff,last) navit-0.5.0+dfsg.1/navit/keys.h000066400000000000000000000010131264204753600161640ustar00rootroot00000000000000#define NAVIT_KEY_MENU 1 /* ^A */ #define NAVIT_KEY_LEFT 2 /* ^B */ #define NAVIT_KEY_RIGHT 6 /* ^R */ #define NAVIT_KEY_BACKSPACE 8 /* ^H */ #define NAVIT_KEY_RETURN 13 /* ^M */ #define NAVIT_KEY_DOWN 14 /* ^N */ #define NAVIT_KEY_ZOOM_OUT 15 /* ^O */ #define NAVIT_KEY_UP 16 /* ^P */ #define NAVIT_KEY_ZOOM_IN 17 /* ^Q */ #define NAVIT_KEY_SEARCH 19 /* ^S */ #define NAVIT_KEY_BACK 27 /* Esc */ #define NAVIT_KEY_DELETE 127 #define NAVIT_KEY_TAB 9 /* TAB */ #define NAVIT_KEY_PAGE_UP 33 #define NAVIT_KEY_PAGE_DOWN 34 navit-0.5.0+dfsg.1/navit/layer.h000066400000000000000000000016041264204753600163330ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_LAYER_H #define NAVIT_LAYER_H enum layer_type { layer_town=0, layer_street, layer_poly, layer_end, }; #endif navit-0.5.0+dfsg.1/navit/layout.c000066400000000000000000000355531264204753600165410ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "item.h" #include "attr.h" #include "xmlconfig.h" #include "layout.h" #include "coord.h" #include "debug.h" struct layout * layout_new(struct attr *parent, struct attr **attrs) { struct layout *l; struct color def_color = {COLOR_BACKGROUND_}; struct attr *name_attr,*color_attr,*order_delta_attr,*font_attr,*day_attr,*night_attr,*active_attr; if (! (name_attr=attr_search(attrs, NULL, attr_name))) return NULL; l = g_new0(struct layout, 1); l->func=&layout_func; navit_object_ref((struct navit_object *)l); l->name = g_strdup(name_attr->u.str); if ((font_attr=attr_search(attrs, NULL, attr_font))) { l->font = g_strdup(font_attr->u.str); } if ((day_attr=attr_search(attrs, NULL, attr_daylayout))) { l->dayname = g_strdup(day_attr->u.str); } if ((night_attr=attr_search(attrs, NULL, attr_nightlayout))) { l->nightname = g_strdup(night_attr->u.str); } if ((color_attr=attr_search(attrs, NULL, attr_color))) l->color = *color_attr->u.color; else l->color = def_color; if ((order_delta_attr=attr_search(attrs, NULL, attr_order_delta))) l->order_delta=order_delta_attr->u.num; if ((active_attr=attr_search(attrs, NULL, attr_active))) l->active = active_attr->u.num; l->navit=parent->u.navit; return l; } struct attr_iter { GList *last; }; struct attr_iter * layout_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void layout_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } int layout_get_attr(struct layout *layout, enum attr_type type, struct attr *attr, struct attr_iter *iter) { GList *cursor,*layer; attr->type=type; switch (type) { case attr_name: attr->u.str=layout->name; return 1; case attr_cursor: cursor=layout->cursors; while (cursor) { if (!iter || iter->last == g_list_previous(cursor)) { attr->u.cursor=cursor->data; if (iter) iter->last=cursor; return 1; } cursor=g_list_next(cursor); } break; case attr_layer: layer=layout->layers; while (layer) { if (!iter || iter->last == g_list_previous(layer)) { attr->u.layer=layer->data; if (iter) iter->last=layer; return 1; } layer=g_list_next(layer); } break; case attr_active: attr->u.num=layout->active; return 1; case attr_nightlayout: attr->u.str=layout->nightname; return 1; case attr_daylayout: attr->u.str=layout->dayname; return 1; default: break; } return 0; } int layout_add_attr(struct layout *layout, struct attr *attr) { switch (attr->type) { case attr_cursor: layout->cursors = g_list_append(layout->cursors, attr->u.cursor); break; case attr_layer: layout->layers = g_list_append(layout->layers, attr->u.layer); break; default: return 0; } layout->attrs=attr_generic_add_attr(layout->attrs, attr); return 1; } /** * Searchs the layout for a cursor with the given name. * * @param layout The layout * @param name The name * @returns A pointer to cursor with the given name or the name default or NULL. * @author Ralph Sennhauser (10/2009) */ struct cursor * layout_get_cursor(struct layout *this_, char *name) { GList *c; struct cursor *d=NULL; c=g_list_first(this_->cursors); while (c) { if (! strcmp(((struct cursor *)c->data)->name, name)) return c->data; if (! strcmp(((struct cursor *)c->data)->name, "default")) d=c->data; c=g_list_next(c); } return d; } struct cursor * cursor_new(struct attr *parent, struct attr **attrs) { struct attr *w, *h, *name, *interval, *sequence_range; struct cursor *this; w=attr_search(attrs, NULL, attr_w); h=attr_search(attrs, NULL, attr_h); if (! w || ! h) return NULL; this=g_new0(struct cursor,1); this->w=w->u.num; this->h=h->u.num; name=attr_search(attrs, NULL, attr_name); if (name) this->name=g_strdup(name->u.str); else this->name=g_strdup("default"); interval=attr_search(attrs, NULL, attr_interval); if (interval) this->interval=interval->u.num; sequence_range=attr_search(attrs, NULL, attr_sequence_range); if (sequence_range) { struct range *r=g_new0(struct range,1); r->min=sequence_range->u.range.min; r->max=sequence_range->u.range.max; this->sequence_range=r; } else { this->sequence_range=NULL; } dbg(lvl_info,"ret=%p\n", this); return this; } void cursor_destroy(struct cursor *this_) { if (this_->sequence_range) g_free(this_->sequence_range); if (this_->name) { g_free(this_->name); } g_free(this_); } int cursor_add_attr(struct cursor *this_, struct attr *attr) { switch (attr->type) { case attr_itemgra: this_->attrs=attr_generic_add_attr(this_->attrs, attr); return 1; default: break; } return 0; } static int layer_set_attr_do(struct layer *l, struct attr *attr, int init) { struct attr_iter *iter; struct navit_object *obj; struct attr layer; switch (attr->type) { case attr_active: l->active = attr->u.num; return 1; case attr_details: l->details = attr->u.num; return 1; case attr_name: g_free(l->name); l->name = g_strdup(attr->u.str); return 1; case attr_ref: navit_object_unref((struct navit_object *)l->ref); l->ref=NULL; obj=(struct navit_object *)l->navit; if (obj==NULL){ dbg(lvl_error, "Invalid layer reference '%s': Only layers inside a layout can use references.\n", attr->u.str); return 0; } iter=obj->func->iter_new(obj); while (obj->func->get_attr(obj, attr_layer, &layer, iter)) { if (!strcmp(layer.u.layer->name, attr->u.str)) { l->ref=(struct layer*)navit_object_ref(layer.u.navit_object); break; } } if (l->ref==NULL){ dbg(lvl_error, "Ignoring reference to unknown layer '%s' in layer '%s'.\n", attr->u.str, l->name); } obj->func->iter_destroy(iter); default: return 0; } } struct layer * layer_new(struct attr *parent, struct attr **attrs) { struct layer *l; l = g_new0(struct layer, 1); if (parent->type == attr_layout) l->navit=parent->u.layout->navit; l->func=&layer_func; navit_object_ref((struct navit_object *)l); l->active=1; for (;*attrs; attrs++) { layer_set_attr_do(l, *attrs, 1); } if (l->name==NULL){ dbg(lvl_error, "Ignoring layer without name.\n"); g_free(l); return NULL; } return l; } int layer_get_attr(struct layer *layer, enum attr_type type, struct attr *attr, struct attr_iter *iter) { attr->type=type; switch(type) { case attr_active: attr->u.num=layer->active; return 1; case attr_details: attr->u.num=layer->details; return 1; case attr_name: if (layer->name) { attr->u.str=layer->name; return 1; } break; default: return 0; } return 0; } int layer_add_attr(struct layer *layer, struct attr *attr) { switch (attr->type) { case attr_itemgra: layer->itemgras = g_list_append(layer->itemgras, attr->u.itemgra); return 1; default: return 0; } } int layer_set_attr(struct layer *layer, struct attr *attr) { return layer_set_attr_do(layer, attr, 0); } static void layer_destroy(struct layer *layer) { attr_list_free(layer->attrs); g_free(layer->name); g_free(layer); } struct itemgra * itemgra_new(struct attr *parent, struct attr **attrs) { struct itemgra *itm; struct attr *order, *item_types, *speed_range, *angle_range, *sequence_range; enum item_type *type; struct range defrange; itm = g_new0(struct itemgra, 1); order=attr_search(attrs, NULL, attr_order); item_types=attr_search(attrs, NULL, attr_item_types); speed_range=attr_search(attrs, NULL, attr_speed_range); angle_range=attr_search(attrs, NULL, attr_angle_range); sequence_range=attr_search(attrs, NULL, attr_sequence_range); defrange.min=0; defrange.max=32767; if (order) itm->order=order->u.range; else itm->order=defrange; if (speed_range) itm->speed_range=speed_range->u.range; else itm->speed_range=defrange; if (angle_range) itm->angle_range=angle_range->u.range; else itm->angle_range=defrange; if (sequence_range) itm->sequence_range=sequence_range->u.range; else itm->sequence_range=defrange; if (item_types) { type=item_types->u.item_types; while (type && *type != type_none) { itm->type=g_list_append(itm->type, GINT_TO_POINTER(*type)); type++; } } return itm; } int itemgra_add_attr(struct itemgra *itemgra, struct attr *attr) { switch (attr->type) { case attr_polygon: case attr_polyline: case attr_circle: case attr_text: case attr_icon: case attr_image: case attr_arrows: itemgra->elements = g_list_append(itemgra->elements, attr->u.element); return 1; default: dbg(lvl_error,"unknown: %s\n", attr_to_name(attr->type)); return 0; } } static void element_set_color(struct element *e, struct attr **attrs) { struct attr *color; color=attr_search(attrs, NULL, attr_color); if (color) e->color=*color->u.color; } static void element_set_background_color(struct color *c, struct attr **attrs) { struct attr *color; color=attr_search(attrs, NULL, attr_background_color); if (color) *c=*color->u.color; } static void element_set_text_size(struct element *e, struct attr **attrs) { struct attr *text_size; text_size=attr_search(attrs, NULL, attr_text_size); if (text_size) e->text_size=text_size->u.num; } static void element_set_polyline_width(struct element *e, struct attr **attrs) { struct attr *width; width=attr_search(attrs, NULL, attr_width); if (width) e->u.polyline.width=width->u.num; } static void element_set_polyline_directed(struct element *e, struct attr **attrs) { struct attr *directed; directed=attr_search(attrs, NULL, attr_directed); if (directed) e->u.polyline.directed=directed->u.num; } static void element_set_polyline_dash(struct element *e, struct attr **attrs) { struct attr *dash; int i; dash=attr_search(attrs, NULL, attr_dash); if (dash) { for (i=0; i<4; i++) { if (!dash->u.dash[i]) break; e->u.polyline.dash_table[i] = dash->u.dash[i]; } e->u.polyline.dash_num=i; } } static void element_set_polyline_offset(struct element *e, struct attr **attrs) { struct attr *offset; offset=attr_search(attrs, NULL, attr_offset); if (offset) e->u.polyline.offset=offset->u.num; } static void element_set_circle_width(struct element *e, struct attr **attrs) { struct attr *width; width=attr_search(attrs, NULL, attr_width); if (width) e->u.circle.width=width->u.num; } static void element_set_circle_radius(struct element *e, struct attr **attrs) { struct attr *radius; radius=attr_search(attrs, NULL, attr_radius); if (radius) e->u.circle.radius=radius->u.num; } struct polygon * polygon_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_new0(struct element, 1); e->type=element_polygon; element_set_color(e, attrs); return (struct polygon *)e; } struct polyline * polyline_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_new0(struct element, 1); e->type=element_polyline; element_set_color(e, attrs); element_set_polyline_width(e, attrs); element_set_polyline_directed(e, attrs); element_set_polyline_dash(e, attrs); element_set_polyline_offset(e, attrs); return (struct polyline *)e; } struct circle * circle_new(struct attr *parent, struct attr **attrs) { struct element *e; struct color color_black = {COLOR_BLACK_}; struct color color_white = {COLOR_WHITE_}; e = g_new0(struct element, 1); e->type=element_circle; e->color = color_black; e->u.circle.background_color = color_white; element_set_color(e, attrs); element_set_background_color(&e->u.circle.background_color, attrs); element_set_text_size(e, attrs); element_set_circle_width(e, attrs); element_set_circle_radius(e, attrs); return (struct circle *)e; } struct text * text_new(struct attr *parent, struct attr **attrs) { struct element *e; struct color color_black = {COLOR_BLACK_}; struct color color_white = {COLOR_WHITE_}; e = g_new0(struct element, 1); e->type=element_text; element_set_text_size(e, attrs); e->color = color_black; e->u.text.background_color = color_white; element_set_color(e, attrs); element_set_background_color(&e->u.text.background_color, attrs); return (struct text *)e; } struct icon * icon_new(struct attr *parent, struct attr **attrs) { struct element *e; struct attr *src,*w,*h,*rotation,*x,*y; src=attr_search(attrs, NULL, attr_src); if (! src) return NULL; e = g_malloc0(sizeof(*e)+strlen(src->u.str)+1); e->type=element_icon; e->u.icon.src=(char *)(e+1); if ((w=attr_search(attrs, NULL, attr_w))) e->u.icon.width=w->u.num; else e->u.icon.width=-1; if ((h=attr_search(attrs, NULL, attr_h))) e->u.icon.height=h->u.num; else e->u.icon.height=-1; if ((x=attr_search(attrs, NULL, attr_x))) e->u.icon.x=x->u.num; else e->u.icon.x=-1; if ((y=attr_search(attrs, NULL, attr_y))) e->u.icon.y=y->u.num; else e->u.icon.y=-1; if ((rotation=attr_search(attrs, NULL, attr_rotation))) e->u.icon.rotation=rotation->u.num; strcpy(e->u.icon.src,src->u.str); return (struct icon *)e; } struct image * image_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_malloc0(sizeof(*e)); e->type=element_image; return (struct image *)e; } struct arrows * arrows_new(struct attr *parent, struct attr **attrs) { struct element *e; e = g_malloc0(sizeof(*e)); e->type=element_arrows; element_set_color(e, attrs); return (struct arrows *)e; } int element_add_attr(struct element *e, struct attr *attr) { switch (attr->type) { case attr_coord: e->coord=g_realloc(e->coord,(e->coord_count+1)*sizeof(struct coord)); e->coord[e->coord_count++]=*attr->u.coord; return 1; default: return 0; } } struct object_func layout_func = { attr_layout, (object_func_new)layout_new, (object_func_get_attr)layout_get_attr, (object_func_iter_new)layout_attr_iter_new, (object_func_iter_destroy)layout_attr_iter_destroy, (object_func_set_attr)NULL, (object_func_add_attr)layout_add_attr, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; struct object_func layer_func = { attr_layer, (object_func_new)layer_new, (object_func_get_attr)layer_get_attr, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)layer_set_attr, (object_func_add_attr)layer_add_attr, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)layer_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/layout.h000066400000000000000000000077711264204753600165470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_LAYOUT_H #define NAVIT_LAYOUT_H #include "item.h" #include "color.h" #ifdef __cplusplus extern "C" { #endif struct element { enum { element_point, element_polyline, element_polygon, element_circle, element_text, element_icon, element_image, element_arrows } type; struct color color; int text_size; union { struct element_point { char stub; } point; struct element_polyline { int width; int directed; int dash_num; int offset; unsigned char dash_table[4]; } polyline; struct element_polygon { char stub; } polygon; struct element_circle { int width; int radius; struct color background_color; } circle; struct element_icon { char *src; int width; int height; int rotation; int x; int y; } icon; struct element_text { struct color background_color; } text; } u; int coord_count; struct coord *coord; }; struct itemgra { struct range order,sequence_range,speed_range,angle_range; GList *type; GList *elements; }; struct layer { NAVIT_OBJECT struct navit *navit; char *name; int details; GList *itemgras; int active; struct layer *ref; }; struct cursor { struct attr **attrs; struct range *sequence_range; char *name; int w,h; int interval; }; struct layout { NAVIT_OBJECT struct navit *navit; char *name; char* dayname; char* nightname; char *font; struct color color; GList *layers; GList *cursors; int order_delta; int active; }; /* prototypes */ enum attr_type; struct arrows; struct attr; struct attr_iter; struct circle; struct cursor; struct element; struct icon; struct image; struct itemgra; struct layer; struct layout; struct polygon; struct polyline; struct text; struct layout *layout_new(struct attr *parent, struct attr **attrs); struct attr_iter *layout_attr_iter_new(void); void layout_attr_iter_destroy(struct attr_iter *iter); int layout_get_attr(struct layout *layout, enum attr_type type, struct attr *attr, struct attr_iter *iter); int layout_add_attr(struct layout *layout, struct attr *attr); struct cursor *layout_get_cursor(struct layout *this_, char *name); struct cursor *cursor_new(struct attr *parent, struct attr **attrs); void cursor_destroy(struct cursor *this_); int cursor_add_attr(struct cursor *this_, struct attr *attr); struct layer *layer_new(struct attr *parent, struct attr **attrs); int layer_get_attr(struct layer *layer, enum attr_type type, struct attr *attr, struct attr_iter *iter); int layer_add_attr(struct layer *layer, struct attr *attr); int layer_set_attr(struct layer *layer, struct attr *attr); struct itemgra *itemgra_new(struct attr *parent, struct attr **attrs); int itemgra_add_attr(struct itemgra *itemgra, struct attr *attr); struct polygon *polygon_new(struct attr *parent, struct attr **attrs); struct polyline *polyline_new(struct attr *parent, struct attr **attrs); struct circle *circle_new(struct attr *parent, struct attr **attrs); struct text *text_new(struct attr *parent, struct attr **attrs); struct icon *icon_new(struct attr *parent, struct attr **attrs); struct image *image_new(struct attr *parent, struct attr **attrs); struct arrows *arrows_new(struct attr *parent, struct attr **attrs); int element_add_attr(struct element *e, struct attr *attr); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/linguistics.c000066400000000000000000000252441264204753600175550ustar00rootroot00000000000000#include #include #include #include "debug.h" #include "linguistics.h" /* To have linguistics_casefold(linguistics_expand_special(s,i)) equal to linguistics_expand_special(linguistics_casefold(s),i), * please always specify here lower case expansions for special letters not having case variants (like german ß).*/ static const char *special[][3]={ /* Capital Diacritics */ /* ¨ Diaresis */ {"Ä","A","AE"}, {"Ë","E"}, {"Ï","I"}, {"Ö","O","OE"}, {"Ü","U","UE"}, {"Ÿ","Y"}, /* ˝ Double Acute Accent */ {"Ő","O","Ö"}, {"Ű","U","Ü"}, /* ´ Acute Accent */ {"Á","A"}, {"Ć","C"}, {"É","E"}, {"Í","I"}, {"Ĺ","L"}, {"Ń","N"}, {"Ó","O"}, {"Ŕ","R"}, {"Ś","S"}, {"Ú","U"}, {"Ý","Y"}, {"Ź","Z"}, /* ˛ Ogonek (nosinė) */ {"Ą","A"}, {"Ę","E"}, {"Į","I"}, {"Ų","U"}, /* ˙ Dot */ {"Ċ","C"}, {"Ė","E"}, {"Ġ","G"}, {"İ","I"}, {"Ŀ","L"}, {"Ż","Z"}, /* – Stroke */ {"Đ","D","DJ"}, /* Croatian Dj, not to be confused with the similar-looking Icelandic Eth */ {"Ħ","H"}, {"Ł","L"}, {"Ŧ","T"}, /* ˚ Ring */ {"Å","A","AA"}, {"Ů","U"}, /* ˇ Caron (haček, paukščiukas) */ {"Č","C"}, {"Ď","D"}, {"Ě","E"}, {"Ľ","L"}, {"Ň","N"}, {"Ř","R"}, {"Š","S"}, {"Ť","T"}, {"Ž","Z"}, /* / Slash */ {"Ø","O","OE"}, /* ¯ Macron */ {"Ā","A","AA"}, {"Ē","E","EE"}, {"Ī","I","II"}, {"Ō","O","OO"}, {"Ū","U","UU"}, /* ˘ Brevis */ {"Ă","A"}, {"Ĕ","E"}, {"Ğ","G"}, {"Ĭ","I"}, {"Ŏ","O"}, {"Ŭ","U"}, /* ^ Circumflex */ {"Â","A"}, {"Ĉ","C"}, {"Ê","E"}, {"Ĝ","G"}, {"Ĥ","H"}, {"Î","I"}, {"Ĵ","J"}, {"Ô","O"}, {"Ŝ","S"}, {"Û","U"}, {"Ŵ","W"}, {"Ŷ","Y"}, /* ¸ Cedilla */ {"Ç","C"}, {"Ģ","G","GJ"}, {"Ķ","K","KJ"}, {"Ļ","L","LJ"}, {"Ņ","N","NJ"}, {"Ŗ","R"}, {"Ş","S"}, {"Ţ","T"}, /* ~ Tilde */ {"Ã","A"}, {"Ĩ","I"}, {"Ñ","N"}, {"Õ","O"}, {"Ũ","U"}, /* ` Grave */ {"À","A"}, {"È","E"}, {"Ì","I"}, {"Ò","O"}, {"Ù","U"}, /* ligatures */ {"Æ","A","AE"}, {"IJ","IJ"}, {"Œ","O","OE"}, /* special letters */ {"Ð","D","DH"}, /* Icelandic Eth, not to be confused with the similar-looking Croatian Dj */ {"Ŋ","N","NG"}, {"Þ","T","TH"}, /* Small Diacritics */ /* ¨ Diaresis */ {"ä","a","ae"}, {"ë","e"}, {"ï","i"}, {"ö","o","oe"}, {"ü","u","ue"}, {"ÿ","y"}, /* ˝ Double Acute Accent */ {"ő","o","ö"}, {"ű","u","ü"}, /* ´ Acute Accent */ {"á","a"}, {"ć","c"}, {"é","e"}, {"í","i"}, {"ĺ","l"}, {"ń","n"}, {"ó","o"}, {"ŕ","r"}, {"ś","s"}, {"ú","u"}, {"ý","y"}, {"ź","z"}, /* ˛ Ogonek (nosinė) */ {"ą","a"}, {"ę","e"}, {"į","i"}, {"ų","u"}, /* ˙ Dot (and dotless i) */ {"ċ","c"}, {"ė","e"}, {"ġ","g"}, {"ı","i"}, {"ŀ","l"}, {"ż","z"}, /* – Stroke */ {"đ","d","dj"}, {"ħ","h"}, {"ł","l"}, {"ŧ","t"}, /* ˚ Ring */ {"å","a", "aa"}, {"ů","u"}, /* ˇ Caron (haček, paukščiukas) */ {"č","c"}, {"ď","d"}, {"ě","e"}, {"ľ","l"}, {"ň","n"}, {"ř","r"}, {"š","s"}, {"ť","t"}, {"ž","z"}, /* / Slash */ {"ø","o", "oe"}, /* Macron */ {"ā","a","aa"}, {"ē","e","ee"}, {"ī","i","ii"}, {"ō","o","oo"}, {"ū","u","uu"}, /* ˘ Brevis */ {"ă","a"}, {"ĕ","e"}, {"ğ","g"}, {"ĭ","i"}, {"ŏ","o"}, {"ŭ","u"}, /* ^ Circumflex */ {"â","a"}, {"ĉ","c"}, {"ê","e"}, {"ĝ","g"}, {"ĥ","h"}, {"î","i"}, {"ĵ","j"}, {"ô","o"}, {"ŝ","s"}, {"û","u"}, {"ŵ","w"}, {"ŷ","y"}, /* ¸ Cedilla */ {"ç","c"}, {"ģ","g","gj"}, {"ķ","k","kj"}, {"ļ","l","lj"}, {"ņ","n","nj"}, {"ŗ","r"}, {"ş","s"}, {"ţ","t"}, /* ~ Tilde */ {"ã","a"}, {"ĩ","i"}, {"õ","o"}, {"ñ","n"}, {"ũ","u"}, /* ` Grave */ {"à","a"}, {"è","e"}, {"ì","i"}, {"ò","o"}, {"ù","u"}, /* ligatures */ {"æ","a","ae"}, {"ij","ij"}, {"œ","o","oe"}, {"ß","s","ss"}, /* special letters */ {"ð","d","dh"}, {"ŋ","n","ng"}, {"þ","t","th"}, /* Cyrillic capital */ {"Ё","Е"}, {"І","I"}, {"Ї","I"}, {"Ў","У"}, {"Є","Е","Э"}, {"Ґ","Г"}, {"Ѓ","Г"}, {"Ђ","Д"}, {"Ќ","К"}, {"Љ","Л","ЛЬ"}, {"Њ","Н","НЬ"}, {"Џ","Ц"}, /* Cyrillic small */ {"ё","е"}, {"і","i"}, {"ї","i"}, {"ў","у"}, {"є","е","э"}, {"ґ","г"}, {"ѓ","г"}, {"ђ","д"}, {"ќ","к"}, {"љ","л","ль"}, {"њ","н","нь"}, {"џ","ц"}, }; /* Array of strings for case conversion * Even elements of array are strings of upper-case letters * Odd elements of array are strings of lower-case letters, in the order corresponding to directly preceeding even element. * Last element of array should be NULL. */ static const char *upperlower[]={ /*Latin diacritics*/ "ÄËÏÖÜŸŐŰÁĆÉÍĹŃÓŔŚÚÝŹĄĘĮŲĊĖĠİĿŻĐĦŁŦÅŮČĎĚĽŇŘŠŤŽØĀĒĪŌŪĂĔĞĬŎŬÂĈÊĜĤÎĴÔŜÛŴŶÇĢĶĻŅŖŞŢÃĨÑÕŨÀÈÌÒÙÆIJŒÐŊÞ", "äëïöüÿőűáćéíĺńóŕśúýźąęįųċėġıŀżđħłŧåůčďěľňřšťžøāēīōūăĕğĭŏŭâĉêĝĥîĵôŝûŵŷçģķļņŗşţãĩõñũàèìòùæijœðŋþ", /*Cyrillic*/ "АБВГҐЃДЂЕЄЁЖЗИЙКЌЛЉМНЊОПРСТУФХЦЏЧШЩЪЫЬЭЮЯІЇЎ", "абвгґѓдђеєёжзийкќлљмнњопрстуфхцџчшщъыьэюяіїў", NULL }; static GHashTable *casefold_hash, *special_hash; /* * @brief Prepare an utf-8 string for case insensitive comparison. * @param in String to prepeare. * @return String prepared for case insensitive search. Result shoud be g_free()d after use. */ char* linguistics_casefold(const char *in) { int len=strlen(in); const char *src=in; char *ret=g_new(char,len+1); char *dest=ret; char buf[10]; while(*src && dest-ret='A' && *src<='Z') { *dest++=*src++ - 'A' + 'a'; } else if (!(*src&128)) { *dest++=*src++; } else { int charlen; char *tmp, *folded; tmp=g_utf8_find_next_char(src,NULL); charlen=tmp-src+1; g_strlcpy(buf,src,charlen>10?10:charlen); folded=g_hash_table_lookup(casefold_hash,buf); if(folded) { while(*folded && dest-ret0) s=linguistics_expand_special(s1f,i); else s=s1f; word=s; while(word) { if(mode & linguistics_cmp_partial) ret=strncmp(word,s2,s2len); else ret=strcmp(word,s2); if(!ret || !(mode & linguistics_cmp_words)) break; word=linguistics_next_word(word); } if(i>0) g_free(s); if(!ret || !(mode & linguistics_cmp_expand)) break; } g_free(s1f); return ret; } /** * @brief Replace special characters in string (e.g. umlauts) with plain letters. * This is useful e.g. to canonicalize a string for comparison. * * @param str string to process * @param mode Replacement mode. 0=do nothing, 1=replace with single * UTF character, 2=replace with multiple letters if the commonly used * replacement has multitple letter (e.g. a-umlaut -> ae) * @returns copy of string, with characters replaced */ char * linguistics_expand_special(const char *str, int mode) { const char *in=str; char *out,*ret; int found=0; int ret_len=strlen(str); int in_rest=ret_len; out=ret=g_strdup(str); if (!mode) return ret; while (*in) { char *next=g_utf8_find_next_char(in, NULL); int len; int match=0; if(next) len=next-in; else len=strlen(in); in_rest-=len; if (len > 1) { char **spc=linguistics_get_special(in, next); if (spc) { const char *replace=spc[mode]; if (replace) { int replace_len=strlen(replace); if(out-ret+replace_len+in_rest>ret_len) { char *new_ret; ret_len+=(replace_len-len)*10; new_ret=g_realloc(ret,ret_len+1); out=new_ret+(out-ret); ret=new_ret; } dbg(lvl_debug,"found %s %s %d %s %d\n",in,spc[0],len,replace,replace_len); strcpy(out, replace); out+=replace_len; match=1; } } } if (match) { found=1; in+=len; } else { while (len-- > 0) *out++=*in++; } } *out++='\0'; if (!found) { g_free(ret); ret=NULL; } return ret; } char * linguistics_next_word(char *str) { int len=strcspn(str, LINGUISTICS_WORD_SEPARATORS_ASCII); if (!str[len] || !str[len+1]) return NULL; return str+len+1; } int linguistics_search(const char *str) { if (!g_ascii_strcasecmp(str,"str")) return 0; if (!g_ascii_strcasecmp(str,"str.")) return 0; if (!g_ascii_strcasecmp(str,"strasse")) return 0; if (!g_ascii_strcasecmp(str,"weg")) return 0; return 1; } /** * @brief Copy one utf8 encoded char to newly allocated buffer. * * @param s pointer to the beginning of the char. * @return newly allocated nul-terminated string containing one utf8 encoded character. */ static char *linguistics_dup_utf8_char(const char *s) { char *ret, *next; next=g_utf8_find_next_char(s,NULL); ret=g_new(char, next-s+1); g_strlcpy(ret,s,next-s+1); return ret; } void linguistics_init(void) { int i; casefold_hash=g_hash_table_new_full(g_str_hash, g_str_equal,g_free,g_free); for (i = 0 ; upperlower[i]; i+=2) { int j,k; for(j=0,k=0;upperlower[i][j] && upperlower[i+1][k];) { char *s1=linguistics_dup_utf8_char(upperlower[i]+j); char *s2=linguistics_dup_utf8_char(upperlower[i+1]+k); g_hash_table_insert(casefold_hash,s1,s2); j+=strlen(s1); k+=strlen(s2); } } special_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i = 0 ; i < sizeof(special)/sizeof(special[0]); i++) g_hash_table_insert(special_hash,(gpointer)special[i][0],special[i]); } void linguistics_free(void) { g_hash_table_destroy(casefold_hash); g_hash_table_destroy(special_hash); casefold_hash=NULL; special_hash=NULL; } navit-0.5.0+dfsg.1/navit/linguistics.h000066400000000000000000000010651264204753600175550ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif #define LINGUISTICS_WORD_SEPARATORS_ASCII " -/()'`" char *linguistics_expand_special(const char *str, int mode); char *linguistics_next_word(char *str); void linguistics_init(void); void linguistics_free(void); char *linguistics_casefold(const char *in); int linguistics_search(const char *str); enum linguistics_cmp_mode { linguistics_cmp_expand=1, linguistics_cmp_partial=2, linguistics_cmp_words=4 }; int linguistics_compare(const char *s1, const char *s2, enum linguistics_cmp_mode mode); #ifdef __cplusplus } #endif navit-0.5.0+dfsg.1/navit/log.c000066400000000000000000000404521264204753600157770ustar00rootroot00000000000000/* * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file log.c * @brief The log object. * * This file implements everything needed for logging: the log object and its functions. * * @author Navit Team * @date 2005-2014 */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #include #include #include #include #include #include #include #include "file.h" #include "item.h" #include "event.h" #include "callback.h" #include "debug.h" #include "xmlconfig.h" #include "log.h" struct log_data { int len; int max_len; char *data; }; struct log { NAVIT_OBJECT FILE *f; int overwrite; int empty; int lazy; int mkdir; int flush_size; int flush_time; struct event_timeout *timer; struct callback *timer_callback; #ifdef HAVE_SYS_TIME_H struct timeval last_flush; #endif char *filename; char *filename_ex1; char *filename_ex2; struct log_data header; struct log_data data; struct log_data trailer; }; /** * @brief Stores formatted time to a string. * * This function obtains local system time, formats it as specified in {@code fmt} and stores it in buffer. * Format strings follow the same syntax as those for {@code strftime()}. * * @param buffer A preallocated buffer that will receive the formatted time * @param size Size of the buffer, in bytes * @param fmt The format string * @return Nothing */ static void strftime_localtime(char *buffer, int size, char *fmt) { time_t t; struct tm *tm; t=time(NULL); tm=localtime(&t); strftime(buffer, size - 1, fmt, tm); } /** * @brief Expands placeholders in a filename * * This function examines the {@code log->filename} and replaces any placeholders * found in it with date, time or an incremental number. If an incremental number is specified, the function * will ensure the filename is unique. The expanded filename will be stored {@code log->filename_ex2}. * The function uses {@code log->filename_ex1} to store the partly-expanded filename. * * @param this_ The log object. */ static void expand_filenames(struct log *this_) { char *pos,buffer[4096]; int i; strftime_localtime(buffer, 4096, this_->filename); this_->filename_ex1=g_strdup(buffer); if ((pos=strstr(this_->filename_ex1,"%i"))) { #ifdef HAVE_API_ANDROID pos[1]='d'; #endif i=0; do { g_free(this_->filename_ex2); this_->filename_ex2=g_strdup_printf(this_->filename_ex1,i++); } while (file_exists(this_->filename_ex2)); #ifdef HAVE_API_ANDROID pos[1]='i'; #endif } else this_->filename_ex2=g_strdup(this_->filename_ex1); } /** * @brief Sets the time at which the log buffer was last flushed. * * This function sets {@code log->last_flush} to current time. * * @param this_ The log object. */ static void log_set_last_flush(struct log *this_) { #ifdef HAVE_SYS_TIME_H gettimeofday(&this_->last_flush, NULL); #endif } /** * @brief Opens a log file. * * This function opens the log file for {@code log}. * The file name must be specified by {@code log->filename_ex2} before this function is called. *

* {@code log->overwrite} specifies the behavior if the file exists: if true, * an existing file will be overwritten, else it will be appended to. *

* If the directory specified in the filename does not exist and the {@code log->mkdir} * is true, it will be created. *

* After the function returns, {@code log->f} will contain the file handle (or NULL, if * the operation failed) and {@code log->empty} will indicate if the file is empty. * {@code log->last_flush} will be updated with the current time. * * @param this_ The log object. */ static void log_open(struct log *this_) { char *mode; if (this_->overwrite) mode="w"; else mode="r+"; if (this_->mkdir) file_mkdir(this_->filename_ex2, 2); this_->f=fopen(this_->filename_ex2, mode); if (! this_->f) this_->f=fopen(this_->filename_ex2, "w"); if (! this_->f) return; if (!this_->overwrite) fseek(this_->f, 0, SEEK_END); this_->empty = !ftell(this_->f); log_set_last_flush(this_); } /** * @brief Closes a log file. * * This function writes the trailer to a log file, flushes it and closes the log file for {@code log}. * * @param this_ The log object. */ static void log_close(struct log *this_) { if (! this_->f) return; if (this_->trailer.len) fwrite(this_->trailer.data, 1, this_->trailer.len, this_->f); fflush(this_->f); fclose(this_->f); this_->f=NULL; } /** * @brief Flushes the buffer of a log. * * This function writes buffered log data to the log file associated with {@code log} * and updates {@code log->last_flush} with the current time. *

* If {@code log->lazy} is true, this function will open the file if needed, else * the file must be opened with {@code log_open()} prior to calling this function. *

* If the file is empty, the header will be written first, followed by the buffer data. * {@code log->empty} will be set to zero if header or data are written to the file. * * @param this_ The log object. * @param flags Flags to control behavior of the function: *
* {@code log_flag_replace_buffer}: ignored *
* {@code log_flag_force_flush}: ignored *
* {@code log_flag_keep_pointer}: keeps the file pointer at the start position of the new data *
* {@code log_flag_keep_buffer}: prevents clearing of the buffer after a successful write (default is to clear the buffer). *
* {@code log_flag_truncate}: truncates the log file at the current position. On the Win32 Base API, this flag has no effect. */ static void log_flush(struct log *this_, enum log_flags flags) { long pos; if (this_->lazy && !this_->f) { if (!this_->data.len) return; log_open(this_); } if (! this_->f) return; if (this_->empty) { if (this_->header.len) fwrite(this_->header.data, 1, this_->header.len, this_->f); if (this_->header.len || this_->data.len) this_->empty=0; } fwrite(this_->data.data, 1, this_->data.len, this_->f); #ifndef HAVE_API_WIN32_BASE if (flags & log_flag_truncate) { pos=ftell(this_->f); ftruncate(fileno(this_->f), pos); } #endif if (this_->trailer.len) { pos=ftell(this_->f); if (pos > 0) { fwrite(this_->trailer.data, 1, this_->trailer.len, this_->f); fseek(this_->f, pos, SEEK_SET); } } if (flags & log_flag_keep_pointer) fseek(this_->f, -this_->data.len, SEEK_CUR); fflush(this_->f); if (!(flags & log_flag_keep_buffer)) { g_free(this_->data.data); this_->data.data=NULL; this_->data.max_len=this_->data.len=0; } log_set_last_flush(this_); } /** * @brief Determines if the maximum buffer size of a log has been exceeded. * * This function examines the size of the data buffer to determine if it exceeds * the maximum size specified in {@code log->flush_size} and thus needs to be flushed. * * @param this_ The log object. * @return True if the cache needs to be flushed, false otherwise. */ static int log_flush_required(struct log *this_) { return this_->data.len > this_->flush_size; } /** * @brief Rotates a log file. * * This function rotates a log by stopping and immediately restarting it. * Stopping flushes the buffer and closes the file; restarting determines the * new file name and opens the file as needed (depending on the lazy member). *

* Depending on the file name format and how the function was called, a new log * file will be created or the old log file will be reused (appended to or * overwritten, depending on {@code log->overwrite}): if the file name includes an * incremental number, the new file will always have a different name. If a * previous call to {@code log_change_required()} returned true, the new file * will also have a different name. In all other cases the new file will have * the same name as the old one, causing the old file to be overwritten or * appended to. * * @param this_ The log object. */ static void log_change(struct log *this_) { log_flush(this_,0); log_close(this_); expand_filenames(this_); if (! this_->lazy) log_open(this_); } /** * @brief Determines if the log must be rotated. * * This function expands the date and time placeholders in {@code log->filename} * to determine if the resulting part of the filename has changed. * * @param this_ The log object. * @return True if the date/time-dependent part of the filename has changed, false otherwise. */ static int log_change_required(struct log *this_) { char buffer[4096]; strftime_localtime(buffer, 4096, this_->filename); return (strcmp(this_->filename_ex1, buffer) != 0); } /** * @brief Determines if the flush interval of a log has elapsed and flushes the buffer if needed. * * This function calculates the difference between current time and {@code log->last_flush}. * If it is greater than or equal to {@code log->flush_time}, the buffer is flushed. * * @param this_ The log object. */ static void log_timer(struct log *this_) { #ifdef HAVE_SYS_TIME_H struct timeval tv; int delta; gettimeofday(&tv, NULL); delta=(tv.tv_sec-this_->last_flush.tv_sec)*1000+(tv.tv_usec-this_->last_flush.tv_usec)/1000; dbg(lvl_debug,"delta=%d flush_time=%d\n", delta, this_->flush_time); if (this_->flush_time && delta >= this_->flush_time*1000) log_flush(this_,0); #endif } /** * @brief Gets an attribute * * @param this_ The log object. * @param attr_type The attribute type to return * @param attr Points to a struct attr to store the attribute * @param iter An attribute iterator * @return True for success, false for failure */ int log_get_attr(struct log *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } /** * @brief Creates and initializes a new log object. * * @param parent The parent object. * @param attrs Points to an array of pointers to attributes for the new log object * @return The new log object, or NULL if creation fails. */ struct log * log_new(struct attr * parent,struct attr **attrs) { struct log *ret=g_new0(struct log, 1); struct attr *data,*overwrite,*lazy,*mkdir,*flush_size,*flush_time; struct file_wordexp *wexp; char *filename, **wexp_data; dbg(lvl_debug,"enter\n"); ret->func=&log_func; navit_object_ref((struct navit_object *)ret); data=attr_search(attrs, NULL, attr_data); if (! data) return NULL; filename=data->u.str; wexp=file_wordexp_new(filename); if (wexp && file_wordexp_get_count(wexp) > 0) { wexp_data=file_wordexp_get_array(wexp); filename=wexp_data[0]; } if (filename) ret->filename=g_strdup(filename); if (wexp) file_wordexp_destroy(wexp); overwrite=attr_search(attrs, NULL, attr_overwrite); if (overwrite) ret->overwrite=overwrite->u.num; lazy=attr_search(attrs, NULL, attr_lazy); if (lazy) ret->lazy=lazy->u.num; mkdir=attr_search(attrs, NULL, attr_mkdir); if (mkdir) ret->mkdir=mkdir->u.num; flush_size=attr_search(attrs, NULL, attr_flush_size); if (flush_size) ret->flush_size=flush_size->u.num; flush_time=attr_search(attrs, NULL, attr_flush_time); if (flush_time) ret->flush_time=flush_time->u.num; if (ret->flush_time) { dbg(lvl_debug,"interval %d\n", ret->flush_time*1000); ret->timer_callback=callback_new_1(callback_cast(log_timer), ret); ret->timer=event_add_timeout(ret->flush_time*1000, 1, ret->timer_callback); } expand_filenames(ret); if (ret->lazy) log_set_last_flush(ret); else log_open(ret); ret->attrs=attr_list_dup(attrs); return ret; } /** * @brief Sets the header for a log file. * * This function sets the header, which is to be inserted into any log file before * the actual log data. * * @param this_ The log object. * @param data The header data. * @param len Size of the header data to be copied, in bytes. */ void log_set_header(struct log *this_, char *data, int len) { this_->header.data=g_malloc(len); this_->header.max_len=this_->header.len=len; memcpy(this_->header.data, data, len); } /** * @brief Sets the trailer for a log file. * * This function sets the trailer, which is to be added to any log file after * the actual log data. * * @param this_ The log object. * @param data The trailer data. * @param len Size of the trailer data to be copied, in bytes. */ void log_set_trailer(struct log *this_, char *data, int len) { this_->trailer.data=g_malloc(len); this_->trailer.max_len=this_->trailer.len=len; memcpy(this_->trailer.data, data, len); } /** * @brief Writes to a log. * * This function appends data to a log. It rotates the log, if needed, before * adding the new data. After adding, the log is flushed if the buffer exceeds * its maximum size or if the {@code log_flag_force_flush} flag is set. * * @param this_ The log object. * @param data Points to a buffer containing the data to be appended. * @param len Length of the data to be appended, in bytes. * @param flags Flags to control behavior of the function: *
* {@code log_flag_replace_buffer}: discards any data in the buffer not yet written to the log file *
* {@code log_flag_force_flush}: forces a flush of the log after appending the data *
* {code log_flag_keep_pointer}: ignored *
* {@code log_flag_keep_buffer}: ignored *
* {@code log_flag_truncate}: ignored */ void log_write(struct log *this_, char *data, int len, enum log_flags flags) { dbg(lvl_debug,"enter\n"); if (log_change_required(this_)) { dbg(lvl_debug,"log_change"); log_change(this_); } if (flags & log_flag_replace_buffer) this_->data.len=0; if (this_->data.len + len > this_->data.max_len) { dbg(lvl_info,"overflow\n"); this_->data.max_len+=16384; // FIXME: what if len exceeds this->data.max_len by more than 16384 bytes? this_->data.data=g_realloc(this_->data.data,this_->data.max_len); } memcpy(this_->data.data+this_->data.len, data, len); this_->data.len+=len; if (log_flush_required(this_) || (flags & log_flag_force_flush)) log_flush(this_, flags); } /** * @brief Returns the data buffer of a log object and its length. * * @param this_ The log object. * @param len Points to an int which will receive the length of the buffer. * This can be NULL, in which case no information on buffer length will be stored. * @return Pointer to the data buffer. */ void * log_get_buffer(struct log *this_, int *len) { if (len) *len=this_->data.len; return this_->data.data; } /** * @brief Writes a formatted string to a log. * * This function formats a string in a fashion similar to {@code printf()} and related functions * and writes it to a log using {@code log_write()}. * * @param this_ The log object. * @param fmt The format string. * @param ... Additional arguments must be specified for each placeholder in the format string. */ void log_printf(struct log *this_, char *fmt, ...) { char buffer[LOG_BUFFER_SIZE]; int size; va_list ap; va_start(ap, fmt); // Format the string and write it to the log size = g_vsnprintf(buffer, LOG_BUFFER_SIZE, fmt, ap); log_write(this_, buffer, size, 0); va_end(ap); } /** * @brief Destroys a log object and frees up its memory. * * @param this_ The log object. */ void log_destroy(struct log *this_) { dbg(lvl_debug,"enter\n"); attr_list_free(this_->attrs); callback_destroy(this_->timer_callback); event_remove_timeout(this_->timer); log_flush(this_,0); log_close(this_); g_free(this_); } struct object_func log_func = { attr_log, (object_func_new)log_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navit_object_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)log_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/log.h000066400000000000000000000033731264204753600160050ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_LOG_H #define NAVIT_LOG_H #define LOG_BUFFER_SIZE 256 /** * printf-style writing to the log file. A buffer of LOG_BUFFER_SIZE * bytes is preallocated for the complete format message, longer * messages will be truncated. */ enum log_flags { log_flag_replace_buffer=1, log_flag_force_flush=2, log_flag_keep_pointer=4, log_flag_keep_buffer=8, log_flag_truncate=16, }; /* prototypes */ enum attr_type; enum log_flags; struct attr; struct attr_iter; struct log; int log_get_attr(struct log *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct log *log_new(struct attr *parent, struct attr **attrs); void log_set_header(struct log *this_, char *data, int len); void log_set_trailer(struct log *this_, char *data, int len); void log_write(struct log *this_, char *data, int len, enum log_flags flags); void *log_get_buffer(struct log *this_, int *len); void log_printf(struct log *this_, char *fmt, ...); void log_destroy(struct log *this_); /* end of prototypes */ #endif navit-0.5.0+dfsg.1/navit/main.c000066400000000000000000000344001264204753600161360ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #ifndef _WIN32 #include #include #endif #include "file.h" #include "debug.h" #include "main.h" #include "navit.h" #include "gui.h" #include "item.h" #include "xmlconfig.h" #include "coord.h" #include "route.h" #include "navigation.h" #include "event.h" #include "callback.h" #include "navit_nls.h" #include "util.h" #ifdef HAVE_API_WIN32_BASE #include #include #endif #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif struct map_data *map_data_default; struct callback_list *cbl; #ifdef HAVE_API_WIN32 void setenv(char *var, char *val, int overwrite) { char *str=g_strdup_printf("%s=%s",var,val); if (overwrite || !getenv(var)) putenv(str); g_free(str); } #endif /* * environment_vars[][0:name,1-3:mode] * ':' replaced with NAVIT_PREFIX * '::' replaced with NAVIT_PREFIX and LIBDIR * '~' replaced with HOME */ static char *environment_vars[][5]={ {"NAVIT_LIBDIR", ":", "::/navit", ":\\lib", ":/lib"}, {"NAVIT_SHAREDIR", ":", ":/share/navit", ":", ":/share"}, {"NAVIT_LOCALEDIR", ":/../locale",":/share/locale",":\\locale", ":/locale"}, {"NAVIT_USER_DATADIR",":", "~/.navit", ":\\data", ":/home"}, {"NAVIT_LOGFILE", NULL, NULL, ":\\navit.log",NULL}, {"NAVIT_LIBPREFIX", "*/.libs/", NULL, NULL, NULL}, {NULL, NULL, NULL, NULL, NULL}, }; static void main_setup_environment(int mode) { int i=0; char *var,*val,*homedir; while ((var=environment_vars[i][0])) { val=environment_vars[i][mode+1]; if (val) { switch (val[0]) { case ':': if (val[1] == ':') val=g_strdup_printf("%s/%s%s", getenv("NAVIT_PREFIX"), LIBDIR+sizeof(PREFIX), val+2); else val=g_strdup_printf("%s%s", getenv("NAVIT_PREFIX"), val+1); break; case '~': homedir=getenv("HOME"); if (!homedir) homedir="./"; val=g_strdup_printf("%s%s", homedir, val+1); break; default: val=g_strdup(val); break; } setenv(var, val, 0); g_free(val); } i++; } } #ifdef HAVE_API_WIN32_BASE char *nls_table[][3]={ // NLS Table compiled by Nick "Number6" Geoghegan // Not an exhaustive list, but supports 99% of all languages in Windows //{"LANGNAME", "CTRYNAME", "Language Code"}, {"AFK", "ZAF", "af_ZA"}, // Afrikaans (South Africa) {"SQI", "ALB", "sq_AL"}, // Albanian (Albania) {"AMH", "ETH", "am_ET"}, // Amharic (Ethiopia) {"ARG", "DZA", "ar_DZ"}, // Arabic (Algeria) {"ARH", "BHR", "ar_BH"}, // Arabic (Bahrain) {"ARE", "EGY", "ar_EG"}, // Arabic (Egypt) {"ARI", "IRQ", "ar_IQ"}, // Arabic (Iraq) {"ARJ", "JOR", "ar_JO"}, // Arabic (Jordan) {"ARK", "KWT", "ar_KW"}, // Arabic (Kuwait) {"ARB", "LBN", "ar_LB"}, // Arabic (Lebanon) {"ARL", "LBY", "ar_LY"}, // Arabic (Libya) {"ARM", "MAR", "ar_MA"}, // Arabic (Morocco) {"ARO", "OMN", "ar_OM"}, // Arabic (Oman) {"ARQ", "QAT", "ar_QA"}, // Arabic (Qatar) {"ARA", "SAU", "ar_SA"}, // Arabic (Saudi Arabia) {"ARS", "SYR", "ar_SY"}, // Arabic (Syria) {"ART", "TUN", "ar_TN"}, // Arabic (Tunisia) {"ARU", "ARE", "ar_AE"}, // Arabic (U.A.E.) {"ARY", "YEM", "ar_YE"}, // Arabic (Yemen) {"HYE", "ARM", "hy_AM"}, // Armenian (Armenia) {"ASM", "IND", "as_IN"}, // Assamese (India) {"BAS", "RUS", "ba_RU"}, // Bashkir (Russia) {"EUQ", "ESP", "eu_ES"}, // Basque (Basque) {"BEL", "BLR", "be_BY"}, // Belarusian (Belarus) {"BNG", "BDG", "bn_BD"}, // Bengali (Bangladesh) {"BNG", "IND", "bn_IN"}, // Bengali (India) {"BRE", "FRA", "br_FR"}, // Breton (France) {"BGR", "BGR", "bg_BG"}, // Bulgarian (Bulgaria) {"CAT", "ESP", "ca_ES"}, // Catalan (Catalan) {"ZHH", "HKG", "zh_HK"}, // Chinese (Hong Kong S.A.R.) {"ZHM", "MCO", "zh_MO"}, // Chinese (Macao S.A.R.) {"CHS", "CHN", "zh_CN"}, // Chinese (People's Republic of China) {"ZHI", "SGP", "zh_SG"}, // Chinese (Singapore) {"CHT", "TWN", "zh_TW"}, // Chinese (Taiwan) {"COS", "FRA", "co_FR"}, // Corsican (France) {"HRV", "HRV", "hr_HR"}, // Croatian (Croatia) {"HRB", "BIH", "hr_BA"}, // Croatian (Latin, Bosnia and Herzegovina) {"CSY", "CZE", "cs_CZ"}, // Czech (Czech Republic) {"DAN", "DNK", "da_DK"}, // Danish (Denmark) {"NLB", "BEL", "nl_BE"}, // Dutch (Belgium) {"NLD", "NLD", "nl_NL"}, // Dutch (Netherlands) {"ENA", "AUS", "en_AU"}, // English (Australia) {"ENL", "BLZ", "en_BZ"}, // English (Belize) {"ENC", "CAN", "en_CA"}, // English (Canada) {"ENB", "CAR", "en_CB"}, // English (Caribbean) {"ENN", "IND", "en_IN"}, // English (India) {"ENI", "IRL", "en_IE"}, // English (Ireland) {"ENJ", "JAM", "en_JM"}, // English (Jamaica) {"ENM", "MYS", "en_MY"}, // English (Malaysia) {"ENZ", "NZL", "en_NZ"}, // English (New Zealand) {"ENP", "PHL", "en_PH"}, // English (Republic of the Philippines) {"ENE", "SGP", "en_SG"}, // English (Singapore) {"ENS", "ZAF", "en_ZA"}, // English (South Africa) {"ENT", "TTO", "en_TT"}, // English (Trinidad and Tobago) {"ENG", "GBR", "en_GB"}, // English (United Kingdom) {"ENU", "USA", "en_US"}, // English (United States) {"ENW", "ZWE", "en_ZW"}, // English (Zimbabwe) {"ETI", "EST", "et_EE"}, // Estonian (Estonia) {"FOS", "FRO", "fo_FO"}, // Faroese (Faroe Islands) {"FIN", "FIN", "fi_FI"}, // Finnish (Finland) {"FRB", "BEL", "fr_BE"}, // French (Belgium) {"FRC", "CAN", "fr_CA"}, // French (Canada) {"FRA", "FRA", "fr_FR"}, // French (France) {"FRL", "LUX", "fr_LU"}, // French (Luxembourg) {"FRM", "MCO", "fr_MC"}, // French (Principality of Monaco) {"FRS", "CHE", "fr_CH"}, // French (Switzerland) {"FYN", "NLD", "fy_NL"}, // Frisian (Netherlands) {"GLC", "ESP", "gl_ES"}, // Galician (Galician) {"KAT", "GEO", "ka_GE"}, // Georgian (Georgia) {"DEA", "AUT", "de_AT"}, // German (Austria) {"DEU", "DEU", "de_DE"}, // German (Germany) {"DEC", "LIE", "de_LI"}, // German (Liechtenstein) {"DEL", "LUX", "de_LU"}, // German (Luxembourg) {"DES", "CHE", "de_CH"}, // German (Switzerland) {"ELL", "GRC", "el_GR"}, // Greek (Greece) {"KAL", "GRL", "kl_GL"}, // Greenlandic (Greenland) {"GUJ", "IND", "gu_IN"}, // Gujarati (India) {"HEB", "ISR", "he_IL"}, // Hebrew (Israel) {"HIN", "IND", "hi_IN"}, // Hindi (India) {"HUN", "HUN", "hu_HU"}, // Hungarian (Hungary) {"ISL", "ISL", "is_IS"}, // Icelandic (Iceland) {"IBO", "NGA", "ig_NG"}, // Igbo (Nigeria) {"IND", "IDN", "id_ID"}, // Indonesian (Indonesia) {"IRE", "IRL", "ga_IE"}, // Irish (Ireland) {"XHO", "ZAF", "xh_ZA"}, // isiXhosa (South Africa) {"ZUL", "ZAF", "zu_ZA"}, // isiZulu (South Africa) {"ITA", "ITA", "it_IT"}, // Italian (Italy) {"ITS", "CHE", "it_CH"}, // Italian (Switzerland) {"JPN", "JPN", "ja_JP"}, // Japanese (Japan) {"KDI", "IND", "kn_IN"}, // Kannada (India) {"KKZ", "KAZ", "kk_KZ"}, // Kazakh (Kazakhstan) {"KHM", "KHM", "km_KH"}, // Khmer (Cambodia) {"KIN", "RWA", "rw_RW"}, // Kinyarwanda (Rwanda) {"SWK", "KEN", "sw_KE"}, // Kiswahili (Kenya) {"KOR", "KOR", "ko_KR"}, // Korean (Korea) {"KYR", "KGZ", "ky_KG"}, // Kyrgyz (Kyrgyzstan) {"LAO", "LAO", "lo_LA"}, // Lao (Lao P.D.R.) {"LVI", "LVA", "lv_LV"}, // Latvian (Latvia) {"LTH", "LTU", "lt_LT"}, // Lithuanian (Lithuania) {"LBX", "LUX", "lb_LU"}, // Luxembourgish (Luxembourg) {"MKI", "MKD", "mk_MK"}, // Macedonian (Former Yugoslav Republic of Macedonia) {"MSB", "BRN", "ms_BN"}, // Malay (Brunei Darussalam) {"MSL", "MYS", "ms_MY"}, // Malay (Malaysia) {"MYM", "IND", "ml_IN"}, // Malayalam (India) {"MLT", "MLT", "mt_MT"}, // Maltese (Malta) {"MRI", "NZL", "mi_NZ"}, // Maori (New Zealand) {"MAR", "IND", "mr_IN"}, // Marathi (India) {"MON", "MNG", "mn_MN"}, // Mongolian (Cyrillic, Mongolia) {"NEP", "NEP", "ne_NP"}, // Nepali (Nepal) {"NOR", "NOR", "nb_NO"}, // Norwegian, Bokmå(Norway) {"NON", "NOR", "nn_NO"}, // Norwegian, Nynorsk (Norway) {"OCI", "FRA", "oc_FR"}, // Occitan (France) {"ORI", "IND", "or_IN"}, // Oriya (India) {"PAS", "AFG", "ps_AF"}, // Pashto (Afghanistan) {"FAR", "IRN", "fa_IR"}, // Persian {"PLK", "POL", "pl_PL"}, // Polish (Poland) {"PTB", "BRA", "pt_BR"}, // Portuguese (Brazil) {"PTG", "PRT", "pt_PT"}, // Portuguese (Portugal) {"PAN", "IND", "pa_IN"}, // Punjabi (India) {"ROM", "ROM", "ro_RO"}, // Romanian (Romania) {"RMC", "CHE", "rm_CH"}, // Romansh (Switzerland) {"RUS", "RUS", "ru_RU"}, // Russian (Russia) {"SMG", "FIN", "se_FI"}, // Sami, Northern (Finland) {"SME", "NOR", "se_NO"}, // Sami, Northern (Norway) {"SMF", "SWE", "se_SE"}, // Sami, Northern (Sweden) {"SAN", "IND", "sa_IN"}, // Sanskrit (India) {"TSN", "ZAF", "tn_ZA"}, // Setswana (South Africa) {"SIN", "LKA", "si_LK"}, // Sinhala (Sri Lanka) {"SKY", "SVK", "sk_SK"}, // Slovak (Slovakia) {"SLV", "SVN", "sl_SI"}, // Slovenian (Slovenia) {"ESS", "ARG", "es_AR"}, // Spanish (Argentina) {"ESB", "BOL", "es_BO"}, // Spanish (Bolivia) {"ESL", "CHL", "es_CL"}, // Spanish (Chile) {"ESO", "COL", "es_CO"}, // Spanish (Colombia) {"ESC", "CRI", "es_CR"}, // Spanish (Costa Rica) {"ESD", "DOM", "es_DO"}, // Spanish (Dominican Republic) {"ESF", "ECU", "es_EC"}, // Spanish (Ecuador) {"ESE", "SLV", "es_SV"}, // Spanish (El Salvador) {"ESG", "GTM", "es_GT"}, // Spanish (Guatemala) {"ESH", "HND", "es_HN"}, // Spanish (Honduras) {"ESM", "MEX", "es_MX"}, // Spanish (Mexico) {"ESI", "NIC", "es_NI"}, // Spanish (Nicaragua) {"ESA", "PAN", "es_PA"}, // Spanish (Panama) {"ESZ", "PRY", "es_PY"}, // Spanish (Paraguay) {"ESR", "PER", "es_PE"}, // Spanish (Peru) {"ESU", "PRI", "es_PR"}, // Spanish (Puerto Rico) {"ESN", "ESP", "es_ES"}, // Spanish (Spain) {"EST", "USA", "es_US"}, // Spanish (United States) {"ESY", "URY", "es_UY"}, // Spanish (Uruguay) {"ESV", "VEN", "es_VE"}, // Spanish (Venezuela) {"SVF", "FIN", "sv_FI"}, // Swedish (Finland) {"SVE", "SWE", "sv_SE"}, // Swedish (Sweden) {"TAM", "IND", "ta_IN"}, // Tamil (India) {"TTT", "RUS", "tt_RU"}, // Tatar (Russia) {"TEL", "IND", "te_IN"}, // Telugu (India) {"THA", "THA", "th_TH"}, // Thai (Thailand) {"BOB", "CHN", "bo_CN"}, // Tibetan (PRC) {"TRK", "TUR", "tr_TR"}, // Turkish (Turkey) {"TUK", "TKM", "tk_TM"}, // Turkmen (Turkmenistan) {"UIG", "CHN", "ug_CN"}, // Uighur (PRC) {"UKR", "UKR", "uk_UA"}, // Ukrainian (Ukraine) {"URD", "PAK", "ur_PK"}, // Urdu (Islamic Republic of Pakistan) {"VIT", "VNM", "vi_VN"}, // Vietnamese (Vietnam) {"CYM", "GBR", "cy_GB"}, // Welsh (United Kingdom) {"WOL", "SEN", "wo_SN"}, // Wolof (Senegal) {"III", "CHN", "ii_CN"}, // Yi (PRC) {"YOR", "NGA", "yo_NG"}, // Yoruba (Nigeria) {NULL,NULL,NULL}, // Default - Can't find the language / Language not listed above }; static void win_set_nls(void) { char country[32],lang[32]; int i=0; #ifdef HAVE_API_WIN32_CE wchar_t wcountry[32],wlang[32]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, wlang, sizeof(wlang)); WideCharToMultiByte(CP_ACP,0,wlang,-1,lang,sizeof(lang),NULL,NULL); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, wcountry, sizeof(wcountry)); WideCharToMultiByte(CP_ACP,0,wcountry,-1,country,sizeof(country),NULL,NULL); #else GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, lang, sizeof(lang)); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, country, sizeof(country)); #endif while (nls_table[i][0]) { if (!strcmp(nls_table[i][0], lang) && !(strcmp(nls_table[i][1], country))) { dbg(lvl_info,"Setting LANG=%s for Lang %s Country %s\n",nls_table[i][2], lang, country); setenv("LANG",nls_table[i][2],0); return; } i++; } dbg(lvl_error,"Lang %s Country %s not found\n",lang,country); } #endif void main_init(const char *program) { char *s; #ifdef _UNICODE /* currently for wince */ wchar_t wfilename[MAX_PATH + 1]; #endif spawn_process_init(); cbl=callback_list_new(); #ifdef HAVE_API_WIN32_BASE win_set_nls(); #endif #ifndef HAVE_API_ANDROID setenv("LC_NUMERIC","C",1); setlocale(LC_ALL,""); setlocale(LC_NUMERIC,"C"); #endif #if !defined _WIN32 && !defined _WIN32_WCE if (file_exists("navit.c") || file_exists("navit.o") || file_exists("navit.lo") || file_exists("version.h")) { char buffer[PATH_MAX]; printf("%s",_("Running from source directory\n")); getcwd(buffer, PATH_MAX); /* libc of navit returns "dummy" */ setenv("NAVIT_PREFIX", buffer, 0); main_setup_environment(0); } else { if (!getenv("NAVIT_PREFIX")) { int l; int progpath_len; char *progpath="/bin/navit"; l=strlen(program); progpath_len=strlen(progpath); if (l > progpath_len && !strcmp(program+l-progpath_len,progpath)) { s=g_strdup(program); s[l-progpath_len]='\0'; if (strcmp(s, PREFIX)) printf(_("setting '%s' to '%s'\n"), "NAVIT_PREFIX", s); setenv("NAVIT_PREFIX", s, 0); g_free(s); } else setenv("NAVIT_PREFIX", PREFIX, 0); } #ifdef HAVE_API_ANDROID main_setup_environment(3); #else main_setup_environment(1); #endif } #else /* _WIN32 || _WIN32_WCE */ if (!getenv("NAVIT_PREFIX")) { char filename[MAX_PATH + 1], *end; int len; *filename = '\0'; #ifdef _UNICODE /* currently for wince */ if (GetModuleFileNameW(NULL, wfilename, MAX_PATH)) { wcstombs(filename, wfilename, MAX_PATH); #else if (GetModuleFileName(NULL, filename, MAX_PATH)) { #endif end = strrchr(filename, L'\\'); /* eliminate the file name which is on the right side */ if(end) *end = '\0'; } len=strlen(filename); if (len > 4 && !strcmp(filename+len-4,"\\bin")) { filename[len-4]='\0'; } setenv("NAVIT_PREFIX", filename, 0); } if (!getenv("HOME")) setenv("HOME", getenv("NAVIT_PREFIX"), 0); main_setup_environment(2); #endif /* _WIN32 || _WIN32_WCE */ s = getenv("NAVIT_WID"); if (s) { setenv("SDL_WINDOWID", s, 0); } } navit-0.5.0+dfsg.1/navit/main.h000066400000000000000000000025151264204753600161450ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAIN_H #define NAVIT_MAIN_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ struct navit; struct iter; struct attr; struct iter * main_iter_new(void); void main_iter_destroy(struct iter *iter); struct navit * main_get_navit(struct iter *iter); void main_add_navit(struct navit *nav); void main_remove_navit(struct navit *nav); int main_add_attr(struct attr *attr); int main_remove_attr(struct attr *attr); void main_init(const char *program); void main_init_nls(void); int main(int argc, char **argv); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/map-share.h000066400000000000000000000017201264204753600170730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAP_SHARE_H #define NAVIT_MAP_SHARE_H void map_srv_start_poa(CORBA_ORB orb, CORBA_Environment * ev); CORBA_Object map_srv_start_object(CORBA_Environment * ev, struct container *co); #endif navit-0.5.0+dfsg.1/navit/map.c000066400000000000000000000506641264204753600160010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains code that makes navit able to load maps * * This file contains the code that makes navit able to load maps. Because * navit is able to open maps in different formats, this code does not handle * any map format itself. This is done by map plugins which register to this * code by calling plugin_register_map_type(). * * When opening a new map, the map plugin will return a pointer to a map_priv * struct, which can be defined by the map plugin and contains whatever private * data the map plugin needs to access the map. This pointer will also be used * as a "handle" to access the map opened. * * A common task is to create a "map rect". A map rect is a rectangular part of * the map, that one can for example retrieve items from. It is not possible to * retrieve items directly from the complete map. Creating a map rect returns a * pointer to a map_rect_priv, which contains private data for the map rect and * will be used as "handle" for this map rect. */ #include #include #include "debug.h" #include "coord.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "transform.h" #include "plugin.h" #include "callback.h" #include "country.h" #include "xmlconfig.h" /** * @brief Holds information about a map * * This structure holds information about a map. */ struct map { NAVIT_OBJECT struct map_methods meth; /**< Structure with pointers to the map plugin's functions */ struct map_priv *priv; /**< Private data of the map, only known to the map plugin */ struct callback_list *attr_cbl; /**< List of callbacks that are called when attributes change */ }; /** * @brief Describes a rectangular extract of a map * * This structure describes a rectangular extract of a map. */ struct map_rect { struct map *m; /**< The map this extract is from */ struct map_rect_priv *priv; /**< Private data of this map rect, only known to the map plugin */ }; /** * @brief Opens a new map * * This function opens a new map based on the attributes passed. This function * takes the attribute "attr_type" to determine which type of map to open and passes * all attributes to the map plugin's function that was specified in the * plugin_register_new_map_type()-call. * * Note that every plugin should accept an attribute of type "attr_data" to be passed * with the filename of the map to be opened as value. * * @param attrs Attributes specifying which map to open, see description * @return The opened map or NULL on failure */ struct map * map_new(struct attr *parent, struct attr **attrs) { struct map *m; struct map_priv *(*maptype_new)(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl); struct attr *type=attr_search(attrs, NULL, attr_type); if (! type) { dbg(lvl_error,"missing type\n"); return NULL; } maptype_new=plugin_get_map_type(type->u.str); if (! maptype_new) { dbg(lvl_error,"invalid type '%s'\n", type->u.str); return NULL; } m=g_new0(struct map, 1); m->attrs=attr_list_dup(attrs); m->func=&map_func; navit_object_ref((struct navit_object *)m); m->attr_cbl=callback_list_new(); m->priv=maptype_new(&m->meth, attrs, m->attr_cbl); if (! m->priv) { map_destroy(m); m=NULL; } return m; } /** * @brief Gets an attribute from a map * * @param this_ The map the attribute should be read from * @param type The type of the attribute to be read * @param attr Pointer to an attrib-structure where the attribute should be written to * @param iter (NOT IMPLEMENTED) Used to iterate through all attributes of a type. Set this to NULL to get the first attribute, set this to an attr_iter to get the next attribute * @return True if the attribute type was found, false if not */ int map_get_attr(struct map *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret=0; if (this_->meth.map_get_attr) ret=this_->meth.map_get_attr(this_->priv, type, attr); if (!ret) ret=attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); if (!ret && type == attr_active) { attr->type=type; attr->u.num=1; return 1; } return ret; } /** * @brief Sets an attribute of a map * * This sets an attribute of a map, overwriting an attribute of the same type if it * already exists. This function also calls all the callbacks that are registred * to be called when attributes change. * * @param this_ The map to set the attribute of * @param attr The attribute to set * @return True if the attr could be set, false otherwise */ int map_set_attr(struct map *this_, struct attr *attr) { this_->attrs=attr_generic_set_attr(this_->attrs, attr); if (this_->meth.map_set_attr) this_->meth.map_set_attr(this_->priv, attr); callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); return 1; } /** * @brief Registers a new callback for attribute-change * * This function registers a new callback function that should be called if the attributes * of the map change. * * @param this_ The map to associate the callback with * @param cb The callback to add */ void map_add_callback(struct map *this_, struct callback *cb) { callback_list_add(this_->attr_cbl, cb); } /** * @brief Removes a callback from the list of attribute-change callbacks * * This function removes one callback from the list of callbacks functions that should be called * when attributes of the map change. * * @param this_ The map to remove the callback from * @param cb The callback to remove */ void map_remove_callback(struct map *this_, struct callback *cb) { callback_list_remove(this_->attr_cbl, cb); } /** * @brief Checks if strings from a map have to be converted * * @param this_ Map to be checked for the need to convert strings * @return True if strings from the map have to be converted, false otherwise */ int map_requires_conversion(struct map *this_) { return (this_->meth.charset != NULL && strcmp(this_->meth.charset, "utf-8")); } char *map_converted_string_tmp=NULL; /** * @brief Converts a string from a map into a temporary allocated buffer. Conversion is not performed and original string is returned * if map doesn't require conversion. So lifetime of returned value is very limited. * * @param this_ The map the string to be converted is from * @param str The string to be converted * @return The converted string. Don't care about it after use. */ char * map_convert_string_tmp(struct map *this_, char *str) { if(map_converted_string_tmp!=NULL) g_free(map_converted_string_tmp); map_converted_string_tmp=NULL; if(!this_ || !this_->meth.charset || !strcmp(this_->meth.charset, "utf-8")) return str; map_converted_string_tmp=g_convert(str, -1, "utf-8", this_->meth.charset, NULL, NULL, NULL); if(!map_converted_string_tmp) { dbg(lvl_error,"Error converting '%s' from %s to utf-8\n", str, this_->meth.charset); return str; } return map_converted_string_tmp; } /** * @brief Converts a string from a map * * @param this_ The map the string to be converted is from * @param str The string to be converted * @return The converted string. It has to be map_convert_free()d after use. */ char * map_convert_string(struct map *this_, char *str) { return map_convert_dup(map_convert_string_tmp(this_,str)); } char * map_convert_dup(char *str) { if(map_converted_string_tmp==str) { map_converted_string_tmp=NULL; return str; } return g_strdup(str); } /** * @brief Frees the memory allocated for a converted string * * @param str The string to be freed */ void map_convert_free(char *str) { g_free(str); } /** * @brief Returns the projection of a map * * @param this_ The map to return the projection of * @return The projection of the map */ enum projection map_projection(struct map *this_) { return this_->meth.pro; } /** * @brief Sets the projection of a map * * @param this_ The map to set the projection of * @param pro The projection to be set */ void map_set_projection(struct map *this_, enum projection pro) { this_->meth.pro=pro; } /** * @brief Destroys an opened map * * @param m The map to be destroyed */ void map_destroy(struct map *m) { if (!m) return; if (m->priv) m->meth.map_destroy(m->priv); attr_list_free(m->attrs); callback_list_destroy(m->attr_cbl); g_free(m); } /** * @brief Creates a new map rect * * This creates a new map rect, which can be used to retrieve items from a map. If * sel is a linked-list of selections, all of them will be used. If you pass NULL as * sel, this means "get me the whole map". * * @param m The map to build the rect on * @param sel Map selection to choose the rectangle - may be NULL, see description * @return A new map rect */ struct map_rect * map_rect_new(struct map *m, struct map_selection *sel) { struct map_rect *mr; #if 0 printf("map_rect_new 0x%x,0x%x-0x%x,0x%x\n", r->lu.x, r->lu.y, r->rl.x, r->rl.y); #endif mr=g_new0(struct map_rect, 1); mr->m=m; mr->priv=m->meth.map_rect_new(m->priv, sel); if (! mr->priv) { g_free(mr); mr=NULL; } return mr; } /** * @brief Gets the next item from a map rect * * Returns an item from a map rect and advances the "item pointer" one step further, * so that at the next call the next item is returned. Returns NULL if there are no more items. * * @param mr The map rect to return an item from * @return An item from the map rect */ struct item * map_rect_get_item(struct map_rect *mr) { struct item *ret; dbg_assert(mr != NULL); dbg_assert(mr->m != NULL); dbg_assert(mr->m->meth.map_rect_get_item != NULL); ret=mr->m->meth.map_rect_get_item(mr->priv); if (ret) ret->map=mr->m; return ret; } /** * @brief Returns the item specified by the ID * * @param mr The map rect to search for the item * @param id_hi High part of the ID to be found * @param id_lo Low part of the ID to be found * @return The item with the specified ID or NULL if not found */ struct item * map_rect_get_item_byid(struct map_rect *mr, int id_hi, int id_lo) { struct item *ret=NULL; dbg_assert(mr != NULL); dbg_assert(mr->m != NULL); if (mr->m->meth.map_rect_get_item_byid) ret=mr->m->meth.map_rect_get_item_byid(mr->priv, id_hi, id_lo); if (ret) ret->map=mr->m; return ret; } /** * @brief Destroys a map rect * * @param mr The map rect to be destroyed */ void map_rect_destroy(struct map_rect *mr) { if (mr) { mr->m->meth.map_rect_destroy(mr->priv); g_free(mr); } } /** * @brief Holds information about a search on a map * * This structure holds information about a search performed on a map. This can be * used as "handle" to retrieve items from a search. */ struct map_search { struct map *m; struct attr search_attr; void *priv; }; /** * @brief Starts a search on a map * * This function starts a search on a map. What attributes one can search for depends on the * map plugin. * * The OSM/binfile plugin currently supports: attr_town_name, attr_street_name * The MG plugin currently supports: ttr_town_postal, attr_town_name, attr_street_name * * If you enable partial matches bear in mind that the search matches only the begin of the * strings - a search for a street named "street" would match to "streetfoo", but not to * "somestreet". Search is case insensitive. * * The item passed to this function specifies a "superior item" to "search within" - e.g. a town * in which we want to search for a street, or a country in which to search for a town. * * Please also note that the search for countries is not handled by map plugins but by navit internally - * have a look into country.c for details. Because of that every map plugin has to accept a country item * to be passed as "superior item". * * Note: If you change something here, please make sure to also update the documentation of mapset_search_new() * in mapset.c! * * @param m The map that should be searched * @param item Specifies a superior item to "search within" (see description) * @param search_attr Attribute specifying what to search for. See description. * @param partial Set this to true to also have partial matches. See description. * @return A new map search struct for this search */ struct map_search * map_search_new(struct map *m, struct item *item, struct attr *search_attr, int partial) { struct map_search *this_; dbg(lvl_debug,"enter(%p,%p,%p,%d)\n", m, item, search_attr, partial); dbg(lvl_debug,"0x%x 0x%x 0x%x\n", attr_country_all, search_attr->type, attr_country_name); this_=g_new0(struct map_search,1); this_->m=m; this_->search_attr=*search_attr; if ((search_attr->type >= attr_country_all && search_attr->type <= attr_country_name) || search_attr->type == attr_country_id) this_->priv=country_search_new(&this_->search_attr, partial); else { if (m->meth.map_search_new) { if (m->meth.charset) this_->search_attr.u.str=g_convert(this_->search_attr.u.str, -1,m->meth.charset,"utf-8",NULL,NULL,NULL); this_->priv=m->meth.map_search_new(m->priv, item, &this_->search_attr, partial); if (! this_->priv) { g_free(this_); this_=NULL; } } else { g_free(this_); this_=NULL; } } return this_; } /** * @brief Returns an item from a map search * * This returns an item of the result of a search on a map and advances the "item pointer" one step, * so that at the next call the next item will be returned. If there are no more items in the result * NULL is returned. * * @param this_ Map search struct of the search * @return One item of the result */ struct item * map_search_get_item(struct map_search *this_) { struct item *ret; if (! this_) return NULL; if ((this_->search_attr.type >= attr_country_all && this_->search_attr.type <= attr_country_name) || this_->search_attr.type == attr_country_id) return country_search_get_item(this_->priv); ret=this_->m->meth.map_search_get_item(this_->priv); if (ret) ret->map=this_->m; return ret; } /** * @brief Destroys a map search struct * * @param this_ The map search struct to be destroyed */ void map_search_destroy(struct map_search *this_) { if (! this_) return; if (this_->search_attr.type >= attr_country_all && this_->search_attr.type <= attr_country_name) country_search_destroy(this_->priv); else { if (this_->m->meth.charset) g_free(this_->search_attr.u.str); this_->m->meth.map_search_destroy(this_->priv); } g_free(this_); } /** * @brief Creates a new rectangular map selection * * @param center Coordinates of the center of the new rectangle * @param distance Distance of the rectangle's borders from the center * @param order Desired order of the new selection * @return The new map selection */ struct map_selection * map_selection_rect_new(struct pcoord *center, int distance, int order) { struct map_selection *ret=g_new0(struct map_selection, 1); ret->order=order; ret->range=item_range_all; ret->u.c_rect.lu.x=center->x-distance; ret->u.c_rect.lu.y=center->y+distance; ret->u.c_rect.rl.x=center->x+distance; ret->u.c_rect.rl.y=center->y-distance; return ret; } /** * @brief Duplicates a map selection, transforming coordinates * * This duplicates a map selection and at the same time transforms the internal * coordinates of the selection from one projection to another. * * @param sel The map selection to be duplicated * @param from The projection used for the selection at the moment * @param to The projection that should be used for the duplicated selection * @return A duplicated, transformed map selection */ struct map_selection * map_selection_dup_pro(struct map_selection *sel, enum projection from, enum projection to) { struct map_selection *next,**last; struct map_selection *ret=NULL; last=&ret; while (sel) { next = g_new(struct map_selection, 1); *next=*sel; if (from != projection_none || to != projection_none) { transform_from_to(&sel->u.c_rect.lu, from, &next->u.c_rect.lu, to); transform_from_to(&sel->u.c_rect.rl, from, &next->u.c_rect.rl, to); } *last=next; last=&next->next; sel = sel->next; } return ret; } /** * @brief Duplicates a map selection * * @param sel The map selection to duplicate * @return The duplicated map selection */ struct map_selection * map_selection_dup(struct map_selection *sel) { return map_selection_dup_pro(sel, projection_none, projection_none); } /** * @brief Destroys a map selection * * @param sel The map selection to be destroyed */ void map_selection_destroy(struct map_selection *sel) { struct map_selection *next; while (sel) { next = sel->next; g_free(sel); sel = next; } } /** * @brief Checks if a selection contains a rectangle containing an item * * This function checks if a selection contains a rectangle which exactly contains * an item. The rectangle is automatically built around the given item. * * @param sel The selection to be checked * @param item The item that the rectangle should be built around * @return True if the rectangle is within the selection, false otherwise */ int map_selection_contains_item_rect(struct map_selection *sel, struct item *item) { struct coord c; struct coord_rect r; int count=0; while (item_coord_get(item, &c, 1)) { if (! count) { r.lu=c; r.rl=c; } else coord_rect_extend(&r, &c); count++; } if (! count) return 0; return map_selection_contains_rect(sel, &r); } /** * @brief Checks if a selection contains a item range * * This function checks if a selection contains at least one of the items in range * * @param sel The selection to be checked * @param follow Whether the next pointer of the selection should be followed * @param ranges The item ranges to be checked * @count the number of elements in ranges * @return True if there is a match, false otherwise */ int map_selection_contains_item_range(struct map_selection *sel, int follow, struct item_range *range, int count) { int i; if (! sel) return 1; while (sel) { for (i = 0 ; i < count ; i++) { if (item_range_intersects_range(&sel->range, &range[i])) return 1; } if (! follow) break; sel=sel->next; } return 0; } /** * @brief Checks if a selection contains a item * * This function checks if a selection contains a item type * * @param sel The selection to be checked * @param follow Whether the next pointer of the selection should be followed * @param item The item type to be checked * @return True if there is a match, false otherwise */ int map_selection_contains_item(struct map_selection *sel, int follow, enum item_type type) { if (! sel) return 1; while (sel) { if (item_range_contains_item(&sel->range, type)) return 1; if (! follow) break; sel=sel->next; } return 0; } /** * @brief Checks if a pointer points to the private data of a map * * @param map The map whose private data should be checked. * @param priv The private data that should be checked. * @return True if priv is the private data of map */ int map_priv_is(struct map *map, struct map_priv *priv) { return (map->priv == priv); } void map_dump_filedesc(struct map *map, FILE *out) { struct map_rect *mr=map_rect_new(map, NULL); struct item *item; while ((item = map_rect_get_item(mr))) item_dump_filedesc(item, map, out); map_rect_destroy(mr); } void map_dump_file(struct map *map, const char *file) { FILE *f; f=fopen(file,"w"); if (f) { map_dump_filedesc(map, f); fclose(f); } else dbg(lvl_error,"failed to open file '%s'\n",file); } void map_dump(struct map *map) { map_dump_filedesc(map, stdout); } struct item * map_rect_create_item(struct map_rect *mr, enum item_type type_) { if(mr && mr->priv && mr->m) { return mr->m->meth.map_rect_create_item(mr->priv, type_) ; } else { return NULL; } } struct object_func map_func = { attr_map, (object_func_new)map_new, (object_func_get_attr)map_get_attr, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)map_set_attr, (object_func_add_attr)NULL, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)map_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/map.h000066400000000000000000000241631264204753600160010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains exported functions / structures for map.c * * This file contains code that works together with map.c and that is exported * to other modules. */ #ifndef NAVIT_MAP_H #define NAVIT_MAP_H #ifdef __cplusplus extern "C" { #endif struct map_priv; struct attr; #include "coord.h" #include "point.h" #include "layer.h" #include "debug.h" #define WORLD_BOUNDINGBOX_MIN_X -20000000 #define WORLD_BOUNDINGBOX_MAX_X 20000000 #define WORLD_BOUNDINGBOX_MIN_Y -20000000 #define WORLD_BOUNDINGBOX_MAX_Y 20000000 /** * @brief Used to select data from a map * * This struct is used to select data from a map. This one the one hand builds a * rectangle on the map and on the other hand selects an order for items of each * layer. Note that passing NULL instead of a pointer to such a struct often means * "get me everything". * * It's possible to link multiple selections in a linked list, see below. */ struct map_selection { struct map_selection *next; /**< Linked-List pointer */ union { struct coord_rect c_rect; /**< For building the rectangle based on coordinates */ struct point_rect p_rect; /**< For building the rectangle based on points */ } u; int order; /**< Holds the order */ struct item_range range; /**< Range of items which should be delivered */ }; /** * @brief Holds all functions a map plugin has to implement to be useable * * This structure holds pointers to a map plugin's functions navit's core will call * to communicate with the plugin. For further information look into map.c - there exist * functions with the same names acting more or less as "wrappers" around the functions here. * Especially the arguments (and their meaning) of each function will be described there. */ struct map_methods { enum projection pro; /**< The projection used for that type of map */ char *charset; /**< The charset this map uses - e.g. "iso8859-1" or "utf-8". Please specify this in a form so that g_convert() can handle it. */ void (*map_destroy)(struct map_priv *priv); /**< Function used to destroy ("close") a map. */ struct map_rect_priv * (*map_rect_new)(struct map_priv *map, struct map_selection *sel); /**< Function to create a new map rect on the map. */ void (*map_rect_destroy)(struct map_rect_priv *mr); /**< Function to destroy a map rect */ struct item * (*map_rect_get_item)(struct map_rect_priv *mr); /**< Function to return the next item from a map rect */ struct item * (*map_rect_get_item_byid)(struct map_rect_priv *mr, int id_hi, int id_lo); /**< Function to get an item with a specific ID from a map rect */ struct map_search_priv *(*map_search_new)(struct map_priv *map, struct item *item, struct attr *search, int partial); /**< Function to start a new search on the map */ void (*map_search_destroy)(struct map_search_priv *ms); /**< Function to destroy a map search struct */ struct item * (*map_search_get_item)(struct map_search_priv *ms); /**< Function to get the next item of a search on the map */ struct item * (*map_rect_create_item)(struct map_rect_priv *mr, enum item_type type); /**< Function to create a new item in the map */ int (*map_get_attr)(struct map_priv *priv, enum attr_type type, struct attr *attr); int (*map_set_attr)(struct map_priv *priv, struct attr *attr); }; /** * @brief Checks if a coordinate is within a map selection * * Checks if a coordinate is within a map selection. Note that since a selection of NULL * means "select everything", with sel = NULL this will always return true. If there are * more than one selection in a linked-list, it is sufficient if only one of the selections * contains the coordinate. * * @param sel The selection to check if the point is within * @param c Coordinate to check if it is within the selection * @return True if the coordinate is within one of the selections, False otherwise */ static inline int map_selection_contains_point(struct map_selection *sel, struct coord *c) { struct map_selection *curr=sel; while (curr) { struct coord_rect *r=&curr->u.c_rect; if (c->x >= r->lu.x && c->x <= r->rl.x && c->y <= r->lu.y && c->y >= r->rl.y) return 1; curr=curr->next; } return sel ? 0:1; } /** * @brief Checks if a polyline is within a map selection * * @sa Please refer to map_selection_contains_point() * * @param sel The selection to check if the polyline is within * @param c Coordinates of the polyline to check if it is within the selection * @param count Number of coordinates in c * @return True if the polyline is within one of the selections, False otherwise */ static inline int map_selection_contains_polyline(struct map_selection *sel, struct coord *c, int count) { int i,x_mi,x_ma,y_mi,y_ma; struct map_selection *curr; if (! sel) return 1; for (i = 0 ; i < count-1 ; i++) { x_mi=c[i].x; if (c[i+1].x < x_mi) x_mi=c[i+1].x; x_ma=c[i].x; if (c[i+1].x > x_ma) x_ma=c[i+1].x; y_mi=c[i].y; if (c[i+1].y < y_mi) y_mi=c[i+1].y; y_ma=c[i].y; if (c[i+1].y > y_ma) y_ma=c[i+1].y; curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; if (x_mi <= sr->rl.x && x_ma >= sr->lu.x && y_ma >= sr->rl.y && y_mi <= sr->lu.y) return 1; curr=curr->next; } } return 0; } /** * @brief Checks if a rectangle is within a map selection * * @sa Please refer to map_selection_contains_point() * * @param sel The selection to check if the rectangle is within * @param r Rectangle to be checked for * @return True if the rectangle is within one of the selections, False otherwise */ static inline int map_selection_contains_rect(struct map_selection *sel, struct coord_rect *r) { struct map_selection *curr; dbg_assert(r->lu.x <= r->rl.x); dbg_assert(r->lu.y >= r->rl.y); if (! sel) return 1; curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; dbg_assert(sr->lu.x <= sr->rl.x); dbg_assert(sr->lu.y >= sr->rl.y); if (r->lu.x <= sr->rl.x && r->rl.x >= sr->lu.x && r->lu.y >= sr->rl.y && r->rl.y <= sr->lu.y) return 1; curr=curr->next; } return 0; } /** * @brief Checks if a polygon is within a map selection * * @sa Please refer to map_selection_contains_point() * * @param sel The selection to check if the polygon is within * @param c Pointer to coordinates of the polygon * @param count Number of coordinates in c * @return True if the polygon is within one of the selections, False otherwise */ static inline int map_selection_contains_polygon(struct map_selection *sel, struct coord *c, int count) { struct coord_rect r; int i; if (! sel) return 1; if (! count) return 0; r.lu=c[0]; r.rl=c[0]; for (i = 1 ; i < count ; i++) { if (c[i].x < r.lu.x) r.lu.x=c[i].x; if (c[i].x > r.rl.x) r.rl.x=c[i].x; if (c[i].y < r.rl.y) r.rl.y=c[i].y; if (c[i].y > r.lu.y) r.lu.y=c[i].y; } return map_selection_contains_rect(sel, &r); } /* prototypes */ enum attr_type; enum projection; struct attr; struct attr_iter; struct callback; struct item; struct map; struct map_priv; struct map_rect; struct map_search; struct map_selection; struct pcoord; struct map *map_new(struct attr *parent, struct attr **attrs); struct map *map_ref(struct map* m); void map_unref(struct map* m); int map_get_attr(struct map *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int map_set_attr(struct map *this_, struct attr *attr); void map_add_callback(struct map *this_, struct callback *cb); void map_remove_callback(struct map *this_, struct callback *cb); int map_requires_conversion(struct map *this_); char *map_convert_string_tmp(struct map *this_, char *str); char *map_convert_string(struct map *this_, char *str); char *map_convert_dup(char *str); void map_convert_free(char *str); enum projection map_projection(struct map *this_); void map_set_projection(struct map *this_, enum projection pro); void map_destroy(struct map *m); struct map_rect *map_rect_new(struct map *m, struct map_selection *sel); struct item *map_rect_get_item(struct map_rect *mr); struct item *map_rect_get_item_byid(struct map_rect *mr, int id_hi, int id_lo); struct item *map_rect_create_item(struct map_rect *mr, enum item_type type_); void map_rect_destroy(struct map_rect *mr); struct map_search *map_search_new(struct map *m, struct item *item, struct attr *search_attr, int partial); struct item *map_search_get_item(struct map_search *this_); void map_search_destroy(struct map_search *this_); struct map_selection *map_selection_rect_new(struct pcoord *center, int distance, int order); struct map_selection *map_selection_dup_pro(struct map_selection *sel, enum projection from, enum projection to); struct map_selection *map_selection_dup(struct map_selection *sel); void map_selection_destroy(struct map_selection *sel); int map_selection_contains_item_rect(struct map_selection *sel, struct item *item); int map_selection_contains_item_range(struct map_selection *sel, int follow, struct item_range *range, int count); int map_selection_contains_item(struct map_selection *sel, int follow, enum item_type type); int map_priv_is(struct map *map, struct map_priv *priv); void map_dump_filedesc(struct map *map, FILE *out); void map_dump_file(struct map *map, const char *file); void map_dump(struct map *map); void map_destroy_do(struct map *m); struct maps * maps_new(struct attr *parent, struct attr **attrs); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/map/000077500000000000000000000000001264204753600156225ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/Makefile.am000066400000000000000000000005221264204753600176550ustar00rootroot00000000000000SUBDIRS= if MAP_BINFILE SUBDIRS+=binfile endif if MAP_FILTER SUBDIRS+=filter endif if HAVELIBGARMIN SUBDIRS+=garmin endif if MAP_MG SUBDIRS+=mg endif if MAP_SHAPEFILE SUBDIRS+=shapefile endif if MAP_TEXTFILE SUBDIRS+=textfile endif if MAP_CSV SUBDIRS+=csv endif DIST_SUBDIRS=mg textfile csv binfile garmin shapefile filter navit-0.5.0+dfsg.1/navit/map/binfile/000077500000000000000000000000001264204753600172325ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/binfile/CMakeLists.txt000066400000000000000000000000531264204753600217700ustar00rootroot00000000000000module_add_library(map_binfile binfile.c) navit-0.5.0+dfsg.1/navit/map/binfile/Makefile.am000066400000000000000000000005061264204753600212670ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_binfile if PLUGINS modulemap_LTLIBRARIES = libmap_binfile.la else noinst_LTLIBRARIES = libmap_binfile.la endif libmap_binfile_la_SOURCES = binfile.c libmap_binfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/map/binfile/binfile.c000066400000000000000000002332611264204753600210150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "coord.h" #include "transform.h" #include "file.h" #include "zipfile.h" #include "linguistics.h" #include "endianess.h" #include "callback.h" #include "types.h" #include "geom.h" static int map_id; /** * @brief A map tile, a rectangular region of the world. * * Represents a "map tile", a rectangular region of the world. The * binfile format divides the world into tiles of different sizes for * easy handling. * A binfile is a ZIP archive; each member file (with the exception of * index files) represents one tile. The data from a tile file is read * into memory and used directly as the tile data of this struct. *

* See the Navit wiki for details on the binfile format: * * http://wiki.navit-project.org/index.php/Navit%27s_binary_map_driver *

* Note that this tile struct also maintains pointers to several current positions * inside the tile. These are not part of the actual tile data, but are * used for working with the data. */ struct tile { int *start; //!< Memory address of the buffer containing the tile data (the actual map data). int *end; //!< First memory address not belonging to the tile data. /**< Thus tile->end - tile->start represents the size of the tile data * in multiples of 4 Bytes. */ int *pos; //!< Pointer to current position (start of current item) inside the tile data. int *pos_coord_start; //!< Pointer to the first element inside the current item that is a coordinate. /**< That is the first position after the header of an * item. The header holds 3 entries each 32bit wide integers: * header[0] holds the size of the whole item (excluding this size field) * header[1] holds the type of the item * header[2] holds the size of the coordinates in the tile */ int *pos_coord; //!< Current position in the coordinates region of the current item. int *pos_attr_start; //!< Pointer to the first attr data structure of the current item. int *pos_attr; //!< Current position in the attr region of the current item. int *pos_next; //!< Pointer to the next item (the item which follows the "current item" as indicated by *pos). struct file *fi; //!< The file from which this tile was loaded. int zipfile_num; int mode; }; struct map_download { int state; struct map_priv *m; struct map_rect_priv *mr; struct file *http,*file; int zipfile,toffset,tlength,progress,read,dl_size; long long offset,start_offset,cd1offset,size; struct zip64_eoc *zip64_eoc; struct zip64_eocl *zip64_eocl; struct zip_eoc *zip_eoc; struct zip_cd *cd_copy,*cd; }; /** * @brief Represents the map from a single binfile. * */ struct map_priv { int id; char *filename; //!< Filename of the binfile. char *cachedir; struct file *fi,*http; struct file **fis; struct zip_cd *index_cd; int index_offset; int cde_size; struct zip_eoc *eoc; struct zip64_eoc *eoc64; int zip_members; unsigned char *search_data; int search_offset; int search_size; int version; int check_version; int map_version; GHashTable *changes; char *passwd; char *map_release; int flags; char *url; int update_available; char *progress; struct callback_list *cbl; struct map_download *download; int redirect; long download_enabled; int last_searched_town_id_hi; int last_searched_town_id_lo; }; struct map_rect_priv { int *start; int *end; enum attr_type attr_last; int label; int *label_attr[5]; struct map_selection *sel; struct map_priv *m; struct item item; int tile_depth; struct tile tiles[8]; struct tile *t; int country_id; char *url; struct attr attrs[8]; int status; struct map_search_priv *msp; #ifdef DEBUG_SIZE int size; #endif }; /** * @brief Represents a search on a map. * This struct represents a search on a map; it is created * when starting a search, and is used for retrieving results. */ struct map_search_priv { struct map_priv *map; /**< Map to search in. */ struct map_rect_priv *mr; /**< Map rectangle to search inside. */ struct map_rect_priv *mr_item; struct item *item; struct attr search; /**< Attribute specifying what to search for. */ struct map_selection ms; GList *boundaries; int partial; /**< Find partial matches? */ int mode; struct coord_rect rect_new; char *parent_name; GHashTable *search_results; }; static void push_tile(struct map_rect_priv *mr, struct tile *t, int offset, int length); static void setup_pos(struct map_rect_priv *mr); static void map_binfile_close(struct map_priv *m); static int map_binfile_open(struct map_priv *m); static void map_binfile_destroy(struct map_priv *m); static void lfh_to_cpu(struct zip_lfh *lfh) { dbg_assert(lfh != NULL); if (lfh->ziplocsig != zip_lfh_sig) { lfh->ziplocsig = le32_to_cpu(lfh->ziplocsig); lfh->zipver = le16_to_cpu(lfh->zipver); lfh->zipgenfld = le16_to_cpu(lfh->zipgenfld); lfh->zipmthd = le16_to_cpu(lfh->zipmthd); lfh->ziptime = le16_to_cpu(lfh->ziptime); lfh->zipdate = le16_to_cpu(lfh->zipdate); lfh->zipcrc = le32_to_cpu(lfh->zipcrc); lfh->zipsize = le32_to_cpu(lfh->zipsize); lfh->zipuncmp = le32_to_cpu(lfh->zipuncmp); lfh->zipfnln = le16_to_cpu(lfh->zipfnln); lfh->zipxtraln = le16_to_cpu(lfh->zipxtraln); } } static void cd_to_cpu(struct zip_cd *zcd) { dbg_assert(zcd != NULL); if (zcd->zipcensig != zip_cd_sig) { zcd->zipcensig = le32_to_cpu(zcd->zipcensig); zcd->zipccrc = le32_to_cpu(zcd->zipccrc); zcd->zipcsiz = le32_to_cpu(zcd->zipcsiz); zcd->zipcunc = le32_to_cpu(zcd->zipcunc); zcd->zipcfnl = le16_to_cpu(zcd->zipcfnl); zcd->zipcxtl = le16_to_cpu(zcd->zipcxtl); zcd->zipccml = le16_to_cpu(zcd->zipccml); zcd->zipdsk = le16_to_cpu(zcd->zipdsk); zcd->zipint = le16_to_cpu(zcd->zipint); zcd->zipext = le32_to_cpu(zcd->zipext); zcd->zipofst = le32_to_cpu(zcd->zipofst); } } static void eoc_to_cpu(struct zip_eoc *eoc) { dbg_assert(eoc != NULL); if (eoc->zipesig != zip_eoc_sig) { eoc->zipesig = le32_to_cpu(eoc->zipesig); eoc->zipedsk = le16_to_cpu(eoc->zipedsk); eoc->zipecen = le16_to_cpu(eoc->zipecen); eoc->zipenum = le16_to_cpu(eoc->zipenum); eoc->zipecenn = le16_to_cpu(eoc->zipecenn); eoc->zipecsz = le32_to_cpu(eoc->zipecsz); eoc->zipeofst = le32_to_cpu(eoc->zipeofst); eoc->zipecoml = le16_to_cpu(eoc->zipecoml); } } static void binfile_check_version(struct map_priv *m); static struct zip_eoc * binfile_read_eoc(struct file *fi) { struct zip_eoc *eoc; eoc=(struct zip_eoc *)file_data_read(fi,fi->size-sizeof(struct zip_eoc), sizeof(struct zip_eoc)); if (eoc) { eoc_to_cpu(eoc); dbg(lvl_debug,"sig 0x%x\n", eoc->zipesig); if (eoc->zipesig != zip_eoc_sig) { dbg(lvl_error,"map file %s: eoc signature check failed: 0x%x vs 0x%x\n", fi->name, eoc->zipesig,zip_eoc_sig); file_data_free(fi,(unsigned char *)eoc); eoc=NULL; } } return eoc; } static struct zip64_eoc * binfile_read_eoc64(struct file *fi) { struct zip64_eocl *eocl; struct zip64_eoc *eoc; eocl=(struct zip64_eocl *)file_data_read(fi,fi->size-sizeof(struct zip_eoc)-sizeof(struct zip64_eocl), sizeof(struct zip64_eocl)); if (!eocl) return NULL; dbg(lvl_debug,"sig 0x%x\n", eocl->zip64lsig); if (eocl->zip64lsig != zip64_eocl_sig) { file_data_free(fi,(unsigned char *)eocl); dbg(lvl_warning,"map file %s: eocl wrong\n", fi->name); return NULL; } eoc=(struct zip64_eoc *)file_data_read(fi,eocl->zip64lofst, sizeof(struct zip64_eoc)); if (eoc) { if (eoc->zip64esig != zip64_eoc_sig) { file_data_free(fi,(unsigned char *)eoc); dbg(lvl_warning,"map file %s: eoc wrong\n", fi->name); eoc=NULL; } dbg(lvl_debug,"eoc64 ok 0x"LONGLONG_HEX_FMT " 0x"LONGLONG_HEX_FMT "\n",eoc->zip64eofst,eoc->zip64ecsz); } file_data_free(fi,(unsigned char *)eocl); return eoc; } static int binfile_cd_extra(struct zip_cd *cd) { return cd->zipcfnl+cd->zipcxtl; } static struct zip_cd * binfile_read_cd(struct map_priv *m, int offset, int len) { struct zip_cd *cd; long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; if (len == -1) { cd=(struct zip_cd *)file_data_read(m->fi,cdoffset+offset, sizeof(*cd)); cd_to_cpu(cd); len=binfile_cd_extra(cd); file_data_free(m->fi,(unsigned char *)cd); } cd=(struct zip_cd *)file_data_read(m->fi,cdoffset+offset, sizeof(*cd)+len); if (cd) { dbg(lvl_debug,"cd at "LONGLONG_FMT" %zu bytes\n",cdoffset+offset, sizeof(*cd)+len); cd_to_cpu(cd); dbg(lvl_debug,"sig 0x%x\n", cd->zipcensig); if (cd->zipcensig != zip_cd_sig) { file_data_free(m->fi,(unsigned char *)cd); cd=NULL; } } return cd; } /** * @brief Get the ZIP64 extra field data corresponding to a zip central * directory header. * * @param cd pointer to zip central directory structure * @return pointer to ZIP64 extra field, or NULL if not available */ static struct zip_cd_ext * binfile_cd_ext(struct zip_cd *cd) { struct zip_cd_ext *ext; if (cd->zipofst != zip_size_64bit_placeholder) return NULL; if (cd->zipcxtl != sizeof(*ext)) return NULL; ext=(struct zip_cd_ext *)((unsigned char *)cd+sizeof(*cd)+cd->zipcfnl); if (ext->tag != zip_extra_header_id_zip64 || ext->size != 8) return NULL; return ext; } /** * @param cd pointer to zip central directory structure * @return Offset of local file header in zip file. * Will use ZIP64 data if present. */ static long long binfile_cd_offset(struct zip_cd *cd) { struct zip_cd_ext *ext=binfile_cd_ext(cd); if (ext) return ext->zipofst; else return cd->zipofst; } static struct zip_lfh * binfile_read_lfh(struct file *fi, long long offset) { struct zip_lfh *lfh; lfh=(struct zip_lfh *)(file_data_read(fi,offset,sizeof(struct zip_lfh))); if (lfh) { lfh_to_cpu(lfh); if (lfh->ziplocsig != zip_lfh_sig) { file_data_free(fi,(unsigned char *)lfh); lfh=NULL; } } return lfh; } static unsigned char * binfile_read_content(struct map_priv *m, struct file *fi, long long offset, struct zip_lfh *lfh) { struct zip_enc *enc; unsigned char *ret=NULL; offset+=sizeof(struct zip_lfh)+lfh->zipfnln; switch (lfh->zipmthd) { case 0: offset+=lfh->zipxtraln; ret=file_data_read(fi,offset, lfh->zipuncmp); break; case 8: offset+=lfh->zipxtraln; ret=file_data_read_compressed(fi,offset, lfh->zipsize, lfh->zipuncmp); break; case 99: if (!m->passwd) break; enc=(struct zip_enc *)file_data_read(fi, offset, sizeof(*enc)); offset+=lfh->zipxtraln; switch (enc->compress_method) { case 0: ret=file_data_read_encrypted(fi, offset, lfh->zipsize, lfh->zipuncmp, 0, m->passwd); break; case 8: ret=file_data_read_encrypted(fi, offset, lfh->zipsize, lfh->zipuncmp, 1, m->passwd); break; default: dbg(lvl_error,"map file %s: unknown encrypted compression method %d\n", fi->name, enc->compress_method); } file_data_free(fi, (unsigned char *)enc); break; default: dbg(lvl_error,"map file %s: unknown compression method %d\n", fi->name, lfh->zipmthd); } return ret; } static int binfile_search_cd(struct map_priv *m, int offset, char *name, int partial, int skip) { int size=4096; int end=m->eoc64?m->eoc64->zip64ecsz:m->eoc->zipecsz; int len=strlen(name); long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; struct zip_cd *cd; #if 0 dbg(lvl_debug,"end=%d\n",end); #endif while (offset < end) { cd=(struct zip_cd *)(m->search_data+offset-m->search_offset); if (! m->search_data || m->search_offset > offset || offset-m->search_offset+sizeof(*cd) > m->search_size || offset-m->search_offset+sizeof(*cd)+cd->zipcfnl+cd->zipcxtl > m->search_size ) { #if 0 dbg(lvl_debug,"reload %p %d %d\n", m->search_data, m->search_offset, offset); #endif if (m->search_data) file_data_free(m->fi,m->search_data); m->search_offset=offset; m->search_size=end-offset; if (m->search_size > size) m->search_size=size; m->search_data=file_data_read(m->fi,cdoffset+m->search_offset,m->search_size); cd=(struct zip_cd *)m->search_data; } #if 0 dbg(lvl_debug,"offset=%d search_offset=%d search_size=%d search_data=%p cd=%p\n", offset, m->search_offset, m->search_size, m->search_data, cd); dbg(lvl_debug,"offset=%d fn='%s'\n",offset,cd->zipcfn); #endif if (!skip && (partial || cd->zipcfnl == len) && !strncmp(cd->zipcfn, name, len)) return offset; skip=0; offset+=sizeof(*cd)+cd->zipcfnl+cd->zipcxtl+cd->zipccml; ; } return -1; } static void map_destroy_binfile(struct map_priv *m) { dbg(lvl_debug,"map_destroy_binfile\n"); if (m->fi) map_binfile_close(m); map_binfile_destroy(m); } static void binfile_coord_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; t->pos_coord=t->pos_coord_start; } static inline int binfile_coord_left(void *priv_data) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; return (t->pos_attr_start-t->pos_coord)/2; } static int binfile_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; int max,ret=0; max=binfile_coord_left(priv_data); if (count > max) count=max; #if __BYTE_ORDER == __LITTLE_ENDIAN memcpy(c, t->pos_coord, count*sizeof(struct coord)); #else { int i=0,end=count*sizeof(struct coord)/sizeof(int); int *src=(int *)t->pos_coord; int *dst=(int *)c; while (i++ < end) { *dst++=le32_to_cpu(*src); src++; } } #endif t->pos_coord+=count*2; ret=count; return ret; } /** * @brief * @param * @return */ static void binfile_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; t->pos_attr=t->pos_attr_start; mr->label=0; memset(mr->label_attr, 0, sizeof(mr->label_attr)); } static char * binfile_extract(struct map_priv *m, char *dir, char *filename, int partial) { char *full,*fulld,*sep; unsigned char *start; int len,offset=m->index_offset; struct zip_cd *cd; struct zip_lfh *lfh; FILE *f; for (;;) { offset=binfile_search_cd(m, offset, filename, partial, 1); if (offset == -1) break; cd=binfile_read_cd(m, offset, -1); len=strlen(dir)+1+cd->zipcfnl+1; full=g_malloc(len); strcpy(full,dir); strcpy(full+strlen(full),"/"); strncpy(full+strlen(full),cd->zipcfn,cd->zipcfnl); full[len-1]='\0'; fulld=g_strdup(full); sep=strrchr(fulld, '/'); if (sep) { *sep='\0'; file_mkdir(fulld, 1); } if (full[len-2] != '/') { lfh=binfile_read_lfh(m->fi, binfile_cd_offset(cd)); start=binfile_read_content(m, m->fi, binfile_cd_offset(cd), lfh); dbg(lvl_debug,"fopen '%s'\n", full); f=fopen(full,"w"); fwrite(start, lfh->zipuncmp, 1, f); fclose(f); file_data_free(m->fi, start); file_data_free(m->fi, (unsigned char *)lfh); } file_data_free(m->fi, (unsigned char *)cd); g_free(fulld); g_free(full); if (! partial) break; } return g_strdup_printf("%s/%s",dir,filename); } static int binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; enum attr_type type; int i,size; if (attr_type != mr->attr_last) { t->pos_attr=t->pos_attr_start; mr->attr_last=attr_type; } while (t->pos_attr < t->pos_next) { size=le32_to_cpu(*(t->pos_attr++)); type=le32_to_cpu(t->pos_attr[0]); if (type == attr_label) mr->label=1; if (type == attr_house_number) mr->label_attr[0]=t->pos_attr; if (type == attr_street_name) mr->label_attr[1]=t->pos_attr; if (type == attr_street_name_systematic) mr->label_attr[2]=t->pos_attr; if (type == attr_district_name && mr->item.type < type_line) mr->label_attr[3]=t->pos_attr; if (type == attr_town_name && mr->item.type < type_line) mr->label_attr[4]=t->pos_attr; if (type == attr_type || attr_type == attr_any) { if (attr_type == attr_any) { dbg(lvl_debug,"pos %p attr %s size %d\n", t->pos_attr-1, attr_to_name(type), size); } attr->type=type; if (ATTR_IS_GROUP(type)) { int i=0; int *subpos=t->pos_attr+1; int size_rem=size-1; i=0; while (size_rem > 0 && i < 7) { int subsize=le32_to_cpu(*subpos++); int subtype=le32_to_cpu(subpos[0]); mr->attrs[i].type=subtype; attr_data_set_le(&mr->attrs[i], subpos+1); subpos+=subsize; size_rem-=subsize+1; i++; } mr->attrs[i].type=type_none; mr->attrs[i].u.data=NULL; attr->u.attrs=mr->attrs; } else { attr_data_set_le(attr, t->pos_attr+1); if (type == attr_url_local) { g_free(mr->url); mr->url=binfile_extract(mr->m, mr->m->cachedir, attr->u.str, 1); attr->u.str=mr->url; } if (type == attr_flags && mr->m->map_version < 1) attr->u.num |= AF_CAR; } t->pos_attr+=size; return 1; } else { t->pos_attr+=size; } } if (!mr->label && (attr_type == attr_any || attr_type == attr_label)) { for (i = 0 ; i < sizeof(mr->label_attr)/sizeof(int *) ; i++) { if (mr->label_attr[i]) { mr->label=1; attr->type=attr_label; attr_data_set_le(attr,mr->label_attr[i]+1); return 1; } } } return 0; } struct binfile_hash_entry { struct item_id id; int flags; int data[0]; }; static guint binfile_hash_entry_hash(gconstpointer key) { const struct binfile_hash_entry *entry=key; return (entry->id.id_hi ^ entry->id.id_lo); } static gboolean binfile_hash_entry_equal(gconstpointer a, gconstpointer b) { const struct binfile_hash_entry *entry1=a,*entry2=b; return (entry1->id.id_hi==entry2->id.id_hi && entry1->id.id_lo == entry2->id.id_lo); } static int * binfile_item_dup(struct map_priv *m, struct item *item, struct tile *t, int extend) { int size=le32_to_cpu(t->pos[0]); struct binfile_hash_entry *entry=g_malloc(sizeof(struct binfile_hash_entry)+(size+1+extend)*sizeof(int)); void *ret=entry->data; entry->id.id_hi=item->id_hi; entry->id.id_lo=item->id_lo; entry->flags=1; dbg(lvl_debug,"id 0x%x,0x%x\n",entry->id.id_hi,entry->id.id_lo); memcpy(ret, t->pos, (size+1)*sizeof(int)); if (!m->changes) m->changes=g_hash_table_new_full(binfile_hash_entry_hash, binfile_hash_entry_equal, g_free, NULL); g_hash_table_replace(m->changes, entry, entry); dbg(lvl_debug,"ret %p\n",ret); return ret; } static int binfile_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t,*tn,new; int i,delta,move_len; int write_offset,move_offset,aoffset,coffset,clen; int *data; { int *i=t->pos,j=0; dbg(lvl_debug,"Before: pos_coord=%td\n",t->pos_coord-i); while (i < t->pos_next) dbg(lvl_debug,"%d:0x%x\n",j++,*i++); } aoffset=t->pos_attr-t->pos_attr_start; coffset=t->pos_coord-t->pos_coord_start-2; clen=t->pos_attr_start-t->pos_coord+2; dbg(lvl_debug,"coffset=%d clen=%d\n",coffset,clen); switch (mode) { case change_mode_delete: if (count*2 > clen) count=clen/2; delta=-count*2; move_offset=coffset+count*2; move_len=t->pos_next-t->pos_coord_start-move_offset; write_offset=0; break; case change_mode_modify: write_offset=coffset; if (count*2 > clen) { delta=count*2-clen; move_offset=t->pos_attr_start-t->pos_coord_start; move_len=t->pos_next-t->pos_coord_start-move_offset; } else { move_len=0; move_offset=0; delta=0; } break; case change_mode_prepend: delta=count*2; move_offset=coffset-2; move_len=t->pos_next-t->pos_coord_start-move_offset; write_offset=coffset-2; break; case change_mode_append: delta=count*2; move_offset=coffset; move_len=t->pos_next-t->pos_coord_start-move_offset; write_offset=coffset; break; default: return 0; } dbg(lvl_debug,"delta %d\n",delta); data=binfile_item_dup(mr->m, &mr->item, t, delta > 0 ? delta:0); data[0]=cpu_to_le32(le32_to_cpu(data[0])+delta); data[2]=cpu_to_le32(le32_to_cpu(data[2])+delta); new.pos=new.start=data; new.zipfile_num=t->zipfile_num; new.mode=2; push_tile(mr, &new, 0, 0); setup_pos(mr); tn=mr->t; tn->pos_coord=tn->pos_coord_start+coffset; tn->pos_attr=tn->pos_attr_start+aoffset; dbg(lvl_debug,"moving %d ints from offset %td to %td\n",move_len,tn->pos_coord_start+move_offset-data,tn->pos_coord_start+move_offset+delta-data); memmove(tn->pos_coord_start+move_offset+delta, tn->pos_coord_start+move_offset, move_len*4); { int *i=tn->pos,j=0; dbg(lvl_debug,"After move: pos_coord=%td\n",tn->pos_coord-i); while (i < tn->pos_next) dbg(lvl_debug,"%d:0x%x\n",j++,*i++); } if (mode != change_mode_append) tn->pos_coord+=move_offset; if (mode != change_mode_delete) { dbg(lvl_debug,"writing %d ints at offset %td\n",count*2,write_offset+tn->pos_coord_start-data); for (i = 0 ; i < count ; i++) { tn->pos_coord_start[write_offset++]=c[i].x; tn->pos_coord_start[write_offset++]=c[i].y; } } { int *i=tn->pos,j=0; dbg(lvl_debug,"After: pos_coord=%td\n",tn->pos_coord-i); while (i < tn->pos_next) dbg(lvl_debug,"%d:0x%x\n",j++,*i++); } return 1; } static int binfile_attr_set(void *priv_data, struct attr *attr, enum change_mode mode) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t,*tn,new; int offset,delta,move_len; int write_offset,move_offset,naoffset,coffset,oattr_len; int nattr_size,nattr_len,pad; int *data; { int *i=t->pos,j=0; dbg(lvl_debug,"Before: pos_attr=%td\n",t->pos_attr-i); while (i < t->pos_next) dbg(lvl_debug,"%d:0x%x\n",j++,*i++); } write_offset=0; naoffset=t->pos_attr-t->pos_attr_start; coffset=t->pos_coord-t->pos_coord_start; offset=0; oattr_len=0; if (!naoffset) { if (mode == change_mode_delete || mode == change_mode_modify) { dbg(lvl_error,"no attribute selected\n"); return 0; } if (mode == change_mode_append) naoffset=t->pos_next-t->pos_attr_start; } while (offset < naoffset) { oattr_len=le32_to_cpu(t->pos_attr_start[offset])+1; dbg(lvl_debug,"len %d\n",oattr_len); write_offset=offset; offset+=oattr_len; } move_len=t->pos_next-t->pos_attr_start-offset; move_offset=offset; switch (mode) { case change_mode_delete: nattr_size=0; nattr_len=0; pad=0; break; case change_mode_modify: case change_mode_prepend: case change_mode_append: nattr_size=attr_data_size(attr); pad=(4-(nattr_size%4))%4; nattr_len=(nattr_size+pad)/4+2; if (mode == change_mode_prepend) { move_offset=write_offset; move_len+=oattr_len; } if (mode == change_mode_append) { write_offset=move_offset; } break; default: return 0; } if (mode == change_mode_delete || mode == change_mode_modify) delta=nattr_len-oattr_len; else delta=nattr_len; dbg(lvl_debug,"delta %d oattr_len %d nattr_len %d\n",delta,oattr_len, nattr_len); data=binfile_item_dup(mr->m, &mr->item, t, delta > 0 ? delta:0); data[0]=cpu_to_le32(le32_to_cpu(data[0])+delta); new.pos=new.start=data; new.zipfile_num=t->zipfile_num; new.mode=2; push_tile(mr, &new, 0, 0); setup_pos(mr); tn=mr->t; tn->pos_coord=tn->pos_coord_start+coffset; tn->pos_attr=tn->pos_attr_start+offset; dbg(lvl_debug,"attr start %td offset %d\n",tn->pos_attr_start-data,offset); dbg(lvl_debug,"moving %d ints from offset %td to %td\n",move_len,tn->pos_attr_start+move_offset-data,tn->pos_attr_start+move_offset+delta-data); memmove(tn->pos_attr_start+move_offset+delta, tn->pos_attr_start+move_offset, move_len*4); if (mode != change_mode_append) tn->pos_attr+=delta; { int *i=tn->pos,j=0; dbg(lvl_debug,"After move: pos_attr=%td\n",tn->pos_attr-i); while (i < tn->pos_next) dbg(lvl_debug,"%d:0x%x\n",j++,*i++); } if (nattr_len) { int *nattr=tn->pos_attr_start+write_offset; dbg(lvl_debug,"writing %d ints at %td\n",nattr_len,nattr-data); nattr[0]=cpu_to_le32(nattr_len-1); nattr[1]=cpu_to_le32(attr->type); memcpy(nattr+2, attr_data_get(attr), nattr_size); memset((unsigned char *)(nattr+2)+nattr_size, 0, pad); } { int *i=tn->pos,j=0; dbg(lvl_debug,"After: pos_attr=%td\n",tn->pos_attr-i); while (i < tn->pos_next) dbg(lvl_debug,"After: pos_attr=%td\n",tn->pos_attr-i); while (i < tn->pos_next) dbg(lvl_debug,"%d:0x%x\n",j++,*i++); } return 1; } static struct item_methods methods_binfile = { binfile_coord_rewind, binfile_coord_get, binfile_attr_rewind, binfile_attr_get, NULL, binfile_attr_set, binfile_coord_set, }; static void push_tile(struct map_rect_priv *mr, struct tile *t, int offset, int length) { dbg_assert(mr->tile_depth < 8); mr->t=&mr->tiles[mr->tile_depth++]; *(mr->t)=*t; mr->t->pos=mr->t->pos_next=mr->t->start+offset; if (length == -1) length=le32_to_cpu(mr->t->pos[0])+1; if (length > 0) mr->t->end=mr->t->pos+length; } static int pop_tile(struct map_rect_priv *mr) { if (mr->tile_depth <= 1) return 0; if (mr->t->mode < 2) file_data_free(mr->m->fi, (unsigned char *)(mr->t->start)); #ifdef DEBUG_SIZE #if DEBUG_SIZE > 0 dbg(lvl_debug,"leave %d\n",mr->t->zipfile_num); #endif #endif mr->t=&mr->tiles[--mr->tile_depth-1]; return 1; } static int zipfile_to_tile(struct map_priv *m, struct zip_cd *cd, struct tile *t) { char buffer[1024]; struct zip_lfh *lfh; char *zipfn; struct file *fi; dbg(lvl_debug,"enter %p %p %p\n", m, cd, t); dbg(lvl_debug,"cd->zipofst=0x"LONGLONG_HEX_FMT "\n", binfile_cd_offset(cd)); t->start=NULL; t->mode=1; if (m->fis) fi=m->fis[cd->zipdsk]; else fi=m->fi; lfh=binfile_read_lfh(fi, binfile_cd_offset(cd)); zipfn=(char *)(file_data_read(fi,binfile_cd_offset(cd)+sizeof(struct zip_lfh), lfh->zipfnln)); strncpy(buffer, zipfn, lfh->zipfnln); buffer[lfh->zipfnln]='\0'; t->start=(int *)binfile_read_content(m, fi, binfile_cd_offset(cd), lfh); t->end=t->start+lfh->zipuncmp/4; t->fi=fi; file_data_free(fi, (unsigned char *)zipfn); file_data_free(fi, (unsigned char *)lfh); return t->start != NULL; } static int map_binfile_handle_redirect(struct map_priv *m) { char *location=file_http_header(m->http, "location"); if (!location) { m->redirect=0; return 0; } if (m->redirect) return 0; m->redirect=1; dbg(lvl_debug,"redirected from %s to %s\n",m->url,location); g_free(m->url); m->url=g_strdup(location); file_destroy(m->http); m->http=NULL; return 1; } static int map_binfile_http_request(struct map_priv *m, struct attr **attrs) { if (!m->http) { m->http=file_create(NULL, attrs); } else { file_request(m->http, attrs); } return 1; } static long long map_binfile_download_size(struct map_priv *m) { struct attr url={attr_url}; struct attr http_method={attr_http_method}; struct attr persistent={attr_persistent}; struct attr *attrs[4]; int size_ret; long long ret; void *data; do { attrs[0]=&url; url.u.str=m->url; attrs[1]=&http_method; http_method.u.str="HEAD"; persistent.u.num=1; attrs[2]=&persistent; attrs[3]=NULL; map_binfile_http_request(m, attrs); data=file_data_read_special(m->http, 0, &size_ret); g_free(data); if (size_ret < 0) return 0; } while (map_binfile_handle_redirect(m)); ret=file_size(m->http); dbg(lvl_debug,"file size "LONGLONG_FMT"\n",ret); return ret; } static int map_binfile_http_close(struct map_priv *m) { if (m->http) { file_destroy(m->http); m->http=NULL; } return 1; } static struct file * map_binfile_http_range(struct map_priv *m, long long offset, int size) { struct attr *attrs[4]; struct attr url={attr_url}; struct attr http_header={attr_http_header}; struct attr persistent={attr_persistent}; persistent.u.num=1; attrs[0]=&url; attrs[1]=&http_header; attrs[2]=&persistent; attrs[3]=NULL; url.u.str=m->url; http_header.u.str=g_strdup_printf("Range: bytes="LONGLONG_FMT"-"LONGLONG_FMT,offset, offset+size-1); map_binfile_http_request(m, attrs); g_free(http_header.u.str); return m->http; } static unsigned char * map_binfile_download_range(struct map_priv *m, long long offset, int size) { unsigned char *ret; int size_ret; struct file *http=map_binfile_http_range(m, offset, size); ret=file_data_read_special(http, size, &size_ret); if (size_ret != size) { dbg(lvl_debug,"size %d vs %d\n",size,size_ret); g_free(ret); return NULL; } return ret; } static struct zip_cd * download_cd(struct map_download *download) { struct map_priv *m=download->m; struct zip64_eoc *zip64_eoc=(struct zip64_eoc *)file_data_read(m->fi, 0, sizeof(*zip64_eoc)); struct zip_cd *cd=(struct zip_cd *)map_binfile_download_range(m, zip64_eoc->zip64eofst+download->zipfile*m->cde_size,m->cde_size); file_data_free(m->fi, (unsigned char *)zip64_eoc); dbg(lvl_debug,"needed cd, result %p\n",cd); return cd; } static int download_request(struct map_download *download) { struct attr url={attr_url}; struct attr http_header={attr_http_header}; struct attr persistent={attr_persistent}; struct attr *attrs[4]; if(!download->m->download_enabled) { dbg(lvl_error,"Tried downloading while it's not allowed\n"); return 0; } attrs[0]=&url; persistent.u.num=1; attrs[1]=&persistent; attrs[2]=NULL; if (strchr(download->m->url,'?')) { url.u.str=g_strdup_printf("%smemberid=%d",download->m->url,download->zipfile); download->dl_size=-1; } else { long long offset=binfile_cd_offset(download->cd_copy); int size=download->cd_copy->zipcsiz+sizeof(struct zip_lfh)+download->cd_copy->zipcfnl; url.u.str=g_strdup(download->m->url); http_header.u.str=g_strdup_printf("Range: bytes="LONGLONG_FMT"-"LONGLONG_FMT,offset,offset+size-1); attrs[2]=&http_header; attrs[3]=NULL; download->dl_size=size; } dbg(lvl_debug,"encountered missing tile %d %s(%s), Downloading %d bytes at "LONGLONG_FMT"\n",download->zipfile, url.u.str,(char *)(download->cd_copy+1), download->dl_size, download->offset); map_binfile_http_request(download->m, attrs); g_free(url.u.str); download->http=download->m->http; return 1; } static int download_start(struct map_download *download) { long long offset; struct zip_eoc *eoc; if (!download->cd->zipcensig) { download->cd_copy=download_cd(download); } else { download->cd_copy=g_malloc(download->m->cde_size); memcpy(download->cd_copy, download->cd, download->m->cde_size); } file_data_remove(download->file, (unsigned char *)download->cd); download->cd=NULL; offset=file_size(download->file); offset-=sizeof(struct zip_eoc); eoc=(struct zip_eoc *)file_data_read(download->file, offset, sizeof(struct zip_eoc)); download->zip_eoc=g_malloc(sizeof(struct zip_eoc)); memcpy(download->zip_eoc, eoc, sizeof(struct zip_eoc)); file_data_remove(download->file, (unsigned char *)eoc); download->start_offset=download->offset=offset; return download_request(download); } static int download_download(struct map_download *download) { int size=64*1024,size_ret; unsigned char *data; if (download->dl_size != -1 && size > download->dl_size) size=download->dl_size; if (!size) return 1; data=file_data_read_special(download->http, size, &size_ret); if (!download->read && download->m->http && map_binfile_handle_redirect(download->m)) { g_free(data); download_request(download); return 0; } dbg(lvl_debug,"got %d bytes writing at offset "LONGLONG_FMT"\n",size_ret,download->offset); if (size_ret <= 0) { g_free(data); return 1; } file_data_write(download->file, download->offset, size_ret, data); download->offset+=size_ret; download->read+=size_ret; download->dl_size-=size_ret; if (download->dl_size != -1) download->progress=download->read*100/(download->read+download->dl_size); return 0; } static int download_finish(struct map_download *download) { struct zip_lfh *lfh; char *lfh_filename; struct zip_cd_ext *ext; long long lfh_offset; file_data_write(download->file, download->offset, sizeof(struct zip_eoc), (void *)download->zip_eoc); lfh=(struct zip_lfh *)(file_data_read(download->file,download->start_offset, sizeof(struct zip_lfh))); ext=binfile_cd_ext(download->cd_copy); if (ext) ext->zipofst=download->start_offset; else download->cd_copy->zipofst=download->start_offset; download->cd_copy->zipcsiz=lfh->zipsize; download->cd_copy->zipcunc=lfh->zipuncmp; download->cd_copy->zipccrc=lfh->zipcrc; lfh_offset = binfile_cd_offset(download->cd_copy)+sizeof(struct zip_lfh); lfh_filename=(char *)file_data_read(download->file,lfh_offset,lfh->zipfnln); memcpy(download->cd_copy+1,lfh_filename,lfh->zipfnln); file_data_remove(download->file,(void *)lfh_filename); file_data_remove(download->file,(void *)lfh); file_data_write(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, binfile_cd_extra(download->cd_copy)+sizeof(struct zip_cd), (void *)download->cd_copy); file_data_flush(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, sizeof(struct zip_cd)); g_free(download->cd_copy); download->cd=(struct zip_cd *)(file_data_read(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, download->m->cde_size)); cd_to_cpu(download->cd); dbg(lvl_debug,"Offset %d\n",download->cd->zipofst); return 1; } static int download_planet_size(struct map_download *download) { download->size=map_binfile_download_size(download->m); dbg(lvl_debug,"Planet size "LONGLONG_FMT"\n",download->size); if (!download->size) return 0; return 1; } static int download_eoc(struct map_download *download) { download->zip64_eoc=(struct zip64_eoc *)map_binfile_download_range(download->m, download->size-98, 98); if (!download->zip64_eoc) return 0; download->zip64_eocl=(struct zip64_eocl *)(download->zip64_eoc+1); download->zip_eoc=(struct zip_eoc *)(download->zip64_eocl+1); if (download->zip64_eoc->zip64esig != zip64_eoc_sig || download->zip64_eocl->zip64lsig != zip64_eocl_sig || download->zip_eoc->zipesig != zip_eoc_sig) { dbg(lvl_error,"wrong signature on zip64_eoc downloaded from "LONGLONG_FMT"\n",download->size-98); g_free(download->zip64_eoc); return 0; } return 1; } static int download_directory_start(struct map_download *download) { download->http=map_binfile_http_range(download->m, download->zip64_eoc->zip64eofst, download->zip64_eoc->zip64ecsz); if (!download->http) return 0; return 1; } static int download_directory_do(struct map_download *download) { int count; for (count = 0 ; count < 100 ; count++) { int cd_xlen, size_ret; unsigned char *cd_data; struct zip_cd *cd; cd=(struct zip_cd *)file_data_read_special(download->http, sizeof(*cd), &size_ret); cd->zipcunc=0; dbg(lvl_debug,"size_ret=%d\n",size_ret); if (!size_ret) return 0; if (size_ret != sizeof(*cd) || cd->zipcensig != zip_cd_sig) { dbg(lvl_error,"error1 size=%d vs %zu\n",size_ret, sizeof(*cd)); return 0; } file_data_write(download->file, download->offset, sizeof(*cd), (unsigned char *)cd); download->offset+=sizeof(*cd); cd_xlen=cd->zipcfnl+cd->zipcxtl; cd_data=file_data_read_special(download->http, cd_xlen, &size_ret); if (size_ret != cd_xlen) { dbg(lvl_error,"error2 size=%d vs %d\n",size_ret,cd_xlen); return 0; } file_data_write(download->file, download->offset, cd_xlen, cd_data); download->offset+=cd_xlen; g_free(cd); g_free(cd_data); } return 1; } static int download_directory_finish(struct map_download *download) { download->http=NULL; return 1; } static int download_initial_finish(struct map_download *download) { download->zip64_eoc->zip64eofst=download->cd1offset; download->zip64_eocl->zip64lofst=download->offset; download->zip_eoc->zipeofst=download->cd1offset; #if 0 file_data_write(download->file, download->offset, sizeof(*download->zip64_eoc), (unsigned char *)download->zip64_eoc); download->offset+=sizeof(*download->zip64_eoc); file_data_write(download->file, download->offset, sizeof(*download->zip64_eocl), (unsigned char *)download->zip64_eocl); download->offset+=sizeof(*download->zip64_eocl); #endif file_data_write(download->file, download->offset, sizeof(*download->zip_eoc), (unsigned char *)download->zip_eoc); download->offset+=sizeof(*download->zip_eoc); g_free(download->zip64_eoc); download->zip64_eoc=NULL; return 1; } static void push_zipfile_tile_do(struct map_rect_priv *mr, struct zip_cd *cd, int zipfile, int offset, int length) { struct tile t; struct map_priv *m=mr->m; struct file *f=m->fi; dbg(lvl_debug,"enter %p %d\n", mr, zipfile); #ifdef DEBUG_SIZE #if DEBUG_SIZE > 0 { char filename[cd->zipcfnl+1]; memcpy(filename, cd+1, cd->zipcfnl); filename[cd->zipcfnl]='\0'; dbg(lvl_debug,"enter %d (%s) %d\n",zipfile, filename, cd->zipcunc); } #endif mr->size+=cd->zipcunc; #endif t.zipfile_num=zipfile; if (zipfile_to_tile(m, cd, &t)) push_tile(mr, &t, offset, length); file_data_free(f, (unsigned char *)cd); } static struct zip_cd * download(struct map_priv *m, struct map_rect_priv *mr, struct zip_cd *cd, int zipfile, int offset, int length, int async) { struct map_download *download; if(!m->download_enabled) return NULL; if (async == 2) { download=m->download; } else { download=g_new0(struct map_download, 1); if (mr) { download->m=m; download->mr=mr; download->file=m->fi; download->cd=cd; download->zipfile=zipfile; download->toffset=offset; download->tlength=length; download->state=1; } else { struct attr readwrite={attr_readwrite,{(void *)1}}; struct attr create={attr_create,{(void *)1}}; struct attr *attrs[3]; attrs[0]=&readwrite; attrs[1]=&create; attrs[2]=NULL; download->file=file_create(m->filename,attrs); download->m=m; download->state=4; } } if (async == 1) { m->download=download; g_free(m->progress); if (download->mr) m->progress=g_strdup_printf("Download Tile %d 0%%",download->zipfile); else m->progress=g_strdup_printf("Download Map Information 0%%"); callback_list_call_attr_0(m->cbl, attr_progress); return NULL; } for (;;) { dbg(lvl_debug,"state=%d\n",download->state); switch (download->state) { case 0: dbg(lvl_error,"error\n"); break; case 1: if (download_start(download)) download->state=2; else download->state=0; break; case 2: if (download_download(download)) download->state=3; else { g_free(m->progress); m->progress=g_strdup_printf("Download Tile %d %d%%",download->zipfile,download->progress); callback_list_call_attr_0(m->cbl, attr_progress); } break; case 3: if (download_finish(download)) { struct zip_cd *ret; g_free(m->progress); m->progress=g_strdup_printf("Download Tile %d 100%%",download->zipfile); callback_list_call_attr_0(m->cbl, attr_progress); if (async) { push_zipfile_tile_do(download->mr, download->cd, download->zipfile, download->toffset, download->tlength); ret=NULL; } else ret=download->cd; g_free(m->progress); m->progress=NULL; g_free(download); if (async) m->download=NULL; return ret; } else download->state=0; break; case 4: if (download_planet_size(download)) download->state=5; else download->state=0; break; case 5: g_free(m->progress); m->progress=g_strdup_printf("Download Map Information 50%%"); callback_list_call_attr_0(m->cbl, attr_progress); if (download_eoc(download)) download->state=6; else { dbg(lvl_error,"download of eoc failed\n"); download->state=0; } break; case 6: g_free(m->progress); m->progress=g_strdup_printf("Download Map Information 100%%"); callback_list_call_attr_0(m->cbl, attr_progress); if (download_directory_start(download)) download->state=7; else download->state=0; break; case 7: g_free(m->progress); m->progress=g_strdup_printf("Download Map Directory %d%%",(int)(download->offset*100/download->zip64_eoc->zip64ecsz)); callback_list_call_attr_0(m->cbl, attr_progress); if (!download_directory_do(download)) download->state=8; break; case 8: if (download_directory_finish(download)) download->state=9; else download->state=0; break; case 9: download_initial_finish(download); m->fi=download->file; g_free(m->progress); m->progress=NULL; g_free(download); if (async) m->download=NULL; map_binfile_open(m); break; } if (async) return NULL; } } static int push_zipfile_tile(struct map_rect_priv *mr, int zipfile, int offset, int length, int async) { struct map_priv *m=mr->m; struct file *f=m->fi; long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; struct zip_cd *cd=(struct zip_cd *)(file_data_read(f, cdoffset + zipfile*m->cde_size, m->cde_size)); dbg(lvl_debug,"read from "LONGLONG_FMT" %d bytes\n",cdoffset + zipfile*m->cde_size, m->cde_size); cd_to_cpu(cd); if (!cd->zipcunc && m->url) { cd=download(m, mr, cd, zipfile, offset, length, async); if (!cd) return 1; } push_zipfile_tile_do(mr, cd, zipfile, offset, length); return 0; } static struct map_rect_priv * map_rect_new_binfile_int(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; binfile_check_version(map); dbg(lvl_debug,"map_rect_new_binfile\n"); if (!map->fi && !map->url) return NULL; map_binfile_http_close(map); mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->sel=sel; mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_binfile; mr->item.priv_data=mr; return mr; } static void tile_bbox(char *tile, int len, struct coord_rect *r) { struct coord c; int overlap=1; int xo,yo; struct coord_rect world_bbox = { { WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MAX_Y}, /* left upper corner */ { WORLD_BOUNDINGBOX_MAX_X, WORLD_BOUNDINGBOX_MIN_Y}, /* right lower corner */ }; *r=world_bbox; while (len) { c.x=(r->lu.x+r->rl.x)/2; c.y=(r->lu.y+r->rl.y)/2; xo=(r->rl.x-r->lu.x)*overlap/100; yo=(r->lu.y-r->rl.y)*overlap/100; switch (*tile) { case 'a': r->lu.x=c.x-xo; r->rl.y=c.y-yo; break; case 'b': r->rl.x=c.x+xo; r->rl.y=c.y-yo; break; case 'c': r->lu.x=c.x-xo; r->lu.y=c.y+yo; break; case 'd': r->rl.x=c.x+xo; r->lu.y=c.y+yo; break; default: return; } tile++; len--; } } static int map_download_selection_check(struct zip_cd *cd, struct map_selection *sel) { struct coord_rect cd_rect; if (cd->zipcunc) return 0; tile_bbox((char *)(cd+1), cd->zipcfnl, &cd_rect); while (sel) { if (coord_rect_overlap(&cd_rect, &sel->u.c_rect)) return 1; sel=sel->next; } return 0; } static void map_download_selection(struct map_priv *m, struct map_rect_priv *mr, struct map_selection *sel) { int i; struct zip_cd *cd; for (i = 0 ; i < m->zip_members ; i++) { cd=binfile_read_cd(m, m->cde_size*i, -1); if (map_download_selection_check(cd, sel)) download(m, mr, cd, i, 0, 0, 0); file_data_free(m->fi, (unsigned char *)cd); } } static struct map_rect_priv * map_rect_new_binfile(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr=map_rect_new_binfile_int(map, sel); struct tile t; dbg(lvl_debug,"zip_members=%d\n", map->zip_members); if (map->url && map->fi && sel && sel->order == 255) { map_download_selection(map, mr, sel); } if (map->eoc) mr->status=1; else { unsigned char *d; if (map->fi) { d=file_data_read(map->fi, 0, map->fi->size); t.start=(int *)d; t.end=(int *)(d+map->fi->size); t.fi=map->fi; t.zipfile_num=0; t.mode=0; push_tile(mr, &t, 0, 0); } else if (map->url && !map->download) { download(map, NULL, NULL, 0, 0, 0, 1); mr->status=1; } } return mr; } static void write_changes_do(gpointer key, gpointer value, gpointer user_data) { struct binfile_hash_entry *entry=key; FILE *out=user_data; if (entry->flags) { entry->flags=0; fwrite(entry, sizeof(*entry)+(le32_to_cpu(entry->data[0])+1)*4, 1, out); dbg(lvl_debug,"yes\n"); } } static void write_changes(struct map_priv *m) { FILE *changes; char *changes_file; if (!m->changes) return; changes_file=g_strdup_printf("%s.log",m->filename); changes=fopen(changes_file,"ab"); g_hash_table_foreach(m->changes, write_changes_do, changes); fclose(changes); g_free(changes_file); } static void load_changes(struct map_priv *m) { FILE *changes; char *changes_file; struct binfile_hash_entry entry,*e; int size; changes_file=g_strdup_printf("%s.log",m->filename); changes=fopen(changes_file,"rb"); if (! changes) { g_free(changes_file); return; } m->changes=g_hash_table_new_full(binfile_hash_entry_hash, binfile_hash_entry_equal, g_free, NULL); while (fread(&entry, sizeof(entry), 1, changes) == 1) { if (fread(&size, sizeof(size), 1, changes) != 1) break; e=g_malloc(sizeof(struct binfile_hash_entry)+(le32_to_cpu(size)+1)*4); *e=entry; e->data[0]=size; if (fread(e->data+1, le32_to_cpu(size)*4, 1, changes) != 1) break; g_hash_table_replace(m->changes, e, e); } fclose(changes); g_free(changes_file); } static void map_rect_destroy_binfile(struct map_rect_priv *mr) { write_changes(mr->m); while (pop_tile(mr)); #ifdef DEBUG_SIZE dbg(lvl_debug,"size=%d kb\n",mr->size/1024); #endif if (mr->tiles[0].fi && mr->tiles[0].start) file_data_free(mr->tiles[0].fi, (unsigned char *)(mr->tiles[0].start)); g_free(mr->url); map_binfile_http_close(mr->m); g_free(mr); } static void setup_pos(struct map_rect_priv *mr) { int size,coord_size; struct tile *t=mr->t; size=le32_to_cpu(t->pos[0]); if (size > 1024*1024 || size < 0) { dbg(lvl_debug,"size=0x%x\n", size); #if 0 fprintf(stderr,"offset=%d\n", (unsigned char *)(mr->pos)-mr->m->f->begin); #endif dbg(lvl_debug,"size error\n"); } t->pos_next=t->pos+size+1; mr->item.type=le32_to_cpu(t->pos[1]); coord_size=le32_to_cpu(t->pos[2]); t->pos_coord_start=t->pos+3; t->pos_attr_start=t->pos_coord_start+coord_size; } static int selection_contains(struct map_selection *sel, struct coord_rect *r, struct range *mima) { int order; if (! sel) return 1; while (sel) { if (coord_rect_overlap(r, &sel->u.c_rect)) { order=sel->order; dbg(lvl_debug,"min %d max %d order %d\n", mima->min, mima->max, order); if (!mima->min && !mima->max) return 1; if (order >= mima->min && order <= mima->max) return 1; } sel=sel->next; } return 0; } static void map_parse_country_binfile(struct map_rect_priv *mr) { struct attr at; if (!binfile_attr_get(mr->item.priv_data, attr_country_id, &at)) return; if( at.u.num != mr->country_id) return; if (!binfile_attr_get(mr->item.priv_data, attr_zipfile_ref, &at)) return; if(mr->msp) { struct attr *search=&mr->msp->search; if(search->type==attr_town_name || search->type==attr_district_name || search->type==attr_town_or_district_name) { struct attr af, al; if(binfile_attr_get(mr->item.priv_data, attr_first_key, &af)) { if(linguistics_compare(af.u.str,search->u.str,linguistics_cmp_partial)>0) { dbg(lvl_debug,"Skipping index item with first_key='%s'\n", af.u.str); return; } } if(binfile_attr_get(mr->item.priv_data, attr_last_key, &al)) { if(linguistics_compare(al.u.str,search->u.str,linguistics_cmp_partial)<0) { dbg(lvl_debug,"Skipping index item with first_key='%s', last_key='%s'\n", af.u.str, al.u.str); return; } } } } push_zipfile_tile(mr, at.u.num, 0, 0, 0); } static int map_parse_submap(struct map_rect_priv *mr, int async) { struct coord_rect r; struct coord c[2]; struct attr at; struct range mima; if (binfile_coord_get(mr->item.priv_data, c, 2) != 2) return 0; r.lu.x=c[0].x; r.lu.y=c[1].y; r.rl.x=c[1].x; r.rl.y=c[0].y; if (!binfile_attr_get(mr->item.priv_data, attr_order, &at)) return 0; #if __BYTE_ORDER == __BIG_ENDIAN mima.min=le16_to_cpu(at.u.range.max); mima.max=le16_to_cpu(at.u.range.min); #else mima=at.u.range; #endif if (!mr->m->eoc || !selection_contains(mr->sel, &r, &mima)) return 0; if (!binfile_attr_get(mr->item.priv_data, attr_zipfile_ref, &at)) return 0; dbg(lvl_debug,"pushing zipfile %ld from %d\n", at.u.num, mr->t->zipfile_num); return push_zipfile_tile(mr, at.u.num, 0, 0, async); } static int push_modified_item(struct map_rect_priv *mr) { struct item_id id; struct binfile_hash_entry *entry; id.id_hi=mr->item.id_hi; id.id_lo=mr->item.id_lo; entry=g_hash_table_lookup(mr->m->changes, &id); if (entry) { struct tile tn; tn.pos_next=tn.pos=tn.start=entry->data; tn.zipfile_num=mr->item.id_hi; tn.mode=2; tn.end=tn.start+le32_to_cpu(entry->data[0])+1; push_tile(mr, &tn, 0, 0); return 1; } return 0; } static struct item * map_rect_get_item_binfile(struct map_rect_priv *mr) { struct tile *t; struct map_priv *m=mr->m; if (m->download) { download(m, NULL, NULL, 0, 0, 0, 2); return &busy_item; } if (mr->status == 1) { mr->status=0; if (push_zipfile_tile(mr, m->zip_members-1, 0, 0, 1)) return &busy_item; } for (;;) { t=mr->t; if (! t) return NULL; t->pos=t->pos_next; if (t->pos >= t->end) { if (pop_tile(mr)) continue; return NULL; } setup_pos(mr); binfile_coord_rewind(mr); binfile_attr_rewind(mr); if ((mr->item.type == type_submap) && (!mr->country_id)) { if (map_parse_submap(mr, 1)) return &busy_item; continue; } if (t->mode != 2) { mr->item.id_hi=t->zipfile_num; mr->item.id_lo=t->pos-t->start; if (mr->m->changes && push_modified_item(mr)) continue; } if (mr->country_id) { if (mr->item.type == type_countryindex) { map_parse_country_binfile(mr); } if (item_is_town(mr->item)) { return &mr->item; } else { continue; } } return &mr->item; } } static struct item * map_rect_get_item_byid_binfile(struct map_rect_priv *mr, int id_hi, int id_lo) { struct tile *t; if (mr->m->eoc) { while (pop_tile(mr)); push_zipfile_tile(mr, id_hi, 0, 0, 0); } t=mr->t; t->pos=t->start+id_lo; mr->item.id_hi=id_hi; mr->item.id_lo=id_lo; if (mr->m->changes) push_modified_item(mr); setup_pos(mr); binfile_coord_rewind(mr); binfile_attr_rewind(mr); return &mr->item; } static int binmap_search_by_index(struct map_priv *map, struct item *item, struct map_rect_priv **ret) { struct attr zipfile_ref; int *data; if (!item) { *ret=NULL; return 0; } if (item_attr_get(item, attr_item_id, &zipfile_ref)) { data=zipfile_ref.u.data; *ret=map_rect_new_binfile_int(map, NULL); push_zipfile_tile(*ret, le32_to_cpu(data[0]), le32_to_cpu(data[1]), -1, 0); return 3; } if (item_attr_get(item, attr_zipfile_ref, &zipfile_ref)) { *ret=map_rect_new_binfile_int(map, NULL); push_zipfile_tile(*ret, zipfile_ref.u.num, 0, 0, 0); return 1; } if (item_attr_get(item, attr_zipfile_ref_block, &zipfile_ref)) { data=zipfile_ref.u.data; *ret=map_rect_new_binfile_int(map, NULL); push_zipfile_tile(*ret, le32_to_cpu(data[0]), le32_to_cpu(data[1]), le32_to_cpu(data[2]), 0); return 2; } *ret=NULL; return 0; } static struct map_rect_priv * binmap_search_street_by_place(struct map_priv *map, struct item *town, struct coord *c, struct map_selection *sel, GList **boundaries) { struct attr town_name, poly_town_name; struct map_rect_priv *map_rec2; struct item *place; int found=0; if (!item_attr_get(town, attr_label, &town_name)) return NULL; sel->range = item_range_all; sel->order = 18; sel->next = NULL; sel->u.c_rect.lu=*c; sel->u.c_rect.rl=*c; map_rec2=map_rect_new_binfile(map, sel); while ((place=map_rect_get_item_binfile(map_rec2))) { if (item_is_poly_place(*place) && item_attr_get(place, attr_label, &poly_town_name) && !strcmp(poly_town_name.u.str,town_name.u.str)) { struct coord *c; int i,count; struct geom_poly_segment *bnd; count=binfile_coord_left(map_rec2); c=g_new(struct coord,count); found=1; item_coord_get(place, c, count); for (i = 0 ; i < count ; i++) coord_rect_extend(&sel->u.c_rect, &c[i]); bnd=g_new(struct geom_poly_segment,1); bnd->first=c; bnd->last=c+count-1; bnd->type=geom_poly_segment_type_way_outer; *boundaries=g_list_prepend(*boundaries,bnd); } } map_rect_destroy_binfile(map_rec2); if (found) return map_rect_new_binfile(map, sel); return NULL; } static int binmap_get_estimated_town_size(struct item *town) { int size = 10000; switch (town->type) { case type_town_label_1e5: case type_town_label_5e4: case type_town_label_2e4: case type_district_label_1e5: case type_district_label_5e4: case type_district_label_2e4: size = 5000; break; case type_town_label_1e4: case type_town_label_5e3: case type_town_label_2e3: case type_district_label_1e4: case type_district_label_5e3: case type_district_label_2e3: size = 2500; break; case type_town_label_1e3: case type_town_label_5e2: case type_town_label_2e2: case type_town_label_1e2: case type_town_label_5e1: case type_town_label_2e1: case type_town_label_1e1: case type_town_label_5e0: case type_town_label_2e0: case type_town_label_1e0: case type_town_label_0e0: case type_district_label_1e3: case type_district_label_5e2: case type_district_label_2e2: case type_district_label_1e2: case type_district_label_5e1: case type_district_label_2e1: case type_district_label_1e1: case type_district_label_5e0: case type_district_label_2e0: case type_district_label_1e0: case type_district_label_0e0: size = 1000; break; default: break; } return size; } static struct map_rect_priv * binmap_search_street_by_estimate(struct map_priv *map, struct item *town, struct coord *c, struct map_selection *sel) { int size = binmap_get_estimated_town_size(town); sel->u.c_rect.lu.x = c->x-size; sel->u.c_rect.lu.y = c->y+size; sel->u.c_rect.rl.x = c->x+size; sel->u.c_rect.rl.y = c->y-size; return map_rect_new_binfile(map, sel); } static struct map_rect_priv * binmap_search_housenumber_by_estimate(struct map_priv *map, struct coord *c, struct map_selection *sel) { int size = 400; sel->u.c_rect.lu.x = c->x-size; sel->u.c_rect.lu.y = c->y+size; sel->u.c_rect.rl.x = c->x+size; sel->u.c_rect.rl.y = c->y-size; sel->range = item_range_all; sel->order = 18; return map_rect_new_binfile(map, sel); } static int binmap_get_estimated_boundaries (struct item *town, GList **boundaries) { int size = binmap_get_estimated_town_size(town); struct coord tc; if (item_coord_get(town, &tc, 1)) { struct geom_poly_segment *bnd; struct coord *c; c=g_new(struct coord,5); bnd=g_new(struct geom_poly_segment,1); c[0].x = tc.x + size; c[0].y = tc.y - size; c[1].x = tc.x - size; c[1].y = tc.y - size; c[2].x = tc.x - size; c[2].y = tc.y + size; c[3].x = tc.x + size; c[3].y = tc.y + size; c[4].x = c[0].x; c[4].y = c[0].y; bnd->first=&c[0]; bnd->last=&c[4]; bnd->type=geom_poly_segment_type_way_outer; *boundaries=g_list_prepend(*boundaries,bnd); return 1; } return 0; } static struct map_search_priv * binmap_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) { struct map_rect_priv *map_rec; struct map_search_priv *msp=g_new0(struct map_search_priv, 1); struct item *town; int idx; msp->search = *search; msp->partial = partial; if(ATTR_IS_STRING(msp->search.type)) msp->search.u.str=linguistics_casefold(search->u.str); /* * NOTE: If you implement search for other attributes than attr_town_name and attr_street_name, * please update this comment and the documentation for map_search_new() in map.c */ switch (search->type) { case attr_country_name: break; case attr_town_name: case attr_town_or_district_name: map_rec = map_rect_new_binfile(map, NULL); if (!map_rec) break; map_rec->country_id = item->id_lo; map_rec->msp = msp; msp->mr = map_rec; return msp; break; case attr_town_postal: break; case attr_street_name: if (! item->map) break; if (!map_priv_is(item->map, map)) break; map_rec = map_rect_new_binfile(map, NULL); town = map_rect_get_item_byid_binfile(map_rec, item->id_hi, item->id_lo); if (town) { struct coord c; if (binmap_search_by_index(map, town, &msp->mr)) msp->mode = 1; else { map->last_searched_town_id_hi = town->id_hi; map->last_searched_town_id_lo = town->id_lo; if (item_coord_get(town, &c, 1)) { if ((msp->mr=binmap_search_street_by_place(map, town, &c, &msp->ms, &msp->boundaries))) msp->mode = 2; else { msp->mr=binmap_search_street_by_estimate(map, town, &c, &msp->ms); msp->mode = 3; } } } map_rect_destroy_binfile(map_rec); if (!msp->mr) break; return msp; } map_rect_destroy_binfile(map_rec); break; case attr_house_number: dbg(lvl_debug,"case house_number"); if (! item->map) break; if (!map_priv_is(item->map, map)) break; msp->map=map; msp->mr_item = map_rect_new_binfile(map, NULL); msp->item = map_rect_get_item_byid_binfile(msp->mr_item, item->id_hi, item->id_lo); idx=binmap_search_by_index(map, msp->item, &msp->mr); if (idx) msp->mode = 1; else { struct coord c; if (item_coord_get(msp->item, &c, 1)) { struct attr attr; map_rec = map_rect_new_binfile(map, NULL); town = map_rect_get_item_byid_binfile(map_rec, map->last_searched_town_id_hi, map->last_searched_town_id_lo); if (town) msp->mr = binmap_search_street_by_place(map, town, &c, &msp->ms, &msp->boundaries); if (msp->boundaries) dbg(lvl_debug, "using map town boundaries\n"); if (!msp->boundaries && town) { binmap_get_estimated_boundaries(town, &msp->boundaries); if (msp->boundaries) dbg(lvl_debug, "using estimated boundaries\n"); } map_rect_destroy_binfile(map_rec); /* start searching in area around the street segment even if town boundaries are available */ msp->mr=binmap_search_housenumber_by_estimate(map, &c, &msp->ms); msp->mode = 2; msp->rect_new=msp->ms.u.c_rect; if(item_attr_get(msp->item, attr_street_name, &attr)) msp->parent_name=g_strdup(attr.u.str); dbg(lvl_debug,"pn=%s\n",msp->parent_name); } } if (idx != 3) { map_rect_destroy_binfile(msp->mr_item); msp->mr_item=NULL; } if (!msp->mr) { break; } return msp; default: break; } if(ATTR_IS_STRING(msp->search.type)) g_free(msp->search.u.str); g_free(msp); return NULL; } struct duplicate { struct coord c; char str[0]; }; static guint duplicate_hash(gconstpointer key) { const struct duplicate *d=key; return d->c.x^d->c.y^g_str_hash(d->str); } static gboolean duplicate_equal(gconstpointer a, gconstpointer b) { const struct duplicate *da=a; const struct duplicate *db=b; return (da->c.x == db->c.x && da->c.y == db->c.y && g_str_equal(da->str,db->str)); } /** * @brief Test an item if it's duplicate. If it's not a duplicate, return new struct duplicate to be duplicate_insert()'ed. * @param msp pointer to private map search data * @param item item to check * @param attr_type * returns - pointer to new struct duplicate, if this item is not already exist in hash * - NULL if this item already exists in duplicate hash or doesnt have an attr_type attr; */ static struct duplicate* duplicate_test(struct map_search_priv *msp, struct item *item, enum attr_type attr_type) { struct attr attr; int len; char *buffer; struct duplicate *d; if (!msp->search_results) msp->search_results = g_hash_table_new_full(duplicate_hash, duplicate_equal, g_free, NULL); binfile_attr_rewind(item->priv_data); if (!item_attr_get(item, attr_type, &attr)) return NULL; len=sizeof(struct coord)+strlen(attr.u.str)+1; buffer=g_alloca(sizeof(char)*len); d=(struct duplicate *)buffer; if (!item_coord_get(item, &d->c, 1)) { d->c.x=0; d->c.y=0; } strcpy(d->str, attr.u.str); binfile_coord_rewind(item->priv_data); binfile_attr_rewind(item->priv_data); if (!g_hash_table_lookup(msp->search_results, d)) { struct duplicate *dr=g_malloc(len); memcpy(dr, d, len); return dr; } return NULL; } /** * @brief Insert struct duplicate item into the duplicate hash. * @param msp pointer to private map search data * @param duplicate Duplicate info to insert */ static void duplicate_insert(struct map_search_priv *msp, struct duplicate *d) { g_hash_table_insert(msp->search_results, d, GINT_TO_POINTER(1)); } /** * @brief Check if item is dupicate and update duplicate hash if needed. * @param msp pointer to private map search data * @param item item to check * @param attr_type * @returns 0 if item is not a duplicate * 1 if item is duplicate or doesn't have required attr_type attribute */ static int duplicate(struct map_search_priv *msp, struct item *item, enum attr_type attr_type) { struct duplicate *d=duplicate_test(msp, item, attr_type); if(!d) return 1; duplicate_insert(msp,d); return 0; } static int item_inside_poly_list(struct item *it, GList *l) { while(l) { struct geom_poly_segment *p=l->data; int count=p->last-p->first+1; struct coord c; int ccount; item_coord_rewind(it); ccount=binfile_coord_left(it->priv_data); if(ccount==1) item_coord_get(it,&c,1); else if(ccount==2) { struct coord c2; item_coord_get(it,&c,1); item_coord_get(it,&c2,1); c.x=(c.x+c2.x)/2; c.y=(c.y+c2.y)/2; } else { if(ccount>3) ccount/=2; else ccount=2; while(--ccount>0) item_coord_get(it,&c,1); } if(geom_poly_point_inside(p->first,count,&c)) return 1; l=g_list_next(l); } return 0; } static struct item * binmap_search_get_item(struct map_search_priv *map_search) { struct item* it; struct attr at; enum linguistics_cmp_mode mode=(map_search->partial?linguistics_cmp_partial:0); for (;;) { while ((it = map_rect_get_item_binfile(map_search->mr))) { int has_house_number=0; switch (map_search->search.type) { case attr_town_name: case attr_district_name: case attr_town_or_district_name: if (map_search->mr->tile_depth > 1 && item_is_town(*it) && map_search->search.type != attr_district_name) { if (binfile_attr_get(it->priv_data, attr_town_name_match, &at) || binfile_attr_get(it->priv_data, attr_town_name, &at)) { if (!linguistics_compare(at.u.str, map_search->search.u.str, mode) && !duplicate(map_search, it, attr_town_name)) return it; } } if (map_search->mr->tile_depth > 1 && item_is_district(*it) && map_search->search.type != attr_town_name) { if (binfile_attr_get(it->priv_data, attr_district_name_match, &at) || binfile_attr_get(it->priv_data, attr_district_name, &at)) { if (!linguistics_compare(at.u.str, map_search->search.u.str, mode) && !duplicate(map_search, it, attr_town_name)) return it; } } break; case attr_street_name: if (map_search->mode == 1) { if (binfile_attr_get(it->priv_data, attr_street_name_match, &at) || binfile_attr_get(it->priv_data, attr_street_name, &at)) { if (!linguistics_compare(at.u.str, map_search->search.u.str, mode) && !duplicate(map_search, it, attr_street_name)) { return it; } } continue; } if (item_is_street(*it)) { struct attr at; if (!map_selection_contains_item_rect(map_search->mr->sel, it)) break; if(binfile_attr_get(it->priv_data, attr_label, &at)) { struct coord c[128]; struct duplicate *d; /* Extracting all coords here makes duplicate_new() not consider them (we don't want all * street segments to be reported as separate streets). */ while(item_coord_get(it,c,128)>0); d=duplicate_test(map_search, it, attr_label); if(!d) break; if(linguistics_compare(at.u.str, map_search->search.u.str, mode|linguistics_cmp_expand|linguistics_cmp_words)) { /* Remember this non-matching street name in duplicate hash to skip name * comparison for its following segments */ duplicate_insert(map_search, d); break; } if(map_search->boundaries && !item_inside_poly_list(it,map_search->boundaries)) { /* Other segments may fit the town poly. Do not update hash for now. */ g_free(d); break; } duplicate_insert(map_search, d); item_coord_rewind(it); return it; } } break; case attr_house_number: has_house_number=binfile_attr_get(it->priv_data, attr_house_number, &at); if ((has_house_number || it->type == type_house_number_interpolation_even || it->type == type_house_number_interpolation_odd || it->type == type_house_number_interpolation_all || (map_search->mode == 1 && item_is_street(*it))|| it->type == type_house_number) && !(map_search->boundaries && !item_inside_poly_list(it,map_search->boundaries))) { if (has_house_number) { struct attr at2; if ((binfile_attr_get(it->priv_data, attr_street_name, &at2) || map_search->mode!=2) && !linguistics_compare(at.u.str, map_search->search.u.str, mode) && !strcmp(at2.u.str, map_search->parent_name)) { if (!duplicate(map_search, it, attr_house_number)) { binfile_attr_rewind(it->priv_data); return it; } } } else { struct attr at2; if ((binfile_attr_get(it->priv_data, attr_street_name, &at2) || map_search->mode!=2) && !strcmp(at2.u.str, map_search->parent_name)) { if (!duplicate(map_search, it, attr_house_number_interpolation_no_ends_incrmt_2)) { binfile_attr_rewind(it->priv_data); return it; } else if (!duplicate(map_search, it, attr_house_number_interpolation_no_ends_incrmt_1)) { binfile_attr_rewind(it->priv_data); return it; } } else { if (!( it->type == type_house_number_interpolation_even || it->type == type_house_number_interpolation_odd || it->type == type_house_number_interpolation_all)) return it; } } } else if( item_is_street(*it) && map_search->mode==2 && map_search->parent_name && binfile_attr_get(it->priv_data, attr_street_name, &at) && !strcmp(at.u.str, map_search->parent_name) ) { /* If matching street segment found, prepare to expand house number search region +100m around each way point */ if (!(map_search->boundaries && !item_inside_poly_list(it,map_search->boundaries))) { struct coord c; while(item_coord_get(it,&c,1)) { c.x-=100; c.y-=100; coord_rect_extend(&map_search->rect_new,&c); c.x+=200; c.y+=200; coord_rect_extend(&map_search->rect_new,&c); } } } continue; default: return NULL; } } if(map_search->search.type==attr_house_number && map_search->mode==2 && map_search->parent_name) { /* For unindexed house number search, check if street segments extending possible housenumber locations were found */ if(map_search->ms.u.c_rect.lu.x!=map_search->rect_new.lu.x || map_search->ms.u.c_rect.lu.y!=map_search->rect_new.lu.y || map_search->ms.u.c_rect.rl.x!=map_search->rect_new.rl.x || map_search->ms.u.c_rect.rl.y!=map_search->rect_new.rl.y) { map_search->ms.u.c_rect=map_search->rect_new; map_rect_destroy_binfile(map_search->mr); map_search->mr=map_rect_new_binfile(map_search->map, &map_search->ms); dbg(lvl_debug,"Extended house number search region to %d x %d, restarting...\n",map_search->ms.u.c_rect.rl.x - map_search->ms.u.c_rect.lu.x, map_search->ms.u.c_rect.lu.y-map_search->ms.u.c_rect.rl.y); continue; } } if (!map_search->mr_item) return NULL; map_rect_destroy_binfile(map_search->mr); if (!binmap_search_by_index(map_search->map, map_search->item, &map_search->mr)) return NULL; } } static void binmap_search_destroy(struct map_search_priv *ms) { if (ms->search_results) g_hash_table_destroy(ms->search_results); if(ATTR_IS_STRING(ms->search.type)) g_free(ms->search.u.str); if(ms->parent_name) g_free(ms->parent_name); if (ms->mr_item) map_rect_destroy_binfile(ms->mr_item); if (ms->mr) map_rect_destroy_binfile(ms->mr); while(ms->boundaries) { geom_poly_segment_destroy(ms->boundaries->data); ms->boundaries=g_list_delete_link(ms->boundaries,ms->boundaries); } g_free(ms); } static int binmap_get_attr(struct map_priv *m, enum attr_type type, struct attr *attr) { attr->type=type; switch (type) { case attr_map_release: if (m->map_release) { attr->u.str=m->map_release; return 1; } break; case attr_progress: if (m->progress) { attr->u.str=m->progress; return 1; } default: break; } return 0; } static int binmap_set_attr(struct map_priv *map, struct attr *attr) { switch (attr->type) { case attr_update: map->download_enabled = attr->u.num; return 1; default: return 0; } } static struct map_methods map_methods_binfile = { projection_mg, "utf-8", map_destroy_binfile, map_rect_new_binfile, map_rect_destroy_binfile, map_rect_get_item_binfile, map_rect_get_item_byid_binfile, binmap_search_new, binmap_search_destroy, binmap_search_get_item, NULL, binmap_get_attr, binmap_set_attr, }; static int binfile_get_index(struct map_priv *m) { int len; int cde_index_size; int offset; struct zip_cd *cd; len = strlen("index"); cde_index_size = sizeof(struct zip_cd)+len; if (m->eoc64) offset = m->eoc64->zip64ecsz-cde_index_size; else offset = m->eoc->zipecsz-cde_index_size; cd = binfile_read_cd(m, offset, len); if (!cd) { cde_index_size+=sizeof(struct zip_cd_ext); if (m->eoc64) offset = m->eoc64->zip64ecsz-cde_index_size; else offset = m->eoc->zipecsz-cde_index_size; cd = binfile_read_cd(m, offset, len+sizeof(struct zip_cd_ext)); } if (cd) { if (cd->zipcfnl == len && !strncmp(cd->zipcfn, "index", len)) { m->index_offset=offset; m->index_cd=cd; return 1; } } offset=binfile_search_cd(m, 0, "index", 0, 0); if (offset == -1) return 0; cd=binfile_read_cd(m, offset, -1); if (!cd) return 0; m->index_offset=offset; m->index_cd=cd; return 1; } static int map_binfile_zip_setup(struct map_priv *m, char *filename, int mmap) { struct zip_cd *first_cd; int i; if (!(m->eoc=binfile_read_eoc(m->fi))) { dbg(lvl_error,"map file %s: unable to read eoc\n", filename); return 0; } dbg_assert(m->eoc->zipedsk == m->eoc->zipecen); if (m->eoc->zipedsk && strlen(filename) > 3) { char *tmpfilename=g_strdup(filename),*ext=tmpfilename+strlen(tmpfilename)-3; m->fis=g_new(struct file *,m->eoc->zipedsk); for (i = 0 ; i < m->eoc->zipedsk-1 ; i++) { sprintf(ext,"b%02d",i+1); m->fis[i]=file_create(tmpfilename, 0); if (mmap) file_mmap(m->fis[i]); } m->fis[m->eoc->zipedsk-1]=m->fi; g_free(tmpfilename); } dbg(lvl_debug,"num_disk %d\n",m->eoc->zipedsk); m->eoc64=binfile_read_eoc64(m->fi); if (!binfile_get_index(m)) { dbg(lvl_error,"map file %s: no index found\n", filename); return 0; } if (!(first_cd=binfile_read_cd(m, 0, 0))) { dbg(lvl_error,"map file %s: unable to get first cd\n", filename); return 0; } m->cde_size=sizeof(struct zip_cd)+first_cd->zipcfnl+first_cd->zipcxtl; m->zip_members=m->index_offset/m->cde_size+1; dbg(lvl_debug,"cde_size %d\n", m->cde_size); dbg(lvl_debug,"members %d\n",m->zip_members); file_data_free(m->fi, (unsigned char *)first_cd); if (mmap) file_mmap(m->fi); return 1; } #if 0 static int map_binfile_download_initial(struct map_priv *m) { struct attr readwrite={attr_readwrite,{(void *)1}}; struct attr create={attr_create,{(void *)1}}; struct attr *attrs[4]; struct file *out; long long woffset=0,planet_size; int size_ret; int cd1size,cdisize; long long cd1offset,cdioffset; struct zip64_eoc *zip64_eoc; struct zip64_eocl *zip64_eocl; struct zip_eoc *zip_eoc; struct zip_cd *cd1,*cdn,*cdi; int count,chunk,cdoffset=0; int mode=1; struct map_download *download=g_new0(struct map_download, 1); attrs[0]=&readwrite; attrs[1]=&create; attrs[2]=NULL; download->file=file_create(m->filename,attrs); download->m=m; download_planet_size(download); download_eoc(download); download_directory_start(download); while (download_directory_do(download)); download_directory_finish(download); download_initial_finish(download); m->fi=download->file; g_free(download); return 1; cd1size=sizeof(*cd1); cd1offset=zip64_eoc->zip64eofst; cd1=(struct zip_cd *)map_binfile_download_range(m, cd1offset, cd1size); if (!cd1) return 0; cd1size=sizeof(*cd1)+binfile_cd_extra(cd1); g_free(cd1); cd1=(struct zip_cd *)map_binfile_download_range(m, cd1offset, cd1size); if (!cd1) return 0; cd1->zipcunc=0; cdisize=sizeof(*cdi)+strlen("index")+cd1->zipcxtl; cdioffset=zip64_eoc->zip64eofst+zip64_eoc->zip64ecsz-cdisize; cdi=(struct zip_cd *)map_binfile_download_range(m, cdioffset, cdisize); if (!cdi) { g_free(cd1); return 0; } cdi->zipcunc=0; cdn=g_malloc0(cd1size*256); file_data_write(out, woffset, sizeof(*zip64_eoc), (unsigned char *)zip64_eoc); woffset+=sizeof(*zip64_eoc); cdoffset=woffset; file_data_write(out, woffset, cd1size, (unsigned char *)cd1); woffset+=cd1size; count=(cdioffset-cd1offset)/cd1size-1; while (count > 0) { if (count > 256) chunk=256; else chunk=count; file_data_write(out, woffset, cd1size*chunk, (unsigned char *)cdn); woffset+=cd1size*chunk; count-=chunk; } g_free(cdn); g_free(cd1); file_data_write(out, woffset, cdisize, (unsigned char *)cdi); woffset+=cdisize; } #endif static int map_binfile_open(struct map_priv *m) { int *magic; struct map_rect_priv *mr; struct item *item; struct attr attr; struct attr readwrite={attr_readwrite, {(void *)1}}; struct attr *attrs[]={&readwrite, NULL}; dbg(lvl_debug,"file_create %s\n", m->filename); m->fi=file_create(m->filename, m->url?attrs:NULL); if (! m->fi && m->url) return 0; if (! m->fi) { dbg(lvl_error,"Failed to load '%s'\n", m->filename); return 0; } if (m->check_version) m->version=file_version(m->fi, m->check_version); magic=(int *)file_data_read(m->fi, 0, 4); if (!magic) { file_destroy(m->fi); m->fi=NULL; return 0; } *magic = le32_to_cpu(*magic); if (*magic == zip_lfh_sig || *magic == zip_split_sig || *magic == zip_cd_sig || *magic == zip64_eoc_sig) { if (!map_binfile_zip_setup(m, m->filename, m->flags & 1)) { dbg(lvl_error,"invalid file format for '%s'\n", m->filename); file_destroy(m->fi); m->fi=NULL; return 0; } } else if (*magic == zip_lfh_sig_rev || *magic == zip_split_sig_rev || *magic == zip_cd_sig_rev || *magic == zip64_eoc_sig_rev) { dbg(lvl_error,"endianness mismatch for '%s'\n", m->filename); file_destroy(m->fi); m->fi=NULL; return 0; } else file_mmap(m->fi); file_data_free(m->fi, (unsigned char *)magic); m->cachedir=g_strdup("/tmp/navit"); m->map_version=0; mr=map_rect_new_binfile(m, NULL); if (mr) { while ((item=map_rect_get_item_binfile(mr)) == &busy_item); if (item && item->type == type_map_information) { if (binfile_attr_get(item->priv_data, attr_version, &attr)) m->map_version=attr.u.num; if (binfile_attr_get(item->priv_data, attr_map_release, &attr)) m->map_release=g_strdup(attr.u.str); if (m->url && binfile_attr_get(item->priv_data, attr_url, &attr)) { dbg(lvl_debug,"url config %s map %s\n",m->url,attr.u.str); if (strcmp(m->url, attr.u.str)) m->update_available=1; g_free(m->url); m->url=g_strdup(attr.u.str); } } map_rect_destroy_binfile(mr); if (m->map_version >= 16) { dbg(lvl_error,"%s: This map is incompatible with your navit version. Please update navit. (map version %d)\n", m->filename, m->map_version); return 0; } } return 1; } static void map_binfile_close(struct map_priv *m) { int i; file_data_free(m->fi, (unsigned char *)m->index_cd); file_data_free(m->fi, (unsigned char *)m->eoc); file_data_free(m->fi, (unsigned char *)m->eoc64); g_free(m->cachedir); g_free(m->map_release); if (m->fis) { for (i = 0 ; i < m->eoc->zipedsk ; i++) { file_destroy(m->fis[i]); } } else file_destroy(m->fi); } static void map_binfile_destroy(struct map_priv *m) { g_free(m->filename); g_free(m->url); g_free(m->progress); g_free(m); } static void binfile_check_version(struct map_priv *m) { int version=-1; if (!m->check_version) return; if (m->fi) version=file_version(m->fi, m->check_version); if (version != m->version) { if (m->fi) map_binfile_close(m); map_binfile_open(m); } } static struct map_priv * map_new_binfile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); struct attr *check_version,*map_pass,*flags,*url,*download_enabled; struct file_wordexp *wexp; char **wexp_data; if (! data) return NULL; wexp=file_wordexp_new(data->u.str); wexp_data=file_wordexp_get_array(wexp); dbg(lvl_debug,"map_new_binfile %s\n", data->u.str); *meth=map_methods_binfile; m=g_new0(struct map_priv, 1); m->cbl=cbl; m->id=++map_id; m->filename=g_strdup(wexp_data[0]); file_wordexp_destroy(wexp); check_version=attr_search(attrs, NULL, attr_check_version); if (check_version) m->check_version=check_version->u.num; map_pass=attr_search(attrs, NULL, attr_map_pass); if (map_pass) m->passwd=g_strdup(map_pass->u.str); flags=attr_search(attrs, NULL, attr_flags); if (flags) m->flags=flags->u.num; url=attr_search(attrs, NULL, attr_url); if (url) m->url=g_strdup(url->u.str); download_enabled = attr_search(attrs, NULL, attr_update); if (download_enabled) m->download_enabled=download_enabled->u.num; if (!map_binfile_open(m) && !m->check_version && !m->url) { map_binfile_destroy(m); m=NULL; } else { load_changes(m); } return m; } void plugin_init(void) { dbg(lvl_debug,"binfile: plugin_init\n"); if (sizeof(struct zip_cd) != 46) { dbg(lvl_error,"error: sizeof(struct zip_cd)=%zu\n",sizeof(struct zip_cd)); } plugin_register_map_type("binfile", map_new_binfile); } navit-0.5.0+dfsg.1/navit/map/csv/000077500000000000000000000000001264204753600164155ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/csv/CMakeLists.txt000066400000000000000000000000551264204753600211550ustar00rootroot00000000000000module_add_library(map_csv csv.c quadtree.c) navit-0.5.0+dfsg.1/navit/map/csv/Makefile.am000066400000000000000000000005121264204753600204470ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_csv if PLUGINS modulemap_LTLIBRARIES = libmap_csv.la else noinst_LTLIBRARIES = libmap_csv.la endif libmap_csv_la_SOURCES = csv.c csv.h quadtree.c quadtree.h libmap_csv_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/map/csv/csv.c000066400000000000000000000507001264204753600173560ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "transform.h" #include "file.h" #include "quadtree.h" #include "csv.h" static int map_id; /*prototypes*/ static int csv_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode); static struct item * csv_create_item(struct map_rect_priv *mr, enum item_type it_type); static void quadtree_item_free(void *mr, struct quadtree_item *qitem); static void quadtree_item_free_do(void *qitem); struct quadtree_data { enum item_type type; int id_lo; GList* attr_list; struct item *item; }; struct quadtree_data *quadtree_data_dup(struct quadtree_data *qdata) { struct quadtree_data *ret=g_new0(struct quadtree_data,1); GList *l; ret->type=qdata->type; ret->id_lo=qdata->id_lo; ret->item=g_new(struct item,1); *(ret->item)=*(qdata->item); for(l=qdata->attr_list;l;l=g_list_next(l)) { ret->attr_list=g_list_prepend(ret->attr_list,attr_dup(l->data)); } return ret; } static void save_map_csv(struct map_priv *m) { if(m->filename && m->dirty) { char* filename = g_strdup_printf("%s.tmp",m->filename); FILE* fp; int ferr = 0; char *csv_line = 0; char *tmpstr = 0; char *oldstr = 0; struct quadtree_iter *iter; struct quadtree_item *qitem; if( ! (fp=fopen(filename,"w+"))) { dbg(lvl_error, "Error opening csv file to write new entries"); return; } /*query the world*/ iter=quadtree_query(m->tree_root, -180, 180, -180, 180, quadtree_item_free, m); while((qitem = quadtree_item_next(iter))!=NULL) { int i; enum attr_type *at = m->attr_types; if(qitem->deleted) continue; csv_line = NULL; tmpstr = NULL; for(i=0;iattr_cnt;++i) { if(*at == attr_position_latitude) { tmpstr = g_strdup_printf("%lf",qitem->latitude); } else if(*at == attr_position_longitude) { tmpstr = g_strdup_printf("%lf",qitem->longitude); } else { GList* attr_list = ((struct quadtree_data*)(qitem->data))->attr_list; GList* attr_it = attr_list; struct attr* found_attr = NULL; /*search attributes*/ while(attr_it) { if(((struct attr*)(attr_it->data))->type == *at) { found_attr = attr_it->data; break; } attr_it = g_list_next(attr_it); } if(found_attr) { if(ATTR_IS_INT(*at)) { tmpstr = g_strdup_printf("%d", (int)found_attr->u.num); } else if(ATTR_IS_DOUBLE(*at)) { tmpstr = g_strdup_printf("%lf", *found_attr->u.numd); } else if(ATTR_IS_STRING(*at)) { tmpstr = g_strdup(found_attr->u.str); } else { dbg(lvl_error,"Cant represent attribute %s\n",attr_to_name(*at)); tmpstr=g_strdup(""); } } else { dbg(lvl_debug,"No value defined for the atribute %s, assuming empty string\n",attr_to_name(*at)); tmpstr=g_strdup(""); } } if(i>0) { oldstr = csv_line; csv_line = g_strdup_printf("%s,%s",csv_line,tmpstr); g_free(tmpstr); g_free(oldstr); tmpstr = NULL; } else { csv_line=tmpstr; } ++at; } if(m->charset) { tmpstr=g_convert(csv_line, -1,m->charset,"utf-8",NULL,NULL,NULL); if(!tmpstr) dbg(lvl_error,"Error converting '%s' to %s\n",csv_line, m->charset); } else tmpstr=csv_line; if(tmpstr && fprintf(fp,"%s\n", tmpstr)<0) { ferr = 1; } g_free(csv_line); if(m->charset) g_free(tmpstr); } if(fclose(fp)) { ferr = 1; } if(! ferr) { unlink(m->filename); rename(filename,m->filename); m->dirty = 0; } g_free(filename); quadtree_query_free(iter); } } static const int zoom_max = 18; static void map_destroy_csv(struct map_priv *m) { dbg(lvl_debug,"map_destroy_csv\n"); /*save if changed */ save_map_csv(m); g_hash_table_destroy(m->qitem_hash); quadtree_destroy(m->tree_root); g_free(m->filename); g_free(m->charset); g_free(m->attr_types); g_free(m); } static void csv_coord_rewind(void *priv_data) { } static int csv_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; if(mr) { *c = mr->c; return 1; } else { return 0; } } static void csv_attr_rewind(void *priv_data) { /*TODO implement if needed*/ } static int csv_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { int i, bAttrFound = 0; GList* attr_list; struct map_rect_priv *mr=priv_data; enum attr_type *at; if( !mr || !mr->m || !mr->m->attr_types ) { return 0; } attr_list = ((struct quadtree_data*)(mr->qitem->data))->attr_list; if (attr_type == attr_any) { if (mr->at_iter==NULL) { /*start iteration*/ mr->at_iter = attr_list; if (mr->at_iter) { *attr = *(struct attr*)(mr->at_iter->data); return 1; } else { /*empty attr list*/ mr->at_iter = NULL; return 0; } } else { /*continue iteration*/ mr->at_iter = g_list_next(mr->at_iter); if(mr->at_iter) { *attr = *(struct attr*)mr->at_iter->data; return 1; } else { return 0; } } return 0; } at = mr->m->attr_types; for(i=0;im->attr_cnt;++i) { if(*at == attr_type) { bAttrFound = 1; break; } ++at; } if(!bAttrFound) { return 0; } while(attr_list) { if(((struct attr*)attr_list->data)->type == attr_type) { *attr = *(struct attr*)attr_list->data; return 1; } attr_list = g_list_next(attr_list); } return 0; } static int csv_attr_set(void *priv_data, struct attr *attr, enum change_mode mode) { struct map_rect_priv* mr; struct map_priv* m; int i, bFound; struct attr *attr_new; GList *attr_list, *curr_attr_list; enum attr_type *at; mr = (struct map_rect_priv*)priv_data; if(!mr || !mr->qitem) { return 0; } m = mr->m; bFound = 0; at = m->attr_types; /*if attribute is not supported by this csv map return 0*/ for(i=0;iattr_cnt;++i) { if(*at==attr->type) { bFound = 1; break; } ++at; } if( ! bFound) { return 0; } m->dirty = 1; attr_new = attr_dup(attr); attr_list = ((struct quadtree_data*)(mr->qitem->data))->attr_list; curr_attr_list = attr_list; while(attr_list) { if(((struct attr*)attr_list->data)->type == attr->type) { switch(mode) { case change_mode_delete: attr_free((struct attr*)attr_list->data); curr_attr_list = g_list_delete_link(curr_attr_list,attr_list); m->dirty = 1; /* FIXME: To preserve consistency, may be the save_map_csv should be called here... */ attr_free(attr_new); return 1; case change_mode_modify: case change_mode_prepend: case change_mode_append: /* replace existing attribute */ if(attr_list->data) { attr_free((struct attr*)attr_list->data); } attr_list->data = attr_new; m->dirty = 1; save_map_csv(m); return 1; default: attr_free(attr_new); return 0; } } attr_list = g_list_next(attr_list); } if( mode==change_mode_modify || mode==change_mode_prepend || mode==change_mode_append) { /* add new attribute */ curr_attr_list = g_list_prepend(curr_attr_list, attr_new); ((struct quadtree_data*)(mr->qitem->data))->attr_list = curr_attr_list; m->dirty = 1; save_map_csv(m); return 1; } attr_free(attr_new); return 0; } static int csv_type_set(void *priv_data, enum item_type type) { struct map_rect_priv* mr = (struct map_rect_priv*)priv_data; dbg(lvl_debug,"Enter %d\n", type); if(!mr || !mr->qitem) { dbg(lvl_debug,"Nothing to do\n"); return 0; } if(type!=type_none) return 0; mr->qitem->deleted=1; dbg(lvl_debug,"Item %p is deleted\n",mr->qitem); return 1; } static struct item_methods methods_csv = { csv_coord_rewind, csv_coord_get, csv_attr_rewind, csv_attr_get, NULL, csv_attr_set, csv_coord_set, csv_type_set }; /* * Sets coordinate of an existing item (either on the new list or an item with coord ) */ static int csv_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode) { struct quadtree_item query_item, *insert_item, *query_res; struct coord_geo cg; struct map_rect_priv* mr; struct map_priv* m; struct quadtree_item* qi; GList* new_it; dbg(lvl_debug,"Set coordinates %d %d\n", c->x, c->y); /* for now we only support coord modification only */ if( ! change_mode_modify) { return 0; } /* csv driver supports one coord per record only */ if( count != 1) { return 0; } /* get curr_item of given map_rect */ mr = (struct map_rect_priv*)priv_data; m = mr->m; if(!mr->qitem) { return 0; } qi = mr->qitem; transform_to_geo(projection_mg, &c[0], &cg); /* if it is on the new list remove from new list and add it to the tree with the coord */ new_it = m->new_items; while(new_it) { if(new_it->data==qi) { break; } new_it = g_list_next(new_it); } if(new_it) { qi->longitude = cg.lng; qi->latitude = cg.lat; quadtree_add( m->tree_root, qi, mr->qiter); dbg(lvl_debug,"Set coordinates %f %f\n", cg.lng, cg.lat); m->new_items = g_list_remove_link(m->new_items,new_it); m->dirty=1; save_map_csv(m); return 1; } /* else update quadtree item with the new coord remove item from the quadtree */ query_item.longitude = cg.lng; query_item.latitude = cg.lat; query_res = quadtree_find_item(m->tree_root, &query_item); if(!query_res) { return 0; } quadtree_delete_item(m->tree_root, query_res); /* add item to the tree with the new coord */ insert_item=g_new0(struct quadtree_item,1); insert_item->data=quadtree_data_dup(query_res->data); insert_item->longitude = cg.lng; insert_item->latitude = cg.lat; quadtree_add(m->tree_root, query_res, mr->qiter); mr->qitem->ref_count--; mr->qitem=insert_item; mr->qitem->ref_count++; m->dirty = 1; save_map_csv(m); return 1; } static void quadtree_item_free(void *this, struct quadtree_item *qitem) { struct map_priv* m=this; struct quadtree_data * qdata=qitem->data; if(m) { g_hash_table_remove(m->qitem_hash,&(qdata->item->id_lo)); } } static void quadtree_item_free_do(void *data) { struct quadtree_item *qitem=data; GList* attr_it; struct attr* attr; struct quadtree_data * qdata=qitem->data; if(qdata) { for(attr_it = qdata->attr_list;attr_it;attr_it = g_list_next(attr_it)) { attr = attr_it->data; attr_free(attr); } g_list_free(qdata->attr_list); g_free(qdata->item); g_free(qitem->data); } g_free(data); } static void map_csv_debug_dump_hash_item(gpointer key, gpointer value, gpointer user_data) { struct quadtree_item *qi=value; GList *attrs; dbg(lvl_debug,"%p del=%d ref=%d\n", qi,qi->deleted, qi->ref_count); attrs=((struct quadtree_data *)qi->data)->attr_list; while(attrs) { if(((struct attr*)attrs->data)->type==attr_label) dbg(lvl_debug,"... %s\n",((struct attr*)attrs->data)->u.str); attrs=g_list_next(attrs); } } /** * Dump all map data (including deleted items) to the log. */ static void map_csv_debug_dump(struct map_priv *map) { g_hash_table_foreach(map->qitem_hash, map_csv_debug_dump_hash_item, NULL); } static struct map_rect_priv * map_rect_new_csv(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; struct coord_geo lu; struct coord_geo rl; struct quadtree_iter *res = NULL; dbg(lvl_debug,"map_rect_new_csv\n"); if(debug_level_get("map_csv")>2) { map_csv_debug_dump(map); } mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->bStarted = 0; mr->sel=sel; if (map->flags & 1) mr->item.id_hi=1; else mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_csv; mr->item.priv_data=mr; if(!sel) { lu.lng=-180; lu.lat=180; rl.lng=180; rl.lat=-180; } else { transform_to_geo(projection_mg, &sel->u.c_rect.lu, &lu); transform_to_geo(projection_mg, &sel->u.c_rect.rl, &rl); } res=quadtree_query(map->tree_root, lu.lng, rl.lng, rl.lat, lu.lat, quadtree_item_free, mr->m); mr->qiter = res; mr->qitem = NULL; return mr; } static void map_rect_destroy_csv(struct map_rect_priv *mr) { if(mr->qitem) mr->qitem->ref_count--; if(mr->qiter) quadtree_query_free(mr->qiter); g_free(mr); } static struct item * map_rect_get_item_csv(struct map_rect_priv *mr) { if(mr->qitem) mr->qitem->ref_count--; mr->qitem=quadtree_item_next(mr->qiter); if(mr->qitem) { struct item* ret=&(mr->item); struct coord_geo cg; mr->qitem->ref_count++; mr->item = *(((struct quadtree_data*)(mr->qitem->data))->item); ret->priv_data=mr; cg.lng = mr->qitem->longitude; cg.lat = mr->qitem->latitude; transform_from_geo(projection_mg, &cg, &mr->c); return ret; } return NULL; } static struct item * map_rect_get_item_byid_csv(struct map_rect_priv *mr, int id_hi, int id_lo) { /*currently id_hi is ignored*/ struct quadtree_item *qit = g_hash_table_lookup(mr->m->qitem_hash,&id_lo); if(mr->qitem ) mr->qitem->ref_count--; if(qit) { mr->qitem = qit; mr->qitem->ref_count++; mr->item=*(((struct quadtree_data*)(qit->data))->item); mr->item.priv_data=mr; return &(mr->item); } else { mr->qitem = NULL; return NULL; } } static int csv_get_attr(struct map_priv *m, enum attr_type type, struct attr *attr) { return 0; } static struct item * csv_create_item(struct map_rect_priv *mr, enum item_type it_type) { struct map_priv* m; struct quadtree_data* qd; struct quadtree_item* qi; struct item* curr_item; int* pID; if(mr && mr->m) { m = mr->m; } else { return NULL; } if( m->item_type != it_type) { return NULL; } m->dirty = 1; /*add item to the map*/ curr_item = item_new("",zoom_max); curr_item->type = m->item_type; curr_item->meth=&methods_csv; curr_item->id_lo = m->next_item_idx; if (m->flags & 1) curr_item->id_hi=1; else curr_item->id_hi=0; qd = g_new0(struct quadtree_data,1); qi = g_new0(struct quadtree_item,1); qd->item = curr_item; qd->attr_list = NULL; qi->data = qd; /*we don`t have valid coord yet*/ qi->longitude = 0; qi->latitude = 0; /*add the coord less item to the new list*/ m->new_items = g_list_prepend(m->new_items, qi); if(mr->qitem) mr->qitem->ref_count--; mr->qitem=qi; mr->item=*curr_item; mr->item.priv_data=mr; mr->qitem->ref_count++; /*don't add to the quadtree yet, wait until we have a valid coord*/ pID = g_new(int,1); *pID = m->next_item_idx; g_hash_table_insert(m->qitem_hash, pID,qi); ++m->next_item_idx; return &mr->item; } static struct map_methods map_methods_csv = { projection_mg, "utf-8", map_destroy_csv, map_rect_new_csv, map_rect_destroy_csv, map_rect_get_item_csv, map_rect_get_item_byid_csv, NULL, NULL, NULL, csv_create_item, csv_get_attr, }; static struct map_priv * map_new_csv(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m = NULL; struct attr *attr_types; struct attr *item_type_attr; struct attr *data; struct attr *flags; struct attr *charset; int bLonFound = 0; int bLatFound = 0; int attr_cnt = 0; enum attr_type* attr_type_list = NULL; struct quadtree_node* tree_root = quadtree_node_new(NULL,-180,180,-180,180); m = g_new0(struct map_priv, 1); m->id = ++map_id; m->qitem_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, quadtree_item_free_do); m->tree_root = tree_root; attr_types = attr_search(attrs, NULL, attr_attr_types); if(attr_types) { enum attr_type* at = attr_types->u.attr_types; while(*at != attr_none) { attr_type_list = g_realloc(attr_type_list,sizeof(enum attr_type)*(attr_cnt+1)); attr_type_list[attr_cnt] = *at; if(*at==attr_position_latitude) { bLatFound = 1; } else if(*at==attr_position_longitude) { bLonFound = 1; } ++attr_cnt; ++at; } m->attr_cnt = attr_cnt; m->attr_types = attr_type_list; } else { m->attr_types = NULL; return NULL; } charset = attr_search(attrs, NULL, attr_charset); if(charset) { dbg(lvl_debug,"charset:%s\n",charset->u.str); m->charset=g_strdup(charset->u.str); } else { m->charset=g_strdup(map_methods_csv.charset); } if(bLonFound==0 || bLatFound==0) { return NULL; } item_type_attr=attr_search(attrs, NULL, attr_item_type); if( !item_type_attr || item_type_attr->u.item_type==type_none) { return NULL; } m->item_type = item_type_attr->u.item_type; flags=attr_search(attrs, NULL, attr_flags); if (flags) m->flags=flags->u.num; *meth = map_methods_csv; data=attr_search(attrs, NULL, attr_data); if(data) { struct file_wordexp *wexp; char **wexp_data; FILE *fp; wexp=file_wordexp_new(data->u.str); wexp_data=file_wordexp_get_array(wexp); dbg(lvl_debug,"map_new_csv %s\n", data->u.str); m->filename=g_strdup(wexp_data[0]); file_wordexp_destroy(wexp); /*load csv file into quadtree structure*/ /*if column number is wrong skip*/ if((fp=fopen(m->filename,"rt"))) { const int max_line_len = 256; char *linebuf=g_alloca(sizeof(char)*max_line_len); while(!feof(fp)) { if(fgets(linebuf,max_line_len,fp)) { char *line=g_convert(linebuf, -1,"utf-8",m->charset,NULL,NULL,NULL); char *line2=NULL; char *delim = ","; int col_cnt=0; char *tok; if(!line) { dbg(lvl_error,"Error converting '%s' to utf-8 from %s\n",linebuf, m->charset); continue; } if(line[strlen(line)-1]=='\n' || line[strlen(line)-1]=='\r') { line[strlen(line)-1] = '\0'; } line2 = g_strdup(line); while((tok=strtok( (col_cnt==0)?line:NULL , delim))) { ++col_cnt; } if(col_cnt==attr_cnt) { int cnt = 0; /*index of current attr*/ char*tok; GList* attr_list = NULL; int bAddSum = 1; double longitude = 0.0, latitude=0.0; struct item *curr_item = item_new("",zoom_max);/*does not use parameters*/ curr_item->type = item_type_attr->u.item_type; curr_item->id_lo = m->next_item_idx; if (m->flags & 1) curr_item->id_hi=1; else curr_item->id_hi=0; curr_item->meth=&methods_csv; while((tok=strtok( (cnt==0)?line2:NULL , delim))) { struct attr*curr_attr = g_new0(struct attr,1); int bAdd = 1; curr_attr->type = attr_types->u.attr_types[cnt]; if(ATTR_IS_STRING(attr_types->u.attr_types[cnt])) { curr_attr->u.str = g_strdup(tok); } else if(ATTR_IS_INT(attr_types->u.attr_types[cnt])) { curr_attr->u.num = atoi(tok); } else if(ATTR_IS_DOUBLE(attr_types->u.attr_types[cnt])) { double *d = g_new(double,1); *d = atof(tok); curr_attr->u.numd = d; if(attr_types->u.attr_types[cnt] == attr_position_longitude) { longitude = *d; } if(attr_types->u.attr_types[cnt] == attr_position_latitude) { latitude = *d; } } else { /*unknown attribute*/ bAddSum = bAdd = 0; g_free(curr_attr); } if(bAdd) { attr_list = g_list_prepend(attr_list, curr_attr); } ++cnt; } if(bAddSum && (longitude!=0.0 || latitude!=0.0)) { struct quadtree_data* qd = g_new0(struct quadtree_data,1); struct quadtree_item* qi =g_new0(struct quadtree_item,1); int* pID = g_new(int,1); qd->item = curr_item; qd->attr_list = attr_list; qi->data = qd; qi->longitude = longitude; qi->latitude = latitude; quadtree_add(tree_root, qi, NULL); *pID = m->next_item_idx; g_hash_table_insert(m->qitem_hash, pID,qi); ++m->next_item_idx; dbg(lvl_debug,"%s\n",line); } else { g_free(curr_item); } } else { dbg(lvl_error,"ERROR: Non-matching attr count and column count: %d %d SKIPPING line: %s\n",col_cnt, attr_cnt,line); } g_free(line); g_free(line2); } } fclose(fp); } else { dbg(lvl_error,"Error opening csv map file %s, starting with empty map\n", m->filename); } } else { dbg(lvl_debug,"No data attribute, starting with in-memory map\n"); } dbg(lvl_info,"%p\n",tree_root); return m; } void plugin_init(void) { dbg(lvl_debug,"csv: plugin_init\n"); plugin_register_map_type("csv", map_new_csv); } navit-0.5.0+dfsg.1/navit/map/csv/csv.h000066400000000000000000000025731264204753600173700ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "attr.h" #include "coord.h" #include "quadtree.h" struct map_priv { int id; struct quadtree_node* tree_root; int flags; GHashTable*qitem_hash; char* filename; /*need to write map file on exit*/ int dirty; int attr_cnt; enum attr_type *attr_types; int next_item_idx; enum item_type item_type; /*list of quadtree items that have no coord set yet ()*/ GList* new_items; char *charset; }; struct map_rect_priv { struct map_selection *sel; struct quadtree_iter *qiter; struct quadtree_item *qitem; struct coord c; int bStarted; struct item item; struct map_priv *m; GList* at_iter; }; navit-0.5.0+dfsg.1/navit/map/csv/quadtree.c000066400000000000000000000577301264204753600204070ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "quadtree.h" #define QUADTREE_NODE_CAPACITY 10 #define MAX_DOUBLE 9999999 /* Check if two given line segments overlap (1-d case) */ #define segments_overlap(x11,x12, x21,x22) (((x11)<=(x21) && (x21)<=(x12)) || ((x21)<=(x11) && (x11)<=(x22))) /* Check if two given rectanlgles overlap (2-d case) */ #define rects_overlap(x11,y11,x12,y12, x21,y21,x22,y22) (segments_overlap(x11,x12, x21,x22) && segments_overlap(y11,y12, y21,y22)) /* Structure describing quadtree iterative query */ struct quadtree_iter { /* List representing stack of quad_tree_iter_nodes referring to higher-level quadtree_nodes */ GList *iter_nodes; double xmin,xmax,ymin,ymax; /* Current item pointer */ struct quadtree_item *item; void (*item_free)(void *context, struct quadtree_item *qitem); void *item_free_context; }; /* Structure describing one level of the quadtree iterative query */ struct quadtree_iter_node { struct quadtree_node *node; /* Number of subnode being analyzed (for non-leafs) */ int subnode; /* Number of item being analyzed (for leafs) */ int item; /* Number of subitems in items array (for leafs) */ int node_num; /* If the node referenced was a leaf when it was analyzed */ int is_leaf; struct quadtree_item *items[QUADTREE_NODE_CAPACITY]; }; static double dist_sq(double x1,double y1,double x2,double y2) { return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); } struct quadtree_node* quadtree_node_new(struct quadtree_node* parent, double xmin, double xmax, double ymin, double ymax ) { struct quadtree_node*ret = g_new0(struct quadtree_node,1); ret->xmin = xmin; ret->xmax = xmax; ret->ymin = ymin; ret->ymax = ymax; ret->is_leaf = 1; ret->parent = parent; return ret; } /* * searches all four subnodes recursively for the list of items within a rectangle */ void quadtree_find_rect_items(struct quadtree_node* this_, double dXMin, double dXMax, double dYMin, double dYMax, GList**out) { struct quadtree_node* nodes[4] = { this_->aa, this_->ab, this_->ba, this_->bb }; if( this_->is_leaf ) { int i; for(i=0;inode_num;++i) { //select only items within input rectangle if(dXMin<=this_->items[i]->longitude && this_->items[i]->longitude<=dXMax && dYMin<=this_->items[i]->latitude && this_->items[i]->latitude<=dYMax ) { *out=g_list_prepend(*out,this_->items[i]); } } } else { int i; for( i=0;i<4;++i) { if(nodes[i] ) { //limit flooding if(nodes[i]->xmaxxmin || nodes[i]->ymaxymin ) { continue; } //recurse into subtiles if there is at least one subtile corner within input rectangle quadtree_find_rect_items(nodes[i],dXMin,dXMax,dYMin,dYMax,out); } } } } /* * searches all four subnodes recursively for the closest item */ struct quadtree_item* quadtree_find_nearest_flood(struct quadtree_node* this_, struct quadtree_item* item, double current_max, struct quadtree_node* toSkip) { struct quadtree_node* nodes[4] = { this_->aa, this_->ab, this_->ba, this_->bb }; struct quadtree_item*res = NULL; if( this_->is_leaf ) { int i; double distance_sq = current_max; for(i=0;inode_num;++i) { double curr_dist_sq = dist_sq(item->longitude,item->latitude,this_->items[i]->longitude,this_->items[i]->latitude); if(curr_dist_sqitems[i]; } } } else { int i; for( i=0;i<4;++i) { if(nodes[i] && nodes[i]!=toSkip) { //limit flooding struct quadtree_item*res_tmp = NULL; if( dist_sq(nodes[i]->xmin,nodes[i]->ymin,item->longitude,item->latitude)xmax,nodes[i]->ymin,item->longitude,item->latitude)xmax,nodes[i]->ymax,item->longitude,item->latitude)xmin,nodes[i]->ymax,item->longitude,item->latitude)longitude,item->latitude,res->longitude,res->latitude); if(curr_dist_sqis_leaf ) { int i; for(i=0;inode_num;++i) { //TODO equality check may not be correct on float values! maybe it can be replaced by range check with some tolerance if(item->longitude==this_->items[i]->longitude && item->latitude==this_->items[i]->latitude) { res = this_->items[i]; return res; } } return NULL; } else { if( this_->aa && this_->aa->xmin<=item->longitude && item->longitudeaa->xmax && this_->aa->ymin<=item->latitude && item->latitudeaa->ymax ) { res = quadtree_find_item(this_->aa,item); } else if( this_->ab && this_->ab->xmin<=item->longitude && item->longitudeab->xmax && this_->ab->ymin<=item->latitude && item->latitudeab->ymax ) { res = quadtree_find_item(this_->ab,item); } else if( this_->ba && this_->ba->xmin<=item->longitude && item->longitudeba->xmax && this_->ba->ymin<=item->latitude && item->latitudeba->ymax ) { res = quadtree_find_item(this_->ba,item); } else if( this_->bb && this_->bb->xmin<=item->longitude && item->longitudebb->xmax && this_->bb->ymin<=item->latitude && item->latitudebb->ymax ) { res = quadtree_find_item(this_->bb,item); } else { return NULL; } } return res; } /* * returns the containing node for an item */ struct quadtree_node* quadtree_find_containing_node(struct quadtree_node* root, struct quadtree_item* item) { struct quadtree_node*res = NULL; if( ! root ) { return NULL; } if( root->is_leaf ) { int i; for(i=0;inode_num;++i) { if(item == root->items[i]) { res = root; } } } else { if( root->aa && root->aa->xmin<=item->longitude && item->longitudeaa->xmax && root->aa->ymin<=item->latitude && item->latitudeaa->ymax ) { res = quadtree_find_containing_node(root->aa,item); } else if( root->ab && root->ab->xmin<=item->longitude && item->longitudeab->xmax && root->ab->ymin<=item->latitude && item->latitudeab->ymax ) { res = quadtree_find_containing_node(root->ab,item); } else if( root->ba && root->ba->xmin<=item->longitude && item->longitudeba->xmax && root->ba->ymin<=item->latitude && item->latitudeba->ymax ) { res = quadtree_find_containing_node(root->ba,item); } else if( root->bb && root->bb->xmin<=item->longitude && item->longitudebb->xmax && root->bb->ymin<=item->latitude && item->latitudebb->ymax ) { res = quadtree_find_containing_node(root->bb,item); } else { //this should not happen } } return res; } int quadtree_delete_item(struct quadtree_node* root, struct quadtree_item* item) { struct quadtree_node* qn = quadtree_find_containing_node(root,item); int i, bFound=0; if(!qn || !qn->node_num) { return 0; } for(i=0;inode_num;++i) { if( qn->items[i] == item) { qn->items[i]->deleted=1; bFound=1; } } return bFound; } /* * tries to find closest item, first it descend into the quadtree as much as possible, then if no point is found go up n levels and flood */ struct quadtree_item* quadtree_find_nearest(struct quadtree_node* this_, struct quadtree_item* item) { struct quadtree_item*res = NULL; double distance_sq = MAX_DOUBLE; if( ! this_ ) { return NULL; } if( this_->is_leaf ) { int i; for(i=0;inode_num;++i) { double curr_dist_sq = dist_sq(item->longitude,item->latitude,this_->items[i]->longitude,this_->items[i]->latitude); if(curr_dist_sqitems[i]; } } //go up n levels if(!res && this_->parent) { struct quadtree_item*res2 = NULL; struct quadtree_node* anchestor = this_->parent; int cnt = 0; while (anchestor->parent && cnt<4) { anchestor = anchestor->parent; ++cnt; } res2 = quadtree_find_nearest_flood(anchestor,item,distance_sq,NULL); if(res2) { res = res2; } } } else { if( this_->aa && this_->aa->xmin<=item->longitude && item->longitudeaa->xmax && this_->aa->ymin<=item->latitude && item->latitudeaa->ymax ) { res = quadtree_find_nearest(this_->aa,item); } else if( this_->ab && this_->ab->xmin<=item->longitude && item->longitudeab->xmax && this_->ab->ymin<=item->latitude && item->latitudeab->ymax ) { res = quadtree_find_nearest(this_->ab,item); } else if( this_->ba && this_->ba->xmin<=item->longitude && item->longitudeba->xmax && this_->ba->ymin<=item->latitude && item->latitudeba->ymax ) { res = quadtree_find_nearest(this_->ba,item); } else if( this_->bb && this_->bb->xmin<=item->longitude && item->longitudebb->xmax && this_->bb->ymin<=item->latitude && item->latitudebb->ymax ) { res = quadtree_find_nearest(this_->bb,item); } else { if(this_->parent) { //go up two levels struct quadtree_node* anchestor = this_->parent; int cnt = 0; while (anchestor->parent && cnt<4) { anchestor = anchestor->parent; ++cnt; } res = quadtree_find_nearest_flood(anchestor,item,distance_sq,NULL); } } } return res; } /** * @brief Free space occupied by deleted unreferenced items. * @param node pointer to the quadtree node * @param iter Quadtree iteration context. * @return nothing */ void quadtree_node_drop_garbage(struct quadtree_node* node, struct quadtree_iter *iter) { int i,j; int node_num=node->node_num; dbg(lvl_debug,"Processing unreferenced subnode children...\n"); for(i=0,j=0;iitems[i]->deleted && !node->items[i]->ref_count) { if(iter->item_free) { (iter->item_free)(iter->item_free_context, node->items[i]); } else { g_free(node->items[i]); } node->node_num--; node->items[i]=NULL; } else { node->items[j++]=node->items[i]; } if(i>j) node->items[i]=NULL; } } /** * @brief Add new node to quadtree. * @param this_ pointer to the quadtree (root) node * @param item item to add * @param iter Quadtree iteration context. Can be NULL if no garbage collection is needed. * @return nothing */ void quadtree_add(struct quadtree_node* this_, struct quadtree_item* item, struct quadtree_iter *iter) { if( this_->is_leaf ) { int bSame = 1; int i; if(iter) quadtree_node_drop_garbage(this_, iter); if(QUADTREE_NODE_CAPACITY-1 == this_->node_num) { double lon, lat; //avoid infinite recursion when all elements have the same coordinate lon = this_->items[0]->longitude; lat = this_->items[0]->latitude; for(i=1;inode_num;++i) { if (lon != this_->items[i]->longitude || lat != this_->items[i]->latitude) { bSame = 0; break; } } if (bSame) { //FIXME: memleak and items thrown away if more than QUADTREE_NODE_CAPACITY-1 items with same coordinates added. dbg(lvl_error,"Unable to add another item with same coordinates. Throwing item to the ground. Will leak %p.\n",item); return; } this_->items[this_->node_num++] = item; quadtree_split(this_); } else { this_->items[this_->node_num++] = item; } } else { if( this_->xmin<=item->longitude && item->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin<=item->latitude && item->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->aa) { this_->aa = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->aa,item,iter); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=item->longitude && item->longitudexmax && this_->ymin<=item->latitude && item->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->ab) { this_->ab = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->ab,item,iter); } else if( this_->xmin<=item->longitude && item->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin+(this_->ymax-this_->ymin)/2.0<=item->latitude && item->latitudeymax ) { if(!this_->ba) { this_->ba = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->ba,item,iter); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=item->longitude && item->longitudexmax && this_->ymin+(this_->ymax-this_->ymin)/2.0<=item->latitude && item->latitudeymax ) { if(!this_->bb) { this_->bb = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->bb,item,iter); } } } void quadtree_split(struct quadtree_node* this_) { int i; this_->is_leaf = 0; for(i=0;inode_num;++i) { if( this_->xmin<=this_->items[i]->longitude && this_->items[i]->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin<=this_->items[i]->latitude && this_->items[i]->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->aa) { this_->aa = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->aa,this_->items[i],NULL); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=this_->items[i]->longitude && this_->items[i]->longitudexmax && this_->ymin<=this_->items[i]->latitude && this_->items[i]->latitudeymin+(this_->ymax-this_->ymin)/2.0 ) { if(!this_->ab) { this_->ab = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); } quadtree_add(this_->ab,this_->items[i],NULL); } else if( this_->xmin<=this_->items[i]->longitude && this_->items[i]->longitudexmin+(this_->xmax-this_->xmin)/2.0 && this_->ymin+(this_->ymax-this_->ymin)/2.0<=this_->items[i]->latitude && this_->items[i]->latitudeymax ) { if(!this_->ba) { this_->ba = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->ba,this_->items[i],NULL); } else if( this_->xmin+(this_->xmax-this_->xmin)/2.0<=this_->items[i]->longitude && this_->items[i]->longitudexmax && this_->ymin+(this_->ymax-this_->ymin)/2.0<=this_->items[i]->latitude && this_->items[i]->latitudeymax ) { if(!this_->bb) { this_->bb = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); } quadtree_add(this_->bb,this_->items[i],NULL); } this_->items[i]=NULL; } this_->node_num = 0; } void quadtree_destroy(struct quadtree_node* this_) { if(this_->aa) { quadtree_destroy(this_->aa); this_->aa = NULL; } if(this_->ab) { quadtree_destroy(this_->ab); this_->ab = NULL; } if(this_->ba) { quadtree_destroy(this_->ba); this_->ba = NULL; } if(this_->bb) { quadtree_destroy(this_->bb); this_->bb = NULL; } free(this_); } /* * @brief Start iterating over quadtree items not marked for deletion. * @param this_ Pointer to the quadtree root node. * @param dXMin,dXMax,dYMin,dYMax boundig box of area of interest. * @param item_free function to be called to free the qitem, first parameter would be context, second parameter - actual qitem pointer to free * if this parameter is NULL, nothing would be called to free qitem pointer (possible massive memleak unless you store each qitem pointer in some * alternate storage) * @param item_free_context data to be passed as a first parameter to item_free function * @return pointer to the quad tree iteration structure. */ struct quadtree_iter *quadtree_query(struct quadtree_node *this_, double dXMin, double dXMax, double dYMin, double dYMax,void (*item_free)(void *context, struct quadtree_item *qitem), void *item_free_context) { struct quadtree_iter *ret=g_new0(struct quadtree_iter,1); struct quadtree_iter_node *n=g_new0(struct quadtree_iter_node,1); ret->xmin=dXMin; ret->xmax=dXMax; ret->ymin=dYMin; ret->ymax=dYMax; dbg(lvl_debug,"%f %f %f %f\n",dXMin,dXMax,dYMin,dYMax) ret->item_free=item_free; ret->item_free_context=item_free_context; n->node=this_; ret->iter_nodes=g_list_prepend(ret->iter_nodes,n); n->is_leaf=this_->is_leaf; if(this_->is_leaf) { int i; n->node_num=this_->node_num; for(i=0;inode_num;i++) { n->items[i]=this_->items[i]; n->items[i]->ref_count++; } } this_->ref_count++; dbg(lvl_debug,"Query %p \n",this_) return ret; } /* * @brief End iteration. * @param iter Pointer to the quadtree iteration structure. */ void quadtree_query_free(struct quadtree_iter *iter) { //Get the rest of the data to collect garbage and dereference all the items/nodes //TODO: No need to iterate the whole tree here. Just dereference nodes/items (if any). while(quadtree_item_next(iter)); g_free(iter); } /* * @brief Mark current item of iterator for deletion. * @param iter Pointer to the quadtree iteration structure. */ void quadtree_item_delete(struct quadtree_iter *iter) { if(iter->item) iter->item->deleted=1; } /* * @brief Get next item from the quadtree. Any met unreferenced items/nodes marked for deletion will be freed here. * @param iter Pointer to the quadtree iteration structure. * @return pointer to the next item, or NULL if no items are left. */ struct quadtree_item * quadtree_item_next(struct quadtree_iter *iter) { struct quadtree_iter_node *iter_node; struct quadtree_node *subnode; if(iter->item) { iter->item->ref_count--; iter->item=NULL; } while(iter->iter_nodes) { struct quadtree_node *nodes[4]; int i; iter_node=iter->iter_nodes->data; if(iter_node->is_leaf) { /* Try to find undeleted item in the current node */ dbg(lvl_debug,"find item %p %p ...\n",iter->iter_nodes,iter->iter_nodes->data); while(iter_node->itemnode_num) { dbg(lvl_debug,"%d %d\n",iter_node->item,iter_node->items[iter_node->item]->deleted); if(iter_node->items[iter_node->item]->deleted) { iter_node->item++; continue; } iter->item=iter_node->items[iter_node->item]; iter_node->item++; dbg(lvl_debug,"Returning %p\n",iter->item); iter->item->ref_count++; return iter->item; } for(i=0;inode_num;i++) { iter_node->items[i]->ref_count--; } } else { /* No items left, try to find non-empty subnode */ nodes[0]=iter_node->node->aa; nodes[1]=iter_node->node->ab; nodes[2]=iter_node->node->ba; nodes[3]=iter_node->node->bb; for(subnode=NULL;!subnode && iter_node->subnode<4;iter_node->subnode++) { i=iter_node->subnode; if(!nodes[i] || !rects_overlap(nodes[i]->xmin, nodes[i]->ymin, nodes[i]->xmax, nodes[i]->ymax, iter->xmin, iter->ymin, iter->xmax, iter->ymax)) continue; dbg(lvl_debug,"%f %f %f %f\n",nodes[i]->xmin, nodes[i]->xmax, nodes[i]->ymin, nodes[i]->ymax) subnode=nodes[i]; } if(subnode) { /* Go one level deeper */ dbg(lvl_debug,"Go one level deeper...\n"); iter_node=g_new0(struct quadtree_iter_node, 1); iter_node->node=subnode; iter_node->is_leaf=subnode->is_leaf; if(iter_node->is_leaf) { int i; iter_node->node_num=subnode->node_num; for(i=0;inode_num;i++) { iter_node->items[i]=subnode->items[i]; iter_node->items[i]->ref_count++; } } subnode->ref_count++; iter->iter_nodes=g_list_prepend(iter->iter_nodes,iter_node); continue; } } /* No nodes and items left, fix up current subnode... */ iter_node=iter->iter_nodes->data; subnode=iter_node->node; subnode->ref_count--; if(!subnode->aa && !subnode->ab && !subnode->ba && !subnode->bb) subnode->is_leaf=1; /* 1. free deleted unreferenced items */ quadtree_node_drop_garbage(subnode, iter); /* 2. remove empty leaf subnode if it's unreferenced */ if(!subnode->ref_count && !subnode->node_num && subnode->is_leaf ) { dbg(lvl_debug,"Going to delete an empty unreferenced leaf subnode...\n"); if(subnode->parent) { if(subnode->parent->aa==subnode) { subnode->parent->aa=NULL; } else if(subnode->parent->ab==subnode) { subnode->parent->ab=NULL; } else if(subnode->parent->ba==subnode) { subnode->parent->ba=NULL; } else if(subnode->parent->bb==subnode) { subnode->parent->bb=NULL; } else { dbg(lvl_error,"Found Quadtree structure corruption while trying to free an empty node.\n"); } if(!subnode->parent->aa && !subnode->parent->ab && !subnode->parent->ba && !subnode->parent->bb ) subnode->parent->is_leaf=1; g_free(subnode); } else dbg(lvl_debug,"Quadtree is empty. NOT deleting the root subnode...\n"); } /* Go one step towards root */ dbg(lvl_info,"Going towards root...\n"); g_free(iter->iter_nodes->data); iter->iter_nodes=g_list_delete_link(iter->iter_nodes,iter->iter_nodes); } iter->item=NULL; return NULL; } navit-0.5.0+dfsg.1/navit/map/csv/quadtree.h000066400000000000000000000054631264204753600204100ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef QUADTREE_H #define QUADTREE_H #include #define QUADTREE_NODE_CAPACITY 10 struct quadtree_item { double longitude; double latitude; int ref_count; int deleted; void *data; }; struct quadtree_node { int node_num; struct quadtree_item *items[QUADTREE_NODE_CAPACITY]; struct quadtree_node *aa; struct quadtree_node *ab; struct quadtree_node *ba; struct quadtree_node *bb; double xmin, xmax, ymin, ymax; int is_leaf; struct quadtree_node*parent; int ref_count; }; struct quadtree_iter; struct quadtree_node* quadtree_node_new(struct quadtree_node* parent, double xmin, double xmax, double ymin, double ymax ); struct quadtree_item* quadtree_find_nearest_flood(struct quadtree_node* this_, struct quadtree_item* item, double current_max, struct quadtree_node* toSkip); struct quadtree_item* quadtree_find_nearest(struct quadtree_node* this_, struct quadtree_item* item); struct quadtree_item* quadtree_find_item(struct quadtree_node* this_, struct quadtree_item* item); struct quadtree_node* quadtree_find_containing_node(struct quadtree_node* root, struct quadtree_item* item); int quadtree_delete_item(struct quadtree_node* root, struct quadtree_item* item); void quadtree_find_rect_items(struct quadtree_node* this_, double dXMin, double dXMax, double dYMin, double dYMax, GList**out); void quadtree_split(struct quadtree_node* this_); void quadtree_add(struct quadtree_node* this_, struct quadtree_item* item, struct quadtree_iter* iter); void quadtree_destroy(struct quadtree_node* this_); struct quadtree_iter *quadtree_query(struct quadtree_node *this_, double dXMin, double dXMax, double dYMin, double dYMax,void (*item_free)(void *context, struct quadtree_item *qitem), void *context); struct quadtree_item * quadtree_item_next(struct quadtree_iter *iter); void quadtree_query_free(struct quadtree_iter *iter); void quadtree_item_delete(struct quadtree_iter *iter); struct quadtree_data *quadtree_data_dup(struct quadtree_data *qdata); void quadtree_node_drop_garbage(struct quadtree_node* node, struct quadtree_iter *iter); #endif navit-0.5.0+dfsg.1/navit/map/filter/000077500000000000000000000000001264204753600171075ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/filter/CMakeLists.txt000066400000000000000000000000511264204753600216430ustar00rootroot00000000000000module_add_library(map_filter filter.c) navit-0.5.0+dfsg.1/navit/map/filter/Makefile.am000066400000000000000000000005001264204753600211360ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_filter if PLUGINS modulemap_LTLIBRARIES = libmap_filter.la else noinst_LTLIBRARIES = libmap_filter.la endif libmap_filter_la_SOURCES = filter.c libmap_filter_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/map/filter/filter.c000066400000000000000000000223521264204753600205440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "coord.h" #include "transform.h" #include "file.h" #include "zipfile.h" #include "linguistics.h" #include "endianess.h" struct filter_entry { enum item_type first,last; enum attr_type cond_attr; char *cond_str; }; struct filter { GList *old; GList *new; }; struct map_priv { struct map *parent; GList *filters; }; struct map_rect_priv { struct map_selection *sel; struct map_priv *m; struct map_rect *parent; struct item item,*parent_item; }; struct map_search_priv { struct map_rect_priv *mr; }; static enum item_type filter_type(struct map_priv *m, struct item *item) { GList *filters=m->filters; struct filter_entry *entry; while (filters) { struct filter *filter=filters->data; int pos=0,count=0; GList *old,*new; old=filter->old; while (old) { entry=old->data; if (item->type >= entry->first && item->type <= entry->last) break; pos+=entry->last-entry->first+1; old=g_list_next(old); } if (old && entry && entry->cond_attr != attr_none) { struct attr attr; if (entry->cond_attr == attr_id) { char idstr[64]; sprintf(idstr,"0x%x 0x%x",item->id_hi,item->id_lo); if (strcmp(entry->cond_str, idstr)) old=NULL; } else if (!item_attr_get(item, entry->cond_attr, &attr)) { old=NULL; } else { char *wildcard=strchr(entry->cond_str,'*'); int len; if (!wildcard) len=strlen(entry->cond_str)+1; else len=wildcard-entry->cond_str; if (strncmp(entry->cond_str, attr.u.str, len)) old=NULL; } item_attr_rewind(item); } if (old) { new=filter->new; if (!new) return item->type; while (new) { struct filter_entry *entry=new->data; count+=entry->last-entry->first+1; new=g_list_next(new); } pos%=count; new=filter->new; while (new) { struct filter_entry *entry=new->data; if (pos <= entry->last-entry->first) return entry->first+pos; pos-=entry->last-entry->first+1; new=g_list_next(new); } } filters=g_list_next(filters); } return item->type; } static void free_filter_entry(struct filter_entry *filter) { g_free(filter->cond_str); g_free(filter); } static void free_filter(struct filter *filter) { g_list_foreach(filter->old, (GFunc)free_filter_entry, NULL); g_list_free(filter->old); filter->old=NULL; g_list_foreach(filter->new, (GFunc)free_filter_entry, NULL); g_list_free(filter->new); filter->new=NULL; } static void free_filters(struct map_priv *m) { g_list_foreach(m->filters, (GFunc)free_filter, NULL); g_list_free(m->filters); m->filters=NULL; } static GList * parse_filter(char *filter) { GList *ret=NULL; for (;;) { char *condition,*range,*next=strchr(filter,','); struct filter_entry *entry=g_new0(struct filter_entry, 1); if (next) *next++='\0'; condition=strchr(filter,'['); if (condition) *condition++='\0'; range=strchr(filter,'-'); if (range) *range++='\0'; if (!strcmp(filter,"*") && !range) { entry->first=type_none; entry->last=type_last; } else { entry->first=item_from_name(filter); if (range) entry->last=item_from_name(range); else entry->last=entry->first; } if (condition) { char *end=strchr(condition,']'); char *eq=strchr(condition,'='); if (end && eq && eq < end) { *end='\0'; *eq++='\0'; if (eq[0] == '"' || eq[0] == '\'') { char *quote=strchr(eq+1,eq[0]); if (quote) { eq++; *quote='\0'; } } entry->cond_attr=attr_from_name(condition); entry->cond_str=g_strdup(eq); } } ret=g_list_append(ret, entry); if (!next) break; filter=next; } return ret; } static void parse_filters(struct map_priv *m, char *filter) { char *filter_copy=g_strdup(filter); char *str=filter_copy; free_filters(m); for (;;) { char *pos,*bracket,*eq,*next=strchr(str,';'); struct filter *filter=g_new0(struct filter, 1); if (next) *next++='\0'; pos=str; for (;;) { eq=strchr(pos,'='); if (eq) { bracket=strchr(pos,'['); if (bracket && bracket < eq) { bracket=strchr(pos,']'); if (bracket) pos=bracket+1; else { eq=NULL; break; } } else { *eq++='\0'; break; } } else break; } filter->old=parse_filter(str); if (eq) filter->new=parse_filter(eq); m->filters=g_list_append(m->filters,filter); if (!next) break; str=next; } g_free(filter_copy); } static void map_filter_coord_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; item_coord_rewind(mr->parent_item); } static int map_filter_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; return item_coord_get(mr->parent_item, c, count); } static void map_filter_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; item_attr_rewind(mr->parent_item); } static int map_filter_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; return item_attr_get(mr->parent_item, attr_type, attr); } static struct item_methods methods_filter = { map_filter_coord_rewind, map_filter_coord_get, map_filter_attr_rewind, map_filter_attr_get, }; static struct map_rect_priv * map_filter_rect_new(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr=NULL; struct map_rect *parent; parent=map_rect_new(map->parent, sel); if (parent) { mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->sel=sel; mr->parent=parent; mr->item.meth=&methods_filter; mr->item.priv_data=mr; } return mr; } static void map_filter_rect_destroy(struct map_rect_priv *mr) { map_rect_destroy(mr->parent); g_free(mr); } static struct item * map_filter_rect_get_item(struct map_rect_priv *mr) { mr->parent_item=map_rect_get_item(mr->parent); if (!mr->parent_item) return NULL; mr->item.type=filter_type(mr->m,mr->parent_item); mr->item.id_lo=mr->parent_item->id_lo; mr->item.id_hi=mr->parent_item->id_hi; return &mr->item; } static struct item * map_filter_rect_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { dbg(lvl_debug,"enter\n"); mr->parent_item=map_rect_get_item_byid(mr->parent, id_hi, id_lo); if (!mr->parent_item) return NULL; mr->item.type=filter_type(mr->m,mr->parent_item); mr->item.id_lo=mr->parent_item->id_lo; mr->item.id_hi=mr->parent_item->id_hi; return &mr->item; } static struct map_search_priv * map_filter_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) { dbg(lvl_debug,"enter\n"); return NULL; } static struct item * map_filter_search_get_item(struct map_search_priv *map_search) { dbg(lvl_debug,"enter\n"); return NULL; } static void map_filter_search_destroy(struct map_search_priv *ms) { dbg(lvl_debug,"enter\n"); } static void map_filter_destroy(struct map_priv *m) { map_destroy(m->parent); g_free(m); } static int map_filter_set_attr(struct map_priv *m, struct attr *attr) { switch (attr->type) { case attr_filter: parse_filters(m,attr->u.str); return 1; default: return 0; } } static struct map_methods map_methods_filter = { projection_mg, "utf-8", map_filter_destroy, map_filter_rect_new, map_filter_rect_destroy, map_filter_rect_get_item, map_filter_rect_get_item_byid, map_filter_search_new, map_filter_search_destroy, map_filter_search_get_item, NULL, NULL, map_filter_set_attr, }; static struct map_priv * map_filter_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m=NULL; struct attr **parent_attrs,type,*subtype=attr_search(attrs, NULL, attr_subtype),*filter=attr_search(attrs, NULL, attr_filter); struct map *map; int i,j; if (! subtype || !filter) return NULL; i=0; while (attrs[i]) i++; parent_attrs=g_new(struct attr *,i+1); i=0; j=0; while (attrs[i]) { if (attrs[i]->type != attr_filter && attrs[i]->type != attr_type) { if (attrs[i]->type == attr_subtype) { type=*attrs[i]; type.type = attr_type; parent_attrs[j]=&type; } else parent_attrs[j]=attrs[i]; j++; } i++; } parent_attrs[j]=NULL; *meth=map_methods_filter; map=map_new(NULL, parent_attrs); if (map) { m=g_new0(struct map_priv, 1); m->parent=map; parse_filters(m,filter->u.str); } g_free(parent_attrs); return m; } void plugin_init(void) { dbg(lvl_debug,"filter: plugin_init\n"); plugin_register_map_type("filter", map_filter_new); } navit-0.5.0+dfsg.1/navit/map/garmin/000077500000000000000000000000001264204753600170775ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/garmin/CMakeLists.txt000066400000000000000000000006161264204753600216420ustar00rootroot00000000000000add_executable(gentypes gentypes.c) include_directories( ${CMAKE_CURRENT_BINARY_DIR}) # add the command to generate the source code add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/g2nbuiltin.h COMMAND gentypes ${CMAKE_CURRENT_SOURCE_DIR}/garmintypes.txt ${CMAKE_CURRENT_BINARY_DIR}/g2nbuiltin.h DEPENDS gentypes ) module_add_library(map_garmin garmin.c gar2navit.c g2nbuiltin.h) navit-0.5.0+dfsg.1/navit/map/garmin/Makefile.am000066400000000000000000000020731264204753600211350ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_garmin AM_CPPFLAGS+= @LIBGARMIN_CFLAGS@ INCLUDES=-I$(top_srcdir)/navit/map/garmin/libgarmin AM_CPPFLAGS+=-I$(top_srcdir)/navit/map/garmin/libgarmin AM_CPPFLAGS+=-I$(srcdir) modulemap_LTLIBRARIES = libmap_garmin.la libmap_garmin_la_SOURCES = garmin.c garmin.h gar2navit.c gar2navit.h libmap_garmin_la_LIBADD = @LIBGARMIN_LIBS@ libmap_garmin_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ nodist_libmap_garmin_la_SOURCES = g2nbuiltin.h builddir = @builddir@ gar2navit.l$(OBJEXT): g2nbuiltin.h CLEANFILES = g2nbuiltin.h noinst_PROGRAMS=gentypes$(EXEEXT) gentypes_SOURCES=gentypes.c gentypes.$(OBJEXT): gentypes.c $(CC_FOR_BUILD) -I$(top_srcdir)/navit -I$(top_srcdir) -c -o $@ $< gentypes$(EXEEXT): $(gentypes_OBJECTS) $(gentypes_DEPENDENCIES) @rm -f gentypes$(EXEEXT) $(CCLD_FOR_BUILD) -o $@ $(gentypes_OBJECTS) g2nbuiltin.h: gentypes$(EXEEXT) garmintypes.txt ./gentypes$(EXEEXT) $(top_srcdir)/navit/map/garmin/garmintypes.txt $@ EXTRA_DIST = garmintypes.txt navit-0.5.0+dfsg.1/navit/map/garmin/gar2navit.c000066400000000000000000000121361264204753600211430ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ /* File format is: POINT GROUP,0x0100 = town_label_1e5, Megapolis (10M +) GROUP,0x0200 = town_label_5e4, Megapolis (5-10M) ... GROUP,0x1e00-0x1e3f = district_label, District, Province, State Name ... POLYLINE GROUP,0x00 = ALL, street_1_land, Road GROUP,0x01 = MCTL, highway_land, Major HWY thick GROUP,0x02 = MCTL, street_4_land, Principal HWY-thick GROUP,0x03 = MCTL, street_2_land, Principal HWY-medium .... POLYGONE GROUP,0x01 = town_poly, City (>200k) GROUP,0x02 = town_poly, City (<200k) GROUP,0x03 = town_poly, Village GROUP is 0 - RGN1 1 - RGN2-4 */ #include #include #include #include "item.h" #include "attr.h" #include "garmin.h" #include "gar2navit.h" static int add_def(struct gar2nav_conv *conv, int type, unsigned short minid, unsigned short maxid, unsigned int group, char *ntype, char *descr) { enum item_type it; struct gar2navit *g2n; dlog(11, "group=%d type=%d routable=%u min=%04X max=%04X ntype=%s descr=%s\n", group, type, minid, maxid, ntype, descr); it = item_from_name(ntype); if (it==type_none) { dlog(1, "Please define: %s\n", ntype); } g2n = calloc(1, sizeof(*g2n)); if (!g2n) return -1; g2n->id = minid; g2n->maxid = maxid; g2n->ntype = it; g2n->descr = strdup(descr); g2n->group = group; if (type == 1) { g2n->next = conv->points; conv->points = g2n; } else if (type == 2) { g2n->next = conv->polylines; conv->polylines = g2n; } else if (type == 3) { g2n->next = conv->polygons; conv->polygons = g2n; } return 0; } static int load_types_file(char *file, struct gar2nav_conv *conv) { char buf[4096]; char descr[4096]; char ntype[4096]; FILE *fp; unsigned int minid, maxid, group; int rc; int type = -1; fp = fopen(file, "r"); if (!fp) return -1; while (fgets(buf, sizeof(buf), fp)) { if (*buf == '#' || *buf == '\n') continue; if (!strncasecmp(buf, "POINT", 5)) { type = 1; continue; } else if (!strncasecmp(buf, "POI", 3)) { type = 1; continue; } else if (!strncasecmp(buf, "POLYLINE", 8)) { type = 2; continue; } else if (!strncasecmp(buf, "POLYGONE", 8)) { type = 3; continue; } // assume only lines are routable rc = sscanf(buf, "%d, 0x%04X - 0x%04X = %[^\t , ] , %[^\n]", &group, &minid, &maxid, ntype, descr); if (rc != 5) { maxid = 0; rc = sscanf(buf, "%d,0x%04X = %[^\t, ], %[^\n]", &group, &minid, ntype, descr); if (rc != 4) { dlog(1, "Invalid line rc=%d:[%s]\n",rc, buf); dlog(1, "minid=%04X ntype=[%s] des=[%s]\n", minid, ntype, descr); continue; } } add_def(conv, type, minid, maxid, group, ntype, descr); } fclose(fp); return 1; } struct gar2nav_conv *g2n_conv_load(char *file) { struct gar2nav_conv *c; int rc; c = calloc(1, sizeof(*c)); if (!c) return c; rc = load_types_file(file, c); if (rc < 0) { dlog(1, "Failed to load: [%s]\n", file); free(c); return NULL; } return c; } enum item_type g2n_get_type(struct gar2nav_conv *c, unsigned int type, unsigned short id) { struct gar2navit *def = NULL; int group; group = (type >> G2N_KIND_SHIFT); type &= ~G2N_KIND_MASK; if (type == G2N_POINT) def = c->points; else if (type == G2N_POLYLINE) def = c->polylines; else if (type == G2N_POLYGONE) def = c->polygons; else { dlog(1, "Unknown conversion type:%d\n", type); return type_none; } if (!def) { dlog(5, "No conversion data for %d\n", type); return type_none; } while (def) { if (def->group == group && ((!def->maxid && def->id == id) || (def->id <= id && id <= def->maxid))) return def->ntype; def = def->next; } dlog(5, "Type[%d]:ID:[%04X] unknown\n", type, id); return type == G2N_POINT ? type_point_unkn : type_street_unkn; } char *g2n_get_descr(struct gar2nav_conv *c, int type, unsigned short id) { struct gar2navit *def = NULL; if (type == G2N_POINT) def = c->points; else if (type == G2N_POLYLINE) def = c->polylines; else if (type == G2N_POLYGONE) def = c->polygons; else { dlog(1, "Unknown conversion type:%d\n", type); return NULL; } while (def) { if ((!def->maxid && def->id == id) || (def->id <= id && id <= def->maxid)) return def->descr; def = def->next; } dlog(5, "Type[%d]:ID:[%04X] unknown\n", type, id); return NULL; } #if 0 int main(int argc, char **argv) { load_types_file(argv[1], NULL); return 0; } #endif #include "g2nbuiltin.h" navit-0.5.0+dfsg.1/navit/map/garmin/gar2navit.h000066400000000000000000000030711264204753600211460ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ #define GROUP_RGN1 0 #define GROUP_RGN2 1 struct gar2navit { unsigned short id; unsigned short maxid; enum item_type ntype; unsigned group; char *descr; struct gar2navit *next; }; #define G2N_POINT 1 #define G2N_POLYLINE 2 #define G2N_POLYGONE 3 #define G2N_KIND_MASK 0xF0000000 #define G2N_KIND_SHIFT 28 #define G2N_RGN1 (GROUP_RGN1<<29) #define G2N_RGN2 (GROUP_RGN2<<29) struct gar2nav_conv { struct gar2navit *points; struct gar2navit *polylines; struct gar2navit *polygons; }; struct gar2nav_conv *g2n_conv_load(char *file); enum item_type g2n_get_type(struct gar2nav_conv *c, unsigned int type, unsigned short id); char *g2n_get_descr(struct gar2nav_conv *c, int type, unsigned short id); struct gar2nav_conv *g2n_default_conv(void); navit-0.5.0+dfsg.1/navit/map/garmin/garmin.c000066400000000000000000000536471264204753600205370ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ #include #include #include #include #include #include #include #include #include "config.h" #include "plugin.h" #include "data.h" #include "projection.h" #include "item.h" #include "debug.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "coord.h" #include "transform.h" #include #include "attr.h" #include "coord.h" #include #include "garmin.h" #include "gar2navit.h" static int map_id; struct map_priv { int id; char *filename; struct gar2nav_conv *conv; struct gar *g; }; struct map_rect_priv { int id; struct coord_rect r; char *label; // FIXME: Register all strings for searches int limit; struct map_priv *mpriv; struct gmap *gmap; struct gobject *cobj; struct gobject *objs; struct item item; unsigned int last_coord; void *last_itterated; struct coord last_c; void *last_oattr; unsigned int last_attr; struct gar_search *search; }; int garmin_debug = 10; void logfn(char *file, int line, int level, char *fmt, ...) { va_list ap; char fileline[256]; int sz; if (level > garmin_debug) return; va_start(ap, fmt); sz = sprintf(fileline, "%s:%d:%d|", file, line, level); debug_vprintf(0, "", strlen(""), fileline, sz, 1, fmt, ap); va_end(ap); } // need a base map and a map struct gscale { char *label; float scale; int bits; }; static struct gscale mapscales[] = { {"7000 km", 70000.0, 8} ,{"5000 km", 50000.0, 8} ,{"3000 km", 30000.0, 9} ,{"2000 km", 20000.0, 9} ,{"1500 km", 15000.0, 10} ,{"1000 km", 10000.0, 10} ,{"700 km", 7000.0, 11} ,{"500 km", 5000.0, 11} ,{"300 km", 3000.0, 13} ,{"200 km", 2000.0, 13} ,{"150 km", 1500.0, 13} ,{"100 km", 1000.0, 14} ,{"70 km", 700.0, 15} ,{"50 km", 500.0, 16} ,{"30 km", 300.0, 16} ,{"20 km", 200.0, 17} ,{"15 km", 150.0, 17} ,{"10 km", 100.0, 18} ,{"7 km", 70.0, 18} ,{"5 km", 50.0, 19} ,{"3 km", 30.0, 19} ,{"2 km", 20.0, 20} ,{"1.5 km", 15.0, 22} ,{"1 km", 10.0, 24} ,{"700 m", 7.0, 24} ,{"500 m", 5.0, 24} ,{"300 m", 3.0, 24} ,{"200 m", 2.0, 24} ,{"150 m", 1.5, 24} ,{"100 m", 1.0, 24} ,{"70 m", 0.7, 24} ,{"50 m", 0.5, 24} ,{"30 m", 0.3, 24} ,{"20 m", 0.2, 24} ,{"15 m", 0.1, 24} ,{"10 m", 0.15, 24} }; static int garmin_object_label(struct gobject *o, struct attr *attr) { struct map_rect_priv *mr = o->priv_data; char *codepage; char *label; if (!mr) { dlog(1, "Error object do not have priv_data!!\n"); return 0; } if (mr->label) { free(mr->label); } label = gar_get_object_lbl(o); if (label) { codepage = gar_obj_codepage(o); if (*codepage != 'a') { mr->label = g_convert(label, -1,"utf-8",codepage,NULL,NULL,NULL); free(label); } else mr->label = label; } else { mr->label = NULL; return 0; } if (mr->label) { char *cp = mr->label; #warning FIXME Process label and give only the visible part if (*mr->label == '@' || *mr->label == '^') cp++; /* FIXME: If zoomlevel is high convert ^ in the string to spaces */ attr->u.str = cp; return 1; } return 0; } static int garmin_object_debug(struct gobject *o, struct attr *attr) { struct map_rect_priv *mr = o->priv_data; if (!mr) { dlog(1, "Error object do not have priv_data!!\n"); return 0; } if (mr->label) free(mr->label); mr->label = gar_object_debug_str(o); if (mr->label) { attr->u.str = mr->label; return 1; } return 0; } static struct map_search_priv * gmap_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) { struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1); struct gar_search *gs; int rc; dlog(1, "Called!\n"); mr->mpriv=map; gs = g_new0(struct gar_search,1); if (!gs) { dlog(1, "Can not init search \n"); free(mr); return NULL; } mr->search = gs; switch (search->type) { case attr_country_name: gs->type = GS_COUNTRY; break; case attr_town_name: gs->type = GS_CITY; break; case attr_town_postal: gs->type = GS_ZIP; break; case attr_street_name: gs->type = GS_ROAD; break; #if someday case attr_region_name: case attr_intersection: case attr_housenumber: #endif default: dlog(1, "Don't know how to search for %d\n", search->type); goto out_err; } gs->match = partial ? GM_START : GM_EXACT; gs->needle = strdup(search->u.str); dlog(5, "Needle: %s\n", gs->needle); mr->gmap = gar_find_subfiles(mr->mpriv->g, gs, GO_GET_SEARCH); if (!mr->gmap) { dlog(1, "Can not init search \n"); goto out_err; } rc = gar_get_objects(mr->gmap, 0, gs, &mr->objs, GO_GET_SEARCH); if (rc < 0) { dlog(1, "Error loading objects\n"); goto out_err; } mr->cobj = mr->objs; dlog(4, "Loaded %d objects\n", rc); return (struct map_search_priv *)mr; out_err: free(gs); free(mr); return NULL; } /* Assumes that only one item will be itterated at time! */ static void coord_rewind(void *priv_data) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; mr->last_coord = 0; }; static void attr_rewind(void *priv_data) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; mr->last_attr = 0; }; static int point_coord_get(void *priv_data, struct coord *c, int count) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; struct gcoord gc; if (!count) return 0; if (g != mr->last_itterated) { mr->last_itterated = g; mr->last_coord = 0; } if (mr->last_coord > 0) return 0; gar_get_object_coord(mr->gmap, g, &gc); c->x = gc.x; c->y = gc.y; mr->last_coord++; // dlog(1,"point: x=%d y=%d\n", c->x, c->y); // dlog(1, "point: x=%f y=%f\n", GARDEG(c->x), GARDEG(c->y)); return 1; } static int coord_is_node(void *priv_data) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; return gar_is_object_dcoord_node(mr->gmap, g, mr->last_coord); } static int poly_coord_get(void *priv_data, struct coord *c, int count) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; int ndeltas = 0, total = 0; struct gcoord dc; if (!count) return 0; if (g != mr->last_itterated) { mr->last_itterated = g; mr->last_coord = 0; } ndeltas = gar_get_object_deltas(g); if (mr->last_coord > ndeltas + 1) return 0; while (count --) { if (mr->last_coord == 0) { gar_get_object_coord(mr->gmap, g, &dc); mr->last_c.x = dc.x; mr->last_c.y = dc.y; } else { if (!gar_get_object_dcoord(mr->gmap, g, mr->last_coord - 1, &dc)) { mr->last_coord = ndeltas + 2; return total; } mr->last_c.x += dc.x; mr->last_c.y += dc.y; } c->x = mr->last_c.x; c->y = mr->last_c.y; ddlog(1, "poly: x=%f y=%f\n", GARDEG(c->x), GARDEG(c->y)); // dlog(1,"poly: x=%d y=%d\n", c->x, c->y); c++; total++; mr->last_coord ++; } return total; } // for _any we must return one by one static int point_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; int rc; switch (attr_type) { case attr_any: if (g != mr->last_oattr) { mr->last_oattr = g; mr->last_attr = 0; } switch(mr->last_attr) { case 0: mr->last_attr++; attr->type = attr_label; rc = garmin_object_label(g, attr); if (rc) return rc; case 1: mr->last_attr++; attr->type = attr_debug; rc = garmin_object_debug(g, attr); if (rc) return rc; case 2: mr->last_attr++; if (g->type == GO_POLYLINE) { attr->type = attr_street_name; rc = garmin_object_label(g, attr); if (rc) return rc; } case 3: mr->last_attr++; attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; default: return 0; } break; case attr_label: attr->type = attr_label; return garmin_object_label(g, attr); case attr_town_name: attr->type = attr_town_name; return garmin_object_label(g, attr); case attr_street_name: attr->type = attr_type; return garmin_object_label(g, attr); case attr_street_name_systematic: /* TODO: Get secondary labels of roads */ return 0; case attr_flags: attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; default: dlog(1, "Don't know about attribute %d[%04X]=%s yet\n", attr_type,attr_type, attr_to_name(attr_type)); } return 0; } static struct item_methods methods_garmin_point = { coord_rewind, point_coord_get, attr_rewind, point_attr_get, }; static struct item_methods methods_garmin_poly = { coord_rewind, poly_coord_get, attr_rewind, // point_attr_rewind, point_attr_get, // poly_attr_get, coord_is_node, }; static int search_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; int rc; switch (attr_type) { case attr_any: if (g != mr->last_oattr) { mr->last_oattr = g; mr->last_attr = 0; } switch(mr->last_attr) { case 0: mr->last_attr++; attr->type = attr_label; rc = garmin_object_label(g, attr); if (rc) return rc; case 1: mr->last_attr++; attr->type = attr_debug; rc = garmin_object_debug(g, attr); if (rc) return rc; case 2: mr->last_attr++; if (g->type == GO_POLYLINE) { attr->type = attr_street_name; rc = garmin_object_label(g, attr); if (rc) return rc; } case 3: mr->last_attr++; attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; default: return 0; } break; case attr_label: attr->type = attr_label; return garmin_object_label(g, attr); case attr_town_name: attr->type = attr_town_name; if (mr->label) free(mr->label); mr->label = gar_srch_get_city(g); attr->u.str = mr->label; if (attr->u.str) return 1; return 0; case attr_town_id: rc = gar_srch_get_cityid(g); if (rc) { attr->type = attr_town_id; attr->u.num = rc; return 1; } return 0; case attr_town_postal: attr->type = attr_town_postal; attr->u.str = gar_srch_get_zip(g); if (attr->u.str) return 1; return 0; case attr_street_name: attr->type = attr_street_name; if (mr->label) free(mr->label); mr->label = gar_srch_get_roadname(g); attr->u.str = mr->label; if (attr->u.str) return 1; return 0; case attr_street_id: attr->type = attr_street_id; attr->u.num = gar_srch_get_roadid(g); if (attr->u.num) return 1; return 0; case attr_flags: attr->type = attr_flags; attr->u.num = 0; rc = gar_object_flags(g); if (rc & F_ONEWAY) attr->u.num |= AF_ONEWAY; if (rc & F_SEGMENTED) attr->u.num |= AF_SEGMENTED; return 1; case attr_country_id: rc = gar_srch_get_countryid(g); if (rc) { attr->type = attr_country_id; attr->u.num = rc; return 1; } return 0; case attr_country_name: attr->type = attr_country_name; attr->u.str = gar_srch_get_country(g); if (attr->u.str) return 1; return 0; case attr_district_id: rc = gar_srch_get_regionid(g); if (rc) { attr->type = attr_district_id; attr->u.num = rc; return 1; } return 0; case attr_district_name: attr->type = attr_district_name; attr->u.str = gar_srch_get_region(g); if (attr->u.str) return 1; return 0; case attr_town_streets_item: return 0; default: dlog(1, "Don't know about attribute %d[%04X]=%s yet\n", attr_type,attr_type, attr_to_name(attr_type)); } return 0; } static int search_coord_get(void *priv_data, struct coord *c, int count) { struct gobject *g = priv_data; struct map_rect_priv *mr = g->priv_data; struct gcoord gc; if (!count) return 0; if (g != mr->last_itterated) { mr->last_itterated = g; mr->last_coord = 0; } if (mr->last_coord > 0) return 0; if (gar_get_object_coord(mr->gmap, g, &gc)) { c->x = gc.x; c->y = gc.y; mr->last_coord++; return 1; } return 0; } static struct item_methods methods_garmin_search = { coord_rewind, search_coord_get, attr_rewind, search_attr_get, }; static struct item * garmin_poi2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { if (mr->mpriv->conv) { int mask = gar_object_group(o) << G2N_KIND_SHIFT; mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POINT|mask, otype); } mr->item.meth = &methods_garmin_point; return &mr->item; } static struct item * garmin_pl2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { if (mr->mpriv->conv) { int mask = gar_object_group(o) << G2N_KIND_SHIFT; mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POLYLINE|mask, otype); } mr->item.meth = &methods_garmin_poly; return &mr->item; } static struct item * garmin_pg2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { if (mr->mpriv->conv) { int mask = gar_object_group(o) << G2N_KIND_SHIFT; mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POLYGONE|mask, otype); } mr->item.meth = &methods_garmin_poly; return &mr->item; } static struct item * garmin_srch2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) { mr->item.type = type_country_label; mr->item.meth = &methods_garmin_search; return &mr->item; } static struct item * garmin_obj2item(struct map_rect_priv *mr, struct gobject *o) { unsigned short otype; otype = gar_obj_type(o); mr->item.type = type_none; switch (o->type) { case GO_POINT: return garmin_poi2item(mr, o, otype); case GO_POLYLINE: return garmin_pl2item(mr, o, otype); case GO_POLYGON: return garmin_pg2item(mr, o, otype); case GO_ROAD: return garmin_pl2item(mr, o, otype); #if 0 case GO_SEARCH: return garmin_srch2item(mr, o, otype); #endif default: dlog(1, "Unknown garmin object type:%d\n", o->type); } return NULL; } static struct item * gmap_rect_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct gobject *o; o = mr->objs = gar_get_object_by_id(mr->mpriv->g, id_hi, id_lo); if (!o) { dlog(1, "Can not find object\n"); return NULL; } mr->item.id_hi = id_hi; mr->item.id_lo = id_lo; mr->item.priv_data = o; mr->item.type = type_none; o->priv_data = mr; if (!garmin_obj2item(mr, o)) return NULL; return &mr->item; } static struct item * gmap_rect_get_item(struct map_rect_priv *mr) { struct gobject *o; if (!mr->objs) return NULL; if (!mr->cobj) return NULL; // mr->cobj = mr->objs; o = mr->cobj; // dlog(1, "gi:o=%p\n", o); mr->cobj = mr->cobj->next; if (o) { mr->item.id_hi = gar_object_mapid(o); mr->item.id_lo = gar_object_index(o); mr->item.priv_data = o; mr->item.type = type_none; o->priv_data = mr; if (!garmin_obj2item(mr, o)) return NULL; return &mr->item; } return NULL; } #define max(a,b) ((a) > (b) ? (a) : (b)) struct nl2gl_t { int g; int bits; char *descr; }; struct nl2gl_t nl2gl_1[] = { { /* 0 */ .g = 12, .descr = "0-120m", }, { /* 1 */ .g = 11, .descr = "0-120m", }, { /* 2 */ .g = 10, .descr = "0-120m", }, { /* 3 */ .g = 9, .descr = "0-120m", }, { /* 4 */ .g = 8, .descr = "0-120m", }, { /* 5 */ .g = 7, .descr = "0-120m", }, { /* 6 */ .g = 6, .descr = "0-120m", }, { /* 7 */ .g = 5, .descr = "0-120m", }, { /* 8 */ .g = 4, .descr = "0-120m", }, { /* 9 */ .g = 4, .descr = "0-120m", }, { /* 10 */ .g = 3, .descr = "0-120m", }, { /* 11 */ .g = 3, .descr = "0-120m", }, { /* 12 */ .g = 2, .descr = "0-120m", }, { /* 13 */ .g = 2, .descr = "0-120m", }, { /* 14 */ .g = 2, .descr = "0-120m", }, { /* 15 */ .g = 1, .descr = "0-120m", }, { /* 16 */ .g = 1, .descr = "0-120m", }, { /* 17 */ .g = 1, .descr = "0-120m", }, { /* 18 */ .g = 0, .descr = "0-120m", }, }; struct nl2gl_t nl2gl[] = { { /* 0 */ .g = 9, .descr = "0-120m", }, { /* 1 */ .g = 9, .descr = "0-120m", }, { /* 2 */ .g = 8, .descr = "0-120m", }, { /* 3 */ .g = 8, .descr = "0-120m", }, { /* 4 */ .g = 7, .descr = "0-120m", }, { /* 5 */ .g = 7, .descr = "0-120m", }, { /* 6 */ .g = 6, .descr = "0-120m", }, { /* 7 */ .g = 6, .descr = "0-120m", }, { /* 8 */ .g = 5, .descr = "0-120m", }, { /* 9 */ .g = 5, .descr = "0-120m", }, { /* 10 */ .g = 4, .descr = "0-120m", }, { /* 11 */ .g = 4, .descr = "0-120m", }, { /* 12 */ .g = 3, .descr = "0-120m", }, { /* 13 */ .g = 3, .descr = "0-120m", }, { /* 14 */ .g = 2, .descr = "0-120m", }, { /* 15 */ .g = 2, .descr = "0-120m", }, { /* 16 */ .g = 1, .descr = "0-120m", }, { /* 17 */ .g = 1, .descr = "0-120m", }, { /* 18 */ .g = 0, .descr = "0-120m", }, }; static int get_level(struct map_selection *sel) { return sel->order; } static int garmin_get_selection(struct map_rect_priv *map, struct map_selection *sel) { struct gar_rect r; struct gmap *gm; struct gobject **glast = NULL; int rc; int sl, el; int level = 0; // 18; /* max level for maps, overview maps can have bigger /* levels we do not deal w/ them */ int flags = 0; if (sel && sel->range.min == type_street_0 && sel->range.max == type_ferry) { // Get all roads flags = GO_GET_ROUTABLE; } else if (sel) flags = GO_GET_SORTED; if (sel) { r.lulat = sel->u.c_rect.lu.y; r.lulong = sel->u.c_rect.lu.x; r.rllat = sel->u.c_rect.rl.y; r.rllong = sel->u.c_rect.rl.x; level = get_level(sel); // level = nl2gl[level].g; dlog(2, "Looking level=%d for %f %f %f %f\n", level, r.lulat, r.lulong, r.rllat, r.rllong); } gm = gar_find_subfiles(map->mpriv->g, sel ? &r : NULL, flags); if (!gm) { if (sel) { dlog(1, "Can not find map data for the area: %f %f %f %f\n", r.lulat, r.lulong, r.rllat, r.rllong); } else { dlog(1, "Can not find map data\n"); } return -1; } #if 0 sl = (18-(gm->maxlevel - gm->minlevel))/2; el = sl + (gm->maxlevel - gm->minlevel); if (level < sl) level = sl; if (level > el) level = el; level = level - sl; level = (gm->maxlevel - gm->minlevel) - level; dlog(3, "sl=%d el=%d level=%d\n", sl, el, level); #endif sl = (18-gm->zoomlevels)/2; el = sl + gm->zoomlevels; if (level < sl) level = sl; if (level > el) level = el; level = level - sl; level = gm->basebits + level; dlog(3, "sl=%d el=%d level=%d\n", sl, el, level); map->gmap = gm; glast = &map->objs; while (*glast) { if ((*glast)->next) { *glast = (*glast)->next; } else break; } rc = gar_get_objects(gm, level, sel ? &r : NULL, glast, flags); if (rc < 0) { dlog(1, "Error loading objects\n"); return -1; } map->cobj = map->objs; dlog(2, "Loaded %d objects\n", rc); return rc; } // Can not return NULL, navit segfaults static struct map_rect_priv * gmap_rect_new(struct map_priv *map, struct map_selection *sel) { struct map_selection *ms = sel; struct map_rect_priv *mr; if (!map) return NULL; mr = calloc(1, sizeof(*mr)); if (!mr) return mr; mr->mpriv = map; if (!sel) { return mr; } else { while (ms) { dlog(2, "order %d\n", ms->order); if (garmin_get_selection(mr, ms) < 0) { // free(mr); // return NULL; } ms = ms->next; } } return mr; } static void gmap_rect_destroy(struct map_rect_priv *mr) { dlog(11,"destroy maprect\n"); if (mr->gmap) gar_free_gmap(mr->gmap); if (mr->objs) gar_free_objects(mr->objs); if (mr->label) free(mr->label); free(mr); } static void gmap_search_destroy(struct map_search_priv *ms) { gmap_rect_destroy((struct map_rect_priv *)ms); } static void gmap_destroy(struct map_priv *m) { dlog(5, "garmin_map_destroy\n"); if (m->g) gar_free(m->g); if (m->filename) free(m->filename); free(m); } static struct map_methods map_methods = { projection_garmin, "utf-8", gmap_destroy, gmap_rect_new, gmap_rect_destroy, gmap_rect_get_item, gmap_rect_get_item_byid, gmap_search_new, gmap_search_destroy, NULL, }; static struct map_priv * gmap_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data; struct attr *debug; struct attr *flags; char buf[PATH_MAX]; struct stat st; int dl = 1; struct gar_config cfg; int debugmask = 0; data=attr_search(attrs, NULL, attr_data); if (! data) return NULL; debug=attr_search(attrs, NULL, attr_debug); if (debug) { dl = atoi(debug->u.str); if (!dl) dl = 1; } flags=attr_search(attrs, NULL, attr_flags); if (flags) { debugmask = flags->u.num; } m=g_new(struct map_priv, 1); m->id=++map_id; m->filename = strdup(data->u.str); if (!m->filename) { g_free(m); return NULL; } memset(&cfg, 0, sizeof(struct gar_config)); cfg.opm = OPM_GPS; cfg.debuglevel = dl; cfg.debugmask = debugmask; garmin_debug = dl; m->g = gar_init_cfg(NULL, logfn, &cfg); if (!m->g) { g_free(m->filename); g_free(m); return NULL; } // we want the data now, later we can load only what's necessery if (gar_img_load(m->g, m->filename, 1) < 0) { gar_free(m->g); g_free(m->filename); g_free(m); return NULL; } m->conv = NULL; snprintf(buf, sizeof(buf), "%s.types", m->filename); if (!stat(buf, &st)) { dlog(1, "Loading custom types from %s\n", buf); m->conv = g2n_conv_load(buf); } if (!m->conv) { dlog(1, "Using builtin types\n"); m->conv = g2n_default_conv(); } if (!m->conv) { dlog(1, "Failed to load map types\n"); } *meth=map_methods; return m; } void plugin_init(void) { plugin_register_map_type("garmin", gmap_new); } navit-0.5.0+dfsg.1/navit/map/garmin/garmin.h000066400000000000000000000020741264204753600205300ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ #define dlog(x,y ...) logfn(__FILE__,__LINE__,x, ##y) #ifdef HARDDEBUG #define ddlog(x,y ...) logfn(__FILE__,__LINE__,x, ##y) #else #define ddlog(x,y ...) #endif extern int garmin_debug; void logfn(char *file, int line, int level, char *fmt, ...); navit-0.5.0+dfsg.1/navit/map/garmin/garmintypes.txt000066400000000000000000000662001264204753600222060ustar00rootroot00000000000000# # # POINT 0, 0x0000 = label_unkn, Unknown label 0, 0x0100 = town_label_1e5, Megapolis (10M +) 0, 0x0200 = town_label_5e4, Megapolis (5-10M) 0, 0x0300 = town_label_2e4, Big City (2-5M) 0, 0x0400 = town_label_1e4, Big City (1-2M) 0, 0x0500 = town_label_5e3, Big City (0.5-1M) 0, 0x0600 = town_label_2e3, City (200-500k) 0, 0x0700 = town_label_1e3, City (100-200k) 0, 0x0800 = town_label_5e2, City (50-100k) 0, 0x0900 = town_label_2e2, City (20-50k) 0, 0x0a00 = town_label_1e2, City (10-20k) 0, 0x0b00 = town_label_5e1, Small City (5-10k) 0, 0x0c00 = town_label_2e1, Small City (2-5k) 0, 0x0d00 = town_label_1e1, Village (1-2k) 0, 0x0e00 = town_label_5e0, Village (500-1000) 0, 0x0f00 = town_label_2e0, Village (200-500) 0, 0x1000 = town_label_1e0, Village (100-200) 0, 0x1100 = town_label_0e0, Village (0-100) 0, 0x1200 = port_label, Port with services 0, 0x1300 = label_unkn, Unknown label2 0, 0x1400-0x14FF = country_label, Large Country Name 0, 0x1500-0x15FF = country_label, Country Name 0, 0x1c00 = poi_wreck, Unclassified Obstruction 0, 0x1c01 = poi_wreck, Wreck 0, 0x1c02 = poi_danger_sea_wreck, submerged wreck, dangerous 0, 0x1c03 = poi_nondangerous, submerged wreck, non-dangerous 0, 0x1c04 = poi_wreck, Wreck, cleared by wire drag 0, 0x1c05 = poi_rock, Obstruction, visible at high water 0, 0x1c06 = poi_rock, Obstruction, awash 0, 0x1c07 = poi_rock, Obstruction, submerged 0, 0x1c08 = poi_rock, Obstruction, cleared by wire drag 0, 0x1c09 = poi_rock, Rock, awash 0, 0x1c0a = poi_rock, Rock, submerged at low Water 0, 0x1c0b = poi_sounding, Sounding 0, 0x1d00 = poi_tide, Tide Prediction 0, 0x1e00-0x1e3f = district_label, District, Province, State Name 0, 0x1f00 = district_label_0e0, Region, District Name # Fixme if it has label how to change to highway_exit_with_label ?? 0, 0x2000-0x203F = highway_exit, Exit 0, 0x2100-0x213F = highway_exit, Exit with Services 0, 0x2200-0x223F = highway_exit, Exit with Restroom 0, 0x2300-0x233F = highway_exit, Exit with Convinience Store 0, 0x2400-0x243F = highway_exit, Exit with Weight Station 0, 0x2500-0x253F = highway_exit, Exit with Toolbooth Booth 0, 0x2600-0x263F = highway_exit, Exit with Information 0, 0x2700-0x273F = highway_exit, Exit 0, 0x2800-0x283F = district_label_1e0, Region Name 0, 0x2900 = poi_public_utilities, Services 0, 0x2A00 = poi_dining, Dining(Other) 0, 0x2A01 = poi_dining, Dining(American) 0, 0x2A02 = poi_dining, Dining(Asian) 0, 0x2A03 = poi_dining, Dining(Barbecue) 0, 0x2A04 = poi_dining, Dining(Chinese) 0, 0x2A05 = poi_dining, Dining(Deli/Bakery) 0, 0x2A06 = poi_dining, Dining(International) 0, 0x2A07 = poi_fastfood, Fast Food 0, 0x2A08 = poi_dining, Dining(Italian) 0, 0x2A09 = poi_dining, Dining(Mexican) 0, 0x2A0A = poi_dining, Dining(Pizza) 0, 0x2A0B = poi_dining, Dining(Sea Food) 0, 0x2A0C = poi_dining, Dining(Steak/Grill) 0, 0x2A0D = poi_dining, Dining(Bagel/Donut) 0, 0x2A0E = poi_dining, Dining(Cafe/Diner) 0, 0x2A0F = poi_dining, Dining(French) 0, 0x2A10 = poi_dining, Dining(German) 0, 0x2A11 = poi_dining, Dining(British Isles) 0, 0x2A12 = poi_dining, Dining(Special Foods) 0, 0x2B00 = poi_hotel, Hotel(Other) 0, 0x2B01 = poi_hotel, Hotel/Motel 0, 0x2B02 = poi_hotel, Bed & Breakfast inn 0, 0x2B03 = poi_camp_rv, Camping/RV-Park 0, 0x2B04 = poi_resort, Resort 0, 0x2C00 = poi_attraction, Amusement Park 0, 0x2C01 = poi_attraction, Amusement Park 0, 0x2C02 = poi_museum_history, Museum/History 0, 0x2C03 = poi_library, Libraries 0, 0x2C04 = poi_landmark, Land Mark 0, 0x2C05 = poi_school, School 0, 0x2C06 = poi_park, Park 0, 0x2C07 = poi_zoo, Zoo 0, 0x2C08 = poi_stadium, Sportpark, Stadium,(point) 0, 0x2C09 = poi_fair, Fair, Conference(point) 0, 0x2C0A = poi_wine, Wine restaurant(point) 0, 0x2C0B = poi_worship, Place of Worship 0, 0x2C0C = poi_hotspring, Hot Spring 0, 0x2D00 = poi_theater, Theater 0, 0x2D01 = poi_theater, Theater 0, 0x2D02 = poi_bar, Bar 0, 0x2D03 = poi_cinema, Cinema 0, 0x2D04 = poi_casino, Casino 0, 0x2D05 = poi_golf, Golf 0, 0x2D06 = poi_skiing, Skiing Center 0, 0x2D07 = poi_bowling, Bowling 0, 0x2D08 = poi_icesport, Ice/Sporting 0, 0x2D09 = poi_swimming, Swimming 0, 0x2D0A = poi_sport, Sports(point) 0, 0x2D0B = poi_sailing, Sailing Airport 0, 0x2E00 = poi_shopping, Shoping general 0, 0x2E01 = poi_shop_department, Department Store 0, 0x2E02 = poi_shop_grocery, Grocery 0, 0x2E03 = poi_shop_merchandise, General Merchandiser 0, 0x2E04 = poi_mall, Shopping Center 0, 0x2E05 = poi_pharmacy, Pharmacy 0, 0x2E06 = poi_shopping, Convenience 0, 0x2E07 = poi_shop_apparel, Apparel 0, 0x2E08 = poi_shop_handg, House and Garden 0, 0x2E09 = poi_shop_furniture, Home Furnishing 0, 0x2E0a = poi_shop_retail, Special Retail 0, 0x2E0b = poi_shop_computer, Computer/Software 0, 0x2E0c = poi_shop_computer, Mobile Communications 0, 0x2F00 = poi_service, generic service 0, 0x2F01 = poi_fuel, Fuel/Gas 0, 0x2F02 = poi_car_rent, Car Rental 0, 0x2F03 = poi_autoservice, Car Repair 0, 0x2F04 = poi_airport, Airport 0, 0x2F05 = poi_post_office, Post Office 0, 0x2F06 = poi_bank, Bank 0, 0x2F07 = poi_car_dealer_parts, Car Dealer(point) 0, 0x2F08 = poi_bus_station, Bus Station 0, 0x2F09 = poi_marina, Marina 0, 0x2F0A = poi_wrecker, Wrecker Service 0, 0x2F0B = poi_car_parking, Parking 0, 0x2F0C = poi_restroom, Restroom 0, 0x2F0D = poi_auto_club, Automobile Club 0, 0x2F0E = poi_car_wash, Car Wash 0, 0x2F0F = poi_shop_gps, Garmin Dealer 0, 0x2F10 = poi_personal_service, Personal Service 0, 0x2F11 = poi_business_service, Business Service 0, 0x2F12 = poi_communication, Communication 0, 0x2F13 = poi_repair_service, Repair Service 0, 0x2F14 = poi_social_service, Social Service 0, 0x2F15 = poi_public_utilities, Utility 0, 0x2F16 = poi_truck_stop, Truck Stop 0, 0x2F17 = poi_bus_stop, Bus Stop 0, 0x3000 = poi_emergency, generic emergency/government 0, 0x3001 = poi_police, Police Station 0, 0x3002 = poi_hospital, Hospital 0, 0x3003 = poi_public_office, Public Office 0, 0x3004 = poi_justice, Justice 0, 0x3005 = poi_concert, Concert hall(point) 0, 0x3006 = poi_border_station, Border Station(point) 0, 0x3007 = poi_goverment_building, Goverment Building 0, 0x3008 = poi_firebrigade, FireFighters Station 0, 0x4000-0x403F = poi_golf, Golf 0, 0x4100-0x413F = poi_fish, Fish 0, 0x4200-0x423F = poi_wreck, Wreck 0, 0x4300-0x433F = poi_marina, Marina 0, 0x4400-0x443F = poi_fuel, Gas 0, 0x4500-0x453F = poi_restaurant, Restaurant 0, 0x4600-0x463F = poi_bar, Bar 0, 0x4700-0x473F = poi_boat_ramp, Boat Ramp 0, 0x4800-0x483F = poi_camping, Camping 0, 0x4900-0x493F = poi_park, Park 0, 0x4A00-0x4A3F = poi_picnic, Picnic Area 0, 0x4B00-0x4B3F = poi_hospital, Hospital 0, 0x4C00-0x4C3F = poi_information, Information 0, 0x4D00-0x4D3F = poi_car_parking, Parking 0, 0x4E00-0x4E3F = poi_restroom, Restroom 0, 0x4F00-0x4F3F = poi_shower, Shower 0, 0x5000-0x503F = poi_drinking_water, Drinking Water 0, 0x5100-0x513F = poi_telephone, Telephone 0, 0x5200-0x523F = poi_scenic_area, Scenic Area 0, 0x5300-0x533F = poi_skiing, Skiing 0, 0x5400-0x543F = poi_swimming, Swimming 0, 0x5500-0x553F = poi_dam, Dam 0, 0x5600-0x563F = poi_forbidden_area, Forbiden Area 0, 0x5700-0x573F = poi_danger_area, Danger Area 0, 0x5800-0x583F = poi_restricted_area, Restricted Area 0, 0x5900 = poi_airport, Generic Airport 0, 0x5901 = poi_airport, Large Airport 0, 0x5902 = poi_airport, Medium Airport 0, 0x5903 = poi_airport, Small Airport 0, 0x5904 = poi_heliport, Heliport 0, 0x5905-0x593F = poi_airport, Airport 0, 0x5a00 = poi_mark, Kilometer Pole 0, 0x5b00 = poi_mark, Kolokol 0, 0x5c00 = poi_diving, Diving Place 0, 0x5D00-0x5D3F = poi_daymark, Daymark,Green Square 0, 0x5E00-0x5E3F = poi_daymark, Daymark,Red Triangle 0, 0x6000 = poi_loudspeaker, LoudSpeaker 0, 0x6100 = poi_building, House 0, 0x6200 = poi_height, Height with point in feet one decimal place 0, 0x6300 = poi_height, Height without point in feet no decimal place 0, 0x6400 = poi_manmade_feature, Manmade Feature 0, 0x6401 = poi_bridge, Bridge 0, 0x6402 = poi_building, Building 0, 0x6403 = poi_cemetery, Cemetery 0, 0x6404 = poi_church, Church 0, 0x6405 = poi_townhall, Civil 0, 0x6406 = poi_crossing, Crossing 0, 0x6407 = poi_dam, Dam 0, 0x6408 = poi_hospital, Hospital 0, 0x6409 = poi_levee, Levee 0, 0x640A = poi_locale, Locale 0, 0x640B = poi_military, Military 0, 0x640C = poi_mine, Mine 0, 0x640D = poi_oil_field, Oil Field 0, 0x640E = poi_park, Park 0, 0x640F = poi_post_office, Post 0, 0x6410 = poi_school, School 0, 0x6411 = poi_tower, Tower 0, 0x6412 = poi_trail, Trail 0, 0x6413 = poi_tunnel, Tunnel 0, 0x6414 = poi_drinking_water, Drink water 0, 0x6415 = town_ghost, Ghost Town 0, 0x6416 = poi_ruins, Subdivision 0, 0x6500 = poi_water_feature, Water Feature 0, 0x6501 = poi_water_feature, Arroyo 0, 0x6502 = poi_water_feature, Sand Bar 0, 0x6503 = poi_bay, Bay 0, 0x6504 = poi_bend, Bend 0, 0x6505 = poi_water_feature, Canal 0, 0x6506 = poi_water_feature, Channel 0, 0x6507 = poi_cove, Cove 0, 0x6508 = poi_water_feature, Falls 0, 0x6509 = poi_water_feature, Geyser 0, 0x650A = poi_water_feature, Glacier 0, 0x650B = poi_marine, Harbour 0, 0x650C = poi_island, Island 0, 0x650D = poi_water_feature, Lake 0, 0x650E = poi_water_feature, Rapids 0, 0x650F = poi_water_feature, Reservoir 0, 0x6510 = poi_water_feature, Sea 0, 0x6511 = poi_water_feature, Spring 0, 0x6512 = poi_water_feature, Stream 0, 0x6513 = poi_water_feature, Swamp 0, 0x6600 = poi_land_feature, Land Feature 0, 0x6601 = poi_land_feature, Arch 0, 0x6602 = poi_land_feature, Area 0, 0x6603 = poi_land_feature, Basin 0, 0x6604 = poi_land_feature, Beach 0, 0x6605 = poi_land_feature, Bench 0, 0x6606 = poi_land_feature, Cape 0, 0x6607 = poi_land_feature, Cliff 0, 0x6608 = poi_land_feature, Crater 0, 0x6609 = poi_land_feature, Flat 0, 0x660A = poi_land_feature, Forest 0, 0x660B = poi_land_feature, Gap 0, 0x660C = poi_land_feature, Gut 0, 0x660D = poi_land_feature, Isthmus 0, 0x660E = poi_land_feature, Lava 0, 0x660F = poi_land_feature, Pillar 0, 0x6610 = poi_land_feature, Plain 0, 0x6611 = poi_land_feature, Range 0, 0x6612 = poi_land_feature, Reserve 0, 0x6613 = poi_land_feature, Ridge 0, 0x6614 = poi_land_feature, Rock 0, 0x6615 = poi_land_feature, Slope 0, 0x6616 = poi_land_feature, Summit 0, 0x6617 = poi_land_feature, Valley 0, 0x6618 = poi_land_feature, Woods # This are dublicated to 0x1700, 0x1800, 0x1900, 0x1A00, 0x1B00 # fix them if you need them 0, 0x1600 = poi_marine_type, Beakon 0, 0x1601 = poi_marine_type, Fog Horn 0, 0x1602 = poi_marine_type, Radio Beacon 0, 0x1603 = poi_marine_type, Racon 0, 0x1604 = poi_marine_type, Day Beacon, red triangle 0, 0x1605 = poi_marine_type, Day Beacon, green square 0, 0x1606 = poi_marine_type, Day Beacon, white diamond 0, 0x1607 = poi_marine_type, unlit Navaid, white 0, 0x1608 = poi_marine_type, unlit Navaid, red 0, 0x1609 = poi_marine_type, unlit Navaid, green 0, 0x160a = poi_marine_type, unlit Navaid, black 0, 0x160b = poi_marine_type, unlit Navaid, yellow or amber 0, 0x160c = poi_marine_type, unlit Navaid, orange 0, 0x160d = poi_marine_type, unlit Navaid, multi colored 0, 0x160e = poi_marine_type, Navaid, unknown 0, 0x160f = poi_marine_type, lighted Navaid, white 0, 0x1610 = poi_marine_type, lighted Navaid, red 0, 0x1611 = poi_marine_type, lighted Navaid, green 0, 0x1612 = poi_marine_type, lighted Navaid, yellow or amber 0, 0x1613 = poi_marine_type, lighted Navaid, orange 0, 0x1614 = poi_marine_type, lighted Navaid, violet 0, 0x1615 = poi_marine_type, lighted Navaid, blue 0, 0x1616 = poi_marine_type, lighted Navaid, multi colored # RGN2-4 types # Marine types start 1, 0x0100 = point_unkn, Light 1, 0x0102 = point_unkn, Light with north topmark 1, 0x0103 = point_unkn, Light with south topmark 1, 0x0104 = point_unkn, Light with east topmark 1, 0x0105 = point_unkn, Light with west topmark 1, 0x0106 = point_unkn, Isolated danger light 1, 0x0107 = point_unkn, Port hand light 1, 0x0108 = point_unkn, Starboard hand light 1, 0x0109 = point_unkn, Special purpose light 1, 0x010a = point_unkn, Safe water light 1, 0x0200 = point_unkn, Buoy 1, 0x0201 = point_unkn, Buoy 1, 0x0202 = point_unkn, Buoy with north topmark 1, 0x0203 = point_unkn, Buoy with south topmark 1, 0x0204 = point_unkn, Buoy with east topmark 1, 0x0205 = point_unkn, Buoy with west topmark 1, 0x0206 = point_unkn, Beacon 1, 0x0207 = point_unkn, Spar buoy 1, 0x0208 = point_unkn, Isolated danger buoy 1, 0x0209 = point_unkn, Port hand buoy 1, 0x020a = point_unkn, Starboard hand buoy 1, 0x020b = point_unkn, Special purpose buoy 1, 0x020c = point_unkn, Safe water buoy 1, 0x020d = point_unkn, Platform buoy 1, 0x020e = point_unkn, Beacon with north topmark 1, 0x020f = point_unkn, Beacon with south north topmark 1, 0x0210 = point_unkn, Beacon with east topmark 1, 0x0211 = point_unkn, Beacon with west topmark 1, 0x0212 = point_unkn, Isolated danger beacon 1, 0x0213 = point_unkn, Port hand beacon 1, 0x0214 = point_unkn, Starboard hand beacon 1, 0x0215 = point_unkn, Special purpose beacon 1, 0x0216 = point_unkn, Mooring buoy 1, 0x0217 = point_unkn, Fixed point 1, 0x0218 = point_unkn, Pole 1, 0x0300 = point_unkn, Depth point 1, 0x0301 = point_unkn, Depth point invisible 1, 0x0302 = point_unkn, Depth point underscore 1, 0x0303 = point_unkn, Spot height 1, 0x0304 = point_unkn, Building 1, 0x0305 = point_unkn, Chimney 1, 0x0306 = point_unkn, Church 1, 0x0307 = point_unkn, Tanks 1, 0x0308 = point_unkn, Tower 1, 0x0309 = point_unkn, Rock 1, 0x030a = point_unkn, Triangulation point 1, 0x030b = point_unkn, Radio mast 1, 0x0400 = point_unkn, Isolated danger 1, 0x0401 = point_unkn, Obstruction 1, 0x0402 = point_unkn, Wreck 1, 0x0403 = point_unkn, Exposed wreck 1, 0x0404 = point_unkn, Well 1, 0x0405 = point_unkn, Foul 1, 0x0406 = point_unkn, Explosive 1, 0x0407 = point_unkn, Fish haven 1, 0x0408 = point_unkn, Obstruction that covers 1, 0x0409 = point_unkn, Marine farm 1, 0x040a = point_unkn, Dangerous rock 1, 0x040b = point_unkn, No bottom found 1, 0x040c = point_unkn, Exposed rock 1, 0x040d = point_unkn, Dangerous rock 1, 0x040e = point_unkn, Underwater rock (non-dangerous rock) 1, 0x040f = point_unkn, Shoal 1, 0x0500 = point_unkn, Label point 1, 0x0600 = point_unkn, Centered label 1, 0x0700 = point_unkn, Miscellaneous point 1, 0x0701 = point_unkn, Recommended anchorage 1, 0x0702 = point_unkn, Pilot boarding place 1, 0x0703 = point_unkn, Yacht harbour 1, 0x0704 = point_unkn, Pile 1, 0x0705 = point_unkn, Anchoring prohibited 1, 0x0706 = point_unkn, Fishing prohibited 1, 0x0707 = point_unkn, Precautionary area 1, 0x0708 = point_unkn, Radio report point 1, 0x0709 = point_unkn, Anchorage berths 1, 0x070a = point_unkn, Rescue station 1, 0x070b = point_unkn, Fishing harbour 1, 0x070c = point_unkn, Airport 1, 0x0800 = point_unkn, Information 1, 0x0901 = point_unkn, Bottom conditions 1, 0x0902 = point_unkn, Fishing information 1, 0x0903 = point_unkn, Facility # NT types start 1, 0x0b00 = poi_dining, Dining(Other) 1, 0x0b04 = poi_dining, Dining(Chinese) 1, 0x0b05 = poi_dining, Dining (Deli/Bakery) 1, 0x0b06 = poi_dining, Dining (International) 1, 0x0b07 = poi_fastfood, Fast Food 1, 0x0b09 = poi_dining, Dining(Mexican) 1, 0x0b0a = poi_dining, Dining(Pizza) 1, 0x0b0b = poi_dining, Dining (Sea Food) 1, 0x0b0c = poi_dining, Dining (Steak/Grill) 1, 0x0b0d = poi_dining, Dining(Bagel/Donut) 1, 0x0b0e = poi_dining, Dining(Cafe/Diner) 1, 0x0c01 = poi_hotel, Hotel/Motel 1, 0x0c02 = poi_hotel, Bed & Breakfast inn 1, 0x0c03 = poi_camp_rv, Camping/RV-Park 1, 0x0c04 = poi_resort, Resort 1, 0x0d01 = poi_attraction, Amusement Park 1, 0x0d02 = poi_museum_history, Museum/History 1, 0x0d03 = poi_fair, Fair, Conference(point) 1, 0x0d04 = poi_scenic_area, Scenic Area 1, 0x0d05 = poi_school, School 1, 0x0d06 = poi_park, Park 1, 0x0d07 = poi_zoo, Zoo 1, 0x0d08 = poi_stadium, Sportpark, Stadium 1, 0x0d0a = poi_bar, Wine Bar 1, 0x0d14 = poi_hospital, Hospital 1, 0x0e01 = poi_theater, Theater 1, 0x0e02 = poi_bar, Bar 1, 0x0e03 = poi_cinema, Cinema 1, 0x0e04 = poi_casino, Casino 1, 0x0e05 = poi_golf, Golf 1, 0x0e06 = poi_skiing, Skiing Center/Lift 1, 0x0e07 = poi_bar, Night Bar/Piano 1, 0x0e08 = poi_icesport, Ice/Sporting 1, 0x0e09 = poi_swimming, Swimming 1, 0x0e0a = poi_sport, Sports(point) 1, 0x0f00 = poi_hotel, Hotel(Other) 1, 0x0f01 = poi_shop_department, Department Store 1, 0x0f02 = poi_shop_grocery, Grocery 1, 0x0f03 = poi_hotel, Hotel/Motel 1, 0x0f04 = poi_resort, Resort 1, 0x0f05 = poi_pharmacy, Pharmacy 1, 0x1001 = poi_fuel, Fuel/Gas 1, 0x1002 = poly_car_parking, Parking Lot 1, 0x1003 = poi_autoservice, Car Repair 1, 0x1004 = poi_airport, Airport 1, 0x1005 = poi_post_office, Post Office 1, 0x1006 = poi_bank, Bank 1, 0x1008 = poi_bus_station, Bus station 1, 0x1009 = poi_marina, SeaPort 1, 0x100a = poi_wrecker, Wrecker Service 1, 0x100b = poi_car_parking, Parking 1, 0x100d = poi_car_dealer_parts, Car Dealer(point) 1, 0x100e = poi_car_wash, Car Wash 1, 0x1011 = poi_bussines_service, Business Service 1, 0x1012 = poi_communication, Communication 1, 0x1013 = poi_repair_service, Repair Service 1, 0x1014 = poi_social_service, Social Service 1, 0x1015 = poi_public_utilities, Utility 1, 0x1101 = poi_police, Police Station 1, 0x1102 = poi_hospital, Hospital 1, 0x1104 = poi_justice, Justice 1, 0x1107 = poi_public_office, Public Office 1, 0x1400 = town_label_1e5, Megapolis (10M +) 1, 0x1401 = town_label_5e4, Megapolis (5-10M) 1, 0x1402 = town_label_2e4, Big City (2-5M) 1, 0x1403 = town_label_5e3, Big City (0.5-1M) 1, 0x1404 = town_label_2e3, City (200-500k) 1, 0x1405 = town_label_1e3, City (100-200k) 1, 0x1406 = town_label_5e2, City (50-100k) 1, 0x1405 = town_label_2e2, City (20-50k) 1, 0x1406 = town_label_1e2, City (10-20k) 1, 0x1407 = town_label_5e1, Small City (5-10k) 1, 0x1408 = town_label_2e1, Small City (2-5k) 1, 0x1409 = town_label_1e1, Village (1-2k) 1, 0x140a = town_label_5e0, Village (500-1000) 1, 0x140b = town_label_2e0, Village (200-500) 1, 0x140c = town_label_1e0, Village (100-200) 1, 0x140d = town_label_0e0, Village (0-100) 1, 0x1500 = poi_personal_service, Personal Service 1, 0x1501 = poi_bussines_service, Bussines Service POLYLINE 0, 0x00 = street_1_land, Road 0, 0x01 = highway_land, Major HWY thick 0, 0x02 = street_4_land, Principal HWY-thick 0, 0x03 = street_2_land, Principal HWY-medium 0, 0x04 = street_3_city, Arterial Road-medium 0, 0x05 = street_4_city, Arterial Road-thick 0, 0x06 = street_2_city, Road-thin 0, 0x07 = street_1_city, Alley-thick 0, 0x08 = ramp, Ramp 0, 0x09 = ramp, Ramp highspeed 0, 0x0a = street_0, Unpaved Road-thin 0, 0x0b = ramp, Major HWY Connector-thick 0, 0x0c = roundabout, Roundabout 0, 0x0d = street_unkn, Custom defined street 1 0, 0x0e = street_unkn, Custom defined street 2 0, 0x0f = street_unkn, Custom defined street 3 0, 0x10 = street_unkn, Custom defined street 4 0, 0x11 = street_unkn, Custom defined street 5 0, 0x12 = street_unkn, Custom defined street 6 0, 0x13 = street_unkn, Custom defined street 7 0, 0x14 = rail, Railroad 0, 0x15 = water_line, Shoreline 0, 0x16 = street_nopass, Trail 0, 0x18 = water_line, Stream-thin 0, 0x19 = time_zone, Time-Zone 0, 0x1a = ferry, Ferry 0, 0x1b = ferry, Ferry 0, 0x1c = border_country, Political Boundary 0, 0x1d = border_country, County Boundary 0, 0x1e = border_country, Intl. Boundary 0, 0x1f = water_line, River 0, 0x20 = height_line_1, Land Contour (thin) Height in feet 0, 0x21 = height_line_2, Land Contour (medium) Height in feet 0, 0x22 = height_line_3, Land Contour (thick) Height in feet 0, 0x23 = depth_line_1, Depth Contour (thin) Depth in feet 0, 0x24 = depth_line_2, Depth Contour (medium) Depth in feet 0, 0x25 = depth_line_3, Depth Contour (thick) Depth in feet 0, 0x26 = water_line, Intermittent River 0, 0x27 = street_nopass, Airport Runway 0, 0x28 = pipeline, Pipeline 0, 0x29 = powerline, Powerline 0, 0x2a = marine_boundary, Marine Boundary (no line) 0, 0x2b = marine_hazard, Marine Hazard (no line) # RGN2-4 # Marine 1, 0x0100 = street_unkn, Miscellaneous line 1, 0x0101 = street_unkn, Line 1, 0x0102 = street_unkn, Cartographic line 1, 0x0103 = street_unkn, Road 1, 0x0104 = street_unkn, Clearing line 1, 0x0105 = street_unkn, Contour line 1, 0x0106 = street_unkn, Overhead cable 1, 0x0107 = street_unkn, Bridge 1, 0x0108 = street_unkn, Recommended route 1, 0x0109 = street_unkn, Chart border 1, 0x0300 = street_unkn, Depth contour 1, 0x0301 = street_unkn, Depth contour value 1, 0x0307 = street_unkn, Intertidal zone border 1, 0x0400 = street_unkn, Obstruction line 1, 0x0401 = street_unkn, Submarine cable 1, 0x0402 = street_unkn, Submarine pipeline 1, 0x0403 = street_unkn, Pile barrier 1, 0x0404 = street_unkn, Fishing stakes 1, 0x0405 = street_unkn, Supply pipeline area 1, 0x0406 = street_unkn, Submarine cable area 1, 0x0407 = street_unkn, Dumping ground 1, 0x0408 = street_unkn, Explosive dumping ground 1, 0x0409 = street_unkn, Danger line 1, 0x040a = street_unkn, Overhead cable 1, 0x040b = street_unkn, Submerged construction 1, 0x040c = street_unkn, Pier/jetty 1, 0x0500 = street_unkn, Restriction 1, 0x0501 = street_unkn, Anchoring prohibited 1, 0x0502 = street_unkn, Fishing prohibited 1, 0x0503 = street_unkn, Prohibited area 1, 0x0504 = street_unkn, Military practice area 1, 0x0505 = street_unkn, Anchoring and fishing prohibited 1, 0x0506 = street_unkn, Limit of nature reservation 1, 0x0507 = street_unkn, Restricted area 1, 0x0508 = street_unkn, Minefield 1, 0x0600 = street_unkn, Miscellaneous line 1, 0x0601 = street_unkn, Cartographic line 1, 0x0602 = street_unkn, Traffic separation line 1, 0x0603 = street_unkn, International maritime boundary 1, 0x0604 = street_unkn, Straight territorial sea baseline 1, 0x0605 = street_unkn, Seaward limit of territorial sea 1, 0x0606 = street_unkn, Anchorage area 1, 0x0607 = street_unkn, Quarantine anchorage area 1, 0x0608 = street_unkn, Fishery zone 1, 0x0609 = street_unkn, Swept area 1, 0x060a = street_unkn, Traffic separation zone 1, 0x060b = street_unkn, Limit of exclusive economic zone 1, 0x060c = street_unkn, Established direction of traffic flow 1, 0x060d = street_unkn, Recommended direction of traffic flow 1, 0x060e = street_unkn, Harbour limit 1, 0x060f = street_unkn, Inadequately surveyed area 1, 0x0610 = street_unkn, Inshore traffic zone 1, 0x0611 = street_unkn, Limit of traffic lane 1, 0x0701 = street_unkn, River channel 1, 0x0702 = street_unkn, Submerged object 1, 0x0703 = street_unkn, Submerged object 1, 0x0704 = street_unkn, Submerged object 1, 0x0705 = street_unkn, Submerged object 1, 0x0706 = street_unkn, Chart boundary # NT types 1, 0x0a00 = water_line, River 1, 0x0a01 = water_line, Small River 1, 0x0a19 = street_unkn, Dry Creek 1, 0x0b04 = border_country, Country Border POLYGONE 0, 0x01 = poly_town, City (>200k) 0, 0x02 = poly_town, City (<200k) 0, 0x03 = poly_town, Village 0, 0x04 = poly_military_zone, Military 0, 0x05 = poly_car_parking, Parking Lot 0, 0x06 = poly_car_parking, Parking Garage 0, 0x07 = poly_airport, Airport 0, 0x08 = poly_commercial_center, Shopping Center 0, 0x09 = poly_marine, Marina 0, 0x0a = poly_university, University/College 0, 0x0b = poly_hospital, Hospital 0, 0x0c = poly_industry, Industrial 0, 0x0d = area, Reservation 0, 0x0e = poly_airport, Airport Runway 0, 0x13 = area_unspecified, Man made area 0, 0x14 = poly_national_park, National park 0, 0x15 = poly_national_park, National park 0, 0x16 = poly_nature_park, National park 0, 0x17 = poly_park, City Park 0, 0x18 = poly_golf_course, Golf 0, 0x19 = poly_sport, Sport 0, 0x1a = poly_cemetery, Cemetery 0, 0x1e = poly_nature_park, State Park 0, 0x1f = poly_park, State Park 0, 0x20 = poly_park, State Park 0, 0x28 = poly_water, Ocean 0, 0x29 = poly_water, Water Reservour 0, 0x32 = poly_water, Sea 0, 0x3b = poly_water, Water Reservour 0, 0x3c = poly_water, Lake (250-600 km2) 0, 0x3d = poly_water, Lake (77-250 km2) 0, 0x3e = poly_water, Lake (25-77 km2) 0, 0x3f = poly_water, Lake (11-25 km2) 0, 0x40 = poly_water, Lake (0.25-11 km2) 0, 0x41 = poly_water, Lake (<0.25 km2) 0, 0x42 = poly_water, Lake (>3.3k km2) 0, 0x43 = poly_water, Lake (1.1-3.3k km2) 0, 0x44 = poly_water, Lake (0.6-1.1k km2) 0, 0x45 = poly_water, Water Reservour 0, 0x46 = poly_water, River (>1km) 0, 0x47 = poly_water, River (200m-1km) 0, 0x48 = poly_water, River (40-200m) 0, 0x49 = poly_water, River (<40m) 0, 0x4a = area, Definition Area 0, 0x4b = area, Background 0, 0x4c = poly_water, Intermittent River/Lake 0, 0x4d = poly_glacier, Glaciers 0, 0x4e = plantation, Orchard or plantation 0, 0x4f = poly_scrub, Scrub 0, 0x50 = poly_wood, Woods 0, 0x51 = poly_wetland, Wetland 0, 0x52 = tundra, Tundra 0, 0x53 = poly_flats, Flats # RGN2-4 # Marine 1, 0x0100 = street_unkn, Land - white 1, 0x0101 = street_unkn, Land - non-urban 1, 0x0102 = street_unkn, Land - urban 1, 0x0103 = street_unkn, Chart exclusion area 1, 0x0104 = street_unkn, Chart background 1, 0x0105 = street_unkn, Bridge 1, 0x0300 = street_unkn, Depth area - white 1 1, 0x0301 = street_unkn, Intertidal zone 1, 0x0302 = street_unkn, Depth area - blue 1 1, 0x0303 = street_unkn, Depth area - blue 2 1, 0x0304 = street_unkn, Depth area - blue 3 1, 0x0305 = street_unkn, Depth area - blue 4 1, 0x0306 = street_unkn, Depth area - blue 5 1, 0x0307 = street_unkn, Depth area - white 1, 0x0400 = street_unkn, Obstruction (invisible) 1, 0x0401 = street_unkn, Submarine cable (invisible) 1, 0x0402 = street_unkn, Submarine pipeline (invisible) 1, 0x0403 = street_unkn, Pile barrier (invisible) 1, 0x0404 = street_unkn, Fishing stakes (invisible) 1, 0x0405 = street_unkn, Supply pipeline area/line (invisible) 1, 0x0406 = street_unkn, Submarine cable area/line (invisible) 1, 0x0407 = street_unkn, Dumping ground (invisible) 1, 0x0408 = street_unkn, Explosive dumping ground (invisible) 1, 0x0409 = street_unkn, Danger line (invisible) 1, 0x040a = street_unkn, Overhead cable (invisible) 1, 0x040b = street_unkn, Submerged construction (invisible) 1, 0x040c = street_unkn, Pier/jetty (invisible) 1, 0x0500 = street_unkn, Restriction area/line (invisible) 1, 0x0501 = street_unkn, Anchoring prohibited (invisible) 1, 0x0502 = street_unkn, Fishing prohibited (invisible) 1, 0x0503 = street_unkn, Prohibited area (invisible) 1, 0x0504 = street_unkn, Military practice area (invisible) 1, 0x0505 = street_unkn, Anchoring and fishing prohibited (invisible) 1, 0x0506 = street_unkn, Limit of nature reservation (invisible) 1, 0x0507 = street_unkn, Restricted area (invisible) 1, 0x0508 = street_unkn, Minefield (invisible) 1, 0x0600 = street_unkn, Miscellaneous area 1, 0x0601 = street_unkn, Cartographic area 1, 0x0602 = street_unkn, Traffic separation area 1, 0x0603 = street_unkn, International maritime boundary 1, 0x0604 = street_unkn, Straight territorial sea baseline 1, 0x0605 = street_unkn, Seaward limit of territorial sea 1, 0x0606 = street_unkn, Anchorage area 1, 0x0607 = street_unkn, Quarantine anchorage area 1, 0x0608 = street_unkn, Fishery zone 1, 0x0609 = street_unkn, Swept area 1, 0x060a = street_unkn, Traffic separation zone 1, 0x060b = street_unkn, Limit of exclusive economic zone 1, 0x060c = street_unkn, Established direction of traffic flow 1, 0x0701 = street_unkn, Fishing area 1, 0x0702 = street_unkn, Restricted area 1, 0x0703 = street_unkn, Anchorage area 1, 0x0704 = street_unkn, Fishing Hot Spots chart # NT types 1, 0x0800 = poly_town, Large City 1, 0x0801 = poly_town, City 1, 0x0900 = poly_plaza, Square/Place 1, 0x0902 = poly_car_parking, Car Park (Parking Lot) 1, 0x0904 = poly_airport, Airport 1, 0x090d = poly_sports_stadium, Stage like circus/sport/stadium 1, 0x090e = poly_cemetery, Graveyard/Cemetery 1, 0x0a01 = poly_national_park, National Park 1, 0x0a04 = poly_park, City Park 1, 0x0a05 = poly_nature_park, Nature Park 1, 0x0a06 = street_unkn, Dam/Man made/ ?? 1, 0x0b02 = poly_water, Sea 1, 0x0b03 = poly_water, Water Reservour 1, 0x0b07 = poly_water, Dam/Lake 1, 0x0b08 = poly_water, Dam/Lake 1, 0x0b0c = poly_water, River navit-0.5.0+dfsg.1/navit/map/garmin/gentypes.c000066400000000000000000000071041264204753600211030ustar00rootroot00000000000000/* Copyright (C) 2007 Alexander Atanasov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. */ /* File format is: POINT GROUP,0x0100 = town_label_1e5, Megapolis (10M +) GROUP,0x0200 = town_label_5e4, Megapolis (5-10M) ... GROUP,0x1e00-0x1e3f = district_label, District, Province, State Name ... POLYLINE GROUP,0x00 = street_1_land, Road GROUP,0x01 = highway_land, Major HWY thick GROUP,0x02 = street_4_land, Principal HWY-thick GROUP,0x03 = street_2_land, Principal HWY-medium .... POLYGONE GROUP,0x01 = town_poly, City (>200k) GROUP,0x02 = town_poly, City (<200k) GROUP,0x03 = town_poly, Village GROUP is 0 - good old garmin types in RGN1 1 - NT types in RGN2-4 5 is completely unknown yet */ #include #include #include #include #include "item.h" #include "gar2navit.h" #define dlog(x, y...) fprintf(stderr, ## y) /* static int add_def(struct gar2nav_conv *conv, int type, unsigned short minid, unsigned short maxid, unsigned int routable, char *ntype, char *descr) */ static void print_header(FILE *fp) { fprintf(fp, "// This is autogenerated file -- DO NOT EDIT\n"); fprintf(fp, "struct gar2nav_conv *g2n_default_conv(void)\n" "{\n" "\tstruct gar2nav_conv *conv;\n" "\n" "\tconv = calloc(1, sizeof(*conv));\n" "\tif (!conv)\n" "\t\treturn conv;\n"); } static int load_types_file(char *file, char *out) { char buf[4096]; char descr[4096]; char ntype[4096]; FILE *fp; unsigned int minid, maxid, group; int rc; int type = -1; FILE *fpout = stdout; fp = fopen(file, "r"); if (!fp) return -1; if (out) { fpout = fopen(out, "w"); if (!fpout) return -1; } print_header(fpout); while (fgets(buf, sizeof(buf), fp)) { if (*buf == '#' || *buf == '\n') continue; if (!strncasecmp(buf, "POINT", 5)) { type = 1; continue; } else if (!strncasecmp(buf, "POI", 3)) { type = 1; continue; } else if (!strncasecmp(buf, "POLYLINE", 8)) { type = 2; continue; } else if (!strncasecmp(buf, "POLYGONE", 8)) { type = 3; continue; } rc = sscanf(buf, "%d, 0x%04X - 0x%04X = %[^\t , ] , %[^\n]", &group, &minid, &maxid, ntype, descr); if (rc != 5) { maxid = 0; rc = sscanf(buf, "%d, 0x%04X = %[^\t, ], %[^\n]", &group,&minid, ntype, descr); if (rc != 4) { dlog(1, "Invalid line rc=%d:[%s]\n",rc, buf); dlog(1, "minid=%04X ntype=[%s] des=[%s]\n", minid, ntype, descr); continue; } } fprintf(fpout, "\tadd_def(conv, %d, %#.04x, %#.04x, %d, \"%s\", \"%s\");\n", type, minid, maxid, group, ntype, descr); } fprintf(fpout, "\treturn conv;\n"); fprintf(fpout, "}\n"); fclose(fp); if (out) fclose(fpout); return 1; } int main(int argc, char **argv) { if (argc!=3) { fprintf(stderr, "Usage: %s garmintypes.txt outfile.c\n", argv[0]); return -1; } if (load_types_file(argv[1], argv[2]) < 0) { unlink(argv[2]); return -1; } return 0; } navit-0.5.0+dfsg.1/navit/map/garmin_img/000077500000000000000000000000001264204753600177335ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/garmin_img/Makefile.am000066400000000000000000000003751264204753600217740ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_garmin_img modulemap_LTLIBRARIES = libmap_garmin_img.la libmap_garmin_img_la_SOURCES = garmin_img.c libmap_garmin_img_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/map/garmin_img/garmin_img.c000066400000000000000000001036051264204753600222150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #include "plugin.h" #include "data.h" #include "projection.h" #include "map.h" #include "maptype.h" #include "item.h" #include "attr.h" #include "coord.h" #include "transform.h" #include #include "attr.h" #include "coord.h" struct file { FILE *f; int offset; }; int shift=5; int subdiv_next=0x10; static void * file_read(struct file *f, int offset, int size) { void *ptr; int ret; ptr=calloc(size, 1); if (! ptr) return ptr; fseek(f->f, f->offset+offset, SEEK_SET); ret=fread(ptr, size, 1, f->f); if (ret != 1) { printf("fread %d vs %d offset %d+%d(0x%x)\n", ret, size, f->offset, offset,offset); g_assert(1==0); } return ptr; } static void file_free(void *ptr) { free(ptr); } struct offset_len { int offset; int length; } __attribute ((packed)); static void dump_offset_len(struct offset_len *off_len) { printf("offset: 0x%x(%d) length 0x%x(%d)\n", off_len->offset, off_len->offset, off_len->length, off_len->length); } struct timestamp { short creation_year; char creation_month; char creation_day; char creation_hour; char creation_minute; char creation_second; } __attribute__((packed)); struct img_header { char xor; char zero1[9]; char update_month; char update_year; char zero2[3]; char checksum[1]; char signature[7]; char unknown1[1]; char unknown2[2]; char unknown3[2]; char unknown4[2]; char unknown5[2]; char zero3[25]; struct timestamp ts; char unknown6; char map_file_identifier[7]; char unknown12; char map_description1[20]; short unknown13; short unknown14; char e1; char e2; char other[413]; char zero4[512]; char unknown7; char unknown8[11]; int file_offset; char unknown9; char unknown10[15]; char unknown11[480]; } __attribute__((packed)); static void dump_ts(struct timestamp *ts) { printf("%d-%02d-%02d %02d:%02d:%02d\n", ts->creation_year, ts->creation_month, ts->creation_day, ts->creation_hour, ts->creation_minute, ts->creation_second); } #if 0 static void dump_img(struct img_header *img_hdr) { printf("signature: '%s'\n", img_hdr->signature); printf("creation: "); dump_ts(&img_hdr->ts); printf("map_file_identifier: '%s'\n", img_hdr->map_file_identifier); printf("file_offset: 0x%x\n", img_hdr->file_offset); printf("e1: 0x%x(%d)\n", img_hdr->e1, img_hdr->e1); printf("e2: 0x%x(%d)\n", img_hdr->e2, img_hdr->e2); printf("offset 0x%x\n", (int) &img_hdr->e1 - (int) img_hdr); printf("size %d\n", sizeof(*img_hdr)); } #endif struct fat_block { char flag; char filename[8]; char type[3]; int size; char zero1; char part; char zero[14]; unsigned short blocks[240]; } __attribute__((packed)); #if 0 static void dump_fat_block(struct fat_block *fat_blk) { int i=0; char name[9]; char type[4]; printf("flag: 0x%x(%d)\n", fat_blk->flag, fat_blk->flag); strcpy(name, fat_blk->filename); name[8]='\0'; strcpy(type, fat_blk->type); type[3]='\0'; printf("name: '%s.%s'\n", name, type); printf("size: 0x%x(%d)\n", fat_blk->size, fat_blk->size); printf("part: 0x%x(%d)\n", fat_blk->part, fat_blk->part); printf("blocks: "); while (i < 240) { printf("0x%x(%d) ",fat_blk->blocks[i], fat_blk->blocks[i]); if (fat_blk->blocks[i] == 0xffff) break; i++; } printf("size: %d\n", sizeof(*fat_blk)); } #endif struct file_header { short header_len; char type[10]; char unknown1; char unknown2; struct timestamp ts; } __attribute__((packed)); static void dump_file(struct file_header *fil_hdr) { printf("header_len: %d\n", fil_hdr->header_len); printf("type: '%s'\n", fil_hdr->type); printf("unknown1: 0x%x(%d)\n", fil_hdr->unknown1, fil_hdr->unknown1); printf("unknown2: 0x%x(%d)\n", fil_hdr->unknown2, fil_hdr->unknown2); printf("creation: "); dump_ts(&fil_hdr->ts); printf("size %d\n", sizeof(*fil_hdr)); } struct region_header { struct file_header fil_hdr; struct offset_len offset_len; } __attribute__((packed)); #if 0 static void dump_region(struct region_header *rgn_hdr) { dump_offset_len(&rgn_hdr->offset_len); } #endif struct map_priv { int id; char *filename; }; struct map_rect_priv { struct coord_rect r; int limit; struct file tre; struct tree_header *tre_hdr; struct file rgn; struct region_header *rgn_hdr; struct file lbl; struct label_header *lbl_hdr; char *label; int subdiv_level_count; int subdiv_pos; char *subdiv; int rgn_offset; int rgn_end; struct rgn_point *pnt; struct rgn_poly *ply; unsigned char *ply_data; int ply_bitpos; int ply_bitcount; int ply_lngbits; int ply_latbits; int ply_lng; int ply_lat; int ply_lnglimit; int ply_latlimit; int ply_lngsign; int ply_latsign; struct offset_len rgn_items[4]; int rgn_type; int count; FILE *f; long pos; char line[256]; int attr_pos; enum attr_type attr_last; char attrs[256]; char attr[256]; double lat,lng; char lat_c,lng_c; int eoc; struct map_priv *m; struct item item; }; static int map_id; static int contains_coord(char *line) { return g_ascii_isdigit(line[0]); } static int debug=1; static int get_tag(char *line, char *name, int *pos, char *ret) { int len,quoted; char *p,*e,*n; if (debug) printf("get_tag %s from %s\n", name, line); if (! name) return 0; len=strlen(name); if (pos) p=line+*pos; else p=line; for(;;) { while (*p == ' ') { p++; } if (! *p) return 0; n=p; e=index(p,'='); if (! e) return 0; p=e+1; quoted=0; while (*p) { if (*p == ' ' && !quoted) break; if (*p == '"') quoted=1-quoted; p++; } if (e-n == len && !strncmp(n, name, len)) { e++; len=p-e; if (e[0] == '"') { e++; len-=2; } strncpy(ret, e, len); ret[len]='\0'; if (pos) *pos=p-line; return 1; } } return 0; } static void get_line(struct map_rect_priv *mr) { mr->pos=ftell(mr->f); fgets(mr->line, 256, mr->f); } static void map_destroy_garmin_img(struct map_priv *m) { if (debug) printf("map_destroy_garmin_img\n"); g_free(m); } static char * map_charset_garmin_img(struct map_priv *m) { return "iso8859-1"; } static enum projection map_projection_garmin_img(struct map_priv *m) { return projection_garmin; } struct label_data_offset { struct offset_len offset_len; char multiplier; char data; } __attribute ((packed)); #if 0 static void dump_label_data_offset(struct label_data_offset *lbl_dat) { dump_offset_len(&lbl_dat->offset_len); printf("multiplier 0x%x(%d)\n", lbl_dat->multiplier, lbl_dat->multiplier); printf("data 0x%x(%d)\n", lbl_dat->data, lbl_dat->data); } #endif struct label_data { struct offset_len offset_len; short size; int zero; } __attribute ((packed)); static void dump_label_data(struct label_data *lbl_dat) { dump_offset_len(&lbl_dat->offset_len); printf("size 0x%x(%d)\n", lbl_dat->size, lbl_dat->size); } struct tree_header { struct file_header fil_hdr; char boundary[12]; struct offset_len level; struct offset_len subdivision; struct label_data copyright; struct offset_len tre7; short unknown1; char zero1; struct label_data polyline; struct label_data polygon; struct label_data point; int mapid; }; static void dump_tree_header(struct tree_header *tre_hdr) { printf("tree_header:\n"); dump_file(&tre_hdr->fil_hdr); printf("level: "); dump_offset_len(&tre_hdr->level); printf("subdivision: "); dump_offset_len(&tre_hdr->subdivision); printf("copyright: "); dump_label_data(&tre_hdr->copyright); printf("polyline: "); dump_label_data(&tre_hdr->polyline); printf("polygon: "); dump_label_data(&tre_hdr->polygon); printf("point: "); dump_label_data(&tre_hdr->point); printf("len: 0x%x(%d)\n", sizeof(*tre_hdr), sizeof(*tre_hdr)); } struct label_header { struct file_header fil_hdr; struct label_data_offset label; struct label_data country; struct label_data region; struct label_data city; struct label_data poi_index; struct label_data_offset poi_properties; short zero1; char zero2; struct label_data poi_types; struct label_data zip; struct label_data hway; struct label_data exit; struct label_data hway_data; int unknown1; short unknown2; struct offset_len sort_descriptor; struct label_data lbl13; struct label_data lbl14; } __attribute((packed)); #if 0 static void dump_label(struct label_header *lbl_hdr) { dump_file(&lbl_hdr->fil_hdr); printf("label:\n"); dump_label_data_offset(&lbl_hdr->label); printf("country:\n"); dump_label_data(&lbl_hdr->country); printf("region:\n"); dump_label_data(&lbl_hdr->region); printf("city:\n"); dump_label_data(&lbl_hdr->city); printf("poi_index:\n"); dump_label_data(&lbl_hdr->poi_index); printf("poi_properties:\n"); dump_label_data_offset(&lbl_hdr->poi_properties); printf("poi_types:\n"); dump_label_data(&lbl_hdr->poi_types); printf("zip:\n"); dump_label_data(&lbl_hdr->zip); printf("hway:\n"); dump_label_data(&lbl_hdr->hway); printf("exit:\n"); dump_label_data(&lbl_hdr->exit); printf("hway_data:\n"); dump_label_data(&lbl_hdr->hway_data); printf("lbl13:\n"); dump_label_data(&lbl_hdr->lbl13); printf("lbl14:\n"); dump_label_data(&lbl_hdr->lbl14); printf("len: 0x%x(%d)\n", sizeof(*lbl_hdr), sizeof(*lbl_hdr)); } #endif struct triple { unsigned char data[3]; } __attribute((packed)); static unsigned int triple_u(struct triple *t) { return t->data[0] | (t->data[1] << 8) | (t->data[2] << 16); } static int triple(struct triple *t) { int ret=t->data[0] | (t->data[1] << 8) | (t->data[2] << 16); if (ret > 1<<23) ret=ret-(1<<24); return ret; } static void dump_triple_u(struct triple *t) { int val=triple_u(t); printf("0x%x(%d)\n", val, val); } struct tcoord { struct triple lng,lat; } __attribute((packed)); static void dump_tcoord(struct tcoord *t) { printf ("0x%x(%d),0x%x(%d)\n", triple_u(&t->lng), triple_u(&t->lng), triple_u(&t->lat), triple_u(&t->lat)); } struct level { unsigned char zoom; unsigned char bits_per_coord; unsigned short subdivisions; } __attribute((packed)); static void dump_level(struct level *lvl) { printf("level:\n"); printf("\tzoom 0x%x(%d)\n", lvl->zoom, lvl->zoom); printf("\tbits_per_coord 0x%x(%d)\n", lvl->bits_per_coord, lvl->bits_per_coord); printf("\tsubdivisions 0x%x(%d)\n", lvl->subdivisions, lvl->subdivisions); } struct subdivision { struct triple rgn_offset; unsigned char types; struct tcoord center; unsigned short width; unsigned short height; unsigned short next; } __attribute((packed)); static void dump_subdivision(struct subdivision *sub) { printf("subdivision:\n"); printf("\trgn_offset: "); dump_triple_u(&sub->rgn_offset); printf("\ttypes: 0x%x(%d)\n", sub->types, sub->types); printf("\tcenter: "); dump_tcoord(&sub->center); printf("\tsize: 0x%x(%d)x0x%x(%d) %s\n",sub->width & 0x7fff, sub->width & 0x7fff, sub->height, sub->height, sub->width & 0x8000 ? "Terminating" : ""); printf("\tnext: 0x%x(%d)\n",sub->next, sub->next); printf("\tlen: 0x%x(%d)\n", sizeof(*sub), sizeof(*sub)); } struct rgn_point { unsigned char info; struct triple lbl_offset; short lng_delta; short lat_delta; unsigned char subtype; } __attribute((packed)); static void dump_point(struct rgn_point *pnt) { printf("point:\n"); printf("\tinfo 0x%x(%d)\n", pnt->info, pnt->info); printf("\tlbl_offset 0x%x(%d)\n", triple_u(&pnt->lbl_offset), triple_u(&pnt->lbl_offset)); printf("\tlng_delta 0x%x(%d)\n", pnt->lng_delta, pnt->lng_delta); printf("\tlat_delta 0x%x(%d)\n", pnt->lat_delta, pnt->lat_delta); printf("\tsubtype 0x%x(%d)\n", pnt->subtype, pnt->subtype); printf("\tlen: 0x%x(%d)\n", sizeof(*pnt), sizeof(*pnt)); } struct rgn_poly { unsigned char info; struct triple lbl_offset; short lng_delta; short lat_delta; union { struct { unsigned char bitstream_len; unsigned char bitstream_info; } __attribute((packed)) p1; struct { unsigned short bitstream_len; unsigned char bitstream_info; } __attribute((packed)) p2; } __attribute((packed)) u; } __attribute((packed)); static void dump_poly(struct rgn_poly *ply) { printf("poly:\n"); printf("\tinfo 0x%x(%d)\n", ply->info, ply->info); printf("\tlbl_offset 0x%x(%d)\n", triple_u(&ply->lbl_offset), triple_u(&ply->lbl_offset)); printf("\tlng_delta 0x%x(%d)\n", ply->lng_delta, ply->lng_delta); printf("\tlat_delta 0x%x(%d)\n", ply->lat_delta, ply->lat_delta); if (ply->info & 0x80) { printf("\tbitstream_len 0x%x(%d)\n", ply->u.p2.bitstream_len, ply->u.p2.bitstream_len); printf("\tbitstream_info 0x%x(%d)\n", ply->u.p2.bitstream_info, ply->u.p2.bitstream_info); } else { printf("\tbitstream_len 0x%x(%d)\n", ply->u.p1.bitstream_len, ply->u.p1.bitstream_len); printf("\tbitstream_info 0x%x(%d)\n", ply->u.p1.bitstream_info, ply->u.p1.bitstream_info); } printf("\tlen: 0x%x(%d)\n", sizeof(*ply), sizeof(*ply)); } static void dump_hex(void *ptr, int len) { unsigned char *c=ptr; while (len--) { printf("%02x ", *c++); } printf("\n"); } static void dump_hex_r(void *ptr, int len, int rec) { unsigned char *c=ptr; int l=rec; while (len--) { printf("%02x ", *c++); if (! --l) { printf("\n"); l=rec; } } printf("\n"); } #if 0 static void dump_label_offset(struct map_rect_priv *mr, int offset) { void *p; p=file_read(&mr->lbl, mr->lbl_hdr->label.offset_len.offset+offset, 128); printf("%s\n", (char *)p); } #endif #if 0 static void dump_region_item(struct subdivision *sub, struct file *rgn, struct map_rect_priv *mr) { int offset,item_offset,i,j; unsigned short count=0; unsigned short *offsets[4]; unsigned short *file_offsets; struct rgn_point *pnt; offset=triple_u(&sub->rgn_offset)+mr->rgn_hdr->offset_len.offset; file_offsets=file_read(rgn, offset, 90*sizeof(unsigned short)); printf("0x%x ", offset); dump_hex(file_offsets, 90); for (i=0 ; i < 4 ; i++) { printf("i=%d\n", i); if (sub->types & (0x10 << i)) { if (count) { offsets[i]=&file_offsets[count-1]; } else offsets[i]=&count; count++; } else offsets[i]=NULL; } count--; count*=2; for (i=0 ; i < 4 ; i++) { printf("i=%d\n", i); if (offsets[i]) { printf("offset[%d]=0x%x(%d)\n", i, *offsets[i], *offsets[i]); switch (i) { case 0: printf("point\n"); break; case 1: printf("indexed point\n"); break; case 2: printf("polyline\n"); break; case 3: printf("polygon\n"); break; } item_offset=offset+*offsets[i]; switch (i) { case 0: case 1: for (j = 0 ; j < 10 ; j++) { struct coord_geo g; char buffer[1024]; double conv=180.0/(1UL<<23); pnt=file_read(rgn, item_offset, sizeof(*pnt)*20); // printf("0x%x ", item_offset); dump_hex(pnt, 32); dump_point(pnt); g.lng=(triple(&sub->center.lng)+(pnt->lng_delta << shift))*conv; g.lat=(triple(&sub->center.lat)+(pnt->lat_delta << shift))*conv; printf("%f %f\n", g.lng, g.lat); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS, buffer,sizeof(buffer)); printf("%s\n", buffer); dump_label_offset(mr, triple_u(&pnt->lbl_offset)); if (pnt->info & 0x80) item_offset+=sizeof(*pnt); else item_offset+=sizeof(*pnt)-1; } } } else { printf("offset[%d] doesn't exist\n", i); } } file_free(file_offsets); } #endif static void dump_levels(struct map_rect_priv *mr) { int i,offset; struct level *lvl; offset=mr->tre_hdr->level.offset; for (i = 0 ; i < mr->tre_hdr->level.length/sizeof(*lvl) ; i++) { lvl=file_read(&mr->tre, offset, sizeof(*lvl)); dump_level(lvl); offset+=sizeof(*lvl); } } #if 0 static void dump_tree(struct file *f, struct file *rgn, struct map_rect_priv *mr) { struct tree_header *tre_hdr; struct subdivision *sub; int i,offset; tre_hdr=file_read(f, 0, sizeof(*tre_hdr)); dump_tree_header(tre_hdr); offset=tre_hdr->subdivision.offset; sub=file_read(f, offset, sizeof(*sub)); dump_subdivision(sub); offset+=sizeof(*sub); for (i = 1 ; i < tre_hdr->subdivision.length/sizeof(*sub) ; i++) { printf("i=%d\n", i); sub=file_read(f, offset, sizeof(*sub)); dump_subdivision(sub); dump_region_item(sub, rgn, mr); if (sub->width & 0x8000) break; offset+=sizeof(*sub); } file_free(tre_hdr); } #endif #if 0 static void dump_labels(struct file *f) { struct label_header *lbl_hdr; lbl_hdr=file_read(f, 0, sizeof(*lbl_hdr)); printf("**labels**\n"); dump_label(lbl_hdr); file_free(lbl_hdr); #if 0 labels=alloca(lbl_hdr.label_length); file_read(f, lbl_hdr.label_offset, labels, lbl_hdr.label_length); l=labels; while (l < labels+lbl_hdr.label_length) { printf("'%s'(%d)\n", l, strlen(l)); l+=strlen(l)+1; } #endif } #endif static void garmin_img_coord_rewind(void *priv_data) { } static void parse_line(struct map_rect_priv *mr) { int pos=0; sscanf(mr->line,"%lf %c %lf %c %n",&mr->lat,&mr->lat_c,&mr->lng,&mr->lng_c,&pos); if (pos < strlen(mr->line)) { strcpy(mr->attrs, mr->line+pos); } } static int get_bits(struct map_rect_priv *mr, int bits) { unsigned long ret; ret=L(*((unsigned long *)(mr->ply_data+mr->ply_bitpos/8))); ret >>= (mr->ply_bitpos & 7); ret &= (1 << bits)-1; mr->ply_bitpos+=bits; return ret; } static int garmin_img_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct subdivision *sub=(struct subdivision *)(mr->subdiv+mr->subdiv_pos); int ret=0; int debug=0; if (debug) printf("garmin_img_coord_get %d\n",count); if (debug) dump_subdivision(sub); while (count--) { if (mr->rgn_type < 2) { c->x=triple(&sub->center.lng)+(mr->pnt->lng_delta << shift); c->y=triple(&sub->center.lat)+(mr->pnt->lat_delta << shift); } else { if (! mr->ply_bitpos) { if (mr->ply->info & 0x80) { mr->ply_bitcount=mr->ply->u.p2.bitstream_len*8; mr->ply_lngbits=mr->ply->u.p2.bitstream_info & 0xf; mr->ply_latbits=mr->ply->u.p2.bitstream_info >> 4; } else { mr->ply_bitcount=mr->ply->u.p1.bitstream_len*8; mr->ply_lngbits=mr->ply->u.p1.bitstream_info & 0xf; mr->ply_latbits=mr->ply->u.p1.bitstream_info >> 4; } if (mr->ply_lngbits <= 9) mr->ply_lngbits+=2; if (mr->ply_latbits <= 9) mr->ply_latbits+=2; if (! get_bits(mr,1)) { mr->ply_lngbits+=1; mr->ply_lngsign=0; } else if (get_bits(mr, 1)) mr->ply_lngsign=-1; else mr->ply_lngsign=1; if (! get_bits(mr,1)) { mr->ply_latbits+=1; mr->ply_latsign=0; } else if (get_bits(mr, 1)) mr->ply_latsign=-1; else mr->ply_latsign=1; mr->ply_lnglimit=1 << (mr->ply_lngbits-1); mr->ply_latlimit=1 << (mr->ply_latbits-1); mr->ply_lng=mr->ply->lng_delta; mr->ply_lat=mr->ply->lat_delta; if (debug) printf("lngbits %d latbits %d bitcount %d\n", mr->ply_lngbits, mr->ply_latbits, mr->ply_bitcount); c->x=0; c->y=0; } else { if (mr->ply_bitpos + mr->ply_lngbits + mr->ply_latbits > mr->ply_bitcount) { if (debug) printf("out of bits %d + %d + %d >= %d\n", mr->ply_bitpos, mr->ply_lngbits, mr->ply_latbits, mr->ply_bitcount); return ret; } c->x=0; c->y=0; int x,y; for (;;) { x=get_bits(mr,mr->ply_lngbits); if (debug) printf("x %d ", x); if (mr->ply_lngsign || x != mr->ply_lnglimit) break; c->x += x-1; } if (mr->ply_lngsign) { c->x=x*mr->ply_lngsign; } else { if (x >= mr->ply_lnglimit) c->x = x - (mr->ply_lnglimit << 1) - c->x; else c->x +=x; } for (;;) { y=get_bits(mr,mr->ply_latbits); if (debug) printf("y %d ", y); if (mr->ply_latsign || y != mr->ply_latlimit) break; c->y += y-1; } if (mr->ply_latsign) { c->y=y*mr->ply_latsign; } else { if (y >= mr->ply_latlimit) c->y = y - (mr->ply_latlimit << 1) - c->y; else c->y +=y; } mr->ply_lng += c->x; mr->ply_lat += c->y; } if (debug) printf(": x %d y %d\n", c->x, c->y); c->x=triple(&sub->center.lng)+(mr->ply_lng << shift); c->y=triple(&sub->center.lat)+(mr->ply_lat << shift); } #if 0 c->x-=0x6f160; c->y-=0x181f59; c->x+=0x168ca1; c->y+=0x68d815; #endif c++; ret++; if (mr->rgn_type < 2) return ret; } return ret; } static char * get_label_offset(struct map_rect_priv *mr, int offset) { g_assert(offset < mr->lbl_hdr->label.offset_len.length); return file_read(&mr->lbl, mr->lbl_hdr->label.offset_len.offset+offset, 128); } static void garmin_img_attr_rewind(void *priv_data) { } static int garmin_img_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; int debug=0; if (debug) printf("garmin_img_attr_get\n"); if (attr_type == attr_label) { if (debug) printf("garmin_img_attr_get label\n"); attr->type=attr_type; if (mr->rgn_type < 2) { if (mr->label) file_free(mr->label); mr->label=get_label_offset(mr, triple_u(&mr->pnt->lbl_offset) & 0x3fffff); attr->u.str=mr->label; } else { attr->u.str=""; } return 1; } return 0; } static struct item_methods methods_garmin_img = { garmin_img_coord_rewind, garmin_img_coord_get, garmin_img_attr_rewind, garmin_img_attr_get, }; static int rgn_next_type(struct map_rect_priv *mr) { while (mr->rgn_type < 3) { mr->rgn_type++; if (mr->rgn_items[mr->rgn_type].offset && mr->rgn_items[mr->rgn_type].length != 0) { mr->rgn_offset=mr->rgn_items[mr->rgn_type].offset; mr->rgn_end=mr->rgn_offset+mr->rgn_items[mr->rgn_type].length; return 0; } } return 1; } static int sub_next(struct map_rect_priv *mr, int next) { int i,offset,first=-1,last=-1,count=-1; int end; unsigned short *offsets; int debug=0; if (mr->subdiv_level_count <= 0) return 1; if (debug) printf("%d left\n", mr->subdiv_level_count); mr->subdiv_level_count--; #if 0 if (next && mr->subdiv[mr->subdiv_current].width & 0x8000) return 1; #endif if (debug) dump_hex_r(mr->subdiv+mr->subdiv_pos, 64, 14); mr->subdiv_pos+=next; if (debug) printf("subdiv_pos 0x%x\n", mr->subdiv_pos); if (mr->subdiv_pos > mr->tre_hdr->subdivision.length) return 1; struct subdivision *sub=(struct subdivision *)(mr->subdiv+mr->subdiv_pos); offset=triple_u(&sub->rgn_offset)+mr->rgn_hdr->offset_len.offset; if (debug) { printf("offset=0x%x\n", offset); dump_subdivision(sub); } offsets=file_read(&mr->rgn, offset, 3*sizeof(unsigned short)); if (! next) next=subdiv_next; if (mr->subdiv_pos+next < mr->tre_hdr->subdivision.length) end=triple_u(&((struct subdivision *)(mr->subdiv+mr->subdiv_pos+next))->rgn_offset)+mr->rgn_hdr->offset_len.offset; else end=mr->rgn_hdr->offset_len.offset+mr->rgn_hdr->offset_len.length; if (debug) { dump_subdivision(sub); dump_hex(offsets, 6); } for (i=0 ; i < 4 ; i++) { if (debug) printf("i=%d ", i); if (sub->types & (0x10 << i)) { if (debug) printf("+ "); if (first == -1) { first=i; mr->rgn_items[i].offset=offset; if (debug) printf("\n"); } else { mr->rgn_items[i].offset=offset+offsets[count]; if (debug) printf("0x%x\n", offsets[count]); mr->rgn_items[last].length=mr->rgn_items[i].offset-mr->rgn_items[last].offset; } last=i; count++; } else { if (debug) printf("-\n"); mr->rgn_items[i].offset=0; mr->rgn_items[i].length=0; } } if (first != -1) { mr->rgn_items[first].offset+=count*2; mr->rgn_items[first].length-=count*2; mr->rgn_items[last].length=end-mr->rgn_items[last].offset; } if (debug) { for (i=0 ; i < 4 ; i++) { printf("%d 0x%x 0x%x\n", i, mr->rgn_items[i].offset, mr->rgn_items[i].length); } } mr->rgn_type=-1; rgn_next_type(mr); if (debug) printf("*** offset 0x%x\n", mr->rgn_offset); file_free(offsets); return 0; } int item_count; static struct map_rect_priv * map_rect_new_garmin_img(struct map_priv *map, struct coord_rect *r, struct layer *layers, int limit) { struct map_rect_priv *mr; struct img_header img; if (debug) printf("map_rect_new_garmin_img\n"); mr=g_new0(struct map_rect_priv, 1); mr->m=map; if (r) mr->r=*r; mr->limit=limit; mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_garmin_img; mr->item.priv_data=mr; mr->f=fopen(map->filename, "r"); fread(&img, sizeof(img), 1, mr->f); #if 0 dump_img(&img); for (i = 0 ; i < (img.file_offset-sizeof(img))/sizeof(fat_blk) ; i++) { fread(&fat_blk, sizeof(fat_blk), 1, mr->f); if (!fat_blk.flag) break; dump_fat_block(&fat_blk); } #endif mr->rgn.offset=0xa*2048; mr->rgn.f=mr->f; mr->rgn_hdr=file_read(&mr->rgn, 0, sizeof(*mr->rgn_hdr)); mr->tre.offset=0x62b*2048; mr->tre.f=mr->f; mr->tre_hdr=file_read(&mr->tre, 0, sizeof(*mr->tre_hdr)); mr->lbl.offset=0x64a*2048; mr->lbl.f=mr->f; mr->lbl_hdr=file_read(&mr->lbl, 0, sizeof(*mr->lbl_hdr)); mr->subdiv=file_read(&mr->tre, mr->tre_hdr->subdivision.offset, mr->tre_hdr->subdivision.length); #if 0 dump_hex_r(mr->subdiv, mr->tre_hdr->subdivision.length, 16); #endif dump_tree_header(mr->tre_hdr); dump_levels(mr); printf("limit=%d\n", limit); if (limit < 3) { mr->subdiv_pos=0; mr->subdiv_level_count=1; shift=11; } else if (limit < 6) { mr->subdiv_pos=1*sizeof(struct subdivision); mr->subdiv_level_count=5; shift=9; } else if (limit < 8) { mr->subdiv_pos=6*sizeof(struct subdivision); mr->subdiv_level_count=9; shift=7; } else if (limit < 10) { mr->subdiv_pos=15*sizeof(struct subdivision); mr->subdiv_level_count=143; shift=5; } else { mr->subdiv_pos=158*sizeof(struct subdivision); mr->subdiv_level_count=4190; shift=2; subdiv_next=14; } #if 0 mr->rgn_offset=triple_u(&mr->subdiv[mr->subdiv_current].rgn_offset)+mr->rgn_hdr->offset_len.offset+4; mr->rgn_type=1; mr->rgn_end=mr->rgn_offset+20*8; #endif mr->count=0; item_count=0; #if 0 printf("*** offset 0x%x\n", 0x656c-mr->rgn.offset); printf("*** offset 0x%x\n", mr->rgn_offset); #endif #if 1 sub_next(mr, 0); #endif #if 0 { struct rgn_point *pnt; int i; int offset=0x65cc; for (i = 0 ; i < 26 ; i++) { pnt=file_read(&mr->rgn, 0x656c+8*i-mr->rgn.offset, sizeof(*pnt)); // dump_hex(pnt, sizeof(*pnt)); dump_point(pnt); dump_label_offset(mr, triple_u(&pnt->lbl_offset)); } } exit(0); #endif #if 0 dump_tree(&mr->tre,&mr->rgn,mr); #endif #if 0 f.offset=0x64a*2048; f.f=mr->f; dump_labels(&f); #endif #if 0 fseek(mr->f, img.file_offset, SEEK_SET); fread(&fil, sizeof(fil), 1, mr->f); dump_file(&fil); fread(&rgn, sizeof(rgn), 1, mr->f); dump_region(&rgn); fseek(mr->f, rgn.data_length, SEEK_CUR); fread(&fil, sizeof(fil), 1, mr->f); dump_file(&fil); #endif return mr; } static void map_rect_destroy_garmin_img(struct map_rect_priv *mr) { fclose(mr->f); g_free(mr); } static struct item * map_rect_get_item_garmin_img(struct map_rect_priv *mr) { char *p,type[256]; int ptype; int debug=0; item_count++; if (debug) printf("map_rect_get_item_garmin_img\n"); for (;;) { if (mr->rgn_offset < mr->rgn_end) { if (debug) printf("data available\n"); if (mr->rgn_type >= 2) { int len; if (debug) printf("polyline %d\n", mr->count); if (mr->ply) file_free(mr->ply); mr->ply=file_read(&mr->rgn, mr->rgn_offset, sizeof(*mr->ply)*3); if(triple_u(&mr->ply->lbl_offset) >= mr->lbl_hdr->label.offset_len.length) { printf("item_count %d\n", item_count); dump_poly(mr->ply); dump_hex(mr->ply, 32); printf("%d vs %d\n", triple_u(&mr->ply->lbl_offset), mr->lbl_hdr->label.offset_len.length); } g_assert(triple_u(&mr->ply->lbl_offset) < mr->lbl_hdr->label.offset_len.length); if (debug) { dump_hex(mr->ply, 16); dump_poly(mr->ply); } if (mr->ply_data) file_free(mr->ply_data); mr->rgn_offset+=10; if (mr->ply->info & 0x80) { mr->rgn_offset++; len=mr->ply->u.p2.bitstream_len; } else len=mr->ply->u.p1.bitstream_len; mr->ply_data=file_read(&mr->rgn, mr->rgn_offset, len); mr->rgn_offset += len; mr->ply_bitpos=0; // dump_hex(mr->ply_data, 32); if (mr->rgn_type == 3) { switch(mr->ply->info & 0x7f) { case 0x1: /* large urban area (>200k) */ mr->item.type=type_town_poly; break; case 0xd: /* reservation */ mr->item.type=type_park_poly; break; case 0xe: /* airport runway */ mr->item.type=type_airport_poly; break; case 0x14: /* national park */ mr->item.type=type_park_poly; break; case 0x32: /* sea */ case 0x3d: /* large lake (77-250km2) */ case 0x4c: /* intermittend water */ mr->item.type=type_water_poly; break; case 0x4b: /* background */ continue; default: printf("unknown polygon: 0x%x\n", mr->ply->info); mr->item.type=type_street_3_city; } } else { switch(mr->ply->info & 0x3f) { case 0x1: /* major highway */ mr->item.type=type_highway_land; break; case 0x2: /* principal highway */ mr->item.type=type_street_3_land; break; case 0x6: /* residental street */ mr->item.type=type_street_2_land; break; case 0x16: /* walkway/trail */ mr->item.type=type_street_1_land; break; case 0x1e: /* international boundary */ mr->item.type=type_border_country; break; case 0x20: /* minor land contour 1/10 */ mr->item.type=type_height_line_1; break; case 0x21: /* major land contour 1/2 */ mr->item.type=type_height_line_2; break; default: printf("unknown polyline: 0x%x\n", mr->ply->info); mr->item.type=type_street_3_city; } } return &mr->item; } if (mr->pnt) file_free(mr->pnt); mr->pnt=file_read(&mr->rgn, mr->rgn_offset, sizeof(*mr->pnt)); mr->item.type=type_none; int subtype=mr->pnt->subtype; if (mr->pnt->lbl_offset.data[2] & 0x80) mr->rgn_offset+=9; else { mr->rgn_offset+=8; subtype=0; } switch(mr->pnt->info) { case 0x3: /* large city 2-5M */ mr->item.type=type_town_label_2e6; break; case 0xa: /* small city/town 10-20k */ mr->item.type=type_town_label_1e4; break; case 0xd: /* settlement 1-2K */ mr->item.type=type_town_label_1e3; break; case 0x11: /* settlement less 100 */ mr->item.type=type_town_label_5e1; break; case 0x1c: switch(subtype) { case 0x01: mr->item.type=type_poi_wreck; break; } break; case 0x20: mr->item.type=type_highway_exit; break; case 0x25: mr->item.type=type_poi_toll_booth; break; case 0x2b: switch(subtype) { case 0x01: mr->item.type=type_poi_hotel; break; case 0x03: mr->item.type=type_poi_camp_rv; break; } break; case 0x2c: switch(subtype) { case 0x00: mr->item.type=type_poi_attraction; break; case 0x02: mr->item.type=type_poi_museum_history; break; } break; case 0x2e: mr->item.type=type_poi_shopping; break; case 0x2f: switch(subtype) { case 0x01: mr->item.type=type_poi_fuel; break; case 0x07: mr->item.type=type_poi_car_dealer_parts; break; case 0x0b: mr->item.type=type_poi_car_parking; break; case 0x15: mr->item.type=type_poi_public_utilities; break; } break; case 0x30: switch(subtype) { case 0x02: mr->item.type=type_poi_hospital; break; } break; case 0x43: mr->item.type=type_poi_marina; break; case 0x46: mr->item.type=type_poi_bar; break; case 0x48: mr->item.type=type_poi_camping; break; case 0x49: mr->item.type=type_poi_park; break; case 0x4a: mr->item.type=type_poi_picnic; break; case 0x59: /* airport */ mr->item.type=type_poi_airport; break; case 0x64: switch(subtype) { case 0x1: mr->item.type=type_poi_bridge; break; case 0x2: mr->item.type=type_poi_building; break; case 0x15: mr->item.type=type_town_ghost; break; } break; case 0x65: switch(subtype) { case 0x0: mr->item.type=type_poi_water_feature; break; case 0xc: mr->item.type=type_poi_island; break; case 0xd: mr->item.type=type_poi_lake; break; } break; case 0x66: switch(subtype) { case 0x0: mr->item.type=type_poi_land_feature; break; case 0x6: mr->item.type=type_poi_cape; break; case 0x14: mr->item.type=type_poi_rock; break; } break; } if (mr->item.type == type_none) { printf("unknown point: 0x%x 0x%x\n", mr->pnt->info, mr->pnt->subtype); dump_point(mr->pnt); printf("label: %s\n", get_label_offset(mr, triple_u(&mr->pnt->lbl_offset) & 0x3fffff)); mr->item.type=type_town_label; } return &mr->item; } if (debug) printf("out of data for type\n"); if (rgn_next_type(mr)) { if (debug) printf("out of data for region\n"); if (sub_next(mr, subdiv_next)) { if (debug) printf("out of data for subdivision\n"); return NULL; } } } } static struct item * map_rect_get_item_byid_garmin_img(struct map_rect_priv *mr, int id_hi, int id_lo) { fseek(mr->f, id_lo, SEEK_SET); get_line(mr); mr->item.id_hi=id_hi; return map_rect_get_item_garmin_img(mr); } static struct map_methods map_methods_garmin_img = { projection_garmin, "iso8859-1", map_destroy_garmin_img, map_charset_garmin_img, map_projection_garmin_img, map_rect_new_garmin_img, map_rect_destroy_garmin_img, map_rect_get_item_garmin_img, map_rect_get_item_byid_garmin_img, }; static struct map_priv * map_new_garmin_img(struct map_methods *meth, struct attr **attrs) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); if (! data) return NULL; *meth=map_methods_garmin_img; m=g_new(struct map_priv, 1); m->id=++map_id; m->filename=g_strdup(data->u.str); return m; } void plugin_init(void) { plugin_register_map_type("garmin_img", map_new_garmin_img); } navit-0.5.0+dfsg.1/navit/map/mg/000077500000000000000000000000001264204753600162255ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/mg/CMakeLists.txt000066400000000000000000000001071264204753600207630ustar00rootroot00000000000000module_add_library(map_mg map.c block.c town.c tree.c poly.c street.c) navit-0.5.0+dfsg.1/navit/map/mg/Makefile.am000066400000000000000000000005241264204753600202620ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_mg if PLUGINS modulemap_LTLIBRARIES = libmap_mg.la else noinst_LTLIBRARIES = libmap_mg.la endif libmap_mg_la_SOURCES = map.c block.c town.c tree.c poly.c street.c mg.h libmap_mg_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/map/mg/block.c000066400000000000000000000203471264204753600174710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "mg.h" int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem; struct block_index_item { /*unsigned int blocknum; unsigned int blocks;*/ unsigned char p[8]; }; static inline unsigned int block_index_item_get_blocknum(struct block_index_item * blk) { unsigned char *p = blk->p; return get_u32(&p); } static inline unsigned int block_index_item_get_blocks(struct block_index_item * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } struct block_index { /* unsigned int blocks; unsigned int size; unsigned int next; struct block_index_item list[0];*/ unsigned char p[12]; }; static inline unsigned int block_index_get_blocks(struct block_index * blk) { unsigned char *p = blk->p; return get_u32(&p); } static inline unsigned int block_index_get_size(struct block_index * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } static inline unsigned int block_index_get_next(struct block_index * blk) { unsigned char *p = blk->p+8; return get_u32(&p); } static inline struct block_index_item * block_index_get_list(struct block_index * blk) { return (struct block_index_item *)(blk->p+12); } static struct block * block_get(unsigned char **p) { struct block *ret=(struct block *)(*p); *p += sizeof(*ret); return ret; } static struct block * block_get_byid(struct file *file, int id, unsigned char **p_ret) { struct block_index *blk_idx; int blk_num,max; blk_idx=(struct block_index *)(file->begin+0x1000); max=(block_index_get_size(blk_idx)-sizeof(struct block_index))/sizeof(struct block_index_item); block_mem+=24; while (id >= max) { blk_idx=(struct block_index *)(file->begin+block_index_get_next(blk_idx)*512); id-=max; } blk_num=block_index_item_get_blocknum(&block_index_get_list(blk_idx)[id]); *p_ret=file->begin+blk_num*512; return block_get(p_ret); } int block_get_byindex(struct file *file, int idx, struct block_priv *blk) { dbg(lvl_debug,"idx=%d\n", idx); blk->b=block_get_byid(file, idx, &blk->p); blk->block_start=(unsigned char *)(blk->b); blk->p_start=blk->p; blk->end=blk->block_start+block_get_size(blk->b); return 1; } static void block_setup_tags(struct map_rect_priv *mr) { int len; unsigned char *p,*t; char *str; mr->b.binarytree=0; p=mr->file->begin+0x0c; while (*p) { str=get_string(&p); len=get_u32_unal(&p); t=p; /* printf("String '%s' len %d\n", str, len); */ if (! strcmp(str,"FirstBatBlock")) { /* printf("%ld\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"MaxBlockSize")) { /* printf("%ld\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"FREE_BLOCK_LIST")) { /* printf("%ld\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"TotalRect")) { mr->b.b_rect.lu.x=get_u32_unal(&t); mr->b.b_rect.lu.y=get_u32_unal(&t); mr->b.b_rect.rl.x=get_u32_unal(&t); mr->b.b_rect.rl.y=get_u32_unal(&t); /* printf("0x%x,0x%x-0x%x,0x%x\n", mr->b.b_rect.lu.x, mr->b.b_rect.lu.y, mr->b.b_rect.rl.x, mr->b.b_rect.rl.y); */ } else if (! strcmp(str,"Version")) { /* printf("0x%lx\n", get_u32_unal(&t)); */ } else if (! strcmp(str,"Categories")) { /* printf("0x%x\n", get_u16(&t)); */ } else if (! strcmp(str,"binaryTree")) { mr->b.binarytree=get_u32_unal(&t); /* printf("%d\n", mr->b.binarytree); */ } else if (! strcmp(str,"CategorySets")) { /* printf("0x%x\n", get_u16(&t)); */ } else if (! strcmp(str,"Kommentar")) { /* printf("%s\n", get_string(&t)); */ } p+=len; } } #if 0 static void block_rect_print(struct coord_rect *r) { printf ("0x%x,0x%x-0x%x,0x%x (0x%x,0x%x)", r->lu.x, r->lu.y, r->rl.x, r->rl.y, r->lu.x/2+r->rl.x/2,r->lu.y/2+r->rl.y/2); } #endif static void block_rect_same(struct coord_rect *r1, struct coord_rect *r2) { dbg_assert(r1->lu.x==r2->lu.x); dbg_assert(r1->lu.y==r2->lu.y); dbg_assert(r1->rl.x==r2->rl.x); dbg_assert(r1->rl.y==r2->rl.y); } int block_init(struct map_rect_priv *mr) { mr->b.block_num=-1; mr->b.bt.b=NULL; mr->b.bt.next=0; block_setup_tags(mr); if (mr->b.binarytree) { mr->b.bt.next=mr->b.binarytree; mr->b.bt.p=NULL; mr->b.bt.block_count=0; } if (mr->cur_sel && !coord_rect_overlap(&mr->cur_sel->u.c_rect, &mr->b.b_rect)) return 0; return block_next(mr); } int block_next_lin(struct map_rect_priv *mr) { struct coord_rect r; for (;;) { block_lin_count++; block_mem+=sizeof(struct block *); mr->b.block_num++; if (! mr->b.block_num) mr->b.p=mr->file->begin+0x2000; else mr->b.p=mr->b.block_start+block_get_blocks(mr->b.b)*512; if (mr->b.p >= mr->file->end) { dbg(lvl_debug,"end of blocks %p vs %p\n", mr->b.p, mr->file->end); return 0; } mr->b.block_start=mr->b.p; mr->b.b=block_get(&mr->b.p); mr->b.p_start=mr->b.p; mr->b.end=mr->b.block_start+block_get_size(mr->b.b); if (block_get_count(mr->b.b) == -1) { dbg(lvl_warning,"empty blocks\n"); return 0; } block_get_r(mr->b.b, &r); if (!mr->cur_sel || coord_rect_overlap(&mr->cur_sel->u.c_rect, &r)) { block_active_count++; block_active_mem+=block_get_blocks(mr->b.b)*512-sizeof(struct block *); dbg(lvl_debug,"block ok\n"); return 1; } dbg(lvl_info,"block not in cur_sel\n"); } } int block_next(struct map_rect_priv *mr) { int blk_num,coord,r_h,r_w; struct block_bt_priv *bt=&mr->b.bt; struct coord_rect r; if (!mr->b.binarytree || ! mr->cur_sel) return block_next_lin(mr); for (;;) { if (! bt->p) { dbg(lvl_debug,"block 0x%x\n", bt->next); if (bt->next == -1) return 0; bt->b=block_get_byid(mr->file, bt->next, &bt->p); bt->end=(unsigned char *)mr->b.bt.b+block_get_size(mr->b.bt.b); bt->next=block_get_next(bt->b); bt->order=0; dbg(lvl_debug,"size 0x%x next 0x%x\n", block_get_size(bt->b), block_get_next(bt->b)); if (! mr->b.bt.block_count) { #if 0 if (debug) { printf("idx rect "); block_rect_print(&mr->b.bt.b->r); } #endif block_get_r(bt->b, &bt->r); bt->r_curr=bt->r; coord=get_u32(&mr->b.bt.p); } else { bt->p=(unsigned char *)bt->b+0xc; } bt->block_count++; } while (mr->b.bt.p < mr->b.bt.end) { block_idx_count++; blk_num=get_u32(&mr->b.bt.p); coord=get_u32(&mr->b.bt.p); block_mem+=8; dbg(lvl_debug,"%p vs %p coord 0x%x ", mr->b.bt.end, mr->b.bt.p, coord); dbg(lvl_debug,"block 0x%x", blk_num); r_w=bt->r_curr.rl.x-bt->r_curr.lu.x; r_h=bt->r_curr.lu.y-bt->r_curr.rl.y; #if 0 if (debug) { printf(" rect1 "); block_rect_print(&bt->r_curr); printf(" %dx%d", r_w, r_h); } #endif mr->b.b=NULL; if (blk_num != -1) { block_mem+=8; if (coord_rect_overlap(&mr->cur_sel->u.c_rect, &bt->r_curr)) { mr->b.b=block_get_byid(mr->file, blk_num, &mr->b.p); mr->b.block_num=blk_num; dbg_assert(mr->b.b != NULL); mr->b.block_start=(unsigned char *)(mr->b.b); mr->b.p_start=mr->b.p; mr->b.end=mr->b.block_start+block_get_size(mr->b.b); block_get_r(mr->b.b, &r); block_rect_same(&r, &bt->r_curr); } } if (coord != -1) { bt->stack[bt->stackp]=bt->r_curr; if (r_w > r_h) { bt->r_curr.rl.x=coord; bt->stack[bt->stackp].lu.x=coord+1; } else { bt->r_curr.lu.y=coord; bt->stack[bt->stackp].rl.y=coord+1; } bt->stackp++; dbg_assert(bt->stackp < BT_STACK_SIZE); } else { if (bt->stackp) { bt->stackp--; bt->r_curr=bt->stack[bt->stackp]; } else { bt->r_curr=bt->r; bt->order++; if (bt->order > 100) return 0; } } if (mr->b.b) { block_active_count++; block_active_mem+=block_get_blocks(mr->b.b)*512; return 1; } } bt->p=NULL; } return 0; } navit-0.5.0+dfsg.1/navit/map/mg/map.c000066400000000000000000000343161264204753600171550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "maptype.h" #include "mg.h" GList *maps; static struct country_isonum { int country; int isonum; int postal_len; char *postal_prefix; } country_isonums[]={ { 1,203}, { 2,703}, { 7,674}, { 11,233}, { 12,268}, { 13,428}, { 14,440}, { 15,498}, { 16,643}, { 17,804}, { 18,112}, { 20,818}, { 30,300}, { 31,528}, { 32, 56}, { 33,250}, { 34,724}, { 36,348}, { 39,380}, { 40,642}, { 41,756}, { 43, 40}, { 44,826}, { 45,208}, { 46,752}, { 47,578}, { 48,616}, { 49,276,5,"D@@"}, { 50,292}, { 51,620}, { 52,442}, { 53,372}, { 54,352}, { 55, 8}, { 56,470}, { 57,196}, { 58,246}, { 59,100}, { 61,422}, { 62, 20}, { 63,760}, { 66,682}, { 71,434}, { 72,376}, { 73,275}, { 75,438}, { 76,504}, { 77, 12}, { 78,788}, { 81,688}, { 83,400}, { 85,191}, { 86,705}, { 87, 70}, { 89,807}, { 90,792}, { 93,492}, { 94, 31}, { 95, 51}, { 98,234}, { 99,732}, {336,774}, }; struct map_priv * map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl); static int map_id; static char *file[]={ [file_border_ply]="border.ply", [file_bridge_ply]="bridge.ply", [file_build_ply]="build.ply", [file_golf_ply]="golf.ply", [file_height_ply]="height.ply", [file_natpark_ply]="natpark.ply", [file_nature_ply]="nature.ply", [file_other_ply]="other.ply", [file_rail_ply]="rail.ply", [file_sea_ply]="sea.ply", [file_street_bti]="street.bti", [file_street_str]="street.str", [file_strname_stn]="strname.stn", [file_town_twn]="town.twn", [file_tunnel_ply]="tunnel.ply", [file_water_ply]="water.ply", [file_woodland_ply]="woodland.ply", }; int mg_country_from_isonum(int isonum) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].isonum == isonum) return country_isonums[i].country; return 0; } int mg_country_to_isonum(int country) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].country == country) return country_isonums[i].isonum; return 0; } int mg_country_postal_len(int country) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].country == country) return country_isonums[i].postal_len; return 0; } static char *mg_country_postal_prefix(int isonum) { int i; for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) if (country_isonums[i].isonum == isonum) return country_isonums[i].postal_prefix; return NULL; } struct item_range town_ranges[]={ {type_town_label,type_port_label}, }; struct item_range street_ranges[]={ {type_street_nopass,type_street_unkn}, }; struct item_range poly_ranges[]={ {type_border_country,type_water_line}, {type_street_unkn,type_street_unkn}, {type_area,type_last}, }; static int file_next(struct map_rect_priv *mr) { int debug=0; for (;;) { mr->current_file++; if (mr->current_file >= file_end) return 0; mr->file=mr->m->file[mr->current_file]; if (! mr->file) continue; switch (mr->current_file) { case file_strname_stn: continue; case file_town_twn: if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, town_ranges, sizeof(town_ranges)/sizeof(struct item_range))) continue; break; case file_street_str: if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, street_ranges, sizeof(street_ranges)/sizeof(struct item_range))) continue; break; default: if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, poly_ranges, sizeof(poly_ranges)/sizeof(struct item_range))) continue; break; } if (debug) printf("current file: '%s'\n", file[mr->current_file]); mr->cur_sel=mr->xsel; if (block_init(mr)) return 1; } } static void map_destroy_mg(struct map_priv *m) { int i; printf("mg_map_destroy\n"); for (i = 0 ; i < file_end ; i++) { if (m->file[i]) file_destroy(m->file[i]); } } extern int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem; struct map_rect_priv * map_rect_new_mg(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; int i; block_lin_count=0; block_idx_count=0; block_active_count=0; block_mem=0; block_active_mem=0; mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->xsel=sel; mr->current_file=-1; if (sel && sel->next) for (i=0 ; i < file_end ; i++) mr->block_hash[i]=g_hash_table_new(g_int_hash,g_int_equal); file_next(mr); return mr; } static struct item * map_rect_get_item_mg(struct map_rect_priv *mr) { for (;;) { switch (mr->current_file) { case file_town_twn: if (town_get(mr, &mr->town, &mr->item)) return &mr->item; break; case file_border_ply: case file_bridge_ply: case file_build_ply: case file_golf_ply: /* case file_height_ply: */ case file_natpark_ply: case file_nature_ply: case file_other_ply: case file_rail_ply: case file_sea_ply: /* case file_tunnel_ply: */ case file_water_ply: case file_woodland_ply: if (poly_get(mr, &mr->poly, &mr->item)) return &mr->item; break; case file_street_str: if (street_get(mr, &mr->street, &mr->item)) return &mr->item; break; case file_end: return NULL; default: break; } if (block_next(mr)) continue; if (mr->cur_sel->next) { mr->cur_sel=mr->cur_sel->next; if (block_init(mr)) continue; } if (file_next(mr)) continue; dbg(lvl_debug,"lin_count %d idx_count %d active_count %d %d kB (%d kB)\n", block_lin_count, block_idx_count, block_active_count, (block_mem+block_active_mem)/1024, block_active_mem/1024); return NULL; } } struct item * map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo) { mr->current_file = (id_hi >> 16) & 0xff; switch (mr->current_file) { case file_town_twn: if (town_get_byid(mr, &mr->town, id_hi, id_lo, &mr->item)) return &mr->item; break; case file_street_str: if (street_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item)) return &mr->item; break; case file_strname_stn: if (street_name_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item)) return &mr->item; break; default: if (poly_get_byid(mr, &mr->poly, id_hi, id_lo, &mr->item)) return &mr->item; break; } return NULL; } void map_rect_destroy_mg(struct map_rect_priv *mr) { int i; for (i=0 ; i < file_end ; i++) if (mr->block_hash[i]) g_hash_table_destroy(mr->block_hash[i]); g_free(mr); } static char * map_search_mg_convert_special(char *str) { char *ret,*c=g_malloc(strlen(str)*2+1); ret=c; for (;;) { switch ((unsigned char)(*str)) { case 0xc4: *c++='A'; break; case 0xd6: *c++='O'; break; case 0xdc: *c++='U'; break; case 0xdf: *c++='s'; *c++='s'; break; case 0xe4: *c++='a'; break; case 0xf6: *c++='o'; break; case 0xfc: *c++='u'; break; default: dbg(lvl_debug,"0x%x\n", *str); *c++=*str; break; } if (! *str) return ret; str++; } } static int map_search_setup(struct map_rect_priv *mr) { char *prefix; dbg(lvl_debug,"%s\n", attr_to_name(mr->search_type)); switch (mr->search_type) { case attr_town_postal: if (mr->search_item.type != type_country_label) { dbg(lvl_error,"wrong parent type %s\n", item_to_name(mr->search_item.type)); return 0; } prefix=mg_country_postal_prefix(mr->search_item.id_lo); if (! prefix) return 0; tree_search_init(mr->m->dirname, "town.b1", &mr->ts, 0); mr->current_file=file_town_twn; mr->search_str=g_strdup_printf("%s%s",prefix,mr->search_attr->u.str); dbg(lvl_debug,"search_str='%s'\n",mr->search_str); mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); break; case attr_town_name: if (mr->search_item.type != type_country_label) { dbg(lvl_error,"wrong parent type %s\n", item_to_name(mr->search_item.type)); return 0; } tree_search_init(mr->m->dirname, "town.b2", &mr->ts, 0x1000); mr->current_file=file_town_twn; mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str); mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); break; case attr_district_name: if (mr->search_item.type != type_country_label) { dbg(lvl_error,"wrong parent type %s\n", item_to_name(mr->search_item.type)); return 0; } tree_search_init(mr->m->dirname, "town.b3", &mr->ts, 0x1000); mr->current_file=file_town_twn; mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str); mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); break; case attr_street_name: if (mr->search_item.type != type_town_streets) { GList *tmp=maps; struct item *item=NULL; struct attr attr; struct map_rect_priv *mr2; while (tmp) { mr2=map_rect_new_mg(tmp->data, NULL); item=map_rect_get_item_byid_mg(mr2, mr->search_item.id_hi, mr->search_item.id_lo); if (item) break; map_rect_destroy_mg(mr2); tmp=g_list_next(tmp); } if (item) { if (item_attr_get(item, attr_town_streets_item, &attr)) { mr->search_item=*attr.u.item; map_rect_destroy_mg(mr2); } else { map_rect_destroy_mg(mr2); return 0; } } else { dbg(lvl_error,"wrong parent type %s %p 0x%x 0x%x\n", item_to_name(mr->search_item.type), item, mr->search_item.id_hi, mr->search_item.id_lo); return 0; } } dbg(lvl_debug,"street_assoc=0x%x\n", mr->search_item.id_lo); tree_search_init(mr->m->dirname, "strname.b1", &mr->ts, 0); mr->current_file=file_strname_stn; mr->search_str=g_strdup(mr->search_attr->u.str); break; case attr_house_number: if (!map_priv_is(mr->search_item.map, mr->m)) return 0; if (!housenumber_search_setup(mr)) { dbg(lvl_error,"failed to search for attr_house_number\n"); return 0; } break; default: dbg(lvl_error,"unknown search %s\n",attr_to_name(mr->search_type)); return 0; } mr->file=mr->m->file[mr->current_file]; block_init(mr); return 1; } static void map_search_cleanup(struct map_rect_priv *mr); static struct item * map_search_get_item_mg(struct map_search_priv *ms); static struct map_search_priv * map_search_new_mg(struct map_priv *map, struct item *item, struct attr *search, int partial) { struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1); dbg(lvl_debug,"searching for %s '%s'\n", attr_to_name(search->type), search->u.str); dbg(lvl_debug,"id_lo=0x%x\n", item->id_lo); dbg(lvl_debug,"search=%s\n", search->u.str); mr->m=map; mr->search_attr=attr_dup(search); mr->search_type=search->type; mr->search_item=*item; mr->search_partial=partial; if (search->type == attr_town_or_district_name) { mr->search_type=attr_town_name; mr->search_type_next=attr_district_name; } if (!map_search_setup(mr)) { dbg(lvl_warning,"map_search_new_mg failed\n"); g_free(mr); return NULL; } mr->search_mr_tmp=map_rect_new_mg(map, NULL); return (struct map_search_priv *)mr; } static void map_search_cleanup(struct map_rect_priv *mr) { g_free(mr->search_str); mr->search_str=NULL; tree_search_free(&mr->ts); mr->search_linear=0; mr->search_p=NULL; mr->search_blk_count=0; mr->search_blk_off=NULL; mr->search_block=0; } static void map_search_destroy_mg(struct map_search_priv *ms) { struct map_rect_priv *mr=(struct map_rect_priv *)ms; dbg(lvl_debug,"mr=%p\n", mr); if (! mr) return; map_search_cleanup(mr); if (mr->search_mr_tmp) map_rect_destroy_mg(mr->search_mr_tmp); attr_free(mr->search_attr); g_free(mr); } static struct item * map_search_get_item_mg(struct map_search_priv *ms) { struct map_rect_priv *mr=(struct map_rect_priv *)ms; struct item *ret=NULL; if (! mr) return NULL; switch (mr->search_type) { case attr_town_postal: case attr_town_name: case attr_district_name: ret=town_search_get_item(mr); break; case attr_street_name: ret=street_search_get_item(mr); break; case attr_house_number: ret=housenumber_search_get_item(mr); break; default: dbg(lvl_error,"unknown search %s\n",attr_to_name(mr->search_type)); break; } if (!ret && mr->search_type_next != attr_none) { mr->search_type=mr->search_type_next; mr->search_type_next=attr_none; map_search_cleanup(mr); map_search_setup(mr); return map_search_get_item_mg(ms); } return ret; } static struct map_methods map_methods_mg = { projection_mg, "iso8859-1", map_destroy_mg, map_rect_new_mg, map_rect_destroy_mg, map_rect_get_item_mg, map_rect_get_item_byid_mg, map_search_new_mg, map_search_destroy_mg, map_search_get_item_mg, }; struct map_priv * map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; int i,maybe_missing; struct attr *data=attr_search(attrs, NULL, attr_data); char *filename; struct file_wordexp *wexp; char **wexp_data; if (! data) return NULL; wexp=file_wordexp_new(data->u.str); wexp_data=file_wordexp_get_array(wexp); *meth=map_methods_mg; data=attr_search(attrs, NULL, attr_data); m=g_new(struct map_priv, 1); m->id=++map_id; m->dirname=g_strdup(wexp_data[0]); file_wordexp_destroy(wexp); for (i = 0 ; i < file_end ; i++) { if (file[i]) { filename=g_strdup_printf("%s/%s", m->dirname, file[i]); m->file[i]=file_create_caseinsensitive(filename, 0); if (! m->file[i]) { maybe_missing=(i == file_border_ply || i == file_height_ply || i == file_sea_ply); if (! maybe_missing) dbg(lvl_error,"Failed to load %s\n", filename); } else file_mmap(m->file[i]); g_free(filename); } } maps=g_list_append(maps, m); return m; } void plugin_init(void) { plugin_register_map_type("mg", map_new_mg); } navit-0.5.0+dfsg.1/navit/map/mg/mg.h000066400000000000000000000251021264204753600170010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "attr.h" #include "coord.h" #include "data.h" #include "projection.h" #include "map.h" #include "file.h" struct block_data { struct file *file; }; struct block { /* int blocks; int size; int next; struct coord_rect r; int count;*/ unsigned char p[32]; }; static inline int block_get_blocks(struct block * blk) { unsigned char *p = blk->p; return get_u32(&p); } static inline int block_get_size(struct block * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } static inline int block_get_next(struct block * blk) { unsigned char *p = blk->p+8; return get_u32(&p); } static inline int block_get_count(struct block * blk) { unsigned char *p = blk->p+28; return get_u32(&p); } static inline void block_get_r(struct block * blk, struct coord_rect * r) { unsigned char *p = blk->p+12; r ->lu.x = get_u32(&p); r ->lu.y = get_u32(&p); r ->rl.x = get_u32(&p); r ->rl.y = get_u32(&p); } struct item_priv { int cidx; int aidx; unsigned char *cstart,*cp,*cend; unsigned char *astart,*ap,*aend; enum attr_type attr_last; enum attr_type attr_next; struct item item; }; struct town_priv { unsigned int id; /*!< Identifier */ struct coord c; /*!< Coordinates */ char *name; /*!< Name */ char *district; /*!< District */ char *postal_code1; /*!< Postal code */ unsigned char order; /*!< Order (Importance) */ unsigned char type; /*!< Type */ unsigned short country; /*!< Country */ unsigned int unknown2; /*!< Unknown */ unsigned char size; /*!< Size of town */ unsigned int street_assoc; /*!< Association to streets */ unsigned char unknown3; /*!< Unknown */ char *postal_code2; /*!< 2nd postal code */ unsigned int unknown4; /*!< Unknown */ int cidx; int aidx; enum attr_type attr_next; char debug[256]; char postal[32]; struct item town_attr_item; }; struct poly_priv { int poly_num; unsigned char *poly_next; int subpoly_num; int subpoly_num_all; unsigned char *subpoly_next; unsigned char *subpoly_start; unsigned char *p; struct coord c[2]; char *name; unsigned char order; unsigned char type; unsigned int polys; unsigned int *count; unsigned int count_sum; int aidx; enum attr_type attr_next; }; struct street_header { /*unsigned char order; int count;*/ unsigned char p[5]; } __attribute__((packed)); static inline unsigned char street_header_get_order(struct street_header * str) { return *str->p; } static inline int street_header_get_count(struct street_header * str) { unsigned char *p = str->p+1; return get_u32_unal(&p); } struct street_type { /*unsigned char order; unsigned short country;*/ unsigned char p[3]; } __attribute__((packed)); static inline unsigned char street_type_get_order(struct street_type * str) { return *str->p; } static inline unsigned short street_type_get_country(struct street_type * str) { unsigned char *p = str->p+1; return get_u16_unal(&p); } struct street_header_type { struct street_header *header; int type_count; struct street_type *type; }; struct street_str { /*int segid; unsigned char limit;*/ /* 0x03,0x30=One Way,0x33=No Passing */ /*unsigned char unknown2; unsigned char unknown3; unsigned char type; unsigned int nameid;*/ unsigned char p[12]; }; static inline int street_str_get_segid(struct street_str * str) { unsigned char *p = str->p; return get_u32_unal(&p); } static inline unsigned char street_str_get_limit(struct street_str * str) { return str->p[4]; } static inline unsigned char street_str_get_unknown2(struct street_str * str) { return str->p[5]; } static inline unsigned char street_str_get_unknown3(struct street_str * str) { return str->p[6]; } static inline unsigned char street_str_get_type(struct street_str * str) { return str->p[7]; } static inline unsigned int street_str_get_nameid(struct street_str * str) { unsigned char *p = str->p+8; return get_u32_unal(&p); } struct street_name_segment { int segid; int country; }; struct street_name { int len; int country; int townassoc; char *name1; char *name2; int segment_count; struct street_name_segment *segments; int aux_len; unsigned char *aux_data; int tmp_len; unsigned char *tmp_data; }; struct housenumber { int number; char *suffix; }; struct street_name_numbers { int len; int tag; int dist; int country; struct coord *c; struct housenumber first; struct housenumber last; int segment_count; struct street_name_segment *segments; int aux_len; unsigned char *aux_data; int tmp_len; unsigned char *tmp_data; }; static inline void street_name_numbers_get_coord(struct street_name_numbers * str, struct coord * c) { unsigned char *p=(unsigned char *)str->c; c->x=get_u32_unal(&p); c->y=get_u32_unal(&p); } struct street_name_number { int len; int tag; struct coord *c; struct housenumber first; struct housenumber last; struct street_name_segment *segment; }; struct street_priv { struct file *name_file; struct street_header *header; int type_count; struct street_type *type; struct street_str *str; struct street_str *str_start; unsigned char *coord_begin; unsigned char *p; unsigned char *p_rewind; unsigned char *end; unsigned char *next; int status; int status_rewind; struct coord_rect ref; int bytes; int more; int flags; int housenumber; int cidx; struct coord hnc[100]; struct housenumber hn[100]; int hn_count; struct street_name name; struct street_name_numbers name_numbers; struct street_name_number name_number; enum attr_type attr_next; char debug[256]; char first_number[32]; char last_number[32]; char current_number[32]; GHashTable *streetname_hash; }; enum file_index { file_border_ply=0, file_bridge_ply, file_build_ply, file_golf_ply, file_height_ply, file_natpark_ply, file_nature_ply, file_other_ply, file_rail_ply, file_sea_ply, file_street_bti, file_street_str, file_strname_stn, file_town_twn, file_tunnel_ply, file_water_ply, file_woodland_ply, file_end, file_town_twn_alt1, file_town_twn_alt2, file_street_str_alt1, file_street_str_alt2, file_street_str_alt3, file_street_str_alt4, }; struct map_priv { int id; struct file *file[file_end]; char *dirname; }; #define BT_STACK_SIZE 32 struct block_bt_priv { struct block *b; struct coord_rect r, r_curr; int next; int block_count; struct coord_rect stack[BT_STACK_SIZE]; int stackp; int order; unsigned char *p; unsigned char *end; }; struct block_priv { int block_num; struct coord_rect b_rect; unsigned char *block_start; struct block *b; unsigned char *p; unsigned char *end; unsigned char *p_start; int binarytree; struct block_bt_priv bt; }; struct block_offset { /* unsigned short offset; unsigned short block;*/ unsigned char p[4]; }; static inline unsigned short block_offset_get_offset(struct block_offset * blk) { unsigned char *p = blk->p; return get_u16_unal(&p); } static inline unsigned short block_offset_get_block(struct block_offset * blk) { unsigned char *p = blk->p+2; return get_u16_unal(&p); } struct tree_search_node { struct tree_hdr *hdr; unsigned char *p; unsigned char *last; unsigned char *end; int low; int high; int last_low; int last_high; }; struct tree_search { struct file *f; int last_node; int curr_node; struct tree_search_node nodes[5]; }; struct map_rect_priv { struct map_selection *xsel; struct map_selection *cur_sel; struct map_priv *m; enum file_index current_file; struct file *file; struct block_priv b; struct item item; struct town_priv town; struct poly_priv poly; struct street_priv street; struct tree_search ts; int search_country; struct item search_item; struct attr *search_attr; char *search_str; int search_partial; int search_linear; unsigned char *search_p; int search_blk_count; enum attr_type search_type,search_type_next; struct map_rect_priv *search_mr_tmp; struct item *search_item_tmp; struct block_offset *search_blk_off; int search_block; GHashTable *block_hash[file_end]; struct item_priv item3; }; int mg_country_from_isonum(int isonum); int mg_country_to_isonum(int country); int mg_country_postal_len(int country); int block_init(struct map_rect_priv *mr); int block_next(struct map_rect_priv *mr); int block_get_byindex(struct file *file, int idx, struct block_priv *blk); int block_next_lin(struct map_rect_priv *mr); int tree_search_hv(char *dirname, char *filename, unsigned int search1, unsigned int search2, int *result); int town_get(struct map_rect_priv *mr, struct town_priv *poly, struct item *item); int town_get_byid(struct map_rect_priv *mr, struct town_priv *twn, int id_hi, int id_lo, struct item *item); struct item * town_search_get_item(struct map_rect_priv *mr); int poly_get(struct map_rect_priv *mr, struct poly_priv *poly, struct item *item); int poly_get_byid(struct map_rect_priv *mr, struct poly_priv *poly, int id_hi, int id_lo, struct item *item); int street_get(struct map_rect_priv *mr, struct street_priv *street, struct item *item); int street_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item); int street_name_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item); struct item * street_search_get_item(struct map_rect_priv *mr); void tree_search_init(char *dirname, char *filename, struct tree_search *ts, int offset); void tree_search_free(struct tree_search *ts); int tree_search_next(struct tree_search *ts, unsigned char **p, int dir); int tree_search_next_lin(struct tree_search *ts, unsigned char **p); struct item * housenumber_search_get_item(struct map_rect_priv *mr); struct map_rect_priv * map_rect_new_mg(struct map_priv *map, struct map_selection *sel); void map_rect_destroy_mg(struct map_rect_priv *mr); struct item *map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo); int housenumber_search_setup(struct map_rect_priv *mr); navit-0.5.0+dfsg.1/navit/map/mg/poly.c000066400000000000000000000142011264204753600173520ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "mg.h" static void poly_coord_rewind(void *priv_data) { struct poly_priv *poly=priv_data; poly->p=poly->subpoly_start; } static int poly_coord_get(void *priv_data, struct coord *c, int count) { struct poly_priv *poly=priv_data; int ret=0; while (count--) { if (poly->p >= poly->subpoly_next) break; c->x=get_u32_unal(&poly->p); c->y=get_u32_unal(&poly->p); c++; ret++; } return ret; } static void poly_attr_rewind(void *priv_data) { struct poly_priv *poly=priv_data; poly->aidx=0; } static int poly_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct poly_priv *poly=priv_data; attr->type=attr_type; switch (attr_type) { case attr_any: while (poly->attr_next != attr_none) { if (poly_attr_get(poly, poly->attr_next, attr)) return 1; } return 0; case attr_label: attr->u.str=poly->name; poly->attr_next=attr_none; if (attr->u.str[0]) return 1; return 0; default: return 0; } return 1; } static struct item_methods poly_meth = { poly_coord_rewind, poly_coord_get, poly_attr_rewind, poly_attr_get, }; static void poly_get_data(struct poly_priv *poly, unsigned char **p) { poly->c[0].x=get_u32_unal(p); poly->c[0].y=get_u32_unal(p); poly->c[1].x=get_u32_unal(p); poly->c[1].y=get_u32_unal(p); *p+=sizeof(struct coord); poly->name=(char *)(*p); while (**p) { (*p)++; } (*p)++; poly->order=*(*p)++; poly->type=*(*p)++; poly->polys=get_u32_unal(p); poly->count=(unsigned int *)(*p); (*p)+=poly->polys*sizeof(unsigned int); poly->count_sum=get_u32_unal(p); } int poly_get(struct map_rect_priv *mr, struct poly_priv *poly, struct item *item) { struct coord_rect r; for (;;) { if (mr->b.p >= mr->b.end) return 0; if (mr->b.p == mr->b.p_start) { poly->poly_num=0; poly->subpoly_num=0; poly->subpoly_num_all=0; poly->poly_next=mr->b.p; item->meth=&poly_meth; } if (poly->poly_num >= block_get_count(mr->b.b)) return 0; if (!poly->subpoly_num) { mr->b.p=poly->poly_next; item->id_lo=mr->b.p-mr->file->begin; poly_get_data(poly, &mr->b.p); poly->poly_next=mr->b.p+poly->count_sum*sizeof(struct coord); poly->poly_num++; r.lu=poly->c[0]; r.rl=poly->c[1]; if (mr->cur_sel && (poly->order > mr->cur_sel->order*3 || !coord_rect_overlap(&mr->cur_sel->u.c_rect, &r))) { poly->subpoly_num_all+=poly->polys; mr->b.p=poly->poly_next; continue; } switch(poly->type) { case 0x13: item->type=type_poly_wood; break; case 0x14: item->type=type_poly_town; break; case 0x15: item->type=type_poly_cemetery; break; case 0x16: item->type=type_poly_building; break; case 0x17: item->type=type_poly_museum; break; case 0x19: item->type=type_poly_place; break; case 0x1b: item->type=type_poly_commercial_center; break; case 0x1e: item->type=type_poly_industry; break; case 0x23: /* FIXME: what is this ?*/ item->type=type_poly_place; break; case 0x24: item->type=type_poly_car_parking; break; case 0x28: item->type=type_poly_airport; break; case 0x29: item->type=type_poly_station; break; case 0x2d: item->type=type_poly_hospital; break; case 0x2e: item->type=type_poly_hospital; break; case 0x2f: item->type=type_poly_university; break; case 0x30: item->type=type_poly_university; break; case 0x32: item->type=type_poly_park; break; case 0x34: item->type=type_poly_sport; break; case 0x35: item->type=type_poly_sport; break; case 0x37: item->type=type_poly_golf_course; break; case 0x38: item->type=type_poly_national_park; break; case 0x39: item->type=type_poly_nature_park; break; case 0x3c: item->type=type_poly_water; break; case 0xbc: item->type=type_water_line; break; case 0xc3: /* FIXME: what is this ?*/ item->type=type_border_state; break; case 0xc6: item->type=type_border_country; break; case 0xc7: item->type=type_border_state; break; case 0xd0: item->type=type_rail; break; default: dbg(lvl_error,"Unknown poly type 0x%x '%s' 0x%x,0x%x\n", poly->type,poly->name,r.lu.x,r.lu.y); item->type=type_street_unkn; } if (!map_selection_contains_item(mr->cur_sel, 0, item->type)) { poly->subpoly_num_all+=poly->polys; mr->b.p=poly->poly_next; continue; } } else mr->b.p=poly->subpoly_next; dbg(lvl_debug,"%d %d %s\n", poly->subpoly_num_all, mr->b.block_num, poly->name); item->id_lo=poly->subpoly_num_all | (mr->b.block_num << 16); item->id_hi=(mr->current_file << 16); dbg(lvl_debug,"0x%x 0x%x\n", item->id_lo, item->id_hi); poly->subpoly_next=mr->b.p+L(poly->count[poly->subpoly_num])*sizeof(struct coord); poly->subpoly_num++; poly->subpoly_num_all++; if (poly->subpoly_num >= poly->polys) poly->subpoly_num=0; poly->subpoly_start=poly->p=mr->b.p; item->priv_data=poly; poly->attr_next=attr_label; return 1; } } int poly_get_byid(struct map_rect_priv *mr, struct poly_priv *poly, int id_hi, int id_lo, struct item *item) { int count=id_lo & 0xffff; int ret=0; block_get_byindex(mr->m->file[mr->current_file], id_lo >> 16, &mr->b); while (count-- >= 0) { ret=poly_get(mr, poly, item); } return ret; } navit-0.5.0+dfsg.1/navit/map/mg/street.c000066400000000000000000000712031264204753600177020ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "mg.h" int coord_debug; #if 0 static void street_name_numbers_get(struct street_name_numbers *name_numbers, unsigned char **p); static void street_name_number_get(struct street_name_number *name_number, unsigned char **p); static void street_name_debug(struct street_name *sn, FILE *out) { struct street_name_numbers nns; unsigned char *p=sn->aux_data; unsigned char *end=p+sn->aux_len; int i; while (p < end) { unsigned char *pn,*pn_end; struct street_name_number nn; street_name_numbers_get(&nns, &p); fprintf(out,"0x%x 0x%x type=town_label label=\"%s(%d):0x%x:%d%s-%d%s\" debug=\"len=0x%x\"",nns.c->x,nns.c->y,sn->name2, sn->segment_count, nns.tag, nns.first.number,nns.first.suffix,nns.last.number,nns.last.suffix,nns.len); for (i = 0 ; i < sn->segment_count ; i++) { fprintf(out," debug=\"segment(%d)=0x%x\"",i,sn->segments[i].segid); } fprintf(out,"\n"); pn=nns.aux_data; pn_end=nns.aux_data+nns.aux_len; while (pn < pn_end) { street_name_number_get(&nn, &pn); fprintf(out,"0x%x 0x%x type=town_label label=\"%s:0x%x:%d%s-%d%s\" debug=\"len=0x%x\"\n", nn.c->x, nn.c->y, sn->name2, nn.tag, nn.first.number, nn.first.suffix, nn.last.number,nn.last.suffix,nn.len); } } fflush(out); } #endif static void street_name_get(struct street_name *name, unsigned char **p) { #if 0 static FILE *out; static GHashTable *hash; #endif unsigned char *start=*p; name->len=get_u16_unal(p); name->country=get_u16_unal(p); name->townassoc=get_u32_unal(p); name->name1=get_string(p); name->name2=get_string(p); name->segment_count=get_u32_unal(p); name->segments=(struct street_name_segment *)(*p); (*p)+=(sizeof (struct street_name_segment))*name->segment_count; name->aux_len=name->len-(*p-start); name->aux_data=*p; name->tmp_len=name->aux_len; name->tmp_data=name->aux_data; *p=start+name->len; #if 0 if (! out) { out=fopen("hn.txt","a"); } if (! hash) { hash=g_hash_table_new(NULL,NULL); } if (! g_hash_table_lookup(hash, *p)) { g_hash_table_insert(hash, *p, (void *)1); street_name_debug(name, out); } #endif } static int street_name_eod(struct street_name *name) { return (name->tmp_data >= name->aux_data+name->aux_len); } static void street_name_numbers_get(struct street_name_numbers *name_numbers, unsigned char **p) { unsigned char *start=*p; name_numbers->len=get_u16_unal(p); name_numbers->tag=get_u8(p); name_numbers->dist=get_u32_unal(p); name_numbers->country=get_u32_unal(p); name_numbers->c=coord_get(p); name_numbers->first.number=get_u16_unal(p); name_numbers->first.suffix=get_string(p); name_numbers->last.number=get_u16_unal(p); name_numbers->last.suffix=get_string(p); name_numbers->segment_count=get_u32_unal(p); name_numbers->segments=(struct street_name_segment *)(*p); (*p)+=sizeof(struct street_name_segment)*name_numbers->segment_count; name_numbers->aux_len=name_numbers->len-(*p-start); name_numbers->aux_data=*p; name_numbers->tmp_len=name_numbers->aux_len; name_numbers->tmp_data=name_numbers->aux_data; *p=start+name_numbers->len; } static int street_name_numbers_eod(struct street_name_numbers *name_numbers) { return (name_numbers->tmp_data >= name_numbers->aux_data+name_numbers->aux_len); } static void street_name_number_get(struct street_name_number *name_number, unsigned char **p) { unsigned char *start=*p; name_number->len=get_u16_unal(p); name_number->tag=get_u8(p); name_number->c=coord_get(p); name_number->first.number=get_u16_unal(p); name_number->first.suffix=get_string(p); name_number->last.number=get_u16_unal(p); name_number->last.suffix=get_string(p); name_number->segment=(struct street_name_segment *)p; *p=start+name_number->len; } static void street_name_get_by_id(struct street_name *name, struct file *file, unsigned long id) { unsigned char *p; if (id) { p=file->begin+id+0x2000; street_name_get(name, &p); } } static int street_get_bytes(struct coord_rect *r) { int bytes,dx,dy; bytes=2; dx=r->rl.x-r->lu.x; dy=r->lu.y-r->rl.y; dbg_assert(dx > 0); dbg_assert(dy > 0); if (dx > 32767 || dy > 32767) bytes=3; if (dx > 8388608 || dy > 8388608) bytes=4; return bytes; } static int street_get_coord(unsigned char **pos, int bytes, struct coord_rect *ref, struct coord *f) { unsigned char *p; int x,y,flags=0; p=*pos; x=*p++; x|=(*p++) << 8; if (bytes == 2) { if ( x > 0x7fff) { x=0x10000-x; flags=1; } } else if (bytes == 3) { x|=(*p++) << 16; if ( x > 0x7fffff) { x=0x1000000-x; flags=1; } } else { x|=(*p++) << 16; x|=(*p++) << 24; if (x < 0) { x=-x; flags=1; } } y=*p++; y|=(*p++) << 8; if (bytes == 3) { y|=(*p++) << 16; } else if (bytes == 4) { y|=(*p++) << 16; y|=(*p++) << 24; } if (f) { f->x=ref->lu.x+x; f->y=ref->rl.y+y; dbg(lvl_debug,"0x%x,0x%x + 0x%x,0x%x = 0x%x,0x%x\n", x, y, ref->lu.x, ref->rl.y, f->x, f->y); } *pos=p; return flags; } static void street_coord_get_begin(unsigned char **p) { struct street_str *str; str=(struct street_str *)(*p); while (street_str_get_segid(str)) { str++; } (*p)=(unsigned char *)str; (*p)+=4; } static void street_coord_rewind(void *priv_data) { struct street_priv *street=priv_data; street->p=street->next=NULL; street->status=street->status_rewind; } static int street_coord_get_helper(struct street_priv *street, struct coord *c) { unsigned char *n; if (street->p+street->bytes*2 >= street->end) return 0; if (street->status >= 4) return 0; n=street->p; if (street_get_coord(&street->p, street->bytes, &street->ref, c)) { if (street->status) street->next=n; street->status+=2; if (street->status == 5) return 0; } return 1; } static int street_coord_get(void *priv_data, struct coord *c, int count) { struct street_priv *street=priv_data; int ret=0,i,scount; #ifdef DEBUG_COORD_GET int segid,debug=0; #endif if (! street->p && count) { street->p=street->coord_begin; scount=street->str-street->str_start; for (i = 0 ; i < scount ; i++) { street->status=street_str_get_segid(&street->str[i+1]) >= 0 ? 0:1; while (street_coord_get_helper(street, c)); street->p=street->next; } street->status_rewind=street->status=street_str_get_segid(&street->str[1]) >= 0 ? 0:1; } #ifdef DEBUG_COORD_GET segid=street_str_get_segid(&street->str[0]); if (segid < 0) segid=-segid; if (segid == 0x15) debug=1; if (debug) { dbg(lvl_debug,"enter 0x%x\n",segid); } #endif while (count > 0) { if (street_coord_get_helper(street, c)) { #ifdef DEBUG_COORD_GET if (debug) { dbg(lvl_debug,"0x%x,0x%x\n", c->x, c->y); } #endif c++; ret++; count--; } else { street->more=0; return ret; } } return ret; } static void street_attr_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static int street_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct street_priv *street=priv_data; int nameid; dbg(lvl_debug,"segid 0x%x\n", street_str_get_segid(street->str)); attr->type=attr_type; switch (attr_type) { case attr_any: while (street->attr_next != attr_none) { if (street_attr_get(street, street->attr_next, attr)) return 1; } return 0; case attr_label: street->attr_next=attr_street_name; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.str=street->name.name2; if (attr->u.str && attr->u.str[0]) return 1; attr->u.str=street->name.name1; if (attr->u.str && attr->u.str[0]) return 1; return 0; case attr_street_name: street->attr_next=attr_street_name_systematic; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.str=street->name.name2; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_street_name_systematic: street->attr_next=attr_flags; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.str=street->name.name1; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_flags: attr->u.num=street->flags; street->attr_next=attr_country_id; return 1; case attr_country_id: street->attr_next=attr_debug; nameid=street_str_get_nameid(street->str); if (! nameid) return 0; if (! street->name.len) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.num=mg_country_to_isonum(street->name.country); return 1; case attr_debug: street->attr_next=attr_none; { struct street_str *str=street->str; sprintf(street->debug,"order:0x%x\nsegid:0x%x\nlimit:0x%x\nunknown2:0x%x\nunknown3:0x%x\ntype:0x%x\nnameid:0x%x\ntownassoc:0x%x",street_header_get_order(street->header),street_str_get_segid(str),street_str_get_limit(str),street_str_get_unknown2(str),street_str_get_unknown3(str),street_str_get_type(str),street_str_get_nameid(str), street->name.len ? street->name.townassoc : 0); attr->u.str=street->debug; } return 1; default: return 0; } return 1; } static struct item_methods street_meth = { street_coord_rewind, street_coord_get, street_attr_rewind, street_attr_get, }; static void street_get_data(struct street_priv *street, unsigned char **p) { street->header=(struct street_header *)(*p); (*p)+=sizeof(struct street_header); street->type_count=street_header_get_count(street->header); street->type=(struct street_type *)(*p); (*p)+=street->type_count*sizeof(struct street_type); } /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ static unsigned char limit[]={0,0,1,1,1,2,2,4,6,6,12,13,14,20,20,20,20,20,20}; int street_get(struct map_rect_priv *mr, struct street_priv *street, struct item *item) { int *flags; struct coord_rect r; for (;;) { while (street->more) { struct coord c; street_coord_get(street, &c, 1); } #if 0 if (street->housenumber) { if (street_get_housenumber(mr, street, item)) return 1; street->housenumber=0; } #endif if (mr->b.p == mr->b.p_start) { street_get_data(street, &mr->b.p); street->name_file=mr->m->file[file_strname_stn]; if (mr->cur_sel && street_header_get_order(street->header) > limit[mr->cur_sel->order]) return 0; street->end=mr->b.end; block_get_r(mr->b.b, &r); street->ref=r; street->bytes=street_get_bytes(&r); street->str_start=street->str=(struct street_str *)mr->b.p; street->coord_begin=mr->b.p; street_coord_get_begin(&street->coord_begin); street->p=street->coord_begin; street->type--; item->meth=&street_meth; item->priv_data=street; } else { street->str++; street->p=street->next; } if (! street_str_get_segid(street->str)) return 0; if (street_str_get_segid(street->str) < 0) street->type++; #if 0 dbg_assert(street->p != NULL); #endif street->next=NULL; street->status_rewind=street->status=street_str_get_segid(&street->str[1]) >= 0 ? 0:1; #if 0 if (street->type->country != 0x31) { printf("country=0x%x\n", street->type->country); } #endif item->id_hi=street_type_get_country(street->type) | (mr->current_file << 16); item->id_lo=street_str_get_segid(street->str) > 0 ? street_str_get_segid(street->str) : -street_str_get_segid(street->str); switch(street_str_get_type(street->str) & 0x1f) { case 0xf: /* very small street */ if (street_str_get_limit(street->str) == 0x33) item->type=type_street_nopass; else item->type=type_street_0; break; case 0xd: item->type=type_ferry; break; case 0xc: /* small street */ item->type=type_street_1_city; break; case 0xb: item->type=type_street_2_city; break; case 0xa: if ((street_str_get_limit(street->str) == 0x03 || street_str_get_limit(street->str) == 0x30) && street_header_get_order(street->header) < 4) item->type=type_street_4_city; else item->type=type_street_3_city; break; case 0x9: if (street_header_get_order(street->header) < 5) item->type=type_street_4_city; else if (street_header_get_order(street->header) < 7) item->type=type_street_2_city; else item->type=type_street_1_city; break; case 0x8: item->type=type_street_2_land; break; case 0x7: if ((street_str_get_limit(street->str) == 0x03 || street_str_get_limit(street->str) == 0x30) && street_header_get_order(street->header) < 4) item->type=type_street_4_city; else item->type=type_street_3_land; break; case 0x6: item->type=type_ramp; break; case 0x5: item->type=type_street_4_land; break; case 0x4: item->type=type_street_4_land; break; case 0x3: item->type=type_street_n_lanes; break; case 0x2: item->type=type_highway_city; break; case 0x1: item->type=type_highway_land; break; default: item->type=type_street_unkn; dbg(lvl_error,"unknown type 0x%x\n",street_str_get_type(street->str)); } flags=item_get_default_flags(item->type); if (flags) street->flags=*flags; else street->flags=0; if (street_str_get_type(street->str) & 0x40) { street->flags|=(street_str_get_limit(street->str) & 0x30) ? AF_ONEWAYREV:0; street->flags|=(street_str_get_limit(street->str) & 0x03) ? AF_ONEWAY:0; } else { street->flags|=(street_str_get_limit(street->str) & 0x30) ? AF_ONEWAY:0; street->flags|=(street_str_get_limit(street->str) & 0x03) ? AF_ONEWAYREV:0; } #if 0 coord_debug=(street->str->unknown2 != 0x40 || street->str->unknown3 != 0x40); if (coord_debug) { item->type=type_street_unkn; printf("%d %02x %02x %02x %02x\n", street->str->segid, street->str->type, street->str->limit, street->str->unknown2, street->str->unknown3); } #endif street->p_rewind=street->p; street->name.len=0; street->attr_next=attr_label; street->more=1; street->housenumber=1; street->hn_count=0; if (!map_selection_contains_item(mr->cur_sel, 0, item->type)) continue; item->meth=&street_meth; item->priv_data=street; return 1; } } int street_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item) { int country=id_hi & 0xffff; int res; struct coord_rect r; dbg(lvl_debug,"enter(%p,%p,0x%x,0x%x,%p)\n", mr, street, id_hi, id_lo, item); if (! country) return 0; if (! tree_search_hv(mr->m->dirname, "street", (id_lo >> 8) | (country << 24), id_lo & 0xff, &res)) return 0; dbg(lvl_debug,"res=0x%x (blk=0x%x)\n", res, res >> 12); block_get_byindex(mr->m->file[mr->current_file], res >> 12, &mr->b); street_get_data(street, &mr->b.p); street->name_file=mr->m->file[file_strname_stn]; street->end=mr->b.end; block_get_r(mr->b.b, &r); street->ref=r; street->bytes=street_get_bytes(&r); street->str_start=street->str=(struct street_str *)mr->b.p; street->coord_begin=mr->b.p; street_coord_get_begin(&street->coord_begin); street->p=street->coord_begin; street->type--; item->meth=&street_meth; item->priv_data=street; street->str+=(res & 0xfff)-1; dbg(lvl_debug,"segid 0x%x\n", street_str_get_segid(&street->str[1])); return street_get(mr, street, item); #if 0 mr->b.p=mr->b.block_start+(res & 0xffff); return town_get(mr, twn, item); #endif return 0; } struct street_name_index { int block; unsigned short country; int town_assoc; char name[0]; } __attribute__((packed)); static unsigned char latin1_tolower(unsigned char c) { if (c >= 'A' && c <= 'Z') return c - 'A' + 'a'; if (c == 0xc4 || c == 0xc9 || c == 0xd6 || c == 0xdc) return c+0x20; return c; } static unsigned char latin1_tolower_ascii(unsigned char c) { unsigned char ret=latin1_tolower(c); switch (ret) { case 0xe4: return 'a'; case 0xe9: return 'e'; case 0xf6: return 'o'; case 0xfc: return 'u'; default: if (ret >= 0x80) dbg(lvl_debug,"ret=0x%x\n",c); return ret; } } static int strncasecmp_latin1(char *str1, char *str2, int len) { int d; while (len--) { d=latin1_tolower((unsigned char)(*str1))-latin1_tolower((unsigned char)(*str2)); if (d) return d; if (! *str1) return 0; str1++; str2++; } return 0; } static int strncasecmp_latin1_ascii(char *str1, char *str2, int len) { int d; while (len--) { d=latin1_tolower_ascii((unsigned char)(*str1))-latin1_tolower_ascii((unsigned char)(*str2)); if (d) return d; if (! *str1) return 0; str1++; str2++; } return 0; } static int street_search_compare_do(struct map_rect_priv *mr, int country, int town_assoc, char *name) { int d,len; dbg(lvl_debug,"enter"); dbg(lvl_debug,"country 0x%x town_assoc 0x%x name '%s'\n", country, town_assoc, name); d=(mr->search_item.id_hi & 0xffff)-country; dbg(lvl_debug,"country %d (%d vs %d)\n", d, mr->search_item.id_hi & 0xffff, country); if (!d) { if (mr->search_item.id_lo == town_assoc ) { dbg(lvl_debug,"town_assoc match (0x%x)\n", town_assoc); len=mr->search_partial ? strlen(mr->search_str):INT_MAX; d=strncasecmp_latin1(mr->search_str, name, len); if (!strncasecmp_latin1_ascii(mr->search_str, name, len)) d=0; dbg(lvl_debug,"string %d\n", d); } else { if (town_assoc < mr->search_item.id_lo) d=1; else d=-1; dbg(lvl_debug,"assoc %d 0x%x-0x%x\n",d, mr->search_item.id_lo, town_assoc); } } dbg(lvl_debug,"d=%d\n", d); return d; } static int street_search_compare(unsigned char **p, struct map_rect_priv *mr) { struct street_name_index *i; int ret; dbg(lvl_debug,"enter\n"); i=(struct street_name_index *)(*p); *p+=sizeof(*i)+strlen(i->name)+1; dbg(lvl_debug,"block 0x%x\n", i->block); ret=street_search_compare_do(mr, i->country, i->town_assoc, i->name); if (ret <= 0) mr->search_block=i->block; return ret; } static void street_name_coord_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static void street_name_attr_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static int street_name_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct street_name_numbers snns; unsigned char *p=mr->street.name.aux_data; dbg(lvl_debug,"aux_data=%p\n", p); if (count) { street_name_numbers_get(&snns, &p); street_name_numbers_get_coord(&snns, c); return 1; } return 0; } #if 0 static void debug(struct map_rect_priv *mr) { int i; struct street_name_numbers nns; unsigned char *p=mr->street.name.aux_data; unsigned char *end=p+mr->street.name.aux_len; printf("len=0x%x\n", mr->street.name.aux_len); for (i = 0 ; i < mr->street.name.aux_len ; i++) { printf("%02x ",mr->street.name.aux_data[i]); } printf("\n"); { while (p < end) { unsigned char *pn,*pn_end; struct street_name_number nn; street_name_numbers_get(&nns, &p); printf("name_numbers:\n"); printf(" len 0x%x\n", nns.len); printf(" tag 0x%x\n", nns.tag); printf(" dist 0x%x\n", nns.dist); printf(" country 0x%x\n", nns.country); printf(" coord 0x%x,0x%x\n", nns.c->x, nns.c->y); printf(" first %d\n", nns.first.number); printf(" last %d\n", nns.last.number); printf(" segment count 0x%x\n", nns.segment_count); printf(" aux_len 0x%x\n", nns.aux_len); pn=nns.aux_data; pn_end=nns.aux_data+nns.aux_len; while (pn < pn_end) { printf(" number:\n"); street_name_number_get(&nn, &pn); printf(" len 0x%x\n", nn.len); printf(" tag 0x%x\n", nn.tag); printf(" coord 0x%x,0x%x\n", nn.c->x, nn.c->y); printf(" first %d\n", nn.first.number); printf(" last %d\n", nn.last.number); } } } } #endif static int street_name_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; attr->type=attr_type; switch (attr_type) { case attr_street_name: attr->u.str=mr->street.name.name2; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_street_name_systematic: attr->u.str=mr->street.name.name1; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_name: case attr_district_name: case attr_postal: if (!mr->search_item_tmp) mr->search_item_tmp=map_rect_get_item_byid_mg(mr->search_mr_tmp, mr->street.name_numbers.country | (file_town_twn << 16), mr->street.name_numbers.dist); if (!mr->search_item_tmp) return 0; return item_attr_get(mr->search_item_tmp, attr_type, attr); default: dbg(lvl_error,"unknown attr %s\n",attr_to_name(attr_type)); return 0; } } static struct item_methods street_name_meth = { street_name_coord_rewind, street_name_coord_get, street_name_attr_rewind, street_name_attr_get, }; int street_name_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item) { mr->current_file=id_hi >> 16; street->name_file=mr->m->file[mr->current_file]; item->type=type_street_name; item->id_hi=id_hi; item->id_lo=id_lo; item->meth=&street_name_meth; item->map=NULL; item->priv_data=mr; mr->b.p=street->name_file->begin+item->id_lo; dbg(lvl_debug,"last %p map %p file %d begin %p\n", mr->b.p, mr->m, mr->current_file, mr->m->file[mr->current_file]->begin); street_name_get(&street->name, &mr->b.p); return 1; } static struct item * street_search_get_item_street_name(struct map_rect_priv *mr) { int dir=1,leaf; unsigned char *last; dbg(lvl_debug,"enter\n"); if (! mr->search_blk_count) { dbg(lvl_debug,"partial 0x%x '%s' ***\n", mr->town.street_assoc, mr->search_str); if (mr->search_linear) return NULL; dbg(lvl_debug,"tree_search_next\n"); mr->search_block=-1; while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) { dir=street_search_compare(&mr->search_p, mr); } dbg(lvl_debug,"dir=%d mr->search_block=0x%x\n", dir, mr->search_block); if (mr->search_block == -1) return NULL; mr->search_blk_count=1; block_get_byindex(mr->m->file[file_strname_stn], mr->search_block, &mr->b); mr->b.p=mr->b.block_start+12; } dbg(lvl_debug,"name id %td\n", mr->b.p-mr->m->file[file_strname_stn]->begin); if (! mr->search_blk_count) return NULL; for (;;) { if (mr->b.p >= mr->b.end) { if (!block_next_lin(mr)) { dbg(lvl_debug,"end of blocks in %p, %p\n", mr->m->file[file_strname_stn]->begin, mr->m->file[file_strname_stn]->end); return NULL; } mr->b.p=mr->b.block_start+12; } while (mr->b.p < mr->b.end) { last=mr->b.p; street_name_get(&mr->street.name, &mr->b.p); dir=street_search_compare_do(mr, mr->street.name.country, mr->street.name.townassoc, mr->street.name.name2); dbg(lvl_debug,"country 0x%x assoc 0x%x name1 '%s' name2 '%s' dir=%d\n", mr->street.name.country, mr->street.name.townassoc, mr->street.name.name1, mr->street.name.name2, dir); if (dir < 0) { dbg(lvl_debug,"end of data\n"); mr->search_blk_count=0; return NULL; } if (!dir) { dbg(lvl_debug,"result country 0x%x assoc 0x%x name1 '%s' name2 '%s' dir=%d aux_data=%p len=0x%x\n", mr->street.name.country, mr->street.name.townassoc, mr->street.name.name1, mr->street.name.name2, dir, mr->street.name.aux_data, mr->street.name.aux_len); mr->item.type = type_street_name; mr->item.id_hi=(file_strname_stn << 16); mr->item.id_lo=last-mr->m->file[file_strname_stn]->begin; dbg(lvl_debug,"id 0x%x 0x%x last %p map %p file %d begin %p\n", mr->item.id_hi, mr->item.id_lo, last, mr->m, mr->current_file, mr->m->file[mr->current_file]->begin); mr->item.meth=&street_name_meth; mr->item.map=NULL; mr->item.priv_data=mr; /* debug(mr); */ dbg(lvl_debug,"last %p\n",last); return &mr->item; } } } } struct item * street_search_get_item(struct map_rect_priv *mr) { struct item *item; for (;;) { if (!mr->street.name.tmp_data || street_name_eod(&mr->street.name)) { item=street_search_get_item_street_name(mr); if (!item) return NULL; if (!mr->street.name.aux_len) return item; } mr->item.id_hi++; street_name_numbers_get(&mr->street.name_numbers, &mr->street.name.tmp_data); mr->search_item_tmp=NULL; return &mr->item; } } static int street_name_numbers_next(struct map_rect_priv *mr) { if (street_name_eod(&mr->street.name)) return 0; dbg(lvl_debug,"%p vs %p\n",mr->street.name.tmp_data, mr->street.name.aux_data); street_name_numbers_get(&mr->street.name_numbers, &mr->street.name.tmp_data); return 1; } static int street_name_number_next(struct map_rect_priv *mr) { if (street_name_numbers_eod(&mr->street.name_numbers)) return 0; street_name_number_get(&mr->street.name_number, &mr->street.name_numbers.tmp_data); sprintf(mr->street.first_number,"%d%s",mr->street.name_number.first.number,mr->street.name_number.first.suffix); sprintf(mr->street.last_number,"%d%s",mr->street.name_number.last.number,mr->street.name_number.last.suffix); mr->street.current_number[0]='\0'; return 1; } static void housenumber_coord_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static void housenumber_attr_rewind(void *priv_data) { /* struct street_priv *street=priv_data; */ } static int housenumber_coord_get(void *priv_data, struct coord *c, int count) { return 0; } static int housenumber_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; attr->type=attr_type; switch (attr_type) { case attr_house_number: attr->u.str=mr->street.current_number; return 1; case attr_town_name: case attr_district_name: case attr_postal: if (!mr->search_item_tmp) mr->search_item_tmp=map_rect_get_item_byid_mg(mr->search_mr_tmp, mr->street.name_numbers.country | (file_town_twn << 16), mr->street.name_numbers.dist); if (!mr->search_item_tmp) return 0; return item_attr_get(mr->search_item_tmp, attr_type, attr); default: dbg(lvl_error,"unknown attr %s\n",attr_to_name(attr_type)); return 0; } } static struct item_methods housenumber_meth = { housenumber_coord_rewind, housenumber_coord_get, housenumber_attr_rewind, housenumber_attr_get, }; int housenumber_search_setup(struct map_rect_priv *mr) { dbg(lvl_debug,"enter (0x%x,0x%x)\n",mr->search_item.id_hi,mr->search_item.id_lo); int id=mr->search_item.id_hi & 0xff; mr->current_file=file_strname_stn; mr->street.name_file=mr->m->file[mr->current_file]; mr->b.p=mr->street.name_file->begin+mr->search_item.id_lo; mr->search_str=g_strdup(mr->search_attr->u.str); dbg(lvl_debug,"last %p\n",mr->b.p); street_name_get(&mr->street.name, &mr->b.p); #if 0 debug(mr); #endif while (id > 0) { id--; dbg(lvl_debug,"loop\n"); if (!street_name_numbers_next(mr)) return 0; } mr->item.type=type_house_number; mr->item.priv_data=mr; mr->item.id_hi=mr->search_item.id_hi + 0x100; mr->item.meth=&housenumber_meth; if (!id) mr->item.id_hi+=1; mr->item.id_lo=mr->search_item.id_lo; dbg(lvl_debug,"getting name_number %p vs %p + %d\n",mr->street.name_numbers.tmp_data,mr->street.name_numbers.aux_data, mr->street.name_numbers.aux_len); if (!street_name_number_next(mr)) return 0; dbg(lvl_debug,"enter\n"); // debug(mr); return 1; } static int house_number_next(char *number, char *first, char *last, int interpolation, int *percentage) { int firstn=atoi(first); int lastn=atoi(last); int current,delta,len=lastn-firstn; if (interpolation) { len/=2; } if (!number[0]) { strcpy(number,first); delta=0; } else { current=atoi(number)+(interpolation ? 2:1); if (current > lastn) return 0; sprintf(number,"%d",current); delta=current-firstn; } if (percentage) { if (len) *percentage=delta*100/len; else *percentage=50; } return 1; } struct item * housenumber_search_get_item(struct map_rect_priv *mr) { int d; dbg(lvl_debug,"enter %s %s\n",mr->street.first_number,mr->street.last_number); for (;;) { if (!house_number_next(mr->street.current_number, mr->street.first_number, mr->street.last_number, 0, NULL)) { if (!street_name_number_next(mr)) return NULL; continue; } if (mr->search_partial) d=strncasecmp(mr->search_str, mr->street.current_number, strlen(mr->search_str)); else d=strcasecmp(mr->search_str, mr->street.current_number); if (!d) { mr->search_item_tmp=NULL; return &mr->item; } } } navit-0.5.0+dfsg.1/navit/map/mg/town.c000066400000000000000000000206651264204753600173710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "mg.h" static void town_coord_rewind(void *priv_data) { struct town_priv *twn=priv_data; twn->cidx=0; } static int town_coord_get(void *priv_data, struct coord *c, int count) { struct town_priv *twn=priv_data; if (twn->cidx || count <= 0) return 0; twn->cidx=1; *c=twn->c; return 1; } static void town_attr_rewind(void *priv_data) { struct town_priv *twn=priv_data; twn->aidx=0; twn->attr_next=attr_label; } static int town_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct town_priv *twn=priv_data; int len; attr->type=attr_type; switch (attr_type) { case attr_any: while (twn->attr_next != attr_none) { if (town_attr_get(twn, twn->attr_next, attr)) return 1; } return 0; case attr_label: attr->u.str=twn->district; twn->attr_next=attr_town_name; if (attr->u.str[0]) return 1; attr->u.str=twn->name; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_name: attr->u.str=twn->name; twn->attr_next=attr_town_postal; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_postal: case attr_postal: strncpy(twn->postal, twn->postal_code1, 32); attr->u.str=twn->postal; len=mg_country_postal_len(twn->country); if (!len) len=31; twn->postal[len]='\0'; twn->attr_next=attr_district_name; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_district_name: attr->u.str=twn->district; twn->attr_next=attr_debug; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_town_streets_item: twn->town_attr_item.type=type_town_streets; twn->town_attr_item.id_hi=twn->country | (file_town_twn << 16) | 0x10000000; twn->town_attr_item.id_lo=twn->street_assoc; attr->u.item=&twn->town_attr_item; twn->attr_next=attr_debug; return 1; case attr_debug: sprintf(twn->debug, "order %d\nsize %d\nstreet_assoc 0x%x", twn->order, twn->size, twn->street_assoc); attr->u.str=twn->debug; twn->attr_next=attr_none; return 1; default: dbg(lvl_warning, "Don't know about attribute %d[%04X]=%s yet\n", attr_type, attr_type, attr_to_name(attr_type)); return 0; } return 1; } static struct item_methods town_meth = { town_coord_rewind, town_coord_get, town_attr_rewind, town_attr_get, }; static void town_get_data(struct town_priv *twn, unsigned char **p) { twn->id=get_u32_unal(p); twn->c.x=get_u32_unal(p); twn->c.y=get_u32_unal(p); twn->name=get_string(p); twn->district=get_string(p); twn->postal_code1=get_string(p); twn->order=get_u8(p); /* 1-15 (19) */ twn->country=get_u16_unal(p); twn->type=get_u8(p); twn->unknown2=get_u32_unal(p); twn->size=get_u8(p); twn->street_assoc=get_u32_unal(p); twn->unknown3=get_u8(p); twn->postal_code2=get_string(p); twn->unknown4=get_u32_unal(p); #if 0 printf("%s\t%s\t%s\t%d\t%d\t%d\n",twn->name,twn->district,twn->postal_code1,twn->order, twn->country, twn->type); #endif } /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ static unsigned char limit[]={0,1,2,2,4,6,8,10,11,13,14,14,14,20,20,20,20,20,20}; static enum item_type town_item[]={type_town_label_5e1, type_town_label_1e2, type_town_label_2e2, type_town_label_5e2, type_town_label_1e3, type_town_label_1e3, type_town_label_2e3, type_town_label_5e3, type_town_label_1e4, type_town_label_2e4, type_town_label_5e4, type_town_label_1e5, type_town_label_1e5, type_town_label_2e5, type_town_label_5e5, type_town_label_1e6, type_town_label_2e6}; static enum item_type district_item[]={type_district_label_5e1, type_district_label_1e2, type_district_label_2e2, type_district_label_5e2, type_district_label_1e3, type_district_label_1e3, type_district_label_2e3, type_district_label_5e3, type_district_label_1e4, type_district_label_2e4, type_district_label_5e4, type_district_label_1e5, type_district_label_1e5, type_district_label_2e5, type_district_label_5e5, type_district_label_1e6, type_district_label_2e6}; int town_get(struct map_rect_priv *mr, struct town_priv *twn, struct item *item) { int size; for (;;) { if (mr->b.p >= mr->b.end) return 0; town_get_data(twn, &mr->b.p); twn->cidx=0; twn->aidx=0; twn->attr_next=attr_label; if (! mr->cur_sel || (twn->order <= limit[mr->cur_sel->order] && coord_rect_contains(&mr->cur_sel->u.c_rect,&twn->c))) { switch(twn->type) { case 1: size=twn->size; if (size >= sizeof(town_item)/sizeof(enum item_type)) size=sizeof(town_item)/sizeof(enum item_type)-1; item->type=town_item[size]; break; case 3: size=twn->size; if (size == 6 && twn->order < 14) size++; if (size == 5 && twn->order < 14) size+=2; if (size >= sizeof(district_item)/sizeof(enum item_type)) size=sizeof(district_item)/sizeof(enum item_type)-1; item->type=district_item[size]; break; case 4: item->type=type_port_label; break; case 9: item->type=type_highway_exit_label; break; default: printf("unknown town type 0x%x '%s' '%s' 0x%x,0x%x\n", twn->type, twn->name, twn->district, twn->c.x, twn->c.y); item->type=type_town_label; } if (map_selection_contains_item(mr->cur_sel, 0, item->type)) { item->id_hi=twn->country | (mr->current_file << 16); item->id_lo=twn->id; item->priv_data=twn; item->meth=&town_meth; return 1; } } } } int town_get_byid(struct map_rect_priv *mr, struct town_priv *twn, int id_hi, int id_lo, struct item *item) { int country=id_hi & 0xffff; int res; if (!tree_search_hv(mr->m->dirname, "town", (id_lo >> 8) | (country << 24), id_lo & 0xff, &res)) return 0; block_get_byindex(mr->m->file[mr->current_file], res >> 16, &mr->b); mr->b.p=mr->b.block_start+(res & 0xffff); return town_get(mr, twn, item); } static int town_search_compare(unsigned char **p, struct map_rect_priv *mr) { int country, d; char *name; if (mr->search_type == attr_town_postal) { mr->search_blk_count=1; mr->search_blk_off=(struct block_offset *)(*p); *p+=4; name=get_string(p); d=0; } else { country=get_u16_unal(p); dbg(lvl_debug,"country 0x%x ", country); name=get_string(p); dbg(lvl_debug,"name '%s' ",name); mr->search_blk_count=get_u32_unal(p); mr->search_blk_off=(struct block_offset *)(*p); dbg(lvl_debug,"len %d ", mr->search_blk_count); (*p)+=mr->search_blk_count*4; d=mr->search_country-country; } if (!d) { if (mr->search_partial) d=strncasecmp(mr->search_str, name, strlen(mr->search_str)); else d=strcasecmp(mr->search_str, name); } dbg(lvl_debug,"%d \n",d); return d; } struct item * town_search_get_item(struct map_rect_priv *mr) { int dir=1,leaf; if (! mr->search_blk_count) { dbg(lvl_debug,"partial %d 0x%x '%s' ***\n", mr->search_partial, mr->search_country, mr->search_str); if (! mr->search_linear) { while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) { dir=town_search_compare(&mr->search_p, mr); if (! dir) { mr->search_linear=1; mr->search_p=NULL; break; } } if (! mr->search_linear) { dbg(lvl_warning,"not found\n"); return NULL; } } if (! tree_search_next_lin(&mr->ts, &mr->search_p)) { dbg(lvl_debug,"linear not found\n"); return NULL; } if (town_search_compare(&mr->search_p, mr)) { dbg(lvl_debug,"no match\n"); return NULL; } dbg(lvl_debug,"found %d blocks\n",mr->search_blk_count); } if (! mr->search_blk_count) return NULL; dbg(lvl_debug,"block 0x%x offset 0x%x\n", block_offset_get_block(mr->search_blk_off), block_offset_get_offset(mr->search_blk_off)); block_get_byindex(mr->m->file[mr->current_file], block_offset_get_block(mr->search_blk_off), &mr->b); mr->b.p=mr->b.block_start+block_offset_get_offset(mr->search_blk_off); town_get(mr, &mr->town, &mr->item); mr->search_blk_off++; mr->search_blk_count--; return &mr->item; } navit-0.5.0+dfsg.1/navit/map/mg/tree.c000066400000000000000000000207231264204753600173340ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "mg.h" struct tree_hdr { /*unsigned int addr; unsigned int size; unsigned int low;*/ unsigned char p[12]; }; static inline unsigned int tree_hdr_get_addr(struct tree_hdr * tree) { unsigned char *p = tree->p; return get_u32(&p); } static inline unsigned int tree_hdr_get_size(struct tree_hdr * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } static inline unsigned int tree_hdr_get_low(struct tree_hdr * tree) { unsigned char *p = tree->p+8; return get_u32(&p); } struct tree_hdr_h { /* unsigned int addr; unsigned int size;*/ unsigned char p[8]; }; static inline unsigned int tree_hdr_h_get_addr(struct tree_hdr_h * tree) { unsigned char *p = tree->p; return get_u32(&p); } static inline unsigned int tree_hdr_h_get_size(struct tree_hdr_h * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } struct tree_leaf_h { /* unsigned int lower; unsigned int higher; unsigned int match; unsigned int value;*/ unsigned char p[16]; }; static inline unsigned int tree_leaf_h_get_lower(struct tree_leaf_h * tree) { unsigned char *p = tree->p; return get_u32(&p); } static inline unsigned int tree_leaf_h_get_higher(struct tree_leaf_h * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } static inline unsigned int tree_leaf_h_get_match(struct tree_leaf_h * tree) { unsigned char *p = tree->p+8; return get_u32(&p); } static inline unsigned int tree_leaf_h_get_value(struct tree_leaf_h * tree) { unsigned char *p = tree->p+12; return get_u32(&p); } struct tree_hdr_v { /*unsigned int count; unsigned int next; unsigned int unknown;*/ unsigned char p[12]; }; static inline unsigned int tree_hdr_v_get_count(struct tree_hdr_v * tree) { unsigned char *p = tree->p; return get_u32_unal(&p); } static inline unsigned int tree_hdr_v_get_next(struct tree_hdr_v * tree) { unsigned char *p = tree->p+4; return get_u32_unal(&p); } static inline unsigned int tree_hdr_v_get_unknown(struct tree_hdr_v * tree) { unsigned char *p = tree->p+8; return get_u32_unal(&p); } struct tree_leaf_v { unsigned char key; /*int value;*/ unsigned char p[4]; } __attribute__((packed)); static inline int tree_leaf_v_get_value(struct tree_leaf_v * tree) { unsigned char *p = tree->p; return get_u32_unal(&p); } static int tree_search_h(struct file *file, unsigned int search) { unsigned char *p=file->begin,*end; int last,i=0,value,lower; struct tree_hdr_h *thdr; struct tree_leaf_h *tleaf; dbg(lvl_debug,"enter\n"); while (i++ < 1000) { thdr=(struct tree_hdr_h *)p; p+=sizeof(*thdr); end=p+tree_hdr_h_get_size(thdr); dbg(lvl_debug,"@%td\n", p-file->begin); last=0; while (p < end) { tleaf=(struct tree_leaf_h *)p; p+=sizeof(*tleaf); dbg(lvl_debug,"low:0x%x high:0x%x match:0x%x val:0x%x search:0x%x\n", tree_leaf_h_get_lower(tleaf), tree_leaf_h_get_higher(tleaf), tree_leaf_h_get_match(tleaf), tree_leaf_h_get_value(tleaf), search); value=tree_leaf_h_get_value(tleaf); if (value == search) return tree_leaf_h_get_match(tleaf); if (value > search) { dbg(lvl_debug,"lower\n"); lower=tree_leaf_h_get_lower(tleaf); if (lower) last=lower; break; } last=tree_leaf_h_get_higher(tleaf); } if (! last || last == -1) return 0; p=file->begin+last; } return 0; } static int tree_search_v(struct file *file, int offset, int search) { unsigned char *p=file->begin+offset; int i=0,count,next; struct tree_hdr_v *thdr; struct tree_leaf_v *tleaf; while (i++ < 1000) { thdr=(struct tree_hdr_v *)p; p+=sizeof(*thdr); count=tree_hdr_v_get_count(thdr); dbg(lvl_debug,"offset=%td count=0x%x\n", p-file->begin, count); while (count--) { tleaf=(struct tree_leaf_v *)p; p+=sizeof(*tleaf); dbg(lvl_debug,"0x%x 0x%x\n", tleaf->key, search); if (tleaf->key == search) return tree_leaf_v_get_value(tleaf); } next=tree_hdr_v_get_next(thdr); if (! next) break; p=file->begin+next; } return 0; } int tree_search_hv(char *dirname, char *filename, unsigned int search_h, unsigned int search_v, int *result) { struct file *f_idx_h, *f_idx_v; char buffer[4096]; int h,v; dbg(lvl_debug,"enter(%s, %s, 0x%x, 0x%x, %p)\n",dirname, filename, search_h, search_v, result); sprintf(buffer, "%s/%s.h1", dirname, filename); f_idx_h=file_create_caseinsensitive(buffer, 0); if ((!f_idx_h) || (!file_mmap(f_idx_h))) return 0; sprintf(buffer, "%s/%s.v1", dirname, filename); f_idx_v=file_create_caseinsensitive(buffer, 0); dbg(lvl_debug,"%p %p\n", f_idx_h, f_idx_v); if ((!f_idx_v) || (!file_mmap(f_idx_v))) { file_destroy(f_idx_h); return 0; } if ((h=tree_search_h(f_idx_h, search_h))) { dbg(lvl_debug,"h=0x%x\n", h); if ((v=tree_search_v(f_idx_v, h, search_v))) { dbg(lvl_debug,"v=0x%x\n", v); *result=v; file_destroy(f_idx_v); file_destroy(f_idx_h); dbg(lvl_debug,"return 1\n"); return 1; } } file_destroy(f_idx_v); file_destroy(f_idx_h); dbg(lvl_debug,"return 0\n"); return 0; } static struct tree_search_node * tree_search_enter(struct tree_search *ts, int offset) { struct tree_search_node *tsn=&ts->nodes[++ts->curr_node]; unsigned char *p; p=ts->f->begin+offset; tsn->hdr=(struct tree_hdr *)p; tsn->p=p+sizeof(struct tree_hdr); tsn->last=tsn->p; tsn->end=p+tree_hdr_get_size(tsn->hdr); tsn->low=tree_hdr_get_low(tsn->hdr); tsn->high=tree_hdr_get_low(tsn->hdr); dbg(lvl_debug,"pos %td addr 0x%ux size 0x%ux low 0x%ux end %tu\n", p-ts->f->begin, tree_hdr_get_addr(tsn->hdr), tree_hdr_get_size(tsn->hdr), tree_hdr_get_low(tsn->hdr), tsn->end-ts->f->begin); return tsn; } int tree_search_next(struct tree_search *ts, unsigned char **p, int dir) { struct tree_search_node *tsn=&ts->nodes[ts->curr_node]; if (! *p) *p=tsn->p; dbg(lvl_debug,"next *p=%p dir=%d\n", *p, dir); dbg(lvl_debug,"low1=0x%x high1=0x%x\n", tsn->low, tsn->high); if (dir <= 0) { dbg(lvl_debug,"down 0x%x\n", tsn->low); if (tsn->low != 0xffffffff) { tsn=tree_search_enter(ts, tsn->low); *p=tsn->p; tsn->high=get_u32(p); ts->last_node=ts->curr_node; dbg(lvl_debug,"saving last2 %d %td\n", ts->curr_node, tsn->last-ts->f->begin); dbg(lvl_debug,"high2=0x%x\n", tsn->high); return 0; } return -1; } tsn->low=tsn->high; tsn->last=*p; tsn->high=get_u32_unal(p); dbg(lvl_debug,"saving last3 %d %p\n", ts->curr_node, tsn->last); if (*p < tsn->end) return (tsn->low == 0xffffffff ? 1 : 0); dbg(lvl_debug,"end reached high=0x%x\n",tsn->high); if (tsn->low != 0xffffffff) { dbg(lvl_debug,"low 0x%x\n", tsn->low); tsn=tree_search_enter(ts, tsn->low); *p=tsn->p; tsn->high=get_u32_unal(p); ts->last_node=ts->curr_node; dbg(lvl_debug,"saving last4 %d %td\n", ts->curr_node, tsn->last-ts->f->begin); dbg(lvl_debug,"high4=0x%x\n", tsn->high); return 0; } return -1; } int tree_search_next_lin(struct tree_search *ts, unsigned char **p) { struct tree_search_node *tsn=&ts->nodes[ts->curr_node]; int high; dbg(lvl_debug,"pos=%d %td\n", ts->curr_node, *p-ts->f->begin); if (*p) ts->nodes[ts->last_node].last=*p; *p=tsn->last; for (;;) { high=get_u32_unal(p); if (*p < tsn->end) { ts->last_node=ts->curr_node; while (high != 0xffffffff) { tsn=tree_search_enter(ts, high); dbg(lvl_debug,"reload %d\n",ts->curr_node); high=tsn->low; } return 1; } dbg(lvl_debug,"eon %d %td %td\n", ts->curr_node, *p-ts->f->begin, tsn->end-ts->f->begin); if (! ts->curr_node) break; ts->curr_node--; tsn=&ts->nodes[ts->curr_node]; *p=tsn->last; } return 0; } void tree_search_init(char *dirname, char *filename, struct tree_search *ts, int offset) { char buffer[4096]; sprintf(buffer, "%s/%s", dirname, filename); ts->f=file_create_caseinsensitive(buffer, 0); ts->curr_node=-1; if (ts->f) { file_mmap(ts->f); tree_search_enter(ts, offset); } } void tree_search_free(struct tree_search *ts) { if (ts->f) file_destroy(ts->f); } navit-0.5.0+dfsg.1/navit/map/shapefile/000077500000000000000000000000001264204753600175625ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/shapefile/CMakeLists.txt000066400000000000000000000000561264204753600223230ustar00rootroot00000000000000module_add_library(map_shapefile shapefile.c) navit-0.5.0+dfsg.1/navit/map/shapefile/Makefile.am000066400000000000000000000010271264204753600216160ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @SHAPEFILE_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_shapefile if PLUGINS modulemap_LTLIBRARIES = libmap_shapefile.la else noinst_LTLIBRARIES = libmap_shapefile.la endif libmap_shapefile_la_SOURCES = shapefile.c libmap_shapefile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ if HAVE_SYSTEM_SHAPEFILELIB libmap_shapefile_la_LIBADD = @SHAPEFILE_LIBS@ else libmap_shapefile_la_LIBADD = $(top_builddir)/navit/support/shapefile/libsupport_shapefile.la endif navit-0.5.0+dfsg.1/navit/map/shapefile/shapefile.c000066400000000000000000000470131264204753600216730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "transform.h" #include "file.h" #include "shapefil.h" #define IS_ARC(x) ((x).nSHPType == SHPT_ARC || (x).nSHPType == SHPT_ARCZ || (x).nSHPType == SHPT_ARCM) #define IS_POLYGON(x) ((x).nSHPType == SHPT_POLYGON || (x).nSHPType == SHPT_POLYGONZ || (x).nSHPType == SHPT_POLYGONM) struct map_priv { int id; char *filename; char *charset; SHPHandle hSHP; DBFHandle hDBF; int nShapeType, nEntities, nFields; double adfMinBound[4], adfMaxBound[4]; struct longest_match *lm; char *dbfmap_data; struct coord offset; enum projection pro; int flags; }; struct map_rect_priv { struct map_selection *sel; struct map_priv *m; struct item item; int idx; int cidx,cidx_rewind; int part,part_rewind; int aidx; enum attr_type anext; SHPObject *psShape; char *str; char *line; int attr_pos; struct attr *attr; }; static void map_destroy_shapefile(struct map_priv *m) { dbg(lvl_debug,"map_destroy_shapefile\n"); g_free(m); } static void shapefile_coord_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; mr->cidx=mr->cidx_rewind; mr->part=mr->part_rewind; } static void shapefile_coord(struct map_rect_priv *mr, int idx, struct coord *c) { SHPObject *psShape=mr->psShape; struct coord cs; struct coord_geo g; if (!mr->m->pro) { g.lng=psShape->padfX[idx]+mr->m->offset.x; g.lat=psShape->padfY[idx]+mr->m->offset.y; transform_from_geo(projection_mg, &g, c); } else { cs.x=psShape->padfX[idx]+mr->m->offset.x; cs.y=psShape->padfY[idx]+mr->m->offset.y; transform_from_to(&cs, mr->m->pro, c, projection_mg); } } static int shapefile_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; int ret=0; int idx; SHPObject *psShape=mr->psShape; while (count) { idx=mr->cidx; if (idx >= psShape->nVertices) break; if (mr->part+1 < psShape->nParts && idx == psShape->panPartStart[mr->part+1]) { if (IS_POLYGON(*psShape)) { mr->part++; shapefile_coord(mr, 0, c); } else if (IS_ARC(*psShape)) { break; } else { dbg_assert("Neither POLYGON or ARC and has parts" == NULL); } } else { shapefile_coord(mr, idx, c); mr->cidx++; } ret++; c++; count--; } return ret; } static void shapefile_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; mr->aidx=0; mr->attr_pos=0; if (mr->m->flags & 1) mr->anext=attr_none; else mr->anext=attr_debug; } struct longest_match_list_item { void *data; int match_idx_count; int *match_idx; }; struct longest_match_list { GList *longest_match_list_items; }; struct longest_match { GHashTable *match_hash; char *match_present; int match_present_count; GList *longest_match_lists; int longest_match_list_count; }; static void longest_match_add_match(struct longest_match *lm, struct longest_match_list_item *lmi, char *match) { int idx; if (!(idx=(int)(long)g_hash_table_lookup(lm->match_hash, match))) { idx=lm->match_present_count++; lm->match_present=g_renew(char, lm->match_present, lm->match_present_count); g_hash_table_insert(lm->match_hash, g_strdup(match), (gpointer)(long)idx); } lmi->match_idx=g_renew(int, lmi->match_idx, lmi->match_idx_count+1); lmi->match_idx[lmi->match_idx_count++]=idx; } static void longest_match_item_destroy(struct longest_match_list_item *lmi, long flags) { if (!lmi) return; if (flags & 2) { g_free(lmi->data); } g_free(lmi->match_idx); g_free(lmi); } static struct longest_match_list_item * longest_match_item_new(struct longest_match_list *lml, void *data) { struct longest_match_list_item *ret=g_new0(struct longest_match_list_item,1); lml->longest_match_list_items=g_list_append(lml->longest_match_list_items, ret); ret->data=data; return ret; } static struct longest_match_list * longest_match_list_new(struct longest_match *lm) { struct longest_match_list *ret=g_new0(struct longest_match_list,1); lm->longest_match_lists=g_list_append(lm->longest_match_lists, ret); return ret; } static void longest_match_list_destroy(struct longest_match_list *lml, long flags) { if (!lml) return; if (flags & 1) { g_list_foreach(lml->longest_match_list_items, (GFunc)longest_match_item_destroy, (gpointer)flags); g_list_free(lml->longest_match_list_items); } g_free(lml); } static struct longest_match_list * longest_match_get_list(struct longest_match *lm, int list) { GList *l=lm->longest_match_lists; while (l && list > 0) { l=g_list_next(l); list++; } if (l) return l->data; return NULL; } static struct longest_match * longest_match_new(void) { struct longest_match *ret=g_new0(struct longest_match,1); ret->match_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); ret->match_present_count=1; return ret; } static void longest_match_destroy(struct longest_match *lm, long flags) { if (!lm) return; if (flags & 1) { g_list_foreach(lm->longest_match_lists, (GFunc)longest_match_list_destroy, (gpointer)flags); g_list_free(lm->longest_match_lists); } g_hash_table_destroy(lm->match_hash); g_free(lm->match_present); g_free(lm); } static void longest_match_clear(struct longest_match *lm) { if (lm->match_present) memset(lm->match_present, 0, lm->match_present_count); } static void longest_match_add_key_value(struct longest_match *lm, char *k, char *v) { char* buffer=g_alloca(strlen(k)+strlen(v)+2); int idx; strcpy(buffer,"*=*"); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=1; sprintf(buffer,"%s=*", k); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=2; sprintf(buffer,"*=%s", v); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=2; sprintf(buffer,"%s=%s", k, v); if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) lm->match_present[idx]=4; } static int longest_match_list_find(struct longest_match *lm, struct longest_match_list *lml, void **list, int max_list_len) { int j,longest=0,ret=0,sum,val; struct longest_match_list_item *curr; GList *l=lml->longest_match_list_items; while (l) { sum=0; curr=l->data; for (j = 0 ; j < curr->match_idx_count ; j++) { val=lm->match_present[curr->match_idx[j]]; if (val) sum+=val; else { sum=-1; break; } } if (sum > longest) { longest=sum; ret=0; } if (sum > 0 && sum == longest && ret < max_list_len) list[ret++]=curr->data; l=g_list_next(l); } return ret; } static void build_match(struct longest_match *lm, struct longest_match_list *lml, char *line) { struct longest_match_list_item *lmli; char *kvl=NULL,*i=NULL,*p,*kv; dbg(lvl_debug,"line=%s\n",line); kvl=line; p=strchr(line,'\t'); if (p) { while (*p == '\t') *p++='\0'; i=p; } lmli=longest_match_item_new(lml,g_strdup(i)); while ((kv=strtok(kvl, ","))) { kvl=NULL; longest_match_add_match(lm, lmli, kv); } } static void build_matches(struct map_priv *m,char *matches) { char *matches2=g_strdup(matches); char *l=matches2,*p; struct longest_match_list *lml; m->lm=longest_match_new(); lml=longest_match_list_new(m->lm); while (l) { p=strchr(l,'\n'); if (p) *p++='\0'; if (strlen(l)) build_match(m->lm,lml,l); l=p; } g_free(matches2); } static void process_fields(struct map_priv *m, int id) { int i; char szTitle[12],*str; int nWidth, nDecimals; for (i = 0 ; i < m->nFields ; i++) { switch (DBFGetFieldInfo(m->hDBF, i, szTitle, &nWidth, &nDecimals )) { case FTString: str=g_strdup(DBFReadStringAttribute( m->hDBF, id, i )); break; case FTInteger: str=g_strdup_printf("%d",DBFReadIntegerAttribute( m->hDBF, id, i )); break; case FTDouble: str=g_strdup_printf("%lf",DBFReadDoubleAttribute( m->hDBF, id, i )); break; case FTInvalid: str=NULL; break; default: str=NULL; } longest_match_add_key_value(m->lm, szTitle, str); } } static int attr_resolve(struct map_rect_priv *mr, enum attr_type attr_type, struct attr *attr) { char name[1024]; char value[1024]; char szTitle[12]; const char *str; char *col,*type=NULL; int i,len, nWidth, nDecimals; if (!mr->line) return 0; if (attr_type != attr_any) type=attr_to_name(attr_type); if (attr_from_line(mr->line,type,&mr->attr_pos,value,name)) { len=strlen(value); if (value[0] == '$' && value[1] == '{' && value[len-1] == '}') { int found=0; value[len-1]='\0'; col=value+2; for (i = 0 ; i < mr->m->nFields ; i++) { if (DBFGetFieldInfo(mr->m->hDBF, i, szTitle, &nWidth, &nDecimals ) == FTString && !strcmp(szTitle,col)) { str=DBFReadStringAttribute( mr->m->hDBF, mr->item.id_hi, i); strcpy(value,str); found=1; break; } } if (!found) value[0]='\0'; } if (!value[0]) return -1; dbg(lvl_debug,"name=%s value=%s\n",name,value); attr_free(mr->attr); mr->attr=attr_new_from_text(name,value); if (mr->attr) { *attr=*mr->attr; return 1; } return -1; } return 0; } static int shapefile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; struct map_priv *m=mr->m; char szTitle[12],*pszTypeName, *str; int code, ret, nWidth, nDecimals; attr->type=attr_type; switch (attr_type) { case attr_any: while ((code=attr_resolve(mr, attr_type, attr))) { if (code == 1) return 1; } while (mr->anext != attr_none) { ret=shapefile_attr_get(priv_data, mr->anext, attr); if (ret) return ret; } return 0; case attr_debug: if (mr->aidx >= m->nFields) { mr->anext=attr_none; return 0; } switch (DBFGetFieldInfo(m->hDBF, mr->aidx, szTitle, &nWidth, &nDecimals )) { case FTString: pszTypeName = "String"; str=g_strdup(DBFReadStringAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); break; case FTInteger: pszTypeName = "Integer"; str=g_strdup_printf("%d",DBFReadIntegerAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); break; case FTDouble: pszTypeName = "Double"; str=g_strdup_printf("%lf",DBFReadDoubleAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); break; case FTInvalid: pszTypeName = "Invalid"; str=NULL; break; default: pszTypeName = "Unknown"; str=NULL; } g_free(mr->str); mr->str=attr->u.str=g_strdup_printf("%s=%s(%s)",szTitle,str,pszTypeName); g_free(str); mr->aidx++; return 1; default: return (attr_resolve(mr, attr_type, attr) == 1); } } static struct item_methods methods_shapefile = { shapefile_coord_rewind, shapefile_coord_get, shapefile_attr_rewind, shapefile_attr_get, }; static struct map_rect_priv * map_rect_new_shapefile(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; char *dbfmapfile=g_strdup_printf("%s.dbfmap", map->filename); void *data; struct file *file; int size; int changed=0; if ((file=file_create(dbfmapfile, 0))) { size=file_size(file); data=file_data_read_all(file); if (data) { if (!map->dbfmap_data || size != strlen(map->dbfmap_data) || strncmp(data,map->dbfmap_data,size)) { g_free(map->dbfmap_data); map->dbfmap_data=g_malloc(size+1); memcpy(map->dbfmap_data, data, size); map->dbfmap_data[size]='\0'; changed=1; } file_data_free(file, data); } file_destroy(file); } else { dbg(lvl_error,"Failed to open %s\n",dbfmapfile); if (map->dbfmap_data) { changed=1; g_free(map->dbfmap_data); map->dbfmap_data=NULL; } } dbg(lvl_debug,"%s changed %d old %p\n",dbfmapfile,changed,map->dbfmap_data); if (changed) { longest_match_destroy(map->lm,1); map->lm=NULL; if (map->dbfmap_data) { build_matches(map,map->dbfmap_data); } } dbg(lvl_debug,"map_rect_new_shapefile\n"); mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->idx=0; mr->item.id_lo=0; mr->item.id_hi=0; mr->item.meth=&methods_shapefile; mr->item.priv_data=mr; g_free(dbfmapfile); return mr; } static void map_rect_destroy_shapefile(struct map_rect_priv *mr) { if (mr->psShape) SHPDestroyObject(mr->psShape); attr_free(mr->attr); g_free(mr->str); g_free(mr); } static struct item * map_rect_get_item_shapefile(struct map_rect_priv *mr) { struct map_priv *m=mr->m; void *lines[5]; struct longest_match_list *lml; int count; char type[1024]; if (mr->psShape && IS_ARC(*mr->psShape) && mr->part+1 < mr->psShape->nParts) { mr->part++; mr->part_rewind=mr->part; mr->cidx_rewind=mr->psShape->panPartStart[mr->part]; } else { if (mr->idx >= m->nEntities) return NULL; mr->item.id_hi=mr->idx; if (mr->psShape) SHPDestroyObject(mr->psShape); mr->psShape=SHPReadObject(m->hSHP, mr->idx); if (mr->psShape->nVertices > 1) mr->item.type=type_street_unkn; else mr->item.type=type_point_unkn; if (m->lm) { longest_match_clear(m->lm); process_fields(m, mr->idx); lml=longest_match_get_list(m->lm, 0); count=longest_match_list_find(m->lm, lml, lines, sizeof(lines)/sizeof(void *)); if (count) { mr->line=lines[0]; if (attr_from_line(mr->line,"type",NULL,type,NULL)) { dbg(lvl_debug,"type='%s'\n", type); mr->item.type=item_from_name(type); if (mr->item.type == type_none && strcmp(type,"none")) dbg(lvl_error,"Warning: type '%s' unknown\n", type); } else { dbg(lvl_debug,"failed to get attribute type\n"); } } else mr->line=NULL; } mr->idx++; mr->part_rewind=0; mr->cidx_rewind=0; } shapefile_coord_rewind(mr); shapefile_attr_rewind(mr); return &mr->item; } static struct item * map_rect_get_item_byid_shapefile(struct map_rect_priv *mr, int id_hi, int id_lo) { mr->idx=id_hi; while (id_lo--) { if (!map_rect_get_item_shapefile(mr)) return NULL; } return map_rect_get_item_shapefile(mr); } static struct map_methods map_methods_shapefile = { projection_mg, "iso8859-1", map_destroy_shapefile, map_rect_new_shapefile, map_rect_destroy_shapefile, map_rect_get_item_shapefile, map_rect_get_item_byid_shapefile, }; static struct map_priv * map_new_shapefile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); struct attr *charset=attr_search(attrs, NULL, attr_charset); struct attr *projectionname=attr_search(attrs, NULL, attr_projectionname); struct attr *flags=attr_search(attrs, NULL, attr_flags); struct file_wordexp *wexp; char *wdata; char **wexp_data; char *shapefile,*dbffile; if (! data) return NULL; dbg(lvl_debug,"map_new_shapefile %s\n", data->u.str); wdata=g_strdup(data->u.str); wexp=file_wordexp_new(wdata); wexp_data=file_wordexp_get_array(wexp); *meth=map_methods_shapefile; m=g_new0(struct map_priv, 1); m->filename=g_strdup(wexp_data[0]); shapefile=g_strdup_printf("%s.shp", m->filename); m->hSHP=SHPOpen(shapefile, "rb" ); SHPGetInfo( m->hSHP, &m->nEntities, &m->nShapeType, m->adfMinBound, m->adfMaxBound ); g_free(shapefile); dbffile=g_strdup_printf("%s.dbf", m->filename); m->hDBF=DBFOpen(dbffile, "rb"); m->nFields=DBFGetFieldCount(m->hDBF); g_free(dbffile); dbg(lvl_debug,"map_new_shapefile %s %s\n", m->filename, wdata); if (charset) { m->charset=g_strdup(charset->u.str); meth->charset=m->charset; } if (projectionname) m->pro=projection_from_name(projectionname->u.str, &m->offset); if (flags) m->flags=flags->u.num; file_wordexp_destroy(wexp); return m; } void plugin_init(void) { dbg(lvl_debug,"shapefile: plugin_init\n"); plugin_register_map_type("shapefile", map_new_shapefile); } /************************************************************************/ /* VSI_SHP_Open() */ /************************************************************************/ static SAFile VSI_SHP_Open( const char *pszFilename, const char *pszAccess ) { return (SAFile)fopen(pszFilename, pszAccess); } /************************************************************************/ /* VSI_SHP_Read() */ /************************************************************************/ static SAOffset VSI_SHP_Read( void *p, SAOffset size, SAOffset nmemb, SAFile file ) { return fread(p, size, nmemb, (FILE *)file); } /************************************************************************/ /* VSI_SHP_Write() */ /************************************************************************/ static SAOffset VSI_SHP_Write( void *p, SAOffset size, SAOffset nmemb, SAFile file ) { return fwrite(p, size, nmemb, (FILE *)file); } /************************************************************************/ /* VSI_SHP_Seek() */ /************************************************************************/ static SAOffset VSI_SHP_Seek( SAFile file, SAOffset offset, int whence ) { return fseek((FILE *)file, offset, whence); } /************************************************************************/ /* VSI_SHP_Tell() */ /************************************************************************/ static SAOffset VSI_SHP_Tell( SAFile file ) { return ftell((FILE *)file); } static int VSI_SHP_Flush( SAFile file ) { return fflush((FILE *)file); } /************************************************************************/ /* VSI_SHP_Close() */ /************************************************************************/ static int VSI_SHP_Close( SAFile file ) { return fclose((FILE *)file); } /************************************************************************/ /* SADError() */ /************************************************************************/ static void VSI_SHP_Error( const char *message ) { dbg(lvl_error,"error:%s\n", message); } /************************************************************************/ /* VSI_SHP_Remove() */ /************************************************************************/ static int VSI_SHP_Remove( const char *pszFilename ) { return unlink(pszFilename); } /************************************************************************/ /* SASetupDefaultHooks() */ /************************************************************************/ void SASetupDefaultHooks( SAHooks *psHooks ) { psHooks->FOpen = VSI_SHP_Open; psHooks->FRead = VSI_SHP_Read; psHooks->FWrite = VSI_SHP_Write; psHooks->FSeek = VSI_SHP_Seek; psHooks->FTell = VSI_SHP_Tell; psHooks->FFlush = VSI_SHP_Flush; psHooks->FClose = VSI_SHP_Close; psHooks->Remove = VSI_SHP_Remove; psHooks->Atof = atof; psHooks->Error = VSI_SHP_Error; } navit-0.5.0+dfsg.1/navit/map/textfile/000077500000000000000000000000001264204753600174465ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/map/textfile/CMakeLists.txt000066400000000000000000000000541264204753600222050ustar00rootroot00000000000000module_add_library(map_textfile textfile.c) navit-0.5.0+dfsg.1/navit/map/textfile/Makefile.am000066400000000000000000000005271264204753600215060ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_textfile if PLUGINS modulemap_LTLIBRARIES = libmap_textfile.la else noinst_LTLIBRARIES = libmap_textfile.la endif libmap_textfile_la_SOURCES = textfile.c textfile.h libmap_textfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/map/textfile/textfile.c000066400000000000000000000221611264204753600214400ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "config.h" #include "debug.h" #include "plugin.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" #include "attr.h" #include "transform.h" #include "file.h" #include "textfile.h" static int map_id; static void remove_comment_line(char* line){ if (line[0]==TEXTFILE_COMMENT_CHAR){ line='\0'; } } static void get_line(struct map_rect_priv *mr) { if(mr->f) { if (!mr->m->is_pipe) mr->pos=ftell(mr->f); else mr->pos+=mr->lastlen; fgets(mr->line, TEXTFILE_LINE_SIZE, mr->f); dbg(lvl_debug,"read textfile line: %s\n", mr->line); remove_comment_line(mr->line); mr->lastlen=strlen(mr->line)+1; if (strlen(mr->line) >= TEXTFILE_LINE_SIZE-1) dbg(lvl_error, "line too long: %s\n", mr->line); } } static void map_destroy_textfile(struct map_priv *m) { g_free(m->filename); if(m->charset) { g_free(m->charset); } g_free(m); } static void textfile_coord_rewind(void *priv_data) { } static int parse_line(struct map_rect_priv *mr, int attr) { int pos; pos=coord_parse(mr->line, projection_mg, &mr->c); if (pos < strlen(mr->line) && attr) { strcpy(mr->attrs, mr->line+pos); } return pos; } static int textfile_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; int ret=0; dbg(lvl_warning,"enter, count: %d\n",count); while (count--) { if (mr->f && !feof(mr->f) && (!mr->item.id_hi || !mr->eoc) && parse_line(mr, mr->item.id_hi)) { if (c){ *c=mr->c; dbg(lvl_debug,"c=0x%x,0x%x\n", c->x, c->y); c++; } ret++; get_line(mr); if (mr->item.id_hi) mr->eoc=1; } else { mr->more=0; break; } } return ret; } static void textfile_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; mr->attr_pos=0; mr->attr_last=attr_none; } static void textfile_encode_attr(char *attr_val, enum attr_type attr_type, struct attr *attr) { if (attr_type >= attr_type_int_begin && attr_type <= attr_type_int_end) attr->u.num=atoi(attr_val); else attr->u.str=attr_val; } static int textfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; char *str=NULL; dbg(lvl_debug,"mr=%p attrs='%s' ", mr, mr->attrs); if (attr_type != mr->attr_last) { dbg(lvl_debug,"reset attr_pos\n"); mr->attr_pos=0; mr->attr_last=attr_type; } if (attr_type == attr_any) { dbg(lvl_debug,"attr_any"); if (attr_from_line(mr->attrs,NULL,&mr->attr_pos,mr->attr, mr->attr_name)) { attr_type=attr_from_name(mr->attr_name); dbg(lvl_debug,"found attr '%s' 0x%x\n", mr->attr_name, attr_type); attr->type=attr_type; textfile_encode_attr(mr->attr, attr_type, attr); return 1; } } else { str=attr_to_name(attr_type); dbg(lvl_debug,"attr='%s' ",str); if (attr_from_line(mr->attrs,str,&mr->attr_pos,mr->attr, NULL)) { textfile_encode_attr(mr->attr, attr_type, attr); dbg(lvl_debug,"found\n"); return 1; } } dbg(lvl_debug,"not found\n"); return 0; } static struct item_methods methods_textfile = { textfile_coord_rewind, textfile_coord_get, textfile_attr_rewind, textfile_attr_get, }; static struct map_rect_priv * map_rect_new_textfile(struct map_priv *map, struct map_selection *sel) { struct map_rect_priv *mr; dbg(lvl_debug,"enter\n"); mr=g_new0(struct map_rect_priv, 1); mr->m=map; mr->sel=sel; if (map->flags & 1) mr->item.id_hi=1; else mr->item.id_hi=0; mr->item.id_lo=0; mr->item.meth=&methods_textfile; mr->item.priv_data=mr; if (map->is_pipe) { #ifdef HAVE_POPEN char *oargs,*args=g_strdup(map->filename),*sep=" "; enum layer_type lay; g_free(mr->args); while (sel) { oargs=args; args=g_strdup_printf("%s 0x%x 0x%x 0x%x 0x%x", oargs, sel->u.c_rect.lu.x, sel->u.c_rect.lu.y, sel->u.c_rect.rl.x, sel->u.c_rect.rl.y); g_free(oargs); for (lay=layer_town ; lay < layer_end ; lay++) { oargs=args; args=g_strdup_printf("%s%s%d", oargs, sep, sel->order); g_free(oargs); sep=","; } sel=sel->next; } dbg(lvl_debug,"popen args %s\n", args); mr->args=args; mr->f=popen(mr->args, "r"); mr->pos=0; mr->lastlen=0; #else dbg(lvl_error,"unable to work with pipes %s\n",map->filename); #endif } else { mr->f=fopen(map->filename, "r"); } if(!mr->f) { if (!(errno == ENOENT && map->no_warning_if_map_file_missing)) { dbg(lvl_error, "error opening textfile %s: %s\n", map->filename, strerror(errno)); } } get_line(mr); return mr; } static void map_rect_destroy_textfile(struct map_rect_priv *mr) { if (mr->f) { if (mr->m->is_pipe) { #ifdef HAVE_POPEN pclose(mr->f); #endif } else { fclose(mr->f); } } g_free(mr); } static struct item * map_rect_get_item_textfile(struct map_rect_priv *mr) { char *p,type[TEXTFILE_LINE_SIZE]; dbg(lvl_debug,"map_rect_get_item_textfile id_hi=%d line=%s", mr->item.id_hi, mr->line); if (!mr->f) { return NULL; } while (mr->more) { struct coord c; textfile_coord_get(mr, &c, 1); } for(;;) { if (feof(mr->f)) { dbg(lvl_debug,"map_rect_get_item_textfile: eof %d\n",mr->item.id_hi); if (mr->m->flags & 1) { if (!mr->item.id_hi) return NULL; mr->item.id_hi=0; } else { if (mr->item.id_hi) return NULL; mr->item.id_hi=1; } if (mr->m->is_pipe) { #ifdef HAVE_POPEN pclose(mr->f); mr->f=popen(mr->args, "r"); mr->pos=0; mr->lastlen=0; #endif } else { fseek(mr->f, 0, SEEK_SET); clearerr(mr->f); } get_line(mr); } if ((p=strchr(mr->line,'\n'))) *p='\0'; if (mr->item.id_hi) { mr->attrs[0]='\0'; if (!parse_line(mr, 1)) { get_line(mr); continue; } dbg(lvl_debug,"map_rect_get_item_textfile: point found\n"); mr->eoc=0; mr->item.id_lo=mr->pos; } else { if (parse_line(mr, 1)) { get_line(mr); continue; } dbg(lvl_debug,"map_rect_get_item_textfile: line found\n"); if (! mr->line[0]) { get_line(mr); continue; } mr->item.id_lo=mr->pos; strcpy(mr->attrs, mr->line); get_line(mr); dbg(lvl_debug,"mr=%p attrs=%s\n", mr, mr->attrs); } dbg(lvl_debug,"get_attrs %s\n", mr->attrs); if (attr_from_line(mr->attrs,"type",NULL,type,NULL)) { dbg(lvl_debug,"type='%s'\n", type); mr->item.type=item_from_name(type); if (mr->item.type == type_none) dbg(lvl_error, "Warning: type '%s' unknown\n", type); } else { get_line(mr); continue; } mr->attr_last=attr_none; mr->more=1; dbg(lvl_debug,"return attr='%s'\n", mr->attrs); return &mr->item; } } static struct item * map_rect_get_item_byid_textfile(struct map_rect_priv *mr, int id_hi, int id_lo) { if (mr->m->is_pipe) { #ifndef _MSC_VER pclose(mr->f); mr->f=popen(mr->args, "r"); mr->pos=0; mr->lastlen=0; #endif /* _MSC_VER */ } else fseek(mr->f, id_lo, SEEK_SET); get_line(mr); mr->item.id_hi=id_hi; return map_rect_get_item_textfile(mr); } static struct map_methods map_methods_textfile = { projection_mg, "utf-8", map_destroy_textfile, map_rect_new_textfile, map_rect_destroy_textfile, map_rect_get_item_textfile, map_rect_get_item_byid_textfile, }; static struct map_priv * map_new_textfile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *m; struct attr *data=attr_search(attrs, NULL, attr_data); struct attr *charset=attr_search(attrs, NULL, attr_charset); struct attr *flags=attr_search(attrs, NULL, attr_flags); struct attr *no_warn=attr_search(attrs, NULL, attr_no_warning_if_map_file_missing); struct file_wordexp *wexp; int len,is_pipe=0; char *wdata; char **wexp_data; if (! data) return NULL; dbg(lvl_debug,"map_new_textfile %s\n", data->u.str); wdata=g_strdup(data->u.str); len=strlen(wdata); if (len && wdata[len-1] == '|') { wdata[len-1]='\0'; is_pipe=1; } wexp=file_wordexp_new(wdata); wexp_data=file_wordexp_get_array(wexp); *meth=map_methods_textfile; m=g_new0(struct map_priv, 1); m->id=++map_id; m->filename=g_strdup(wexp_data[0]); m->is_pipe=is_pipe; m->no_warning_if_map_file_missing=(no_warn!=NULL) && (no_warn->u.num); if (flags) m->flags=flags->u.num; dbg(lvl_debug,"map_new_textfile %s %s\n", m->filename, wdata); if (charset) { m->charset=g_strdup(charset->u.str); meth->charset=m->charset; } file_wordexp_destroy(wexp); g_free(wdata); return m; } void plugin_init(void) { dbg(lvl_debug,"textfile: plugin_init\n"); plugin_register_map_type("textfile", map_new_textfile); } navit-0.5.0+dfsg.1/navit/map/textfile/textfile.h000066400000000000000000000025131264204753600214440ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "attr.h" #include "coord.h" #define TEXTFILE_COMMENT_CHAR '#' struct map_priv { int id; char *filename; char *charset; int is_pipe; int no_warning_if_map_file_missing; int flags; }; #define TEXTFILE_LINE_SIZE 512 struct map_rect_priv { struct map_selection *sel; FILE *f; long pos; char line[TEXTFILE_LINE_SIZE]; int attr_pos; enum attr_type attr_last; char attrs[TEXTFILE_LINE_SIZE]; char attr[TEXTFILE_LINE_SIZE]; char attr_name[TEXTFILE_LINE_SIZE]; struct coord c; int eoc; int more; struct map_priv *m; struct item item; char *args; int lastlen; }; navit-0.5.0+dfsg.1/navit/map_data.h000066400000000000000000000026361264204753600167730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAP_DATA_H #define NAVIT_MAP_DATA_H enum file_index { file_border_ply=0, file_bridge_ply, file_height_ply, file_other_ply, file_rail_ply, file_sea_ply, file_street_bti, file_street_str, file_strname_stn, file_town_twn, file_tunnel_ply, file_water_ply, file_woodland_ply, file_end }; struct map_data { struct file *file[file_end]; struct map_data *next; }; struct map_data *load_maps(char *map); struct transformation; struct block_info; void map_data_foreach(struct map_data *mdata, int file, struct transformation *t, int limit, void(*func)(struct block_info *, unsigned char *, unsigned char *, void *), void *data); #endif navit-0.5.0+dfsg.1/navit/maps.c000066400000000000000000000052211264204753600161510ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2012 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "debug.h" #include "file.h" #include "map.h" #include "mapset.h" #include "xmlconfig.h" struct maps; struct maps * maps_new(struct attr *parent, struct attr **attrs) { struct attr *data,**attrs_dup; if (!parent) { dbg(lvl_error,"No parent\n"); return NULL; } if (parent->type != attr_mapset) { dbg(lvl_error,"Parent must be mapset\n"); return NULL; } dbg(lvl_debug,"enter\n"); attrs_dup=attr_list_dup(attrs); data=attr_search(attrs_dup, NULL, attr_data); if (data) { struct file_wordexp *wexp=file_wordexp_new(data->u.str); int i,count=file_wordexp_get_count(wexp); char **array=file_wordexp_get_array(wexp); struct attr *name; struct attr *name_provided = attr_search(attrs_dup, NULL, attr_name); // if no name was provided, fill the name with the location if (!name_provided) { struct attr name_tmp; name_tmp.type = attr_name; name_tmp.u.str="NULL"; attrs_dup=attr_generic_add_attr(attrs_dup, &name_tmp); name = attr_search(attrs_dup, NULL, attr_name); } for (i = 0 ; i < count ; i++) { struct attr map; g_free(data->u.str); data->u.str=g_strdup(array[i]); if (!name_provided) { g_free(name->u.str); name->u.str=g_strdup(array[i]); } map.type=attr_map; map.u.map=map_new(parent, attrs_dup); if (map.u.map) { mapset_add_attr(parent->u.mapset, &map); navit_object_unref(map.u.navit_object); } } file_wordexp_destroy(wexp); } else { dbg(lvl_error,"no data attribute\n"); } attr_list_free(attrs_dup); return NULL; } struct object_func maps_func = { attr_maps, (object_func_new)maps_new, (object_func_get_attr)NULL, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)NULL, (object_func_add_attr)NULL, (object_func_remove_attr)NULL, (object_func_init)NULL, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)NULL, (object_func_unref)NULL, }; navit-0.5.0+dfsg.1/navit/maps/000077500000000000000000000000001264204753600160055ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/maps/CMakeLists.txt000066400000000000000000000035151264204753600205510ustar00rootroot00000000000000if(SAMPLE_MAP) set(SAMPLE_MAP_NAME osm_bbox_11.3,47.9,11.7,48.2) set(maptool_args "--attr-debug-level=5") GET_TARGET_PROPERTY(MAPTOOL_PATH maptool LOCATION) add_custom_target(sample_map ALL DEPENDS ${SAMPLE_MAP_NAME}.xml) add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.xml COMMAND ${CMAKE_COMMAND} -D TYPE=binfile -D DATA=${SAMPLE_MAP_NAME}.bin -D DST=${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.xml -P ${PROJECT_SOURCE_DIR}/cmake/navit_writemapxml.cmake VERBATIM DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin ) if(DOWNLOAD_SAMPLE_MAP) add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin COMMAND ${CMAKE_COMMAND} -D URL=http://www.navit-project.org/maps/${SAMPLE_MAP_NAME}.bin -D DST=${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin -P ${PROJECT_SOURCE_DIR}/cmake/navit_download.cmake VERBATIM ) else() add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin COMMAND bzcat ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 | ${MAPTOOL_PATH} ${maptool_args} ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin VERBATIM DEPENDS maptool ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 ) add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 COMMAND ${CMAKE_COMMAND} -D URL=http://www.navit-project.org/maps/${SAMPLE_MAP_NAME}.osm.bz2 -D DST=${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.osm.bz2 -P ${PROJECT_SOURCE_DIR}/cmake/navit_download.cmake VERBATIM ) endif() install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_MAP_NAME}.bin DESTINATION ${SHARE_DIR}/maps PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) endif() navit-0.5.0+dfsg.1/navit/maps/Makefile.am000066400000000000000000000024321264204753600200420ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc .SECONDARY: SAMPLE_MAP=osm_bbox_11.3,47.9,11.7,48.2 maptool_args=--attr-debug-level=5 maptool=$(top_builddir)/navit/maptool/maptool maps_DATA = $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml SUFFIXES=.osm.bz2 .osm.pbf .txt .shp .osm samplemap: $(SAMPLE_MAP).bin .osm.bin: echo "Converting osm map" $(maptool) $(maptool_args) $@.tmp <$< mv $@.tmp $@ .txt.bin: $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/textfile/libmap_textfile.la -m "type=textfile data="$< mv $@.tmp $@ .shp.bin: $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/shapefile/libmap_shapefile.la -m "type=shapefile data=$(subst .shp,,$<) $(SHAPEFILE_ATTRIBUTES)" mv $@.tmp $@ .osm.bz2.bin: echo "Converting osm map" bzcat $< | $(maptool) $(maptool_args) $@.tmp mv $@.tmp $@ .osm.pbf.bin: echo "Converting osm map" $(maptool) --protobuf $(maptool_args) $@.tmp <$< mv $@.tmp $@ .bin.xml: echo '' >$@ $(SAMPLE_MAP).osm.bz2: echo "Downloading osm sample map" wget -O $(SAMPLE_MAP).osm.bz2.tmp http://www.navit-project.org/maps/$(SAMPLE_MAP).osm.bz2 mv $(SAMPLE_MAP).osm.bz2.tmp $(SAMPLE_MAP).osm.bz2 distclean-local: rm -f $(SAMPLE_MAP).osm.bz2 $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml all: navit-0.5.0+dfsg.1/navit/mapset.c000066400000000000000000000244041264204753600165060ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains code used for loading more than one map * * The code in this file introduces "mapsets", which are collections of several maps. * This enables navit to operate on more than one map at once. See map.c / map.h to learn * how maps are handled. */ #include #include #include #include "debug.h" #include "item.h" #include "mapset.h" #include "projection.h" #include "map.h" #include "xmlconfig.h" /** * @brief A mapset * * This structure holds a complete mapset */ struct mapset { NAVIT_OBJECT GList *maps; /**< Linked list of all the maps in the mapset */ }; struct attr_iter { GList *last; }; /** * @brief Creates a new, empty mapset * * @return The new mapset */ struct mapset *mapset_new(struct attr *parent, struct attr **attrs) { struct mapset *ms; ms=g_new0(struct mapset, 1); ms->func=&mapset_func; navit_object_ref((struct navit_object *)ms); ms->attrs=attr_list_dup(attrs); return ms; } struct mapset *mapset_dup(struct mapset *ms) { struct mapset *ret=mapset_new(NULL, ms->attrs); ret->maps=g_list_copy(ms->maps); return ret; } struct attr_iter * mapset_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void mapset_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } /** * @brief Adds a map to a mapset * * @param ms The mapset to add the map to * @param m The map to be added */ int mapset_add_attr(struct mapset *ms, struct attr *attr) { switch (attr->type) { case attr_map: ms->attrs=attr_generic_add_attr(ms->attrs,attr); ms->maps=g_list_append(ms->maps, attr->u.map); return 1; default: return 0; } } int mapset_remove_attr(struct mapset *ms, struct attr *attr) { switch (attr->type) { case attr_map: ms->attrs=attr_generic_remove_attr(ms->attrs,attr); ms->maps=g_list_remove(ms->maps, attr->u.map); return 1; default: return 0; } } int mapset_get_attr(struct mapset *ms, enum attr_type type, struct attr *attr, struct attr_iter *iter) { GList *map; map=ms->maps; attr->type=type; switch (type) { case attr_map: while (map) { if (!iter || iter->last == g_list_previous(map)) { attr->u.map=map->data; if (iter) iter->last=map; return 1; } map=g_list_next(map); } break; default: break; } return 0; } /** * @brief Destroys a mapset. * * This destroys a mapset. Please note that it does not touch the contained maps * in any way. * * @param ms The mapset to be destroyed */ void mapset_destroy(struct mapset *ms) { g_list_free(ms->maps); attr_list_free(ms->attrs); g_free(ms); } /** * @brief Handle for a mapset in use * * This struct is used for a mapset that is in use. With this it is possible to iterate * all maps in a mapset. */ struct mapset_handle { GList *l; /**< Pointer to the current (next) map */ }; /** * @brief Returns a new handle for a mapset * * This returns a new handle for an existing mapset. The new handle points to the first * map in the set. * * @param ms The mapset to get a handle of * @return The new mapset handle */ struct mapset_handle * mapset_open(struct mapset *ms) { struct mapset_handle *ret=NULL; if(ms) { ret=g_new(struct mapset_handle, 1); ret->l=ms->maps; } return ret; } /** * @brief Gets the next map from a mapset handle * * If you set active to true, this function will not return any maps that * have the attr_active attribute associated with them and set to false. * * @param msh The mapset handle to get the next map of * @param active Set to true to only get active maps (See description) * @return The next map */ struct map * mapset_next(struct mapset_handle *msh, int active) { struct map *ret; struct attr active_attr; for (;;) { if (!msh || !msh->l) return NULL; ret=msh->l->data; msh->l=g_list_next(msh->l); if (!active) return ret; if (active == 2 && map_get_attr(ret, attr_route_active, &active_attr, NULL)) { if (active_attr.u.num) return ret; else continue; } if (active == 3 && map_get_attr(ret, attr_search_active, &active_attr, NULL)) { if (active_attr.u.num) return ret; else continue; } if (!map_get_attr(ret, attr_active, &active_attr, NULL)) return ret; if (active_attr.u.num) return ret; } } /** * @brief Gets a map from the mapset by name * * @param ms The map * @param map_name the map name used by the search * @return The next map */ struct map * mapset_get_map_by_name(struct mapset *ms, const char*map_name) { struct mapset_handle*msh; struct map*curr_map; struct attr map_attr; if( !ms || !map_name ) { return NULL; } msh=mapset_open(ms); while ((curr_map=mapset_next(msh, 1))) { //get map name if(map_get_attr(curr_map,attr_name, &map_attr,NULL)) { if( ! strcmp(map_attr.u.str, map_name)) { break; } } } mapset_close(msh); return curr_map; } /** * @brief Closes a mapset handle after it is no longer used * * @param msh Mapset handle to be closed */ void mapset_close(struct mapset_handle *msh) { g_free(msh); } /** * @brief Holds information about a search in a mapset * * This struct holds information about a search (e.g. for a street) in a mapset. * * @sa For a more detailed description see the documentation of mapset_search_new(). */ struct mapset_search { GList *map; /**< The list of maps to be searched within */ struct map_search *ms; /**< A map search struct for the map currently active */ struct item *item; /**< "Superior" item. */ struct attr *search_attr; /**< Attribute to be searched for. */ int partial; /**< Indicates if one would like to have partial matches */ struct mapset *mapset; /**< reference to current mapset. Set to NULL when all maps are searched */ }; /** * @brief Starts a search on a mapset * * This function starts a search on a mapset. What attributes one can search for depends on the * map plugin. See the description of map_search_new() in map.c for details. * * If you enable partial matches bear in mind that the search matches only the begin of the * strings - a search for a street named "street" would match to "streetfoo", but not to * "somestreet". Search is case insensitive. * * The item passed to this function specifies a "superior item" to "search within" - e.g. a town * in which we want to search for a street, or a country in which to search for a town. * * @param ms The mapset that should be searched * @param item Specifies a superior item to "search within" (see description) * @param search_attr Attribute specifying what to search for. See description. * @param partial Set this to true to also have partial matches. See description. * @return A new mapset search struct for this search */ struct mapset_search * mapset_search_new(struct mapset *ms, struct item *item, struct attr *search_attr, int partial) { struct mapset_search *this; dbg(lvl_debug,"enter(%p,%p,%p,%d)\n", ms, item, search_attr, partial); this=g_new0(struct mapset_search,1); if(this != NULL && ms!=NULL ) { this->mapset=ms; this->item=item; this->search_attr=search_attr; this->partial=partial; return this; } else { return NULL; } } /** * @brief Returns the next found item from a mapset search * * This function returns the next item from a mapset search or NULL if there are no more items found. * It automatically iterates through all the maps in the mapset. Please note that maps which have the * attr_active attribute associated with them and set to false are not searched. * * @param this The mapset search to return an item from * @return The next found item or NULL if there are no more items found */ struct item * mapset_search_get_item(struct mapset_search *this_) { struct item *ret=NULL; struct attr active_attr; int country_search=this_->search_attr->type >= attr_country_all && this_->search_attr->type <= attr_country_name; while ((this_) && (this_->mapset) && (!this_->ms || !(ret=map_search_get_item(this_->ms)))) { /* The current map has no more items to be returned */ /* Use only the first map from the mapset to search for country codes. */ if (this_->map && country_search) break; for (;;) { if (!this_->map) this_->map=this_->mapset->maps; else this_->map=g_list_next(this_->map); if (!this_->map) { /* No more maps left, mark this mapset_search as finished */ this_->mapset=NULL; break; } /* Any map can be used for country search, regardless of it's attr_active value */ if(country_search) break; if (map_get_attr(this_->map->data, attr_search_active, &active_attr, NULL)) { if (!active_attr.u.num) continue; } if (!map_get_attr(this_->map->data, attr_active, &active_attr, NULL)) break; if (active_attr.u.num) break; } if(this_->ms) { map_search_destroy(this_->ms); this_->ms=NULL; } if (! this_->map) break; this_->ms=map_search_new(this_->map->data, this_->item, this_->search_attr, this_->partial); } return ret; } /** * @brief Destroys a mapset search * * @param this The mapset search to be destroyed */ void mapset_search_destroy(struct mapset_search *this_) { if (this_) { map_search_destroy(this_->ms); g_free(this_); } } struct object_func mapset_func = { attr_mapset, (object_func_new)mapset_new, (object_func_get_attr)mapset_get_attr, (object_func_iter_new)mapset_attr_iter_new, (object_func_iter_destroy)mapset_attr_iter_destroy, (object_func_set_attr)NULL, (object_func_add_attr)mapset_add_attr, (object_func_remove_attr)mapset_remove_attr, (object_func_init)NULL, (object_func_destroy)mapset_destroy, (object_func_dup)mapset_dup, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/mapset.h000066400000000000000000000040751264204753600165150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAPSET_H #define NAVIT_MAPSET_H #ifdef __cplusplus extern "C" { #endif /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct item; struct map; struct mapset; struct mapset_handle; struct mapset_search; struct mapset *mapset_new(struct attr *parent, struct attr **attrs); struct mapset *mapset_dup(struct mapset *ms); struct attr_iter *mapset_attr_iter_new(void); void mapset_attr_iter_destroy(struct attr_iter *iter); int mapset_add_attr(struct mapset *ms, struct attr *attr); int mapset_remove_attr(struct mapset *ms, struct attr *attr); int mapset_get_attr(struct mapset *ms, enum attr_type type, struct attr *attr, struct attr_iter *iter); void mapset_destroy(struct mapset *ms); struct map *mapset_get_map_by_name(struct mapset *ms, const char*map_name); struct mapset_handle *mapset_open(struct mapset *ms); struct map *mapset_next(struct mapset_handle *msh, int active); void mapset_close(struct mapset_handle *msh); struct mapset_search *mapset_search_new(struct mapset *ms, struct item *item, struct attr *search_attr, int partial); struct item *mapset_search_get_item(struct mapset_search *this_); void mapset_search_destroy(struct mapset_search *this_); struct mapset * mapset_ref(struct mapset* m); void mapset_unref(struct mapset *m); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/maptool/000077500000000000000000000000001264204753600165205ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/maptool/CMakeLists.txt000066400000000000000000000016421264204753600212630ustar00rootroot00000000000000 if(BUILD_MAPTOOL) add_definitions( -DMODULE=maptool ${NAVIT_COMPILE_FLAGS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) SET(MAPTOOL_SOURCE boundaries.c buffer.c ch.c coastline.c itembin.c itembin_buffer.c misc.c osm.c osm_o5m.c osm_relations.c sourcesink.c tempfile.c tile.c zip.c osm_xml.c) if(NOT MSVC) SET(MAPTOOL_SOURCE ${MAPTOOL_SOURCE} osm_protobuf.c osm_protobufdb.c generated-code/fileformat.pb-c.c generated-code/osmformat.pb-c.c google/protobuf-c/protobuf-c.c) endif(NOT MSVC) add_library (maptool_core ${MAPTOOL_SOURCE}) add_executable (maptool maptool.c) if(NOT MSVC) SET(NAVIT_LIBS ${NAVIT_LIBS} m) endif(NOT MSVC) target_link_libraries(maptool maptool_core ${NAVIT_LIBNAME} ${NAVIT_LIBS}) install(TARGETS maptool DESTINATION ${BIN_DIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) endif() navit-0.5.0+dfsg.1/navit/maptool/Makefile.am000066400000000000000000000015351264204753600205600ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc if !SUPPORT_ANDROID bin_PROGRAMS = maptool noinst_LTLIBRARIES = libmaptool.la endif AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit @ZLIB_CFLAGS@ @POSTGRESQL_CFLAGS@ -DMODULE=maptool libmaptool_la_SOURCES = boundaries.c buffer.c ch.c coastline.c itembin.c itembin_buffer.c misc.c osm.c osm_o5m.c osm_psql.c osm_protobuf.c osm_protobufdb.c osm_relations.c osm_xml.c sourcesink.c tempfile.c tile.c zip.c maptool.h generated-code/fileformat.pb-c.c generated-code/fileformat.pb-c.h generated-code/osmformat.pb-c.c generated-code/osmformat.pb-c.h google/protobuf-c/protobuf-c.c google/protobuf-c/protobuf-c.h google/protobuf-c/protobuf-c-private.h maptool_SOURCES = maptool.c maptool_LDADD = libmaptool.la ../libnavit.la @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @POSTGRESQL_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ @LIBC_LIBS@ navit-0.5.0+dfsg.1/navit/maptool/boundaries.c000066400000000000000000000246051264204753600210260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif char * osm_tag_value(struct item_bin *ib, char *key) { char *tag=NULL; int len=strlen(key); while ((tag=item_bin_get_attr(ib, attr_osm_tag, tag))) { if (!strncmp(tag,key,len) && tag[len] == '=') return tag+len+1; } return NULL; } #if 0 static char * osm_tag_name(struct item_bin *ib) { return osm_tag_value(ib, "name"); } #endif osmid boundary_relid(struct boundary *b) { long long *id; if (!b) return 0; if (!b->ib) return 0; id=item_bin_get_attr(b->ib, attr_osm_relationid, NULL); if (id) return *id; return 0; } static void process_boundaries_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) { struct boundary *b=relation_priv; enum geom_poly_segment_type role=(long)member_priv; int *dup; dup=item_bin_get_attr(member,attr_duplicate,NULL); if(!dup || *dup==0) b->segments=g_list_prepend(b->segments,item_bin_to_poly_segment(member, role)); } static GList * process_boundaries_setup(FILE *boundaries, struct relations *relations) { struct item_bin *ib; GList *boundaries_list=NULL; struct relations_func *relations_func; relations_func=relations_func_new(process_boundaries_member, NULL); while ((ib=read_item(boundaries))) { char *member=NULL; struct boundary *boundary=g_new0(struct boundary, 1); char *admin_level=osm_tag_value(ib, "admin_level"); char *iso=osm_tag_value(ib, "ISO3166-1"); int has_subrelations=0; int has_outer_ways=0; processed_relations++; if(!iso) iso=osm_tag_value(ib, "iso3166-1:alpha2"); if (admin_level && !strcmp(admin_level, "2")) { if(!iso) { char *int_name=osm_tag_value(ib,"int_name"); if(int_name && !strcmp(int_name,"France")) iso="FR"; } if (iso) { struct country_table *country=country_from_iso2(iso); if (!country) osm_warning("relation",item_bin_get_relationid(ib),0,"Country Boundary contains unknown ISO3166-1 value '%s'\n",iso); else { boundary->iso2=g_strdup(iso); osm_info("relation",item_bin_get_relationid(ib),0,"Country Boundary for '%s'\n",iso); } boundary->country=country; } else osm_warning("relation",item_bin_get_relationid(ib),0,"Country Boundary doesn't contain an ISO3166-1 tag\n"); } while ((member=item_bin_get_attr(ib, attr_osm_member, member))) { long long osm_id; int read=0; enum relation_member_type member_type; int member_type_numeric; char *rolestr; if (sscanf(member,RELATION_MEMBER_PARSE_FORMAT,&member_type_numeric,&osm_id,&read) < 2) continue; member_type=(enum relation_member_type)member_type_numeric; rolestr=member+read; if(member_type==rel_member_node) { if(!strcmp(rolestr,"admin_centre") || !strcmp(rolestr,"admin_center")) boundary->admin_centre=osm_id; } if(member_type==rel_member_way) { enum geom_poly_segment_type role; if (!strcmp(rolestr,"outer") || !strcmp(rolestr,"exclave")) { has_outer_ways=1; role=geom_poly_segment_type_way_outer; } else if (!strcmp(rolestr,"inner") || !strcmp(rolestr,"enclave")) role=geom_poly_segment_type_way_inner; else if (!strcmp(rolestr,"")) role=geom_poly_segment_type_way_unknown; else { osm_warning("relation",item_bin_get_relationid(ib),0,"Unknown role %s in member ",rolestr); osm_warning("way",osm_id,1,"\n"); role=geom_poly_segment_type_none; } relations_add_relation_member_entry(relations, relations_func, boundary, (gpointer)role, rel_member_way, osm_id); } if(member_type==rel_member_relation) { if (!strcmp(rolestr,"outer") || !strcmp(rolestr,"exclave") || !strcmp(rolestr,"inner") || !strcmp(rolestr,"enclave")) has_subrelations++; } } if(boundary->iso2 && has_subrelations) osm_warning("relation",item_bin_get_relationid(ib),0,"Country boundary '%s' has %d relations as boundary segments. These are not supported yet.\n", boundary->iso2, has_subrelations); if(boundary->iso2 && !has_outer_ways) { osm_warning("relation",item_bin_get_relationid(ib),0,"Skipping country boundary for '%s' because it has no outer ways.\n", boundary->iso2); g_free(boundary->iso2); boundary->iso2=NULL; } boundary->ib=item_bin_dup(ib); boundaries_list=g_list_append(boundaries_list, boundary); } return boundaries_list; } GList * boundary_find_matches(GList *l, struct coord *c) { GList *ret=NULL; while (l) { struct boundary *boundary=l->data; if (bbox_contains_coord(&boundary->r, c)) { if (geom_poly_segments_point_inside(boundary->sorted_segments,c) > 0) ret=g_list_prepend(ret, boundary); ret=g_list_concat(ret,boundary_find_matches(boundary->children, c)); } l=g_list_next(l); } return ret; } #if 0 static void test(GList *boundaries_list) { struct item_bin *ib; FILE *f=fopen("country_276.bin.unsorted","r"); printf("start\n"); while ((ib=read_item(f))) { struct coord *c=(struct coord *)(ib+1); char *name=item_bin_get_attr(ib, attr_town_name, NULL); printf("%s:",name); boundary_find_matches(boundaries_list, c); printf("\n"); } fclose(f); printf("end\n"); } static void dump_hierarchy(GList *l, char *prefix) { char *newprefix=g_alloca(sizeof(char)*(strlen(prefix)+2)); strcpy(newprefix, prefix); strcat(newprefix," "); while (l) { struct boundary *boundary=l->data; fprintf(stderr,"%s:%s (0x%x,0x%x)-(0x%x,0x%x)\n",prefix,osm_tag_name(boundary->ib),boundary->r.l.x,boundary->r.l.y,boundary->r.h.x,boundary->r.h.y); dump_hierarchy(boundary->children, newprefix); l=g_list_next(l); } } static gint boundary_bbox_compare(gconstpointer a, gconstpointer b) { const struct boundary *boundarya=a; const struct boundary *boundaryb=b; long long areaa=bbox_area(&boundarya->r); long long areab=bbox_area(&boundaryb->r); if (areaa > areab) return 1; if (areaa < areab) return -1; return 0; } #endif static GList * process_boundaries_insert(GList *list, struct boundary *boundary) { GList *l=list; while (l) { struct boundary *b=l->data; if (bbox_contains_bbox(&boundary->r, &b->r)) { list=g_list_remove(list, b); boundary->children=g_list_prepend(boundary->children, b); l=list; } else if (bbox_contains_bbox(&b->r, &boundary->r)) { b->children=process_boundaries_insert(b->children, boundary); return list; } else l=g_list_next(l); } return g_list_prepend(list, boundary); } static GList * process_boundaries_finish(GList *boundaries_list) { GList *l,*sl; GList *ret=NULL; l=boundaries_list; while (l) { struct boundary *boundary=l->data; int first=1; FILE *f=NULL,*fu=NULL; if (boundary->country) { char *name=g_strdup_printf("country_%s_poly",boundary->iso2); f=tempfile("",name,1); g_free(name); } boundary->sorted_segments=geom_poly_segments_sort(boundary->segments, geom_poly_segment_type_way_right_side); sl=boundary->sorted_segments; while (sl) { struct geom_poly_segment *gs=sl->data; struct coord *c=gs->first; while (c <= gs->last) { if (first) { boundary->r.l=*c; boundary->r.h=*c; first=0; } else bbox_extend(c, &boundary->r); c++; } if (f) { struct item_bin *ib=tmp_item_bin; item_bin_init(ib, type_selected_line); /* FIXME check for overflow */ item_bin_add_coord(ib, gs->first, gs->last-gs->first+1); item_bin_write(ib, f); } if (boundary->country) { if (!coord_is_equal(*gs->first,*gs->last)) { struct item_bin *ib; if (!fu) { char *name=g_strdup_printf("country_%s_broken",boundary->iso2); fu=tempfile("",name,1); g_free(name); } ib=tmp_item_bin; item_bin_init(ib, type_selected_point); item_bin_add_coord(ib, gs->first, 1); item_bin_write(ib, fu); item_bin_init(ib, type_selected_point); item_bin_add_coord(ib, gs->last, 1); item_bin_write(ib, fu); } } sl=g_list_next(sl); } ret=process_boundaries_insert(ret, boundary); l=g_list_next(l); if (f) fclose(f); if (fu) { if (boundary->country) osm_warning("relation",item_bin_get_relationid(boundary->ib),0,"Broken country polygon '%s'\n",boundary->iso2); fclose(fu); } } #if 0 printf("hierarchy\n"); #endif #if 0 boundaries_list=g_list_sort(boundaries_list, boundary_bbox_compare); l=boundaries_list; while (l) { struct boundary *boundary=l->data; GList *l2,*ln; ln=l2=g_list_next(l); while (l2) { struct boundary *boundary2=l2->data; if (bbox_contains_bbox(&boundary2->r, &boundary->r)) { boundaries_list=g_list_remove(boundaries_list, boundary); boundary2->children=g_list_append(boundary2->children, boundary); #if 0 printf("found\n"); #endif break; } l2=g_list_next(l2); } l=ln; } dump_hierarchy(boundaries_list,""); #if 0 printf("hierarchy done\n"); printf("test\n"); test(boundaries_list); #endif #endif return ret; } GList * process_boundaries(FILE *boundaries, FILE *ways) { GList *boundaries_list; struct relations *relations=relations_new(); boundaries_list=process_boundaries_setup(boundaries, relations); relations_process(relations, NULL, ways); relations_destroy(relations); return process_boundaries_finish(boundaries_list); } void free_boundaries(GList *bl) { GList *l=bl; while (l) { struct boundary *boundary=l->data; GList *s=boundary->segments; while (s) { struct geom_poly_segment *seg=s->data; g_free(seg->first); g_free(seg); s=g_list_next(s); }; s=boundary->sorted_segments; while (s) { struct geom_poly_segment *seg=s->data; g_free(seg->first); g_free(seg); s=g_list_next(s); }; g_list_free(boundary->segments); g_list_free(boundary->sorted_segments); g_free(boundary->ib); g_free(boundary->iso2); free_boundaries(boundary->children); g_free(boundary); l=g_list_next(l); } g_list_free(bl); } navit-0.5.0+dfsg.1/navit/maptool/buffer.c000066400000000000000000000036201264204753600201360ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "navit_lfs.h" #include #include "maptool.h" #include "debug.h" void save_buffer(char *filename, struct buffer *b, long long offset) { FILE *f; f=fopen(filename,"rb+"); if (! f) f=fopen(filename,"wb+"); dbg_assert(f != NULL); dbg_assert(fseeko(f, offset, SEEK_SET)==0); dbg_assert(fwrite(b->base, b->size, 1, f)==1); fclose(f); } void load_buffer(char *filename, struct buffer *b, long long offset, long long size) { FILE *f; long long len; dbg_assert(size>=0); dbg_assert(offset>=0); if (b->base) free(b->base); b->malloced=0; f=fopen(filename,"rb"); fseeko(f, 0, SEEK_END); len=ftello(f); dbg_assert(len>=0); if (offset+size > len) { size=len-offset; } b->size=b->malloced=size; dbg_assert(b->size>0); #if 0 fprintf(stderr,"reading "LONGLONG_FMT" bytes from %s of "LONGLONG_FMT" bytes at "LONGLONG_FMT"\n", b->size, filename, len, offset); #endif fseeko(f, offset, SEEK_SET); b->base=malloc(b->size); dbg_assert(b->base != NULL); fread(b->base, b->size, 1, f); fclose(f); } long long sizeof_buffer(char *filename) { long long ret; FILE *f=fopen(filename,"rb"); fseeko(f, 0, SEEK_END); ret=ftello(f); fclose(f); return ret; } navit-0.5.0+dfsg.1/navit/maptool/ch.c000066400000000000000000000325321264204753600172630ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #include "coord.h" #include "file.h" #include "debug.h" #if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 10 #define g_slice_alloc0 g_malloc0 #define g_slice_new(x) g_new(x,1) #define g_slice_new0(x) g_new0(x,1) #define g_slice_free(x,y) g_free(y) #define g_slice_free1(x,y) g_free(y) #endif struct ch_edge { int flags; int weight; struct item_id target,middle; }; struct node { int first_edge; int dummy; } *nodes; int node_count; struct edge { unsigned target:26; unsigned scedge1:6; unsigned weight:28; unsigned type:2; unsigned flags:2; unsigned int edge_count; unsigned scedge2:6; unsigned scmiddle:26; } *edges; int edge_count; struct newnode { int newnode; } *newnodes; int newnode_count; GHashTable *newnode_hash; struct edge_hash_item { int first,last; }; GHashTable *edge_hash; struct file *sgr,*ddsg_node_index; struct coord *node_index; GHashTable *sgr_nodes_hash; static int ch_levels=14; static int road_speed(enum item_type type) { switch (type) { case type_street_0: case type_street_1_city: case type_living_street: case type_street_service: case type_track_gravelled: case type_track_unpaved: return 10; case type_street_2_city: case type_track_paved: return 30; case type_street_3_city: return 40; case type_street_4_city: return 50; case type_highway_city: return 80; case type_street_1_land: return 60; case type_street_2_land: return 65; case type_street_3_land: return 70; case type_street_4_land: return 80; case type_street_n_lanes: return 120; case type_highway_land: return 120; case type_ramp: return 40; case type_roundabout: return 10; case type_ferry: return 40; default: return 0; } } static void coord_slice_free(void *data) { g_slice_free(struct coord, data); } static GHashTable * coord_hash_new(void) { return g_hash_table_new_full(coord_hash, coord_equal, coord_slice_free, NULL); } static void item_id_slice_free(void *data) { g_slice_free(struct item_id, data); } static void add_node_to_hash(FILE *idx, GHashTable *hash, struct coord *c, int *nodes) { if (! g_hash_table_lookup(hash, c)) { struct coord *ct=g_slice_new(struct coord); *ct=*c; fwrite(c, sizeof(*c), 1, idx); (*nodes)++; g_hash_table_insert(hash, ct, GINT_TO_POINTER(*nodes)); } } static void edge_hash_slice_free(void *data) { g_slice_free(struct edge_hash_item, data); } static guint edge_hash_hash(gconstpointer key) { const struct edge_hash_item *itm=key; return itm->first*2654435761UL+itm->last; } static gboolean edge_hash_equal(gconstpointer a, gconstpointer b) { const struct edge_hash_item *itm_a=a; const struct edge_hash_item *itm_b=b; return (itm_a->first == itm_b->first && itm_a->last == itm_b->last); } static void ch_generate_ddsg(FILE *in, FILE *ref, FILE *idx, FILE *ddsg) { GHashTable *hash=coord_hash_new(); struct item_bin *ib; int nodes=0,edges=0; while ((ib=read_item(in))) { int ccount=ib->clen/2; struct coord *c=(struct coord *)(ib+1); if (road_speed(ib->type)) { add_node_to_hash(idx, hash, &c[0], &nodes); add_node_to_hash(idx, hash, &c[ccount-1], &nodes); edges++; } } edge_hash=g_hash_table_new_full(edge_hash_hash, edge_hash_equal, edge_hash_slice_free, item_id_slice_free); fseek(in, 0, SEEK_SET); fprintf(ddsg,"d\n"); fprintf(ddsg,"%d %d\n", nodes, edges); while ((ib=read_item(in))) { int i,ccount=ib->clen/2; struct coord *c=(struct coord *)(ib+1); int n1,n2,speed=road_speed(ib->type); struct item_id road_id; double l; fread(&road_id, sizeof(road_id), 1, ref); if (speed) { struct edge_hash_item *hi=g_slice_new(struct edge_hash_item); struct item_id *id=g_slice_new(struct item_id); *id=road_id; dbg_assert((n1=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[0]))) != 0); dbg_assert((n2=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[ccount-1]))) != 0); l=0; for (i = 0 ; i < ccount-1 ; i++) { l+=sqrt(sq(c[i+1].x-c[i].x)+sq(c[i+1].y-c[i].y)); } fprintf(ddsg,"%d %d %d 0\n", n1-1, n2-1, (int)(l*36/speed)); hi->first=n1-1; hi->last=n2-1; g_hash_table_insert(edge_hash, hi, id); } } g_hash_table_destroy(hash); } static void ch_generate_sgr(char *suffix) { #ifndef HAVE_API_WIN32_CE char command[1024]; sprintf(command,"./contraction-hierarchies-20080621/main -s -p -f ddsg_%s.tmp -o hcn_%s.tmp -l hcn_log_%s.tmp -x 190 -y 1 -e 600 -p 1000 -k 1,3.3,2,10,3,10,5",suffix,suffix,suffix); printf("%s\n",command); system(command); sprintf(command,"./contraction-hierarchies-20080621/main -c -f ddsg_%s.tmp -h hcn_%s.tmp -k 1,3.3,2,10,3,10,5 -C ch_%s.tmp -O 1 -z sgr_%s.tmp",suffix,suffix,suffix,suffix); printf("%s\n",command); system(command); #endif } static void ch_process_node(FILE *out, int node, int resolve) { int first_edge_id=nodes[node].first_edge; int last_edge_id=nodes[node+1].first_edge; int edge_id; struct ch_edge ch_edge; struct item_bin *item_bin; struct edge_hash_item fwd,rev; int oldnode; memset(&ch_edge, 0, sizeof(ch_edge)); item_bin=init_item(type_ch_node); oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER(node))); #if 0 dbg(lvl_debug,"0x%x,0x%x\n",node_index[oldnode].x,node_index[oldnode].y); #endif item_bin_add_coord(item_bin, &node_index[oldnode], 1); fwd.first=oldnode; rev.last=oldnode; for (edge_id = first_edge_id ; edge_id < last_edge_id ; edge_id++) { if (resolve) { struct edge *edge=&edges[edge_id]; int oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER((int)edge->target))); struct item_id *id; ch_edge.weight=edge->weight; fwd.last=oldnode; rev.first=oldnode; ch_edge.flags=edge->flags & 3; if (edge->scmiddle == 67108863) { id=g_hash_table_lookup(edge_hash, &fwd); if (!id) { ch_edge.flags|=8; id=g_hash_table_lookup(edge_hash, &rev); } if (id == NULL) { fprintf(stderr,"Shortcut %d Weight %d\n",edge->scmiddle,edge->weight); fprintf(stderr,"Neither %d-%d nor %d-%d exists\n",fwd.first,fwd.last,rev.first,rev.last); exit(1); } else { ch_edge.middle=*id; #if 0 dbg(lvl_debug,"middle street id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id)); #endif } } else { ch_edge.flags|=4; id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->scmiddle)); dbg_assert(id != NULL); ch_edge.middle=*id; #if 0 dbg(lvl_debug,"middle node id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id)); #endif } id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->target)); #if 0 dbg(lvl_debug,"id for %d is "ITEM_ID_FMT"\n",edge->target,ITEM_ID_ARGS(*id)); #endif if (id == NULL) { fprintf(stderr,"Failed to look up target %d\n",edge->target); } else { ch_edge.target=*id; } } item_bin_add_attr_data(item_bin,attr_ch_edge,&ch_edge,sizeof(ch_edge)); } item_bin_write(item_bin, out); } static void ch_process_nodes(FILE *out, int pos, int count, int resolve) { int i; printf("count %d sum=%d newnode_count=%d\n",count,pos,newnode_count); for (i = 0 ; i < count ; i++) ch_process_node(out, pos+i, resolve); } static void ch_process(FILE **files, int depth, int resolve) { int count=newnode_count; int pos=0; while (depth > 0 && pos < newnode_count) { count=(count+1)/2; ch_process_nodes(files[depth], pos, count, resolve); pos+=count; depth--; } ch_process_nodes(files[depth], pos, newnode_count-pos, resolve); } static void ch_setup(char *suffix) { int i; if (!sgr) { int *data,size,offset=0; char *filename=tempfile_name(suffix,"sgr"); printf("filename=%s\n",filename); sgr=file_create(filename,0); g_free(filename); dbg_assert(sgr != NULL); file_mmap(sgr); size=sizeof(int); data=(int *)file_data_read(sgr, offset, size); node_count=*data; offset+=size; size=node_count*sizeof(struct node); nodes=(struct node *)file_data_read(sgr, offset, size); offset+=size; size=sizeof(int); data=(int *)file_data_read(sgr, offset, size); edge_count=*data; offset+=size; size=edge_count*sizeof(struct edge); edges=(struct edge *)file_data_read(sgr, offset, size); offset+=size; size=sizeof(int); data=(int *)file_data_read(sgr, offset, size); newnode_count=*data; offset+=size; size=edge_count*sizeof(struct newnode); newnodes=(struct newnode *)file_data_read(sgr, offset, size); offset+=size; newnode_hash=g_hash_table_new(NULL, NULL); for (i = 0 ; i < newnode_count ; i++) { g_hash_table_insert(newnode_hash, GINT_TO_POINTER(newnodes[i].newnode), GINT_TO_POINTER(i)); } } if (!ddsg_node_index) { char *filename=tempfile_name(suffix,"ddsg_coords"); ddsg_node_index=file_create(filename,0); g_free(filename); dbg_assert(ddsg_node_index != NULL); file_mmap(ddsg_node_index); node_index=(struct coord *)file_data_read(ddsg_node_index, 0, file_size(ddsg_node_index)); } } static void ch_create_tempfiles(char *suffix, FILE **files, int count, int mode) { char name[256]; int i; for (i = 0 ; i <= count ; i++) { sprintf(name,"graph_%d",i); files[i]=tempfile(suffix, name, mode); } } static void ch_close_tempfiles(FILE **files, int count) { int i; for (i = 0 ; i <= count ; i++) { fclose(files[i]); } } #if 0 static void ch_remove_tempfiles(char *suffix, int count) { char name[256]; int i; for (i = 0 ; i <= count ; i++) { sprintf(name,"graph_%d",i); tempfile_unlink(suffix, name); } } #endif static void ch_copy_to_tiles(char *suffix, int count, struct tile_info *info, FILE *ref) { char name[256]; int i; FILE *f; struct item_bin *item_bin; for (i = count ; i >= 0 ; i--) { sprintf(name,"graph_%d",i); f=tempfile(suffix, name, 0); while ((item_bin = read_item(f))) { tile_write_item_minmax(info, item_bin, ref, i, i); } fclose(f); } } void ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) { struct tile_info info; FILE *in,*ref,*ddsg_coords,*ddsg; FILE **graphfiles; info.write=0; info.maxlen=0; info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=tilesdir_out; graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1)); ch_create_tempfiles(suffix, graphfiles, ch_levels, 1); in=tempfile(map_suffix,"ways_split",0); ref=tempfile(map_suffix,"ways_split_ref",0); ddsg_coords=tempfile(suffix,"ddsg_coords",1); ddsg=tempfile(suffix,"ddsg",1); ch_generate_ddsg(in, ref, ddsg_coords, ddsg); fclose(in); fclose(ref); fclose(ddsg_coords); fclose(ddsg); ch_generate_sgr(suffix); ch_setup(suffix); ch_process(graphfiles, ch_levels, 0); ch_close_tempfiles(graphfiles, ch_levels); tile_hash=g_hash_table_new(g_str_hash, g_str_equal); ch_copy_to_tiles(suffix, ch_levels, &info, NULL); merge_tiles(&info); write_tilesdir(&info, zip_info, tilesdir_out); } void ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info) { struct tile_info info; struct tile_head *th; FILE **graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1)); FILE *ref; struct item_id id; int nodeid=0; info.write=1; info.maxlen=zip_get_maxnamelen(zip_info); info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=NULL; ref=tempfile(suffix,"sgr_ref",1); create_tile_hash(); th=tile_head_root; while (th) { th->zip_data=NULL; th->process=1; th=th->next; } ch_setup(suffix); ch_copy_to_tiles(suffix, ch_levels, &info, ref); fclose(ref); ref=tempfile(suffix,"sgr_ref",0); sgr_nodes_hash=g_hash_table_new_full(NULL, NULL, NULL, item_id_slice_free); while (fread(&id, sizeof(id), 1, ref)) { struct item_id *id2=g_slice_new(struct item_id); *id2=id; #if 0 dbg(lvl_debug,"%d is "ITEM_ID_FMT"\n",nodeid,ITEM_ID_ARGS(*id2)); #endif g_hash_table_insert(sgr_nodes_hash, GINT_TO_POINTER(nodeid), id2); nodeid++; } th=tile_head_root; while (th) { th->zip_data=malloc(th->total_size); th->total_size_used=0; th=th->next; } ch_create_tempfiles(suffix, graphfiles, ch_levels, 1); ch_process(graphfiles, ch_levels, 1); ch_close_tempfiles(graphfiles, ch_levels); g_hash_table_destroy(newnode_hash); g_hash_table_destroy(edge_hash); g_hash_table_destroy(sgr_nodes_hash); ch_copy_to_tiles(suffix, ch_levels, &info, NULL); write_tilesdir(&info, zip_info, NULL); th=tile_head_root; while (th) { if (th->name[0]) { if (th->total_size != th->total_size_used) { fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used); exit(1); } write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size); } else { fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info)); } g_free(th->zip_data); th=th->next; } } navit-0.5.0+dfsg.1/navit/maptool/coastline.c000066400000000000000000000442341264204753600206540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "maptool.h" #include "debug.h" struct coastline_tile { osmid wayid; int edges; }; static int distance_from_ll(struct coord *c, struct rect *bbox) { int dist=0; if (c->x == bbox->l.x) return dist+c->y-bbox->l.y; dist+=bbox->h.y-bbox->l.y; if (c->y == bbox->h.y) return dist+c->x-bbox->l.x; dist+=bbox->h.x-bbox->l.x; if (c->x == bbox->h.x) return dist+bbox->h.y-c->y; dist+=bbox->h.y-bbox->l.y; if (c->y == bbox->l.y) return dist+bbox->h.x-c->x; return -1; } static struct geom_poly_segment * find_next(struct rect *bbox, GList *segments, struct coord *c, int exclude, struct coord *ci) { int min=INT_MAX,search=distance_from_ll(c, bbox)+(exclude?1:0); GList *curr; int i; struct geom_poly_segment *ret=NULL; for (i = 0 ; i < 2 ; i++) { curr=segments; dbg(lvl_debug,"search distance %d\n",search); while (curr) { struct geom_poly_segment *seg=curr->data; int dist=distance_from_ll(seg->first, bbox); dbg(lvl_debug,"0x%x 0x%x dist %d\n",seg->first->x,seg->first->y,dist); if (dist != -1 && seg->first != seg->last && dist < min && (dist >= search)) { min=dist; ci[0]=*seg->first; ci[1]=*seg->last; ret=seg; } curr=g_list_next(curr); } if (ret || !search) break; search=0; } return ret; } static void close_polygon(struct item_bin *ib, struct coord *from, struct coord *to, int dir, struct rect *bbox, int *edges) { int i,e,dist,fromdist,todist; int full=(bbox->h.x-bbox->l.x+bbox->h.y-bbox->l.y)*2; int corners=0,first_corner=0; struct coord c; if (dir > 0) { fromdist=distance_from_ll(from, bbox); todist=distance_from_ll(to, bbox); } else { fromdist=distance_from_ll(to, bbox); todist=distance_from_ll(from, bbox); } #if 0 fprintf(stderr,"close_polygon fromdist %d todist %d full %d dir %d\n", fromdist, todist, full, dir); #endif if (fromdist > todist) todist+=full; #if 0 fprintf(stderr,"close_polygon corrected fromdist %d todist %d full %d dir %d\n", fromdist, todist, full, dir); #endif for (i = 0 ; i < 8 ; i++) { if (dir > 0) e=i; else e=7-i; switch (e%4) { case 0: c=bbox->l; break; case 1: c.x=bbox->l.x; c.y=bbox->h.y; break; case 2: c=bbox->h; break; case 3: c.x=bbox->h.x; c.y=bbox->l.y; break; } dist=distance_from_ll(&c, bbox); if (e & 4) dist+=full; #if 0 fprintf(stderr,"dist %d %d\n",e,dist); #endif if (dist > fromdist && dist < todist) { item_bin_add_coord(ib, &c, 1); #if 0 fprintf(stderr,"add\n"); #endif } if (dist >= fromdist && dist <= todist) { if (!corners) first_corner=e; corners++; } } while (corners >= 2) { *edges |= 1<<(first_corner%4); first_corner++; corners--; } } struct coastline_tile_data { struct item_bin_sink_func *sink; GHashTable *tile_edges; int level; GList *k,*v; }; static GList * tile_data_to_segments(int *tile_data) { int *end=tile_data+tile_data[0]; int *curr=tile_data+1; GList *segments=NULL; int count=0; while (curr < end) { struct item_bin *ib=(struct item_bin *)curr; segments=g_list_prepend(segments,item_bin_to_poly_segment(ib, geom_poly_segment_type_way_right_side)); curr+=ib->len+1; count++; } #if 0 fprintf(stderr,"%d segments\n",count); #endif return segments; } static void tile_collector_process_tile(char *tile, int *tile_data, struct coastline_tile_data *data) { int poly_start_valid,tile_start_valid,exclude,search=0; struct rect bbox; struct coord cn[2],end,poly_start,tile_start; struct geom_poly_segment *first; struct item_bin *ib=NULL; struct item_bin_sink *out=data->sink->priv_data[1]; int edges=0,flags; GList *sorted_segments,*curr; struct item_bin *ibt=(struct item_bin *)(tile_data+1); struct coastline_tile *ct=g_new0(struct coastline_tile, 1); ct->wayid=item_bin_get_wayid(ibt); #if 0 if (strncmp(tile,"bcdbdcabddddba",7)) return; #endif #if 0 if (strncmp(tile,"bcdbdcaaaaddba",14)) return; #endif #if 0 fprintf(stderr,"tile %s of size %d\n", tile, *tile_data); #endif tile_bbox(tile, &bbox, 0); curr=tile_data_to_segments(tile_data); sorted_segments=geom_poly_segments_sort(curr, geom_poly_segment_type_way_right_side); g_list_foreach(curr,(GFunc)geom_poly_segment_destroy,NULL); g_list_free(curr); #if 0 { GList *sort_segments=sorted_segments; int count=0; while (sort_segments) { struct geom_poly_segment *seg=sort_segments->data; struct item_bin *ib=(struct item_bin *)buffer; char *text=g_strdup_printf("segment %d type %d %p %s area "LONGLONG_FMT,count++,seg->type,sort_segments,coord_is_equal(*seg->first, *seg->last) ? "closed":"open",geom_poly_area(seg->first,seg->last-seg->first+1)); item_bin_init(ib, type_rg_segment); item_bin_add_coord(ib, seg->first, seg->last-seg->first+1); item_bin_add_attr_string(ib, attr_debug, text); // fprintf(stderr,"%s\n",text); g_free(text); // item_bin_dump(ib, stderr); item_bin_write_to_sink(ib, out, NULL); sort_segments=g_list_next(sort_segments); } } #endif flags=0; curr=sorted_segments; while (curr) { struct geom_poly_segment *seg=curr->data; switch (seg->type) { case geom_poly_segment_type_way_inner: flags|=1; break; case geom_poly_segment_type_way_outer: flags|=2; break; default: flags|=4; break; } curr=g_list_next(curr); } if (flags == 1) { ct->edges=15; ib=init_item(type_poly_water_tiled); item_bin_bbox(ib, &bbox); item_bin_add_attr_longlong(ib, attr_osm_wayid, ct->wayid); item_bin_write_to_sink(ib, out, NULL); g_hash_table_insert(data->tile_edges, g_strdup(tile), ct); return; } #if 1 end=bbox.l; tile_start_valid=0; poly_start_valid=0; exclude=0; poly_start.x=0; poly_start.y=0; tile_start.x=0; tile_start.y=0; for (;;) { search++; // item_bin_write_debug_point_to_sink(out, &end, "Search %d",search); dbg(lvl_debug,"searching next polygon from 0x%x 0x%x\n",end.x,end.y); first=find_next(&bbox, sorted_segments, &end, exclude, cn); exclude=1; if (!first) break; if (!tile_start_valid) { tile_start=cn[0]; tile_start_valid=1; } else { if (cn[0].x == tile_start.x && cn[0].y == tile_start.y) { dbg(lvl_debug,"end of tile reached\n"); break; } } if (first->type == geom_poly_segment_type_none) { end=cn[0]; continue; } poly_start_valid=0; dbg(lvl_debug,"start of polygon 0x%x 0x%x\n",cn[0].x,cn[0].y); for (;;) { if (!poly_start_valid) { poly_start=cn[0]; poly_start_valid=1; ib=init_item(type_poly_water_tiled); } else { close_polygon(ib, &end, &cn[0], 1, &bbox, &edges); if (cn[0].x == poly_start.x && cn[0].y == poly_start.y) { dbg(lvl_debug,"poly end reached\n"); item_bin_add_attr_longlong(ib, attr_osm_wayid, ct->wayid); item_bin_write_to_sink(ib, out, NULL); end=cn[0]; break; } } if (first->type == geom_poly_segment_type_none) break; item_bin_add_coord(ib, first->first, first->last-first->first+1); first->type=geom_poly_segment_type_none; end=cn[1]; if (distance_from_ll(&end, &bbox) == -1) { dbg(lvl_debug,"incomplete\n"); break; } first=find_next(&bbox, sorted_segments, &end, 1, cn); dbg(lvl_debug,"next segment of polygon 0x%x 0x%x\n",cn[0].x,cn[0].y); } if (search > 55) break; } g_list_foreach(sorted_segments,(GFunc)geom_poly_segment_destroy,NULL); g_list_free(sorted_segments); #endif #if 0 { int *end=tile_data+tile_data[0]; int *curr=tile_data+1; while (curr < end) { struct item_bin *ib=(struct item_bin *)curr; // item_bin_dump(ib); ib->type=type_rg_segment; item_bin_write_to_sink(ib, out, NULL); curr+=ib->len+1; #if 0 { struct coord *c[2]; int i; char *s; c[0]=(struct coord *)(ib+1); c[1]=c[0]+ib->clen/2-1; for (i = 0 ; i < 2 ; i++) { s=coord_to_str(c[i]); item_bin_write_debug_point_to_sink(out, c[i], "%s",s); g_free(s); } } #endif } } #endif ct->edges=edges; g_hash_table_insert(data->tile_edges, g_strdup(tile), ct); #if 0 item_bin_init(ib, type_border_country); item_bin_bbox(ib, &bbox); item_bin_add_attr_string(ib, attr_debug, tile); item_bin_write_to_sink(ib, out, NULL); #endif #if 0 c.x=(bbox.l.x+bbox.h.x)/2; c.y=(bbox.l.y+bbox.h.y)/2; item_bin_write_debug_point_to_sink(out, &c, "%s %d",tile,edges); #endif } static void ocean_tile(GHashTable *hash, char *tile, char c, osmid wayid, struct item_bin_sink *out) { int len=strlen(tile); char *tile2=g_alloca(sizeof(char)*(len+1)); struct rect bbox; struct item_bin *ib; struct coastline_tile *ct; strcpy(tile2, tile); tile2[len-1]=c; //fprintf(stderr,"Testing %s\n",tile2); ct=g_hash_table_lookup(hash, tile2); if (ct) return; //fprintf(stderr,"%s ok\n",tile2); tile_bbox(tile2, &bbox, 0); ib=init_item(type_poly_water_tiled); item_bin_bbox(ib, &bbox); item_bin_add_attr_longlong(ib, attr_osm_wayid, wayid); item_bin_write_to_sink(ib, out, NULL); ct=g_new0(struct coastline_tile, 1); ct->edges=15; ct->wayid=wayid; g_hash_table_insert(hash, g_strdup(tile2), ct); #if 0 item_bin_init(ib, type_border_country); item_bin_bbox(ib, &bbox); item_bin_add_attr_string(ib, attr_debug, tile2); item_bin_write_to_sink(ib, out, NULL); #endif #if 0 { struct coord co; co.x=(bbox.l.x+bbox.h.x)/2; co.y=(bbox.l.y+bbox.h.y)/2; item_bin_write_debug_point_to_sink(out, &co, "%s 15",tile2); } #endif } /* ba */ /* dc */ static void tile_collector_add_siblings(char *tile, struct coastline_tile *ct, struct coastline_tile_data *data) { int len=strlen(tile); char t=tile[len-1]; struct item_bin_sink *out=data->sink->priv_data[1]; int edges=ct->edges; int debug=0; #if 0 if (!strncmp(tile,"bcacccaadbdcd",10)) debug=1; #endif if (debug) fprintf(stderr,"%s (%c) has %d edges active\n",tile,t,edges); if (t == 'a' && (edges & 1)) ocean_tile(data->tile_edges, tile, 'b', ct->wayid, out); if (t == 'a' && (edges & 8)) ocean_tile(data->tile_edges, tile, 'c', ct->wayid, out); if (t == 'b' && (edges & 4)) ocean_tile(data->tile_edges, tile, 'a', ct->wayid, out); if (t == 'b' && (edges & 8)) ocean_tile(data->tile_edges, tile, 'd', ct->wayid, out); if (t == 'c' && (edges & 1)) ocean_tile(data->tile_edges, tile, 'd', ct->wayid, out); if (t == 'c' && (edges & 2)) ocean_tile(data->tile_edges, tile, 'a', ct->wayid, out); if (t == 'd' && (edges & 4)) ocean_tile(data->tile_edges, tile, 'c', ct->wayid, out); if (t == 'd' && (edges & 2)) ocean_tile(data->tile_edges, tile, 'b', ct->wayid, out); } static int tile_sibling_edges(GHashTable *hash, char *tile, char c) { int len=strlen(tile); char *tile2=g_alloca(sizeof(char)*(len+1)); struct coastline_tile *ct; strcpy(tile2, tile); tile2[len-1]=c; ct=g_hash_table_lookup(hash, tile2); if (ct) return ct->edges; return 15; } #if 0 static void ocean_tile2(struct rect *r, int dx, int dy, int wf, int hf, struct item_bin_sink *out) { struct item_bin *ib; int w=r->h.x-r->l.x; int h=r->h.y-r->l.y; char tile2[32]; struct rect bbox; bbox.l.x=r->l.x+dx*w; bbox.l.y=r->l.y+dy*h; bbox.h.x=bbox.l.x+w*wf; bbox.h.y=bbox.l.y+h*hf; //fprintf(stderr,"0x%x,0x%x-0x%x,0x%x -> 0x%x,0x%x-0x%x,0x%x\n",r->l.x,r->l.y,r->h.x,r->h.y,bbox.l.x,bbox.l.y,bbox.h.x,bbox.h.y); ib=init_item(type_poly_water_tiled); item_bin_bbox(ib, &bbox); item_bin_write_to_sink(ib, out, NULL); #if 0 item_bin_init(ib, type_border_country); item_bin_bbox(ib, &bbox); item_bin_add_attr_string(ib, attr_debug, tile2); item_bin_write_to_sink(ib, out, NULL); #endif tile(&bbox, NULL, tile2, 32, 0, NULL); #if 0 { struct coord co; co.x=(bbox.l.x+bbox.h.x)/2; co.y=(bbox.l.y+bbox.h.y)/2; item_bin_write_debug_point_to_sink(out, &co, "%s 15",tile2); } #endif } #endif static void tile_collector_add_siblings2(char *tile, struct coastline_tile *ct, struct coastline_tile_data *data) { int edges=ct->edges; int pedges=0; int debug=0; int len=strlen(tile); struct coastline_tile *cn, *co; char *tile2=g_alloca(sizeof(char)*(len+1)); char t=tile[len-1]; strcpy(tile2, tile); tile2[len-1]='\0'; #if 0 if (!strncmp(tile,"bcacccaadbdcd",10)) debug=1; #endif if (debug) fprintf(stderr,"len of %s %d vs %d\n",tile,len,data->level); if (debug) fprintf(stderr,"checking siblings of '%s' with %d edges active\n",tile,edges); if (t == 'b' && (edges & 1) && (tile_sibling_edges(data->tile_edges, tile, 'd') & 1)) pedges|=1; if (t == 'd' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'b') & 1)) pedges|=1; if (t == 'a' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'b') & 2)) pedges|=2; if (t == 'b' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'a') & 2)) pedges|=2; if (t == 'a' && (edges & 4) && (tile_sibling_edges(data->tile_edges, tile, 'c') & 4)) pedges|=4; if (t == 'c' && (edges & 4) && (tile_sibling_edges(data->tile_edges, tile, 'a') & 4)) pedges|=4; if (t == 'd' && (edges & 8) && (tile_sibling_edges(data->tile_edges, tile, 'c') & 8)) pedges|=8; if (t == 'c' && (edges & 8) && (tile_sibling_edges(data->tile_edges, tile, 'd') & 8)) pedges|=8; co=g_hash_table_lookup(data->tile_edges, tile2); if (debug) fprintf(stderr,"result '%s' %d old %d\n",tile2,pedges,co?co->edges:0); cn=g_new0(struct coastline_tile, 1); cn->edges=pedges; if (co) { cn->edges|=co->edges; cn->wayid=co->wayid; } else cn->wayid=ct->wayid; g_hash_table_insert(data->tile_edges, g_strdup(tile2), cn); } static void foreach_tile_func(gpointer key, gpointer value, gpointer user_data) { struct coastline_tile_data *data=user_data; if (strlen((char *)key) == data->level) { data->k=g_list_prepend(data->k, key); data->v=g_list_prepend(data->v, value); } } static void foreach_tile(struct coastline_tile_data *data, void(*func)(char *, struct coastline_tile *, struct coastline_tile_data *)) { GList *k,*v; data->k=NULL; data->v=NULL; g_hash_table_foreach(data->tile_edges, foreach_tile_func, data); k=data->k; v=data->v; while (k) { func(k->data,v->data,data); k=g_list_next(k); v=g_list_next(v); } g_list_free(data->k); g_list_free(data->v); } static int tile_collector_finish(struct item_bin_sink_func *tile_collector) { struct coastline_tile_data data; int i; GHashTable *hash; data.sink=tile_collector; data.tile_edges=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); hash=tile_collector->priv_data[0]; fprintf(stderr,"tile_collector_finish\n"); #if 1 g_hash_table_foreach(hash, (GHFunc) tile_collector_process_tile, &data); #endif fprintf(stderr,"tile_collector_finish foreach done\n"); g_hash_table_destroy(hash); fprintf(stderr,"tile_collector_finish destroy done\n"); for (i = 14 ; i > 0 ; i--) { fprintf(stderr,"Level=%d\n",i); data.level=i; foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings); fprintf(stderr,"*"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); foreach_tile(&data, tile_collector_add_siblings2); fprintf(stderr,"*\n"); } #if 0 data.level=13; g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings2, &data); data.level=12; g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); #endif item_bin_sink_func_destroy(tile_collector); fprintf(stderr,"tile_collector_finish done\n"); return 0; } static int coastline_processor_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data) { #if 0 int i; struct coord *c=(struct coord *)(ib+1); for (i = 0 ; i < 19 ; i++) { c[i]=c[i+420]; } ib->clen=(i-1)*2; #endif item_bin_write_clipped(ib, func->priv_data[0], func->priv_data[1]); return 0; } static struct item_bin_sink_func * coastline_processor_new(struct item_bin_sink *out) { struct item_bin_sink_func *coastline_processor=item_bin_sink_func_new(coastline_processor_process); struct item_bin_sink *tiles=item_bin_sink_new(); struct item_bin_sink_func *tile_collector=tile_collector_new(out); struct tile_parameter *param=g_new0(struct tile_parameter, 1); param->min=14; param->max=14; param->overlap=0; param->attr_to_copy=attr_osm_wayid; item_bin_sink_add_func(tiles, tile_collector); coastline_processor->priv_data[0]=param; coastline_processor->priv_data[1]=tiles; coastline_processor->priv_data[2]=tile_collector; return coastline_processor; } static void coastline_processor_finish(struct item_bin_sink_func *coastline_processor) { struct tile_parameter *param=coastline_processor->priv_data[0]; struct item_bin_sink *tiles=coastline_processor->priv_data[1]; struct item_bin_sink_func *tile_collector=coastline_processor->priv_data[2]; g_free(param); tile_collector_finish(tile_collector); item_bin_sink_destroy(tiles); item_bin_sink_func_destroy(coastline_processor); } void process_coastlines(FILE *in, FILE *out) { struct item_bin_sink *reader=file_reader_new(in,-1,0); struct item_bin_sink_func *file_writer=file_writer_new(out); struct item_bin_sink *result=item_bin_sink_new(); struct item_bin_sink_func *coastline_processor=coastline_processor_new(result); item_bin_sink_add_func(reader, coastline_processor); item_bin_sink_add_func(result, file_writer); file_reader_finish(reader); coastline_processor_finish(coastline_processor); file_writer_finish(file_writer); item_bin_sink_destroy(result); } navit-0.5.0+dfsg.1/navit/maptool/fileformat.proto000066400000000000000000000016621264204753600217420ustar00rootroot00000000000000option java_package = "crosby.binary"; package OSMPBF; //protoc --java_out=../.. fileformat.proto // // STORAGE LAYER: Storing primitives. // message Blob { optional bytes raw = 1; // No compression optional int32 raw_size = 2; // When compressed, the uncompressed size // Possible compressed versions of the data. optional bytes zlib_data = 3; // PROPOSED feature for LZMA compressed data. SUPPORT IS NOT REQUIRED. optional bytes lzma_data = 4; // Formerly used for bzip2 compressed data. Depreciated in 2010. optional bytes OBSOLETE_bzip2_data = 5 [deprecated=true]; // Don't reuse this tag number. } /* A file contains an sequence of fileblock headers, each prefixed by their length in network byte order, followed by a data block containing the actual data. types staring with a "_" are reserved. */ message BlobHeader { required string type = 1; optional bytes indexdata = 2; required int32 datasize = 3; } navit-0.5.0+dfsg.1/navit/maptool/generated-code/000077500000000000000000000000001264204753600213665ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/maptool/generated-code/fileformat.pb-c.c000066400000000000000000000165611264204753600245130ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Do not generate deprecated warnings for self */ #ifndef PROTOBUF_C_NO_DEPRECATED #define PROTOBUF_C_NO_DEPRECATED #endif #include "fileformat.pb-c.h" void osmpbf__blob__init (OSMPBF__Blob *message) { static OSMPBF__Blob init_value = OSMPBF__BLOB__INIT; *message = init_value; } size_t osmpbf__blob__get_packed_size (const OSMPBF__Blob *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__blob__pack (const OSMPBF__Blob *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__blob__pack_to_buffer (const OSMPBF__Blob *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Blob * osmpbf__blob__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Blob *) protobuf_c_message_unpack (&osmpbf__blob__descriptor, allocator, len, data); } void osmpbf__blob__free_unpacked (OSMPBF__Blob *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__blob_header__init (OSMPBF__BlobHeader *message) { static OSMPBF__BlobHeader init_value = OSMPBF__BLOB_HEADER__INIT; *message = init_value; } size_t osmpbf__blob_header__get_packed_size (const OSMPBF__BlobHeader *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__blob_header__pack (const OSMPBF__BlobHeader *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__blob_header__pack_to_buffer (const OSMPBF__BlobHeader *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__BlobHeader * osmpbf__blob_header__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__BlobHeader *) protobuf_c_message_unpack (&osmpbf__blob_header__descriptor, allocator, len, data); } void osmpbf__blob_header__free_unpacked (OSMPBF__BlobHeader *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } static const ProtobufCFieldDescriptor osmpbf__blob__field_descriptors[5] = { { "raw", 1, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_raw), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, raw), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "raw_size", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_raw_size), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, raw_size), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "zlib_data", 3, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_zlib_data), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, zlib_data), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lzma_data", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_lzma_data), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, lzma_data), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "OBSOLETE_bzip2_data", 5, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_obsolete_bzip2_data), PROTOBUF_C_OFFSETOF(OSMPBF__Blob, obsolete_bzip2_data), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__blob__field_indices_by_name[] = { 4, /* field[4] = OBSOLETE_bzip2_data */ 3, /* field[3] = lzma_data */ 0, /* field[0] = raw */ 1, /* field[1] = raw_size */ 2, /* field[2] = zlib_data */ }; static const ProtobufCIntRange osmpbf__blob__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__blob__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Blob", "Blob", "OSMPBF__Blob", "OSMPBF", sizeof(OSMPBF__Blob), 5, osmpbf__blob__field_descriptors, osmpbf__blob__field_indices_by_name, 1, osmpbf__blob__number_ranges, (ProtobufCMessageInit) osmpbf__blob__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__blob_header__field_descriptors[3] = { { "type", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_STRING, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, type), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "indexdata", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, has_indexdata), PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, indexdata), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "datasize", 3, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT32, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, datasize), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__blob_header__field_indices_by_name[] = { 2, /* field[2] = datasize */ 1, /* field[1] = indexdata */ 0, /* field[0] = type */ }; static const ProtobufCIntRange osmpbf__blob_header__number_ranges[1 + 1] = { { 1, 0 }, { 0, 3 } }; const ProtobufCMessageDescriptor osmpbf__blob_header__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.BlobHeader", "BlobHeader", "OSMPBF__BlobHeader", "OSMPBF", sizeof(OSMPBF__BlobHeader), 3, osmpbf__blob_header__field_descriptors, osmpbf__blob_header__field_indices_by_name, 1, osmpbf__blob_header__number_ranges, (ProtobufCMessageInit) osmpbf__blob_header__init, NULL,NULL,NULL /* reserved[123] */ }; navit-0.5.0+dfsg.1/navit/maptool/generated-code/fileformat.pb-c.h000066400000000000000000000066371264204753600245230ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ #ifndef PROTOBUF_C_fileformat_2eproto__INCLUDED #define PROTOBUF_C_fileformat_2eproto__INCLUDED #include PROTOBUF_C_BEGIN_DECLS typedef struct _OSMPBF__Blob OSMPBF__Blob; typedef struct _OSMPBF__BlobHeader OSMPBF__BlobHeader; /* --- enums --- */ /* --- messages --- */ struct _OSMPBF__Blob { ProtobufCMessage base; protobuf_c_boolean has_raw; ProtobufCBinaryData raw; protobuf_c_boolean has_raw_size; int32_t raw_size; protobuf_c_boolean has_zlib_data; ProtobufCBinaryData zlib_data; protobuf_c_boolean has_lzma_data; ProtobufCBinaryData lzma_data; protobuf_c_boolean has_obsolete_bzip2_data PROTOBUF_C_DEPRECATED; ProtobufCBinaryData obsolete_bzip2_data PROTOBUF_C_DEPRECATED; }; #define OSMPBF__BLOB__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__blob__descriptor) \ , 0,{0,NULL}, 0,0, 0,{0,NULL}, 0,{0,NULL}, 0,{0,NULL} } struct _OSMPBF__BlobHeader { ProtobufCMessage base; char *type; protobuf_c_boolean has_indexdata; ProtobufCBinaryData indexdata; int32_t datasize; }; #define OSMPBF__BLOB_HEADER__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__blob_header__descriptor) \ , NULL, 0,{0,NULL}, 0 } /* OSMPBF__Blob methods */ void osmpbf__blob__init (OSMPBF__Blob *message); size_t osmpbf__blob__get_packed_size (const OSMPBF__Blob *message); size_t osmpbf__blob__pack (const OSMPBF__Blob *message, uint8_t *out); size_t osmpbf__blob__pack_to_buffer (const OSMPBF__Blob *message, ProtobufCBuffer *buffer); OSMPBF__Blob * osmpbf__blob__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__blob__free_unpacked (OSMPBF__Blob *message, ProtobufCAllocator *allocator); /* OSMPBF__BlobHeader methods */ void osmpbf__blob_header__init (OSMPBF__BlobHeader *message); size_t osmpbf__blob_header__get_packed_size (const OSMPBF__BlobHeader *message); size_t osmpbf__blob_header__pack (const OSMPBF__BlobHeader *message, uint8_t *out); size_t osmpbf__blob_header__pack_to_buffer (const OSMPBF__BlobHeader *message, ProtobufCBuffer *buffer); OSMPBF__BlobHeader * osmpbf__blob_header__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__blob_header__free_unpacked (OSMPBF__BlobHeader *message, ProtobufCAllocator *allocator); /* --- per-message closures --- */ typedef void (*OSMPBF__Blob_Closure) (const OSMPBF__Blob *message, void *closure_data); typedef void (*OSMPBF__BlobHeader_Closure) (const OSMPBF__BlobHeader *message, void *closure_data); /* --- services --- */ /* --- descriptors --- */ extern const ProtobufCMessageDescriptor osmpbf__blob__descriptor; extern const ProtobufCMessageDescriptor osmpbf__blob_header__descriptor; PROTOBUF_C_END_DECLS #endif /* PROTOBUF_fileformat_2eproto__INCLUDED */ navit-0.5.0+dfsg.1/navit/maptool/generated-code/osmformat.pb-c.c000066400000000000000000001373711264204753600243750ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Do not generate deprecated warnings for self */ #ifndef PROTOBUF_C_NO_DEPRECATED #define PROTOBUF_C_NO_DEPRECATED #endif #include "osmformat.pb-c.h" void osmpbf__header_block__init (OSMPBF__HeaderBlock *message) { static OSMPBF__HeaderBlock init_value = OSMPBF__HEADER_BLOCK__INIT; *message = init_value; } size_t osmpbf__header_block__get_packed_size (const OSMPBF__HeaderBlock *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__header_block__pack (const OSMPBF__HeaderBlock *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__header_block__pack_to_buffer (const OSMPBF__HeaderBlock *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__HeaderBlock * osmpbf__header_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__HeaderBlock *) protobuf_c_message_unpack (&osmpbf__header_block__descriptor, allocator, len, data); } void osmpbf__header_block__free_unpacked (OSMPBF__HeaderBlock *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__header_bbox__init (OSMPBF__HeaderBBox *message) { static OSMPBF__HeaderBBox init_value = OSMPBF__HEADER_BBOX__INIT; *message = init_value; } size_t osmpbf__header_bbox__get_packed_size (const OSMPBF__HeaderBBox *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__header_bbox__pack (const OSMPBF__HeaderBBox *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__header_bbox__pack_to_buffer (const OSMPBF__HeaderBBox *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__HeaderBBox * osmpbf__header_bbox__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__HeaderBBox *) protobuf_c_message_unpack (&osmpbf__header_bbox__descriptor, allocator, len, data); } void osmpbf__header_bbox__free_unpacked (OSMPBF__HeaderBBox *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__primitive_block__init (OSMPBF__PrimitiveBlock *message) { static OSMPBF__PrimitiveBlock init_value = OSMPBF__PRIMITIVE_BLOCK__INIT; *message = init_value; } size_t osmpbf__primitive_block__get_packed_size (const OSMPBF__PrimitiveBlock *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__primitive_block__pack (const OSMPBF__PrimitiveBlock *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__primitive_block__pack_to_buffer (const OSMPBF__PrimitiveBlock *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__PrimitiveBlock * osmpbf__primitive_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__PrimitiveBlock *) protobuf_c_message_unpack (&osmpbf__primitive_block__descriptor, allocator, len, data); } void osmpbf__primitive_block__free_unpacked (OSMPBF__PrimitiveBlock *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__primitive_group__init (OSMPBF__PrimitiveGroup *message) { static OSMPBF__PrimitiveGroup init_value = OSMPBF__PRIMITIVE_GROUP__INIT; *message = init_value; } size_t osmpbf__primitive_group__get_packed_size (const OSMPBF__PrimitiveGroup *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__primitive_group__pack (const OSMPBF__PrimitiveGroup *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__primitive_group__pack_to_buffer (const OSMPBF__PrimitiveGroup *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__PrimitiveGroup * osmpbf__primitive_group__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__PrimitiveGroup *) protobuf_c_message_unpack (&osmpbf__primitive_group__descriptor, allocator, len, data); } void osmpbf__primitive_group__free_unpacked (OSMPBF__PrimitiveGroup *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__string_table__init (OSMPBF__StringTable *message) { static OSMPBF__StringTable init_value = OSMPBF__STRING_TABLE__INIT; *message = init_value; } size_t osmpbf__string_table__get_packed_size (const OSMPBF__StringTable *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__string_table__pack (const OSMPBF__StringTable *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__string_table__pack_to_buffer (const OSMPBF__StringTable *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__StringTable * osmpbf__string_table__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__StringTable *) protobuf_c_message_unpack (&osmpbf__string_table__descriptor, allocator, len, data); } void osmpbf__string_table__free_unpacked (OSMPBF__StringTable *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__info__init (OSMPBF__Info *message) { static OSMPBF__Info init_value = OSMPBF__INFO__INIT; *message = init_value; } size_t osmpbf__info__get_packed_size (const OSMPBF__Info *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__info__pack (const OSMPBF__Info *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__info__pack_to_buffer (const OSMPBF__Info *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Info * osmpbf__info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Info *) protobuf_c_message_unpack (&osmpbf__info__descriptor, allocator, len, data); } void osmpbf__info__free_unpacked (OSMPBF__Info *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__dense_info__init (OSMPBF__DenseInfo *message) { static OSMPBF__DenseInfo init_value = OSMPBF__DENSE_INFO__INIT; *message = init_value; } size_t osmpbf__dense_info__get_packed_size (const OSMPBF__DenseInfo *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__dense_info__pack (const OSMPBF__DenseInfo *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__dense_info__pack_to_buffer (const OSMPBF__DenseInfo *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__DenseInfo * osmpbf__dense_info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__DenseInfo *) protobuf_c_message_unpack (&osmpbf__dense_info__descriptor, allocator, len, data); } void osmpbf__dense_info__free_unpacked (OSMPBF__DenseInfo *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__change_set__init (OSMPBF__ChangeSet *message) { static OSMPBF__ChangeSet init_value = OSMPBF__CHANGE_SET__INIT; *message = init_value; } size_t osmpbf__change_set__get_packed_size (const OSMPBF__ChangeSet *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__change_set__pack (const OSMPBF__ChangeSet *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__change_set__pack_to_buffer (const OSMPBF__ChangeSet *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__ChangeSet * osmpbf__change_set__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__ChangeSet *) protobuf_c_message_unpack (&osmpbf__change_set__descriptor, allocator, len, data); } void osmpbf__change_set__free_unpacked (OSMPBF__ChangeSet *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__node__init (OSMPBF__Node *message) { static OSMPBF__Node init_value = OSMPBF__NODE__INIT; *message = init_value; } size_t osmpbf__node__get_packed_size (const OSMPBF__Node *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__node__pack (const OSMPBF__Node *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__node__pack_to_buffer (const OSMPBF__Node *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Node * osmpbf__node__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Node *) protobuf_c_message_unpack (&osmpbf__node__descriptor, allocator, len, data); } void osmpbf__node__free_unpacked (OSMPBF__Node *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__dense_nodes__init (OSMPBF__DenseNodes *message) { static OSMPBF__DenseNodes init_value = OSMPBF__DENSE_NODES__INIT; *message = init_value; } size_t osmpbf__dense_nodes__get_packed_size (const OSMPBF__DenseNodes *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__dense_nodes__pack (const OSMPBF__DenseNodes *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__dense_nodes__pack_to_buffer (const OSMPBF__DenseNodes *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__DenseNodes * osmpbf__dense_nodes__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__DenseNodes *) protobuf_c_message_unpack (&osmpbf__dense_nodes__descriptor, allocator, len, data); } void osmpbf__dense_nodes__free_unpacked (OSMPBF__DenseNodes *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__way__init (OSMPBF__Way *message) { static OSMPBF__Way init_value = OSMPBF__WAY__INIT; *message = init_value; } size_t osmpbf__way__get_packed_size (const OSMPBF__Way *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__way__pack (const OSMPBF__Way *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__way__pack_to_buffer (const OSMPBF__Way *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Way * osmpbf__way__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Way *) protobuf_c_message_unpack (&osmpbf__way__descriptor, allocator, len, data); } void osmpbf__way__free_unpacked (OSMPBF__Way *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } void osmpbf__relation__init (OSMPBF__Relation *message) { static OSMPBF__Relation init_value = OSMPBF__RELATION__INIT; *message = init_value; } size_t osmpbf__relation__get_packed_size (const OSMPBF__Relation *message) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); } size_t osmpbf__relation__pack (const OSMPBF__Relation *message, uint8_t *out) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); } size_t osmpbf__relation__pack_to_buffer (const OSMPBF__Relation *message, ProtobufCBuffer *buffer) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); } OSMPBF__Relation * osmpbf__relation__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { return (OSMPBF__Relation *) protobuf_c_message_unpack (&osmpbf__relation__descriptor, allocator, len, data); } void osmpbf__relation__free_unpacked (OSMPBF__Relation *message, ProtobufCAllocator *allocator) { PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } static const ProtobufCFieldDescriptor osmpbf__header_block__field_descriptors[5] = { { "bbox", 1, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, bbox), &osmpbf__header_bbox__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "required_features", 4, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_STRING, PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, n_required_features), PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, required_features), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "optional_features", 5, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_STRING, PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, n_optional_features), PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, optional_features), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "writingprogram", 16, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_STRING, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, writingprogram), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "source", 17, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_STRING, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, source), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__header_block__field_indices_by_name[] = { 0, /* field[0] = bbox */ 2, /* field[2] = optional_features */ 1, /* field[1] = required_features */ 4, /* field[4] = source */ 3, /* field[3] = writingprogram */ }; static const ProtobufCIntRange osmpbf__header_block__number_ranges[3 + 1] = { { 1, 0 }, { 4, 1 }, { 16, 3 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__header_block__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.HeaderBlock", "HeaderBlock", "OSMPBF__HeaderBlock", "OSMPBF", sizeof(OSMPBF__HeaderBlock), 5, osmpbf__header_block__field_descriptors, osmpbf__header_block__field_indices_by_name, 3, osmpbf__header_block__number_ranges, (ProtobufCMessageInit) osmpbf__header_block__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__header_bbox__field_descriptors[4] = { { "left", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, left), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "right", 2, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, right), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "top", 3, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, top), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "bottom", 4, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, bottom), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__header_bbox__field_indices_by_name[] = { 3, /* field[3] = bottom */ 0, /* field[0] = left */ 1, /* field[1] = right */ 2, /* field[2] = top */ }; static const ProtobufCIntRange osmpbf__header_bbox__number_ranges[1 + 1] = { { 1, 0 }, { 0, 4 } }; const ProtobufCMessageDescriptor osmpbf__header_bbox__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.HeaderBBox", "HeaderBBox", "OSMPBF__HeaderBBox", "OSMPBF", sizeof(OSMPBF__HeaderBBox), 4, osmpbf__header_bbox__field_descriptors, osmpbf__header_bbox__field_indices_by_name, 1, osmpbf__header_bbox__number_ranges, (ProtobufCMessageInit) osmpbf__header_bbox__init, NULL,NULL,NULL /* reserved[123] */ }; static const int32_t osmpbf__primitive_block__granularity__default_value = 100; static const int64_t osmpbf__primitive_block__lat_offset__default_value = 0; static const int64_t osmpbf__primitive_block__lon_offset__default_value = 0; static const int32_t osmpbf__primitive_block__date_granularity__default_value = 1000; static const ProtobufCFieldDescriptor osmpbf__primitive_block__field_descriptors[6] = { { "stringtable", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, stringtable), &osmpbf__string_table__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "primitivegroup", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, n_primitivegroup), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, primitivegroup), &osmpbf__primitive_group__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "granularity", 17, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_granularity), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, granularity), NULL, &osmpbf__primitive_block__granularity__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "date_granularity", 18, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_date_granularity), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, date_granularity), NULL, &osmpbf__primitive_block__date_granularity__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lat_offset", 19, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_lat_offset), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, lat_offset), NULL, &osmpbf__primitive_block__lat_offset__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lon_offset", 20, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_lon_offset), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, lon_offset), NULL, &osmpbf__primitive_block__lon_offset__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__primitive_block__field_indices_by_name[] = { 3, /* field[3] = date_granularity */ 2, /* field[2] = granularity */ 4, /* field[4] = lat_offset */ 5, /* field[5] = lon_offset */ 1, /* field[1] = primitivegroup */ 0, /* field[0] = stringtable */ }; static const ProtobufCIntRange osmpbf__primitive_block__number_ranges[2 + 1] = { { 1, 0 }, { 17, 2 }, { 0, 6 } }; const ProtobufCMessageDescriptor osmpbf__primitive_block__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.PrimitiveBlock", "PrimitiveBlock", "OSMPBF__PrimitiveBlock", "OSMPBF", sizeof(OSMPBF__PrimitiveBlock), 6, osmpbf__primitive_block__field_descriptors, osmpbf__primitive_block__field_indices_by_name, 2, osmpbf__primitive_block__number_ranges, (ProtobufCMessageInit) osmpbf__primitive_block__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__primitive_group__field_descriptors[5] = { { "nodes", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_nodes), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, nodes), &osmpbf__node__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "dense", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, dense), &osmpbf__dense_nodes__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "ways", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_ways), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, ways), &osmpbf__way__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "relations", 4, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_relations), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, relations), &osmpbf__relation__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "changesets", 5, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_changesets), PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, changesets), &osmpbf__change_set__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__primitive_group__field_indices_by_name[] = { 4, /* field[4] = changesets */ 1, /* field[1] = dense */ 0, /* field[0] = nodes */ 3, /* field[3] = relations */ 2, /* field[2] = ways */ }; static const ProtobufCIntRange osmpbf__primitive_group__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__primitive_group__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.PrimitiveGroup", "PrimitiveGroup", "OSMPBF__PrimitiveGroup", "OSMPBF", sizeof(OSMPBF__PrimitiveGroup), 5, osmpbf__primitive_group__field_descriptors, osmpbf__primitive_group__field_indices_by_name, 1, osmpbf__primitive_group__number_ranges, (ProtobufCMessageInit) osmpbf__primitive_group__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__string_table__field_descriptors[1] = { { "s", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_OFFSETOF(OSMPBF__StringTable, n_s), PROTOBUF_C_OFFSETOF(OSMPBF__StringTable, s), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__string_table__field_indices_by_name[] = { 0, /* field[0] = s */ }; static const ProtobufCIntRange osmpbf__string_table__number_ranges[1 + 1] = { { 1, 0 }, { 0, 1 } }; const ProtobufCMessageDescriptor osmpbf__string_table__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.StringTable", "StringTable", "OSMPBF__StringTable", "OSMPBF", sizeof(OSMPBF__StringTable), 1, osmpbf__string_table__field_descriptors, osmpbf__string_table__field_indices_by_name, 1, osmpbf__string_table__number_ranges, (ProtobufCMessageInit) osmpbf__string_table__init, NULL,NULL,NULL /* reserved[123] */ }; static const int32_t osmpbf__info__version__default_value = -1; static const ProtobufCFieldDescriptor osmpbf__info__field_descriptors[5] = { { "version", 1, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_version), PROTOBUF_C_OFFSETOF(OSMPBF__Info, version), NULL, &osmpbf__info__version__default_value, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "timestamp", 2, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_timestamp), PROTOBUF_C_OFFSETOF(OSMPBF__Info, timestamp), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "changeset", 3, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_changeset), PROTOBUF_C_OFFSETOF(OSMPBF__Info, changeset), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "uid", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_uid), PROTOBUF_C_OFFSETOF(OSMPBF__Info, uid), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "user_sid", 5, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_user_sid), PROTOBUF_C_OFFSETOF(OSMPBF__Info, user_sid), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__info__field_indices_by_name[] = { 2, /* field[2] = changeset */ 1, /* field[1] = timestamp */ 3, /* field[3] = uid */ 4, /* field[4] = user_sid */ 0, /* field[0] = version */ }; static const ProtobufCIntRange osmpbf__info__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__info__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Info", "Info", "OSMPBF__Info", "OSMPBF", sizeof(OSMPBF__Info), 5, osmpbf__info__field_descriptors, osmpbf__info__field_indices_by_name, 1, osmpbf__info__number_ranges, (ProtobufCMessageInit) osmpbf__info__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__dense_info__field_descriptors[5] = { { "version", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_version), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, version), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "timestamp", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_timestamp), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, timestamp), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "changeset", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_changeset), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, changeset), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "uid", 4, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_uid), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, uid), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "user_sid", 5, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_user_sid), PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, user_sid), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__dense_info__field_indices_by_name[] = { 2, /* field[2] = changeset */ 1, /* field[1] = timestamp */ 3, /* field[3] = uid */ 4, /* field[4] = user_sid */ 0, /* field[0] = version */ }; static const ProtobufCIntRange osmpbf__dense_info__number_ranges[1 + 1] = { { 1, 0 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__dense_info__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.DenseInfo", "DenseInfo", "OSMPBF__DenseInfo", "OSMPBF", sizeof(OSMPBF__DenseInfo), 5, osmpbf__dense_info__field_descriptors, osmpbf__dense_info__field_indices_by_name, 1, osmpbf__dense_info__number_ranges, (ProtobufCMessageInit) osmpbf__dense_info__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__change_set__field_descriptors[1] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__ChangeSet, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__change_set__field_indices_by_name[] = { 0, /* field[0] = id */ }; static const ProtobufCIntRange osmpbf__change_set__number_ranges[1 + 1] = { { 1, 0 }, { 0, 1 } }; const ProtobufCMessageDescriptor osmpbf__change_set__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.ChangeSet", "ChangeSet", "OSMPBF__ChangeSet", "OSMPBF", sizeof(OSMPBF__ChangeSet), 1, osmpbf__change_set__field_descriptors, osmpbf__change_set__field_indices_by_name, 1, osmpbf__change_set__number_ranges, (ProtobufCMessageInit) osmpbf__change_set__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__node__field_descriptors[6] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Node, n_keys), PROTOBUF_C_OFFSETOF(OSMPBF__Node, keys), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "vals", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Node, n_vals), PROTOBUF_C_OFFSETOF(OSMPBF__Node, vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "info", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, info), &osmpbf__info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lat", 8, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, lat), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lon", 9, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_SINT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Node, lon), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__node__field_indices_by_name[] = { 0, /* field[0] = id */ 3, /* field[3] = info */ 1, /* field[1] = keys */ 4, /* field[4] = lat */ 5, /* field[5] = lon */ 2, /* field[2] = vals */ }; static const ProtobufCIntRange osmpbf__node__number_ranges[2 + 1] = { { 1, 0 }, { 8, 4 }, { 0, 6 } }; const ProtobufCMessageDescriptor osmpbf__node__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Node", "Node", "OSMPBF__Node", "OSMPBF", sizeof(OSMPBF__Node), 6, osmpbf__node__field_descriptors, osmpbf__node__field_indices_by_name, 2, osmpbf__node__number_ranges, (ProtobufCMessageInit) osmpbf__node__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__dense_nodes__field_descriptors[5] = { { "id", 1, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_id), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, id), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "denseinfo", 5, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, denseinfo), &osmpbf__dense_info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lat", 8, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_lat), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, lat), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "lon", 9, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_lon), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, lon), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys_vals", 10, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_keys_vals), PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, keys_vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__dense_nodes__field_indices_by_name[] = { 1, /* field[1] = denseinfo */ 0, /* field[0] = id */ 4, /* field[4] = keys_vals */ 2, /* field[2] = lat */ 3, /* field[3] = lon */ }; static const ProtobufCIntRange osmpbf__dense_nodes__number_ranges[3 + 1] = { { 1, 0 }, { 5, 1 }, { 8, 2 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__dense_nodes__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.DenseNodes", "DenseNodes", "OSMPBF__DenseNodes", "OSMPBF", sizeof(OSMPBF__DenseNodes), 5, osmpbf__dense_nodes__field_descriptors, osmpbf__dense_nodes__field_indices_by_name, 3, osmpbf__dense_nodes__number_ranges, (ProtobufCMessageInit) osmpbf__dense_nodes__init, NULL,NULL,NULL /* reserved[123] */ }; static const ProtobufCFieldDescriptor osmpbf__way__field_descriptors[5] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Way, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_keys), PROTOBUF_C_OFFSETOF(OSMPBF__Way, keys), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "vals", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_vals), PROTOBUF_C_OFFSETOF(OSMPBF__Way, vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "info", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Way, info), &osmpbf__info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "refs", 8, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_refs), PROTOBUF_C_OFFSETOF(OSMPBF__Way, refs), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__way__field_indices_by_name[] = { 0, /* field[0] = id */ 3, /* field[3] = info */ 1, /* field[1] = keys */ 4, /* field[4] = refs */ 2, /* field[2] = vals */ }; static const ProtobufCIntRange osmpbf__way__number_ranges[2 + 1] = { { 1, 0 }, { 8, 4 }, { 0, 5 } }; const ProtobufCMessageDescriptor osmpbf__way__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Way", "Way", "OSMPBF__Way", "OSMPBF", sizeof(OSMPBF__Way), 5, osmpbf__way__field_descriptors, osmpbf__way__field_indices_by_name, 2, osmpbf__way__number_ranges, (ProtobufCMessageInit) osmpbf__way__init, NULL,NULL,NULL /* reserved[123] */ }; const ProtobufCEnumValue osmpbf__relation__member_type__enum_values_by_number[3] = { { "NODE", "OSMPBF__RELATION__MEMBER_TYPE__NODE", 0 }, { "WAY", "OSMPBF__RELATION__MEMBER_TYPE__WAY", 1 }, { "RELATION", "OSMPBF__RELATION__MEMBER_TYPE__RELATION", 2 }, }; static const ProtobufCIntRange osmpbf__relation__member_type__value_ranges[] = { {0, 0},{0, 3} }; const ProtobufCEnumValueIndex osmpbf__relation__member_type__enum_values_by_name[3] = { { "NODE", 0 }, { "RELATION", 2 }, { "WAY", 1 }, }; const ProtobufCEnumDescriptor osmpbf__relation__member_type__descriptor = { PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC, "OSMPBF.Relation.MemberType", "MemberType", "OSMPBF__Relation__MemberType", "OSMPBF", 3, osmpbf__relation__member_type__enum_values_by_number, 3, osmpbf__relation__member_type__enum_values_by_name, 1, osmpbf__relation__member_type__value_ranges, NULL,NULL,NULL,NULL /* reserved[1234] */ }; static const ProtobufCFieldDescriptor osmpbf__relation__field_descriptors[7] = { { "id", 1, PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_TYPE_INT64, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Relation, id), NULL, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "keys", 2, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_keys), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, keys), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "vals", 3, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_vals), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, vals), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "info", 4, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_TYPE_MESSAGE, 0, /* quantifier_offset */ PROTOBUF_C_OFFSETOF(OSMPBF__Relation, info), &osmpbf__info__descriptor, NULL, 0, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "roles_sid", 8, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_INT32, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_roles_sid), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, roles_sid), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "memids", 9, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_memids), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, memids), NULL, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, { "types", 10, PROTOBUF_C_LABEL_REPEATED, PROTOBUF_C_TYPE_ENUM, PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_types), PROTOBUF_C_OFFSETOF(OSMPBF__Relation, types), &osmpbf__relation__member_type__descriptor, NULL, 1, /* packed */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, }; static const unsigned osmpbf__relation__field_indices_by_name[] = { 0, /* field[0] = id */ 3, /* field[3] = info */ 1, /* field[1] = keys */ 5, /* field[5] = memids */ 4, /* field[4] = roles_sid */ 6, /* field[6] = types */ 2, /* field[2] = vals */ }; static const ProtobufCIntRange osmpbf__relation__number_ranges[2 + 1] = { { 1, 0 }, { 8, 4 }, { 0, 7 } }; const ProtobufCMessageDescriptor osmpbf__relation__descriptor = { PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, "OSMPBF.Relation", "Relation", "OSMPBF__Relation", "OSMPBF", sizeof(OSMPBF__Relation), 7, osmpbf__relation__field_descriptors, osmpbf__relation__field_indices_by_name, 2, osmpbf__relation__number_ranges, (ProtobufCMessageInit) osmpbf__relation__init, NULL,NULL,NULL /* reserved[123] */ }; navit-0.5.0+dfsg.1/navit/maptool/generated-code/osmformat.pb-c.h000066400000000000000000000441461264204753600243770ustar00rootroot00000000000000/* Generated by the protocol buffer compiler. DO NOT EDIT! */ #ifndef PROTOBUF_C_osmformat_2eproto__INCLUDED #define PROTOBUF_C_osmformat_2eproto__INCLUDED #include PROTOBUF_C_BEGIN_DECLS typedef struct _OSMPBF__HeaderBlock OSMPBF__HeaderBlock; typedef struct _OSMPBF__HeaderBBox OSMPBF__HeaderBBox; typedef struct _OSMPBF__PrimitiveBlock OSMPBF__PrimitiveBlock; typedef struct _OSMPBF__PrimitiveGroup OSMPBF__PrimitiveGroup; typedef struct _OSMPBF__StringTable OSMPBF__StringTable; typedef struct _OSMPBF__Info OSMPBF__Info; typedef struct _OSMPBF__DenseInfo OSMPBF__DenseInfo; typedef struct _OSMPBF__ChangeSet OSMPBF__ChangeSet; typedef struct _OSMPBF__Node OSMPBF__Node; typedef struct _OSMPBF__DenseNodes OSMPBF__DenseNodes; typedef struct _OSMPBF__Way OSMPBF__Way; typedef struct _OSMPBF__Relation OSMPBF__Relation; /* --- enums --- */ typedef enum _OSMPBF__Relation__MemberType { OSMPBF__RELATION__MEMBER_TYPE__NODE = 0, OSMPBF__RELATION__MEMBER_TYPE__WAY = 1, OSMPBF__RELATION__MEMBER_TYPE__RELATION = 2 } OSMPBF__Relation__MemberType; /* --- messages --- */ struct _OSMPBF__HeaderBlock { ProtobufCMessage base; OSMPBF__HeaderBBox *bbox; size_t n_required_features; char **required_features; size_t n_optional_features; char **optional_features; char *writingprogram; char *source; }; #define OSMPBF__HEADER_BLOCK__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__header_block__descriptor) \ , NULL, 0,NULL, 0,NULL, NULL, NULL } struct _OSMPBF__HeaderBBox { ProtobufCMessage base; int64_t left; int64_t right; int64_t top; int64_t bottom; }; #define OSMPBF__HEADER_BBOX__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__header_bbox__descriptor) \ , 0, 0, 0, 0 } struct _OSMPBF__PrimitiveBlock { ProtobufCMessage base; OSMPBF__StringTable *stringtable; size_t n_primitivegroup; OSMPBF__PrimitiveGroup **primitivegroup; protobuf_c_boolean has_granularity; int32_t granularity; protobuf_c_boolean has_lat_offset; int64_t lat_offset; protobuf_c_boolean has_lon_offset; int64_t lon_offset; protobuf_c_boolean has_date_granularity; int32_t date_granularity; }; #define OSMPBF__PRIMITIVE_BLOCK__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__primitive_block__descriptor) \ , NULL, 0,NULL, 0,100, 0,0, 0,0, 0,1000 } struct _OSMPBF__PrimitiveGroup { ProtobufCMessage base; size_t n_nodes; OSMPBF__Node **nodes; OSMPBF__DenseNodes *dense; size_t n_ways; OSMPBF__Way **ways; size_t n_relations; OSMPBF__Relation **relations; size_t n_changesets; OSMPBF__ChangeSet **changesets; }; #define OSMPBF__PRIMITIVE_GROUP__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__primitive_group__descriptor) \ , 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } struct _OSMPBF__StringTable { ProtobufCMessage base; size_t n_s; ProtobufCBinaryData *s; }; #define OSMPBF__STRING_TABLE__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__string_table__descriptor) \ , 0,NULL } struct _OSMPBF__Info { ProtobufCMessage base; protobuf_c_boolean has_version; int32_t version; protobuf_c_boolean has_timestamp; int64_t timestamp; protobuf_c_boolean has_changeset; int64_t changeset; protobuf_c_boolean has_uid; int32_t uid; protobuf_c_boolean has_user_sid; uint32_t user_sid; }; #define OSMPBF__INFO__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__info__descriptor) \ , 0,-1, 0,0, 0,0, 0,0, 0,0 } struct _OSMPBF__DenseInfo { ProtobufCMessage base; size_t n_version; int32_t *version; size_t n_timestamp; int64_t *timestamp; size_t n_changeset; int64_t *changeset; size_t n_uid; int32_t *uid; size_t n_user_sid; int32_t *user_sid; }; #define OSMPBF__DENSE_INFO__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__dense_info__descriptor) \ , 0,NULL, 0,NULL, 0,NULL, 0,NULL, 0,NULL } struct _OSMPBF__ChangeSet { ProtobufCMessage base; int64_t id; }; #define OSMPBF__CHANGE_SET__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__change_set__descriptor) \ , 0 } struct _OSMPBF__Node { ProtobufCMessage base; int64_t id; size_t n_keys; uint32_t *keys; size_t n_vals; uint32_t *vals; OSMPBF__Info *info; int64_t lat; int64_t lon; }; #define OSMPBF__NODE__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__node__descriptor) \ , 0, 0,NULL, 0,NULL, NULL, 0, 0 } struct _OSMPBF__DenseNodes { ProtobufCMessage base; size_t n_id; int64_t *id; OSMPBF__DenseInfo *denseinfo; size_t n_lat; int64_t *lat; size_t n_lon; int64_t *lon; size_t n_keys_vals; int32_t *keys_vals; }; #define OSMPBF__DENSE_NODES__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__dense_nodes__descriptor) \ , 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } struct _OSMPBF__Way { ProtobufCMessage base; int64_t id; size_t n_keys; uint32_t *keys; size_t n_vals; uint32_t *vals; OSMPBF__Info *info; size_t n_refs; int64_t *refs; }; #define OSMPBF__WAY__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__way__descriptor) \ , 0, 0,NULL, 0,NULL, NULL, 0,NULL } struct _OSMPBF__Relation { ProtobufCMessage base; int64_t id; size_t n_keys; uint32_t *keys; size_t n_vals; uint32_t *vals; OSMPBF__Info *info; size_t n_roles_sid; int32_t *roles_sid; size_t n_memids; int64_t *memids; size_t n_types; OSMPBF__Relation__MemberType *types; }; #define OSMPBF__RELATION__INIT \ { PROTOBUF_C_MESSAGE_INIT (&osmpbf__relation__descriptor) \ , 0, 0,NULL, 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } /* OSMPBF__HeaderBlock methods */ void osmpbf__header_block__init (OSMPBF__HeaderBlock *message); size_t osmpbf__header_block__get_packed_size (const OSMPBF__HeaderBlock *message); size_t osmpbf__header_block__pack (const OSMPBF__HeaderBlock *message, uint8_t *out); size_t osmpbf__header_block__pack_to_buffer (const OSMPBF__HeaderBlock *message, ProtobufCBuffer *buffer); OSMPBF__HeaderBlock * osmpbf__header_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__header_block__free_unpacked (OSMPBF__HeaderBlock *message, ProtobufCAllocator *allocator); /* OSMPBF__HeaderBBox methods */ void osmpbf__header_bbox__init (OSMPBF__HeaderBBox *message); size_t osmpbf__header_bbox__get_packed_size (const OSMPBF__HeaderBBox *message); size_t osmpbf__header_bbox__pack (const OSMPBF__HeaderBBox *message, uint8_t *out); size_t osmpbf__header_bbox__pack_to_buffer (const OSMPBF__HeaderBBox *message, ProtobufCBuffer *buffer); OSMPBF__HeaderBBox * osmpbf__header_bbox__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__header_bbox__free_unpacked (OSMPBF__HeaderBBox *message, ProtobufCAllocator *allocator); /* OSMPBF__PrimitiveBlock methods */ void osmpbf__primitive_block__init (OSMPBF__PrimitiveBlock *message); size_t osmpbf__primitive_block__get_packed_size (const OSMPBF__PrimitiveBlock *message); size_t osmpbf__primitive_block__pack (const OSMPBF__PrimitiveBlock *message, uint8_t *out); size_t osmpbf__primitive_block__pack_to_buffer (const OSMPBF__PrimitiveBlock *message, ProtobufCBuffer *buffer); OSMPBF__PrimitiveBlock * osmpbf__primitive_block__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__primitive_block__free_unpacked (OSMPBF__PrimitiveBlock *message, ProtobufCAllocator *allocator); /* OSMPBF__PrimitiveGroup methods */ void osmpbf__primitive_group__init (OSMPBF__PrimitiveGroup *message); size_t osmpbf__primitive_group__get_packed_size (const OSMPBF__PrimitiveGroup *message); size_t osmpbf__primitive_group__pack (const OSMPBF__PrimitiveGroup *message, uint8_t *out); size_t osmpbf__primitive_group__pack_to_buffer (const OSMPBF__PrimitiveGroup *message, ProtobufCBuffer *buffer); OSMPBF__PrimitiveGroup * osmpbf__primitive_group__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__primitive_group__free_unpacked (OSMPBF__PrimitiveGroup *message, ProtobufCAllocator *allocator); /* OSMPBF__StringTable methods */ void osmpbf__string_table__init (OSMPBF__StringTable *message); size_t osmpbf__string_table__get_packed_size (const OSMPBF__StringTable *message); size_t osmpbf__string_table__pack (const OSMPBF__StringTable *message, uint8_t *out); size_t osmpbf__string_table__pack_to_buffer (const OSMPBF__StringTable *message, ProtobufCBuffer *buffer); OSMPBF__StringTable * osmpbf__string_table__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__string_table__free_unpacked (OSMPBF__StringTable *message, ProtobufCAllocator *allocator); /* OSMPBF__Info methods */ void osmpbf__info__init (OSMPBF__Info *message); size_t osmpbf__info__get_packed_size (const OSMPBF__Info *message); size_t osmpbf__info__pack (const OSMPBF__Info *message, uint8_t *out); size_t osmpbf__info__pack_to_buffer (const OSMPBF__Info *message, ProtobufCBuffer *buffer); OSMPBF__Info * osmpbf__info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__info__free_unpacked (OSMPBF__Info *message, ProtobufCAllocator *allocator); /* OSMPBF__DenseInfo methods */ void osmpbf__dense_info__init (OSMPBF__DenseInfo *message); size_t osmpbf__dense_info__get_packed_size (const OSMPBF__DenseInfo *message); size_t osmpbf__dense_info__pack (const OSMPBF__DenseInfo *message, uint8_t *out); size_t osmpbf__dense_info__pack_to_buffer (const OSMPBF__DenseInfo *message, ProtobufCBuffer *buffer); OSMPBF__DenseInfo * osmpbf__dense_info__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__dense_info__free_unpacked (OSMPBF__DenseInfo *message, ProtobufCAllocator *allocator); /* OSMPBF__ChangeSet methods */ void osmpbf__change_set__init (OSMPBF__ChangeSet *message); size_t osmpbf__change_set__get_packed_size (const OSMPBF__ChangeSet *message); size_t osmpbf__change_set__pack (const OSMPBF__ChangeSet *message, uint8_t *out); size_t osmpbf__change_set__pack_to_buffer (const OSMPBF__ChangeSet *message, ProtobufCBuffer *buffer); OSMPBF__ChangeSet * osmpbf__change_set__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__change_set__free_unpacked (OSMPBF__ChangeSet *message, ProtobufCAllocator *allocator); /* OSMPBF__Node methods */ void osmpbf__node__init (OSMPBF__Node *message); size_t osmpbf__node__get_packed_size (const OSMPBF__Node *message); size_t osmpbf__node__pack (const OSMPBF__Node *message, uint8_t *out); size_t osmpbf__node__pack_to_buffer (const OSMPBF__Node *message, ProtobufCBuffer *buffer); OSMPBF__Node * osmpbf__node__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__node__free_unpacked (OSMPBF__Node *message, ProtobufCAllocator *allocator); /* OSMPBF__DenseNodes methods */ void osmpbf__dense_nodes__init (OSMPBF__DenseNodes *message); size_t osmpbf__dense_nodes__get_packed_size (const OSMPBF__DenseNodes *message); size_t osmpbf__dense_nodes__pack (const OSMPBF__DenseNodes *message, uint8_t *out); size_t osmpbf__dense_nodes__pack_to_buffer (const OSMPBF__DenseNodes *message, ProtobufCBuffer *buffer); OSMPBF__DenseNodes * osmpbf__dense_nodes__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__dense_nodes__free_unpacked (OSMPBF__DenseNodes *message, ProtobufCAllocator *allocator); /* OSMPBF__Way methods */ void osmpbf__way__init (OSMPBF__Way *message); size_t osmpbf__way__get_packed_size (const OSMPBF__Way *message); size_t osmpbf__way__pack (const OSMPBF__Way *message, uint8_t *out); size_t osmpbf__way__pack_to_buffer (const OSMPBF__Way *message, ProtobufCBuffer *buffer); OSMPBF__Way * osmpbf__way__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__way__free_unpacked (OSMPBF__Way *message, ProtobufCAllocator *allocator); /* OSMPBF__Relation methods */ void osmpbf__relation__init (OSMPBF__Relation *message); size_t osmpbf__relation__get_packed_size (const OSMPBF__Relation *message); size_t osmpbf__relation__pack (const OSMPBF__Relation *message, uint8_t *out); size_t osmpbf__relation__pack_to_buffer (const OSMPBF__Relation *message, ProtobufCBuffer *buffer); OSMPBF__Relation * osmpbf__relation__unpack (ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void osmpbf__relation__free_unpacked (OSMPBF__Relation *message, ProtobufCAllocator *allocator); /* --- per-message closures --- */ typedef void (*OSMPBF__HeaderBlock_Closure) (const OSMPBF__HeaderBlock *message, void *closure_data); typedef void (*OSMPBF__HeaderBBox_Closure) (const OSMPBF__HeaderBBox *message, void *closure_data); typedef void (*OSMPBF__PrimitiveBlock_Closure) (const OSMPBF__PrimitiveBlock *message, void *closure_data); typedef void (*OSMPBF__PrimitiveGroup_Closure) (const OSMPBF__PrimitiveGroup *message, void *closure_data); typedef void (*OSMPBF__StringTable_Closure) (const OSMPBF__StringTable *message, void *closure_data); typedef void (*OSMPBF__Info_Closure) (const OSMPBF__Info *message, void *closure_data); typedef void (*OSMPBF__DenseInfo_Closure) (const OSMPBF__DenseInfo *message, void *closure_data); typedef void (*OSMPBF__ChangeSet_Closure) (const OSMPBF__ChangeSet *message, void *closure_data); typedef void (*OSMPBF__Node_Closure) (const OSMPBF__Node *message, void *closure_data); typedef void (*OSMPBF__DenseNodes_Closure) (const OSMPBF__DenseNodes *message, void *closure_data); typedef void (*OSMPBF__Way_Closure) (const OSMPBF__Way *message, void *closure_data); typedef void (*OSMPBF__Relation_Closure) (const OSMPBF__Relation *message, void *closure_data); /* --- services --- */ /* --- descriptors --- */ extern const ProtobufCMessageDescriptor osmpbf__header_block__descriptor; extern const ProtobufCMessageDescriptor osmpbf__header_bbox__descriptor; extern const ProtobufCMessageDescriptor osmpbf__primitive_block__descriptor; extern const ProtobufCMessageDescriptor osmpbf__primitive_group__descriptor; extern const ProtobufCMessageDescriptor osmpbf__string_table__descriptor; extern const ProtobufCMessageDescriptor osmpbf__info__descriptor; extern const ProtobufCMessageDescriptor osmpbf__dense_info__descriptor; extern const ProtobufCMessageDescriptor osmpbf__change_set__descriptor; extern const ProtobufCMessageDescriptor osmpbf__node__descriptor; extern const ProtobufCMessageDescriptor osmpbf__dense_nodes__descriptor; extern const ProtobufCMessageDescriptor osmpbf__way__descriptor; extern const ProtobufCMessageDescriptor osmpbf__relation__descriptor; extern const ProtobufCEnumDescriptor osmpbf__relation__member_type__descriptor; PROTOBUF_C_END_DECLS #endif /* PROTOBUF_osmformat_2eproto__INCLUDED */ navit-0.5.0+dfsg.1/navit/maptool/google/000077500000000000000000000000001264204753600177745ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/maptool/google/protobuf-c/000077500000000000000000000000001264204753600220545ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/maptool/google/protobuf-c/protobuf-c-private.h000066400000000000000000000054411264204753600257610ustar00rootroot00000000000000/* --- protobuf-c-private.h: private structures and functions --- */ /* * Copyright 2008, Dave Benson. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License * at http://www.apache.org/licenses/LICENSE-2.0 Unless * required by applicable law or agreed to in writing, * software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* === needs to be declared for the PROTOBUF_C_BUFFER_SIMPLE_INIT macro === */ void protobuf_c_buffer_simple_append (ProtobufCBuffer *buffer, size_t len, const unsigned char *data); /* === stuff which needs to be declared for use in the generated code === */ struct _ProtobufCEnumValueIndex { const char *name; unsigned index; /* into values[] array */ }; /* IntRange: helper structure for optimizing int => index lookups in the case where the keys are mostly consecutive values, as they presumably are for enums and fields. The data structures assumes that the values in the original array are sorted */ struct _ProtobufCIntRange { int start_value; unsigned orig_index; /* NOTE: the number of values in the range can be inferred by looking at the next element's orig_index. a dummy element is added to make this simple */ }; /* === declared for exposition on ProtobufCIntRange === */ /* note: ranges must have an extra sentinel IntRange at the end whose orig_index is set to the number of actual values in the original array */ /* returns -1 if no orig_index found */ int protobuf_c_int_ranges_lookup (unsigned n_ranges, ProtobufCIntRange *ranges); #define PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC 0x14159bc3 #define PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC 0x28aaeef9 #define PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC 0x114315af /* === behind the scenes on the generated service's __init functions */ typedef void (*ProtobufCServiceDestroy) (ProtobufCService *service); void protobuf_c_service_generated_init (ProtobufCService *service, const ProtobufCServiceDescriptor *descriptor, ProtobufCServiceDestroy destroy); void protobuf_c_service_invoke_internal(ProtobufCService *service, unsigned method_index, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data); navit-0.5.0+dfsg.1/navit/maptool/google/protobuf-c/protobuf-c.c000066400000000000000000002347501264204753600243130ustar00rootroot00000000000000/* --- protobuf-c.c: public protobuf c runtime implementation --- */ /* * Copyright 2008, Dave Benson. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License * at http://www.apache.org/licenses/LICENSE-2.0 Unless * required by applicable law or agreed to in writing, * software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* TODO items: * 64-BIT OPTIMIZATION: certain implementations use 32-bit math even on 64-bit platforms (uint64_size, uint64_pack, parse_uint64) * get_packed_size and pack seem to use type-prefixed names, whereas parse uses type-suffixed names. pick one and stick with it. Decision: go with type-suffixed, since the type (or its instance) is typically the object of the verb. NOTE: perhaps the "parse" methods should be reanemd to "unpack" at the same time. (this only affects internal (static) functions) * use TRUE and FALSE instead of 1 and 0 as appropriate * use size_t consistently */ #include /* for occasional printf()s */ #include /* for abort(), malloc() etc */ #include /* for strlen(), memcpy(), memmove() */ #ifndef PRINT_UNPACK_ERRORS #define PRINT_UNPACK_ERRORS 1 #endif #include "protobuf-c.h" #define MAX_UINT64_ENCODED_SIZE 10 /* convenience macros */ #define TMPALLOC(allocator, size) ((allocator)->tmp_alloc ((allocator)->allocator_data, (size))) #define FREE(allocator, ptr) \ do { if ((ptr) != NULL) ((allocator)->free ((allocator)->allocator_data, (ptr))); } while(0) #define UNALIGNED_ALLOC(allocator, size) ALLOC (allocator, size) /* placeholder */ #define STRUCT_MEMBER_P(struct_p, struct_offset) \ ((void *) ((uint8_t*) (struct_p) + (struct_offset))) #define STRUCT_MEMBER(member_type, struct_p, struct_offset) \ (*(member_type*) STRUCT_MEMBER_P ((struct_p), (struct_offset))) #define STRUCT_MEMBER_PTR(member_type, struct_p, struct_offset) \ ((member_type*) STRUCT_MEMBER_P ((struct_p), (struct_offset))) #define TRUE 1 #define FALSE 0 static void alloc_failed_warning (unsigned size, const char *filename, unsigned line) { fprintf (stderr, "WARNING: out-of-memory allocating a block of size %u (%s:%u)\n", size, filename, line); } /* Try to allocate memory, running some special code if it fails. */ #define DO_ALLOC(dst, allocator, size, fail_code) \ { size_t da__allocation_size = (size); \ if (da__allocation_size == 0) \ dst = NULL; \ else if ((dst=((allocator)->alloc ((allocator)->allocator_data, \ da__allocation_size))) == NULL) \ { \ alloc_failed_warning (da__allocation_size, __FILE__, __LINE__); \ fail_code; \ } \ } #define DO_UNALIGNED_ALLOC DO_ALLOC /* placeholder */ #define ASSERT_IS_ENUM_DESCRIPTOR(desc) \ assert((desc)->magic == PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC) #define ASSERT_IS_MESSAGE_DESCRIPTOR(desc) \ assert((desc)->magic == PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC) #define ASSERT_IS_MESSAGE(message) \ ASSERT_IS_MESSAGE_DESCRIPTOR((message)->descriptor) #define ASSERT_IS_SERVICE_DESCRIPTOR(desc) \ assert((desc)->magic == PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC) /* --- allocator --- */ static void protobuf_c_out_of_memory_default (void) { fprintf (stderr, "Out Of Memory!!!\n"); abort (); } void (*protobuf_c_out_of_memory) (void) = protobuf_c_out_of_memory_default; static void *system_alloc(void *allocator_data, size_t size) { void *rv; (void) allocator_data; if (size == 0) return NULL; rv = malloc (size); if (rv == NULL) protobuf_c_out_of_memory (); return rv; } static void system_free (void *allocator_data, void *data) { (void) allocator_data; if (data) free (data); } /* Some users may configure the default allocator; providing your own allocator to unpack() is prefered. this allocator is still used for packing nested messages. */ ProtobufCAllocator protobuf_c_default_allocator = { system_alloc, system_free, NULL, 8192, NULL }; /* Users should NOT modify this structure, but it's difficult to prevent. please modify protobuf_c_default_allocator instead. */ ProtobufCAllocator protobuf_c_system_allocator = { system_alloc, system_free, NULL, 8192, NULL }; /* === buffer-simple === */ void protobuf_c_buffer_simple_append (ProtobufCBuffer *buffer, size_t len, const uint8_t *data) { ProtobufCBufferSimple *simp = (ProtobufCBufferSimple *) buffer; size_t new_len = simp->len + len; if (new_len > simp->alloced) { size_t new_alloced = simp->alloced * 2; uint8_t *new_data; while (new_alloced < new_len) new_alloced += new_alloced; DO_ALLOC (new_data, &protobuf_c_default_allocator, new_alloced, return); memcpy (new_data, simp->data, simp->len); if (simp->must_free_data) FREE (&protobuf_c_default_allocator, simp->data); else simp->must_free_data = 1; simp->data = new_data; simp->alloced = new_alloced; } memcpy (simp->data + simp->len, data, len); simp->len = new_len; } /* === get_packed_size() === */ /* Return the number of bytes required to store the tag for the field (which includes 3 bits for the wire-type, and a single bit that denotes the end-of-tag. */ static inline size_t get_tag_size (unsigned number) { if (number < (1<<4)) return 1; else if (number < (1<<11)) return 2; else if (number < (1<<18)) return 3; else if (number < (1<<25)) return 4; else return 5; } /* Return the number of bytes required to store a variable-length unsigned integer that fits in 32-bit uint in base-128 encoding. */ static inline size_t uint32_size (uint32_t v) { if (v < (1<<7)) return 1; else if (v < (1<<14)) return 2; else if (v < (1<<21)) return 3; else if (v < (1<<28)) return 4; else return 5; } /* Return the number of bytes required to store a variable-length signed integer that fits in 32-bit int in base-128 encoding. */ static inline size_t int32_size (int32_t v) { if (v < 0) return 10; else if (v < (1<<7)) return 1; else if (v < (1<<14)) return 2; else if (v < (1<<21)) return 3; else if (v < (1<<28)) return 4; else return 5; } /* return the zigzag-encoded 32-bit unsigned int from a 32-bit signed int */ static inline uint32_t zigzag32 (int32_t v) { if (v < 0) return ((uint32_t)(-v)) * 2 - 1; else return v * 2; } /* Return the number of bytes required to store a variable-length signed integer that fits in 32-bit int, converted to unsigned via the zig-zag algorithm, then packed using base-128 encoding. */ static inline size_t sint32_size (int32_t v) { return uint32_size(zigzag32(v)); } /* Return the number of bytes required to store a variable-length unsigned integer that fits in 64-bit uint in base-128 encoding. */ static inline size_t uint64_size (uint64_t v) { uint32_t upper_v = (v>>32); if (upper_v == 0) return uint32_size ((uint32_t)v); else if (upper_v < (1<<3)) return 5; else if (upper_v < (1<<10)) return 6; else if (upper_v < (1<<17)) return 7; else if (upper_v < (1<<24)) return 8; else if (upper_v < (1U<<31)) return 9; else return 10; } /* return the zigzag-encoded 64-bit unsigned int from a 64-bit signed int */ static inline uint64_t zigzag64 (int64_t v) { if (v < 0) return ((uint64_t)(-v)) * 2 - 1; else return v * 2; } /* Return the number of bytes required to store a variable-length signed integer that fits in 64-bit int, converted to unsigned via the zig-zag algorithm, then packed using base-128 encoding. */ static inline size_t sint64_size (int64_t v) { return uint64_size(zigzag64(v)); } /* Get serialized size of a single field in the message, including the space needed by the identifying tag. */ static size_t required_field_get_packed_size (const ProtobufCFieldDescriptor *field, const void *member) { size_t rv = get_tag_size (field->id); switch (field->type) { case PROTOBUF_C_TYPE_SINT32: return rv + sint32_size (*(const int32_t *) member); case PROTOBUF_C_TYPE_INT32: return rv + int32_size (*(const uint32_t *) member); case PROTOBUF_C_TYPE_UINT32: return rv + uint32_size (*(const uint32_t *) member); case PROTOBUF_C_TYPE_SINT64: return rv + sint64_size (*(const int64_t *) member); case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: return rv + uint64_size (*(const uint64_t *) member); case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: return rv + 4; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: return rv + 8; case PROTOBUF_C_TYPE_BOOL: return rv + 1; case PROTOBUF_C_TYPE_FLOAT: return rv + 4; case PROTOBUF_C_TYPE_DOUBLE: return rv + 8; case PROTOBUF_C_TYPE_ENUM: // TODO: is this correct for negative-valued enums? return rv + uint32_size (*(const uint32_t *) member); case PROTOBUF_C_TYPE_STRING: { const char *str = *(char * const *) member; size_t len = str ? strlen (str) : 0; return rv + uint32_size (len) + len; } case PROTOBUF_C_TYPE_BYTES: { size_t len = ((const ProtobufCBinaryData*) member)->len; return rv + uint32_size (len) + len; } //case PROTOBUF_C_TYPE_GROUP: case PROTOBUF_C_TYPE_MESSAGE: { const ProtobufCMessage *msg = * (ProtobufCMessage * const *) member; size_t subrv = msg ? protobuf_c_message_get_packed_size (msg) : 0; return rv + uint32_size (subrv) + subrv; } } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } /* Get serialized size of a single optional field in the message, including the space needed by the identifying tag. Returns 0 if the optional field isn't set. */ static size_t optional_field_get_packed_size (const ProtobufCFieldDescriptor *field, const protobuf_c_boolean *has, const void *member) { if (field->type == PROTOBUF_C_TYPE_MESSAGE || field->type == PROTOBUF_C_TYPE_STRING) { const void *ptr = * (const void * const *) member; if (ptr == NULL || ptr == field->default_value) return 0; } else { if (!*has) return 0; } return required_field_get_packed_size (field, member); } /* Get serialized size of a repeated field in the message, which may consist of any number of values (including 0). Includes the space needed by the identifying tags (as needed). */ static size_t repeated_field_get_packed_size (const ProtobufCFieldDescriptor *field, size_t count, const void *member) { size_t header_size; size_t rv = 0; unsigned i; void *array = * (void * const *) member; if (count == 0) return 0; header_size = get_tag_size (field->id); if (!field->packed) header_size *= count; switch (field->type) { case PROTOBUF_C_TYPE_SINT32: for (i = 0; i < count; i++) rv += sint32_size (((int32_t*)array)[i]); break; case PROTOBUF_C_TYPE_INT32: for (i = 0; i < count; i++) rv += int32_size (((uint32_t*)array)[i]); break; case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_ENUM: for (i = 0; i < count; i++) rv += uint32_size (((uint32_t*)array)[i]); break; case PROTOBUF_C_TYPE_SINT64: for (i = 0; i < count; i++) rv += sint64_size (((int64_t*)array)[i]); break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: for (i = 0; i < count; i++) rv += uint64_size (((uint64_t*)array)[i]); break; case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: rv += 4 * count; break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: rv += 8 * count; break; case PROTOBUF_C_TYPE_BOOL: rv += count; break; case PROTOBUF_C_TYPE_STRING: for (i = 0; i < count; i++) { size_t len = strlen (((char**) array)[i]); rv += uint32_size (len) + len; } break; case PROTOBUF_C_TYPE_BYTES: for (i = 0; i < count; i++) { size_t len = ((ProtobufCBinaryData*) array)[i].len; rv += uint32_size (len) + len; } break; case PROTOBUF_C_TYPE_MESSAGE: for (i = 0; i < count; i++) { size_t len = protobuf_c_message_get_packed_size (((ProtobufCMessage **) array)[i]); rv += uint32_size (len) + len; } break; //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED } if (field->packed) header_size += uint32_size (rv); return header_size + rv; } /* Get the packed size of a unknown field (meaning one that is passed through mostly uninterpreted... this is done for forward compatibilty with the addition of new fields). */ static inline size_t unknown_field_get_packed_size (const ProtobufCMessageUnknownField *field) { return get_tag_size (field->tag) + field->len; } /* Get the number of bytes that the message will occupy once serialized. */ size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message) { unsigned i; size_t rv = 0; ASSERT_IS_MESSAGE (message); for (i = 0; i < message->descriptor->n_fields; i++) { const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; const void *member = ((const char *) message) + field->offset; const void *qmember = ((const char *) message) + field->quantifier_offset; if (field->label == PROTOBUF_C_LABEL_REQUIRED) rv += required_field_get_packed_size (field, member); else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) rv += optional_field_get_packed_size (field, qmember, member); else rv += repeated_field_get_packed_size (field, * (const size_t *) qmember, member); } for (i = 0; i < message->n_unknown_fields; i++) rv += unknown_field_get_packed_size (&message->unknown_fields[i]); return rv; } /* === pack() === */ /* Pack an unsigned 32-bit integer in base-128 encoding, and return the number of bytes needed: this will be 5 or less. */ static inline size_t uint32_pack (uint32_t value, uint8_t *out) { unsigned rv = 0; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; if (value >= 0x80) { out[rv++] = value | 0x80; value >>= 7; } } } } /* assert: value<128 */ out[rv++] = value; return rv; } /* Pack a 32-bit signed integer, returning the number of bytes needed. Negative numbers are packed as twos-complement 64-bit integers. */ static inline size_t int32_pack (int32_t value, uint8_t *out) { if (value < 0) { out[0] = value | 0x80; out[1] = (value>>7) | 0x80; out[2] = (value>>14) | 0x80; out[3] = (value>>21) | 0x80; out[4] = (value>>28) | 0x80; out[5] = out[6] = out[7] = out[8] = 0xff; out[9] = 0x01; return 10; } else return uint32_pack (value, out); } /* Pack a 32-bit integer in zigwag encoding. */ static inline size_t sint32_pack (int32_t value, uint8_t *out) { return uint32_pack (zigzag32 (value), out); } /* Pack a 64-bit unsigned integer that fits in a 64-bit uint, using base-128 encoding. */ static size_t uint64_pack (uint64_t value, uint8_t *out) { uint32_t hi = value>>32; uint32_t lo = value; unsigned rv; if (hi == 0) return uint32_pack ((uint32_t)lo, out); out[0] = (lo) | 0x80; out[1] = (lo>>7) | 0x80; out[2] = (lo>>14) | 0x80; out[3] = (lo>>21) | 0x80; if (hi < 8) { out[4] = (hi<<4) | (lo>>28); return 5; } else { out[4] = ((hi&7)<<4) | (lo>>28) | 0x80; hi >>= 3; } rv = 5; while (hi >= 128) { out[rv++] = hi | 0x80; hi >>= 7; } out[rv++] = hi; return rv; } /* Pack a 64-bit signed integer in zigzan encoding, return the size of the packed output. (Max returned value is 10) */ static inline size_t sint64_pack (int64_t value, uint8_t *out) { return uint64_pack (zigzag64 (value), out); } /* Pack a 32-bit value, little-endian. Used for fixed32, sfixed32, float) */ static inline size_t fixed32_pack (uint32_t value, uint8_t *out) { #ifdef IS_LITTLE_ENDIAN memcpy (out, &value, 4); #else out[0] = value; out[1] = value>>8; out[2] = value>>16; out[3] = value>>24; #endif return 4; } /* Pack a 64-bit fixed-length value. (Used for fixed64, sfixed64, double) */ /* XXX: the big-endian impl is really only good for 32-bit machines, a 64-bit version would be appreciated, plus a way to decide to use 64-bit math where convenient. */ static inline size_t fixed64_pack (uint64_t value, uint8_t *out) { #ifdef IS_LITTLE_ENDIAN memcpy (out, &value, 8); #else fixed32_pack (value, out); fixed32_pack (value>>32, out+4); #endif return 8; } /* Pack a boolean as 0 or 1, even though the protobuf_c_boolean can really assume any integer value. */ /* XXX: perhaps on some platforms "*out = !!value" would be a better impl, b/c that is idiotmatic c++ in some stl impls. */ static inline size_t boolean_pack (protobuf_c_boolean value, uint8_t *out) { *out = value ? 1 : 0; return 1; } /* Pack a length-prefixed string. The input string is NUL-terminated. The NULL pointer is treated as an empty string. This isn't really necessary, but it allows people to leave required strings blank. (See Issue 13 in the bug tracker for a little more explanation). */ static inline size_t string_pack (const char * str, uint8_t *out) { if (str == NULL) { out[0] = 0; return 1; } else { size_t len = strlen (str); size_t rv = uint32_pack (len, out); memcpy (out + rv, str, len); return rv + len; } } static inline size_t binary_data_pack (const ProtobufCBinaryData *bd, uint8_t *out) { size_t len = bd->len; size_t rv = uint32_pack (len, out); memcpy (out + rv, bd->data, len); return rv + len; } static inline size_t prefixed_message_pack (const ProtobufCMessage *message, uint8_t *out) { if (message == NULL) { out[0] = 0; return 1; } else { size_t rv = protobuf_c_message_pack (message, out + 1); uint32_t rv_packed_size = uint32_size (rv); if (rv_packed_size != 1) memmove (out + rv_packed_size, out + 1, rv); return uint32_pack (rv, out) + rv; } } /* wire-type will be added in required_field_pack() */ /* XXX: just call uint64_pack on 64-bit platforms. */ static size_t tag_pack (uint32_t id, uint8_t *out) { if (id < (1<<(32-3))) return uint32_pack (id<<3, out); else return uint64_pack (((uint64_t)id) << 3, out); } static size_t required_field_pack (const ProtobufCFieldDescriptor *field, const void *member, uint8_t *out) { size_t rv = tag_pack (field->id, out); switch (field->type) { case PROTOBUF_C_TYPE_SINT32: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + sint32_pack (*(const int32_t *) member, out + rv); case PROTOBUF_C_TYPE_INT32: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + int32_pack (*(const uint32_t *) member, out + rv); case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_ENUM: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + uint32_pack (*(const uint32_t *) member, out + rv); case PROTOBUF_C_TYPE_SINT64: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + sint64_pack (*(const int64_t *) member, out + rv); case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + uint64_pack (*(const uint64_t *) member, out + rv); case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: out[0] |= PROTOBUF_C_WIRE_TYPE_32BIT; return rv + fixed32_pack (*(const uint32_t *) member, out + rv); case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: out[0] |= PROTOBUF_C_WIRE_TYPE_64BIT; return rv + fixed64_pack (*(const uint64_t *) member, out + rv); case PROTOBUF_C_TYPE_BOOL: out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; return rv + boolean_pack (*(const protobuf_c_boolean *) member, out + rv); case PROTOBUF_C_TYPE_STRING: { out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; return rv + string_pack (*(char * const *) member, out + rv); } case PROTOBUF_C_TYPE_BYTES: { const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; return rv + binary_data_pack (bd, out + rv); } //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED case PROTOBUF_C_TYPE_MESSAGE: { out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; return rv + prefixed_message_pack (*(ProtobufCMessage * const *) member, out + rv); } } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } static size_t optional_field_pack (const ProtobufCFieldDescriptor *field, const protobuf_c_boolean *has, const void *member, uint8_t *out) { if (field->type == PROTOBUF_C_TYPE_MESSAGE || field->type == PROTOBUF_C_TYPE_STRING) { const void *ptr = * (const void * const *) member; if (ptr == NULL || ptr == field->default_value) return 0; } else { if (!*has) return 0; } return required_field_pack (field, member, out); } /* TODO: implement as a table lookup */ static inline size_t sizeof_elt_in_repeated_array (ProtobufCType type) { switch (type) { case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_INT32: case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: case PROTOBUF_C_TYPE_ENUM: return 4; case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: return 8; case PROTOBUF_C_TYPE_BOOL: return sizeof (protobuf_c_boolean); case PROTOBUF_C_TYPE_STRING: case PROTOBUF_C_TYPE_MESSAGE: return sizeof (void *); case PROTOBUF_C_TYPE_BYTES: return sizeof (ProtobufCBinaryData); } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } static void copy_to_little_endian_32 (void *out, const void *in, unsigned N) { #ifdef IS_LITTLE_ENDIAN memcpy (out, in, N * 4); #else unsigned i; const uint32_t *ini = in; for (i = 0; i < N; i++) fixed32_pack (ini[i], (uint8_t*)out + 4*i); #endif } static void copy_to_little_endian_64 (void *out, const void *in, unsigned N) { #ifdef IS_LITTLE_ENDIAN memcpy (out, in, N * 8); #else unsigned i; const uint64_t *ini = in; for (i = 0; i < N; i++) fixed64_pack (ini[i], (uint8_t*)out + 8*i); #endif } static unsigned get_type_min_size (ProtobufCType type) { if (type == PROTOBUF_C_TYPE_SFIXED32 || type == PROTOBUF_C_TYPE_FIXED32 || type == PROTOBUF_C_TYPE_FLOAT) return 4; if (type == PROTOBUF_C_TYPE_SFIXED64 || type == PROTOBUF_C_TYPE_FIXED64 || type == PROTOBUF_C_TYPE_DOUBLE) return 8; return 1; } static size_t repeated_field_pack (const ProtobufCFieldDescriptor *field, size_t count, const void *member, uint8_t *out) { char *array = * (char * const *) member; unsigned i; if (field->packed) { unsigned header_len; unsigned len_start; unsigned min_length; unsigned payload_len; unsigned length_size_min; unsigned actual_length_size; uint8_t *payload_at; if (count == 0) return 0; header_len = tag_pack (field->id, out); out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; len_start = header_len; min_length = get_type_min_size (field->type) * count; length_size_min = uint32_size (min_length); header_len += length_size_min; payload_at = out + header_len; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: copy_to_little_endian_32 (payload_at, array, count); payload_at += count * 4; break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: copy_to_little_endian_64 (payload_at, array, count); payload_at += count * 8; break; case PROTOBUF_C_TYPE_INT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) payload_at += int32_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_SINT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) payload_at += sint32_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_SINT64: { const int64_t *arr = (const int64_t *) array; for (i = 0; i < count; i++) payload_at += sint64_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: { const uint32_t *arr = (const uint32_t *) array; for (i = 0; i < count; i++) payload_at += uint32_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: { const uint64_t *arr = (const uint64_t *) array; for (i = 0; i < count; i++) payload_at += uint64_pack (arr[i], payload_at); } break; case PROTOBUF_C_TYPE_BOOL: { const protobuf_c_boolean *arr = (const protobuf_c_boolean *) array; for (i = 0; i < count; i++) payload_at += boolean_pack (arr[i], payload_at); } break; default: assert (0); } payload_len = payload_at - (out + header_len); actual_length_size = uint32_size (payload_len); if (length_size_min != actual_length_size) { assert (actual_length_size == length_size_min + 1); memmove (out + header_len + 1, out + header_len, payload_len); header_len++; } uint32_pack (payload_len, out + len_start); return header_len + payload_len; } else { /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */ size_t rv = 0; unsigned siz = sizeof_elt_in_repeated_array (field->type); for (i = 0; i < count; i++) { rv += required_field_pack (field, array, out + rv); array += siz; } return rv; } } static size_t unknown_field_pack (const ProtobufCMessageUnknownField *field, uint8_t *out) { size_t rv = tag_pack (field->tag, out); out[0] |= field->wire_type; memcpy (out + rv, field->data, field->len); return rv + field->len; } size_t protobuf_c_message_pack (const ProtobufCMessage *message, uint8_t *out) { unsigned i; size_t rv = 0; ASSERT_IS_MESSAGE (message); for (i = 0; i < message->descriptor->n_fields; i++) { const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; const void *member = ((const char *) message) + field->offset; /* it doesn't hurt to compute qmember (a pointer to the quantifier field of the structure), but the pointer is only valid if the field is one of: - a repeated field - an optional field that isn't a pointer type (meaning: not a message or a string) */ const void *qmember = ((const char *) message) + field->quantifier_offset; if (field->label == PROTOBUF_C_LABEL_REQUIRED) rv += required_field_pack (field, member, out + rv); else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) /* note that qmember is bogus for strings and messages, but it isn't used */ rv += optional_field_pack (field, qmember, member, out + rv); else rv += repeated_field_pack (field, * (const size_t *) qmember, member, out + rv); } for (i = 0; i < message->n_unknown_fields; i++) rv += unknown_field_pack (&message->unknown_fields[i], out + rv); return rv; } /* === pack_to_buffer() === */ static size_t required_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, const void *member, ProtobufCBuffer *buffer) { size_t rv; uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2]; rv = tag_pack (field->id, scratch); switch (field->type) { case PROTOBUF_C_TYPE_SINT32: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += sint32_pack (*(const int32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_INT32: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += int32_pack (*(const uint32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_ENUM: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += uint32_pack (*(const uint32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_SINT64: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += sint64_pack (*(const int64_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += uint64_pack (*(const uint64_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: scratch[0] |= PROTOBUF_C_WIRE_TYPE_32BIT; rv += fixed32_pack (*(const uint32_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: scratch[0] |= PROTOBUF_C_WIRE_TYPE_64BIT; rv += fixed64_pack (*(const uint64_t *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_BOOL: scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; rv += boolean_pack (*(const protobuf_c_boolean *) member, scratch + rv); buffer->append (buffer, rv, scratch); break; case PROTOBUF_C_TYPE_STRING: { const char *str = *(char * const *) member; size_t sublen = str ? strlen (str) : 0; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; rv += uint32_pack (sublen, scratch + rv); buffer->append (buffer, rv, scratch); buffer->append (buffer, sublen, (const uint8_t *) str); rv += sublen; break; } case PROTOBUF_C_TYPE_BYTES: { const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); size_t sublen = bd->len; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; rv += uint32_pack (sublen, scratch + rv); buffer->append (buffer, rv, scratch); buffer->append (buffer, sublen, bd->data); rv += sublen; break; } //PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED case PROTOBUF_C_TYPE_MESSAGE: { uint8_t simple_buffer_scratch[256]; size_t sublen; ProtobufCBufferSimple simple_buffer = PROTOBUF_C_BUFFER_SIMPLE_INIT (simple_buffer_scratch); const ProtobufCMessage *msg = *(ProtobufCMessage * const *) member; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; if (msg == NULL) sublen = 0; else sublen = protobuf_c_message_pack_to_buffer (msg, &simple_buffer.base); rv += uint32_pack (sublen, scratch + rv); buffer->append (buffer, rv, scratch); buffer->append (buffer, sublen, simple_buffer.data); rv += sublen; PROTOBUF_C_BUFFER_SIMPLE_CLEAR (&simple_buffer); break; } default: PROTOBUF_C_ASSERT_NOT_REACHED (); } return rv; } static size_t optional_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, const protobuf_c_boolean *has, const void *member, ProtobufCBuffer *buffer) { if (field->type == PROTOBUF_C_TYPE_MESSAGE || field->type == PROTOBUF_C_TYPE_STRING) { const void *ptr = * (const void * const *) member; if (ptr == NULL || ptr == field->default_value) return 0; } else { if (!*has) return 0; } return required_field_pack_to_buffer (field, member, buffer); } static size_t get_packed_payload_length (const ProtobufCFieldDescriptor *field, unsigned count, const void *array) { unsigned rv = 0; unsigned i; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: return count * 4; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: return count * 8; case PROTOBUF_C_TYPE_INT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) rv += int32_size (arr[i]); } break; case PROTOBUF_C_TYPE_SINT32: { const int32_t *arr = (const int32_t *) array; for (i = 0; i < count; i++) rv += sint32_size (arr[i]); } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: { const uint32_t *arr = (const uint32_t *) array; for (i = 0; i < count; i++) rv += uint32_size (arr[i]); } break; case PROTOBUF_C_TYPE_SINT64: { const int64_t *arr = (const int64_t *) array; for (i = 0; i < count; i++) rv += sint64_size (arr[i]); } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: { const uint64_t *arr = (const uint64_t *) array; for (i = 0; i < count; i++) rv += uint64_size (arr[i]); } break; case PROTOBUF_C_TYPE_BOOL: return count; default: assert (0); } return rv; } static size_t pack_buffer_packed_payload (const ProtobufCFieldDescriptor *field, unsigned count, const void *array, ProtobufCBuffer *buffer) { uint8_t scratch[16]; size_t rv = 0; unsigned i; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: #ifdef IS_LITTLE_ENDIAN rv = count * 4; goto no_packing_needed; #else for (i = 0; i < count; i++) { unsigned len = fixed32_pack (((uint32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } #endif break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: #ifdef IS_LITTLE_ENDIAN rv = count * 8; goto no_packing_needed; #else for (i = 0; i < count; i++) { unsigned len = fixed64_pack (((uint64_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; #endif case PROTOBUF_C_TYPE_INT32: for (i = 0; i < count; i++) { unsigned len = int32_pack (((int32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_SINT32: for (i = 0; i < count; i++) { unsigned len = sint32_pack (((int32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: for (i = 0; i < count; i++) { unsigned len = uint32_pack (((uint32_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_SINT64: for (i = 0; i < count; i++) { unsigned len = sint64_pack (((int64_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: for (i = 0; i < count; i++) { unsigned len = uint64_pack (((uint64_t*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } break; case PROTOBUF_C_TYPE_BOOL: for (i = 0; i < count; i++) { unsigned len = boolean_pack (((protobuf_c_boolean*)array)[i], scratch); buffer->append (buffer, len, scratch); rv += len; } return count; default: assert(0); } return rv; #ifdef IS_LITTLE_ENDIAN no_packing_needed: buffer->append (buffer, rv, array); return rv; #endif } static size_t repeated_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, unsigned count, const void *member, ProtobufCBuffer *buffer) { char *array = * (char * const *) member; if (count == 0) return 0; if (field->packed) { uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2]; size_t rv = tag_pack (field->id, scratch); size_t payload_len = get_packed_payload_length (field, count, array); size_t tmp; scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; rv += uint32_pack (payload_len, scratch + rv); buffer->append (buffer, rv, scratch); tmp = pack_buffer_packed_payload (field, count, array, buffer); if (tmp != payload_len){ fprintf (stderr, "Unexpected payload length: %zu (expected: %zu). Aborting.\n", tmp, payload_len); abort (); } return rv + payload_len; } else { size_t siz; unsigned i; /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */ unsigned rv = 0; siz = sizeof_elt_in_repeated_array (field->type); for (i = 0; i < count; i++) { rv += required_field_pack_to_buffer (field, array, buffer); array += siz; } return rv; } } static size_t unknown_field_pack_to_buffer (const ProtobufCMessageUnknownField *field, ProtobufCBuffer *buffer) { uint8_t header[MAX_UINT64_ENCODED_SIZE]; size_t rv = tag_pack (field->tag, header); header[0] |= field->wire_type; buffer->append (buffer, rv, header); buffer->append (buffer, field->len, field->data); return rv + field->len; } size_t protobuf_c_message_pack_to_buffer (const ProtobufCMessage *message, ProtobufCBuffer *buffer) { unsigned i; size_t rv = 0; ASSERT_IS_MESSAGE (message); for (i = 0; i < message->descriptor->n_fields; i++) { const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; const void *member = ((const char *) message) + field->offset; const void *qmember = ((const char *) message) + field->quantifier_offset; if (field->label == PROTOBUF_C_LABEL_REQUIRED) rv += required_field_pack_to_buffer (field, member, buffer); else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) rv += optional_field_pack_to_buffer (field, qmember, member, buffer); else rv += repeated_field_pack_to_buffer (field, * (const size_t *) qmember, member, buffer); } for (i = 0; i < message->n_unknown_fields; i++) rv += unknown_field_pack_to_buffer (&message->unknown_fields[i], buffer); return rv; } /* === unpacking === */ #if PRINT_UNPACK_ERRORS # define UNPACK_ERROR(args) do { printf args;printf("\n"); }while(0) #else # define UNPACK_ERROR(args) do { } while (0) #endif static inline int int_range_lookup (unsigned n_ranges, const ProtobufCIntRange *ranges, int value) { unsigned start, n; if (n_ranges == 0) return -1; start = 0; n = n_ranges; while (n > 1) { unsigned mid = start + n / 2; if (value < ranges[mid].start_value) { n = mid - start; } else if (value >= ranges[mid].start_value + (int)(ranges[mid+1].orig_index-ranges[mid].orig_index)) { unsigned new_start = mid + 1; n = start + n - new_start; start = new_start; } else return (value - ranges[mid].start_value) + ranges[mid].orig_index; } if (n > 0) { unsigned start_orig_index = ranges[start].orig_index; unsigned range_size = ranges[start+1].orig_index - start_orig_index; if (ranges[start].start_value <= value && value < (int)(ranges[start].start_value + range_size)) return (value - ranges[start].start_value) + start_orig_index; } return -1; } static size_t parse_tag_and_wiretype (size_t len, const uint8_t *data, uint32_t *tag_out, ProtobufCWireType *wiretype_out) { unsigned max_rv = len > 5 ? 5 : len; uint32_t tag = (data[0]&0x7f) >> 3; unsigned shift = 4; unsigned rv; *wiretype_out = data[0] & 7; if ((data[0] & 0x80) == 0) { *tag_out = tag; return 1; } for (rv = 1; rv < max_rv; rv++) if (data[rv] & 0x80) { tag |= (data[rv] & 0x7f) << shift; shift += 7; } else { tag |= data[rv] << shift; *tag_out = tag; return rv + 1; } return 0; /* error: bad header */ } /* sizeof(ScannedMember) must be <= (1< len) { UNPACK_ERROR (("data too short after length-prefix of %u", val)); return 0; } return hdr_len + val; } static size_t max_b128_numbers (size_t len, const uint8_t *data) { size_t rv = 0; while (len--) if ((*data++ & 0x80) == 0) ++rv; return rv; } /* Given a raw slab of packed-repeated values, determine the number of elements. This function detects certain kinds of errors but not others; the remaining error checking is done by parse_packed_repeated_member() */ static protobuf_c_boolean count_packed_elements (ProtobufCType type, size_t len, const uint8_t *data, size_t *count_out) { switch (type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: if (len % 4 != 0) { UNPACK_ERROR (("length must be a multiple of 4 for fixed-length 32-bit types")); return FALSE; } *count_out = len / 4; return TRUE; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: if (len % 8 != 0) { UNPACK_ERROR (("length must be a multiple of 8 for fixed-length 64-bit types")); return FALSE; } *count_out = len / 8; return TRUE; case PROTOBUF_C_TYPE_INT32: case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_UINT64: *count_out = max_b128_numbers (len, data); return TRUE; case PROTOBUF_C_TYPE_BOOL: *count_out = len; return TRUE; case PROTOBUF_C_TYPE_STRING: case PROTOBUF_C_TYPE_BYTES: case PROTOBUF_C_TYPE_MESSAGE: default: UNPACK_ERROR (("bad protobuf-c type %u for packed-repeated", type)); return FALSE; } } static inline uint32_t parse_uint32 (unsigned len, const uint8_t *data) { unsigned rv = data[0] & 0x7f; if (len > 1) { rv |= ((data[1] & 0x7f) << 7); if (len > 2) { rv |= ((data[2] & 0x7f) << 14); if (len > 3) { rv |= ((data[3] & 0x7f) << 21); if (len > 4) rv |= (data[4] << 28); } } } return rv; } static inline uint32_t parse_int32 (unsigned len, const uint8_t *data) { return parse_uint32 (len, data); } static inline int32_t unzigzag32 (uint32_t v) { if (v&1) return -(v>>1) - 1; else return v>>1; } static inline uint32_t parse_fixed_uint32 (const uint8_t *data) { #ifdef IS_LITTLE_ENDIAN uint32_t t; memcpy (&t, data, 4); return t; #else return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); #endif } static uint64_t parse_uint64 (unsigned len, const uint8_t *data) { unsigned shift, i; if (len < 5) return parse_uint32 (len, data); uint64_t rv = ((data[0] & 0x7f)) | ((data[1] & 0x7f)<<7) | ((data[2] & 0x7f)<<14) | ((data[3] & 0x7f)<<21); shift = 28; for (i = 4; i < len; i++) { rv |= (((uint64_t)(data[i]&0x7f)) << shift); shift += 7; } return rv; } static inline int64_t unzigzag64 (uint64_t v) { if (v&1) return -(v>>1) - 1; else return v>>1; } static inline uint64_t parse_fixed_uint64 (const uint8_t *data) { #ifdef IS_LITTLE_ENDIAN uint64_t t; memcpy (&t, data, 8); return t; #else return (uint64_t)parse_fixed_uint32 (data) | (((uint64_t)parse_fixed_uint32(data+4)) << 32); #endif } static protobuf_c_boolean parse_boolean (unsigned len, const uint8_t *data) { unsigned i; for (i = 0; i < len; i++) if (data[i] & 0x7f) return 1; return 0; } static protobuf_c_boolean parse_required_member (ScannedMember *scanned_member, void *member, ProtobufCAllocator *allocator, protobuf_c_boolean maybe_clear) { unsigned len = scanned_member->len; const uint8_t *data = scanned_member->data; ProtobufCWireType wire_type = scanned_member->wire_type; switch (scanned_member->field->type) { case PROTOBUF_C_TYPE_INT32: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint32_t*)member = parse_int32 (len, data); return 1; case PROTOBUF_C_TYPE_UINT32: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint32_t*)member = parse_uint32 (len, data); return 1; case PROTOBUF_C_TYPE_SINT32: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(int32_t*)member = unzigzag32 (parse_uint32 (len, data)); return 1; case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: if (wire_type != PROTOBUF_C_WIRE_TYPE_32BIT) return 0; *(uint32_t*)member = parse_fixed_uint32 (data); return 1; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint64_t*)member = parse_uint64 (len, data); return 1; case PROTOBUF_C_TYPE_SINT64: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(int64_t*)member = unzigzag64 (parse_uint64 (len, data)); return 1; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: if (wire_type != PROTOBUF_C_WIRE_TYPE_64BIT) return 0; *(uint64_t*)member = parse_fixed_uint64 (data); return 1; case PROTOBUF_C_TYPE_BOOL: *(protobuf_c_boolean*)member = parse_boolean (len, data); return 1; case PROTOBUF_C_TYPE_ENUM: if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) return 0; *(uint32_t*)member = parse_uint32 (len, data); return 1; case PROTOBUF_C_TYPE_STRING: if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return 0; { char **pstr = member; unsigned pref_len = scanned_member->length_prefix_len; if (maybe_clear && *pstr != NULL) { const char *def = scanned_member->field->default_value; if (*pstr != NULL && *pstr != def) FREE (allocator, *pstr); } DO_ALLOC (*pstr, allocator, len - pref_len + 1, return 0); memcpy (*pstr, data + pref_len, len - pref_len); (*pstr)[len-pref_len] = 0; return 1; } case PROTOBUF_C_TYPE_BYTES: if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return 0; { ProtobufCBinaryData *bd = member; const ProtobufCBinaryData *def_bd; unsigned pref_len = scanned_member->length_prefix_len; def_bd = scanned_member->field->default_value; if (maybe_clear && bd->data != NULL && bd->data != def_bd->data) FREE (allocator, bd->data); DO_ALLOC (bd->data, allocator, len - pref_len, return 0); memcpy (bd->data, data + pref_len, len - pref_len); bd->len = len - pref_len; return 1; } //case PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED case PROTOBUF_C_TYPE_MESSAGE: if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return 0; { ProtobufCMessage **pmessage = member; ProtobufCMessage *subm; const ProtobufCMessage *def_mess; unsigned pref_len = scanned_member->length_prefix_len; def_mess = scanned_member->field->default_value; if (maybe_clear && *pmessage != NULL && *pmessage != def_mess) protobuf_c_message_free_unpacked (*pmessage, allocator); subm = protobuf_c_message_unpack (scanned_member->field->descriptor, allocator, len - pref_len, data + pref_len); *pmessage = subm; /* since we freed the message we must clear the field, even if NULL */ if (subm == NULL) return 0; return 1; } } return 0; } static protobuf_c_boolean parse_optional_member (ScannedMember *scanned_member, void *member, ProtobufCMessage *message, ProtobufCAllocator *allocator) { if (!parse_required_member (scanned_member, member, allocator, TRUE)) return 0; if (scanned_member->field->quantifier_offset != 0) STRUCT_MEMBER (protobuf_c_boolean, message, scanned_member->field->quantifier_offset) = 1; return 1; } static protobuf_c_boolean parse_repeated_member (ScannedMember *scanned_member, void *member, ProtobufCMessage *message, ProtobufCAllocator *allocator) { const ProtobufCFieldDescriptor *field = scanned_member->field; size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset); size_t siz = sizeof_elt_in_repeated_array (field->type); char *array = *(char**)member; if (!parse_required_member (scanned_member, array + siz * (*p_n), allocator, FALSE)) return 0; *p_n += 1; return 1; } static unsigned scan_varint (unsigned len, const uint8_t *data) { unsigned i; if (len > 10) len = 10; for (i = 0; i < len; i++) if ((data[i] & 0x80) == 0) break; if (i == len) return 0; return i + 1; } static protobuf_c_boolean parse_packed_repeated_member (ScannedMember *scanned_member, void *member, ProtobufCMessage *message) { const ProtobufCFieldDescriptor *field = scanned_member->field; size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset); size_t siz = sizeof_elt_in_repeated_array (field->type); char *array = *(char**)member + siz * (*p_n); const uint8_t *at = scanned_member->data + scanned_member->length_prefix_len; size_t rem = scanned_member->len - scanned_member->length_prefix_len; size_t count = 0; unsigned i; switch (field->type) { case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: count = (scanned_member->len - scanned_member->length_prefix_len) / 4; #ifdef IS_LITTLE_ENDIAN goto no_unpacking_needed; #else for (i = 0; i < count; i++) { ((uint32_t*)array)[i] = parse_fixed_uint32 (at); at += 4; } #endif break; case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: count = (scanned_member->len - scanned_member->length_prefix_len) / 8; #ifdef IS_LITTLE_ENDIAN goto no_unpacking_needed; #else for (i = 0; i < count; i++) { ((uint64_t*)array)[i] = parse_fixed_uint64 (at); at += 8; } break; #endif case PROTOBUF_C_TYPE_INT32: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated int32 value")); return FALSE; } ((int32_t*)array)[count++] = parse_int32 (s, at); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_SINT32: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated sint32 value")); return FALSE; } ((int32_t*)array)[count++] = unzigzag32 (parse_uint32 (s, at)); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_ENUM: case PROTOBUF_C_TYPE_UINT32: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated enum or uint32 value")); return FALSE; } ((uint32_t*)array)[count++] = parse_uint32 (s, at); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_SINT64: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated sint64 value")); return FALSE; } ((int64_t*)array)[count++] = unzigzag64 (parse_uint64 (s, at)); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_UINT64: while (rem > 0) { unsigned s = scan_varint (rem, at); if (s == 0) { UNPACK_ERROR (("bad packed-repeated int64/uint64 value")); return FALSE; } ((int64_t*)array)[count++] = parse_uint64 (s, at); at += s; rem -= s; } break; case PROTOBUF_C_TYPE_BOOL: count = rem; for (i = 0; i < count; i++) { if (at[i] > 1) { UNPACK_ERROR (("bad packed-repeated boolean value")); return FALSE; } ((protobuf_c_boolean*)array)[i] = at[i]; } break; default: assert(0); } *p_n += count; return TRUE; #ifdef IS_LITTLE_ENDIAN no_unpacking_needed: memcpy (array, at, count * siz); *p_n += count; return TRUE; #endif } static protobuf_c_boolean parse_member (ScannedMember *scanned_member, ProtobufCMessage *message, ProtobufCAllocator *allocator) { const ProtobufCFieldDescriptor *field = scanned_member->field; void *member; if (field == NULL) { ProtobufCMessageUnknownField *ufield = message->unknown_fields + (message->n_unknown_fields++); ufield->tag = scanned_member->tag; ufield->wire_type = scanned_member->wire_type; ufield->len = scanned_member->len; DO_UNALIGNED_ALLOC (ufield->data, allocator, scanned_member->len, return 0); memcpy (ufield->data, scanned_member->data, ufield->len); return 1; } member = (char*)message + field->offset; switch (field->label) { case PROTOBUF_C_LABEL_REQUIRED: return parse_required_member (scanned_member, member, allocator, TRUE); case PROTOBUF_C_LABEL_OPTIONAL: return parse_optional_member (scanned_member, member, message, allocator); case PROTOBUF_C_LABEL_REPEATED: if (field->packed && scanned_member->wire_type == PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) return parse_packed_repeated_member (scanned_member, member, message); else return parse_repeated_member (scanned_member, member, message, allocator); } PROTOBUF_C_ASSERT_NOT_REACHED (); return 0; } /* TODO: expose/use this function if desc->message_init==NULL (which occurs for old code, and may be useful for certain programatic techniques for generating descriptors). */ static void protobuf_c_message_init_generic (const ProtobufCMessageDescriptor *desc, ProtobufCMessage *message) { unsigned i; memset (message, 0, desc->sizeof_message); message->descriptor = desc; for (i = 0; i < desc->n_fields; i++) if (desc->fields[i].default_value != NULL && desc->fields[i].label != PROTOBUF_C_LABEL_REPEATED) { void *field = STRUCT_MEMBER_P (message, desc->fields[i].offset); const void *dv = desc->fields[i].default_value; switch (desc->fields[i].type) { case PROTOBUF_C_TYPE_INT32: case PROTOBUF_C_TYPE_SINT32: case PROTOBUF_C_TYPE_SFIXED32: case PROTOBUF_C_TYPE_UINT32: case PROTOBUF_C_TYPE_FIXED32: case PROTOBUF_C_TYPE_FLOAT: case PROTOBUF_C_TYPE_ENUM: memcpy (field, dv, 4); break; case PROTOBUF_C_TYPE_INT64: case PROTOBUF_C_TYPE_SINT64: case PROTOBUF_C_TYPE_SFIXED64: case PROTOBUF_C_TYPE_UINT64: case PROTOBUF_C_TYPE_FIXED64: case PROTOBUF_C_TYPE_DOUBLE: memcpy (field, dv, 8); break; case PROTOBUF_C_TYPE_BOOL: memcpy (field, dv, sizeof (protobuf_c_boolean)); break; case PROTOBUF_C_TYPE_BYTES: memcpy (field, dv, sizeof (ProtobufCBinaryData)); break; case PROTOBUF_C_TYPE_STRING: case PROTOBUF_C_TYPE_MESSAGE: /* the next line essentially implements a cast from const, which is totally unavoidable. */ *(const void**)field = dv; break; } } } /* ScannedMember slabs (an unpacking implementation detail). Before doing real unpacking, we first scan through the elements to see how many there are (for repeated fields), and which field to use (for non-repeated fields given twice). * In order to avoid allocations for small messages, we keep a stack-allocated slab of ScannedMembers of size FIRST_SCANNED_MEMBER_SLAB_SIZE (16). After we fill that up, we allocate each slab twice as large as the previous one. */ #define FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2 4 /* The number of slabs, including the stack-allocated ones; choose the number so that we would overflow if we needed a slab larger than provided. */ #define MAX_SCANNED_MEMBER_SLAB \ (sizeof(void*)*8 - 1 \ - BOUND_SIZEOF_SCANNED_MEMBER_LOG2 \ - FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2) ProtobufCMessage * protobuf_c_message_unpack (const ProtobufCMessageDescriptor *desc, ProtobufCAllocator *allocator, size_t len, const uint8_t *data) { ProtobufCMessage *rv; size_t rem = len; const uint8_t *at = data; const ProtobufCFieldDescriptor *last_field = desc->fields + 0; ScannedMember first_member_slab[1<n_fields + word_bits - 1) / word_bits; required_fields_bitmap = alloca(required_fields_bitmap_len * sizeof(long)); memset(required_fields_bitmap, 0, required_fields_bitmap_len * sizeof(long)); DO_ALLOC (rv, allocator, desc->sizeof_message, return NULL); scanned_member_slabs[0] = first_member_slab; /* Generated code always defines "message_init". However, we provide a fallback for (1) users of old protobuf-c generated-code that do not provide the function, and (2) descriptors constructed from some other source (most likely, direct construction from the .proto file) */ if (desc->message_init != NULL) protobuf_c_message_init (desc, rv); else protobuf_c_message_init_generic (desc, rv); while (rem > 0) { uint32_t tag; ProtobufCWireType wire_type; size_t used = parse_tag_and_wiretype (rem, at, &tag, &wire_type); const ProtobufCFieldDescriptor *field; ScannedMember tmp; if (used == 0) { UNPACK_ERROR (("error parsing tag/wiretype at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } /* XXX: consider optimizing for field[1].id == tag, if field[1] exists! */ if (last_field->id != tag) { /* lookup field */ int field_index = int_range_lookup (desc->n_field_ranges, desc->field_ranges, tag); if (field_index < 0) { field = NULL; n_unknown++; } else { field = desc->fields + field_index; last_field = field; last_field_index = field_index; } } else field = last_field; if (field != NULL && field->label == PROTOBUF_C_LABEL_REQUIRED) required_fields_bitmap[last_field_index / word_bits] |= (1UL << (last_field_index % word_bits)); at += used; rem -= used; tmp.tag = tag; tmp.wire_type = wire_type; tmp.field = field; tmp.data = at; switch (wire_type) { case PROTOBUF_C_WIRE_TYPE_VARINT: { unsigned max_len = rem < 10 ? rem : 10; unsigned i; for (i = 0; i < max_len; i++) if ((at[i] & 0x80) == 0) break; if (i == max_len) { UNPACK_ERROR (("unterminated varint at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } tmp.len = i + 1; } break; case PROTOBUF_C_WIRE_TYPE_64BIT: if (rem < 8) { UNPACK_ERROR (("too short after 64bit wiretype at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } tmp.len = 8; break; case PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED: { size_t pref_len; tmp.len = scan_length_prefixed_data (rem, at, &pref_len); if (tmp.len == 0) { /* NOTE: scan_length_prefixed_data calls UNPACK_ERROR */ goto error_cleanup_during_scan; } tmp.length_prefix_len = pref_len; break; } case PROTOBUF_C_WIRE_TYPE_32BIT: if (rem < 4) { UNPACK_ERROR (("too short after 32bit wiretype at offset %u", (unsigned)(at-data))); goto error_cleanup_during_scan; } tmp.len = 4; break; default: UNPACK_ERROR (("unsupported tag %u at offset %u", wire_type, (unsigned)(at-data))); goto error_cleanup_during_scan; } if (in_slab_index == (1U<<(which_slab+FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2))) { size_t size; in_slab_index = 0; if (which_slab == MAX_SCANNED_MEMBER_SLAB) { UNPACK_ERROR (("too many fields")); goto error_cleanup_during_scan; } which_slab++; size = sizeof(ScannedMember) << (which_slab+FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2); /* TODO: consider using alloca() ! */ if (allocator->tmp_alloc != NULL) scanned_member_slabs[which_slab] = TMPALLOC(allocator, size); else DO_ALLOC (scanned_member_slabs[which_slab], allocator, size, goto error_cleanup_during_scan); } scanned_member_slabs[which_slab][in_slab_index++] = tmp; if (field != NULL && field->label == PROTOBUF_C_LABEL_REPEATED) { size_t *n = STRUCT_MEMBER_PTR (size_t, rv, field->quantifier_offset); if (field->packed && wire_type == PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) { size_t count; if (!count_packed_elements (field->type, tmp.len - tmp.length_prefix_len, tmp.data + tmp.length_prefix_len, &count)) { UNPACK_ERROR (("counting packed elements")); goto error_cleanup_during_scan; } *n += count; } else *n += 1; } at += tmp.len; rem -= tmp.len; } /* allocate space for repeated fields, also check that all required fields have been set */ for (f = 0; f < desc->n_fields; f++) { const ProtobufCFieldDescriptor *field = desc->fields + f; if (field->label == PROTOBUF_C_LABEL_REPEATED) { size_t siz = sizeof_elt_in_repeated_array (field->type); size_t *n_ptr = STRUCT_MEMBER_PTR (size_t, rv, field->quantifier_offset); if (*n_ptr != 0) { unsigned n = *n_ptr; *n_ptr = 0; assert(rv->descriptor != NULL); #define CLEAR_REMAINING_N_PTRS() \ for(f++;f < desc->n_fields; f++) \ { \ field = desc->fields + f; \ if (field->label == PROTOBUF_C_LABEL_REPEATED) \ STRUCT_MEMBER (size_t, rv, field->quantifier_offset) = 0; \ } DO_ALLOC (STRUCT_MEMBER (void *, rv, field->offset), allocator, siz * n, CLEAR_REMAINING_N_PTRS (); goto error_cleanup); #undef CLEAR_REMAINING_N_PTRS } } else if (field->label == PROTOBUF_C_LABEL_REQUIRED) { if (field->default_value == NULL && 0 == (required_fields_bitmap[f / word_bits] & (1UL << (f % word_bits)))) { UNPACK_ERROR (("message '%s': missing required field '%s'", desc->name, field->name)); goto error_cleanup; } } } /* allocate space for unknown fields */ if (n_unknown) { DO_ALLOC (rv->unknown_fields, allocator, n_unknown * sizeof (ProtobufCMessageUnknownField), goto error_cleanup); } /* do real parsing */ for (i_slab = 0; i_slab <= which_slab; i_slab++) { unsigned max = (i_slab == which_slab) ? in_slab_index : (1U<<(i_slab+4)); ScannedMember *slab = scanned_member_slabs[i_slab]; unsigned j; for (j = 0; j < max; j++) { if (!parse_member (slab + j, rv, allocator)) { UNPACK_ERROR (("error parsing member %s of %s", slab->field ? slab->field->name : "*unknown-field*", desc->name)); goto error_cleanup; } } } /* cleanup */ if (allocator->tmp_alloc == NULL) { unsigned j; for (j = 1; j <= which_slab; j++) FREE (allocator, scanned_member_slabs[j]); } return rv; error_cleanup: protobuf_c_message_free_unpacked (rv, allocator); if (allocator->tmp_alloc == NULL) { unsigned j; for (j = 1; j <= which_slab; j++) FREE (allocator, scanned_member_slabs[j]); } return NULL; error_cleanup_during_scan: FREE (allocator, rv); if (allocator->tmp_alloc == NULL) { unsigned j; for (j = 1; j <= which_slab; j++) FREE (allocator, scanned_member_slabs[j]); } return NULL; } /* === free_unpacked === */ void protobuf_c_message_free_unpacked (ProtobufCMessage *message, ProtobufCAllocator *allocator) { const ProtobufCMessageDescriptor *desc = message->descriptor; unsigned f; ASSERT_IS_MESSAGE (message); if (allocator == NULL) allocator = &protobuf_c_default_allocator; message->descriptor = NULL; for (f = 0; f < desc->n_fields; f++) { if (desc->fields[f].label == PROTOBUF_C_LABEL_REPEATED) { size_t n = STRUCT_MEMBER (size_t, message, desc->fields[f].quantifier_offset); void * arr = STRUCT_MEMBER (void *, message, desc->fields[f].offset); if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) { unsigned i; for (i = 0; i < n; i++) FREE (allocator, ((char**)arr)[i]); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) { unsigned i; for (i = 0; i < n; i++) FREE (allocator, ((ProtobufCBinaryData*)arr)[i].data); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) { unsigned i; for (i = 0; i < n; i++) protobuf_c_message_free_unpacked (((ProtobufCMessage**)arr)[i], allocator); } if (arr != NULL) FREE (allocator, arr); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) { char *str = STRUCT_MEMBER (char *, message, desc->fields[f].offset); if (str && str != desc->fields[f].default_value) FREE (allocator, str); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) { void *data = STRUCT_MEMBER (ProtobufCBinaryData, message, desc->fields[f].offset).data; const ProtobufCBinaryData *default_bd; default_bd = desc->fields[f].default_value; if (data != NULL && (default_bd == NULL || default_bd->data != data)) FREE (allocator, data); } else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) { ProtobufCMessage *sm; sm = STRUCT_MEMBER (ProtobufCMessage *, message,desc->fields[f].offset); if (sm && sm != desc->fields[f].default_value) protobuf_c_message_free_unpacked (sm, allocator); } } for (f = 0; f < message->n_unknown_fields; f++) FREE (allocator, message->unknown_fields[f].data); if (message->unknown_fields != NULL) FREE (allocator, message->unknown_fields); FREE (allocator, message); } /* === services === */ typedef void (*GenericHandler)(void *service, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data); void protobuf_c_service_invoke_internal(ProtobufCService *service, unsigned method_index, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data) { GenericHandler *handlers; GenericHandler handler; /* Verify that method_index is within range. If this fails, you are likely invoking a newly added method on an old service. (Although other memory corruption bugs can cause this assertion too) */ PROTOBUF_C_ASSERT (method_index < service->descriptor->n_methods); /* Get the array of virtual methods (which are enumerated by the generated code) */ handlers = (GenericHandler *) (service + 1); /* get our method and invoke it */ /* TODO: seems like handler==NULL is a situation that needs handling */ handler = handlers[method_index]; (*handler) (service, input, closure, closure_data); } void protobuf_c_service_generated_init (ProtobufCService *service, const ProtobufCServiceDescriptor *descriptor, ProtobufCServiceDestroy destroy) { ASSERT_IS_SERVICE_DESCRIPTOR(descriptor); service->descriptor = descriptor; service->destroy = destroy; service->invoke = protobuf_c_service_invoke_internal; memset (service + 1, 0, descriptor->n_methods * sizeof (GenericHandler)); } void protobuf_c_service_destroy (ProtobufCService *service) { service->destroy (service); } /* --- querying the descriptors --- */ const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value_by_name (const ProtobufCEnumDescriptor *desc, const char *name) { unsigned start = 0, count = desc->n_value_names; while (count > 1) { unsigned mid = start + count / 2; int rv = strcmp (desc->values_by_name[mid].name, name); if (rv == 0) return desc->values + desc->values_by_name[mid].index; else if (rv < 0) { count = start + count - (mid + 1); start = mid + 1; } else count = mid - start; } if (count == 0) return NULL; if (strcmp (desc->values_by_name[start].name, name) == 0) return desc->values + desc->values_by_name[start].index; return NULL; } const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value (const ProtobufCEnumDescriptor *desc, int value) { int rv = int_range_lookup (desc->n_value_ranges, desc->value_ranges, value); if (rv < 0) return NULL; return desc->values + rv; } const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field_by_name (const ProtobufCMessageDescriptor *desc, const char *name) { unsigned start = 0, count = desc->n_fields; const ProtobufCFieldDescriptor *field; while (count > 1) { unsigned mid = start + count / 2; int rv; field = desc->fields + desc->fields_sorted_by_name[mid]; rv = strcmp (field->name, name); if (rv == 0) return field; else if (rv < 0) { count = start + count - (mid + 1); start = mid + 1; } else count = mid - start; } if (count == 0) return NULL; field = desc->fields + desc->fields_sorted_by_name[start]; if (strcmp (field->name, name) == 0) return field; return NULL; } const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field (const ProtobufCMessageDescriptor *desc, unsigned value) { int rv = int_range_lookup (desc->n_field_ranges, desc->field_ranges, value); if (rv < 0) return NULL; return desc->fields + rv; } const ProtobufCMethodDescriptor * protobuf_c_service_descriptor_get_method_by_name (const ProtobufCServiceDescriptor *desc, const char *name) { unsigned start = 0, count = desc->n_methods; while (count > 1) { unsigned mid = start + count / 2; unsigned mid_index = desc->method_indices_by_name[mid]; const char *mid_name = desc->methods[mid_index].name; int rv = strcmp (mid_name, name); if (rv == 0) return desc->methods + desc->method_indices_by_name[mid]; if (rv < 0) { count = start + count - (mid + 1); start = mid + 1; } else { count = mid - start; } } if (count == 0) return NULL; if (strcmp (desc->methods[desc->method_indices_by_name[start]].name, name) == 0) return desc->methods + desc->method_indices_by_name[start]; return NULL; } navit-0.5.0+dfsg.1/navit/maptool/google/protobuf-c/protobuf-c.h000066400000000000000000000347751264204753600243250ustar00rootroot00000000000000/* --- protobuf-c.h: public protobuf c runtime api --- */ /* * Copyright 2008, Dave Benson. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License * at http://www.apache.org/licenses/LICENSE-2.0 Unless * required by applicable law or agreed to in writing, * software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef __PROTOBUF_C_RUNTIME_H_ #define __PROTOBUF_C_RUNTIME_H_ #include #include #ifdef __cplusplus # define PROTOBUF_C_BEGIN_DECLS extern "C" { # define PROTOBUF_C_END_DECLS } #else # define PROTOBUF_C_BEGIN_DECLS # define PROTOBUF_C_END_DECLS #endif #if !defined(PROTOBUF_C_NO_DEPRECATED) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) #define PROTOBUF_C_DEPRECATED __attribute__((__deprecated__)) #else #define PROTOBUF_C_DEPRECATED #endif /* Define int32_t, int64_t, uint32_t, uint64_t, uint8_t. Usually, just include to do the work. XXX: should we use stdint.h? */ #ifndef PROTOBUF_C_SKIP_INTTYPES_H # if defined(_MSC_VER) /* On windows, in ms visual studio, define the types ourselves */ # define int32_t signed __int32 # define uint32_t unsigned __int32 # define int64_t signed __int64 # define uint64_t unsigned __int64 # define uint8_t unsigned char # else /* Use the system inttypes.h */ # include # endif #endif PROTOBUF_C_BEGIN_DECLS typedef enum { PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_LABEL_OPTIONAL, PROTOBUF_C_LABEL_REPEATED } ProtobufCLabel; typedef enum { PROTOBUF_C_TYPE_INT32, PROTOBUF_C_TYPE_SINT32, PROTOBUF_C_TYPE_SFIXED32, PROTOBUF_C_TYPE_INT64, PROTOBUF_C_TYPE_SINT64, PROTOBUF_C_TYPE_SFIXED64, PROTOBUF_C_TYPE_UINT32, PROTOBUF_C_TYPE_FIXED32, PROTOBUF_C_TYPE_UINT64, PROTOBUF_C_TYPE_FIXED64, PROTOBUF_C_TYPE_FLOAT, PROTOBUF_C_TYPE_DOUBLE, PROTOBUF_C_TYPE_BOOL, PROTOBUF_C_TYPE_ENUM, PROTOBUF_C_TYPE_STRING, PROTOBUF_C_TYPE_BYTES, //PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED PROTOBUF_C_TYPE_MESSAGE, } ProtobufCType; typedef int protobuf_c_boolean; #define PROTOBUF_C_OFFSETOF(struct, member) offsetof(struct, member) #define PROTOBUF_C_ASSERT(condition) assert(condition) #define PROTOBUF_C_ASSERT_NOT_REACHED() assert(0) typedef struct _ProtobufCBinaryData ProtobufCBinaryData; struct _ProtobufCBinaryData { size_t len; uint8_t *data; }; typedef struct _ProtobufCIntRange ProtobufCIntRange; /* private */ /* --- memory management --- */ typedef struct _ProtobufCAllocator ProtobufCAllocator; struct _ProtobufCAllocator { void *(*alloc)(void *allocator_data, size_t size); void (*free)(void *allocator_data, void *pointer); void *(*tmp_alloc)(void *allocator_data, size_t size); unsigned max_alloca; void *allocator_data; }; /* This is a configurable allocator. * By default, it uses the system allocator (meaning malloc() and free()). * This is typically changed to adapt to frameworks that provide * some nonstandard allocation functions. * * NOTE: you may modify this allocator. */ extern ProtobufCAllocator protobuf_c_default_allocator; /* settable */ /* This is the system allocator, meaning it uses malloc() and free(). * * NOTE: please do NOT modify this allocator. */ extern ProtobufCAllocator protobuf_c_system_allocator; /* use malloc, free etc */ /* This is the function that our default allocators call when they run out-of-memory. The default behavior of this function is to terminate your program. */ extern void (*protobuf_c_out_of_memory) (void); /* --- append-only data buffer --- */ typedef struct _ProtobufCBuffer ProtobufCBuffer; struct _ProtobufCBuffer { void (*append)(ProtobufCBuffer *buffer, size_t len, const uint8_t *data); }; /* --- enums --- */ typedef struct _ProtobufCEnumValue ProtobufCEnumValue; typedef struct _ProtobufCEnumValueIndex ProtobufCEnumValueIndex; typedef struct _ProtobufCEnumDescriptor ProtobufCEnumDescriptor; /* ProtobufCEnumValue: this represents a single value of * an enumeration. * 'name' is the string identifying this value, as given in the .proto file. * 'c_name' is the full name of the C enumeration value. * 'value' is the number assigned to this value, as given in the .proto file. */ struct _ProtobufCEnumValue { const char *name; const char *c_name; int value; }; /* ProtobufCEnumDescriptor: the represents the enum as a whole, * with all its values. * 'magic' is a code we check to ensure that the api is used correctly. * 'name' is the qualified name (e.g. "namespace.Type"). * 'short_name' is the unqualified name ("Type"), as given in the .proto file. * 'package_name' is the '.'-separated namespace * 'n_values' is the number of distinct values. * 'values' is the array of distinct values. * 'n_value_names' number of named values (including aliases). * 'value_names' are the named values (including aliases). * * The rest of the values are private essentially. * * see also: Use protobuf_c_enum_descriptor_get_value_by_name() * and protobuf_c_enum_descriptor_get_value() to efficiently * lookup values in the descriptor. */ struct _ProtobufCEnumDescriptor { uint32_t magic; const char *name; const char *short_name; const char *c_name; const char *package_name; /* sorted by value */ unsigned n_values; const ProtobufCEnumValue *values; /* sorted by name */ unsigned n_value_names; const ProtobufCEnumValueIndex *values_by_name; /* value-ranges, for faster lookups by number */ unsigned n_value_ranges; const ProtobufCIntRange *value_ranges; void *reserved1; void *reserved2; void *reserved3; void *reserved4; }; /* --- messages --- */ typedef struct _ProtobufCMessageDescriptor ProtobufCMessageDescriptor; typedef struct _ProtobufCFieldDescriptor ProtobufCFieldDescriptor; typedef struct _ProtobufCMessage ProtobufCMessage; typedef void (*ProtobufCMessageInit)(ProtobufCMessage *); /* ProtobufCFieldDescriptor: description of a single field * in a message. * 'name' is the name of the field, as given in the .proto file. * 'id' is the code representing the field, as given in the .proto file. * 'label' is one of PROTOBUF_C_LABEL_{REQUIRED,OPTIONAL,REPEATED} * 'type' is the type of field. * 'quantifier_offset' is the offset in bytes into the message's C structure * for this member's "has_MEMBER" field (for optional members) or * "n_MEMBER" field (for repeated members). * 'offset' is the offset in bytes into the message's C structure * for the member itself. * 'descriptor' is a pointer to a ProtobufC{Enum,Message}Descriptor * if type is PROTOBUF_C_TYPE_{ENUM,MESSAGE} respectively, * otherwise NULL. * 'default_value' is a pointer to a default value for this field, * where allowed. */ struct _ProtobufCFieldDescriptor { const char *name; uint32_t id; ProtobufCLabel label; ProtobufCType type; unsigned quantifier_offset; unsigned offset; const void *descriptor; /* for MESSAGE and ENUM types */ const void *default_value; /* or NULL if no default-value */ protobuf_c_boolean packed; unsigned reserved_flags; void *reserved2; void *reserved3; }; /* ProtobufCMessageDescriptor: description of a message. * * 'magic' is a code we check to ensure that the api is used correctly. * 'name' is the qualified name (e.g. "namespace.Type"). * 'short_name' is the unqualified name ("Type"), as given in the .proto file. * 'c_name' is the c-formatted name of the structure * 'package_name' is the '.'-separated namespace * 'sizeof_message' is the size in bytes of the C structure * representing an instance of this type of message. * 'n_fields' is the number of known fields in this message. * 'fields' is the fields sorted by id number. * 'fields_sorted_by_name', 'n_field_ranges' and 'field_ranges' * are used for looking up fields by name and id. (private) */ struct _ProtobufCMessageDescriptor { uint32_t magic; const char *name; const char *short_name; const char *c_name; const char *package_name; size_t sizeof_message; /* sorted by field-id */ unsigned n_fields; const ProtobufCFieldDescriptor *fields; const unsigned *fields_sorted_by_name; /* ranges, optimization for looking up fields */ unsigned n_field_ranges; const ProtobufCIntRange *field_ranges; ProtobufCMessageInit message_init; void *reserved1; void *reserved2; void *reserved3; }; /* ProtobufCMessage: an instance of a message. * * ProtobufCMessage is sort-of a lightweight * base-class for all messages. * * In particular, ProtobufCMessage doesn't have * any allocation policy associated with it. * That's because it is common to create ProtobufCMessage's * on the stack. In fact, we that's what we recommend * for sending messages (because if you just allocate from the * stack, then you can't really have a memory leak). * * This means that functions like protobuf_c_message_unpack() * which return a ProtobufCMessage must be paired * with a free function, like protobuf_c_message_free_unpacked(). * * 'descriptor' gives the locations and types of the members of message * 'n_unknown_fields' is the number of fields we didn't recognize. * 'unknown_fields' are fields we didn't recognize. */ typedef struct _ProtobufCMessageUnknownField ProtobufCMessageUnknownField; struct _ProtobufCMessage { const ProtobufCMessageDescriptor *descriptor; unsigned n_unknown_fields; ProtobufCMessageUnknownField *unknown_fields; }; #define PROTOBUF_C_MESSAGE_INIT(descriptor) { descriptor, 0, NULL } /* To pack a message: you have two options: (1) you can compute the size of the message using protobuf_c_message_get_packed_size() then pass protobuf_c_message_pack() a buffer of that length. (2) Provide a virtual buffer (a ProtobufCBuffer) to accept data as we scan through it. */ size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message); size_t protobuf_c_message_pack (const ProtobufCMessage *message, uint8_t *out); size_t protobuf_c_message_pack_to_buffer (const ProtobufCMessage *message, ProtobufCBuffer *buffer); ProtobufCMessage * protobuf_c_message_unpack (const ProtobufCMessageDescriptor *, ProtobufCAllocator *allocator, size_t len, const uint8_t *data); void protobuf_c_message_free_unpacked (ProtobufCMessage *message, ProtobufCAllocator *allocator); /* WARNING: 'message' must be a block of memory of size descriptor->sizeof_message. */ #define protobuf_c_message_init(descriptor, message) ((descriptor)->message_init((ProtobufCMessage*) (message))) /* --- services --- */ typedef struct _ProtobufCMethodDescriptor ProtobufCMethodDescriptor; typedef struct _ProtobufCServiceDescriptor ProtobufCServiceDescriptor; struct _ProtobufCMethodDescriptor { const char *name; const ProtobufCMessageDescriptor *input; const ProtobufCMessageDescriptor *output; }; struct _ProtobufCServiceDescriptor { uint32_t magic; const char *name; const char *short_name; const char *c_name; const char *package; unsigned n_methods; const ProtobufCMethodDescriptor *methods; /* in order from .proto file */ const unsigned *method_indices_by_name; }; typedef struct _ProtobufCService ProtobufCService; typedef void (*ProtobufCClosure)(const ProtobufCMessage *message, void *closure_data); struct _ProtobufCService { const ProtobufCServiceDescriptor *descriptor; void (*invoke)(ProtobufCService *service, unsigned method_index, const ProtobufCMessage *input, ProtobufCClosure closure, void *closure_data); void (*destroy) (ProtobufCService *service); }; void protobuf_c_service_destroy (ProtobufCService *); /* --- querying the descriptors --- */ const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value_by_name (const ProtobufCEnumDescriptor *desc, const char *name); const ProtobufCEnumValue * protobuf_c_enum_descriptor_get_value (const ProtobufCEnumDescriptor *desc, int value); const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field_by_name (const ProtobufCMessageDescriptor *desc, const char *name); const ProtobufCFieldDescriptor * protobuf_c_message_descriptor_get_field (const ProtobufCMessageDescriptor *desc, unsigned value); const ProtobufCMethodDescriptor * protobuf_c_service_descriptor_get_method_by_name (const ProtobufCServiceDescriptor *desc, const char *name); /* --- wire format enums --- */ typedef enum { PROTOBUF_C_WIRE_TYPE_VARINT, PROTOBUF_C_WIRE_TYPE_64BIT, PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED, PROTOBUF_C_WIRE_TYPE_START_GROUP, /* unsupported */ PROTOBUF_C_WIRE_TYPE_END_GROUP, /* unsupported */ PROTOBUF_C_WIRE_TYPE_32BIT } ProtobufCWireType; /* --- unknown message fields --- */ struct _ProtobufCMessageUnknownField { uint32_t tag; ProtobufCWireType wire_type; size_t len; uint8_t *data; }; /* --- extra (superfluous) api: trivial buffer --- */ typedef struct _ProtobufCBufferSimple ProtobufCBufferSimple; struct _ProtobufCBufferSimple { ProtobufCBuffer base; size_t alloced; size_t len; uint8_t *data; protobuf_c_boolean must_free_data; }; #define PROTOBUF_C_BUFFER_SIMPLE_INIT(array_of_bytes) \ { { protobuf_c_buffer_simple_append }, \ sizeof(array_of_bytes), 0, (array_of_bytes), 0 } #define PROTOBUF_C_BUFFER_SIMPLE_CLEAR(simp_buf) \ do { if ((simp_buf)->must_free_data) \ protobuf_c_default_allocator.free (&protobuf_c_default_allocator.allocator_data, (simp_buf)->data); } while (0) /* ====== private ====== */ #include "protobuf-c-private.h" PROTOBUF_C_END_DECLS #endif /* __PROTOBUF_C_RUNTIME_H_ */ navit-0.5.0+dfsg.1/navit/maptool/itembin.c000066400000000000000000000416511264204753600203220ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "maptool.h" #include "linguistics.h" #include "file.h" #include "debug.h" int item_bin_read(struct item_bin *ib, FILE *in) { if (fread(ib, 4, 1, in) == 0) return 0; if (!ib->len) return 1; if (fread((unsigned char *)ib+4, ib->len*4, 1, in)) return 2; return 0; } void item_bin_set_type(struct item_bin *ib, enum item_type type) { ib->type=type; } void item_bin_init(struct item_bin *ib, enum item_type type) { ib->clen=0; ib->len=2; item_bin_set_type(ib, type); } void item_bin_add_coord(struct item_bin *ib, struct coord *coords_to_add, int count) { struct coord *coord_list=(struct coord *)(ib+1); coord_list+=ib->clen/2; memcpy(coord_list, coords_to_add, count*sizeof(struct coord)); ib->clen+=count*2; ib->len+=count*2; } void item_bin_add_coord_reverse(struct item_bin *ib, struct coord *c, int count) { int i; for (i = count-1 ; i >= 0 ; i--) item_bin_add_coord(ib, &c[i], 1); } void item_bin_bbox(struct item_bin *ib, struct rect *r) { struct coord c; item_bin_add_coord(ib, &r->l, 1); c.x=r->h.x; c.y=r->l.y; item_bin_add_coord(ib, &c, 1); item_bin_add_coord(ib, &r->h, 1); c.x=r->l.x; c.y=r->h.y; item_bin_add_coord(ib, &c, 1); item_bin_add_coord(ib, &r->l, 1); } void item_bin_copy_coord(struct item_bin *ib, struct item_bin *from, int dir) { struct coord *c=(struct coord *)(from+1); int i,count=from->clen/2; if (dir >= 0) { item_bin_add_coord(ib, c, count); return; } for (i = 1 ; i <= count ; i++) item_bin_add_coord(ib, &c[count-i], 1); } void item_bin_copy_attr(struct item_bin *ib, struct item_bin *from, enum attr_type attr) { struct attr_bin *ab=item_bin_get_attr_bin(from, attr, NULL); if (ab) item_bin_add_attr_data(ib, ab->type, (void *)(ab+1), (ab->len-1)*4); assert(attr == attr_osm_wayid); assert(item_bin_get_wayid(ib) == item_bin_get_wayid(from)); } void item_bin_add_coord_rect(struct item_bin *ib, struct rect *r) { item_bin_add_coord(ib, &r->l, 1); item_bin_add_coord(ib, &r->h, 1); } int attr_bin_write_data(struct attr_bin *ab, enum attr_type type, void *data, int size) { int pad=(4-(size%4))%4; ab->type=type; memcpy(ab+1, data, size); memset((unsigned char *)(ab+1)+size, 0, pad); ab->len=(size+pad)/4+1; return ab->len+1; } int attr_bin_write_attr(struct attr_bin *ab, struct attr *attr) { return attr_bin_write_data(ab, attr->type, attr_data_get(attr), attr_data_size(attr)); } void item_bin_add_attr_data(struct item_bin *ib, enum attr_type type, void *data, int size) { struct attr_bin *ab=(struct attr_bin *)((int *)ib+ib->len+1); ib->len+=attr_bin_write_data(ab, type, data, size); } void item_bin_add_attr(struct item_bin *ib, struct attr *attr) { struct attr_bin *ab=(struct attr_bin *)((int *)ib+ib->len+1); if (ATTR_IS_GROUP(attr->type)) { int i=0; int *abptr; ab->type=attr->type; ab->len=1; abptr=(int *)(ab+1); while (attr->u.attrs[i].type) { int size=attr_bin_write_attr((struct attr_bin *)abptr, &attr->u.attrs[i]); ab->len+=size; abptr+=size; i++; } ib->len+=ab->len+1; } else ib->len+=attr_bin_write_attr(ab, attr); } void item_bin_remove_attr(struct item_bin *ib, void *ptr) { unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { struct attr_bin *ab=(struct attr_bin *)s; s+=(ab->len+1)*4; if ((void *)(ab+1) == ptr) { ib->len-=ab->len+1; memmove(ab,s,e-s); return; } } } void item_bin_add_attr_int(struct item_bin *ib, enum attr_type type, int val) { struct attr attr; attr.type=type; attr.u.num=val; item_bin_add_attr(ib, &attr); } void * item_bin_get_attr(struct item_bin *ib, enum attr_type type, void *last) { unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { struct attr_bin *ab=(struct attr_bin *)s; s+=(ab->len+1)*4; if (ab->type == type && (void *)(ab+1) > last) { return (ab+1); } } return NULL; } struct attr_bin * item_bin_get_attr_bin(struct item_bin *ib, enum attr_type type, void *last) { unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { struct attr_bin *ab=(struct attr_bin *)s; s+=(ab->len+1)*4; if (ab->type == type && (void *)(ab+1) > last) { return ab; } } return NULL; } struct attr_bin * item_bin_get_attr_bin_last(struct item_bin *ib) { struct attr_bin *ab=NULL; unsigned char *s=(unsigned char *)ib; unsigned char *e=s+(ib->len+1)*4; s+=sizeof(struct item_bin)+ib->clen*4; while (s < e) { ab=(struct attr_bin *)s; s+=(ab->len+1)*4; } return ab; } void item_bin_add_attr_longlong(struct item_bin *ib, enum attr_type type, long long val) { struct attr attr; attr.type=type; attr.u.num64=&val; item_bin_add_attr(ib, &attr); } void item_bin_add_attr_string(struct item_bin *ib, enum attr_type type, char *str) { struct attr attr; if (! str) return; attr.type=type; attr.u.str=str; item_bin_add_attr(ib, &attr); } void item_bin_add_attr_range(struct item_bin *ib, enum attr_type type, short min, short max) { struct attr attr; attr.type=type; attr.u.range.min=min; attr.u.range.max=max; item_bin_add_attr(ib, &attr); } void item_bin_write(struct item_bin *ib, FILE *out) { dbg_assert(fwrite(ib, (ib->len+1)*4, 1, out)==1); } struct item_bin * item_bin_dup(struct item_bin *ib) { int len=(ib->len+1)*4; struct item_bin *ret=g_malloc(len); memcpy(ret, ib, len); return ret; } void item_bin_write_clipped(struct item_bin *ib, struct tile_parameter *param, struct item_bin_sink *out) { struct tile_data tile_data; int i; bbox((struct coord *)(ib+1), ib->clen/2, &tile_data.item_bbox); tile_data.buffer[0]='\0'; tile_data.tile_depth=tile(&tile_data.item_bbox, NULL, tile_data.buffer, param->max, param->overlap, &tile_data.tile_bbox); if (tile_data.tile_depth == param->max || tile_data.tile_depth >= param->min) { item_bin_write_to_sink(ib, out, &tile_data); return; } for (i = 0 ; i < 4 ; i++) { struct rect clip_rect; tile_data.buffer[tile_data.tile_depth]='a'+i; tile_data.buffer[tile_data.tile_depth+1]='\0'; tile_bbox(tile_data.buffer, &clip_rect, param->overlap); if (ib->type < type_area) clip_line(ib, &clip_rect, param, out); else clip_polygon(ib, &clip_rect, param, out); } } static char * coord_to_str(struct coord *c) { int x=c->x; int y=c->y; char *sx=""; char *sy=""; if (x < 0) { sx="-"; x=-x; } if (y < 0) { sy="-"; y=-y; } return g_strdup_printf("%s0x%x %s0x%x",sx,x,sy,y); } static void dump_coord(struct coord *c, FILE *out) { char *str=coord_to_str(c); fprintf(out,"%s",str); g_free(str); } void item_bin_dump(struct item_bin *ib, FILE *out) { struct coord *c; struct attr_bin *a; struct attr attr; int *attr_start; int *attr_end; int i; char *str; c=(struct coord *)(ib+1); if (ib->type < type_line) { dump_coord(c,out); fprintf(out, " "); } attr_start=(int *)(ib+1)+ib->clen; attr_end=(int *)ib+ib->len+1; fprintf(out,"type=%s", item_to_name(ib->type)); while (attr_start < attr_end) { a=(struct attr_bin *)(attr_start); attr_start+=a->len+1; attr.type=a->type; attr_data_set(&attr, (a+1)); str=attr_to_text(&attr, NULL, 1); fprintf(out," %s=\"%s\"", attr_to_name(a->type), str); g_free(str); } fprintf(out," debug=\"length=%d\"", ib->len); fprintf(out,"\n"); if (ib->type >= type_line) { for (i = 0 ; i < ib->clen/2 ; i++) { dump_coord(c+i,out); fprintf(out,"\n"); } } } void dump_itembin(struct item_bin *ib) { item_bin_dump(ib, stdout); } struct population_table { enum item_type type; int population; }; static struct population_table town_population[] = { {type_town_label_0e0,0}, {type_town_label_1e0,1}, {type_town_label_2e0,2}, {type_town_label_5e0,5}, {type_town_label_1e1,10}, {type_town_label_2e1,20}, {type_town_label_5e1,50}, {type_town_label_1e2,100}, {type_town_label_2e2,200}, {type_town_label_5e2,500}, {type_town_label_1e3,1000}, {type_town_label_2e3,2000}, {type_town_label_5e3,5000}, {type_town_label_1e4,10000}, {type_town_label_2e4,20000}, {type_town_label_5e4,50000}, {type_town_label_1e5,100000}, {type_town_label_2e5,200000}, {type_town_label_5e5,500000}, {type_town_label_1e6,1000000}, {type_town_label_2e6,2000000}, {type_town_label_5e6,5000000}, {type_town_label_1e7,10000000}, }; static struct population_table district_population[] = { {type_district_label_0e0,0}, {type_district_label_1e0,1}, {type_district_label_2e0,2}, {type_district_label_5e0,5}, {type_district_label_1e1,10}, {type_district_label_2e1,20}, {type_district_label_5e1,50}, {type_district_label_1e2,100}, {type_district_label_2e2,200}, {type_district_label_5e2,500}, {type_district_label_1e3,1000}, {type_district_label_2e3,2000}, {type_district_label_5e3,5000}, {type_district_label_1e4,10000}, {type_district_label_2e4,20000}, {type_district_label_5e4,50000}, {type_district_label_1e5,100000}, {type_district_label_2e5,200000}, {type_district_label_5e5,500000}, {type_district_label_1e6,1000000}, {type_district_label_2e6,2000000}, {type_district_label_5e6,5000000}, {type_district_label_1e7,10000000}, }; void item_bin_set_type_by_population(struct item_bin *ib, int population) { struct population_table *table; int i,count; if (population < 0) population=0; if (item_is_district(*ib)) { table=district_population; count=sizeof(district_population)/sizeof(district_population[0]); } else { table=town_population; count=sizeof(town_population)/sizeof(town_population[0]); } for (i = 0 ; i < count ; i++) { if (population < table[i].population) break; } item_bin_set_type(ib, table[i-1].type); } void item_bin_write_match(struct item_bin *ib, enum attr_type type, enum attr_type match, int maxdepth, FILE *out) { char *word=item_bin_get_attr(ib, type, NULL); int i,words=0,len; char tilename[32]=""; if (!word) return; if(maxdepth && ib->clen>0) { struct rect r; struct coord *c=(struct coord *)(ib+1); r.l=c[0]; r.h=c[0]; for (i = 1 ; i < ib->clen/2 ; i++) bbox_extend(&c[i], &r); tile(&r,NULL,tilename,maxdepth,overlap,NULL); } /* insert attr_tile_name attribute before the attribute used as alphabetical key (of type type) */ if(maxdepth) { item_bin_add_attr_string(ib, attr_tile_name, tilename); item_bin_add_attr_string(ib, type, word); item_bin_remove_attr(ib,word); word=item_bin_get_attr(ib, type, NULL); } len=ib->len; do { if (linguistics_search(word)) { for (i = 0 ; i < 3 ; i++) { char *str=linguistics_expand_special(word, i); if (str) { ib->len=len; if (i || words) item_bin_add_attr_string(ib, match, str); item_bin_write(ib, out); g_free(str); } } words++; } word=linguistics_next_word(word); } while (word); } static int item_bin_sort_compare(const void *p1, const void *p2) { struct item_bin *ib1=*((struct item_bin **)p1),*ib2=*((struct item_bin **)p2); struct attr_bin *attr1,*attr2; char *s1,*s2; int ret; attr1=item_bin_get_attr_bin(ib1, attr_tile_name, NULL); attr2=item_bin_get_attr_bin(ib2, attr_tile_name, NULL); if(attr1&&attr2) { s1=(char *)(attr1+1); s2=(char *)(attr2+1); ret=strcmp(s1,s2); if(ret) return ret; } #if 0 dbg_assert(ib1->clen==2); dbg_assert(ib2->clen==2); attr1=(struct attr_bin *)((int *)(ib1+1)+ib1->clen); attr2=(struct attr_bin *)((int *)(ib2+1)+ib1->clen); #else attr1=item_bin_get_attr_bin_last(ib1); attr2=item_bin_get_attr_bin_last(ib2); #endif #if 0 dbg_assert(attr1->type == attr_town_name || attr1->type == attr_town_name_match); dbg_assert(attr2->type == attr_town_name || attr2->type == attr_town_name_match); #endif s1=(char *)(attr1+1); s2=(char *)(attr2+1); if (attr1->type == attr_house_number && attr2->type == attr_house_number) { ret=atoi(s1)-atoi(s2); if (ret) return ret; } s1=linguistics_casefold(s1); s2=linguistics_casefold(s2); ret=strcmp(s1, s2); g_free(s1); g_free(s2); if (!ret) { int match1=0,match2=0; match1=(attr1->type == attr_town_name_match || attr1->type == attr_district_name_match); match2=(attr2->type == attr_town_name_match || attr2->type == attr_district_name_match); ret=match1-match2; } #if 0 fprintf(stderr,"sort_countries_compare p1=%p p2=%p %s %s\n",p1,p2,s1,s2); #endif return ret; } int item_bin_sort_file(char *in_file, char *out_file, struct rect *r, int *size) { int j,k,count,rc=0; struct coord *c; struct item_bin *ib; FILE *f; unsigned char *p,**idx,*buffer; if (file_get_contents(in_file, &buffer, size)) { ib=(struct item_bin *)buffer; p=buffer; count=0; while (p < buffer+*size) { count++; p+=(*((int *)p)+1)*4; } idx=g_malloc(count*sizeof(void *)); p=buffer; for (j = 0 ; j < count ; j++) { idx[j]=p; p+=(*((int *)p)+1)*4; } qsort(idx, count, sizeof(void *), item_bin_sort_compare); f=fopen(out_file,"wb"); for (j = 0 ; j < count ; j++) { ib=(struct item_bin *)(idx[j]); c=(struct coord *)(ib+1); dbg_assert(fwrite(ib, (ib->len+1)*4, 1, f)==1); if (r) { for (k = 0 ; k < ib->clen/2 ; k++) { if (rc) bbox_extend(&c[k], r); else { r->l=c[k]; r->h=c[k]; } rc++; } } } fclose(f); g_free(idx); g_free(buffer); return 1; } return 0; } struct geom_poly_segment * item_bin_to_poly_segment(struct item_bin *ib, int type) { struct geom_poly_segment *ret=g_new(struct geom_poly_segment, 1); int count=ib->clen*sizeof(int)/sizeof(struct coord); ret->type=type; ret->first=g_new(struct coord, count); ret->last=ret->first+count-1; geom_coord_copy((struct coord *)(ib+1), ret->first, count, 0); return ret; } void clip_line(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out) { char *buffer=g_alloca(sizeof(char)*(ib->len*4+32)); struct item_bin *ib_new=(struct item_bin *)buffer; struct coord *pa=(struct coord *)(ib+1); int count=ib->clen/2; struct coord p1,p2; int i,code; item_bin_init(ib_new, ib->type); for (i = 0 ; i < count ; i++) { if (i) { p1.x=pa[i-1].x; p1.y=pa[i-1].y; p2.x=pa[i].x; p2.y=pa[i].y; /* 0 = invisible, 1 = completely visible, 3 = start point clipped, 5 = end point clipped, 7 both points clipped */ code=geom_clip_line_code(&p1, &p2, r); #if 1 if (((code == 1 || code == 5) && ib_new->clen == 0) || (code & 2)) { item_bin_add_coord(ib_new, &p1, 1); } if (code) { item_bin_add_coord(ib_new, &p2, 1); } if (i == count-1 || (code & 4)) { if (param->attr_to_copy) item_bin_copy_attr(ib_new, ib, param->attr_to_copy); if (ib_new->clen) item_bin_write_clipped(ib_new, param, out); item_bin_init(ib_new, ib->type); } #else if (code) { item_bin_init(ib_new, ib->type); item_bin_add_coord(ib_new, &p1, 1); item_bin_add_coord(ib_new, &p2, 1); if (param->attr_to_copy) item_bin_copy_attr(ib_new, ib, param->attr_to_copy); item_bin_write_clipped(ib_new, param, out); } #endif } } } void clip_polygon(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out) { int count_in=ib->clen/2; struct coord *pin,*p,*s,pi; char *buffer1=g_alloca(sizeof(char)*(ib->len*4+ib->clen*7+32)); struct item_bin *ib1=(struct item_bin *)buffer1; char *buffer2=g_alloca(sizeof(char)*(ib->len*4+ib->clen*7+32)); struct item_bin *ib2=(struct item_bin *)buffer2; struct item_bin *ib_in,*ib_out; int edge,i; ib_out=ib1; ib_in=ib; for (edge = 0 ; edge < 4 ; edge++) { count_in=ib_in->clen/2; pin=(struct coord *)(ib_in+1); p=pin; s=pin+count_in-1; item_bin_init(ib_out, ib_in->type); for (i = 0 ; i < count_in ; i++) { if (geom_is_inside(p, r, edge)) { if (! geom_is_inside(s, r, edge)) { geom_poly_intersection(s,p,r,edge,&pi); item_bin_add_coord(ib_out, &pi, 1); } item_bin_add_coord(ib_out, p, 1); } else { if (geom_is_inside(s, r, edge)) { geom_poly_intersection(p,s,r,edge,&pi); item_bin_add_coord(ib_out, &pi, 1); } } s=p; p++; } if (ib_in == ib1) { ib_in=ib2; ib_out=ib1; } else { ib_in=ib1; ib_out=ib2; } } if (ib_in->clen) { if (param->attr_to_copy) item_bin_copy_attr(ib_in, ib, param->attr_to_copy); item_bin_write_clipped(ib_in, param, out); } } navit-0.5.0+dfsg.1/navit/maptool/itembin_buffer.c000066400000000000000000000036631264204753600216540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #include "debug.h" /** Buffer for temporarily storing an item. */ static char misc_item_buffer[20000000]; /** An item_bin for temporary use. */ struct item_bin *tmp_item_bin=(struct item_bin *)(void *)misc_item_buffer; /** A node_item for temporary use. */ static struct node_item *tmp_node_item=(struct node_item *)(void *)misc_item_buffer; struct node_item * read_node_item(FILE *in) { if (fread(tmp_node_item, sizeof(struct node_item), 1, in) != 1) return NULL; return tmp_node_item; } struct item_bin * read_item(FILE *in) { struct item_bin *ib=(struct item_bin *) misc_item_buffer; for (;;) { switch (item_bin_read(ib, in)) { case 0: return NULL; case 2: dbg_assert((ib->len+1)*4 < sizeof(misc_item_buffer)); bytes_read+=(ib->len+1)*sizeof(int); return ib; default: continue; } } } struct item_bin * read_item_range(FILE *in, int *min, int *max) { struct range r; if (fread(&r, sizeof(r), 1, in) != 1) return NULL; *min=r.min; *max=r.max; return read_item(in); } struct item_bin * init_item(enum item_type type) { struct item_bin *ib=(struct item_bin *) misc_item_buffer; item_bin_init(ib, type); return ib; } navit-0.5.0+dfsg.1/navit/maptool/maptool.c000066400000000000000000000740241264204753600203460ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "navit_lfs.h" #include #include #include #include #include #include #include #ifdef _MSC_VER #include "getopt_long.h" #define atoll _atoi64 #else #include #include #include #endif #include #include #include #include "file.h" #include "item.h" #include "map.h" #include "main.h" #include "zipfile.h" #include "linguistics.h" #include "plugin.h" #include "util.h" #include "maptool.h" #define SLIZE_SIZE_DEFAULT_GB 1 long long slice_size=SLIZE_SIZE_DEFAULT_GB*1024ll*1024*1024; int attr_debug_level=1; int ignore_unkown = 0; GHashTable *dedupe_ways_hash; int phase; int slices; int unknown_country; char ch_suffix[] ="r"; /* Used to make compiler happy due to Bug 35903 in gcc */ /** Textual description of available experimental features, or NULL (=none available). */ char* experimental_feature_description = "Move coastline data to order 6 tiles. Makes map look more smooth, but may affect drawing/searching performance."; /* add description here */ /** Indicates if experimental features (if available) were enabled. */ int experimental; struct buffer node_buffer = { 64*1024*1024, }; int processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles; int overlap=1; int bytes_read; static long start_brk; #ifdef _WIN32 #define timespec timeval #endif static struct timespec start_ts; /* Asynchronous signal safe lltoa function (note: no trailing \0 char!) */ int assafe_lltoa(long long n, int maxlen, char *buf) { int i; int out_length; if(maxlen<1) return 0; if(n<0) { n=-n; buf[0]='-'; maxlen--; buf++; } else if(n==0) { buf[0]='0'; return 1; } for(i=0; n>0 && i9?":":":0", buflen-pos, buf+pos); pos+=assafe_lltoa(seconds, buflen-pos, buf+pos); write(2,buf,pos); } static void progress_memory(void) { #ifdef HAVE_SBRK long mem=(long)sbrk(0)-start_brk; const int buflen=20; char buf[buflen]; int pos=1; buf[0]=' '; pos+=assafe_lltoa(mem/1024/1024, buflen-pos, buf+pos); pos+=assafe_strcp2buf(" MB", buflen-pos, buf+pos); write(2,buf,pos); #endif } void sig_alrm_do(int sig) { const int buflen=1024; char buf[buflen]; int pos=0; #ifndef _WIN32 signal(SIGALRM, sig_alrm_do); alarm(30); #endif pos+=assafe_strcp2buf("PROGRESS", buflen-pos, buf+pos); pos+=assafe_lltoa(phase, buflen-pos, buf+pos); pos+=assafe_strcp2buf(": Processed ", buflen-pos, buf+pos); pos+=assafe_lltoa(processed_nodes, buflen-pos, buf+pos); pos+=assafe_strcp2buf(" nodes (", buflen-pos, buf+pos); pos+=assafe_lltoa(processed_nodes_out, buflen-pos, buf+pos); pos+=assafe_strcp2buf(" out) ", buflen-pos, buf+pos); pos+=assafe_lltoa(processed_ways, buflen-pos, buf+pos); pos+=assafe_strcp2buf(" ways ", buflen-pos, buf+pos); pos+=assafe_lltoa(processed_relations, buflen-pos, buf+pos); pos+=assafe_strcp2buf(" relations ", buflen-pos, buf+pos); pos+=assafe_lltoa(processed_tiles, buflen-pos, buf+pos); pos+=assafe_strcp2buf(" tiles", buflen-pos, buf+pos); write(2,buf,pos); progress_time(); progress_memory(); #ifndef _WIN32 write(2,"\r\n",2); #else write(2,"\n",1); #endif } void sig_alrm(int sig) { fflush(stderr); sig_alrm_do(sig); } void sig_alrm_end(void) { #ifndef _WIN32 alarm(0); #endif } static struct files_relation_processing * files_relation_processing_new(FILE *line2poi, char *suffix) { struct files_relation_processing *result = g_new(struct files_relation_processing, 1); result->ways_in=tempfile(suffix,"ways_split",0); result->ways_out=tempfile(suffix,"ways_split_relproc_tmp",1); result->nodes_in=tempfile(suffix,"nodes",0); result->nodes_out=tempfile(suffix,"nodes_relproc_tmp",1); result->nodes2_in=NULL; result->nodes2_out=NULL; if(line2poi) { result->nodes2_in=tempfile(suffix,"way2poi_result",0); result->nodes2_out=tempfile(suffix,"way2poi_result_relproc_tmp",1); } return result; } static void files_relation_processing_destroy(struct files_relation_processing *files_relproc, char *suffix) { fclose(files_relproc->ways_in); fclose(files_relproc->nodes_in); fclose(files_relproc->ways_out); fclose(files_relproc->nodes_out); tempfile_rename(suffix,"ways_split_relproc_tmp","ways_split"); tempfile_rename(suffix,"nodes_relproc_tmp","nodes"); if(files_relproc->nodes2_in) { fclose(files_relproc->nodes2_in); fclose(files_relproc->nodes2_out); tempfile_rename(suffix,"way2poi_result_relproc_tmp","way2poi_result"); } g_free(files_relproc); } static struct plugins *plugins; static void add_plugin(char *path) { struct attr pa_attr={attr_path}; struct attr pl_attr={attr_plugins}; struct attr *attrs[2]={&pa_attr,NULL}; if (! plugins) { file_init(); plugins=plugins_new(); } pa_attr.u.str=path; pl_attr.u.plugins=plugins; plugin_new(&pl_attr,attrs); } static void maptool_init(FILE* rule_file) { if (plugins) plugins_init(plugins); osm_init(rule_file); } static void usage(FILE *f) { /* DEVELOPPERS : don't forget to update the manpage if you modify theses options */ fprintf(f,"\n"); fprintf(f,"maptool - parse osm textfile and convert to Navit binfile format\n\n"); fprintf(f,"Usage (for OSM XML data):\n"); fprintf(f,"bzcat planet.osm.bz2 | maptool mymap.bin\n"); fprintf(f,"Usage (for OSM Protobuf/PBF data):\n"); fprintf(f,"maptool --protobuf -i planet.osm.pbf planet.bin\n"); fprintf(f,"Available switches:\n"); fprintf(f,"-h (--help) : this screen\n"); fprintf(f,"-5 (--md5) : set file where to write md5 sum\n"); fprintf(f,"-6 (--64bit) : set zip 64 bit compression\n"); fprintf(f,"-a (--attr-debug-level) : control which data is included in the debug attribute\n"); fprintf(f,"-c (--dump-coordinates) : dump coordinates after phase 1\n"); #ifdef HAVE_POSTGRESQL fprintf(f,"-d (--db) : get osm data out of a postgresql database with osm simple scheme and given connect string\n"); #endif fprintf(f,"-e (--end) : end at specified phase\n"); fprintf(f,"-E (--experimental) : Enable experimental features (%s)\n", experimental_feature_description ? experimental_feature_description : "-not available in this version-"); fprintf(f,"-i (--input-file) : specify the input file name (OSM), overrules default stdin\n"); fprintf(f,"-k (--keep-tmpfiles) : do not delete tmp files after processing. useful to reuse them\n"); fprintf(f,"-M (--o5m) : input file os o5m\n"); fprintf(f,"-N (--nodes-only) : process only nodes\n"); fprintf(f,"-o (--coverage) : map every street to item coverage\n"); fprintf(f,"-P (--protobuf) : input file is protobuf\n"); fprintf(f,"-r (--rule-file) : read mapping rules from specified file\n"); fprintf(f,"-s (--start) : start at specified phase\n"); fprintf(f,"-S (--slice-size) : limit memory to use for some large internal buffers, in bytes. Default is %dGB.\n", SLIZE_SIZE_DEFAULT_GB); fprintf(f,"-t (--timestamp) y-m-dTh:m:s : Set zip timestamp\n"); fprintf(f,"-w (--dedupe-ways) : ensure no duplicate ways or nodes. useful when using several input files\n"); fprintf(f,"-W (--ways-only) : process only ways\n"); fprintf(f,"-U (--unknown-country) : add objects with unknown country to index\n"); fprintf(f,"-x (--index-size) : set maximum country index size in bytes\n"); fprintf(f,"-z (--compression-level) : set the compression level\n"); fprintf(f,"Internal options (undocumented):\n"); fprintf(f,"-b (--binfile)\n"); fprintf(f,"-B \n"); fprintf(f,"-m (--map) \n"); fprintf(f,"-O \n"); fprintf(f,"-p (--plugin) \n"); exit(1); } struct maptool_params { int zip64; int keep_tmpfiles; int process_nodes; int process_ways; int process_relations; char *protobufdb; char *protobufdb_operation; char *md5file; int start; int end; int output; int o5m; int compression_level; int protobuf; int dump_coordinates; int input; GList *map_handles; FILE* input_file; FILE* rule_file; char *url; struct maptool_osm osm; FILE *ways_split; char *timestamp; char *result; char *dbstr; int node_table_loaded; int countries_loaded; int tilesdir_loaded; int max_index_size; }; static int parse_option(struct maptool_params *p, char **argv, int argc, int *option_index) { char *optarg_cp,*attr_name,*attr_value; struct map *handle; struct attr *attrs[10]; int pos,c,i; static struct option long_options[] = { {"md5", 1, 0, '5'}, {"64bit", 0, 0, '6'}, {"attr-debug-level", 1, 0, 'a'}, {"binfile", 0, 0, 'b'}, {"compression-level", 1, 0, 'z'}, #ifdef HAVE_POSTGRESQL {"db", 1, 0, 'd'}, #endif {"dedupe-ways", 0, 0, 'w'}, {"dump", 0, 0, 'D'}, {"dump-coordinates", 0, 0, 'c'}, {"end", 1, 0, 'e'}, {"experimental", 0, 0, 'E'}, {"help", 0, 0, 'h'}, {"keep-tmpfiles", 0, 0, 'k'}, {"nodes-only", 0, 0, 'N'}, {"map", 1, 0, 'm'}, {"o5m", 0, 0, 'M'}, {"plugin", 1, 0, 'p'}, {"protobuf", 0, 0, 'P'}, {"start", 1, 0, 's'}, {"timestamp", 1, 0, 't'}, {"input-file", 1, 0, 'i'}, {"rule-file", 1, 0, 'r'}, {"ignore-unknown", 0, 0, 'n'}, {"url", 1, 0, 'u'}, {"ways-only", 0, 0, 'W'}, {"slice-size", 1, 0, 'S'}, {"unknown-country", 0, 0, 'U'}, {"index-size", 0, 0, 'x'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "5:6B:DEMNO:PS:Wa:bc" #ifdef HAVE_POSTGRESQL "d:" #endif "e:hi:knm:p:r:s:t:wu:z:Ux:", long_options, option_index); if (c == -1) return 1; switch (c) { case '5': p->md5file=optarg; break; case '6': p->zip64=1; break; case 'B': p->protobufdb=optarg; break; case 'D': p->output=1; break; case 'E': experimental=1; break; case 'M': p->o5m=1; break; case 'N': p->process_ways=0; break; case 'R': p->process_relations=0; break; case 'O': p->protobufdb_operation=optarg; p->output=1; break; case 'P': p->protobuf=1; break; case 'S': slice_size=atoll(optarg); break; case 'W': p->process_nodes=0; break; case 'U': unknown_country=1; break; case 'a': attr_debug_level=atoi(optarg); break; case 'b': p->input=1; break; case 'c': p->dump_coordinates=1; break; #ifdef HAVE_POSTGRESQL case 'd': p->dbstr=optarg; break; #endif case 'e': p->end=atoi(optarg); break; case 'h': return 2; case 'm': optarg_cp=g_strdup(optarg); pos=0; i=0; attr_name=g_strdup(optarg); attr_value=g_strdup(optarg); while (i < 9 && attr_from_line(optarg_cp, NULL, &pos, attr_value, attr_name)) { attrs[i]=attr_new_from_text(attr_name,attr_value); if (attrs[i]) { i++; } else { fprintf(stderr,"Failed to convert %s=%s to attribute\n",attr_name,attr_value); } attr_value=g_strdup(optarg); } attrs[i++]=NULL; g_free(attr_value); g_free(optarg_cp); handle=map_new(NULL, attrs); if (! handle) { fprintf(stderr,"Failed to create map from attributes\n"); exit(1); } p->map_handles=g_list_append(p->map_handles,handle); break; case 'n': fprintf(stderr,"I will IGNORE unknown types\n"); ignore_unkown=1; break; case 'k': fprintf(stderr,"I will KEEP tmp files\n"); p->keep_tmpfiles=1; break; case 'p': add_plugin(optarg); break; case 's': p->start=atoi(optarg); break; case 't': p->timestamp=optarg; break; case 'w': dedupe_ways_hash=g_hash_table_new(NULL, NULL); break; case 'i': p->input_file = fopen( optarg, "r" ); if (p->input_file == NULL ) { fprintf( stderr, "\nInput file (%s) not found\n", optarg ); exit( -1 ); } break; case 'r': p->rule_file = fopen( optarg, "r" ); if (p->rule_file == NULL ) { fprintf( stderr, "\nRule file (%s) not found\n", optarg ); exit( -1 ); } break; case 'u': p->url=optarg; break; case 'x': p->max_index_size=atoi(optarg); break; #ifdef HAVE_ZLIB case 'z': p->compression_level=atoi(optarg); break; #endif case '?': default: return 0; } return 3; } static int start_phase(struct maptool_params *p, char *str) { phase++; if (p->start <= phase && p->end >= phase) { fprintf(stderr,"PROGRESS: Phase %d: %s",phase,str); fflush(stderr); progress_time(); progress_memory(); fprintf(stderr,"\n"); return 1; } else return 0; } static void osm_read_input_data(struct maptool_params *p, char *suffix) { unlink("coords.tmp"); if (p->process_ways) p->osm.ways=tempfile(suffix,"ways",1); if (p->process_nodes) { p->osm.nodes=tempfile(suffix,"nodes",1); p->osm.towns=tempfile(suffix,"towns",1); } if (p->process_ways && p->process_nodes) { p->osm.turn_restrictions=tempfile(suffix,"turn_restrictions",1); p->osm.line2poi=tempfile(suffix,"line2poi",1); p->osm.poly2poi=tempfile(suffix,"poly2poi",1); } if (p->process_relations) { p->osm.boundaries=tempfile(suffix,"boundaries",1); p->osm.associated_streets=tempfile(suffix,"associated_streets",1); p->osm.house_number_interpolations=tempfile(suffix,"house_number_interpolations",1); } #ifdef HAVE_POSTGRESQL if (p->dbstr) map_collect_data_osm_db(p->dbstr,&p->osm); else #endif if (p->map_handles) { GList *l; phase1_map(p->map_handles,p->osm.ways,p->osm.nodes); l=p->map_handles; while (l) { map_destroy(l->data); l=g_list_next(l); } } else if (p->protobuf) { #ifdef _MSC_VER fprintf(stderr,"Option -P not yet supported on MSVC\n"); exit(1); #else map_collect_data_osm_protobuf(p->input_file,&p->osm); #endif } else if (p->o5m) map_collect_data_osm_o5m(p->input_file,&p->osm); else map_collect_data_osm(p->input_file,&p->osm); if (node_buffer.size==0 && !p->map_handles){ fprintf(stderr,"No nodes found - looks like an invalid input file.\n"); exit(1); } flush_nodes(1); if (p->osm.ways) fclose(p->osm.ways); if (p->osm.nodes) fclose(p->osm.nodes); if (p->osm.turn_restrictions) fclose(p->osm.turn_restrictions); if (p->osm.associated_streets) fclose(p->osm.associated_streets); if (p->osm.house_number_interpolations) fclose(p->osm.house_number_interpolations); if (p->osm.boundaries) fclose(p->osm.boundaries); if (p->osm.poly2poi) fclose(p->osm.poly2poi); if (p->osm.line2poi) fclose(p->osm.line2poi); if (p->osm.towns) fclose(p->osm.towns); } int debug_ref=0; static void osm_count_references(struct maptool_params *p, char *suffix, int clear) { int i,first=1; fprintf(stderr,"%d slices\n",slices); for (i = slices-1 ; i>=0 ; i--) { fprintf(stderr, "slice %d of %d\n",slices-i-1,slices-1); if (!first) { FILE *ways=tempfile(suffix,"ways",0); load_buffer("coords.tmp",&node_buffer, i*slice_size, slice_size); if (clear) clear_node_item_buffer(); ref_ways(ways); save_buffer("coords.tmp",&node_buffer, i*slice_size); fclose(ways); } FILE *poly2poi=tempfile(suffix,first?"poly2poi":"poly2poi_resolved",0); FILE *poly2poinew=tempfile(suffix,"poly2poi_resolved_new",1); FILE *line2poi=tempfile(suffix,first?"line2poi":"line2poi_resolved",0); FILE *line2poinew=tempfile(suffix,"line2poi_resolved_new",1); resolve_ways(poly2poi, poly2poinew); resolve_ways(line2poi, line2poinew); fclose(poly2poi); fclose(poly2poinew); fclose(line2poi); fclose(line2poinew); tempfile_rename(suffix,"poly2poi_resolved_new","poly2poi_resolved"); tempfile_rename(suffix,"line2poi_resolved_new","line2poi_resolved"); if (first && !p->keep_tmpfiles) { tempfile_unlink(suffix,"poly2poi"); tempfile_unlink(suffix,"line2poi"); } first=0; } } static void osm_resolve_coords_and_split_at_intersections(struct maptool_params *p, char *suffix) { FILE *ways, *ways_split, *ways_split_index, *graph, *coastline; int i; ways=tempfile(suffix,"ways",0); for (i = 0 ; i < slices ; i++) { int final=(i >= slices-1); ways_split=tempfile(suffix,"ways_split",1); ways_split_index=final ? tempfile(suffix,"ways_split_index",1) : NULL; graph=tempfile(suffix,"graph",1); coastline=tempfile(suffix,"coastline",1); if (i) load_buffer("coords.tmp",&node_buffer, i*slice_size, slice_size); map_resolve_coords_and_split_at_intersections(ways,ways_split,ways_split_index,graph,coastline,final); fclose(ways_split); if (ways_split_index) fclose(ways_split_index); fclose(ways); fclose(graph); fclose(coastline); if (! final) { tempfile_rename(suffix,"ways_split","ways_to_resolve"); ways=tempfile(suffix,"ways_to_resolve",0); } } if(!p->keep_tmpfiles) tempfile_unlink(suffix,"ways"); tempfile_unlink(suffix,"ways_to_resolve"); } static void osm_process_way2poi(struct maptool_params *p, char *suffix) { FILE *poly2poi=tempfile(suffix,"poly2poi_resolved",0); FILE *line2poi=tempfile(suffix,"line2poi_resolved",0); FILE *way2poi_result=tempfile(suffix,"way2poi_result",1); if (poly2poi) { process_way2poi(poly2poi, way2poi_result, type_area); fclose(poly2poi); } if (line2poi) { process_way2poi(line2poi, way2poi_result, type_line); fclose(line2poi); } fclose(way2poi_result); } static void osm_process_coastlines(struct maptool_params *p, char *suffix) { FILE *coastline=tempfile(suffix,"coastline",0); if (coastline) { FILE *coastline_result=tempfile(suffix,"coastline_result",1); process_coastlines(coastline, coastline_result); fclose(coastline_result); fclose(coastline); } } static void osm_process_turn_restrictions(struct maptool_params *p, char *suffix) { FILE *ways_split, *ways_split_index, *relations, *coords; p->osm.turn_restrictions=tempfile(suffix,"turn_restrictions",0); if (!p->osm.turn_restrictions) return; relations=tempfile(suffix,"relations",1); coords=fopen("coords.tmp","rb"); ways_split=tempfile(suffix,"ways_split",0); ways_split_index=tempfile(suffix,"ways_split_index",0); process_turn_restrictions(p->osm.turn_restrictions,coords,ways_split,ways_split_index,relations); fclose(ways_split_index); fclose(ways_split); fclose(coords); fclose(relations); fclose(p->osm.turn_restrictions); if(!p->keep_tmpfiles) tempfile_unlink(suffix,"turn_restrictions"); } static void maptool_dump(struct maptool_params *p, char *suffix) { char *files[10]; int i,files_count=0; if (p->process_nodes) files[files_count++]="nodes"; if (p->process_ways) files[files_count++]="ways_split"; if (p->process_relations) files[files_count++]="relations"; for (i = 0 ; i < files_count ; i++) { FILE *f=tempfile(suffix,files[i],0); if (f) { dump(f); fclose(f); } } } static void maptool_generate_tiles(struct maptool_params *p, char *suffix, char **filenames, int filename_count, int first, char *suffix0) { struct zip_info *zip_info; FILE *tilesdir; FILE *files[10]; int zipnum, f; if (first) { zip_info=zip_new(); zip_set_zip64(zip_info, p->zip64); zip_set_timestamp(zip_info, p->timestamp); } zipnum=zip_get_zipnum(zip_info); tilesdir=tempfile(suffix,"tilesdir",1); if (!strcmp(suffix,ch_suffix)) { /* Makes compiler happy due to bug 35903 in gcc */ ch_generate_tiles(suffix0,suffix,tilesdir,zip_info); } else { for (f = 0 ; f < filename_count ; f++) files[f]=tempfile(suffix,filenames[f],0); phase4(files,filename_count,0,suffix,tilesdir,zip_info); for (f = 0 ; f < filename_count ; f++) { if (files[f]) fclose(files[f]); } } fclose(tilesdir); zip_set_zipnum(zip_info,zipnum); } static void maptool_assemble_map(struct maptool_params *p, char *suffix, char **filenames, char **referencenames, int filename_count, int first, int last, char *suffix0) { FILE *files[10]; FILE *references[10]; struct zip_info *zip_info; int zipnum,f; if (first) { char *zipdir=tempfile_name("zipdir",""); char *zipindex=tempfile_name("index",""); zip_info=zip_new(); zip_set_zip64(zip_info, p->zip64); zip_set_timestamp(zip_info, p->timestamp); zip_set_maxnamelen(zip_info, 14+strlen(suffix0)); zip_set_compression_level(zip_info, p->compression_level); if (p->md5file) zip_set_md5(zip_info, 1); if(!zip_open(zip_info, p->result, zipdir, zipindex)) { fprintf(stderr,"Fatal: Could not write output file.\n"); exit(1); } if (p->url) { map_information_attrs[1].type=attr_url; map_information_attrs[1].u.str=p->url; } index_init(zip_info, 1); } if (!strcmp(suffix,ch_suffix)) { /* Makes compiler happy due to bug 35903 in gcc */ ch_assemble_map(suffix0,suffix,zip_info); } else { for (f = 0 ; f < filename_count ; f++) { files[f]=tempfile(suffix, filenames[f], 0); if (referencenames[f]) references[f]=tempfile(suffix,referencenames[f],1); else references[f]=NULL; } phase5(files,references,filename_count,0,suffix,zip_info); for (f = 0 ; f < filename_count ; f++) { if (files[f]) fclose(files[f]); if (references[f]) fclose(references[f]); } } if(!p->keep_tmpfiles) { tempfile_unlink(suffix,"relations"); tempfile_unlink(suffix,"nodes"); tempfile_unlink(suffix,"ways_split"); tempfile_unlink(suffix,"poly2poi_resolved"); tempfile_unlink(suffix,"line2poi_resolved"); tempfile_unlink(suffix,"ways_split_ref"); tempfile_unlink(suffix,"coastline"); tempfile_unlink(suffix,"turn_restrictions"); tempfile_unlink(suffix,"graph"); tempfile_unlink(suffix,"tilesdir"); tempfile_unlink(suffix,"boundaries"); tempfile_unlink(suffix,"way2poi_result"); tempfile_unlink(suffix,"coastline_result"); tempfile_unlink(suffix,"towns_poly"); unlink("coords.tmp"); } if (last) { unsigned char md5_data[16]; zipnum=zip_get_zipnum(zip_info); add_aux_tiles("auxtiles.txt", zip_info); write_countrydir(zip_info,p->max_index_size); zip_set_zipnum(zip_info, zipnum); write_aux_tiles(zip_info); zip_write_index(zip_info); zip_write_directory(zip_info); zip_close(zip_info); if (p->md5file && zip_get_md5(zip_info, md5_data)) { FILE *md5=fopen(p->md5file,"w"); int i; for (i = 0 ; i < 16 ; i++) fprintf(md5,"%02x",md5_data[i]); fprintf(md5,"\n"); fclose(md5); } if (!p->keep_tmpfiles) { remove_countryfiles(); tempfile_unlink("index",""); tempfile_unlink("zipdir",""); } } } static void maptool_load_node_table(struct maptool_params *p, int last) { if (!p->node_table_loaded) { slices=(sizeof_buffer("coords.tmp")+(long long)slice_size-(long long)1)/(long long)slice_size; assert(slices>0); load_buffer("coords.tmp",&node_buffer,last?(slices-1)*slice_size:0, slice_size); p->node_table_loaded=1; } } static void maptool_load_countries(struct maptool_params *p) { if (!p->countries_loaded) { load_countries(); p->countries_loaded=1; } } static void maptool_load_tilesdir(struct maptool_params *p, char *suffix) { if (!p->tilesdir_loaded) { FILE *tilesdir=tempfile(suffix,"tilesdir",0); load_tilesdir(tilesdir); p->tilesdir_loaded=1; } } int main(int argc, char **argv) { struct maptool_params p; char *suffixes[]={""}; char *suffix=suffixes[0]; char *filenames[20]; char *referencenames[20]; int filename_count=0; int suffix_count=sizeof(suffixes)/sizeof(char *); int i; int suffix_start=0; int option_index=0; main_init(argv[0]); #ifndef HAVE_GLIB _g_slice_thread_init_nomessage(); #endif linguistics_init(); memset(&p, 0, sizeof(p)); #ifdef HAVE_ZLIB p.compression_level=9; #endif p.start=1; p.end=99; p.input_file=stdin; p.process_nodes=1; p.process_ways=1; p.process_relations=1; p.timestamp=current_to_iso8601(); p.max_index_size=65536; #ifdef HAVE_SBRK start_brk=(long)sbrk(0); #endif #ifdef _WIN32 gettimeofday(&start_ts,NULL); #else clock_gettime(CLOCK_REALTIME, &start_ts); #endif while (1) { int parse_result=parse_option(&p, argv, argc, &option_index); if (!parse_result) { usage(stderr); exit(1); } if (parse_result == 1) break; if (parse_result == 2) { usage(stdout); exit(0); } } if (experimental && (!experimental_feature_description )) { fprintf(stderr,"No experimental features available in this version, aborting. \n"); exit(1); } if (optind != argc-(p.output == 1 ? 0:1)) usage(stderr); p.result=argv[optind]; // initialize plugins and OSM mappings maptool_init(p.rule_file); if (p.protobufdb_operation) { #ifdef _MSC_VER fprintf(stderr,"Option -O not yet supported on MSVC\n"); exit(1); #else osm_protobufdb_load(p.input_file, p.protobufdb); return 0; #endif } phase=0; // input from an OSM file if (p.input == 0) { if (start_phase(&p, "reading input data")) { osm_read_input_data(&p, suffix); p.node_table_loaded=1; } if (start_phase(&p, "counting references and resolving ways")) { maptool_load_node_table(&p,1); osm_count_references(&p, suffix, p.start == phase); } if (start_phase(&p,"converting ways to pois")) { osm_process_way2poi(&p, suffix); } if (start_phase(&p,"splitting at intersections")) { if (p.process_ways) { maptool_load_node_table(&p,0); osm_resolve_coords_and_split_at_intersections(&p, suffix); } } free(node_buffer.base); node_buffer.base=NULL; node_buffer.malloced=0; node_buffer.size=0; p.node_table_loaded=0; } else { if (start_phase(&p,"reading data")) { FILE *ways_split=tempfile(suffix,"ways_split",1); process_binfile(stdin, ways_split); fclose(ways_split); } } if (start_phase(&p,"generating coastlines")) { osm_process_coastlines(&p, suffix); } if (start_phase(&p,"assigning towns to countries")) { FILE *towns=tempfile(suffix,"towns",0),*boundaries=NULL,*ways=NULL; if (towns) { boundaries=tempfile(suffix,"boundaries",0); ways=tempfile(suffix,"ways_split",0); osm_process_towns(towns,boundaries,ways,suffix); fclose(ways); fclose(boundaries); fclose(towns); if(!p.keep_tmpfiles) tempfile_unlink(suffix,"towns"); } } if (start_phase(&p,"sorting countries")) { sort_countries(p.keep_tmpfiles); p.countries_loaded=1; } if (start_phase(&p,"generating turn restrictions")) { if (p.process_relations) { osm_process_turn_restrictions(&p, suffix); } if(!p.keep_tmpfiles) tempfile_unlink(suffix,"ways_split_index"); } if (p.process_relations && p.process_ways && p.process_nodes && start_phase(&p,"processing associated street relations")) { struct files_relation_processing *files_relproc = files_relation_processing_new(p.osm.line2poi, suffix); p.osm.associated_streets=tempfile(suffix,"associated_streets",0); if (p.osm.associated_streets) { process_associated_streets(p.osm.associated_streets, files_relproc); fclose(p.osm.associated_streets); files_relation_processing_destroy(files_relproc, suffix); if(!p.keep_tmpfiles) { tempfile_unlink(suffix,"associated_streets"); } } } if (p.process_relations && p.process_ways && p.process_nodes && start_phase(&p,"processing house number interpolations")) { // OSM house number interpolations are handled like a relation. struct files_relation_processing *files_relproc = files_relation_processing_new(p.osm.line2poi, suffix); p.osm.house_number_interpolations=tempfile(suffix,"house_number_interpolations",0); if (p.osm.house_number_interpolations) { process_house_number_interpolations(p.osm.house_number_interpolations, files_relproc); fclose(p.osm.house_number_interpolations); files_relation_processing_destroy(files_relproc, suffix); if(!p.keep_tmpfiles) { tempfile_unlink(suffix,"house_number_interpolations"); } } } if (p.output == 1 && start_phase(&p,"dumping")) { maptool_dump(&p, suffix); exit(0); } if (p.process_relations) { filenames[filename_count]="relations"; referencenames[filename_count++]=NULL; filenames[filename_count]="towns_poly"; referencenames[filename_count++]=NULL; } if (p.process_ways) { filenames[filename_count]="ways_split"; referencenames[filename_count++]=NULL; filenames[filename_count]="coastline_result"; referencenames[filename_count++]=NULL; } if (p.process_nodes) { filenames[filename_count]="nodes"; referencenames[filename_count++]=NULL; filenames[filename_count]="way2poi_result"; referencenames[filename_count++]=NULL; } for (i = suffix_start ; i < suffix_count ; i++) { suffix=suffixes[i]; if (start_phase(&p,"generating tiles")) { maptool_load_countries(&p); maptool_generate_tiles(&p, suffix, filenames, filename_count, i == suffix_start, suffixes[0]); p.tilesdir_loaded=1; } if (start_phase(&p,"assembling map")) { maptool_load_countries(&p); maptool_load_tilesdir(&p, suffix); maptool_assemble_map(&p, suffix, filenames, referencenames, filename_count, i == suffix_start, i == suffix_count-1, suffixes[0]); } phase-=2; } phase+=2; start_phase(&p,"done"); return 0; } navit-0.5.0+dfsg.1/navit/maptool/maptool.h000066400000000000000000000361011264204753600203450ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include #include "coord.h" #include "item.h" #include "attr.h" #include "geom.h" #include "types.h" #ifdef HAVE_LIBCRYPTO #include #endif #define sq(x) ((double)(x)*(x)) #define BUFFER_SIZE 1280 #define debug_tile(x) 0 #define debug_itembin(x) 0 #define RELATION_MEMBER_PRINT_FORMAT "%d:"LONGLONG_FMT":%s" #define RELATION_MEMBER_PARSE_FORMAT "%d:"LONGLONG_FMT":%n" struct tile_data { char buffer[1024]; int tile_depth; struct rect item_bbox; struct rect tile_bbox; }; struct tile_parameter { int min; int max; int overlap; enum attr_type attr_to_copy; }; struct tile_info { int write; int maxlen; char *suffix; GList **tiles_list; FILE *tilesdir_out; }; extern struct tile_head { int num_subtiles; int total_size; char *name; char *zip_data; int total_size_used; int zipnum; int process; struct tile_head *next; // char subtiles[0]; } *tile_head_root; /** * A map item (street, POI, border etc.) as it is stored in a Navit binfile. * Note that this struct only has fields for the header of the item. The * actual data (coordinates and attributes) is stored in memory after * this struct as two arrays of type struct coord and struct attr_bin * respectively. * See also http://wiki.navit-project.org/index.php/Navit%27s_binary_map_driver . * @see struct coord * @see struct attr_bin */ struct item_bin { /** Length of this item (not including this length field) in 32-bit ints. */ int len; /** Item type. */ enum item_type type; /** Length of the following coordinate array in 32-bit ints. */ int clen; }; /** * An attribute for an item_bin as it is stored in a Navit binfile. * Note that this struct only has fields for the header of the attribute. * The attribute value is stored in memory after this struct. The type of the value * (string, number, ...) depends on the attribute type. * @see struct item_bin */ struct attr_bin { /** Length of this attribute (not including this length field) in 32-bit ints. */ int len; /** Attribute type. */ enum attr_type type; }; struct item_bin_sink_func { int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data); void *priv_data[8]; }; struct item_bin_sink { void *priv_data[8]; GList *sink_funcs; }; struct node_item { unsigned int id; char ref_way; struct coord c; }; struct zip_info; struct country_table; /** * Data type for the ID of an OSM element (node/way/relation). * Must be at least 64 bit wide because IDs will soon exceed 32 bit. */ typedef unsigned long long int osmid; #define OSMID_FMT LONGLONG_FMT /** Files needed for processing a relation. */ struct files_relation_processing { FILE *ways_in; FILE *ways_out; FILE *nodes_in; FILE *nodes_out; FILE *nodes2_in; FILE *nodes2_out; }; /* boundaries.c */ struct boundary { struct item_bin *ib; struct country_table *country; char *iso2; GList *segments,*sorted_segments; GList *children; struct rect r; osmid admin_centre; }; char *osm_tag_value(struct item_bin *ib, char *key); osmid boundary_relid(struct boundary *b); GList *process_boundaries(FILE *boundaries, FILE *ways); GList *boundary_find_matches(GList *bl, struct coord *c); void free_boundaries(GList *l); /* buffer.c */ /** A buffer that can be grown as needed. */ struct buffer { /** Number of bytes to extend the buffer by when it must grow. */ int malloced_step; /** Current allocated size (bytes). */ long long malloced; /** Base address of this buffer. */ unsigned char *base; /** Size of currently used part of the buffer. */ long long size; }; void save_buffer(char *filename, struct buffer *b, long long offset); void load_buffer(char *filename, struct buffer *b, long long offset, long long size); long long sizeof_buffer(char *filename); /* ch.c */ void ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info); void ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info); /* coastline.c */ void process_coastlines(FILE *in, FILE *out); /* itembin.c */ int item_bin_read(struct item_bin *ib, FILE *in); void item_bin_set_type(struct item_bin *ib, enum item_type type); void item_bin_init(struct item_bin *ib, enum item_type type); void item_bin_add_coord(struct item_bin *ib, struct coord *c, int count); void item_bin_add_coord_reverse(struct item_bin *ib, struct coord *c, int count); void item_bin_bbox(struct item_bin *ib, struct rect *r); void item_bin_copy_coord(struct item_bin *ib, struct item_bin *from, int dir); void item_bin_copy_attr(struct item_bin *ib, struct item_bin *from, enum attr_type attr); void item_bin_add_coord_rect(struct item_bin *ib, struct rect *r); int attr_bin_write_data(struct attr_bin *ab, enum attr_type type, void *data, int size); int attr_bin_write_attr(struct attr_bin *ab, struct attr *attr); void item_bin_add_attr_data(struct item_bin *ib, enum attr_type type, void *data, int size); void item_bin_add_attr(struct item_bin *ib, struct attr *attr); void item_bin_add_attr_int(struct item_bin *ib, enum attr_type type, int val); void *item_bin_get_attr(struct item_bin *ib, enum attr_type type, void *last); struct attr_bin * item_bin_get_attr_bin(struct item_bin *ib, enum attr_type type, void *last); struct attr_bin * item_bin_get_attr_bin_last(struct item_bin *ib); void item_bin_add_attr_longlong(struct item_bin *ib, enum attr_type type, long long val); void item_bin_add_attr_string(struct item_bin *ib, enum attr_type type, char *str); void item_bin_add_attr_range(struct item_bin *ib, enum attr_type type, short min, short max); void item_bin_remove_attr(struct item_bin *ib, void *ptr); void item_bin_write(struct item_bin *ib, FILE *out); struct item_bin *item_bin_dup(struct item_bin *ib); void item_bin_write_clipped(struct item_bin *ib, struct tile_parameter *param, struct item_bin_sink *out); void item_bin_dump(struct item_bin *ib, FILE *out); void dump_itembin(struct item_bin *ib); void item_bin_set_type_by_population(struct item_bin *ib, int population); void item_bin_write_match(struct item_bin *ib, enum attr_type type, enum attr_type match, int maxdepth, FILE *out); int item_bin_sort_file(char *in_file, char *out_file, struct rect *r, int *size); void clip_line(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out); void clip_polygon(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out); struct geom_poly_segment *item_bin_to_poly_segment(struct item_bin *ib, int type); /* itembin_buffer.c */ struct node_item *read_node_item(FILE *in); struct item_bin *read_item(FILE *in); struct item_bin *read_item_range(FILE *in, int *min, int *max); struct item_bin *init_item(enum item_type type); extern struct item_bin *tmp_item_bin; /* maptool.c */ extern long long slice_size; extern int attr_debug_level; extern char *suffix; extern int ignore_unkown; extern GHashTable *dedupe_ways_hash; extern int slices; extern struct buffer node_buffer; extern int processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles; extern int bytes_read; extern int overlap; extern int unknown_country; extern int experimental; void sig_alrm(int sig); void sig_alrm_end(void); /* misc.c */ extern struct rect world_bbox; void bbox_extend(struct coord *c, struct rect *r); void bbox(struct coord *c, int count, struct rect *r); int contains_bbox(int xl, int yl, int xh, int yh, struct rect *r); int bbox_contains_coord(struct rect *r, struct coord *c); int bbox_contains_bbox(struct rect *out, struct rect *in); long long bbox_area(struct rect const *r); void phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes); void dump(FILE *in); int phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info); int phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info); void process_binfile(FILE *in, FILE *out); void add_aux_tiles(char *name, struct zip_info *info); void cat(FILE *in, FILE *out); int item_order_by_type(enum item_type type); /* osm.c */ struct maptool_osm { FILE *boundaries; FILE *turn_restrictions; FILE *associated_streets; FILE *house_number_interpolations; FILE *nodes; FILE *ways; FILE *line2poi; FILE *poly2poi; FILE *towns; }; /** Type of a relation member. */ enum relation_member_type { UNUSED, rel_member_node, rel_member_way, rel_member_relation, }; void osm_warning(char *type, osmid id, int cont, char *fmt, ...); void osm_info(char *type, osmid id, int cont, char *fmt, ...); void osm_add_tag(char *k, char *v); void osm_add_node(osmid id, double lat, double lon); void osm_add_way(osmid id); void osm_add_relation(osmid id); void osm_end_relation(struct maptool_osm *osm); void osm_add_member(enum relation_member_type type, osmid ref, char *role); void osm_end_way(struct maptool_osm *osm); void osm_end_node(struct maptool_osm *osm); void osm_add_nd(osmid ref); osmid item_bin_get_id(struct item_bin *ib); void flush_nodes(int final); void sort_countries(int keep_tmpfiles); void process_associated_streets(FILE *in, struct files_relation_processing *files_relproc); void process_house_number_interpolations(FILE *in, struct files_relation_processing *files_relproc); void process_turn_restrictions(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out); void process_turn_restrictions_old(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out); void clear_node_item_buffer(void); void ref_ways(FILE *in); void resolve_ways(FILE *in, FILE *out); unsigned long long item_bin_get_nodeid(struct item_bin *ib); unsigned long long item_bin_get_wayid(struct item_bin *ib); unsigned long long item_bin_get_relationid(struct item_bin *ib); void process_way2poi(FILE *in, FILE *out, int type); int map_resolve_coords_and_split_at_intersections(FILE *in, FILE *out, FILE *out_index, FILE *out_graph, FILE *out_coastline, int final); void write_countrydir(struct zip_info *zip_info, int max_index_size); void osm_process_towns(FILE *in, FILE *boundaries, FILE *ways, char *suffix); void load_countries(void); void remove_countryfiles(void); struct country_table * country_from_iso2(char *iso); void osm_init(FILE*); /* osm_o5m.c */ int map_collect_data_osm_o5m(FILE *in, struct maptool_osm *osm); /* osm_psql.c */ int map_collect_data_osm_db(char *dbstr, struct maptool_osm *osm); /* osm_protobuf.c */ int map_collect_data_osm_protobuf(FILE *in, struct maptool_osm *osm); int osm_protobufdb_load(FILE *in, char *dir); /* osm_relations.c */ struct relations * relations_new(void); struct relations_func *relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), void *func_priv); void relations_add_relation_member_entry(struct relations *rel, struct relations_func *func, void *relation_priv, void *member_priv, enum relation_member_type type, osmid id); void relations_add_relation_default_entry(struct relations *rel, struct relations_func *func); void relations_process(struct relations *rel, FILE *nodes, FILE *ways); void relations_destroy(struct relations *rel); /* osm_xml.c */ int osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size); void osm_xml_decode_entities(char *buffer); int map_collect_data_osm(FILE *in, struct maptool_osm *osm); /* sourcesink.c */ struct item_bin_sink *item_bin_sink_new(void); struct item_bin_sink_func *item_bin_sink_func_new(int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)); void item_bin_sink_func_destroy(struct item_bin_sink_func *func); void item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func); void item_bin_sink_destroy(struct item_bin_sink *sink); int item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data); struct item_bin_sink *file_reader_new(FILE *in, int limit, int offset); int file_reader_finish(struct item_bin_sink *sink); int file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data); struct item_bin_sink_func *file_writer_new(FILE *out); int file_writer_finish(struct item_bin_sink_func *file_writer); int tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data); struct item_bin_sink_func *tile_collector_new(struct item_bin_sink *out); /* tempfile.c */ char *tempfile_name(char *suffix, char *name); FILE *tempfile(char *suffix, char *name, int mode); void tempfile_unlink(char *suffix, char *name); void tempfile_rename(char *suffix, char *from, char *to); /* tile.c */ extern GHashTable *tile_hash,*tile_hash2; struct aux_tile { char *name; char *filename; int size; }; extern GList *aux_tile_list; int tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr); void tile_bbox(char *tile, struct rect *r, int overlap); int tile_len(char *tile); void load_tilesdir(FILE *in); void tile_write_item_to_tile(struct tile_info *info, struct item_bin *ib, FILE *reference, char *name); void tile_write_item_minmax(struct tile_info *info, struct item_bin *ib, FILE *reference, int min, int max); int add_aux_tile(struct zip_info *zip_info, char *name, char *filename, int size); int write_aux_tiles(struct zip_info *zip_info); int create_tile_hash(void); void write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out); void merge_tiles(struct tile_info *info); struct attr map_information_attrs[32]; void index_init(struct zip_info *info, int version); void index_submap_add(struct tile_info *info, struct tile_head *th); /* zip.c */ void write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data, int data_size); void zip_write_index(struct zip_info *info); int zip_write_directory(struct zip_info *info); struct zip_info *zip_new(void); void zip_set_md5(struct zip_info *info, int on); int zip_get_md5(struct zip_info *info, unsigned char *out); void zip_set_zip64(struct zip_info *info, int on); void zip_set_compression_level(struct zip_info *info, int level); void zip_set_maxnamelen(struct zip_info *info, int max); int zip_get_maxnamelen(struct zip_info *info); int zip_add_member(struct zip_info *info); int zip_set_timestamp(struct zip_info *info, char *timestamp); int zip_open(struct zip_info *info, char *out, char *dir, char *index); FILE *zip_get_index(struct zip_info *info); int zip_get_zipnum(struct zip_info *info); void zip_set_zipnum(struct zip_info *info, int num); void zip_close(struct zip_info *info); void zip_destroy(struct zip_info *info); navit-0.5.0+dfsg.1/navit/maptool/misc.c000066400000000000000000000231471264204753600176260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #ifndef _MSC_VER #include #include #endif #include #include #include #include "file.h" #include "item.h" #include "map.h" #include "main.h" #include "config.h" #include "zipfile.h" #include "linguistics.h" #include "plugin.h" #include "maptool.h" #define phase1_coord_max 16384 struct rect world_bbox = { { WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MIN_Y}, { WORLD_BOUNDINGBOX_MAX_X, WORLD_BOUNDINGBOX_MAX_Y}, }; void bbox_extend(struct coord *c, struct rect *r) { if (c->x < r->l.x) r->l.x=c->x; if (c->y < r->l.y) r->l.y=c->y; if (c->x > r->h.x) r->h.x=c->x; if (c->y > r->h.y) r->h.y=c->y; } void bbox(struct coord *c, int count, struct rect *r) { if (! count) return; r->l=*c; r->h=*c; while (--count) { c++; bbox_extend(c, r); } } int contains_bbox(int xl, int yl, int xh, int yh, struct rect *r) { if (r->h.x < xl || r->h.x > xh) { return 0; } if (r->l.x > xh || r->l.x < xl) { return 0; } if (r->h.y < yl || r->h.y > yh) { return 0; } if (r->l.y > yh || r->l.y < yl) { return 0; } return 1; } int bbox_contains_coord(struct rect *r, struct coord *c) { if (r->h.x < c->x) return 0; if (r->l.x > c->x) return 0; if (r->h.y < c->y) return 0; if (r->l.y > c->y) return 0; return 1; } int bbox_contains_bbox(struct rect *out, struct rect *in) { if (out->h.x < in->h.x) return 0; if (out->l.x > in->l.x) return 0; if (out->h.y < in->h.y) return 0; if (out->l.y > in->l.y) return 0; return 1; } long long bbox_area(struct rect const *r) { return ((long long)r->h.x-r->l.x)*(r->h.y-r->l.y); } void phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes) { struct map_rect *mr; struct item *item; int count; struct coord ca[phase1_coord_max]; struct attr attr; struct item_bin *item_bin; while (maps) { mr=map_rect_new(maps->data, NULL); while ((item = map_rect_get_item(mr))) { count=item_coord_get(item, ca, item->type < type_line ? 1: phase1_coord_max); item_bin=init_item(item->type); item_bin_add_coord(item_bin, ca, count); while (item_attr_get(item, attr_any, &attr)) { if (attr.type >= attr_type_string_begin && attr.type <= attr_type_string_end) { attr.u.str=map_convert_string(maps->data, attr.u.str); if (attr.u.str) { item_bin_add_attr(item_bin, &attr); map_convert_free(attr.u.str); } } else item_bin_add_attr(item_bin, &attr); } if (item->type >= type_line) item_bin_write(item_bin, out_ways); else item_bin_write(item_bin, out_nodes); } map_rect_destroy(mr); maps=g_list_next(maps); } } int item_order_by_type(enum item_type type) { int max=14; switch (type) { case type_town_label_1e7: case type_town_label_5e6: max=3; break; case type_town_label_2e6: case type_town_label_1e6: max=5; break; case type_town_label_5e5: case type_district_label_1e7: case type_district_label_5e6: case type_district_label_2e6: case type_district_label_1e6: case type_district_label_5e5: max=6; break; case type_town_label_2e5: case type_town_label_1e5: case type_district_label_2e5: case type_district_label_1e5: case type_street_n_lanes: case type_highway_city: case type_highway_land: case type_ramp: max=8; break; case type_town_label_5e4: case type_town_label_2e4: case type_town_label_1e4: case type_district_label_5e4: case type_district_label_2e4: case type_district_label_1e4: max=9; break; case type_poly_water_tiled: if(experimental) max=9; break; case type_street_4_land: case type_street_4_city: max=10; break; case type_town_label_5e3: case type_town_label_2e3: case type_town_label_1e3: case type_district_label_5e3: case type_district_label_2e3: case type_district_label_1e3: case type_street_3_city: case type_street_3_land: max=12; break; default: break; } return max; } static void phase34_process_file(struct tile_info *info, FILE *in, FILE *reference) { struct item_bin *ib; struct attr_bin *a; int max; while ((ib=read_item(in))) { if (ib->type < 0x80000000) processed_nodes++; else processed_ways++; max=item_order_by_type(ib->type); a=item_bin_get_attr_bin(ib, attr_order, NULL); if(a) { int max2=((struct range *)(a+1))->max; if(max>max2) max=max2; } tile_write_item_minmax(info, ib, reference, 0, max); } } static void phase34_process_file_range(struct tile_info *info, FILE *in, FILE *reference) { struct item_bin *ib; int min,max; while ((ib=read_item_range(in, &min, &max))) { if (ib->type < 0x80000000) processed_nodes++; else processed_ways++; tile_write_item_minmax(info, ib, reference, min, max); } } static int phase34(struct tile_info *info, struct zip_info *zip_info, FILE **in, FILE **reference, int in_count, int with_range) { int i; processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0; bytes_read=0; sig_alrm(0); if (! info->write) tile_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i = 0 ; i < in_count ; i++) { if (in[i]) { if (with_range) phase34_process_file_range(info, in[i], reference ? reference[i]:NULL); else phase34_process_file(info, in[i], reference ? reference[i]:NULL); } } if (! info->write) merge_tiles(info); sig_alrm(0); sig_alrm_end(); write_tilesdir(info, zip_info, info->tilesdir_out); return 0; } void dump(FILE *in) { struct item_bin *ib; while ((ib=read_item(in))) { dump_itembin(ib); } } int phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) { struct tile_info info; info.write=0; info.maxlen=0; info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=tilesdir_out; return phase34(&info, zip_info, in, NULL, in_count, with_range); } static int process_slice(FILE **in, FILE **reference, int in_count, int with_range, long long size, char *suffix, struct zip_info *zip_info) { struct tile_head *th; char *slice_data,*zip_data; int zipfiles=0; struct tile_info info; int i; slice_data=malloc(size); assert(slice_data != NULL); zip_data=slice_data; th=tile_head_root; while (th) { if (th->process) { th->zip_data=zip_data; zip_data+=th->total_size; } th=th->next; } for (i = 0 ; i < in_count ; i++) { if (in[i]) fseek(in[i], 0, SEEK_SET); if (reference && reference[i]) { fseek(reference[i], 0, SEEK_SET); } } info.write=1; info.maxlen=zip_get_maxnamelen(zip_info); info.suffix=suffix; info.tiles_list=NULL; info.tilesdir_out=NULL; phase34(&info, zip_info, in, reference, in_count, with_range); for (th=tile_head_root;th;th=th->next) { if (!th->process) continue; if (th->name[0]) { if (th->total_size != th->total_size_used) { fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used); exit(1); } write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size); zipfiles++; } else { dbg_assert(fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info))==1); } } free(slice_data); return zipfiles; } int phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info) { long long size; int slices; int zipnum,written_tiles; struct tile_head *th,*th2; create_tile_hash(); th=tile_head_root; size=0; slices=0; fprintf(stderr, "Maximum slice size "LONGLONG_FMT"\n", slice_size); while (th) { if (size + th->total_size > slice_size) { fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); size=0; slices++; } size+=th->total_size; th=th->next; } if (size) fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); th=tile_head_root; size=0; slices=0; while (th) { th2=tile_head_root; while (th2) { th2->process=0; th2=th2->next; } size=0; while (th && size+th->total_size < slice_size) { size+=th->total_size; th->process=1; th=th->next; } /* process_slice() modifies zip_info, but need to retain old info */ zipnum=zip_get_zipnum(zip_info); written_tiles=process_slice(in, references, in_count, with_range, size, suffix, zip_info); zip_set_zipnum(zip_info, zipnum+written_tiles); slices++; } return 0; } void process_binfile(FILE *in, FILE *out) { struct item_bin *ib; while ((ib=read_item(in))) { item_bin_write(ib, out); } } void add_aux_tiles(char *name, struct zip_info *info) { char buffer[4096]; char *s; FILE *in; FILE *tmp; in=fopen(name,"rb"); if (!in) return; while (fscanf(in,"%s",buffer) == 1) { s=strchr(buffer,'/'); if (s) s++; else s=buffer; tmp=fopen(buffer,"rb"); if (tmp) { fseek(tmp, 0, SEEK_END); add_aux_tile(info, s, buffer, ftell(tmp)); fclose(tmp); } } fclose(in); } navit-0.5.0+dfsg.1/navit/maptool/osm.c000066400000000000000000003041011264204753600174610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "navit_lfs.h" #ifdef _MSC_VER #define strcasecmp _stricmp #define snprintf _snprintf #else #include #endif #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "country.h" #include "file.h" #include "profile.h" #include "types.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #define M_PI_4 0.785398163397448309616 #endif static int in_way, in_node, in_relation; osmid nodeid,wayid; static GHashTable *attr_hash,*country_table_hash,*attr_hash; static char *attr_present; static int attr_present_count; static struct item_bin item; int maxspeed_attr_value; char debug_attr_buffer[BUFFER_SIZE]; int flags[4]; int flagsa[4]; int flags_attr_value; struct attr_bin osmid_attr; long long osmid_attr_value; char is_in_buffer[BUFFER_SIZE]; char attr_strings_buffer[BUFFER_SIZE*16]; int attr_strings_buffer_free_offset; #define MAX_COORD_COUNT 65536 struct coord coord_buffer[MAX_COORD_COUNT]; struct attr_mapping { enum item_type type; int attr_present_idx_count; int attr_present_idx[0]; }; static void nodes_ref_item_bin(struct item_bin *ib); static struct attr_mapping **attr_mapping_node; static int attr_mapping_node_count; static struct attr_mapping **attr_mapping_way; static int attr_mapping_way_count; static struct attr_mapping **attr_mapping_way2poi; static int attr_mapping_way2poi_count; static struct attr_mapping **attr_mapping_rel2poly_place; static int attr_mapping_rel2poly_place_count; static int attr_longest_match(struct attr_mapping **mapping, int mapping_count, enum item_type *types, int types_count); static void attr_longest_match_clear(void); enum attr_strings_type { attr_string_phone, attr_string_fax, attr_string_email, attr_string_url, attr_string_district_name, attr_string_street_name, attr_string_street_name_systematic, attr_string_street_name_systematic_nat, attr_string_street_name_systematic_int, attr_string_ref, attr_string_exit_to, attr_string_street_destination, attr_string_house_number, attr_string_label, attr_string_postal, attr_string_population, attr_string_county_name, attr_string_last, }; char *attr_strings[attr_string_last]; char *osm_types[]={"unknown","node","way","relation"}; #define REF_MARKER (1 << 30) #define IS_REF(c) ((c).x == REF_MARKER) #define GET_REF(c) ((unsigned)(c).y) #define SET_REF(c,ref) do { (c).x = REF_MARKER; (c).y = ref ; } while(0) /* Table of country codes with possible is_in spellings. * Note: If you update this list, check also country array in country.c */ struct country_table { int countryid; char *names; char *admin_levels; FILE *file; int size; struct rect r; int nparts; } country_table[] = { { 4,"Afghanistan"}, { 8,"Albania"}, { 10,"Antarctica"}, { 12,"Algeria"}, { 16,"American Samoa"}, { 20,"Andorra"}, { 24,"Angola"}, { 28,"Antigua and Barbuda"}, { 31,"Azerbaijan"}, { 32,"Argentina,República Argentina,AR "}, { 36,"Australia,AUS"}, { 40,"Austria,Österreich,AUT"}, { 44,"Bahamas"}, { 48,"Bahrain"}, { 50,"Bangladesh"}, { 51,"Armenia"}, { 52,"Barbados"}, { 56,"Belgium,Belgique,Belgie,België,Belgien","345c7M"}, { 60,"Bermuda"}, { 64,"Bhutan"}, { 68,"Bolivia, Plurinational State of"}, { 70,"Bosnia and Herzegovina,Bosna i Hercegovina,Босна и Херцеговина"}, { 72,"Botswana"}, { 74,"Bouvet Island"}, { 76,"Brazil"}, { 84,"Belize"}, { 86,"British Indian Ocean Territory"}, { 90,"Solomon Islands"}, { 92,"Virgin Islands, British"}, { 96,"Brunei Darussalam"}, { 100,"Bulgaria,България"}, { 104,"Myanmar"}, { 108,"Burundi"}, { 112,"Belarus"}, { 116,"Cambodia"}, { 120,"Cameroon"}, { 124,"Canada"}, { 132,"Cape Verde"}, { 136,"Cayman Islands"}, { 140,"Central African Republic"}, { 144,"Sri Lanka"}, { 148,"Chad"}, { 152,"Chile"}, { 156,"China"}, { 158,"Taiwan, Province of China"}, { 162,"Christmas Island"}, { 166,"Cocos (Keeling) Islands"}, { 170,"Colombia"}, { 174,"Comoros"}, { 175,"Mayotte"}, { 178,"Congo"}, { 180,"Congo, the Democratic Republic of the"}, { 184,"Cook Islands"}, { 188,"Costa Rica"}, { 191,"Croatia,Republika Hrvatska,HR"}, { 192,"Cuba"}, { 196,"Cyprus"}, { 203,"Czech Republic,Česká republika,CZ"}, { 204,"Benin"}, { 208,"Denmark,Danmark,DK"}, { 212,"Dominica"}, { 214,"Dominican Republic"}, { 218,"Ecuador"}, { 222,"El Salvador"}, { 226,"Equatorial Guinea"}, { 231,"Ethiopia"}, { 232,"Eritrea"}, { 233,"Estonia"}, { 234,"Faroe Islands,Føroyar"}, { 238,"Falkland Islands (Malvinas)"}, { 239,"South Georgia and the South Sandwich Islands"}, { 242,"Fiji"}, { 246,"Finland,Suomi"}, { 248,"Åland Islands"}, { 250,"France,République française,FR","3s5c7M"}, { 254,"French Guiana"}, { 258,"French Polynesia"}, { 260,"French Southern Territories"}, { 262,"Djibouti"}, { 266,"Gabon"}, { 268,"Georgia"}, { 270,"Gambia"}, { 275,"Palestinian Territory, Occupied"}, { 276,"Germany,Deutschland,Bundesrepublik Deutschland","345c7M"}, { 288,"Ghana"}, { 292,"Gibraltar"}, { 296,"Kiribati"}, { 300,"Greece"}, { 304,"Greenland"}, { 308,"Grenada"}, { 312,"Guadeloupe"}, { 316,"Guam"}, { 320,"Guatemala"}, { 324,"Guinea"}, { 328,"Guyana"}, { 332,"Haiti"}, { 334,"Heard Island and McDonald Islands"}, { 336,"Holy See (Vatican City State)"}, { 340,"Honduras"}, { 344,"Hong Kong"}, { 348,"Hungary,Magyarország"}, { 352,"Iceland"}, { 356,"India"}, { 360,"Indonesia"}, { 364,"Iran, Islamic Republic of"}, { 368,"Iraq"}, { 372,"Ireland"}, { 376,"Israel"}, { 380,"Italy,Italia"}, { 384,"Côte d'Ivoire"}, { 388,"Jamaica"}, { 392,"Japan"}, { 398,"Kazakhstan"}, { 400,"Jordan"}, { 404,"Kenya"}, { 408,"Korea, Democratic People's Republic of"}, { 410,"Korea, Republic of"}, { 414,"Kuwait"}, { 417,"Kyrgyzstan"}, { 418,"Lao People's Democratic Republic"}, { 422,"Lebanon"}, { 426,"Lesotho"}, { 428,"Latvia"}, { 430,"Liberia"}, { 434,"Libyan Arab Jamahiriya"}, { 438,"Liechtenstein"}, { 440,"Lithuania,Lietuva"}, { 442,"Luxembourg"}, { 446,"Macao"}, { 450,"Madagascar"}, { 454,"Malawi"}, { 458,"Malaysia"}, { 462,"Maldives"}, { 466,"Mali"}, { 470,"Malta"}, { 474,"Martinique"}, { 478,"Mauritania"}, { 480,"Mauritius"}, { 484,"Mexico"}, { 492,"Monaco"}, { 496,"Mongolia"}, { 498,"Moldova, Republic of"}, { 499,"Montenegro,Црна Гора,Crna Gora"}, { 500,"Montserrat"}, { 504,"Morocco"}, { 508,"Mozambique"}, { 512,"Oman"}, { 516,"Namibia"}, { 520,"Nauru"}, { 524,"Nepal"}, { 528,"Nederland,The Netherlands,Niederlande,NL,Netherlands","3c567M"}, { 530,"Netherlands Antilles"}, { 531,"Curacao"}, { 533,"Aruba"}, { 534,"Sint Maarten (Dutch part)"}, { 535,"Bonaire, Sint Eustatius and Saba"}, { 540,"New Caledonia"}, { 548,"Vanuatu"}, { 554,"New Zealand"}, { 558,"Nicaragua"}, { 562,"Niger"}, { 566,"Nigeria"}, { 570,"Niue"}, { 574,"Norfolk Island"}, { 578,"Norway,Norge,Noreg,NO"}, { 580,"Northern Mariana Islands"}, { 581,"United States Minor Outlying Islands"}, { 583,"Micronesia, Federated States of"}, { 584,"Marshall Islands"}, { 585,"Palau"}, { 586,"Pakistan"}, { 591,"Panama"}, { 598,"Papua New Guinea"}, { 600,"Paraguay"}, { 604,"Peru"}, { 608,"Philippines"}, { 612,"Pitcairn"}, { 616,"Poland,Polska,PL","3s5cmT"}, { 620,"Portugal"}, { 624,"Guinea-Bissau"}, { 626,"Timor-Leste"}, { 630,"Puerto Rico"}, { 634,"Qatar"}, { 638,"Réunion"}, { 642,"România,Romania,RO"}, { 643,"Россия,Российская Федерация,Russia,Russian Federation","3s5c7m"}, { 646,"Rwanda"}, { 652,"Saint Barthélemy"}, { 654,"Saint Helena, Ascension and Tristan da Cunha"}, { 659,"Saint Kitts and Nevis"}, { 660,"Anguilla"}, { 662,"Saint Lucia"}, { 663,"Saint Martin (French part)"}, { 666,"Saint Pierre and Miquelon"}, { 670,"Saint Vincent and the Grenadines"}, { 674,"San Marino"}, { 678,"Sao Tome and Principe"}, { 682,"Saudi Arabia"}, { 686,"Senegal"}, { 688,"Srbija,Србија,Serbia"}, { 690,"Seychelles"}, { 694,"Sierra Leone"}, { 702,"Singapore"}, { 703,"Slovakia,Slovensko,SK"}, { 704,"Viet Nam"}, { 705,"Slovenia,Republika Slovenija,SI"}, { 706,"Somalia"}, { 710,"South Africa"}, { 716,"Zimbabwe"}, { 724,"Spain,Espana,España,Reino de Espana,Reino de España","345scm"}, { 728,"South Sudan"}, { 732,"Western Sahara"}, { 736,"Sudan"}, { 740,"Suriname"}, { 744,"Svalbard and Jan Mayen"}, { 748,"Swaziland"}, { 752,"Sweden,Sverige,Konungariket Sverige,SE"}, { 756,"Switzerland,Schweiz","3s5c7M"}, { 760,"Syrian Arab Republic"}, { 762,"Tajikistan"}, { 764,"Thailand"}, { 768,"Togo"}, { 772,"Tokelau"}, { 776,"Tonga"}, { 780,"Trinidad and Tobago"}, { 784,"United Arab Emirates"}, { 788,"Tunisia"}, { 792,"Turkey"}, { 795,"Turkmenistan"}, { 796,"Turks and Caicos Islands"}, { 798,"Tuvalu"}, { 800,"Uganda"}, { 804,"Ukraine","3s5c78"}, { 807,"Macedonia,Македонија"}, { 818,"Egypt"}, { 826,"United Kingdom,UK","3s5c7m"}, { 831,"Guernsey"}, { 832,"Jersey"}, { 833,"Isle of Man"}, { 834,"Tanzania, United Republic of"}, { 840,"USA","3s5c7m"}, { 850,"Virgin Islands, U.S."}, { 854,"Burkina Faso"}, { 858,"Uruguay"}, { 860,"Uzbekistan"}, { 862,"Venezuela, Bolivarian Republic of"}, { 876,"Wallis and Futuna"}, { 882,"Samoa"}, { 887,"Yemen"}, { 894,"Zambia"}, { 999,"Unknown"}, }; // first char - item type // =w - ways // =? - used both for nodes and ways // otherwise - nodes static char *attrmap={ "n *=* point_unkn\n" // "n Annehmlichkeit=Hochsitz poi_hunting_stand\n" "? addr:housenumber=* house_number\n" "? aeroway=aerodrome poi_airport\n" "? aeroway=airport poi_airport\n" "? aeroway=helipad poi_heliport\n" "? aeroway=terminal poi_airport\n" "? amenity=atm poi_atm\n" "? amenity=bank poi_bank\n" "? amenity=bar poi_bar\n" "n amenity=bench poi_bench\n" "? amenity=bicycle_rental poi_bicycle_rental\n" "? amenity=bicycle_parking poi_bicycle_parking\n" "? amenity=biergarten poi_biergarten\n" "? amenity=bus_station poi_bus_station\n" "? amenity=cafe poi_cafe\n" "? amenity=car_sharing poi_car_sharing\n" "? amenity=car_wash poi_car_wash\n" "? amenity=cinema poi_cinema\n" "? amenity=college poi_school_college\n" "? amenity=courthouse poi_justice\n" "? amenity=drinking_water poi_potable_water\n" "? amenity=fast_food poi_fastfood\n" "? amenity=fire_station poi_firebrigade\n" "? amenity=fountain poi_fountain\n" "? amenity=fuel poi_fuel\n" "? amenity=grave_yard poi_cemetery\n" "? amenity=hospital poi_hospital\n" "? amenity=hunting_stand poi_hunting_stand\n" "? amenity=kindergarten poi_kindergarten\n" "? amenity=library poi_library\n" "? amenity=nightclub poi_nightclub\n" "? amenity=park_bench poi_bench\n" "? amenity=parking poi_car_parking\n" "? amenity=pharmacy poi_pharmacy\n" "? amenity=place_of_worship,religion=christian poi_church\n" "? amenity=place_of_worship poi_worship\n" "? amenity=police poi_police\n" "? amenity=post_box poi_post_box\n" "? amenity=post_office poi_post_office\n" "? amenity=prison poi_prison\n" "? amenity=pub poi_pub\n" "? amenity=public_building poi_public_office\n" "? amenity=recycling poi_recycling\n" "? amenity=restaurant,cuisine=fine_dining poi_dining\n" "? amenity=restaurant poi_restaurant\n" "? amenity=school poi_school\n" "? amenity=shelter poi_shelter\n" "? amenity=taxi poi_taxi\n" "? amenity=tec_common tec_common\n" "? amenity=telephone poi_telephone\n" "? amenity=theatre poi_theater\n" "? amenity=toilets poi_restroom\n" "? amenity=townhall poi_townhall\n" "? amenity=university poi_school_university\n" "? amenity=vending_machine poi_vending_machine\n" "n barrier=bollard barrier_bollard\n" "n barrier=cycle_barrier barrier_cycle\n" "n barrier=lift_gate barrier_lift_gate\n" "? car=car_rental poi_car_rent\n" "? highway=bus_station poi_bus_station\n" "? highway=bus_stop poi_bus_stop\n" "n highway=mini_roundabout mini_roundabout\n" "n highway=motorway_junction highway_exit\n" "n highway=stop traffic_sign_stop\n" "n highway=toll_booth poi_toll_booth\n" "n highway=traffic_signals traffic_signals\n" "n highway=turning_circle turning_circle\n" "? historic=boundary_stone poi_boundary_stone\n" "? historic=castle poi_castle\n" "? historic=memorial poi_memorial\n" "? historic=monument poi_monument\n" "? historic=ruins poi_ruins\n" // "? historic=* poi_ruins\n" "? landuse=cemetery poi_cemetery\n" "? leisure=fishing poi_fish\n" "? leisure=golf_course poi_golf\n" "? leisure=marina poi_marine\n" "? leisure=playground poi_playground\n" "? leisure=slipway poi_boat_ramp\n" "? leisure=sports_centre poi_sport\n" "? leisure=stadium poi_stadium\n" "? man_made=tower poi_tower\n" "? military=airfield poi_military\n" "? military=barracks poi_military\n" "? military=bunker poi_military\n" "? military=danger_area poi_danger_area\n" "? military=range poi_military\n" "? natural=bay poi_bay\n" "? natural=peak,ele=* poi_peak\n" // show only major peaks with elevation "? natural=tree poi_tree\n" "n place=city town_label_2e5\n" "n place=hamlet town_label_2e2\n" "n place=locality town_label_2e0\n" "n place=suburb district_label\n" "n place=town town_label_2e4\n" "n place=village town_label_2e3\n" "n power=tower power_tower\n" "n power=sub_station power_substation\n" "n railway=halt poi_rail_halt\n" "n railway=level_crossing poi_level_crossing\n" "? railway=station poi_rail_station\n" "? railway=tram_stop poi_rail_tram_stop\n" "? shop=baker poi_shop_baker\n" "? shop=bakery poi_shop_baker\n" "? shop=beverages poi_shop_beverages\n" "? shop=bicycle poi_shop_bicycle\n" "? shop=butcher poi_shop_butcher\n" "? shop=car poi_car_dealer_parts\n" "? shop=car_repair poi_repair_service\n" "? shop=clothes poi_shop_apparel\n" "? shop=convenience poi_shop_grocery\n" "? shop=drogist poi_shop_drugstore\n" "? shop=florist poi_shop_florist\n" "? shop=fruit poi_shop_fruit\n" "? shop=furniture poi_shop_furniture\n" "? shop=garden_centre poi_shop_handg\n" "? shop=hardware poi_shop_handg\n" "? shop=hairdresser poi_hairdresser\n" "? shop=kiosk poi_shop_kiosk\n" "? shop=optician poi_shop_optician\n" "? shop=parfum poi_shop_parfum\n" "? shop=photo poi_shop_photo\n" "? shop=shoes poi_shop_shoes\n" "? shop=supermarket poi_shopping\n" "? sport=10pin poi_bowling\n" "? sport=baseball poi_baseball\n" "? sport=basketball poi_basketball\n" "? sport=climbing poi_climbing\n" "? sport=golf poi_golf\n" "? sport=motor_sports poi_motor_sport\n" "? sport=skiing poi_skiing\n" "? sport=soccer poi_soccer\n" "? sport=stadium poi_stadium\n" "? sport=swimming poi_swimming\n" "? sport=tennis poi_tennis\n" "? tourism=attraction poi_attraction\n" "? tourism=camp_site poi_camp_rv\n" "? tourism=caravan_site poi_camp_rv\n" "? tourism=guest_house poi_guesthouse\n" "? tourism=hostel poi_hostel\n" "? tourism=hotel poi_hotel\n" "? tourism=information poi_information\n" "? tourism=motel poi_motel\n" "? tourism=museum poi_museum_history\n" "? tourism=picnic_site poi_picnic\n" "? tourism=theme_park poi_resort\n" "? tourism=viewpoint poi_viewpoint\n" "? tourism=zoo poi_zoo\n" "n traffic_sign=city_limit traffic_sign_city_limit\n" "n highway=speed_camera tec_common\n" "w *=* street_unkn\n" "w addr:interpolation=even house_number_interpolation_even\n" "w addr:interpolation=odd house_number_interpolation_odd\n" "w addr:interpolation=all house_number_interpolation_all\n" "w addr:interpolation=alphabetic house_number_interpolation_alphabetic\n" "w aerialway=cable_car lift_cable_car\n" "w aerialway=chair_lift lift_chair\n" "w aerialway=drag_lift lift_drag\n" "w aeroway=aerodrome poly_airport\n" "w aeroway=apron poly_apron\n" "w aeroway=runway aeroway_runway\n" "w aeroway=taxiway aeroway_taxiway\n" "w aeroway=terminal poly_terminal\n" "w amenity=college poly_college\n" "w amenity=grave_yard poly_cemetery\n" "w amenity=parking poly_car_parking\n" "w amenity=place_of_worship poly_building\n" "w amenity=university poly_university\n" "w boundary=administrative,admin_level=2 border_country\n" "w boundary=civil border_civil\n" "w boundary=national_park border_national_park\n" "w boundary=political border_political\n" "w building=* poly_building\n" "w contour_ext=elevation_major height_line_1\n" "w contour_ext=elevation_medium height_line_2\n" "w contour_ext=elevation_minor height_line_3\n" "w highway=bridleway bridleway\n" "w highway=bus_guideway bus_guideway\n" "w highway=construction street_construction\n" "w highway=cyclepath cycleway\n" "w highway=cycleway cycleway\n" "w highway=footway footway\n" "w highway=footway,piste:type=nordic footway_and_piste_nordic\n" "w highway=living_street living_street\n" "w highway=minor street_1_land\n" "w highway=parking_lane street_parking_lane\n" "w highway=path path\n" "w highway=path,bicycle=designated cycleway\n" "w highway=path,bicycle=official cycleway\n" "w highway=path,bicycle=designated,foot=designated cycleway\n" "w highway=path,bicycle=official,foot=official cycleway\n" "w highway=path,foot=designated footway\n" "w highway=path,foot=official footway\n" "w highway=path,horse=designated bridleway\n" "w highway=path,horse=official bridleway\n" "w highway=path,sac_scale=alpine_hiking hiking_alpine\n" "w highway=path,sac_scale=demanding_alpine_hiking hiking_alpine_demanding\n" "w highway=path,sac_scale=demanding_mountain_hiking hiking_mountain_demanding\n" "w highway=path,sac_scale=difficult_alpine_hiking hiking_alpine_difficult\n" "w highway=path,sac_scale=hiking hiking\n" "w highway=path,sac_scale=mountain_hiking hiking_mountain\n" "w highway=pedestrian street_pedestrian\n" "w highway=pedestrian,area=1 poly_pedestrian\n" "w highway=plaza poly_plaza\n" "w highway=motorway highway_land\n" "w highway=motorway,rural=0 highway_city\n" "w highway=motorway_link ramp\n" "w highway=trunk street_n_lanes\n" "w highway=trunk_link ramp\n" "w highway=primary street_4_land\n" "w highway=primary,name=*,rural=1 street_4_land\n" "w highway=primary,name=* street_4_city\n" "w highway=primary,rural=0 street_4_city\n" "w highway=primary_link ramp\n" "w highway=secondary street_3_land\n" "w highway=secondary,name=*,rural=1 street_3_land\n" "w highway=secondary,name=* street_3_city\n" "w highway=secondary,rural=0 street_3_city\n" "w highway=secondary,area=1 poly_street_3\n" "w highway=secondary_link ramp\n" "w highway=tertiary street_2_land\n" "w highway=tertiary,name=*,rural=1 street_2_land\n" "w highway=tertiary,name=* street_2_city\n" "w highway=tertiary,rural=0 street_2_city\n" "w highway=tertiary,area=1 poly_street_2\n" "w highway=tertiary_link ramp\n" "w highway=residential street_1_city\n" "w highway=residential,area=1 poly_street_1\n" "w highway=unclassified street_1_city\n" "w highway=unclassified,area=1 poly_street_1\n" "w highway=road street_1_city\n" "w highway=service street_service\n" "w highway=service,area=1 poly_service\n" "w highway=service,service=parking_aisle street_parking_lane\n" "w highway=track track_gravelled\n" "w highway=track,surface=grass track_grass\n" "w highway=track,surface=gravel track_gravelled\n" "w highway=track,surface=ground track_ground\n" "w highway=track,surface=paved track_paved\n" "w highway=track,surface=unpaved track_unpaved\n" "w highway=track,tracktype=grade1 track_paved\n" "w highway=track,tracktype=grade2 track_gravelled\n" "w highway=track,tracktype=grade3 track_unpaved\n" "w highway=track,tracktype=grade4 track_ground\n" "w highway=track,tracktype=grade5 track_grass\n" "w highway=track,surface=paved,tracktype=grade1 track_paved\n" "w highway=track,surface=gravel,tracktype=grade2 track_gravelled\n" "w highway=track,surface=unpaved,tracktype=grade3 track_unpaved\n" "w highway=track,surface=ground,tracktype=grade4 track_ground\n" "w highway=track,surface=grass,tracktype=grade5 track_grass\n" "w highway=unsurfaced track_gravelled\n" "w highway=steps steps\n" "w historic=archaeological_site poly_archaeological_site\n" "w historic=battlefield poly_battlefield\n" "w historic=ruins poly_ruins\n" "w historic=town_gate poly_building\n" "w landuse=allotments poly_allotments\n" "w landuse=basin poly_basin\n" "w landuse=brownfield poly_brownfield\n" "w landuse=cemetery poly_cemetery\n" "w landuse=commercial poly_commercial\n" "w landuse=construction poly_construction\n" "w landuse=farm poly_farm\n" "w landuse=farmland poly_farm\n" "w landuse=farmyard poly_town\n" "w landuse=forest poly_wood\n" "w landuse=greenfield poly_greenfield\n" "w landuse=industrial poly_industry\n" "w landuse=landfill poly_landfill\n" "w landuse=military poly_military\n" "w landuse=meadow poly_meadow\n" "w landuse=plaza poly_plaza\n" "w landuse=quarry poly_quarry\n" "w landuse=railway poly_railway\n" "w landuse=recreation_ground poly_recreation_ground\n" "w landuse=reservoir poly_reservoir\n" "w landuse=residential poly_town\n" "w landuse=residential,area=1 poly_town\n" "w landuse=retail poly_retail\n" "w landuse=village_green poly_village_green\n" "w landuse=vineyard poly_farm\n" "w leisure=common poly_common\n" "w leisure=fishing poly_fishing\n" "w leisure=garden poly_garden\n" "w leisure=golf_course poly_golf_course\n" "w leisure=marina poly_marina\n" "w leisure=nature_reserve poly_nature_reserve\n" "w leisure=park poly_park\n" "w leisure=pitch poly_sports_pitch\n" "w leisure=playground poly_playground\n" "w leisure=sports_centre poly_sport\n" "w leisure=stadium poly_sports_stadium\n" "w leisure=track poly_sports_track\n" "w leisure=water_park poly_water_park\n" "w military=airfield poly_airfield\n" "w military=barracks poly_barracks\n" "w military=danger_area poly_danger_area\n" "w military=naval_base poly_naval_base\n" "w military=range poly_range\n" "w natural=beach poly_beach\n" "w natural=coastline water_line\n" "w natural=fell poly_fell\n" "w natural=glacier poly_glacier\n" "w natural=heath poly_heath\n" "w natural=land poly_land\n" "w natural=marsh poly_marsh\n" "w natural=meadow poly_meadow\n" "w natural=mud poly_mud\n" "w natural=scree poly_scree\n" "w natural=scrub poly_scrub\n" "w natural=water poly_water\n" "w natural=wood poly_wood\n" "w piste:type=downhill,piste:difficulty=advanced piste_downhill_advanced\n" "w piste:type=downhill,piste:difficulty=easy piste_downhill_easy\n" "w piste:type=downhill,piste:difficulty=expert piste_downhill_expert\n" "w piste:type=downhill,piste:difficulty=freeride piste_downhill_freeride\n" "w piste:type=downhill,piste:difficulty=intermediate piste_downhill_intermediate\n" "w piste:type=downhill,piste:difficulty=novice piste_downhill_novice\n" "w piste:type=nordic piste_nordic\n" "w place=suburb poly_place1\n" "w place=hamlet poly_place2\n" "w place=isolated_dwelling poly_place2\n" "w place=locality poly_place2\n" "w place=village poly_place3\n" "w place=municipality poly_place4\n" "w place=town poly_place5\n" "w place=city poly_place6\n" "w de:place=city poly_place6\n" "w power=line powerline\n" "w railway=abandoned rail_abandoned\n" "w railway=disused rail_disused\n" "w railway=light_rail rail_light\n" "w railway=monorail rail_mono\n" "w railway=narrow_gauge rail_narrow_gauge\n" "w railway=preserved rail_preserved\n" "w railway=rail rail\n" "w railway=subway rail_subway\n" "w railway=tram rail_tram\n" "w route=ferry ferry\n" "w route=ski piste_nordic\n" "w sport=* poly_sport\n" "w tourism=artwork poly_artwork\n" "w tourism=attraction poly_attraction\n" "w tourism=camp_site poly_camp_site\n" "w tourism=caravan_site poly_caravan_site\n" "w tourism=picnic_site poly_picnic_site\n" "w tourism=theme_park poly_theme_park\n" "w tourism=zoo poly_zoo\n" "w waterway=canal water_canal\n" "w waterway=drain water_drain\n" "w waterway=river water_river\n" "w waterway=riverbank poly_water\n" "w waterway=stream water_stream\n" "w barrier=ditch ditch\n" "w barrier=hedge hedge\n" "w barrier=fence fence\n" "w barrier=wall wall\n" "w barrier=retaining_wall retaining_wall\n" "w barrier=city_wall city_wall\n" }; static void build_attrmap_line(char *line) { char *t=NULL,*kvl=NULL,*i=NULL,*p,*kv; struct attr_mapping *attr_mapping=g_malloc0(sizeof(struct attr_mapping)); int idx,attr_mapping_count=0; t=line; p=strpbrk(t," \t"); if (p) { while (*p && isspace(*p)) *p++='\0'; kvl=p; p=strpbrk(kvl," \t");; } if (p) { while (*p && isspace(*p)) *p++='\0'; i=p; } if (t[0] == 'w') { if (! i) i="street_unkn"; } else { if (! i) i="point_unkn"; } attr_mapping->type=item_from_name(i); if (!attr_mapping->type) { printf("no id found for '%s'\n",i); } while ((kv=strtok(kvl, ","))) { kvl=NULL; if (!(idx=(int)(long)g_hash_table_lookup(attr_hash, kv))) { idx=attr_present_count++; g_hash_table_insert(attr_hash, kv, (gpointer)(long)idx); } attr_mapping=g_realloc(attr_mapping, sizeof(struct attr_mapping)+(attr_mapping_count+1)*sizeof(int)); attr_mapping->attr_present_idx[attr_mapping_count++]=idx; attr_mapping->attr_present_idx_count=attr_mapping_count; } if (t[0]== 'w') { attr_mapping_way=g_realloc(attr_mapping_way, sizeof(*attr_mapping_way)*(attr_mapping_way_count+1)); attr_mapping_way[attr_mapping_way_count++]=attr_mapping; if(item_is_poly_place(*attr_mapping)) { attr_mapping_rel2poly_place=g_realloc(attr_mapping_rel2poly_place, sizeof(*attr_mapping_rel2poly_place)*(attr_mapping_rel2poly_place_count+1)); attr_mapping_rel2poly_place[attr_mapping_rel2poly_place_count++]=attr_mapping; } } if (t[0]== '?') { attr_mapping_way2poi=g_realloc(attr_mapping_way2poi, sizeof(*attr_mapping_way2poi)*(attr_mapping_way2poi_count+1)); attr_mapping_way2poi[attr_mapping_way2poi_count++]=attr_mapping; } if (t[0]!= 'w') { attr_mapping_node=g_realloc(attr_mapping_node, sizeof(*attr_mapping_node)*(attr_mapping_node_count+1)); attr_mapping_node[attr_mapping_node_count++]=attr_mapping; } } static void build_attrmap(FILE* rule_file) { attr_hash=g_hash_table_new(g_str_hash, g_str_equal); attr_present_count=1; // build attribute map from rule file if given if( rule_file ) { char buffer[200], *p; while (fgets( buffer, 200, rule_file )) { p=strchr(buffer,'\n'); if(p) *p = 0; build_attrmap_line( g_strdup( buffer ) ); } fclose( rule_file ); } // use hardcoded default attributes else { char *p,*map=g_strdup(attrmap); while (map) { p=strchr(map,'\n'); if (p) *p++='\0'; if (strlen(map)) build_attrmap_line(map); map=p; } } attr_present=g_malloc0(sizeof(*attr_present)*attr_present_count); } static void build_countrytable(void) { int i; char *names,*str,*tok; country_table_hash=g_hash_table_new(g_str_hash, g_str_equal); for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { names=g_strdup(country_table[i].names); str=names; while ((tok=strtok(str, ","))) { str=NULL; g_hash_table_insert(country_table_hash, tok, (gpointer)&country_table[i]); } } } void osm_warning(char *type, osmid id, int cont, char *fmt, ...) { char str[4096]; va_list ap; va_start(ap, fmt); vsnprintf(str, sizeof(str), fmt, ap); va_end(ap); fprintf(stderr,"%shttp://www.openstreetmap.org/browse/%s/"OSMID_FMT" %s",cont ? "":"OSM Warning:",type,id,str); } void osm_info(char *type, osmid id, int cont, char *fmt, ...) { char str[4096]; va_list ap; va_start(ap, fmt); vsnprintf(str, sizeof(str), fmt, ap); va_end(ap); fprintf(stderr,"%shttp://www.openstreetmap.org/browse/%s/"OSMID_FMT" %s",cont ? "":"OSM Info:",type,id,str); } static void attr_strings_clear(void) { attr_strings_buffer_free_offset=0; memset(attr_strings, 0, sizeof(attr_strings)); } static void attr_strings_save(enum attr_strings_type id, char *str) { int str_size=strlen(str)+1; dbg_assert(attr_strings_buffer_free_offset+str_sizetype < 0x80000000) return item_bin_get_nodeid(ib); ret=item_bin_get_wayid(ib); if (!ret) ret=item_bin_get_relationid(ib); return ret; } static int node_is_tagged; static void relation_add_tag(char *k, char *v); static int access_value(char *v) { if (!strcmp(v,"1")) return 1; if (!strcmp(v,"yes")) return 1; if (!strcmp(v,"designated")) return 1; if (!strcmp(v,"official")) return 1; if (!strcmp(v,"permissive")) return 1; if (!strcmp(v,"0")) return 2; if (!strcmp(v,"no")) return 2; if (!strcmp(v,"agricultural")) return 2; if (!strcmp(v,"forestry")) return 2; if (!strcmp(v,"private")) return 2; if (!strcmp(v,"delivery")) return 2; if (!strcmp(v,"destination")) return 2; return 3; } static void osm_update_attr_present(char *k, char *v); void osm_add_tag(char *k, char *v) { int level=2; if (in_relation) { relation_add_tag(k,v); return; } if (! strcmp(k,"ele")) level=9; if (! strcmp(k,"time")) level=9; if (! strcmp(k,"created_by")) level=9; if (! strncmp(k,"tiger:",6) || !strcmp(k,"AND_nodes")) level=9; if (! strcmp(k,"converted_by") || ! strcmp(k,"source")) level=8; if (! strncmp(k,"osmarender:",11) || !strncmp(k,"svg:",4)) level=8; if (! strcmp(k,"layer")) level=7; if (! strcasecmp(v,"true") || ! strcasecmp(v,"yes")) v="1"; if (! strcasecmp(v,"false") || ! strcasecmp(v,"no")) v="0"; if (! strcmp(k,"oneway")) { if (!strcmp(v,"1")) { flags[0] |= AF_ONEWAY | AF_ROUNDABOUT_VALID; } if (! strcmp(v,"-1")) { flags[0] |= AF_ONEWAYREV | AF_ROUNDABOUT_VALID; } if (!in_way) level=6; else level=5; } if (! strcmp(k,"junction")) { if (! strcmp(v,"roundabout")) flags[0] |= AF_ONEWAY | AF_ROUNDABOUT | AF_ROUNDABOUT_VALID; } if (! strcmp(k,"maxspeed")) { if (strstr(v, "mph")) { maxspeed_attr_value = (int)floor(atof(v) * 1.609344); } else { maxspeed_attr_value = atoi(v); } if (maxspeed_attr_value) flags[0] |= AF_SPEED_LIMIT; level=5; } if (! strcmp(k,"toll")) { if (!strcmp(v,"1")) { flags[0] |= AF_TOLL; } } if (! strcmp(k,"access")) { if (strcmp(v,"destination")) flagsa[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED|AF_HORSE|AF_BIKE|AF_PEDESTRIAN; else flags[0] |= AF_THROUGH_TRAFFIC_LIMIT; level=5; } if (! strcmp(k,"vehicle")) { flags[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED|AF_BIKE; level=5; } if (! strcmp(k,"motor_vehicle")) { flags[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED; level=5; } if (! strcmp(k,"bicycle")) { flags[access_value(v)] |= AF_BIKE; level=5; } if (! strcmp(k,"foot")) { flags[access_value(v)] |= AF_PEDESTRIAN; level=5; } if (! strcmp(k,"horse")) { flags[access_value(v)] |= AF_HORSE; level=5; } if (! strcmp(k,"moped")) { flags[access_value(v)] |= AF_MOPED; level=5; } if (! strcmp(k,"motorcycle")) { flags[access_value(v)] |= AF_MOTORCYCLE; level=5; } if (! strcmp(k,"motorcar")) { flags[access_value(v)] |= AF_CAR; level=5; } if (! strcmp(k,"hov")) { flags[access_value(v)] |= AF_HIGH_OCCUPANCY_CAR; level=5; } if (! strcmp(k,"bus")) { flags[access_value(v)] |= AF_PUBLIC_BUS; level=5; } if (! strcmp(k,"taxi")) { flags[access_value(v)] |= AF_TAXI; level=5; } if (! strcmp(k,"goods")) { flags[access_value(v)] |= AF_DELIVERY_TRUCK; level=5; } if (! strcmp(k,"hgv")) { flags[access_value(v)] |= AF_TRANSPORT_TRUCK; level=5; } if (! strcmp(k,"emergency")) { flags[access_value(v)] |= AF_EMERGENCY_VEHICLES; level=5; } if (! strcmp(k,"hazmat")) { flags[access_value(v)] |= AF_DANGEROUS_GOODS; level=5; } if (! strcmp(k,"tunnel") && !strcmp(v,"1")) { flags[0] |= AF_UNDERGROUND; } if (! strcmp(k,"note")) level=5; if (! strcmp(k,"name")) { attr_strings_save(attr_string_label, v); level=5; } if (! strcmp(k,"addr:email")) { attr_strings_save(attr_string_email, v); level=5; } if (! strcmp(k,"addr:suburb")) { attr_strings_save(attr_string_district_name, v); level=5; } if (! strcmp(k,"addr:housenumber")) { attr_strings_save(attr_string_house_number, v); level=5; } if (! strcmp(k,"addr:street")) { attr_strings_save(attr_string_street_name, v); level=5; } if (! strcmp(k,"phone")) { attr_strings_save(attr_string_phone, v); level=5; } if (! strcmp(k,"fax")) { attr_strings_save(attr_string_fax, v); level=5; } if (! strcmp(k,"postal_code")) { attr_strings_save(attr_string_postal, v); level=5; } if (! strcmp(k,"addr:postcode") && !attr_strings[attr_string_postal]) { attr_strings_save(attr_string_postal, v); level=5; } if (! strcmp(k,"openGeoDB:postal_codes") && !attr_strings[attr_string_postal]) { attr_strings_save(attr_string_postal, v); level=5; } if (! strcmp(k,"population")) { attr_strings_save(attr_string_population, v); level=5; } if (! strcmp(k,"openGeoDB:population") && !attr_strings[attr_string_population]) { attr_strings_save(attr_string_population, v); level=5; } if ((! strcmp(k,"ref")) || (! strcmp(k,"destination:ref"))) { if (in_way) attr_strings_save(attr_string_street_name_systematic, v); /* for exit number of highway_exit poi */ else attr_strings_save(attr_string_ref, v); level=5; } if (! strcmp(k,"nat_ref")) { if (in_way) attr_strings_save(attr_string_street_name_systematic_nat, v); level=5; } if (! strcmp(k,"int_ref")) { if (in_way) attr_strings_save(attr_string_street_name_systematic_int, v); level=5; } if (! strcmp(k,"destination")) { if (in_way) attr_strings_save(attr_string_street_destination, v); level=5; } if (! strcmp(k,"exit_to")) { attr_strings_save(attr_string_exit_to, v); level=5; } if (! strcmp(k,"openGeoDB:is_in")) { if (!is_in_buffer[0]) g_strlcpy(is_in_buffer, v, sizeof(is_in_buffer)); level=5; } if (! strcmp(k,"is_in")) { if (!is_in_buffer[0]) g_strlcpy(is_in_buffer, v, sizeof(is_in_buffer)); level=5; } if (! strcmp(k,"is_in:country")) { /** * Sometimes there is no is_in tag, only is_in:country. * I put this here so it can be overwritten by the previous if clause if there IS an is_in tag. */ g_strlcpy(is_in_buffer, v, sizeof(is_in_buffer)); level=5; } if (! strcmp(k,"place_county")) { /** * Ireland uses the place_county OSM tag to describe what county a town is in. * This would be equivalent to is_in: Town; Locality; Country * A real world example would be Node: Moycullen (52234625) * The tag is processed as Moycullen; Galway; Ireland * where Galway is the county */ g_strlcpy(is_in_buffer, "Ireland", sizeof(is_in_buffer)); attr_strings_save(attr_string_county_name, v); level=5; } if (! strcmp(k,"gnis:ST_alpha")) { /* assume a gnis tag means it is part of the USA: http://en.wikipedia.org/wiki/Geographic_Names_Information_System many US towns do not have is_in tags */ g_strlcpy(is_in_buffer, "USA", sizeof(is_in_buffer)); level=5; } if (! strcmp(k,"lanes")) { level=5; } if (attr_debug_level >= level) { int bytes_left = sizeof( debug_attr_buffer ) - strlen(debug_attr_buffer) - 1; if ( bytes_left > 0 ) { snprintf(debug_attr_buffer+strlen(debug_attr_buffer), bytes_left, " %s=%s", k, v); debug_attr_buffer[ sizeof( debug_attr_buffer ) - 1 ] = '\0'; node_is_tagged=1; } } if (level < 6) node_is_tagged=1; osm_update_attr_present(k, v); } static void osm_update_attr_present(char *k, char *v) { const int bufsize=BUFFER_SIZE*2+2; int idx; char *p, buffer[bufsize]; g_strlcpy(buffer,"*=*", bufsize); if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) { dbg_assert(idxmalloced+=b->malloced_step; b->base=realloc(b->base, b->malloced); if (b->base == NULL) { fprintf(stderr,"realloc of %d bytes failed\n",(int)b->malloced); exit(1); } } /** The node currently being processed. */ static struct node_item *current_node; /** ID of the last node processed. */ osmid id_last_node; GHashTable *node_hash,*way_hash; static void node_buffer_to_hash(void) { int i,count=node_buffer.size/sizeof(struct node_item); struct node_item *ni=(struct node_item *)node_buffer.base; for (i = 0 ; i < count ; i++) g_hash_table_insert(node_hash, (gpointer)(long)(ni[i].id), (gpointer)(long)i); } void flush_nodes(int final) { fprintf(stderr,"flush_nodes %d\n",final); save_buffer("coords.tmp",&node_buffer,slices*slice_size); if (!final) { node_buffer.size=0; } slices++; } static struct node_item* allocate_node_item_in_buffer(void) { struct node_item* new_node; if (node_buffer.size + sizeof(struct node_item) > node_buffer.malloced) extend_buffer(&node_buffer); if (node_buffer.size + sizeof(struct node_item) > slice_size) { flush_nodes(0); } new_node=(struct node_item *)(node_buffer.base+node_buffer.size); node_buffer.size+=sizeof(struct node_item); return new_node; } static void remove_last_node_item_from_buffer(void) { node_buffer.size-=sizeof(struct node_item); } void osm_add_node(osmid id, double lat, double lon) { in_node=1; attr_strings_clear(); node_is_tagged=0; nodeid=id; item.type=type_point_unkn; debug_attr_buffer[0]='\0'; is_in_buffer[0]='\0'; debug_attr_buffer[0]='\0'; osmid_attr.type=attr_osm_nodeid; osmid_attr.len=3; osmid_attr_value=id; current_node=allocate_node_item_in_buffer(); current_node->id=id; current_node->ref_way=0; current_node->c.x=lon*6371000.0*M_PI/180; current_node->c.y=log(tan(M_PI_4+lat*M_PI/360))*6371000.0; if (! node_hash) { if (current_node->id > id_last_node) { id_last_node=current_node->id; } else { fprintf(stderr,"INFO: Nodes out of sequence (new " OSMID_FMT " vs old " OSMID_FMT "), adding hash\n", (osmid)current_node->id, id_last_node); node_hash=g_hash_table_new(NULL, NULL); node_buffer_to_hash(); } } else if (!g_hash_table_lookup(node_hash, (gpointer)(long)(current_node->id))) g_hash_table_insert(node_hash, (gpointer)(long)(current_node->id), (gpointer)(long)(current_node-(struct node_item *)node_buffer.base)); else { remove_last_node_item_from_buffer(); nodeid=0; } } void clear_node_item_buffer(void) { int j,count=node_buffer.size/sizeof(struct node_item); struct node_item *ni=(struct node_item *)(node_buffer.base); for (j = 0 ; j < count ; j++) { ni[j].ref_way=0; } } static long long node_item_find_index_in_ordered_list(osmid id) { struct node_item *node_buffer_base=(struct node_item *)(node_buffer.base); long long node_count=node_buffer.size/sizeof(struct node_item); long long search_step=node_count>4 ? node_count/4 : 1; long long search_index=node_count/2; if (node_buffer_base[0].id > id) return -1; if (node_buffer_base[node_count-1].id < id) return -1; while (node_buffer_base[search_index].id != id) { #if 0 fprintf(stderr,"search_index=%d node_count=%d search_step=%d id=%d node_buffer_base[search_index].id=%d\n", search_index, node_count, search_step, id, node_buffer_base[search_index].id); #endif if (node_buffer_base[search_index].id < id) { search_index+=search_step; if (search_step == 1) { if (search_index >= node_count) return -1; if (node_buffer_base[search_index].id > id) return -1; } else { if (search_index >= node_count) search_index=node_count-1; } } else { search_index-=search_step; if (search_step == 1) { if (search_index < 0) return -1; if (node_buffer_base[search_index].id < id) return -1; } else { if (search_index < 0) search_index=0; } } if (search_step > 1) search_step/=2; } return search_index; } static struct node_item * node_item_get(osmid id) { struct node_item *node_buffer_base=(struct node_item *)(node_buffer.base); long long result_index; if (node_hash) { // Use g_hash_table_lookup_extended instead of g_hash_table_lookup // to distinguish a key with a value 0 from a missing key. if (!g_hash_table_lookup_extended (node_hash, (gpointer)(long)(id), NULL, (gpointer)&result_index)) { result_index=-1; } } else { result_index=node_item_find_index_in_ordered_list(id); } return result_index!=-1 ? node_buffer_base+result_index : NULL; } #if 0 static int load_node(FILE *coords, int p, struct node_item *ret) { fseek(coords, p*sizeof(struct node_item), SEEK_SET); if (fread(ret, sizeof(*ret), 1, coords) != 1) { fprintf(stderr,"read failed\n"); return 0; } return 1; } #endif #if 0 static int node_item_get_from_file(FILE *coords, osmid id, struct node_item *ret) { int count; int interval; int p; if (node_hash) { int i; i=(int)(long)(g_hash_table_lookup(node_hash, (gpointer)(long)id)); fseek(coords, i*sizeof(*ret), SEEK_SET); if (fread(ret, sizeof(*ret), 1, coords) == 1) return 1; else return 0; } fseek(coords, 0, SEEK_END); count=ftello(coords)/sizeof(struct node_item); interval=count/4; p=count/2; if(interval==0) { // If fewer than 4 nodes defined so far set interval to 1 to // avoid infinite loop interval = 1; } if (!load_node(coords, p, ret)) return 0; for (;;) { if (ret->id == id) return 1; if (ret->id < id) { p+=interval; if (interval == 1) { if (p >= count) return 0; if (!load_node(coords, p, ret)) return 0; if (ret->id > id) return 0; } else { if (p >= count) p=count-1; if (!load_node(coords, p, ret)) return 0; } } else { p-=interval; if (interval == 1) { if (p < 0) return 0; if (!load_node(coords, p, ret)) return 0; if (ret->id < id) return 0; } else { if (p < 0) p=0; if (!load_node(coords, p, ret)) return 0; } } if (interval > 1) interval/=2; } } #endif void osm_add_way(osmid id) { static osmid wayid_last; in_way=1; wayid=id; coord_count=0; attr_strings_clear(); item.type=type_street_unkn; debug_attr_buffer[0]='\0'; maxspeed_attr_value=0; flags_attr_value = 0; memset(flags, 0, sizeof(flags)); memset(flagsa, 0, sizeof(flagsa)); debug_attr_buffer[0]='\0'; osmid_attr_value=id; if (wayid < wayid_last && !way_hash) { fprintf(stderr,"INFO: Ways out of sequence (new "OSMID_FMT" vs old "OSMID_FMT"), adding hash\n", wayid, wayid_last); way_hash=g_hash_table_new(NULL, NULL); } wayid_last=wayid; } char relation_type[BUFFER_SIZE]; char iso_code[BUFFER_SIZE]; int boundary; void osm_add_relation(osmid id) { osmid_attr_value=id; in_relation=1; debug_attr_buffer[0]='\0'; relation_type[0]='\0'; iso_code[0]='\0'; boundary=0; item_bin_init(tmp_item_bin, type_none); item_bin_add_attr_longlong(tmp_item_bin, attr_osm_relationid, osmid_attr_value); } static int country_id_from_iso2(char *iso) { int ret=0; if (iso) { struct country_search *search; struct attr country_iso2,country_id; struct item *item; country_iso2.type=attr_country_iso2; country_iso2.u.str=iso; search=country_search_new(&country_iso2,0); if ((item=country_search_get_item(search)) && item_attr_get(item, attr_country_id, &country_id)) ret=country_id.u.num; country_search_destroy(search); } return ret; } static struct country_table * country_from_countryid(int id) { int i; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { if (country_table[i].countryid == id) return &country_table[i]; } return NULL; } struct country_table * country_from_iso2(char *iso) { return country_from_countryid(country_id_from_iso2(iso)); } void osm_end_relation(struct maptool_osm *osm) { enum item_type type; in_relation=0; if(attr_longest_match(attr_mapping_rel2poly_place, attr_mapping_rel2poly_place_count, &type, 1)) { tmp_item_bin->type=type; } else type=type_none; if ((!strcmp(relation_type, "multipolygon") || !strcmp(relation_type, "boundary")) && (boundary || type!=type_none)) { item_bin_write(tmp_item_bin, osm->boundaries); } if (!strcmp(relation_type, "restriction") && (tmp_item_bin->type == type_street_turn_restriction_no || tmp_item_bin->type == type_street_turn_restriction_only)) item_bin_write(tmp_item_bin, osm->turn_restrictions); if (!strcmp(relation_type, "associatedStreet") ) item_bin_write(tmp_item_bin, osm->associated_streets); attr_longest_match_clear(); } void osm_add_member(enum relation_member_type type, osmid ref, char *role) { const int bufsize=BUFFER_SIZE*3+3; char member_buffer[bufsize]; struct attr memberattr = { attr_osm_member }; snprintf(member_buffer,bufsize, RELATION_MEMBER_PRINT_FORMAT, (int)type, (long long) ref, role); memberattr.u.str=member_buffer; item_bin_add_attr(tmp_item_bin, &memberattr); } static void relation_add_tag(char *k, char *v) { int add_tag=1; #if 0 fprintf(stderr,"add tag %s %s\n",k,v); #endif if (!strcmp(k,"type")) { g_strlcpy(relation_type, v, sizeof(relation_type)); add_tag=0; } else if (!strcmp(k,"restriction")) { if (!strncmp(v,"no_",3)) { tmp_item_bin->type=type_street_turn_restriction_no; add_tag=0; } else if (!strncmp(v,"only_",5)) { tmp_item_bin->type=type_street_turn_restriction_only; add_tag=0; } else { tmp_item_bin->type=type_none; osm_warning("relation", osmid_attr_value, 0, "Unknown restriction %s\n",v); } } else if (!strcmp(k,"boundary")) { if (!strcmp(v,"administrative") || !strcmp(v,"postal_code")) { boundary=1; } } else if (!strcmp(k,"ISO3166-1")) { g_strlcpy(iso_code, v, sizeof(iso_code)); } if (add_tag) { char *tag; tag=g_alloca(strlen(k)+strlen(v)+2); sprintf(tag,"%s=%s",k,v); item_bin_add_attr_string(tmp_item_bin, attr_osm_tag, tag); } osm_update_attr_present(k,v); } static int attr_longest_match(struct attr_mapping **mapping, int mapping_count, enum item_type *types, int types_count) { int i,j,longest=0,ret=0,sum,val; struct attr_mapping *curr; for (i = 0 ; i < mapping_count ; i++) { sum=0; curr=mapping[i]; for (j = 0 ; j < curr->attr_present_idx_count ; j++) { val=attr_present[curr->attr_present_idx[j]]; if (val) sum+=val; else { sum=-1; break; } } if (sum > longest) { longest=sum; ret=0; } if (sum > 0 && sum == longest && ret < types_count) types[ret++]=curr->type; } return ret; } static void attr_longest_match_clear(void) { memset(attr_present, 0, sizeof(*attr_present)*attr_present_count); } void osm_end_way(struct maptool_osm *osm) { int i,count; int *def_flags,add_flags; enum item_type types[10]; struct item_bin *item_bin; int count_lines=0, count_areas=0; in_way=0; if (! osm->ways) return; if (dedupe_ways_hash) { if (g_hash_table_lookup(dedupe_ways_hash, (gpointer)(long)wayid)) return; g_hash_table_insert(dedupe_ways_hash, (gpointer)(long)wayid, (gpointer)1); } count=attr_longest_match(attr_mapping_way, attr_mapping_way_count, types, sizeof(types)/sizeof(enum item_type)); if (!count) { count=1; types[0]=type_street_unkn; } if (count >= 10) { fprintf(stderr,"way id "OSMID_FMT"\n",osmid_attr_value); dbg_assert(count < 10); } for (i = 0 ; i < count ; i++) { add_flags=0; if (types[i] == type_none) continue; if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn)) continue; if (types[i] != type_street_unkn) { if(types[i]0) item_bin_add_attr_int(item_bin, attr_duplicate, 1); item_bin_write(item_bin,osm->ways); if (types[i]>=type_house_number_interpolation_even && types[i]<=type_house_number_interpolation_alphabetic){ struct item_bin *item_bin_interpolation_way=init_item(types[i]); item_bin_add_attr_longlong(item_bin, attr_osm_wayid, osmid_attr_value); item_bin_add_attr_longlong(item_bin, attr_osm_nodeid_first_node, GET_REF(coord_buffer[0])); item_bin_add_attr_longlong(item_bin, attr_osm_nodeid_last_node, GET_REF(coord_buffer[coord_count-1])); item_bin_write(item_bin_interpolation_way, osm->house_number_interpolations); } } if(osm->line2poi) { count=attr_longest_match(attr_mapping_way2poi, attr_mapping_way2poi_count, types, sizeof(types)/sizeof(enum item_type)); dbg_assert(count < 10); for (i = 0 ; i < count ; i++) { if (types[i] == type_none || types[i] == type_point_unkn) continue; item_bin=init_item(types[i]); item_bin_add_coord(item_bin, coord_buffer, coord_count); item_bin_add_attr_string(item_bin, attr_label, attr_strings[attr_string_label]); item_bin_add_attr_string(item_bin, attr_house_number, attr_strings[attr_string_house_number]); item_bin_add_attr_string(item_bin, attr_district_name, attr_strings[attr_string_district_name]); item_bin_add_attr_string(item_bin, attr_street_name, attr_strings[attr_string_street_name]); item_bin_add_attr_string(item_bin, attr_phone, attr_strings[attr_string_phone]); item_bin_add_attr_string(item_bin, attr_fax, attr_strings[attr_string_fax]); item_bin_add_attr_string(item_bin, attr_email, attr_strings[attr_string_email]); item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); item_bin_add_attr_string(item_bin, attr_url, attr_strings[attr_string_url]); item_bin_add_attr_longlong(item_bin, attr_osm_wayid, osmid_attr_value); item_bin_write(item_bin, count_areas<=count_lines ? osm->line2poi:osm->poly2poi); } } attr_longest_match_clear(); } void osm_end_node(struct maptool_osm *osm) { int count,i; char *postal; enum item_type types[10]; struct item_bin *item_bin; in_node=0; if (!osm->nodes || ! node_is_tagged || ! nodeid) return; count=attr_longest_match(attr_mapping_node, attr_mapping_node_count, types, sizeof(types)/sizeof(enum item_type)); if (!count) { types[0]=type_point_unkn; count=1; } if (count >= 10) { fprintf(stderr,"node id "OSMID_FMT"\n",osmid_attr_value); dbg_assert(count < 10); } for (i = 0 ; i < count ; i++) { if (types[i] == type_none) continue; if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn)) continue; item_bin=init_item(types[i]); if (item_is_town(*item_bin) && attr_strings[attr_string_population]) item_bin_set_type_by_population(item_bin, atoi(attr_strings[attr_string_population])); item_bin_add_coord(item_bin, ¤t_node->c, 1); item_bin_add_attr_string(item_bin, item_is_town(*item_bin) ? attr_town_name : attr_label, attr_strings[attr_string_label]); item_bin_add_attr_string(item_bin, attr_house_number, attr_strings[attr_string_house_number]); item_bin_add_attr_string(item_bin, attr_street_name, attr_strings[attr_string_street_name]); item_bin_add_attr_string(item_bin, attr_phone, attr_strings[attr_string_phone]); item_bin_add_attr_string(item_bin, attr_fax, attr_strings[attr_string_fax]); item_bin_add_attr_string(item_bin, attr_email, attr_strings[attr_string_email]); item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); item_bin_add_attr_string(item_bin, attr_url, attr_strings[attr_string_url]); item_bin_add_attr_longlong(item_bin, attr_osm_nodeid, osmid_attr_value); item_bin_add_attr_string(item_bin, attr_ref, attr_strings[attr_string_ref]); item_bin_add_attr_string(item_bin, attr_exit_to, attr_strings[attr_string_exit_to]); item_bin_add_attr_string(item_bin, attr_debug, debug_attr_buffer); postal=attr_strings[attr_string_postal]; if (postal) { char *sep=strchr(postal,','); if (sep) *sep='\0'; item_bin_add_attr_string(item_bin, item_is_town(*item_bin) ? attr_town_postal : attr_postal, postal); } item_bin_write(item_bin,osm->nodes); if (item_is_town(*item_bin) && attr_strings[attr_string_label] && osm->towns) { item_bin=init_item(item_bin->type); item_bin_add_coord(item_bin, ¤t_node->c, 1); item_bin_add_attr_string(item_bin, attr_osm_is_in, is_in_buffer); item_bin_add_attr_longlong(item_bin, attr_osm_nodeid, osmid_attr_value); item_bin_add_attr_string(item_bin, attr_town_postal, postal); item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); item_bin_add_attr_string(item_bin, item_is_district(*item_bin)?attr_district_name:attr_town_name, attr_strings[attr_string_label]); item_bin_write(item_bin, osm->towns); } } processed_nodes_out++; attr_longest_match_clear(); } static struct country_table * osm_process_town_unknown_country(void) { static struct country_table *unknown; if (!unknown) unknown=country_from_countryid(999); return unknown; } static struct country_table * osm_process_town_by_is_in(struct item_bin *ib,char *is_in, struct attr *attrs, GHashTable *town_hash) { struct country_table *result=NULL, *lookup; char *tok,*dup=g_strdup(is_in),*buf=dup; int conflict=0; int find_town_name = 0; if(!is_in) return NULL; if (item_is_district(*ib)) find_town_name = 1; while ((tok=strtok(buf, ",;"))) { while (*tok==' ') tok++; if (find_town_name && g_hash_table_lookup(town_hash, tok)) { attrs[10].type = attr_town_name; attrs[10].u.str = g_strdup(tok); find_town_name = 0; } lookup=g_hash_table_lookup(country_table_hash,tok); if (lookup) { if (result && result->countryid != lookup->countryid) { conflict=1; } result=lookup; } buf=NULL; } g_free(dup); if(conflict) { char *label=item_bin_get_attr(ib, attr_town_name, NULL); osm_warning("node",item_bin_get_nodeid(ib),0,"Country conflict for %s is_in=%s, choosen country %d (%s)\n", label, is_in, result->countryid, result->names); } return result; } static struct country_table * osm_process_town_by_boundary(GList *bl, struct item_bin *ib, struct coord *c, struct attr *attrs) { GList *l,*matches=boundary_find_matches(bl, c); struct boundary *match=NULL; l=matches; while (l) { struct boundary *b=l->data; if (b->country) { if (match && match->country->countryid!=b->country->countryid) { osm_warning("node",item_bin_get_nodeid(ib),0,"node (0x%x,0x%x) country conflict: ", c->x, c->y); osm_warning("relation",boundary_relid(match),1,"replacing country %d (%s) with ",match->country->countryid, match->country->names); osm_warning("relation",boundary_relid(b),1,"country %d (%s)\n",b->country->countryid, b->country->names); } match=b; } l=g_list_next(l); } if (match) { if (match && match->country && match->country->admin_levels) { long long *nodeid=item_bin_get_attr(ib, attr_osm_nodeid, NULL); long long node_id=0; int end=strlen(match->country->admin_levels)+3; int a; int max_adm_level=0; if(nodeid) node_id=*nodeid; l=matches; while (l) { struct boundary *b=l->data; char *boundary_admin_level_string=osm_tag_value(b->ib, "admin_level"); char *postal=osm_tag_value(b->ib, "postal_code"); if (boundary_admin_level_string) { char *name; a=atoi(boundary_admin_level_string); if (a > 2 && a < end) { enum attr_type attr_type=attr_none; switch(match->country->admin_levels[a-3]) { case 's': attr_type=attr_state_name; break; case 'c': attr_type=attr_county_name; break; case 'M': b->ib->type=type_poly_place6; case 'm': attr_type=attr_municipality_name; break; case 'T': b->ib->type=type_poly_place6; break; } name=osm_tag_value(b->ib, "name"); if (name && attr_type != attr_none) { attrs[a-2].type=attr_type; attrs[a-2].u.str=name; } } if(b->admin_centre && b->admin_centre==node_id) { if(!max_adm_level || max_adm_level0) for(a=end-1;a>max_adm_level && a>2;a--) attrs[a-2].type=type_none; } g_list_free(matches); return match->country; } else { g_list_free(matches); return NULL; } } static void osm_town_relations_to_poly(GList *boundaries, FILE *towns_poly) { while(boundaries) { struct boundary *b=boundaries->data; if(item_is_poly_place(*b->ib)) { GList *s=b->sorted_segments; while(s) { struct geom_poly_segment *seg=s->data; if((seg->type==geom_poly_segment_type_way_outer || seg->type==geom_poly_segment_type_way_unknown) && coord_is_equal(*seg->first,*seg->last)) { struct item_bin *ib=init_item(b->ib->type); void *a; item_bin_add_coord(ib, seg->first, seg->last-seg->first+1); a=osm_tag_value(b->ib, "name"); if(a) item_bin_add_attr_string(ib,attr_label,a); a=osm_tag_value(b->ib, "osm_relationid"); if(a) item_bin_add_attr_longlong(ib,attr_osm_relationid,atol(a)); item_bin_write(ib, towns_poly); } s=g_list_next(s); } } osm_town_relations_to_poly(b->children, towns_poly); boundaries=g_list_next(boundaries); } } void osm_process_towns(FILE *in, FILE *boundaries, FILE *ways, char *suffix) { struct item_bin *ib; GList *bl; GHashTable *town_hash; struct attr attrs[11]; FILE *towns_poly; processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0; bytes_read=0; sig_alrm(0); bl=process_boundaries(boundaries, ways); fprintf(stderr, "Processed boundaries\n"); town_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); while ((ib=read_item(in))) { if (!item_is_district(*ib)) { char *townname=item_bin_get_attr(ib, attr_town_name, NULL); g_hash_table_insert(town_hash, strdup(townname), (gpointer)1); } } fseek(in, 0, SEEK_SET); fprintf(stderr, "Finished town table rebuild\n"); while ((ib=read_item(in))) { struct coord *c=(struct coord *)(ib+1); struct country_table *result=NULL; char *is_in=item_bin_get_attr(ib, attr_osm_is_in, NULL); int i; processed_nodes++; memset(attrs, 0, sizeof(attrs)); result=osm_process_town_by_boundary(bl, ib, c, attrs); if (!result) result=osm_process_town_by_is_in(ib, is_in, attrs, town_hash); else if (item_is_district(*ib)) // just for the town name osm_process_town_by_is_in(ib, is_in, attrs, town_hash); // treat a district like a town, if we could not find the town it belongs to if (!item_bin_get_attr(ib, attr_town_name, NULL) && attrs[10].type != attr_town_name) { char *district_name = item_bin_get_attr(ib, attr_district_name, NULL); if (district_name) { struct attr attr_new_town_name; attr_new_town_name.type = attr_town_name; attr_new_town_name.u.str = district_name; item_bin_add_attr(ib, &attr_new_town_name); item_bin_remove_attr(ib, district_name); } } if (!result && unknown_country) result=osm_process_town_unknown_country(); if (result) { if (!result->file) { char *name=g_strdup_printf("country_%d.unsorted.tmp", result->countryid); result->file=fopen(name,"wb"); g_free(name); } if (result->file) { long long *nodeid; if (is_in) item_bin_remove_attr(ib, is_in); nodeid=item_bin_get_attr(ib, attr_osm_nodeid, NULL); if (nodeid) item_bin_remove_attr(ib, nodeid); if (attrs[0].type != attr_none) { char *postal=item_bin_get_attr(ib, attr_town_postal, NULL); if (postal) item_bin_remove_attr(ib, postal); } for (i = 0 ; i < 11 ; i++) { if (attrs[i].type != attr_none) item_bin_add_attr(ib, &attrs[i]); } if(item_bin_get_attr(ib, attr_district_name, NULL)) item_bin_write_match(ib, attr_district_name, attr_district_name_match, 5, result->file); else item_bin_write_match(ib, attr_town_name, attr_town_name_match, 5, result->file); } } } towns_poly=tempfile(suffix,"towns_poly",1); osm_town_relations_to_poly(bl, towns_poly); fclose(towns_poly); g_hash_table_destroy(town_hash); free_boundaries(bl); sig_alrm(0); sig_alrm_end(); fprintf(stderr, "Finished processing towns\n"); } void sort_countries(int keep_tmpfiles) { int i; struct country_table *co; char *name_in,*name_out; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; if (co->file) { fclose(co->file); co->file=NULL; } name_in=g_strdup_printf("country_%d.unsorted.tmp", co->countryid); name_out=g_strdup_printf("country_%d.tmp", co->countryid); co->r=world_bbox; item_bin_sort_file(name_in, name_out, &co->r, &co->size); if (!keep_tmpfiles) unlink(name_in); g_free(name_in); g_free(name_out); } } struct relation_member { enum relation_member_type type; long long id; char *role; }; static void parse_relation_member_string(char *relation_member_string, struct relation_member *memb) { int len; int type_numeric; sscanf(relation_member_string,RELATION_MEMBER_PARSE_FORMAT,&type_numeric,&memb->id,&len); memb->type=(enum relation_member_type)type_numeric; memb->role=relation_member_string+len; } static int search_relation_member(struct item_bin *ib, char *role, struct relation_member *memb, int *min_count) { char *str=NULL; int count=0; while ((str=item_bin_get_attr(ib, attr_osm_member, str))) { parse_relation_member_string(str, memb); count++; if (!strcmp(memb->role, role) && (!min_count || *min_count < count)) { if (min_count) *min_count=count; return 1; } } return 0; } #if 0 static int load_way_index(FILE *ways_index, int p, long long *idx) { int step=sizeof(*idx)*2; fseek(ways_index, p*step, SEEK_SET); if (fread(idx, step, 1, ways_index) != 1) { fprintf(stderr,"read failed\n"); return 0; } return 1; } #endif #if 0 static int seek_to_way(FILE *way, FILE *ways_index, osmid wayid) { long offset; long long idx[2]; int count,interval,p; if (way_hash) { if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)wayid, NULL, (gpointer)&offset))) return 0; fseek(way, offset, SEEK_SET); return 1; } fseek(ways_index, 0, SEEK_END); count=ftello(ways_index)/sizeof(idx); interval=count/4; p=count/2; if(interval==0) { // If fewer than 4 nodes defined so far set interval to 1 to // avoid infinite loop interval = 1; } if (!load_way_index(ways_index, p, idx)) return 0; for (;;) { if (idx[0] == wayid) { fseek(way, idx[1], SEEK_SET); return 1; } if (idx[0] < wayid) { p+=interval; if (interval == 1) { if (p >= count) return 0; if (!load_way_index(ways_index, p, idx)) return 0; if (idx[0] > wayid) return 0; } else { if (p >= count) p=count-1; if (!load_way_index(ways_index, p, idx)) return 0; } } else { p-=interval; if (interval == 1) { if (p < 0) return 0; if (!load_way_index(ways_index, p, idx)) return 0; if (idx[0] < wayid) return 0; } else { if (p < 0) p=0; if (!load_way_index(ways_index, p, idx)) return 0; } } if (interval > 1) interval/=2; } } #endif #if 0 static struct coord * get_way(FILE *way, FILE *ways_index, struct coord *c, long long wayid, struct item_bin *ret, int debug) { long long currid; int last; struct coord *ic; if (!seek_to_way(way, ways_index, wayid)) { if (debug) fprintf(stderr,"not found in index"); return NULL; } while (item_bin_read(ret, way)) { currid=item_bin_get_wayid(ret); if (debug) fprintf(stderr,LONGLONG_FMT":",currid); if (currid != wayid) return NULL; ic=(struct coord *)(ret+1); last=ret->clen/2-1; if (debug) fprintf(stderr,"(0x%x,0x%x)-(0x%x,0x%x)",ic[0].x,ic[0].y,ic[last].x,ic[last].y); if (!c) return &ic[0]; if (ic[0].x == c->x && ic[0].y == c->y) return &ic[last]; if (ic[last].x == c->x && ic[last].y == c->y) return &ic[0]; } return NULL; } #endif struct associated_street { osmid relid; char *name; }; struct process_relation_member_func_priv { FILE *out; GList *allocations; }; static void process_associated_street_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv_unused) { struct process_relation_member_func_priv *fp=func_priv; struct associated_street *rel=relation_priv; if(!fp->out) { /* Pass 1, fill associated street names in relation_priv */ char *name; if(!rel->name && item_is_street(*member) && (name=item_bin_get_attr(member,attr_street_name,NULL))!=NULL ) { rel->name=g_strdup(name); fp->allocations=g_list_prepend(fp->allocations, rel->name); } } else { /* Pass 2, add associated street names to relation members which do not have street name attr defined but have house number defined or are streets */ int type_implies_streetname=item_is_street(*member) || member->type==type_house_number_interpolation_even || member->type==type_house_number_interpolation_odd || member->type==type_house_number_interpolation_all || member->type==type_house_number_interpolation_alphabetic; if(rel->name && !item_bin_get_attr(member,attr_street_name,NULL) && (type_implies_streetname || item_bin_get_attr(member,attr_house_number,NULL))) item_bin_add_attr_string(member, attr_street_name, rel->name); item_bin_write(member,fp->out); } } struct house_number_interpolation { osmid wayid; char* street_name; osmid nodeid_first_node; char* house_number_first_node; osmid nodeid_last_node; char* house_number_last_node; }; static void process_house_number_interpolation_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv_unused) { struct process_relation_member_func_priv *fp=func_priv; struct house_number_interpolation *rel=relation_priv; if(!fp->out) { /* Pass 1, read street name & house numbers from first & last node.*/ char *street_name; char *house_number; if((street_name=item_bin_get_attr(member,attr_street_name,NULL))) { rel->street_name=g_strdup(street_name); fp->allocations=g_list_prepend(fp->allocations, rel->street_name); } if ((house_number=item_bin_get_attr(member,attr_house_number,NULL))) { osmid* nodeid; char *house_number_dup; if((nodeid=item_bin_get_attr(member,attr_osm_nodeid,NULL))) { house_number_dup=g_strdup(house_number); fp->allocations=g_list_prepend(fp->allocations, house_number_dup); if (*nodeid==rel->nodeid_first_node){ rel->house_number_first_node=house_number_dup; }else{ rel->house_number_last_node=house_number_dup; } } } } else { /* Pass 2, add interpolation information to interpolation ways. */ enum attr_type attr_for_interpolation = 0; switch (member->type){ case type_house_number_interpolation_even: case type_house_number_interpolation_odd: attr_for_interpolation = attr_house_number_interpolation_no_ends_incrmt_2; break; case type_house_number_interpolation_all: attr_for_interpolation = attr_house_number_interpolation_no_ends_incrmt_1; break; default: // alphabetic interpolation not (yet) supported break; } if(attr_for_interpolation && rel->street_name){ item_bin_add_attr_string(member, attr_street_name, rel->street_name); char* house_number_from_to = g_strconcat(rel->house_number_first_node, "-", rel->house_number_last_node, NULL); fp->allocations=g_list_prepend(fp->allocations, house_number_from_to); item_bin_add_attr_string(member, attr_for_interpolation, house_number_from_to); } item_bin_write(member,fp->out); } } static void relation_func_writethrough(void *func_priv, void *relation_priv_unused, struct item_bin *member, void *member_priv_unused) { FILE *out=*(FILE **)func_priv; if(out) item_bin_write(member,out); } static void process_associated_streets_setup(FILE *in, struct relations *relations, struct process_relation_member_func_priv *fp) { struct relation_member relm; long long relid; struct item_bin *ib; struct relations_func *relations_func; int min_count; fseek(in, 0, SEEK_SET); relations_func=relations_func_new(process_associated_street_member, fp); while ((ib=read_item(in))) { char *name=osm_tag_value(ib, "name"); int namelen=name?strlen(name)+1:0; struct associated_street *rel=g_malloc0(sizeof(struct associated_street)+namelen); relid=item_bin_get_relationid(ib); rel->relid=relid; if(name) { rel->name=(char*)(rel+1); g_strlcpy(rel->name,name,namelen); } min_count=0; while(search_relation_member(ib, "street",&relm,&min_count)) { if(relm.type==rel_member_way) relations_add_relation_member_entry(relations, relations_func, rel, NULL, relm.type, relm.id); } min_count=0; while(search_relation_member(ib, "house",&relm,&min_count)) { relations_add_relation_member_entry(relations, relations_func, rel, NULL, relm.type, relm.id); } min_count=0; while(search_relation_member(ib, "addr:houselink",&relm,&min_count)) { relations_add_relation_member_entry(relations, relations_func, rel, NULL, relm.type, relm.id); } min_count=0; while(search_relation_member(ib, "address",&relm,&min_count)) { relations_add_relation_member_entry(relations, relations_func, rel, NULL, relm.type, relm.id); } } relations_func=relations_func_new(relation_func_writethrough, &fp->out); relations_add_relation_default_entry(relations, relations_func); } void process_associated_streets(FILE *in, struct files_relation_processing *files_relproc) { struct relations *relations=relations_new(); struct process_relation_member_func_priv fp={NULL,NULL}; fseek(in, 0, SEEK_SET); process_associated_streets_setup(in, relations, &fp); /* Set noname relations names from their street members */ fseek(files_relproc->ways_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->ways_in); /* Set street names on all members */ fp.out=files_relproc->ways_out; fseek(files_relproc->ways_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->ways_in); fp.out=files_relproc->nodes_out; fseek(files_relproc->nodes_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->nodes_in); if(files_relproc->nodes2_in) { fp.out=files_relproc->nodes2_out; fseek(files_relproc->nodes2_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->nodes2_in); } relations_destroy(relations); g_list_foreach(fp.allocations, (GFunc)free, NULL); g_list_free(fp.allocations); } static void process_house_number_interpolations_setup(FILE *in, struct relations *relations, struct process_relation_member_func_priv *fp) { struct item_bin *ib; struct relations_func *relations_func_process_hn_interpol; fseek(in, 0, SEEK_SET); relations_func_process_hn_interpol=relations_func_new(process_house_number_interpolation_member, fp); while ((ib=read_item(in))) { struct house_number_interpolation *hn_interpol=g_malloc0(sizeof(struct house_number_interpolation)); hn_interpol->wayid=item_bin_get_wayid(ib); hn_interpol->nodeid_first_node=item_bin_get_nodeid_from_attr(ib, attr_osm_nodeid_first_node); hn_interpol->nodeid_last_node=item_bin_get_nodeid_from_attr(ib, attr_osm_nodeid_last_node); dbg_assert(hn_interpol->wayid && hn_interpol->nodeid_first_node && hn_interpol->nodeid_last_node); relations_add_relation_member_entry(relations, relations_func_process_hn_interpol, hn_interpol, NULL, rel_member_node, hn_interpol->nodeid_first_node); relations_add_relation_member_entry(relations, relations_func_process_hn_interpol, hn_interpol, NULL, rel_member_node, hn_interpol->nodeid_last_node); relations_add_relation_member_entry(relations, relations_func_process_hn_interpol, hn_interpol, NULL, rel_member_way, hn_interpol->wayid); } relations_add_relation_default_entry(relations, relations_func_new(relation_func_writethrough, &fp->out)); } void process_house_number_interpolations(FILE *in, struct files_relation_processing *files_relproc) { struct relations *relations=relations_new(); struct process_relation_member_func_priv fp={NULL,NULL}; fseek(in, 0, SEEK_SET); process_house_number_interpolations_setup(in, relations, &fp); /* Copy house numbers & street names from first/last node to interpolation way. */ fseek(files_relproc->ways_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->ways_in); fseek(files_relproc->nodes_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->nodes_in); /* Set street names on all members */ fp.out=files_relproc->ways_out; fseek(files_relproc->ways_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->ways_in); fp.out=files_relproc->nodes_out; fseek(files_relproc->nodes_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->nodes_in); if(files_relproc->nodes2_in) { fp.out=files_relproc->nodes2_out; fseek(files_relproc->nodes2_in, 0, SEEK_SET); relations_process(relations, NULL, files_relproc->nodes2_in); } relations_destroy(relations); g_list_foreach(fp.allocations, (GFunc)free, NULL); g_list_free(fp.allocations); } struct turn_restriction { osmid relid; enum item_type type; struct coord *c[3]; int c_count[3]; struct rect r; int order; }; static void process_turn_restrictions_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) { int i,count,type=(long)member_priv; struct turn_restriction *turn_restriction=relation_priv; struct coord *c=(struct coord *)(member+1); int ccount=member->clen/2; if (member->type < type_line) count=1; else count=2; turn_restriction->c[type]=g_renew(struct coord, turn_restriction->c[type], turn_restriction->c_count[type]+count); turn_restriction->c[type][turn_restriction->c_count[type]++]=c[0]; if (count > 1) turn_restriction->c[type][turn_restriction->c_count[type]++]=c[ccount-1]; if(IS_REF(turn_restriction->r.l)) { turn_restriction->r.l=c[0]; turn_restriction->r.h=c[0]; i=1; } else i=0; for(;ir); i=item_order_by_type(member->type); if(iorder) turn_restriction->order=i; } static void process_turn_restrictions_fromto(struct turn_restriction *t, int type, struct coord **c) { int i,j; for (i = 0 ; i < t->c_count[type] ; i+=2) { for (j = 0 ; j < t->c_count[1] ; j++) { if (coord_is_equal(t->c[type][i],t->c[1][j])) { c[0]=&t->c[type][i+1]; c[1]=&t->c[type][i]; return; } if (coord_is_equal(t->c[type][i+1],t->c[1][j])) { c[0]=&t->c[type][i]; c[1]=&t->c[type][i+1]; return; } } } } static void process_turn_restrictions_dump_coord(struct coord *c, int count) { int i; for (i = 0 ; i < count ; i++) { fprintf(stderr,"(0x%x,0x%x)",c[i].x,c[i].y); } } static void process_turn_restrictions_finish(GList *tr, FILE *out) { GList *l=tr; while (l) { struct turn_restriction *t=l->data; struct coord *c[4]={NULL,NULL,NULL,NULL}; struct item_bin *ib=tmp_item_bin; if (!t->c_count[0]) { osm_warning("relation",t->relid,0,"turn restriction: from member not found\n"); } else if (!t->c_count[1]) { osm_warning("relation",t->relid,0,"turn restriction: via member not found\n"); } else if (!t->c_count[2]) { osm_warning("relation",t->relid,0,"turn restriction: to member not found\n"); } else { process_turn_restrictions_fromto(t, 0, c); process_turn_restrictions_fromto(t, 2, c+2); if (!c[0] || !c[2]) { osm_warning("relation",t->relid,0,"turn restriction: via ("); process_turn_restrictions_dump_coord(t->c[1], t->c_count[1]); fprintf(stderr,")"); if (!c[0]) { fprintf(stderr," failed to connect to from ("); process_turn_restrictions_dump_coord(t->c[0], t->c_count[0]); fprintf(stderr,")"); } if (!c[2]) { fprintf(stderr," failed to connect to to ("); process_turn_restrictions_dump_coord(t->c[2], t->c_count[2]); fprintf(stderr,")"); } fprintf(stderr,"\n"); } else { if (t->c_count[1] <= 2) { int order; char tilebuf[20]=""; item_bin_init(ib,t->type); item_bin_add_coord(ib, c[0], 1); item_bin_add_coord(ib, c[1], 1); if (t->c_count[1] > 1) item_bin_add_coord(ib, c[3], 1); item_bin_add_coord(ib, c[2], 1); order=tile(&t->r,"",tilebuf,sizeof(tilebuf)-1,overlap,NULL); if(order > t->order) order=t->order; item_bin_add_attr_range(ib,attr_order,0,order); item_bin_write(ib, out); } } } g_free(t->c[0]); g_free(t->c[1]); g_free(t->c[2]); g_free(t); l=g_list_next(l); } g_list_free(tr); } static GList * process_turn_restrictions_setup(FILE *in, struct relations *relations) { struct relation_member fromm,tom,viam,tmpm; long long relid; struct item_bin *ib; struct relations_func *relations_func; int min_count; GList *turn_restrictions=NULL; fseek(in, 0, SEEK_SET); relations_func=relations_func_new(process_turn_restrictions_member, NULL); while ((ib=read_item(in))) { struct turn_restriction *turn_restriction; relid=item_bin_get_relationid(ib); min_count=0; if (!search_relation_member(ib, "from",&fromm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: from member missing\n"); continue; } if (search_relation_member(ib, "from",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple from members\n"); continue; } min_count=0; if (!search_relation_member(ib, "to",&tom,&min_count)) { osm_warning("relation",relid,0,"turn restriction: to member missing\n"); continue; } if (search_relation_member(ib, "to",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple to members\n"); continue; } min_count=0; if (!search_relation_member(ib, "via",&viam,&min_count)) { osm_warning("relation",relid,0,"turn restriction: via member missing\n"); continue; } if (search_relation_member(ib, "via",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple via member\n"); continue; } if (fromm.type != rel_member_way) { osm_warning("relation",relid,0,"turn restriction: wrong type for from member "); osm_warning(osm_types[fromm.type],fromm.id,1,"\n"); continue; } if (tom.type != rel_member_way) { osm_warning("relation",relid,0,"turn restriction: wrong type for to member "); osm_warning(osm_types[tom.type],tom.id,1,"\n"); continue; } if (viam.type != rel_member_node && viam.type != rel_member_way) { osm_warning("relation",relid,0,"turn restriction: wrong type for via member "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } turn_restriction=g_new0(struct turn_restriction, 1); turn_restriction->relid=relid; turn_restriction->type=ib->type; turn_restriction->r.l.x=1<<30; turn_restriction->order=255; relations_add_relation_member_entry(relations, relations_func, turn_restriction, (gpointer) 0, fromm.type, fromm.id); relations_add_relation_member_entry(relations, relations_func, turn_restriction, (gpointer) 1, viam.type, viam.id); relations_add_relation_member_entry(relations, relations_func, turn_restriction, (gpointer) 2, tom.type, tom.id); turn_restrictions=g_list_append(turn_restrictions, turn_restriction); } return turn_restrictions; } void process_turn_restrictions(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out) { struct relations *relations=relations_new(); GList *turn_restrictions; fseek(in, 0, SEEK_SET); turn_restrictions=process_turn_restrictions_setup(in, relations); relations_process(relations, coords, ways); process_turn_restrictions_finish(turn_restrictions, out); relations_destroy(relations); } #if 0 void process_turn_restrictions_old(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out) { struct relation_member fromm,tom,viam,tmpm; struct node_item ni; long long relid; char from_buffer[65536],to_buffer[65536],via_buffer[65536]; struct item_bin *ib,*from=(struct item_bin *)from_buffer,*to=(struct item_bin *)to_buffer,*via=(struct item_bin *)via_buffer; struct coord *fromc,*toc,*viafrom,*viato,*tmp; int min_count; while ((ib=read_item(in))) { relid=item_bin_get_relationid(ib); min_count=0; if (!search_relation_member(ib, "from",&fromm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: from member missing\n"); continue; } if (search_relation_member(ib, "from",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple from members\n"); continue; } min_count=0; if (!search_relation_member(ib, "to",&tom,&min_count)) { osm_warning("relation",relid,0,"turn restriction: to member missing\n"); continue; } if (search_relation_member(ib, "to",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple to members\n"); continue; } min_count=0; if (!search_relation_member(ib, "via",&viam,&min_count)) { osm_warning("relation",relid,0,"turn restriction: via member missing\n"); continue; } if (search_relation_member(ib, "via",&tmpm,&min_count)) { osm_warning("relation",relid,0,"turn restriction: multiple via member\n"); continue; } if (fromm.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for from member "); osm_warning(osm_types[fromm.type],fromm.id,1,"\n"); continue; } if (tom.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for to member "); osm_warning(osm_types[tom.type],tom.id,1,"\n"); continue; } if (viam.type != 1 && viam.type != 2) { osm_warning("relation",relid,0,"turn restriction: wrong type for via member "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } if (viam.type == 1) { if (!node_item_get_from_file(coords, viam.id, &ni)) { osm_warning("relation",relid,0,"turn restriction: failed to get via member "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } viafrom=&ni.c; viato=&ni.c; } else { if (!(viafrom=get_way(ways, ways_index, NULL, viam.id, via, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to get first via coordinate from "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } if (!(viato=get_way(ways, ways_index, viafrom, viam.id, via, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to get last via coordinate from "); osm_warning(osm_types[viam.type],viam.id,1,"\n"); continue; } } #if 0 fprintf(stderr,"via "LONGLONG_FMT" vs %d\n",viam.id, ni.id); fprintf(stderr,"coord 0x%x,0x%x\n",ni.c.x,ni.c.y); fprintf(stderr,"Lookup "LONGLONG_FMT"\n",fromm.id); #endif if (!(fromc=get_way(ways, ways_index, viafrom, fromm.id, from, 0))) { if (viam.type == 1 || !(fromc=get_way(ways, ways_index, viato, fromm.id, from, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to connect via "); osm_warning(osm_types[viam.type],viam.id,1," 0x%x,0x%x-0x%x,0x%x to from member ",viafrom->x,viafrom->y,viato->x,viato->y); osm_warning(osm_types[fromm.type],fromm.id,1," ("); get_way(ways, ways_index, viafrom, fromm.id, from, 1); fprintf(stderr,")\n"); continue; } else { tmp=viato; viato=viafrom; viafrom=tmp; } } if (!(toc=get_way(ways, ways_index, viato, tom.id, to, 0))) { osm_warning("relation",relid,0,"turn restriction: failed to connect via "); osm_warning(osm_types[viam.type],viam.id,1," 0x%x,0x%x-0x%x,0x%x to to member ",viafrom->x,viafrom->y,viato->x,viato->y); osm_warning(osm_types[tom.type],tom.id,1," ("); get_way(ways, ways_index, viato, tom.id, to, 1); fprintf(stderr,")\n"); continue; } #if 0 fprintf(stderr,"(0x%x,0x%x)-(0x%x,0x%x)-(0x%x,0x%x)\n",fromc->x,fromc->y, ni.c.x, ni.c.y, toc->x, toc->y); #endif item_bin_init(ib,ib->type); item_bin_add_coord(ib, fromc, 1); item_bin_add_coord(ib, viafrom, 1); if (viam.type == 2) item_bin_add_coord(ib, viato, 1); item_bin_add_coord(ib, toc, 1); item_bin_write(item_bin, out); } } #endif #if 0 static void process_countries(FILE *way, FILE *ways_index) { FILE *in=fopen("country_de.tmp","r"); struct item_bin *ib; char buffer2[400000]; struct item_bin *ib2=(struct item_bin *)buffer2; GList *segments=NULL,*sort_segments; fseek(in, 0, SEEK_SET); while ((ib=read_item(in))) { char *str=NULL; struct relation_member member; while ((str=item_bin_get_attr(ib, attr_osm_member, str))) { if (!parse_relation_member_string(str, &member)) break; if (member.type == 2) { if (!seek_to_way(way, ways_index, member.id)) { fprintf(stderr,"not found in index"); break; } while (item_bin_read(ib2, way)) { if (item_bin_get_wayid(ib2) != member.id) break; segments=g_list_prepend(segments,item_bin_to_poly_segment(ib2, geom_poly_segment_type_way_unknown)); break; } } } } sort_segments=geom_poly_segments_sort(segments, geom_poly_segment_type_way_left_side); FILE *tmp=fopen("tst.txt","w"); while (sort_segments) { struct geom_poly_segment *seg=sort_segments->data; if (!seg) { fprintf(stderr,"is null\n"); } else { fprintf(stderr,"segment %p %s area "LONGLONG_FMT"\n",sort_segments,coord_is_equal(*seg->first, *seg->last) ? "closed":"open",geom_poly_area(seg->first,seg->last-seg->first+1)); } #if 0 int count=seg->last-seg->first+1; item_bin_init(ib, type_border_country); item_bin_add_coord(ib, seg->first, count); item_bin_dump(ib, tmp); #endif sort_segments=g_list_next(sort_segments); } fclose(tmp); fclose(in); } #endif static void node_ref_way(osmid node) { struct node_item *ni; ni=node_item_get(node); if (ni) ni->ref_way++; } static void nodes_ref_item_bin(struct item_bin *ib) { int i; struct coord *c=(struct coord *)(ib+1); for (i = 0 ; i < ib->clen/2 ; i++) node_ref_way(GET_REF(c[i])); } void osm_add_nd(osmid ref) { SET_REF(coord_buffer[coord_count], ref); coord_count++; if (coord_count > MAX_COORD_COUNT) { fprintf(stderr,"ERROR: Overflow - more than %d coordinates in one way.\n", MAX_COORD_COUNT); exit(1); } } static void write_item_way_subsection_index(FILE *out, FILE *out_index, FILE *out_graph, struct item_bin *orig, long long *last_id) { osmid idx[2]; idx[0]=item_bin_get_wayid(orig); idx[1]=ftello(out); if (way_hash) { if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)idx[0], NULL, NULL))) g_hash_table_insert(way_hash, (gpointer)(long)idx[0], (gpointer)(long)idx[1]); } else { if (!last_id || *last_id != idx[0]) dbg_assert(fwrite(idx, sizeof(idx), 1, out_index)==1); if (last_id) *last_id=idx[0]; } } static void write_item_way_subsection(FILE *out, FILE *out_index, FILE *out_graph, struct item_bin *orig, int first, int last, long long *last_id) { struct item_bin new; struct coord *c=(struct coord *)(orig+1); char *attr=(char *)(c+orig->clen/2); int attr_len=orig->len-orig->clen-2; processed_ways++; new.type=orig->type; new.clen=(last-first+1)*2; new.len=new.clen+attr_len+2; if (out_index) write_item_way_subsection_index(out, out_index, out_graph, orig, last_id); #if 0 fprintf(stderr,"first %d last %d type 0x%x len %d clen %d attr_len %d\n", first, last, new.type, new.len, new.clen, attr_len); #endif dbg_assert(fwrite(&new, sizeof(new), 1, out)==1); dbg_assert(fwrite(c+first, new.clen*4, 1, out)==1); dbg_assert(fwrite(attr, attr_len*4, 1, out)==1); #if 0 fwrite(&new, sizeof(new), 1, out_graph); fwrite(c+first, new.clen*4, 1, out_graph); fwrite(attr, attr_len*4, 1, out_graph); #endif } void ref_ways(FILE *in) { struct item_bin *ib; fseek(in, 0, SEEK_SET); while ((ib=read_item(in))) nodes_ref_item_bin(ib); } void resolve_ways(FILE *in, FILE *out) { struct item_bin *ib; struct coord *c; int i; struct node_item *ni; fseek(in, 0, SEEK_SET); while ((ib=read_item(in))) { c=(struct coord *)(ib+1); for (i = 0 ; i < ib->clen/2 ; i++) { if(!IS_REF(c[i])) continue; ni=node_item_get(GET_REF(c[i])); if(ni) { c[i].x=ni->c.x; c[i].y=ni->c.y; } } item_bin_write(ib,out); } } /** * Get POI coordinates from area/line coordinates. * @param in *in input file with area/line coordinates. * @param in *out output file with POI coordinates * @param in type input file original contents type: type_line or type_area * @returns nothing */ void process_way2poi(FILE *in, FILE *out, int type) { struct item_bin *ib; while ((ib=read_item(in))) { int count=ib->clen/2; if(count>1 && ib->typetype, ib->len, ib->clen); #endif ccount=ib->clen/2; if (ccount <= 1) continue; c=(struct coord *)(ib+1); last=0; for (i = 0 ; i < ccount ; i++) { if (IS_REF(c[i])) { ndref=GET_REF(c[i]); ni=node_item_get(ndref); if (ni) { c[i]=ni->c; if (ni->ref_way > 1 && i != 0 && i != ccount-1 && i != last && item_get_default_flags(ib->type)) { write_item_way_subsection(out, out_index, out_graph, ib, last, i, &last_id); last=i; } } else if (final) { osm_warning("way",item_bin_get_wayid(ib),0,"Non-existing reference to "); osm_warning("node",ndref,1,"\n"); remaining=(ib->len+1)*4-sizeof(struct item_bin)-i*sizeof(struct coord); memmove(&c[i], &c[i+1], remaining); ib->clen-=2; ib->len-=2; i--; ccount--; } } } if (ccount) { write_item_way_subsection(out, out_index, out_graph, ib, last, ccount-1, &last_id); if (final && ib->type == type_water_line && out_coastline) { write_item_way_subsection(out_coastline, NULL, NULL, ib, last, ccount-1, NULL); } } } sig_alrm(0); sig_alrm_end(); return 0; } static void index_country_add(struct zip_info *info, int country_id, char*first_key, char *last_key, char *tile, char *filename, int size, FILE *out) { struct item_bin *item_bin=init_item(type_countryindex); int num=0, zip_num; char tilename[32]; do { snprintf(tilename,sizeof(tilename),"%ss%d", tile, num); num++; zip_num=add_aux_tile(info, tilename, filename, size); } while (zip_num == -1); item_bin_add_attr_int(item_bin, attr_country_id, country_id); if(first_key) item_bin_add_attr_string(item_bin, attr_first_key, first_key); if(last_key) item_bin_add_attr_string(item_bin, attr_last_key, last_key); item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_num); item_bin_write(item_bin, out); } void write_countrydir(struct zip_info *zip_info, int max_index_size) { int i; int max=11; char filename[32]; struct country_table *co; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; if(co->size) { FILE *in; char countrypart[32]; char partsuffix[32]; FILE *out=NULL; char *outname=NULL; int partsize; char buffer[50000]; struct item_bin *ib=(struct item_bin*)buffer; int ibsize; char tileco[32]=""; char tileprev[32]=""; char tilecur[32]=""; char *countryindexname; FILE *countryindex; char key[1024]="",first_key[1024]="",last_key[1024]=""; tile(&co->r, "", tileco, max, overlap, NULL); snprintf(filename,sizeof(filename),"country_%d.tmp", co->countryid); in=fopen(filename,"rb"); snprintf(countrypart,sizeof(countrypart),"country_%d_p",co->countryid); countryindex=tempfile("0",countrypart,1); countryindexname=tempfile_name("0",countrypart); partsize=0; while(1) { int r=item_bin_read(ib,in); struct attr_bin *a; ibsize=r>0?(ib->len+1)*4 : 0; if(ibsize) { g_strlcpy(tileprev,tilecur,sizeof(tileprev)); a=item_bin_get_attr_bin(ib, attr_tile_name, NULL); if(a) { g_strlcpy(tilecur,(char *)(a+1),sizeof(tilecur)); item_bin_remove_attr(ib,a+1); } else tilecur[0]=0; a=item_bin_get_attr_bin_last(ib); if(a && ATTR_IS_STRING(a->type)) g_strlcpy(key,(char *)(a+1),sizeof(key)); } /* If output file is already opened, and: - we have reached end of input file, or - adding new tile would make index part too big, or - item just read belongs to a different tile than the previous one, then close existing output file, put reference to the country index tile.*/ if(out && (!r || (partsize && ((partsize+ibsize)>max_index_size)) || strcmp(tileprev,tilecur)) ) { partsize=ftello(out); fclose(out); out=NULL; index_country_add(zip_info,co->countryid,first_key,last_key,strlen(tileco)>strlen(tileprev)?tileco:tileprev,outname,partsize,countryindex); g_free(outname); outname=NULL; g_strlcpy(first_key,key,sizeof(first_key)); } /* No items left, finish this country index. */ if(!r) break; /* Open new output file. */ if(!out) { co->nparts++; snprintf(partsuffix,sizeof(partsuffix),"%d",co->nparts); out=tempfile(partsuffix,countrypart,1); outname=tempfile_name(partsuffix,countrypart); partsize=0; } item_bin_write(ib,out); partsize+=ibsize; g_strlcpy(last_key,key,sizeof(last_key)); } partsize=ftello(countryindex); if(partsize) index_country_add(zip_info,co->countryid,NULL,NULL,tileco,countryindexname, partsize, zip_get_index(zip_info)); fclose(countryindex); g_free(countryindexname); fclose(in); } } } void load_countries(void) { char filename[32]; FILE *f; int i; struct country_table *co; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; sprintf(filename,"country_%d.tmp", co->countryid); f=fopen(filename,"rb"); if (f) { int i,first=1; struct item_bin *ib; while ((ib=read_item(f))) { struct coord *c=(struct coord *)(ib+1); co->size+=ib->len*4+4; for (i = 0 ; i < ib->clen/2 ; i++) { if (first) { co->r.l=c[i]; co->r.h=c[i]; first=0; } else bbox_extend(&c[i], &co->r); } } fseek(f, 0, SEEK_END); co->size=ftello(f); fclose(f); } } } void remove_countryfiles(void) { int i,j; char filename[32]; struct country_table *co; for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { co=&country_table[i]; if (co->size) { sprintf(filename,"country_%d.tmp", co->countryid); unlink(filename); } for(j=0; j<=co->nparts;j++) { char partsuffix[32]; sprintf(filename,"country_%d_p", co->countryid); sprintf(partsuffix,"%d",j); tempfile_unlink(partsuffix,filename); } } } void osm_init(FILE* rule_file) { build_attrmap(rule_file); build_countrytable(); } navit-0.5.0+dfsg.1/navit/maptool/osm_o5m.c000066400000000000000000000161111264204753600202420ustar00rootroot00000000000000#include #include #include #include "maptool.h" static int print; static char *types[]={"node","way","relation"}; struct o5m { unsigned char buffer[65536*2]; int buffer_size; unsigned char *buffer_start; unsigned char *buffer_end; FILE *in; int error; int lat, lon, uid, version; long long id, rid[3], changeset; time_t timestamp; char *user; }; static struct string_table { char strings[15000][256]; int pos; } st; static double latlon_scale=10000000.0; #define buffer_end(o,x) ((o)->buffer_start+(x) > (o)->buffer_end && !fill_buffer((o), (x))) static int fill_buffer(struct o5m *o, int min) { int count; memmove(o->buffer, o->buffer_start, o->buffer_end-o->buffer_start); o->buffer_end-=o->buffer_start-o->buffer; o->buffer_start=o->buffer; count=fread(o->buffer_end, 1, o->buffer+o->buffer_size-o->buffer_end, o->in); if (!count) return 0; o->buffer_end+=count; return (min <= o->buffer_end - o->buffer); } static unsigned long long get_uval(unsigned char **p) { unsigned char c; long long ret=0; int shift=0; for (;;) { c=*((*p)++); ret+=((long long)c & 0x7f) << shift; if (!(c & 0x80)) return ret; shift+=7; } } static unsigned long long get_sval(unsigned char **p) { long long ret=get_uval(p); if (ret & 1) { return -((ret >> 1)+1); } else { return ret >> 1; } } static void get_strings(struct string_table *st, unsigned char **p, char **s1, char **s2) { int len,xlen=0; *s1=(char *)*p; len=strlen(*s1); xlen=1; if (s2) { *s2=*s1+len+1; len+=strlen(*s2); xlen++; } (*p)+=len+xlen; if (len <= 250) { memcpy(st->strings[st->pos++], *s1, len+xlen); if (st->pos >= 15000) st->pos=0; } } static void get_strings_ref(struct string_table *st, int ref, char **s1, char **s2) { int pos=st->pos-ref; if (pos < 0) pos+=15000; *s1=st->strings[pos]; if (s2) *s2=*s1+strlen(*s1)+1; } static void print_escaped(char *s) { for (;;) { switch (*s) { case 0: return; case 9: case 13: case 34: case 38: case 39: case 60: case 62: printf("&#%d;",*s); break; default: putc(*s,stdout); break; } s++; } } static void o5m_reset(struct o5m *o) { o->lat=0; o->lon=0; o->id=0; o->rid[0]=0; o->rid[1]=0; o->rid[2]=0; o->changeset=0; o->timestamp=0; } static void o5m_print_start(struct o5m *o, int c) { printf("\t<%s id=\""LONGLONG_FMT"\"",types[c-0x10],o->id); } static void o5m_print_version(struct o5m *o, int tags) { char timestamp_str[64]; if (o->version) { strftime(timestamp_str, sizeof(timestamp_str), "%Y-%m-%dT%H:%M:%SZ", gmtime(&o->timestamp)); printf(" version=\"%d\" timestamp=\"%s\" changeset=\""LONGLONG_FMT"\"",o->version,timestamp_str,o->changeset); if (o->uid) { printf(" uid=\"%d\" user=\"",o->uid); print_escaped(o->user); printf("\""); } } printf("%s\n",tags?">":"/>"); } static void o5m_print_end(char c) { printf("\t\n",types[c-0x10]); } int map_collect_data_osm_o5m(FILE *in, struct maptool_osm *osm) { struct o5m o; unsigned char c, *end, *rend; int len, rlen, ref, tags; char *uidstr, *role; if (print) { printf("\n"); printf("\n"); } o5m_reset(&o); o.buffer_size=sizeof(o.buffer); o.buffer_start=o.buffer; o.buffer_end=o.buffer; o.error=0; o.in=in; fill_buffer(&o,1); for (;;) { if (buffer_end(&o, 1)) { fprintf(stderr,"unexpected eof\n"); return 1; } c=*(o.buffer_start++); switch (c) { case 0x10: case 0x11: case 0x12: (void)buffer_end(&o, 4); len=get_uval(&o.buffer_start); if (o.buffer_start > o.buffer_end) { fprintf(stderr,"unexpected eof\n"); return 0; } if (buffer_end(&o, len)) { fprintf(stderr,"unexpected eof or buffer too small, item type %d, item size %d\n", c, len); return 0; } end=o.buffer_start+len; o.id+=get_sval(&o.buffer_start); o.version=get_uval(&o.buffer_start); if (o.version) { o.timestamp+=get_sval(&o.buffer_start); if (o.timestamp) { o.changeset+=get_sval(&o.buffer_start); ref=get_uval(&o.buffer_start); if (ref) get_strings_ref(&st, ref, &uidstr, &o.user); else get_strings(&st, &o.buffer_start, &uidstr, &o.user); o.uid=get_uval((unsigned char **)&uidstr); } } if (print) o5m_print_start(&o, c); switch (c) { case 0x10: o.lon+=get_sval(&o.buffer_start); o.lat+=get_sval(&o.buffer_start); osm_add_node(o.id, o.lat/latlon_scale,o.lon/latlon_scale); tags=end > o.buffer_start; if (print) { printf(" lat=\"%.7f\" lon=\"%.7f\"",o.lat/10000000.0,o.lon/10000000.0); o5m_print_version(&o, tags); } break; case 0x11: osm_add_way(o.id); rlen=get_uval(&o.buffer_start); tags=end > o.buffer_start; rend=o.buffer_start+rlen; if (print) o5m_print_version(&o, tags); while (o.buffer_start < rend) { o.rid[0]+=get_sval(&o.buffer_start); osm_add_nd(o.rid[0]); if (print) printf("\t\t\n",o.rid[0]); } break; case 0x12: osm_add_relation(o.id); rlen=get_uval(&o.buffer_start); tags=end > o.buffer_start; rend=o.buffer_start+rlen; if (print) o5m_print_version(&o, tags); while (o.buffer_start < rend) { long long delta=get_sval(&o.buffer_start); int r; ref=get_uval(&o.buffer_start); if (ref) get_strings_ref(&st, ref, &role, NULL); else get_strings(&st, &o.buffer_start, &role, NULL); r=role[0]-'0'; if (r < 0) r=0; if (r > 2) r=2; o.rid[r]+=delta; osm_add_member(r+1, o.rid[r], role+1); if (print) printf("\t\t\n",types[r], o.rid[r], role+1); } break; } while (end > o.buffer_start) { char *k, *v; ref=get_uval(&o.buffer_start); if (ref) get_strings_ref(&st, ref, &k, &v); else get_strings(&st, &o.buffer_start, &k, &v); osm_add_tag(k, v); if (print) { printf("\t\t\n"); } } if (print && tags) { o5m_print_end(c); } switch (c) { case 0x10: osm_end_node(osm); break; case 0x11: osm_end_way(osm); break; case 0x12: osm_end_relation(osm); break; } break; case 0xdb: if (print) printf("\t\n"); len=get_uval(&o.buffer_start); if (o.buffer_start > o.buffer_end) { return 0; } if (buffer_end(&o, len)) { return 0; } o.buffer_start+=len; break; case 0xe0: if (buffer_end(&o, 5)) return 0; o.buffer_start+=5; break; case 0xfe: return 1; case 0xff: o5m_reset(&o); break; default: fprintf(stderr,"Unknown tag 0x%x\n",c); /* Fall through */ case 0xdc: /* File timestamp: silently ignore it */ len=get_uval(&o.buffer_start); if (o.buffer_start > o.buffer_end) { return 0; } if (buffer_end(&o, len)) { return 0; } o.buffer_start+=len; break; } } return 0; } navit-0.5.0+dfsg.1/navit/maptool/osm_protobuf.c000066400000000000000000000234001264204753600214010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "file.h" #include "generated-code/fileformat.pb-c.h" #include "generated-code/osmformat.pb-c.h" static double latlon_scale=10000000.0; /* Maximum length of a BlobHeader, see * http://wiki.openstreetmap.org/wiki/PBF_Format */ #define MAX_HEADER_LENGTH 1024 * 64 /* Maximum length of a Blob */ #define MAX_BLOB_LENGTH 1024 * 1024 * 32 #define SANITY_CHECK_LENGTH(length, max_length) \ if (length > max_length){ \ fprintf(stderr,"Not a valid protobuf file. " \ "Invalid block size in input: %d, max is %d. \n", \ length, max_length); \ return NULL; \ } static OSMPBF__BlobHeader * read_header(FILE *f) { unsigned char *buffer,lenb[4]; int len; if (fread(lenb, 4, 1, f) != 1) return NULL; len=(lenb[0] << 24) | (lenb[1] << 16) | (lenb[2] << 8) | lenb[3]; SANITY_CHECK_LENGTH(len, MAX_HEADER_LENGTH) buffer=alloca(len); if (fread(buffer, len, 1, f) != 1) return NULL; return osmpbf__blob_header__unpack(&protobuf_c_system_allocator, len, buffer); } static OSMPBF__Blob * read_blob(OSMPBF__BlobHeader *header, FILE *f, unsigned char *buffer) { int len=header->datasize; SANITY_CHECK_LENGTH(len, MAX_BLOB_LENGTH) if (fread(buffer, len, 1, f) != 1) return NULL; return osmpbf__blob__unpack(&protobuf_c_system_allocator, len, buffer); } static unsigned char * uncompress_blob(OSMPBF__Blob *blob) { unsigned char *ret=malloc(blob->raw_size); int zerr; z_stream strm; if (!ret) return NULL; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in=blob->zlib_data.len; strm.next_in=blob->zlib_data.data; strm.avail_out=blob->raw_size; strm.next_out=ret; zerr = inflateInit(&strm); if (zerr != Z_OK) { free(ret); return NULL; } zerr = inflate(&strm, Z_NO_FLUSH); if (zerr != Z_STREAM_END) { free(ret); return NULL; } inflateEnd(&strm); return ret; } static int get_string(char *buffer, int buffer_size, OSMPBF__PrimitiveBlock *primitive_block, int id, int escape) { int len=primitive_block->stringtable->s[id].len; char *data=(char *)primitive_block->stringtable->s[id].data; if (primitive_block->stringtable->s[id].len >= buffer_size) { buffer[0]='\0'; return 0; } if (escape) { int i; char *p=buffer; for (i = 0 ; i < len ; i++) { switch(data[i]) { case '\t': case '\r': case '\n': case '>': case '<': case '\'': case '"': case '&': sprintf(p,"&#%d;",data[i]); p+=strlen(p); break; default: *p++=data[i]; } } *p++='\0'; return 1; } else { strncpy(buffer, data, len); buffer[len]='\0'; return 1; } } static void process_osmheader(OSMPBF__Blob *blob, unsigned char *data) { OSMPBF__HeaderBlock *header_block; header_block=osmpbf__header_block__unpack(&protobuf_c_system_allocator, blob->raw_size, data); osmpbf__header_block__free_unpacked(header_block, &protobuf_c_system_allocator); } #if 0 static void process_user(OSMPBF__PrimitiveBlock *primitive_block, int user_sid, int uid, int swap) { char userbuff[1024]; get_string(userbuff, sizeof(userbuff), primitive_block, user_sid, 1); if (userbuff[0] && uid != -1) { if (swap) printf(" uid=\"%d\" user=\"%s\"",uid,userbuff); else printf(" user=\"%s\" uid=\"%d\"",userbuff,uid); } } static void process_timestamp(long long timestamp) { time_t ts; struct tm *tm; char tsbuff[1024]; ts=timestamp; tm=gmtime(&ts); strftime(tsbuff, sizeof(tsbuff), "%Y-%m-%dT%H:%M:%SZ", tm); printf(" timestamp=\"%s\"",tsbuff); } #endif static void process_tag(OSMPBF__PrimitiveBlock *primitive_block, int key, int val) { char keybuff[1024]; char valbuff[1024]; #if 0 get_string(keybuff, sizeof(keybuff), primitive_block, key, 1); get_string(valbuff, sizeof(valbuff), primitive_block, val, 1); printf("\t\t\n",keybuff,valbuff); #else get_string(keybuff, sizeof(keybuff), primitive_block, key, 0); get_string(valbuff, sizeof(valbuff), primitive_block, val, 0); osm_add_tag(keybuff, valbuff); #endif } static void process_dense(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__DenseNodes *dense, struct maptool_osm *osm) { int i,j=0,has_tags; long long id=0,lat=0,lon=0,changeset=0,timestamp=0; int user_sid=0,uid=0; if (!dense) return; for (i = 0 ; i < dense->n_id ; i++) { id+=dense->id[i]; lat+=dense->lat[i]; lon+=dense->lon[i]; changeset+=dense->denseinfo->changeset[i]; user_sid+=dense->denseinfo->user_sid[i]; uid+=dense->denseinfo->uid[i]; timestamp+=dense->denseinfo->timestamp[i]; has_tags=dense->keys_vals && dense->keys_vals[j]; osm_add_node(id, lat/latlon_scale,lon/latlon_scale); #if 0 printf("\tdenseinfo->version[i],changeset); process_user(primitive_block, user_sid, uid, 0); process_timestamp(timestamp); #endif if (has_tags) { #if 0 printf(">\n"); #endif while (dense->keys_vals[j]) { process_tag(primitive_block, dense->keys_vals[j], dense->keys_vals[j+1]); j+=2; } #if 0 printf("\t\n"); } else printf("/>\n"); #else } #endif osm_end_node(osm); j++; } } #if 0 static void process_info(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Info *info) { printf(" version=\"%d\" changeset=\"%Ld\"",info->version,info->changeset); process_user(primitive_block, info->user_sid, info->uid, 1); process_timestamp(info->timestamp); } #endif static void process_way(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Way *way, struct maptool_osm *osm) { int i; long long ref=0; osm_add_way(way->id); #if 0 printf("\tid); process_info(primitive_block, way->info); printf(">\n"); #else #endif for (i = 0 ; i < way->n_refs ; i++) { ref+=way->refs[i]; osm_add_nd(ref); #if 0 printf("\t\t\n",ref); #else #endif } for (i = 0 ; i < way->n_keys ; i++) process_tag(primitive_block, way->keys[i], way->vals[i]); #if 0 printf("\t\n"); #endif osm_end_way(osm); } static void process_relation(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Relation *relation, struct maptool_osm *osm) { int i; long long ref=0; char rolebuff[1024]; #if 0 printf("\tid); process_info(primitive_block, relation->info); printf(">\n"); #endif osm_add_relation(relation->id); for (i = 0 ; i < relation->n_roles_sid ; i++) { #if 0 printf("\t\ttypes[i]) { case 0: printf("node"); break; case 1: printf("way"); break; case 2: printf("relation"); break; default: printf("unknown"); break; } #endif ref+=relation->memids[i]; get_string(rolebuff, sizeof(rolebuff), primitive_block, relation->roles_sid[i], 1); #if 0 printf("\" ref=\"%Ld\" role=\"%s\"/>\n",ref,rolebuff); #else osm_add_member(relation->types[i]+1,ref,rolebuff); #endif } for (i = 0 ; i < relation->n_keys ; i++) process_tag(primitive_block, relation->keys[i], relation->vals[i]); #if 0 printf("\t\n"); #else osm_end_relation(osm); #endif } static void process_osmdata(OSMPBF__Blob *blob, unsigned char *data, struct maptool_osm *osm) { int i,j; OSMPBF__PrimitiveBlock *primitive_block; primitive_block=osmpbf__primitive_block__unpack(&protobuf_c_system_allocator, blob->raw_size, data); for (i = 0 ; i < primitive_block->n_primitivegroup ; i++) { OSMPBF__PrimitiveGroup *primitive_group=primitive_block->primitivegroup[i]; process_dense(primitive_block, primitive_group->dense, osm); for (j = 0 ; j < primitive_group->n_ways ; j++) process_way(primitive_block, primitive_group->ways[j], osm); for (j = 0 ; j < primitive_group->n_relations ; j++) process_relation(primitive_block, primitive_group->relations[j], osm); #if 0 printf("Group %p %d %d %d %d\n",primitive_group->dense,primitive_group->n_nodes,primitive_group->n_ways,primitive_group->n_relations,primitive_group->n_changesets); #endif } osmpbf__primitive_block__free_unpacked(primitive_block, &protobuf_c_system_allocator); } int map_collect_data_osm_protobuf(FILE *in, struct maptool_osm *osm) { OSMPBF__BlobHeader *header; OSMPBF__Blob *blob; unsigned char *data; unsigned char *buffer=malloc(MAX_BLOB_LENGTH); #if 0 printf("\n"); printf("\n"); #endif while ((header=read_header(in))) { blob=read_blob(header, in, buffer); data=uncompress_blob(blob); if (!strcmp(header->type,"OSMHeader")) { process_osmheader(blob, data); } else if (!strcmp(header->type,"OSMData")) { process_osmdata(blob, data, osm); } else { printf("skipping fileblock of unknown type '%s'\n", header->type); free(buffer); return 0; } free(data); osmpbf__blob__free_unpacked(blob, &protobuf_c_system_allocator); osmpbf__blob_header__free_unpacked(header, &protobuf_c_system_allocator); } free(buffer); #if 0 printf("\n"); #endif return 1; } navit-0.5.0+dfsg.1/navit/maptool/osm_protobufdb.c000066400000000000000000000535571264204753600217270ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "file.h" #include "generated-code/fileformat.pb-c.h" #include "generated-code/osmformat.pb-c.h" static double latlon_scale=10000000.0; struct db_config { int node_ids_per_file; int node_ids_per_blob; int node_ids_per_group; int way_ids_per_file; int way_ids_per_blob; int way_ids_per_group; int relation_ids_per_file; int relation_ids_per_blob; int relation_ids_per_group; } db_config = { 200000, 30000, 500, 40000, 1000, 30, 10000, 500, 20, }; struct osm_protobufdb_context { int current_file, current_block, active_block; int in_node, in_way, in_relation; OSMPBF__Node n; OSMPBF__Way w; OSMPBF__Relation r; OSMPBF__Info i; FILE *f; OSMPBF__PrimitiveBlock *pb; OSMPBF__PrimitiveGroup *pg; GHashTable *string_hash; OSMPBF__DenseInfo *di; OSMPBF__DenseNodes *dn; OSMPBF__StringTable *st; } context; static int osm_protobufdb_write_blob(OSMPBF__Blob *blob, FILE *out) { unsigned char lenb[4]; int len,blen; unsigned char *buffer; OSMPBF__BlobHeader header=OSMPBF__BLOB_HEADER__INIT; blen=osmpbf__blob__get_packed_size(blob); header.type="OSMData"; header.datasize=blen; len=osmpbf__blob_header__get_packed_size(&header); buffer=alloca(len); lenb[0]=len>>24; lenb[1]=len>>16; lenb[2]=len>>8; lenb[3]=len; osmpbf__blob_header__pack(&header, buffer); if (fwrite(lenb, sizeof(lenb), 1, out) != 1) return 0; if (fwrite(buffer, len, 1, out) != 1) return 0; buffer=alloca(blen); osmpbf__blob__pack(blob, buffer); if (fwrite(buffer, blen, 1, out) != 1) return 0; return 1; } #if 0 void dump_block(OSMPBF__PrimitiveBlock *pb) { int i,j; printf("%d groups\n",pb->n_primitivegroup); for (i = 0 ; i < pb->n_primitivegroup ; i++) { printf("%d relations\n",pb->primitivegroup[i]->n_relations); for (j = 0 ; j < pb->primitivegroup[i]->n_relations ; j++) { printf("Info %d\n",pb->primitivegroup[i]->relations[j]->info->version); } } } #endif static int osm_protobufdb_finish_block(struct osm_protobufdb_context *ctx) { OSMPBF__Blob *blob,empty_blob=OSMPBF__BLOB__INIT; int len; if (!ctx->pb) return 0; len=osmpbf__primitive_block__get_packed_size(ctx->pb); while (ctx->current_block < ctx->active_block) { osm_protobufdb_write_blob(&empty_blob, ctx->f); ctx->current_block++; } blob=malloc(sizeof(*blob)); *blob=empty_blob; blob->has_raw=1; blob->has_raw_size=1; blob->raw.data=malloc(len); osmpbf__primitive_block__pack(ctx->pb, blob->raw.data); blob->raw.len=len; blob->raw_size=len; osm_protobufdb_write_blob(blob, ctx->f); osmpbf__blob__free_unpacked(blob, &protobuf_c_system_allocator); osmpbf__primitive_block__free_unpacked(ctx->pb, &protobuf_c_system_allocator); ctx->pb=NULL; ctx->current_block++; return 1; } static int osm_protobufdb_start_block(struct osm_protobufdb_context *ctx, int blocknum) { OSMPBF__PrimitiveBlock pb=OSMPBF__PRIMITIVE_BLOCK__INIT; OSMPBF__StringTable st=OSMPBF__STRING_TABLE__INIT; if (ctx->active_block == blocknum) return 0; osm_protobufdb_finish_block(ctx); ctx->active_block=blocknum; ctx->pb=malloc(sizeof(*ctx->pb)); *ctx->pb=pb; ctx->pb->stringtable=malloc(sizeof(*ctx->pb->stringtable)); *ctx->pb->stringtable=st; ctx->st=ctx->pb->stringtable; return 1; } static int osm_protobufdb_start_group(struct osm_protobufdb_context *ctx, int groupnum) { OSMPBF__PrimitiveGroup pg=OSMPBF__PRIMITIVE_GROUP__INIT; if (ctx->pb->n_primitivegroup <= groupnum) { ctx->pb->primitivegroup=realloc(ctx->pb->primitivegroup, (groupnum+1)*sizeof(ctx->pb->primitivegroup[0])); while (ctx->pb->n_primitivegroup <= groupnum) { ctx->pb->primitivegroup[ctx->pb->n_primitivegroup]=malloc(sizeof(*context.pg)); *ctx->pb->primitivegroup[ctx->pb->n_primitivegroup++]=pg; } g_hash_table_destroy(ctx->string_hash); ctx->string_hash=g_hash_table_new(g_str_hash, g_str_equal); } ctx->pg=ctx->pb->primitivegroup[groupnum]; if (!ctx->pg) { ctx->pg=malloc(sizeof(*context.pg)); *ctx->pg=pg; ctx->pb->primitivegroup[groupnum]=ctx->pg; } return 1; } #if 0 static int osm_protobufdb_start_densenode(struct osm_protobufdb_context *ctx) { OSMPBF__DenseInfo di=OSMPBF__DENSE_INFO__INIT; OSMPBF__DenseNodes dn=OSMPBF__DENSE_NODES__INIT; if (!ctx->pg->dense) { ctx->dn=malloc(sizeof(*context.dn)); *ctx->dn=dn; ctx->pg->dense=ctx->dn; } else ctx->dn=ctx->pg->dense; if (!ctx->dn->denseinfo) { ctx->di=malloc(sizeof(*context.di)); *ctx->di=di; ctx->dn->denseinfo=ctx->di; } else ctx->di=ctx->dn->denseinfo; return 1; } static void osm_protobufdb_write_primitive_group(OSMPBF__PrimitiveGroup *pg, OSMPBF__PrimitiveBlock *pb) { pb->primitivegroup=realloc(pb->primitivegroup,(pb->n_primitivegroup+1)*sizeof(OSMPBF__PrimitiveGroup *)); pb->primitivegroup[pb->n_primitivegroup++]=pg; } #endif #define insert(struct, member, pos) {\ int n=struct->n_##member; \ int s=sizeof(struct->member[0]); \ struct->member=realloc(struct->member, (n+1)*s); \ memmove(&struct->member[n+1], &struct->member[n], (pos-n)*s); \ memset(&struct->member[n], 0, s); \ struct->n_##member++;\ } #if 0 static int osm_protobufdb_insert_densenode(long long id, OSMPBF__Node *offset, OSMPBF__Info *offseti, OSMPBF__DenseNodes *dn) { int i,l,p; memset(offset, 0, sizeof(*offset)); offseti->timestamp=0; offseti->changeset=0; offseti->user_sid=0; offseti->uid=0; l=dn->n_id; for (i = 0 ; i < l ; i++) { offset->id+=dn->id[i]; offset->lat+=dn->lat[i]; offset->lon+=dn->lon[i]; offseti->timestamp+=dn->denseinfo->timestamp[i]; offseti->changeset+=dn->denseinfo->changeset[i]; offseti->user_sid+=dn->denseinfo->user_sid[i]; offseti->uid+=dn->denseinfo->uid[i]; } p=l; insert(dn, id, p); insert(dn, lat, p); insert(dn, lon, p); insert(dn->denseinfo, version, p); insert(dn->denseinfo, timestamp, p); insert(dn->denseinfo, changeset, p); insert(dn->denseinfo, user_sid, p); insert(dn->denseinfo, uid, p); return p; } static void osm_protobufdb_modify_densenode(OSMPBF__Node *node, OSMPBF__Info *info, OSMPBF__Node *offset, OSMPBF__Info *offseti, int pos, OSMPBF__DenseNodes *dn) { int i; if (pos+1 < dn->n_id) { dn->id[pos+1]+=dn->id[pos]-node->id; dn->lat[pos+1]+=dn->lat[pos]-node->lat; dn->lon[pos+1]+=dn->lon[pos]-node->lon; dn->denseinfo->timestamp[pos+1]+=dn->denseinfo->timestamp[pos]-info->timestamp; dn->denseinfo->changeset[pos+1]+=dn->denseinfo->changeset[pos]-info->changeset; dn->denseinfo->user_sid[pos+1]+=dn->denseinfo->user_sid[pos]-info->user_sid; dn->denseinfo->uid[pos+1]+=dn->denseinfo->uid[pos]-info->uid; } dn->id[pos]=node->id-offset->id; dn->lat[pos]=node->lat-offset->lat; dn->lon[pos]=node->lon-offset->lon; dn->keys_vals=realloc(dn->keys_vals, (dn->n_keys_vals+node->n_keys+node->n_vals+1)*sizeof(dn->keys_vals[0])); for (i = 0 ; i < node->n_keys ; i++) { dn->keys_vals[dn->n_keys_vals++]=node->keys[i]; dn->keys_vals[dn->n_keys_vals++]=node->vals[i]; } dn->keys_vals[dn->n_keys_vals++]=0; dn->denseinfo->version[pos]=info->version; dn->denseinfo->timestamp[pos]=info->timestamp-offseti->timestamp; dn->denseinfo->changeset[pos]=info->changeset-offseti->changeset; dn->denseinfo->user_sid[pos]=info->user_sid-offseti->user_sid; dn->denseinfo->uid[pos]=info->uid-offseti->uid; } #endif static int osm_protobufdb_insert_node(long long id, OSMPBF__PrimitiveGroup *pg) { int l,p; OSMPBF__Node node=OSMPBF__NODE__INIT; l=pg->n_nodes; p=l; insert(pg, nodes, p); pg->nodes[p]=malloc(sizeof(*pg->nodes[0])); *pg->nodes[p]=node; return p; } static void osm_protobufdb_modify_node(OSMPBF__Node *node, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) { OSMPBF__Node *n=pg->nodes[pos]; OSMPBF__Info *old_info; if (n->keys) free(n->keys); if (n->vals) free(n->vals); old_info=n->info; *n=*node; if (!info) { if (old_info) osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); n->info=NULL; } else { if (old_info) n->info=old_info; else n->info=malloc(sizeof(*info)); *n->info=*info; } } static int osm_protobufdb_insert_way(long long id, OSMPBF__PrimitiveGroup *pg) { int l,p; OSMPBF__Way way=OSMPBF__WAY__INIT; l=pg->n_ways; p=l; insert(pg, ways, p); pg->ways[p]=malloc(sizeof(*pg->ways[0])); *pg->ways[p]=way; return p; } static void osm_protobufdb_modify_way(OSMPBF__Way *way, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) { OSMPBF__Way *w=pg->ways[pos]; OSMPBF__Info *old_info; int i; long long ref=0; if (w->keys) free(w->keys); if (w->vals) free(w->vals); if (w->refs) free(w->refs); old_info=w->info; *w=*way; for (i = 0 ; i < w->n_refs ; i++) { w->refs[i]-=ref; ref+=w->refs[i]; } if (!info) { if (old_info) osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); w->info=NULL; } else { if (old_info) w->info=old_info; else w->info=malloc(sizeof(*info)); *w->info=*info; } } static int osm_protobufdb_insert_relation(long long id, OSMPBF__PrimitiveGroup *pg) { int l,p; OSMPBF__Relation relation=OSMPBF__RELATION__INIT; l=pg->n_relations; p=l; insert(pg, relations, p); pg->relations[p]=malloc(sizeof(*pg->relations[0])); *pg->relations[p]=relation; return p; } static void osm_protobufdb_modify_relation(OSMPBF__Relation *relation, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) { OSMPBF__Relation *r=pg->relations[pos]; OSMPBF__Info *old_info; int i; long long ref=0; if (r->keys) free(r->keys); if (r->vals) free(r->vals); if (r->roles_sid) free(r->roles_sid); if (r->memids) free(r->memids); if (r->types) free(r->types); old_info=r->info; *r=*relation; for (i = 0 ; i < r->n_memids ; i++) { r->memids[i]-=ref; ref+=r->memids[i]; } if (!info) { if (old_info) osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); r->info=NULL; } else { if (old_info) r->info=old_info; else r->info=malloc(sizeof(*info)); *r->info=*info; } } static int osm_protobufdb_string(struct osm_protobufdb_context *ctx, char *str) { char *strd; OSMPBF__StringTable *st=ctx->st; gpointer value; assert(ctx->string_hash != NULL); if (g_hash_table_lookup_extended(ctx->string_hash, str, NULL, &value)) { return (long)value; } if (!st->n_s) { st->n_s++; } strd=strdup(str); st->s=realloc(st->s, sizeof(st->s[0])*(st->n_s+1)); if (st->n_s == 1) { st->s[0].data=NULL; st->s[0].len=0; } st->s[st->n_s].data=(unsigned char *)strd; st->s[st->n_s].len=strlen(strd); g_hash_table_insert(ctx->string_hash, strd, (gpointer)st->n_s); return st->n_s++; } static int osm_protobufdb_finish_file(struct osm_protobufdb_context *ctx) { osm_protobufdb_finish_block(ctx); if (ctx->f) { fclose(ctx->f); ctx->f=NULL; } ctx->current_file=-1; return 1; } static int osm_protobufdb_start_file(struct osm_protobufdb_context *ctx, int type, int num) { char name[1024]; if (ctx->current_file == num) return 0; osm_protobufdb_finish_file(ctx); sprintf(name,"tst/%d-%08d",type,num); ctx->f=fopen(name,"w"); ctx->current_file=num; ctx->current_block=0; ctx->active_block=-1; return 1; } static void test(void) { #if 0 struct node n,o; long long id=1; long long lat=0; long long lon=0; long long timestamp=0; long long changeset=0; int version=1; int user_sid=0; int uid=0; int p; n.id=1; #endif #if 0 OSMPBF__DenseInfo di=OSMPBF__DENSE_INFO__INIT; OSMPBF__DenseNodes dn=OSMPBF__DENSE_NODES__INIT; #endif context.current_file=-1; #if 0 context.di=malloc(sizeof(*context.di)); *context.di=di; context.dn=malloc(sizeof(*context.dn)); *context.dn=dn; #endif #if 0 di.n_version=1; di.version=&version; di.n_timestamp=1; di.timestamp=×tamp; di.n_changeset=1; di.changeset=&changeset; di.n_user_sid=1; di.user_sid=&user_sid; di.n_uid=1; di.uid=&uid; #endif #if 0 n.id=1; n.lat=1; n.lon=1; n.timestamp=1; n.changeset=1; n.version=1; n.user_sid=0; n.uid=0; p=osm_protobufdb_insert_densenode(&n.id, &o, &dn); osm_protobufdb_modify(&n, &o, p, &dn); p=osm_protobufdb_insert_densenode(&n.id, &o, &dn); osm_protobufdb_modify(&n, &o, p, &dn); #endif #if 0 dn.n_id=1; dn.id=&id; dn.n_lat=1; dn.lat=⪫ dn.n_lon=1; dn.lon=&lon; #endif #if 0 st.n_s=1; data.data="Test"; data.len=4; st.s=&data; #endif } static void finish(void) { osm_protobufdb_finish_file(&context); #if 0 osm_protobufdb_write_primitive_group(context.pg, context.pb); osm_protobufdb_write_primitive_block(context.pb, context.blob); osm_protobufdb_write_blob_to_file(); #endif } static long long osm_protobufdb_timestamp(char *str) { struct tm tm; int res=sscanf(str,"%d-%d-%dT%d:%d:%dZ",&tm.tm_year,&tm.tm_mon,&tm.tm_mday,&tm.tm_hour,&tm.tm_min,&tm.tm_sec); if (res != 6) return 0; tm.tm_year-=1900; tm.tm_mon-=1; #if defined(HAVE_API_WIN32_BASE) || defined(ANDROID) return 0; #else return timegm(&tm); #endif } static void osm_protobufdb_parse_info(struct osm_protobufdb_context *ctx, char *str) { char version[1024]; char changeset[1024]; char user[1024]; char uid[1024]; char timestamp[1024]; OSMPBF__Info *i=&ctx->i, ii=OSMPBF__INFO__INIT; *i=ii; if (osm_xml_get_attribute(str, "version", version, sizeof(version))) { i->version=atoi(version); i->has_version=1; } if (osm_xml_get_attribute(str, "changeset", changeset, sizeof(changeset))) { i->changeset=atoll(changeset); i->has_changeset=1; } if (osm_xml_get_attribute(str, "user", user, sizeof(user))) { osm_xml_decode_entities(user); i->user_sid=osm_protobufdb_string(ctx, user); i->has_user_sid=1; } if (osm_xml_get_attribute(str, "uid", uid, sizeof(uid))) { i->uid=atoi(uid); i->has_uid=1; } if (osm_xml_get_attribute(str, "timestamp", timestamp, sizeof(timestamp))) { i->timestamp=osm_protobufdb_timestamp(timestamp); i->has_timestamp=1; } } static int osm_protobufdb_parse_node(struct osm_protobufdb_context *ctx, char *str) { char id[1024]; char lat[1024]; char lon[1024]; OSMPBF__Node *n=&ctx->n, ni=OSMPBF__NODE__INIT; *n=ni; if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) return 0; if (!osm_xml_get_attribute(str, "lat", lat, sizeof(lat))) return 0; if (!osm_xml_get_attribute(str, "lon", lon, sizeof(lon))) return 0; n->id=atoll(id); n->lat=atof(lat)*latlon_scale+0.5; n->lon=atof(lon)*latlon_scale+0.5; int file=n->id/db_config.node_ids_per_file; int fileo=n->id%db_config.node_ids_per_file; int blob=fileo/db_config.node_ids_per_blob; int blobo=fileo%db_config.node_ids_per_blob; int group=blobo/db_config.node_ids_per_group; osm_protobufdb_start_file(ctx, 1, file); osm_protobufdb_start_block(ctx, blob); osm_protobufdb_start_group(ctx, group); osm_protobufdb_parse_info(ctx, str); ctx->in_node=1; return 1; } static int osm_protobufdb_end_node(struct osm_protobufdb_context *ctx) { int p; #if 0 OSMPBF__Node *n=&ctx->n,offset; OSMPBF__Info *i=&ctx->i,offseti; osm_protobufdb_start_densenode(ctx); p=osm_protobufdb_insert_densenode(n->id, &offset, &offseti, context.dn); osm_protobufdb_modify_densenode(n, i, &offset, &offseti, p, context.dn); #else p=osm_protobufdb_insert_node(ctx->n.id, ctx->pg); osm_protobufdb_modify_node(&ctx->n, &ctx->i, p, ctx->pg); #endif ctx->in_node=0; return 1; } static int osm_protobufdb_parse_way(struct osm_protobufdb_context *ctx, char *str) { char id[1024]; OSMPBF__Way *w=&ctx->w, wi=OSMPBF__WAY__INIT; *w=wi; if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) return 0; w->id=atoll(id); int file=w->id/db_config.way_ids_per_file; int fileo=w->id%db_config.way_ids_per_file; int blob=fileo/db_config.way_ids_per_blob; int blobo=fileo%db_config.way_ids_per_blob; int group=blobo/db_config.way_ids_per_group; osm_protobufdb_start_file(ctx, 2, file); osm_protobufdb_start_block(ctx, blob); osm_protobufdb_start_group(ctx, group); osm_protobufdb_parse_info(ctx, str); ctx->in_way=1; return 1; } static int osm_protobufdb_end_way(struct osm_protobufdb_context *ctx) { int p; p=osm_protobufdb_insert_way(ctx->w.id, ctx->pg); osm_protobufdb_modify_way(&ctx->w, &ctx->i, p, ctx->pg); ctx->in_way=0; return 1; } static int osm_protobufdb_parse_relation(struct osm_protobufdb_context *ctx, char *str) { char id[1024]; OSMPBF__Relation *r=&ctx->r, ri=OSMPBF__RELATION__INIT; *r=ri; if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) return 0; r->id=atoll(id); int file=r->id/db_config.relation_ids_per_file; int fileo=r->id%db_config.relation_ids_per_file; int blob=fileo/db_config.relation_ids_per_blob; int blobo=fileo%db_config.relation_ids_per_blob; int group=blobo/db_config.relation_ids_per_group; osm_protobufdb_start_file(ctx, 3, file); osm_protobufdb_start_block(ctx, blob); osm_protobufdb_start_group(ctx, group); osm_protobufdb_parse_info(ctx, str); ctx->in_relation=1; return 1; } static int osm_protobufdb_end_relation(struct osm_protobufdb_context *ctx) { int p; p=osm_protobufdb_insert_relation(ctx->r.id, ctx->pg); osm_protobufdb_modify_relation(&ctx->r, &ctx->i, p, ctx->pg); ctx->in_node=0; return 1; } static int osm_protobufdb_parse_tag(struct osm_protobufdb_context *ctx, char *str) { OSMPBF__Node *n=&ctx->n; OSMPBF__Way *w=&ctx->w; OSMPBF__Relation *r=&ctx->r; char k_buffer[BUFFER_SIZE]; char v_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(str, "k", k_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(str, "v", v_buffer, BUFFER_SIZE)) return 0; osm_xml_decode_entities(v_buffer); if (ctx->in_node) { n->keys=realloc(n->keys, (n->n_keys+1)*sizeof(n->keys[0])); n->vals=realloc(n->vals, (n->n_vals+1)*sizeof(n->vals[0])); n->keys[n->n_keys++]=osm_protobufdb_string(ctx, k_buffer); n->vals[n->n_vals++]=osm_protobufdb_string(ctx, v_buffer); } if (ctx->in_way) { w->keys=realloc(w->keys, (w->n_keys+1)*sizeof(w->keys[0])); w->vals=realloc(w->vals, (w->n_vals+1)*sizeof(w->vals[0])); w->keys[w->n_keys++]=osm_protobufdb_string(ctx, k_buffer); w->vals[w->n_vals++]=osm_protobufdb_string(ctx, v_buffer); } if (ctx->in_relation) { r->keys=realloc(r->keys, (r->n_keys+1)*sizeof(r->keys[0])); r->vals=realloc(r->vals, (r->n_vals+1)*sizeof(r->vals[0])); r->keys[r->n_keys++]=osm_protobufdb_string(ctx, k_buffer); r->vals[r->n_vals++]=osm_protobufdb_string(ctx, v_buffer); } return 1; } static int osm_protobufdb_parse_nd(struct osm_protobufdb_context *ctx, char *str) { OSMPBF__Way *w=&ctx->w; char ref_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(str, "ref", ref_buffer, BUFFER_SIZE)) return 0; if (ctx->in_way) { w->refs=realloc(w->refs, (w->n_refs+1)*sizeof(w->refs[0])); w->refs[w->n_refs++]=atoll(ref_buffer); } return 1; } static int osm_protobufdb_parse_member(struct osm_protobufdb_context *ctx, char *str) { OSMPBF__Relation *r=&ctx->r; char type_buffer[BUFFER_SIZE]; char ref_buffer[BUFFER_SIZE]; char role_buffer[BUFFER_SIZE]; int type=0; if (!osm_xml_get_attribute(str, "type", type_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(str, "ref", ref_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(str, "role", role_buffer, BUFFER_SIZE)) return 0; if (!strcmp(type_buffer,"node")) type=0; else if (!strcmp(type_buffer,"way")) type=1; else if (!strcmp(type_buffer,"relation")) type=2; if (ctx->in_relation) { r->roles_sid=realloc(r->roles_sid, (r->n_roles_sid+1)*sizeof(r->roles_sid[0])); r->roles_sid[r->n_roles_sid++]=osm_protobufdb_string(ctx, role_buffer); r->memids=realloc(r->memids, (r->n_memids+1)*sizeof(r->memids[0])); r->memids[r->n_memids++]=atoll(ref_buffer); r->types=realloc(r->types, (r->n_types+1)*sizeof(r->types[0])); r->types[r->n_types++]=type; } return 1; } int osm_protobufdb_load(FILE *in, char *dir) { int size=BUFFER_SIZE; char buffer[size]; char *p; sig_alrm(0); test(); while (fgets(buffer, size, in)) { int closed=strstr(buffer,"/>")?1:0; p=strchr(buffer,'<'); if (! p) { fprintf(stderr,"WARNING: wrong line %s\n", buffer); continue; } if (!strncmp(p, "",7)) { osm_protobufdb_end_node(&context); } else if (!strncmp(p, "",6)) { osm_protobufdb_end_way(&context); } else if (!strncmp(p, "",11)) { osm_protobufdb_end_relation(&context); } else if (!strncmp(p, "",6)) { } else { fprintf(stderr,"WARNING: unknown tag in %s\n", buffer); } } finish(); return 1; } navit-0.5.0+dfsg.1/navit/maptool/osm_psql.c000066400000000000000000000120021264204753600205140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "maptool.h" #include "debug.h" #include "linguistics.h" #include "file.h" #ifdef HAVE_POSTGRESQL #include int map_collect_data_osm_db(char *dbstr, struct maptool_osm *osm) { PGconn *conn; PGresult *res,*node,*way,*tag; int count,tagged,i,j,k; long min, max, id, tag_id, node_id; char query[256]; sig_alrm(0); conn=PQconnectdb(dbstr); if (! conn) { fprintf(stderr,"Failed to connect to database with '%s'\n",dbstr); exit(1); } res=PQexec(conn, "begin"); if (! res) { fprintf(stderr, "Cannot begin transaction: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "set transaction isolation level serializable"); if (! res) { fprintf(stderr, "Cannot set isolation level: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "declare node cursor for select id,x(coordinate),y(coordinate) from node order by id"); if (! res) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "declare way cursor for select id from way order by id"); if (! res) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } res=PQexec(conn, "declare relation cursor for select id from relation order by id"); if (! res) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } for (;;) { node=PQexec(conn, "fetch 100000 from node"); if (! node) { fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); PQclear(node); exit(1); } count=PQntuples(node); if (! count) break; min=atol(PQgetvalue(node, 0, 0)); max=atol(PQgetvalue(node, count-1, 0)); sprintf(query,"select node_id,name,value from node_tag where node_id >= %ld and node_id <= %ld order by node_id", min, max); tag=PQexec(conn, query); if (! tag) { fprintf(stderr, "Cannot query node_tag: %s\n", PQerrorMessage(conn)); exit(1); } j=0; for (i = 0 ; i < count ; i++) { id=atol(PQgetvalue(node, i, 0)); osm_add_node(id, atof(PQgetvalue(node, i, 1)), atof(PQgetvalue(node, i, 2))); tagged=0; processed_nodes++; while (j < PQntuples(tag)) { tag_id=atol(PQgetvalue(tag, j, 0)); if (tag_id == id) { osm_add_tag(PQgetvalue(tag, j, 1), PQgetvalue(tag, j, 2)); tagged=1; j++; } if (tag_id < id) j++; if (tag_id > id) break; } osm_end_node(osm); } PQclear(tag); PQclear(node); } for (;;) { way=PQexec(conn, "fetch 100000 from way"); if (! way) { fprintf(stderr, "Cannot setup cursor for ways: %s\n", PQerrorMessage(conn)); PQclear(node); exit(1); } count=PQntuples(way); if (! count) break; min=atol(PQgetvalue(way, 0, 0)); max=atol(PQgetvalue(way, count-1, 0)); sprintf(query,"select way_id,node_id from way_node where way_id >= %ld and way_id <= %ld order by way_id,sequence_id", min, max); node=PQexec(conn, query); if (! node) { fprintf(stderr, "Cannot query way_node: %s\n", PQerrorMessage(conn)); exit(1); } sprintf(query,"select way_id,name,value from way_tag where way_id >= %ld and way_id <= %ld order by way_id", min, max); tag=PQexec(conn, query); if (! tag) { fprintf(stderr, "Cannot query way_tag: %s\n", PQerrorMessage(conn)); exit(1); } j=0; k=0; for (i = 0 ; i < count ; i++) { id=atol(PQgetvalue(way, i, 0)); osm_add_way(id); tagged=0; processed_ways++; while (k < PQntuples(node)) { node_id=atol(PQgetvalue(node, k, 0)); if (node_id == id) { osm_add_nd(atoll(PQgetvalue(node, k, 1))); tagged=1; k++; } if (node_id < id) k++; if (node_id > id) break; } while (j < PQntuples(tag)) { tag_id=atol(PQgetvalue(tag, j, 0)); if (tag_id == id) { osm_add_tag(PQgetvalue(tag, j, 1), PQgetvalue(tag, j, 2)); tagged=1; j++; } if (tag_id < id) j++; if (tag_id > id) break; } if (tagged) osm_end_way(osm); } PQclear(tag); PQclear(node); PQclear(way); } res=PQexec(conn, "commit"); if (! res) { fprintf(stderr, "Cannot commit transaction: %s\n", PQerrorMessage(conn)); PQclear(res); exit(1); } sig_alrm(0); sig_alrm_end(); return 1; } #endif navit-0.5.0+dfsg.1/navit/maptool/osm_relations.c000066400000000000000000000153131264204753600215450ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "maptool.h" #include "attr.h" /** Information about all members of a relation type and how to process them. */ struct relations { /** Hashes for nodes, ways and relations which are members. */ GHashTable *member_hash[3]; /** Default entries for processing items which are not a member of any relation. */ GList *default_members; }; struct relations_func { void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv); void *func_priv; }; struct relations_member { osmid memberid; void *relation_priv,*member_priv; struct relations_func *func; }; static guint relations_member_hash(gconstpointer key) { const struct relations_member *memb=key; return (memb->memberid >> 32)^(memb->memberid & 0xffffffff); } static gboolean relations_member_equal(gconstpointer a, gconstpointer b) { const struct relations_member *memba=a; const struct relations_member *membb=b; return (memba->memberid == membb->memberid); } struct relations * relations_new(void) { struct relations *ret=g_new0(struct relations, 1); int i; for (i = 0 ; i < 3 ; i++) ret->member_hash[i]=g_hash_table_new(relations_member_hash, relations_member_equal); return ret; } struct relations_func * relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), void *func_priv) { struct relations_func *relations_func=g_new(struct relations_func, 1); relations_func->func=func; relations_func->func_priv=func_priv; return relations_func; } static struct relations_member * relations_member_new(struct relations_func *func, void *relation_priv, void *member_priv, osmid id) { struct relations_member *memb=g_new(struct relations_member, 1); memb->memberid=id; memb->relation_priv=relation_priv; memb->member_priv=member_priv; memb->func=func; return memb; } /* * @brief Add an entry for a relation member to the relations collection. * This function fills the relations collection, which is then passed to relations_process for * processing. * @param in rel relations collection to add the new member to * @param in func structure defining function to call when this member is read * @param in relation_priv parameter describing relation, or NULL. Will be passed to func function. * @param in member_priv parameter describing relation member, or NULL. Will be passed to func function. * @param in type Type of this member (node, way etc.). * @param in id OSM ID of relation member. */ void relations_add_relation_member_entry(struct relations *rel, struct relations_func *func, void *relation_priv, void *member_priv, enum relation_member_type type, osmid id) { struct relations_member *memb=relations_member_new(func, relation_priv, member_priv, id); GHashTable *member_hash=rel->member_hash[type-1]; // The real key is the OSM ID, but we recycle "memb" as key to avoid a second allocating for the key. g_hash_table_insert(member_hash, memb, g_list_append(g_hash_table_lookup(member_hash, memb), memb)); } /* * @brief Add a default entry to the relations collection. * Put a default entry into the relations collection, which is then passed to * relations_process for processing. The default entry is used for map items which are not a * member of any relation. * @param in rel relations collection to add the new member to * @param in func structure defining function to call when this member is read */ void relations_add_relation_default_entry(struct relations *rel, struct relations_func *func) { struct relations_member *memb=relations_member_new(func, NULL, NULL, 0); rel->default_members=g_list_append(rel->default_members, memb); } /* * @brief The actual relations processing: Loop through raw data and process any relations members. * This function reads through all nodes and ways passed in, and looks up each item in the * relations collection. For each relation member found, its processing function is called. * @param in rel relations collection storing pre-processed relations. Built using relations_add_relation_member_entry. * @param in nodes file containing nodes in "coords.tmp" format * @param in ways file containing items in item_bin format. This file may contain both nodes, ways, and relations in that format. */ void relations_process(struct relations *rel, FILE *nodes, FILE *ways) { char buffer[128]; struct item_bin *ib=(struct item_bin *)buffer; long long *id; struct coord *c=(struct coord *)(ib+1),cn={0,0}; struct node_item *ni; GList *l; if (nodes) { item_bin_init(ib, type_point_unkn); item_bin_add_coord(ib, &cn, 1); item_bin_add_attr_longlong(ib, attr_osm_nodeid, 0); id=item_bin_get_attr(ib, attr_osm_nodeid, NULL); while ((ni=read_node_item(nodes))) { *id=ni->id; *c=ni->c; l=g_hash_table_lookup(rel->member_hash[0], id); while (l) { struct relations_member *memb=l->data; memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); l=g_list_next(l); } } } if (ways) { while ((ib=read_item(ways))) { l=NULL; if(NULL!=(id=item_bin_get_attr(ib, attr_osm_nodeid, NULL))) l=g_hash_table_lookup(rel->member_hash[0], id); else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_wayid, NULL))) l=g_hash_table_lookup(rel->member_hash[1], id); else if(NULL!=(id=item_bin_get_attr(ib, attr_osm_relationid, NULL))) l=g_hash_table_lookup(rel->member_hash[2], id); if(!l) l=rel->default_members; while (l) { struct relations_member *memb=l->data; memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); l=g_list_next(l); } } } } static void relations_destroy_func(void *key, GList *l, void *data) { GList *ll=l; while (ll) { g_free(ll->data); ll=g_list_next(ll); } g_list_free(l); } void relations_destroy(struct relations *relations) { int i; for (i = 0 ; i < 3 ; i++) { g_hash_table_foreach(relations->member_hash[i], (GHFunc)relations_destroy_func, NULL); g_hash_table_destroy(relations->member_hash[i]); } g_free(relations); } navit-0.5.0+dfsg.1/navit/maptool/osm_xml.c000066400000000000000000000140311264204753600203410ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #ifdef _MSC_VER #define atoll _atoi64 #else #include #endif #include "maptool.h" int osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size) { int len=strlen(attribute); char *pos,*i,s,*attr; attr=g_alloca(len+2); strcpy(attr, attribute); strcpy(attr+len, "="); pos=strstr(xml, attr); if (! pos) return 0; pos+=len+1; s=*pos++; if (! s) return 0; i=strchr(pos, s); if (! i) return 0; if (i - pos > buffer_size) { fprintf(stderr,"Buffer overflow %ld vs %d\n", (long)(i-pos), buffer_size); return 0; } strncpy(buffer, pos, i-pos); buffer[i-pos]='\0'; return 1; } static struct entity { char *entity; char c; } entities[]= { {""",'"'}, {"'",'\''}, {"&",'&'}, {"<",'<'}, {">",'>'}, {""",'"'}, {"'",'\''}, {"&",'&'}, {"<",'<'}, {">",'>'}, {"{",'{'}, {"}",'}'}, }; void osm_xml_decode_entities(char *buffer) { char *pos=buffer; int i,len; while ((pos=strchr(pos, '&'))) { for (i = 0 ; i < sizeof(entities)/sizeof(struct entity); i++) { len=strlen(entities[i].entity); if (!strncmp(pos, entities[i].entity, len)) { *pos=entities[i].c; memmove(pos+1, pos+len, strlen(pos+len)+1); break; } } pos++; } } static int parse_tag(char *p) { char k_buffer[BUFFER_SIZE]; char v_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "k", k_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "v", v_buffer, BUFFER_SIZE)) return 0; osm_xml_decode_entities(v_buffer); osm_add_tag(k_buffer, v_buffer); return 1; } static int parse_node(char *p) { char id_buffer[BUFFER_SIZE]; char lat_buffer[BUFFER_SIZE]; char lon_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "lat", lat_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "lon", lon_buffer, BUFFER_SIZE)) return 0; osm_add_node(atoll(id_buffer), atof(lat_buffer), atof(lon_buffer)); return 1; } static int parse_way(char *p) { char id_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) return 0; osm_add_way(atoll(id_buffer)); return 1; } static int parse_relation(char *p) { char id_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) return 0; osm_add_relation(atoll(id_buffer)); return 1; } static int parse_member(char *p) { char type_buffer[BUFFER_SIZE]; char ref_buffer[BUFFER_SIZE]; char role_buffer[BUFFER_SIZE]; enum relation_member_type type; if (!osm_xml_get_attribute(p, "type", type_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE)) return 0; if (!osm_xml_get_attribute(p, "role", role_buffer, BUFFER_SIZE)) return 0; if (!strcmp(type_buffer,"node")) type=rel_member_node; else if (!strcmp(type_buffer,"way")) type=rel_member_way; else if (!strcmp(type_buffer,"relation")) type=rel_member_relation; else { fprintf(stderr,"Unknown type '%s'\n",type_buffer); return 0; } osm_add_member(type, atoll(ref_buffer), role_buffer); return 1; } static int parse_nd(char *p) { char ref_buffer[BUFFER_SIZE]; if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE)) return 0; osm_add_nd(atoll(ref_buffer)); return 1; } static int xml_declaration_in_line(char* buffer){ return !strncmp(buffer, "",7)) { osm_end_node(osm); } else if (!strncmp(p, "",6)) { osm_end_way(osm); } else if (!strncmp(p, "",11)) { osm_end_relation(osm); } else if (!strncmp(p, "",6)) { } else { fprintf(stderr,"WARNING: unknown tag in %s\n", buffer); } } sig_alrm(0); sig_alrm_end(); return 1; } navit-0.5.0+dfsg.1/navit/maptool/osmformat.proto000066400000000000000000000143661264204753600216260ustar00rootroot00000000000000option java_package = "crosby.binary"; package OSMPBF; /* OSM Binary file format This is the master schema file of the OSM binary file format. This file is designed to support limited random-access and future extendability. A binary OSM file consists of a sequence of FileBlocks (please see fileformat.proto). The first fileblock contains a serialized instance of HeaderBlock, followed by a sequence of PrimitiveBlock blocks that contain the primitives. Each primitiveblock is designed to be independently parsable. It contains a string table storing all strings in that block (keys and values in tags, roles in relations, usernames, etc.) as well as metadata containing the precision of coordinates or timestamps in that block. A primitiveblock contains a sequence of primitive groups, each containing primitives of the same type (nodes, densenodes, ways, relations). Coordinates are stored in signed 64-bit integers. Lat&lon are measured in units nanodegrees. The default of granularity of 100 nanodegrees corresponds to about 1cm on the ground, and a full lat or lon fits into 32 bits. Converting an integer to a lattitude or longitude uses the formula: $OUT = IN * granularity / 10**9$. Many encoding schemes use delta coding when representing nodes and relations. */ ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// /* Contains the file header. */ message HeaderBlock { optional HeaderBBox bbox = 1; /* Additional tags to aid in parsing this dataset */ repeated string required_features = 4; repeated string optional_features = 5; optional string writingprogram = 16; optional string source = 17; // From the bbox field. } /** The bounding box field in the OSM header. BBOX, as used in the OSM header. Units are always in nanodegrees -- they do not obey granularity rules. */ message HeaderBBox { required sint64 left = 1; required sint64 right = 2; required sint64 top = 3; required sint64 bottom = 4; } /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// message PrimitiveBlock { required StringTable stringtable = 1; repeated PrimitiveGroup primitivegroup = 2; // Granularity, units of nanodegrees, used to store coordinates in this block optional int32 granularity = 17 [default=100]; // Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees. optional int64 lat_offset = 19 [default=0]; optional int64 lon_offset = 20 [default=0]; // Granularity of dates, normally represented in units of milliseconds since the 1970 epoch. optional int32 date_granularity = 18 [default=1000]; // Proposed extension: //optional BBox bbox = XX; } // Group of OSMPrimitives. All primitives in a group must be the same type. message PrimitiveGroup { repeated Node nodes = 1; optional DenseNodes dense = 2; repeated Way ways = 3; repeated Relation relations = 4; repeated ChangeSet changesets = 5; } /** String table, contains the common strings in each block. Note that we reserve index '0' as a delimiter, so the entry at that index in the table is ALWAYS blank and unused. */ message StringTable { repeated bytes s = 1; } /* Optional metadata that may be included into each primitive. */ message Info { optional int32 version = 1 [default = -1]; optional int64 timestamp = 2; optional int64 changeset = 3; optional int32 uid = 4; optional uint32 user_sid = 5; // String IDs } /** Optional metadata that may be included into each primitive. Special dense format used in DenseNodes. */ message DenseInfo { repeated int32 version = 1 [packed = true]; repeated sint64 timestamp = 2 [packed = true]; // DELTA coded repeated sint64 changeset = 3 [packed = true]; // DELTA coded repeated sint32 uid = 4 [packed = true]; // DELTA coded repeated sint32 user_sid = 5 [packed = true]; // String IDs for usernames. DELTA coded } // THIS IS STUB DESIGN FOR CHANGESETS. NOT USED RIGHT NOW. // TODO: REMOVE THIS? message ChangeSet { required int64 id = 1; // // // Parallel arrays. // repeated uint32 keys = 2 [packed = true]; // String IDs. // repeated uint32 vals = 3 [packed = true]; // String IDs. // // optional Info info = 4; // optional int64 created_at = 8; // optional int64 closetime_delta = 9; // optional bool open = 10; // optional HeaderBBox bbox = 11; } message Node { required sint64 id = 1; // Parallel arrays. repeated uint32 keys = 2 [packed = true]; // String IDs. repeated uint32 vals = 3 [packed = true]; // String IDs. optional Info info = 4; // May be omitted in omitmeta required sint64 lat = 8; required sint64 lon = 9; } /* Used to densly represent a sequence of nodes that do not have any tags. We represent these nodes columnwise as five columns: ID's, lats, and lons, all delta coded. When metadata is not omitted, We encode keys & vals for all nodes as a single array of integers containing key-stringid and val-stringid, using a stringid of 0 as a delimiter between nodes. ( ( )* '0' )* */ message DenseNodes { repeated sint64 id = 1 [packed = true]; // DELTA coded //repeated Info info = 4; optional DenseInfo denseinfo = 5; repeated sint64 lat = 8 [packed = true]; // DELTA coded repeated sint64 lon = 9 [packed = true]; // DELTA coded // Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless. repeated int32 keys_vals = 10 [packed = true]; } message Way { required int64 id = 1; // Parallel arrays. repeated uint32 keys = 2 [packed = true]; repeated uint32 vals = 3 [packed = true]; optional Info info = 4; repeated sint64 refs = 8 [packed = true]; // DELTA coded } message Relation { enum MemberType { NODE = 0; WAY = 1; RELATION = 2; } required int64 id = 1; // Parallel arrays. repeated uint32 keys = 2 [packed = true]; repeated uint32 vals = 3 [packed = true]; optional Info info = 4; // Parallel arrays repeated int32 roles_sid = 8 [packed = true]; repeated sint64 memids = 9 [packed = true]; // DELTA encoded repeated MemberType types = 10 [packed = true]; } navit-0.5.0+dfsg.1/navit/maptool/sourcesink.c000066400000000000000000000101071264204753600210500ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "coord.h" #include "item.h" #include "attr.h" #include "maptool.h" struct item_bin_sink * item_bin_sink_new(void) { struct item_bin_sink *ret=g_new0(struct item_bin_sink, 1); return ret; } struct item_bin_sink_func * item_bin_sink_func_new(int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)) { struct item_bin_sink_func *ret=g_new0(struct item_bin_sink_func, 1); ret->func=func; return ret; } void item_bin_sink_func_destroy(struct item_bin_sink_func *func) { g_free(func); } void item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func) { sink->sink_funcs=g_list_append(sink->sink_funcs, func); } void item_bin_sink_destroy(struct item_bin_sink *sink) { /* g_list_foreach(sink->sink_funcs, (GFunc)g_free, NULL); */ g_list_free(sink->sink_funcs); g_free(sink); } int item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data) { GList *list=sink->sink_funcs; int ret=0; while (list) { struct item_bin_sink_func *func=list->data; ret=func->func(func, ib, tile_data); if (ret) break; list=g_list_next(list); } return ret; } struct item_bin_sink * file_reader_new(FILE *in, int limit, int offset) { struct item_bin_sink *ret; if (!in) return NULL; ret=item_bin_sink_new(); ret->priv_data[0]=in; ret->priv_data[1]=(void *)(long)limit; ret->priv_data[2]=(void *)(long)offset; fseek(in, 0, SEEK_SET); return ret; } int file_reader_finish(struct item_bin_sink *sink) { struct item_bin *ib; int ret =0; FILE *in=sink->priv_data[0]; int limit=(int)(long)sink->priv_data[1]; int offset=(int)(long)sink->priv_data[2]; while ((ib=read_item(in))) { if (offset > 0) { offset--; } else { ret=item_bin_write_to_sink(ib, sink, NULL); if (ret || (limit != -1 && !--limit)) { item_bin_sink_destroy(sink); return ret; } } } item_bin_sink_destroy(sink); return 0; } int file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data) { FILE *out=func->priv_data[0]; item_bin_write(ib, out); return 0; } struct item_bin_sink_func * file_writer_new(FILE *out) { struct item_bin_sink_func *file_writer; if (!out) return NULL; file_writer=item_bin_sink_func_new(file_writer_process); file_writer->priv_data[0]=out; return file_writer; } int file_writer_finish(struct item_bin_sink_func *file_writer) { item_bin_sink_func_destroy(file_writer); return 0; } int tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data) { int *buffer,*buffer2; int len=ib->len+1; GHashTable *hash=tile_collector->priv_data[0]; buffer=g_hash_table_lookup(hash, tile_data->buffer); buffer2=g_malloc((len+(buffer ? buffer[0] : 1))*4); if (buffer) { memcpy(buffer2, buffer, buffer[0]*4); } else buffer2[0]=1; memcpy(buffer2+buffer2[0], ib, len*4); buffer2[0]+=len; g_hash_table_insert(hash, g_strdup(tile_data->buffer), buffer2); return 0; } struct item_bin_sink_func * tile_collector_new(struct item_bin_sink *out) { struct item_bin_sink_func *tile_collector; tile_collector=item_bin_sink_func_new(tile_collector_process); tile_collector->priv_data[0]=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); tile_collector->priv_data[1]=out; return tile_collector; } navit-0.5.0+dfsg.1/navit/maptool/tempfile.c000066400000000000000000000031421264204753600204710ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2011 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "navit_lfs.h" #ifndef _MSC_VER #include #endif #include "maptool.h" #include "debug.h" char * tempfile_name(char *suffix, char *name) { return g_strdup_printf("%s_%s.tmp",name, suffix); } FILE * tempfile(char *suffix, char *name, int mode) { char *buffer=tempfile_name(suffix, name); FILE *ret=NULL; switch (mode) { case 0: ret=fopen(buffer, "rb"); break; case 1: ret=fopen(buffer, "wb+"); break; case 2: ret=fopen(buffer, "ab"); break; } g_free(buffer); return ret; } void tempfile_unlink(char *suffix, char *name) { char buffer[4096]; sprintf(buffer,"%s_%s.tmp",name, suffix); unlink(buffer); } void tempfile_rename(char *suffix, char *from, char *to) { char buffer_from[4096],buffer_to[4096]; sprintf(buffer_from,"%s_%s.tmp",from,suffix); sprintf(buffer_to,"%s_%s.tmp",to,suffix); dbg_assert(rename(buffer_from, buffer_to) == 0); } navit-0.5.0+dfsg.1/navit/maptool/tile.c000066400000000000000000000406611264204753600176300ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #ifndef _MSC_VER #include #include #endif #include #include #include #include "file.h" #include "item.h" #include "map.h" #include "zipfile.h" #include "main.h" #include "config.h" #include "linguistics.h" #include "plugin.h" #include "maptool.h" GList *aux_tile_list; struct tile_head *tile_head_root; GHashTable *strings_hash,*tile_hash,*tile_hash2; static char* string_hash_lookup( const char* key ) { char* key_ptr = NULL; if ( strings_hash == NULL ) { strings_hash = g_hash_table_new(g_str_hash, g_str_equal); } if ( ( key_ptr = g_hash_table_lookup(strings_hash, key )) == NULL ) { key_ptr = g_strdup( key ); g_hash_table_insert(strings_hash, key_ptr, (gpointer)key_ptr ); } return key_ptr; } static char** th_get_subtile( const struct tile_head* th, int idx ) { char* subtile_ptr = NULL; subtile_ptr = (char*)th + sizeof( struct tile_head ) + idx * sizeof( char *); return (char**)subtile_ptr; } int tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr) { int x0,x2,x4; int y0,y2,y4; int xo,yo; int i; struct rect rr=*r; x0=world_bbox.l.x; y0=world_bbox.l.y; x4=world_bbox.h.x; y4=world_bbox.h.y; if(rr.l.xx4) rr.l.x=x4; if(rr.h.x>x4) rr.h.x=x4; if(rr.l.y>y4) rr.l.y=y4; if(rr.h.y>y4) rr.h.y=y4; for (i = 0 ; i < max ; i++) { x2=(x0+x4)/2; y2=(y0+y4)/2; xo=(x4-x0)*overlap/100; yo=(y4-y0)*overlap/100; if ( contains_bbox(x0,y0,x2+xo,y2+yo,&rr)) { strcat(ret,"d"); x4=x2+xo; y4=y2+yo; } else if (contains_bbox(x2-xo,y0,x4,y2+yo,&rr)) { strcat(ret,"c"); x0=x2-xo; y4=y2+yo; } else if (contains_bbox(x0,y2-yo,x2+xo,y4,&rr)) { strcat(ret,"b"); x4=x2+xo; y0=y2-yo; } else if (contains_bbox(x2-xo,y2-yo,x4,y4,&rr)) { strcat(ret,"a"); x0=x2-xo; y0=y2-yo; } else break; } if (tr) { tr->l.x=x0; tr->l.y=y0; tr->h.x=x4; tr->h.y=y4; } if (suffix) strcat(ret,suffix); return i; } void tile_bbox(char *tile, struct rect *r, int overlap) { struct coord c; int xo,yo; *r=world_bbox; while (*tile) { c.x=(r->l.x+r->h.x)/2; c.y=(r->l.y+r->h.y)/2; xo=(r->h.x-r->l.x)*overlap/100; yo=(r->h.y-r->l.y)*overlap/100; switch (*tile) { case 'a': r->l.x=c.x-xo; r->l.y=c.y-yo; break; case 'b': r->h.x=c.x+xo; r->l.y=c.y-yo; break; case 'c': r->l.x=c.x-xo; r->h.y=c.y+yo; break; case 'd': r->h.x=c.x+xo; r->h.y=c.y+yo; break; } tile++; } } int tile_len(char *tile) { int ret=0; while (tile[0] >= 'a' && tile[0] <= 'd') { tile++; ret++; } return ret; } static void tile_extend(char *tile, struct item_bin *ib, GList **tiles_list) { struct tile_head *th=NULL; if (debug_tile(tile)) fprintf(stderr,"Tile:Writing %d bytes to '%s' (%p,%p) 0x%x "LONGLONG_FMT"\n", (ib->len+1)*4, tile, g_hash_table_lookup(tile_hash, tile), tile_hash2 ? g_hash_table_lookup(tile_hash2, tile) : NULL, ib->type, item_bin_get_id(ib)); if (tile_hash2) th=g_hash_table_lookup(tile_hash2, tile); if (!th) th=g_hash_table_lookup(tile_hash, tile); if (! th) { th=malloc(sizeof(struct tile_head)+ sizeof( char* ) ); assert(th != NULL); // strcpy(th->subtiles, tile); th->num_subtiles=1; th->total_size=0; th->total_size_used=0; th->zipnum=0; th->zip_data=NULL; th->name=string_hash_lookup(tile); *th_get_subtile( th, 0 ) = th->name; if (tile_hash2) g_hash_table_insert(tile_hash2, string_hash_lookup( th->name ), th); if (tiles_list) *tiles_list=g_list_append(*tiles_list, string_hash_lookup( th->name ) ); processed_tiles++; if (debug_tile(tile)) fprintf(stderr,"new '%s'\n", tile); } th->total_size+=ib->len*4+4; if (debug_tile(tile)) fprintf(stderr,"New total size of %s(%p):%d\n", th->name, th, th->total_size); g_hash_table_insert(tile_hash, string_hash_lookup( th->name ), th); } static int tile_data_size(char *tile) { struct tile_head *th; th=g_hash_table_lookup(tile_hash, tile); if (! th) return 0; return th->total_size; } static int merge_tile(char *base, char *sub) { struct tile_head *thb, *ths; thb=g_hash_table_lookup(tile_hash, base); ths=g_hash_table_lookup(tile_hash, sub); if (! ths) return 0; if (debug_tile(base) || debug_tile(sub)) fprintf(stderr,"merging '%s'(%p) (%d) with '%s'(%p) (%d)\n", base, thb, thb ? thb->total_size : 0, sub, ths, ths->total_size); if (! thb) { thb=ths; g_hash_table_remove(tile_hash, sub); thb->name=string_hash_lookup(base); g_hash_table_insert(tile_hash, string_hash_lookup( thb->name ), thb); } else { thb=realloc(thb, sizeof(struct tile_head)+( ths->num_subtiles+thb->num_subtiles ) * sizeof( char*) ); assert(thb != NULL); memcpy( th_get_subtile( thb, thb->num_subtiles ), th_get_subtile( ths, 0 ), ths->num_subtiles * sizeof( char*) ); thb->num_subtiles+=ths->num_subtiles; thb->total_size+=ths->total_size; g_hash_table_insert(tile_hash, string_hash_lookup( thb->name ), thb); g_hash_table_remove(tile_hash, sub); g_free(ths); } return 1; } static gint get_tiles_list_cmp(gconstpointer s1, gconstpointer s2) { return strcmp((char *)s1, (char *)s2); } static void get_tiles_list_func(char *key, struct tile_head *th, GList **list) { *list=g_list_prepend(*list, key); } static GList * get_tiles_list(void) { GList *ret=NULL; g_hash_table_foreach(tile_hash, (GHFunc)get_tiles_list_func, &ret); ret=g_list_sort(ret, get_tiles_list_cmp); return ret; } #if 0 static void write_tile(char *key, struct tile_head *th, gpointer dummy) { FILE *f; char buffer[1024]; fprintf(stderr,"DEBUG: Writing %s\n", key); strcpy(buffer,"tiles/"); strcat(buffer,key); #if 0 strcat(buffer,".bin"); #endif f=fopen(buffer, "wb+"); while (th) { fwrite(th->data, th->size, 1, f); th=th->next; } fclose(f); } #endif static void write_item(char *tile, struct item_bin *ib, FILE *reference) { struct tile_head *th; int size; th=g_hash_table_lookup(tile_hash2, tile); if (debug_itembin(ib)) { fprintf(stderr,"tile head %p\n",th); } if (! th) th=g_hash_table_lookup(tile_hash, tile); if (th) { if (debug_itembin(ib)) { fprintf(stderr,"Match %s %d %s\n",tile,th->process,th->name); dump_itembin(ib); } if (th->process != 0 && th->process != 1) { fprintf(stderr,"error with tile '%s' of length %d\n", tile, (int)strlen(tile)); abort(); } if (! th->process) { if (reference) fseek(reference, 8, SEEK_CUR); return; } if (debug_tile(tile)) fprintf(stderr,"Data:Writing %d bytes to '%s' (%p,%p) 0x%x\n", (ib->len+1)*4, tile, g_hash_table_lookup(tile_hash, tile), tile_hash2 ? g_hash_table_lookup(tile_hash2, tile) : NULL, ib->type); size=(ib->len+1)*4; if (th->total_size_used+size > th->total_size) { fprintf(stderr,"Overflow in tile %s (used %d max %d item %d)\n", tile, th->total_size_used, th->total_size, size); exit(1); return; } if (reference) { int offset=th->total_size_used/4; dbg_assert(fwrite(&th->zipnum, sizeof(th->zipnum), 1, reference)==1); dbg_assert(fwrite(&offset, sizeof(th->total_size_used), 1, reference)==1); } if (th->zip_data) memcpy(th->zip_data+th->total_size_used, ib, size); th->total_size_used+=size; } else { fprintf(stderr,"no tile hash found for %s\n", tile); exit(1); } } void tile_write_item_to_tile(struct tile_info *info, struct item_bin *ib, FILE *reference, char *name) { if (info->write) write_item(name, ib, reference); else tile_extend(name, ib, info->tiles_list); } void tile_write_item_minmax(struct tile_info *info, struct item_bin *ib, FILE *reference, int min, int max) { struct rect r; char buffer[1024]; bbox((struct coord *)(ib+1), ib->clen/2, &r); buffer[0]='\0'; tile(&r, info->suffix, buffer, max, overlap, NULL); tile_write_item_to_tile(info, ib, reference, buffer); } int add_aux_tile(struct zip_info *zip_info, char *name, char *filename, int size) { struct aux_tile *at; GList *l; l=aux_tile_list; while (l) { at=l->data; if (!strcmp(at->name, name)) { return -1; } l=g_list_next(l); } at=g_new0(struct aux_tile, 1); at->name=g_strdup(name); at->filename=g_strdup(filename); at->size=size; aux_tile_list=g_list_append(aux_tile_list, at); fprintf(stderr,"Adding %s as %s\n",filename, name); return zip_add_member(zip_info); } int write_aux_tiles(struct zip_info *zip_info) { GList *l=aux_tile_list; struct aux_tile *at; char *buffer; FILE *f; int count=0; while (l) { at=l->data; buffer=malloc(at->size); assert(buffer != NULL); f=fopen(at->filename,"rb"); assert(f != NULL); fread(buffer, at->size, 1, f); fclose(f); write_zipmember(zip_info, at->name, zip_get_maxnamelen(zip_info), buffer, at->size); free(buffer); count++; l=g_list_next(l); zip_add_member(zip_info); } return count; } static int add_tile_hash(struct tile_head *th) { int idx,len,maxnamelen=0; char **data; #if 0 g_hash_table_insert(tile_hash2, string_hash_lookup( th->name ), th); #endif for( idx = 0; idx < th->num_subtiles; idx++ ) { data = th_get_subtile( th, idx ); if (debug_tile(((char *)data)) || debug_tile(th->name)) { fprintf(stderr,"Parent for '%s' is '%s'\n", *data, th->name); } g_hash_table_insert(tile_hash2, *data, th); len = strlen( *data ); if (len > maxnamelen) { maxnamelen=len; } } return maxnamelen; } int create_tile_hash(void) { struct tile_head *th; int len,maxnamelen=0; tile_hash2=g_hash_table_new(g_str_hash, g_str_equal); th=tile_head_root; while (th) { len=add_tile_hash(th); if (len > maxnamelen) maxnamelen=len; th=th->next; } return maxnamelen; } static void create_tile_hash_list(GList *list) { GList *next; struct tile_head *th; tile_hash2=g_hash_table_new(g_str_hash, g_str_equal); next=g_list_first(list); while (next) { th=g_hash_table_lookup(tile_hash, next->data); if (!th) { fprintf(stderr,"No tile found for '%s'\n", (char *)(next->data)); } add_tile_hash(th); next=g_list_next(next); } } void load_tilesdir(FILE *in) { char tile[32],subtile[32],c; int size,zipnum=0; struct tile_head **last; create_tile_hash(); tile_hash=g_hash_table_new(g_str_hash, g_str_equal); last=&tile_head_root; while (fscanf(in,"%[^:]:%d",tile,&size) == 2) { struct tile_head *th=malloc(sizeof(struct tile_head)); if (!strcmp(tile,"index")) tile[0]='\0'; th->num_subtiles=0; th->total_size=size; th->total_size_used=0; th->zipnum=zipnum++; th->zip_data=NULL; th->name=string_hash_lookup(tile); #if 0 printf("tile '%s' %d\n",tile,size); #endif while (fscanf(in,":%[^:\n]",subtile) == 1) { #if 0 printf("subtile '%s'\n",subtile); #endif th=realloc(th, sizeof(struct tile_head)+(th->num_subtiles+1)*sizeof(char*)); *th_get_subtile( th, th->num_subtiles ) = string_hash_lookup(subtile); th->num_subtiles++; } *last=th; last=&th->next; add_tile_hash(th); g_hash_table_insert(tile_hash, th->name, th); if (fread(&c, 1, 1, in) != 1 || c != '\n') { printf("syntax error\n"); } } *last=NULL; } void write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out) { int idx,len,maxlen; GList *next,*tiles_list; char **data; struct tile_head *th,**last=NULL; tiles_list=get_tiles_list(); info->tiles_list=&tiles_list; if (! info->write) create_tile_hash_list(tiles_list); next=g_list_first(tiles_list); last=&tile_head_root; maxlen=info->maxlen; if (! maxlen) { while (next) { if (strlen(next->data) > maxlen) maxlen=strlen(next->data); next=g_list_next(next); } } len=maxlen; while (len >= 0) { #if 0 fprintf(stderr,"PROGRESS: collecting tiles with len=%d\n", len); #endif next=g_list_first(tiles_list); while (next) { if (strlen(next->data) == len) { th=g_hash_table_lookup(tile_hash, next->data); if (!info->write) { *last=th; last=&th->next; th->next=NULL; th->zipnum=zip_get_zipnum(zip_info); fprintf(out,"%s:%d",strlen((char *)next->data)?(char *)next->data:"index",th->total_size); for ( idx = 0; idx< th->num_subtiles; idx++ ){ data= th_get_subtile( th, idx ); fprintf(out,":%s", *data); } fprintf(out,"\n"); } if (th->name[strlen(info->suffix)]) index_submap_add(info, th); zip_add_member(zip_info); processed_tiles++; } next=g_list_next(next); } len--; } g_list_free(tiles_list); if (info->suffix[0] && info->write) { struct item_bin *item_bin=init_item(type_submap); item_bin_add_coord_rect(item_bin, &world_bbox); item_bin_add_attr_range(item_bin, attr_order, 0, 255); item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_get_zipnum(zip_info)-1); item_bin_write(item_bin, zip_get_index(zip_info)); } } void merge_tiles(struct tile_info *info) { struct tile_head *th; char basetile[1024]; char subtile[1024]; GList *tiles_list_sorted,*last; int i,i_min,len,size_all,size[5],size_min,work_done; long long zip_size; do { tiles_list_sorted=get_tiles_list(); fprintf(stderr,"PROGRESS: sorting %d tiles\n", g_list_length(tiles_list_sorted)); tiles_list_sorted=g_list_sort(tiles_list_sorted, (GCompareFunc)strcmp); fprintf(stderr,"PROGRESS: sorting %d tiles done\n", g_list_length(tiles_list_sorted)); last=g_list_last(tiles_list_sorted); zip_size=0; while (last) { th=g_hash_table_lookup(tile_hash, last->data); zip_size+=th->total_size; last=g_list_previous(last); } last=g_list_last(tiles_list_sorted); work_done=0; while (last) { processed_tiles++; len=tile_len(last->data); if (len >= 1) { strcpy(basetile,last->data); basetile[len-1]='\0'; strcat(basetile, info->suffix); strcpy(subtile,last->data); for (i = 0 ; i < 4 ; i++) { subtile[len-1]='a'+i; size[i]=tile_data_size(subtile); } size[4]=tile_data_size(basetile); size_all=size[0]+size[1]+size[2]+size[3]+size[4]; if (size_all < 65536 && size_all > 0 && size_all != size[4]) { for (i = 0 ; i < 4 ; i++) { subtile[len-1]='a'+i; work_done+=merge_tile(basetile, subtile); } } else { for (;;) { size_min=size_all; i_min=-1; for (i = 0 ; i < 4 ; i++) { if (size[i] && size[i] < size_min) { size_min=size[i]; i_min=i; } } if (i_min == -1) break; if (size[4]+size_min >= 65536) break; subtile[len-1]='a'+i_min; work_done+=merge_tile(basetile, subtile); size[4]+=size[i_min]; size[i_min]=0; } } } last=g_list_previous(last); } g_list_free(tiles_list_sorted); fprintf(stderr,"PROGRESS: merged %d tiles\n", work_done); } while (work_done); } struct attr map_information_attrs[32]; void index_init(struct zip_info *info, int version) { struct item_bin *item_bin; int i; map_information_attrs[0].type=attr_version; map_information_attrs[0].u.num=version; item_bin=init_item(type_map_information); for (i = 0 ; i < 32 ; i++) { if (!map_information_attrs[i].type) break; item_bin_add_attr(item_bin, &map_information_attrs[i]); } item_bin_write(item_bin, zip_get_index(info)); } void index_submap_add(struct tile_info *info, struct tile_head *th) { int tlen=tile_len(th->name); int len=tlen; char *index_tile; struct rect r; struct item_bin *item_bin; index_tile=g_alloca(len+1+strlen(info->suffix)); strcpy(index_tile, th->name); if (len > 6) len=6; else len=0; index_tile[len]=0; strcat(index_tile, info->suffix); tile_bbox(th->name, &r, overlap); item_bin=init_item(type_submap); item_bin_add_coord_rect(item_bin, &r); item_bin_add_attr_range(item_bin, attr_order, (tlen > 4)?tlen-4 : 0, 255); item_bin_add_attr_int(item_bin, attr_zipfile_ref, th->zipnum); tile_write_item_to_tile(info, item_bin, NULL, index_tile); } navit-0.5.0+dfsg.1/navit/maptool/zip.c000066400000000000000000000230461264204753600174730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "debug.h" #include "maptool.h" #include "config.h" #include "zipfile.h" #ifdef HAVE_LIBCRYPTO #include #include #include #include #include #include #endif struct zip_info { int zipnum; int dir_size; long long offset; int compression_level; int maxnamelen; int zip64; short date; short time; char *passwd; FILE *res2; FILE *index; FILE *dir; #ifdef HAVE_LIBCRYPTO MD5_CTX md5_ctx; #endif int md5; }; static int zip_write(struct zip_info *info, void *data, int len) { if (fwrite(data, len, 1, info->res2) != 1) return 0; #ifdef HAVE_LIBCRYPTO if (info->md5) MD5_Update(&info->md5_ctx, data, len); #endif return 1; } #ifdef HAVE_ZLIB static int compress2_int(Byte *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit2(&stream, level, Z_DEFLATED, -15, 9, Z_DEFAULT_STRATEGY); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } #endif void write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data, int data_size) { struct zip_lfh lfh = { 0x04034b50, 0x0a, 0x0, 0x0, zip_info->time, zip_info->date, 0x0, 0x0, 0x0, filelen, 0x0, }; struct zip_cd cd = { 0x02014b50, 0x17, 0x00, 0x0a, 0x00, 0x0000, 0x0, zip_info->time, zip_info->date, 0x0, 0x0, 0x0, filelen, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, zip_info->offset, }; struct zip_cd_ext cd_ext = { 0x1, 0x8, zip_info->offset, }; #ifdef HAVE_LIBCRYPTO struct zip_enc enc = { 0x9901, 0x7, 0x2, 'A','E', 0x1, 0x0, }; unsigned char salt[8], key[34], verify[2], mac[10]; #endif char *filename; int crc=0,len,comp_size=data_size; uLongf destlen=data_size+data_size/500+12; char *compbuffer; compbuffer = malloc(destlen); if (!compbuffer) { fprintf(stderr, "No more memory.\n"); exit (1); } #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { RAND_bytes(salt, sizeof(salt)); PKCS5_PBKDF2_HMAC_SHA1(zip_info->passwd, strlen(zip_info->passwd), salt, sizeof(salt), 1000, sizeof(key), key); verify[0]=key[32]; verify[1]=key[33]; } else { #endif crc=crc32(0, NULL, 0); crc=crc32(crc, (unsigned char *)data, data_size); #ifdef HAVE_LIBCRYPTO } #endif lfh.zipmthd=zip_info->compression_level ? 8:0; #ifdef HAVE_ZLIB if (zip_info->compression_level) { int error=compress2_int((Byte *)compbuffer, &destlen, (Bytef *)data, data_size, zip_info->compression_level); if (error == Z_OK) { if (destlen < data_size) { data=compbuffer; comp_size=destlen; } else lfh.zipmthd=0; } else { fprintf(stderr,"compress2 returned %d\n", error); } } #endif lfh.zipcrc=crc; lfh.zipsize=comp_size; lfh.zipuncmp=data_size; #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { enc.compress_method=lfh.zipmthd; lfh.zipmthd=99; lfh.zipxtraln+=sizeof(enc); lfh.zipgenfld|=1; lfh.zipsize+=sizeof(salt)+sizeof(verify)+sizeof(mac); } #endif cd.zipccrc=crc; cd.zipcsiz=lfh.zipsize; cd.zipcunc=data_size; cd.zipcmthd=lfh.zipmthd; if (zip_info->zip64) { cd.zipofst=0xffffffff; cd.zipcxtl+=sizeof(cd_ext); } #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { cd.zipcmthd=99; cd.zipcxtl+=sizeof(enc); cd.zipcflg|=1; } #endif filename=g_alloca(filelen+1); strcpy(filename, name); len=strlen(filename); while (len < filelen) { filename[len++]='_'; } filename[filelen]='\0'; zip_write(zip_info, &lfh, sizeof(lfh)); zip_write(zip_info, filename, filelen); zip_info->offset+=sizeof(lfh)+filelen; #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { unsigned char counter[16], xor[16], *datap=(unsigned char *)data; int size=comp_size; AES_KEY aeskey; zip_write(zip_info, &enc, sizeof(enc)); zip_write(zip_info, salt, sizeof(salt)); zip_write(zip_info, verify, sizeof(verify)); zip_info->offset+=sizeof(enc)+sizeof(salt)+sizeof(verify); AES_set_encrypt_key(key, 128, &aeskey); memset(counter, 0, sizeof(counter)); while (size > 0) { int i,curr_size,idx=0; do { counter[idx]++; } while (!counter[idx++]); AES_encrypt(counter, xor, &aeskey); curr_size=size; if (curr_size > sizeof(xor)) curr_size=sizeof(xor); for (i = 0 ; i < curr_size ; i++) *datap++^=xor[i]; size-=curr_size; } } #endif zip_write(zip_info, data, comp_size); zip_info->offset+=comp_size; #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { unsigned int maclen=sizeof(mac); unsigned char mactmp[maclen*2]; HMAC(EVP_sha1(), key+16, 16, (unsigned char *)data, comp_size, mactmp, &maclen); zip_write(zip_info, mactmp, sizeof(mac)); zip_info->offset+=sizeof(mac); } #endif dbg_assert(fwrite(&cd, sizeof(cd), 1, zip_info->dir)==1); dbg_assert(fwrite(filename, filelen, 1, zip_info->dir)==1); zip_info->dir_size+=sizeof(cd)+filelen; if (zip_info->zip64) { dbg_assert(fwrite(&cd_ext, sizeof(cd_ext), 1, zip_info->dir)==1); zip_info->dir_size+=sizeof(cd_ext); } #ifdef HAVE_LIBCRYPTO if (zip_info->passwd) { dbg_assert(fwrite(&enc, sizeof(enc), 1, zip_info->dir)==1); zip_info->dir_size+=sizeof(enc); } #endif free(compbuffer); } void zip_write_index(struct zip_info *info) { int size=ftell(info->index); char *buffer; buffer=g_alloca(size); fseek(info->index, 0, SEEK_SET); fread(buffer, size, 1, info->index); write_zipmember(info, "index", strlen("index"), buffer, size); info->zipnum++; } static void zip_write_file_data(struct zip_info *info, FILE *in) { size_t size; char buffer[4096]; while ((size=fread(buffer, 1, 4096, in))) zip_write(info, buffer, size); } int zip_write_directory(struct zip_info *info) { struct zip_eoc eoc = { 0x06054b50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, 0x0, 0x0, }; struct zip64_eoc eoc64 = { 0x06064b50, 0x0, 0x0, 0x0403, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; struct zip64_eocl eocl = { 0x07064b50, 0x0, 0x0, 0x0, }; fseek(info->dir, 0, SEEK_SET); zip_write_file_data(info, info->dir); if (info->zip64) { eoc64.zip64esize=sizeof(eoc64)-12; eoc64.zip64enum=info->zipnum; eoc64.zip64ecenn=info->zipnum; eoc64.zip64ecsz=info->dir_size; eoc64.zip64eofst=info->offset; zip_write(info, &eoc64, sizeof(eoc64)); eocl.zip64lofst=info->offset+info->dir_size; zip_write(info, &eocl, sizeof(eocl)); } eoc.zipenum=info->zipnum; eoc.zipecenn=info->zipnum; eoc.zipecsz=info->dir_size; eoc.zipeofst=info->offset; zip_write(info, &eoc, sizeof(eoc)); sig_alrm(0); #ifndef _WIN32 alarm(0); #endif return 0; } struct zip_info * zip_new(void) { return g_new0(struct zip_info, 1); } void zip_set_md5(struct zip_info *info, int on) { #ifdef HAVE_LIBCRYPTO info->md5=on; if (on) MD5_Init(&info->md5_ctx); #endif } int zip_get_md5(struct zip_info *info, unsigned char *out) { if (!info->md5) return 0; #ifdef HAVE_LIBCRYPTO MD5_Final(out, &info->md5_ctx); return 1; #endif return 0; } void zip_set_zip64(struct zip_info *info, int on) { info->zip64=on; } void zip_set_compression_level(struct zip_info *info, int level) { info->compression_level=level; } void zip_set_maxnamelen(struct zip_info *info, int max) { info->maxnamelen=max; } int zip_get_maxnamelen(struct zip_info *info) { return info->maxnamelen; } int zip_add_member(struct zip_info *info) { return info->zipnum++; } int zip_set_timestamp(struct zip_info *info, char *timestamp) { int year,month,day,hour,min,sec; if (sscanf(timestamp,"%d-%d-%dT%d:%d:%d",&year,&month,&day,&hour,&min,&sec) == 6) { info->date=day | (month << 5) | ((year-1980) << 9); info->time=(sec >> 1) | (min << 5) | (hour << 11); return 1; } return 0; } int zip_open(struct zip_info *info, char *out, char *dir, char *index) { info->res2=fopen(out,"wb+"); if(!info->res2) { fprintf(stderr,"Could not open output zip file %s\n", out); return 0; } info->dir=fopen(dir,"wb+"); if(!info->dir) { fprintf(stderr,"Could not open zip directory %s\n", dir); return 0; } info->index=fopen(index,"wb+"); if(!info->index) { fprintf(stderr,"Could not open index %s\n", index); return 0; } return 1; } FILE * zip_get_index(struct zip_info *info) { return info->index; } int zip_get_zipnum(struct zip_info *info) { return info->zipnum; } void zip_set_zipnum(struct zip_info *info, int num) { info->zipnum=num; } void zip_close(struct zip_info *info) { fclose(info->index); fclose(info->dir); fclose(info->res2); } void zip_destroy(struct zip_info *info) { g_free(info); } navit-0.5.0+dfsg.1/navit/maptype.c000066400000000000000000000025411264204753600166720ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "projection.h" #include "item.h" #include "map.h" #include "maptype.h" static struct maptype *maptype_root; void maptype_register(char *name, struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro)) { struct maptype *mt; mt=g_new(struct maptype, 1); mt->name=g_strdup(name); mt->map_new=map_new; mt->next=maptype_root; maptype_root=mt; } struct maptype * maptype_get(const char *name) { struct maptype *mt=maptype_root; while (mt) { if (!g_ascii_strcasecmp(mt->name, name)) return mt; mt=mt->next; } return NULL; } navit-0.5.0+dfsg.1/navit/maptype.h000066400000000000000000000024071264204753600167000ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAPTYPE_H #define NAVIT_MAPTYPE_H struct map_methods; enum projection; struct maptype { char *name; struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro); struct maptype *next; }; /* prototypes */ struct map_methods; struct map_priv; struct maptype; void maptype_register(char *name, struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro)); struct maptype *maptype_get(const char *name); #endif navit-0.5.0+dfsg.1/navit/menu.c000066400000000000000000000023661264204753600161640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "menu.h" #include "debug.h" struct menu * menu_add(struct menu *menu, char *name, enum menu_type type, struct callback *cb) { struct menu *this; if (! menu || ! menu->meth.add) return NULL; this=g_new0(struct menu, 1); this->priv=(*menu->meth.add)(menu->priv, &this->meth, name, type, cb); if (! this->priv) { g_free(this); return NULL; } return this; } void menu_popup(struct menu *menu) { if (! menu || ! menu->meth.popup) return; (*menu->meth.popup)(menu->priv); } navit-0.5.0+dfsg.1/navit/menu.h000066400000000000000000000027201264204753600161630ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MENU_H #define NAVIT_MENU_H enum menu_type { menu_type_submenu, menu_type_menu, menu_type_toggle, }; struct container; struct menu; struct callback; struct menu_methods { struct menu_priv *(*add)(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb); void (*set_toggle)(struct menu_priv *menu, int active); int (*get_toggle)(struct menu_priv *menu); void (*popup)(struct menu_priv *menu); }; struct menu { struct menu_priv *priv; struct menu_methods meth; }; /* prototypes */ struct menu *menu_add(struct menu *menu, char *name, enum menu_type type, struct callback *cb); void menu_popup(struct menu *menu); /* end of prototypes */ #endif navit-0.5.0+dfsg.1/navit/messages.c000066400000000000000000000062741264204753600170310ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "messages.h" #include "callback.h" #include "event.h" #include "attr.h" struct messagelist { struct message *messages; /**< All the messages that can currently be shown */ int last_mid; /**< Last Message ID */ int maxage; /**< Maximum age of messages */ int maxnum; /**< Maximum number of messages */ struct callback *msg_cleanup_cb; /**< Callback to clean up the messages */ struct event_timeout *msg_cleanup_to; /**< Idle event to clean up the messages */ }; int message_new(struct messagelist *this_, const char *message) { struct message *msg; msg = g_new0(struct message, 1); msg->text = g_strdup(message); msg->id = ++(this_->last_mid); msg->time = time(NULL); msg->next = this_->messages; this_->messages = msg; return msg->id; } int message_delete(struct messagelist *this_, int mid) { struct message *msg,*last;; msg = this_->messages; last = NULL; while (msg) { if (msg->id == mid) { break; } last = msg; msg = msg->next; } if (msg) { if (last) { last->next = msg->next; } else { this_->messages = msg->next; } g_free(msg->text); g_free(msg); return 1; } else { return 0; } } static void message_cleanup(struct messagelist *this_) { struct message *msg,*next,*prev=NULL; int i; time_t now; msg = this_->messages; now = time(NULL); i = 0; while (msg && (i < this_->maxnum)) { if ((this_->maxage > 0) && (now - msg->time) > this_->maxage) { break; } i++; prev = msg; msg = msg->next; } if (prev) { prev->next = NULL; } else { this_->messages = NULL; } while (msg) { next = msg->next; g_free(msg->text); g_free(msg); msg = next; } } struct messagelist *messagelist_new(struct attr **attrs) { struct messagelist *this = g_new0(struct messagelist, 1); struct attr num_attr,age_attr; if (attr_generic_get_attr(attrs, NULL, attr_message_maxage, &age_attr, NULL)) { this->maxage = age_attr.u.num; } else { this->maxage = 10; } if (attr_generic_get_attr(attrs, NULL, attr_message_maxnum, &num_attr, NULL)) { this->maxnum = num_attr.u.num; } else { this->maxnum = 3; } return this; } void messagelist_init(struct messagelist *this_) { if (!event_system()) return; this_->msg_cleanup_cb = callback_new_1(callback_cast(message_cleanup), this_); this_->msg_cleanup_to = event_add_timeout(1000, 1, this_->msg_cleanup_cb); } struct message *message_get(struct messagelist *this_) { return this_->messages; } navit-0.5.0+dfsg.1/navit/messages.h000066400000000000000000000023061264204753600170260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MESSAGES_H #define NAVIT_MESSAGES_H struct messagelist; struct message { struct message *next; int id; time_t time; char *text; }; /* Prototypes */ struct attr; int message_new(struct messagelist *this_, const char *message); int message_delete(struct messagelist *this_, int mid); struct messagelist *messagelist_new(struct attr **attrs); void messagelist_init(struct messagelist *this_); struct message *message_get(struct messagelist *this_); #endif navit-0.5.0+dfsg.1/navit/navigation.c000066400000000000000000004731611264204753600173640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2015 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "debug.h" #include "profile.h" #include "navigation.h" #include "coord.h" #include "item.h" #include "xmlconfig.h" #include "route.h" #include "transform.h" #include "mapset.h" #include "projection.h" #include "map.h" #include "navit.h" #include "event.h" #include "callback.h" #include "speech.h" #include "vehicleprofile.h" #include "plugin.h" #include "navit_nls.h" #include "util.h" #include "linguistics.h" /* #define DEBUG */ static int roundabout_extra_length=50; /* TODO: find out if this is being used elsewhere and, if so, move this definition somewhere more generic */ static int invalid_angle = 361; /** Minimum absolute delta for a turn. * Maneuvers whose absolute delta is less than this will be considered straight */ static int min_turn_limit = 25; /* FIXME: revisit these limits. IMHO (mvglasow): * * 0 degrees = perfect straight road * 90 degrees = perfect turn * 180 degrees = perfect U turn * * Then, by interpolation: * 45 degrees = perfect "light turn" * 135 degrees = perfect "sharp turn" * * This also agrees with the angles depicted in the maneuver icons. * * Thresholds should be roughly halfway between them. * 25 degrees for min_turn_limit is probably OK (would be 22.5 by the above definition), * but maybe the rest should be somewhat closer to 67.5-117.5-157.5 instead of 45-105-165. * * robotaxi: * suggested limits derived from 'simple turn rules' in bugfix/enhancement #1095: * 25-45-110-165. * taken over from here: 25 (straight limit) and 165 (u-turn-limit used for very strong turn) */ /** Minimum absolute delta for a turn of "normal" strength (which is always just announced as "turn left/right" even when strength is required). * Maneuvers whose absolute delta is less than this will be announced as "turn easily left/right" when strength is required. */ static int turn_2_limit = 45; /** Minimum absolute delta for a sharp turn. * Maneuvers whose absolute delta is equal to or greater than this will be announced as "turn sharply left/right" when strength is required. */ static int sharp_turn_limit = 110; /** Minimum absolute delta for a U turn. * Maneuvers whose absolute delta is less than this (but at least {@code min_turn_limit}) will always be announced as turns. * Note that, depending on other conditions, even maneuvers whose delta exceeds the threshold may still be announced as (sharp) turns. */ static int u_turn_limit = 165; /** Enum that defines the different states in announcing a turn. * These states are dependent on the current distance to the turn; * the distances are configured in navit.xml for every type of highway. */ enum announcement_level { level_connect = -2, level_error = -1, level_now = 0, level_meters = 1, level_soon = 2, level_follow = 3 }; enum gender {unknown, masculine, feminine, neuter}; struct suffix { char *fullname; char *abbrev; int gender; } suffixes[]= { /* DE */ {"weg", NULL, masculine}, /* {"platz", "pl.", masculine}, collides with Lithuanian "plentas" (which is more frequent) */ {"platz", NULL, masculine}, {"ring", NULL, masculine}, {"bogen", NULL, masculine}, {"allee", NULL, feminine}, {"gasse", NULL, feminine}, {"straße", "str.", feminine}, /* EN */ {"street", NULL, masculine}, {"drive", NULL, masculine}, /* FR */ {"boulevard", NULL, masculine}, {"chemin", NULL, neuter}, {"rue", NULL, feminine}, /* LT, as per http://wiki.openstreetmap.org/wiki/WikiProject_Lithuania */ {"gatvė", "g.", feminine}, {"plentas", "pl.", masculine}, {"prospektas", "pr.", masculine}, {"alėja", "al.", feminine}, {"skersgatvis", "skg.", masculine}, {"aikštė", "a.", feminine}, /* NL */ {"straat", NULL, neuter}, /* {"weg", NULL, neuter}, doubles-up with German */ {"baan", NULL, neuter}, {"laan", NULL, neuter}, {"wegel", NULL, neuter}, }; enum nav_status_int { status_none = 0, status_busy = 1, status_has_ritem = 2, status_has_sitem = 4 }; struct navigation { NAVIT_OBJECT struct route *route; struct map *map; struct item_hash *hash; struct vehicleprofile *vehicleprofile; struct navigation_itm *first; struct navigation_itm *last; struct navigation_command *cmd_first; struct navigation_command *cmd_last; struct callback_list *callback_speech; struct callback_list *callback; struct navit *navit; struct speech *speech; int level_last; struct item item_last; int turn_around; int turn_around_limit; int distance_turn; struct callback *route_cb; int announce[route_item_last-route_item_first+1][3]; int tell_street_name; int delay; int curr_delay; int turn_around_count; int flags; struct map_rect *route_mr; /**< Map rect on the route map, used for maneuver generation */ enum nav_status_int status_int; /**< Internal status information used during maneuver generation */ struct callback *idle_cb; /**< Idle callback to process the route map */ struct event_idle *idle_ev; /**< The pointer to the idle event */ int nav_status; /**< Status of the navigation engine */ }; /** @brief Set of simplified distance values that are easy to be pronounced. * Used for the 'vocabulary_distances' configuration. */ int distances[]={1,2,3,4,5,10,25,50,75,100,150,200,250,300,400,500,750,-1}; /* Allowed values for navigation_maneuver.merge_or_exit * The numeric values are chosen in such a way that they can be interpreted as flags: * 1=merge, 2=exit, 4=interchange, 8=right, 16=left * Identifiers were chosen over flags to enforce certain rules * (merge/exit/interchange and left/right are mutually exclusive, left/right requires merge or exit). */ /** Not merging into or exiting from a motorway_like road */ #define mex_none 0 /** Merging into a motorway-like road, direction undefined. * This value is not intended to be set directly but can be used for * comparisons, e.g. {@code merge_or_exit & mex_merge}. */ #define mex_merge 1 /** Exiting from a motorway-like road, direction undefined. * This should only be used for ramps leading to a non-motorway road. * For interchanges, use {@code mex_interchange} instead. * This value is not intended to be set directly but can be used for * comparisons, e.g. {@code merge_or_exit & mex_exit}. */ #define mex_exit 2 /** Motorway-like road splits in two. * This should be used for all cases in which ramps lead to another motorway-like road. */ #define mex_interchange 4 /** Merging into a motorway-like road to the right (coming from the left) */ #define mex_merge_right 9 /** Exiting from a motorway-like road to the right. * See {@code mex_exit} for usage. */ #define mex_exit_right 10 /** Merging into a motorway-like road to the left (coming from the right) */ #define mex_merge_left 17 /** Exiting from a motorway-like road to the left. * See {@code mex_exit} for usage. */ #define mex_exit_left 18 /** * @brief Holds information about a navigation maneuver. * * This structure is populated when a navigation maneuver is first analyzed. Its members contain all information * needed to decide whether or not to announce the maneuver, what type of maneuver it is and the information that * was used to determine the former two. */ struct navigation_maneuver { enum item_type type; /**< The type of maneuver to perform. Any {@code nav_*} item is permitted here, with one exception: merge or exit maneuvers are indicated by the {@code merge_or_exit} member. The {@code item_type} for such maneuvers should be a turn instruction in cases where the maneuver is ambiguous, or {@code nav_none} for cases in which we would expect the driver to perform this maneuver even without being instructed to do so. **/ int delta; /**< Bearing difference (the angle the driver has to steer) for the maneuver */ int merge_or_exit; /**< Whether we are merging into or exiting from a motorway_like road or we are at an interchange */ int is_complex_t_junction; /**< Whether we are coming from the "stem" of a T junction whose "bar" is a dual-carriageway road and crossing the opposite lane of the "bar" first (i.e. turning left in countries that drive on the right, or turning right in countries that drive on the left). For these maneuvers {@code num_options} is 1 (which means we normally wouldn't announce the maneuver) but drivers would expect an announcement in such cases. */ int num_options; /**< Number of permitted candidate ways, i.e. ways which we may enter (based on access flags of the way but without considering turn restrictions). Permitted candidate ways include the route. */ int num_new_motorways; /**< Number of permitted candidate ways that are motorway-like. Numbers greater then one should be interpreted as "more than one", not as a precise number. */ int num_other_ways; /**< Number of permitted candidate ways that are neither ramps nor motorway-like */ int old_cat; /**< Maneuver category of the way leading to the maneuver */ int new_cat; /**< Maneuver category of the selected way after the maneuver */ int max_cat; /**< Highest maneuver category of any permitted candidate way other than the route */ int num_similar_ways; /**< Number of candidate ways (including the route) that have a {@code maneuver_category()} similar to {@code old_cat}. See {@code maneuver_required2()} for definition of "similar". */ int left; /**< Minimum bearing delta of any candidate way left of the route, -180 for none */ int right; /**< Minimum bearing delta of any candidate way right of the route, 180 for none */ int is_unambiguous; /**< Whether the maneuver is unambiguous. A maneuver is unambiguous if, despite multiple candidate way being available, we can reasonable expect the driver to continue on the route without being told to do so. This is typically the case when the route stays on the main road and goes straight, while all other candidate ways are minor roads and involve a significant turn. */ int is_same_street; /**< Whether the street keeps its name after the maneuver. */ }; /** * @brief Holds information about a command for a navigation maneuver. * * An instance of this structure is generated for each navigation maneuver that is to be announced. */ struct navigation_command { struct navigation_itm *itm; /**< The navigation item following the maneuver */ struct navigation_command *next; /**< next command in the list */ struct navigation_command *prev; /**< previous command in the list */ int delta; /**< bearing change at maneuver */ int roundabout_delta; /**< if we are leaving a roundabout, effective bearing change (between entry and exit) with some corrections applied */ int length; /**< if the maneuver is a roundabout, distance between entry and exit (plus penalty), else 0 */ struct navigation_maneuver *maneuver; /**< Details on the maneuver to perform */ }; /* * @brief Holds a way that one could possibly drive from a navigation item * */ struct navigation_way { struct navigation_way *next; /**< Pointer to a linked-list of all navigation_ways from this navigation item */ short dir; /**< The direction -1 or 1 of the way */ short angle2; /**< The bearing at the start or the way (0 = north, 90 =east etc.) */ int flags; /**< The flags of the way */ struct item item; /**< The item of the way */ char *name; /**< The street name ({@code street_name} attribute) */ char *name_systematic; /**< The road number ({@code street_name_systematic} attribute, OSM: {@code ref}) */ char *exit_ref; /**< Exit_ref if found on the first node of the way*/ char *exit_label; /**< Exit_label if found on the first node of the way*/ struct street_destination *destination; /**< The destination this way leads to (OSM: {@code destination}) */ }; struct navigation_itm { struct navigation_way way; int angle_end; /**< The bearing at the end of {@code way} */ struct coord start,end; int time; int length; int speed; int dest_time; int dest_length; int told; /**< Indicates if this item's announcement has been told earlier and should not be told again*/ int streetname_told; /**< Indicates if this item's streetname has been told in speech navigation*/ int dest_count; struct navigation_itm *next; struct navigation_itm *prev; }; /** * @brief A linked list containing the destination of the road * * Holds the destination info from the road, that is the place * you drive to if you keep following the road as found on * traffic sign's (ex. Paris, Senlis ...) */ struct street_destination { struct street_destination *next; char *destination; int rank; }; static void navigation_flush(struct navigation *this_); /** * @brief Calculates the delta between two angles * * The return value is to be interpreted as follows: *

    *
  • -179..-1: {@code angle2} is left of {@code angle1}
  • *
  • 0: Both angles are identical
  • *
  • 1..179: {@code angle2} is right of {@code angle1}
  • *
  • 180: {@code angle1} is opposite of {@code angle2}
  • *
* @param angle1 The first angle * @param angle2 The second angle * @return The difference between the angles, see description */ static int angle_delta(int angle1, int angle2) { int delta=angle2-angle1; if (delta <= -180) delta+=360; if (delta > 180) delta-=360; return delta; } static int angle_median(int angle1, int angle2) { int delta=angle_delta(angle1, angle2); int ret=angle1+delta/2; if (ret < 0) ret+=360; if (ret > 360) ret-=360; return ret; } static int angle_opposite(int angle) { return ((angle+180)%360); } /** * @brief Checks if two navigation items are on the same street * * This function checks if two navigation items are on the same street. It returns * true if either their name or their "systematic name" (e.g. "A6" or "B256") are the * same. * * @param old_name The name of the first item to be checked * @param old_name_systematic The systematic name of the first item to be checked * @param new_name The name of the second item to be checked * @param new_name_systematic The systematic name of the second item to be checked * @return True if both old and new are on the same street */ static int is_same_street2(char *old_name, char *old_name_systematic, char *new_name, char *new_name_systematic) { if (old_name && new_name && !strcmp(old_name, new_name)) { dbg(lvl_debug,"is_same_street: '%s' '%s' vs '%s' '%s' yes (1.)\n", old_name_systematic, new_name_systematic, old_name, new_name); return 1; } if (old_name_systematic && new_name_systematic && !strcmp(old_name_systematic, new_name_systematic)) { dbg(lvl_debug,"is_same_street: '%s' '%s' vs '%s' '%s' yes (2.)\n", old_name_systematic, new_name_systematic, old_name, new_name); return 1; } dbg(lvl_debug,"is_same_street: '%s' '%s' vs '%s' '%s' no\n", old_name_systematic, new_name_systematic, old_name, new_name); return 0; } /** * @brief Checks if two ways are identical * * This function checks if two {@code navigation_way}s are likely to represent the same way on the ground. * It does this by comparing the {@code name}, {@code name_systematic}, {@code angle2} and {@code item.type} * members of both ways and returning {@code true} if all of them match. * * Names are compared by calling {@code is_same_street()}. * * ID attributes (such as OSM IDs) are not used for comparison, which allows the function to handle even * overlapping maps for the same area created from different versions of OSM data, in which IDs may have * changed as a result of ways being merged or split. As long as the above attributes match, the ways will * still be considered equal. * * Note that way geometry (other than {@code angle2}) is not compared. If necessary, the caller needs to * make geometry-related comparisons separately. */ static int is_same_way(struct navigation_way * w1, struct navigation_way * w2) { if (!is_same_street2(w1->name, w1->name_systematic, w2->name, w2->name_systematic)) return 0; if ((w1->angle2 == w2->angle2) && (w1->item.type == w2->item.type)) return 1; else return 0; } /** * @brief Frees a list as constructed with split_string_to_list() * * @param list the list to be freed */ static void free_list(struct street_destination *list) { if (list){ struct street_destination *clist; while (list){ clist = list->next; g_free(list->destination); g_free(list); list = clist; } list = NULL; } } /** * @brief Splits a string into a list, and sets their initial rank to 0 * * The separator to split on can be any character. Preceding whitespace * characters will be removed. * * @param way a navigation_way holding the list to be filled up * @param raw_string a string to split * @param sep a char to be used as separator to split the raw_string * @return the number of entries in the list */ static int split_string_to_list(struct navigation_way *way, char* raw_string, char sep) { struct street_destination *new_street_destination = NULL; struct street_destination *next_street_destination_remember = NULL; char *pos1 = raw_string; char *pos2; int count = 0; free_list(way->destination); /*in case this is a retry with a different separator.*/ dbg(lvl_debug,"raw_string=%s split with %c\n",raw_string, sep); if (strlen(raw_string)>0) { count = 1; while (pos1) { new_street_destination = g_new(struct street_destination, 1); new_street_destination->next = next_street_destination_remember; next_street_destination_remember = new_street_destination ; if ((pos2 = strrchr(pos1, sep)) != NULL) { *pos2 = '\0' ; while (isspace(pos2[1])) pos2++; new_street_destination->destination = g_strdup(pos2+1); new_street_destination->rank=0; dbg(lvl_debug,"splitted_off_string=%s\n",new_street_destination->destination); count++; } else { while (isspace(pos1[0])) pos1++; new_street_destination->destination = g_strdup(pos1); new_street_destination->rank=0; pos1 = NULL; dbg(lvl_debug,"head_of_string=%s\n",new_street_destination->destination); } way->destination = next_street_destination_remember; } } return count; } /** * @brief Returns the first destination with a rank higher than zero. * * If all items in the list have a zero rank, the first one will be returned. */ static struct street_destination * get_bestranked(struct street_destination *street_destination) { struct street_destination *selected_street_destination; selected_street_destination = street_destination; while (selected_street_destination) { if (selected_street_destination->rank > 0) return selected_street_destination; selected_street_destination = selected_street_destination->next; } return street_destination; } /** * @brief Assigns a high rank to a matching destination in the next * command having destination info, and reset existing ranks to zero * * @param street destination to be given a high rank * @param command * @return 1 if successful, zero otherwise */ static int set_highrank(struct street_destination *street_destination, struct navigation_command *command) { struct street_destination *future_street_destination = NULL; struct navigation_command *next_command; char* destination_string; int success = 0; destination_string = street_destination->destination; if (command->next) { next_command=command->next; while (next_command) { if (next_command->itm->way.destination) break; if (!next_command->next) break; next_command=next_command->next; } if (next_command->itm->way.destination) future_street_destination = next_command->itm->way.destination; else future_street_destination = NULL; } while (future_street_destination) { if ((strcmp(destination_string,future_street_destination->destination)==0)) { future_street_destination->rank=99; success =1; } else future_street_destination->rank=0; future_street_destination=future_street_destination->next; } return success; } /** @brief Selects the destination-names for the next announcement from the * destination-names that are registered in the following command items. * * The aim of this function is to find the destination-name entry that has the most hits in the following * command items so that the destination name has a relevance over several announcements. If there is no 'winner' * the entry is selected that is at top of the destination. */ static char* select_announced_destinations(struct navigation_command *current_command) { struct street_destination *current_destination = NULL; /* the list pointer of the destination_names of the current command. */ struct street_destination *search_destination = NULL; /* the list pointer of the destination_names of the respective search_command. */ struct navigation_command *search_command = NULL; #define MAX_LOOPS 10 /* limits the number of next command items to investigate over */ #define MAX_DESTINATIONS 10 /* limits the number of destination entries to investigate */ int destination_count[MAX_DESTINATIONS]; /* contains the hits of identical destinations over all */ /* investigated command items - a 'high score' of destination names */ int destination_index = 0; int search_command_counter = 0; int i, max_hits=0, max_hit_index; /* search over every following command for seeking identical destination_names */ if (current_command->itm->way.destination) { /* can we investigate over the following commands? */ if (current_command->next) { /* loop over every destination of the current command, as far as there are not more than MAX_DESTINATIONS entries. */ destination_index = 0; /* start with the first destination */ current_destination = current_command->itm->way.destination; while (current_destination && (destination_index < MAX_DESTINATIONS)) { /* initialize the search command */ search_command = current_command->next; search_command_counter = 0; destination_count[destination_index]=0; while (search_command && (search_command_counter < MAX_LOOPS)) { if (search_command->itm && search_command->itm->way.destination) { /* has the search command any destinations ? */ search_destination = search_command->itm->way.destination; while (search_destination) { /* Search this name in the destination list of the current command. */ if (0 == strcmp(current_destination->destination, search_destination->destination)) { /* enter the destination_name in the investigation list*/ destination_count[destination_index]++; search_destination = NULL; /* break condition */ } else search_destination = search_destination->next; } } search_command_counter++; search_command = search_command->next; } destination_index++; current_destination = current_destination->next; } /* search for the best candidate */ max_hits = 0; max_hit_index = 0; for (i = 0; i < destination_index; i++) { if (destination_count[i] > max_hits) { max_hits = destination_count[i]; max_hit_index = i; } } /* jump to the corresponding destination_name */ current_destination = current_command->itm->way.destination; for (i = 0; i < max_hit_index; i++) { current_destination = current_destination->next; } dbg(lvl_debug,"%s, max hits =%i\n",current_destination->destination,max_hits); set_highrank(current_destination,current_command); } } /* return the best candidate, if there is any.*/ if (max_hits) return g_strdup(current_destination->destination); return g_strdup(current_destination ? get_bestranked(current_destination)->destination:NULL); } /** * @brief Converts navigation status to human-readable text. * * @param The status. This must be one of the values for {@code enum nav_status}. * * @return A string which corresponds to the constant value. The caller is responsible for calling * {@code g_free()} when the result is no longer needed. */ char *nav_status_to_text(int status) { char *ret; switch (status) { case status_invalid: ret = g_strdup("status_invalid"); break; case status_no_route: ret = g_strdup("status_no_route"); break; case status_no_destination: ret = g_strdup("status_no_destination"); break; case status_position_wait: ret = g_strdup("status_position_wait"); break; case status_calculating: ret = g_strdup("status_calculating"); break; case status_recalculating: ret = g_strdup("status_recalculating"); break; case status_routing: ret = g_strdup("status_routing"); break; default: ret = g_strdup_printf("status_unknown_%d)", status); } return ret; } int navigation_get_attr(struct navigation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { struct map_rect *mr; struct item *item; dbg(lvl_debug,"enter %s\n", attr_to_name(type)); switch (type) { case attr_map: attr->u.map=this_->map; break; case attr_item_type: case attr_length: case attr_navigation_speech: case attr_street_name: case attr_street_name_systematic: case attr_street_destination: mr=map_rect_new(this_->map, NULL); while ((item=map_rect_get_item(mr))) { if (item->type != type_nav_none && item->type != type_nav_position) { if (type == attr_item_type) attr->u.item_type=item->type; else { if (!item_attr_get(item, type, attr)) item=NULL; } break; } } map_rect_destroy(mr); if (!item) return 0; break; case attr_turn_around_count: attr->u.num=this_->turn_around_count; break; case attr_nav_status: attr->u.num=this_->nav_status; break; default: return navit_object_get_attr((struct navit_object *)this_, type, attr, iter); } attr->type=type; return 1; } static void navigation_set_turnaround(struct navigation *this_, int val) { if (this_->turn_around_count != val) { struct attr attr=ATTR_INT(turn_around_count, val); this_->turn_around_count=val; navit_object_callbacks((struct navit_object *)this_, &attr); } } int navigation_set_attr(struct navigation *this_, struct attr *attr) { switch (attr->type) { case attr_speech: this_->speech=attr->u.speech; break; case attr_nav_status: this_->nav_status = attr->u.num; break; default: break; } return navit_object_set_attr((struct navit_object *)this_, attr); } struct navigation * navigation_new(struct attr *parent, struct attr **attrs) { int i,j; struct attr * attr; struct navigation *ret=(struct navigation *)navit_object_new(attrs, &navigation_func, sizeof(struct navigation)); ret->hash=item_hash_new(); ret->callback=callback_list_new(); ret->callback_speech=callback_list_new(); ret->level_last=4; ret->distance_turn=50; ret->turn_around_limit=3; ret->navit=parent->u.navit; ret->tell_street_name=1; ret->route_mr = NULL; for (j = 0 ; j <= route_item_last-route_item_first ; j++) { for (i = 0 ; i < 3 ; i++) { ret->announce[j][i]=-1; } } if ((attr=attr_search(attrs, NULL, attr_tell_street_name))) { ret->tell_street_name = attr->u.num; } if ((attr=attr_search(attrs, NULL, attr_delay))) { ret->delay = attr->u.num; } if ((attr=attr_search(attrs, NULL, attr_flags))) { ret->flags = attr->u.num; } return ret; } int navigation_set_announce(struct navigation *this_, enum item_type type, int *level) { int i; if (type < route_item_first || type > route_item_last) { dbg(lvl_debug,"street type %d out of range [%d,%d]", type, route_item_first, route_item_last); return 0; } for (i = 0 ; i < 3 ; i++) this_->announce[type-route_item_first][i]=level[i]; return 1; } static enum announcement_level navigation_get_announce_level(struct navigation *this_, enum item_type type, int dist) { enum announcement_level level; if (type < route_item_first || type > route_item_last) { dbg(lvl_error," item outside routable range\n"); return level_error; } for (level = level_now ; level < level_follow ; level++) { if (dist <= this_->announce[type-route_item_first][level]) return level; } return level; } static int is_way_allowed(struct navigation *nav, struct navigation_way *way, int mode); static enum announcement_level navigation_get_announce_level_cmd(struct navigation *this_, struct navigation_itm *itm, struct navigation_command *cmd, int distance) { enum announcement_level level2,level=navigation_get_announce_level(this_, itm->way.item.type, distance); if (this_->cmd_first->itm->prev) { level2=navigation_get_announce_level(this_, cmd->itm->prev->way.item.type, distance); if (level2 > level) { level = level2; } } return level; } /* 0=N,90=E */ /** * @brief Gets the bearing from one point to another * * @param c1 The first coordinate * @param c2 The second coordinate * @param dir The direction: if it is -1, the bearing from c2 to c1 is returned, else the bearing from c1 to c2 * * @return The bearing in degrees, {@code 0 <= result < 360}. */ static int road_angle(struct coord *c1, struct coord *c2, int dir) { int ret=transform_get_angle_delta(c1, c2, dir); dbg(lvl_debug, "road_angle(0x%x,0x%x - 0x%x,0x%x)=%d\n", c1->x, c1->y, c2->x, c2->y, ret); return ret; } static const char *get_count_str(int n) { switch (n) { case 0: /* TRANSLATORS: the following counts refer to streets */ return _("zeroth"); /* Not sure if this exists, neither if it will ever be needed */ case 1: return _("first"); case 2: return _("second"); case 3: return _("third"); case 4: return _("fourth"); case 5: return _("fifth"); case 6: return _("sixth"); default: return NULL; } } static const char *get_exit_count_str(int n) { switch (n) { case 0: /* TRANSLATORS: the following counts refer to roundabout exits */ return _("zeroth exit"); /* Not sure if this exists, neither if it will ever be needed */ case 1: return _("first exit"); case 2: return _("second exit"); case 3: return _("third exit"); case 4: return _("fourth exit"); case 5: return _("fifth exit"); case 6: return _("sixth exit"); default: return NULL; } } static int round_distance(int dist) { if (dist < 100) { dist=(dist+5)/10; return dist*10; } if (dist < 250) { dist=(dist+13)/25; return dist*25; } if (dist < 500) { dist=(dist+25)/50; return dist*50; } if (dist < 1000) { dist=(dist+50)/100; return dist*100; } if (dist < 5000) { dist=(dist+50)/100; return dist*100; } if (dist < 100000) { dist=(dist+500)/1000; return dist*1000; } dist=(dist+5000)/10000; return dist*10000; } /** @brief Returns the last element of the simplified numbers containing a distance value. * @return value with the highest distance. */ static int distance_set_last() { static int i=0; if (i == 0) { while (distances[i] > 0) i++; } return distances[i-1]; } /** @brief Restricts the distance value to a simple set of pronounceable numbers. * @param dist The distance to be processed * @return distance Simplified distance value */ static int round_distance_reduced( int dist ) { int factor = 1; if (dist > distance_set_last()) { dist=(dist+500)/1000; factor = 1000; } int i=0,d=0,m=0; while (distances[i] > 0) { if (!i || abs(distances[i]-dist) <= d) { d=abs(distances[i]-dist); m=i; } if (distances[i] > dist) break; i++; } dbg(lvl_debug,"converted %d to %d with factor %d\n",dist,distances[m],factor); return distances[m] * factor; } /** @brief Generates the distance string. * Considers the configuration of 'imperial' units and 'vocabulary_distances'. * 'imperial' if set distinguishes the distance statement between miles and feet. Maximum distance in feet is 500. * 'vocabulary_distances' if set constrains the distance values to a set of simple pronounceable numbers. * * @param nav The navigation object. * @param dist Distance in meters. * @param type The type of announcement precision. * @param is_length 1 for length statement, 0 for distance statement. * @return String with length/distance statement. */ static char * get_distance_str(struct navigation *nav, int dist_meters, enum attr_type type, int is_length) { int imperial=0,vocabulary=1; /* default configuration */ /* Get configuration */ struct attr attr; if (navit_get_attr(nav->navit, attr_imperial, &attr, NULL)) imperial=attr.u.num; if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_distances, &attr, NULL)) vocabulary=attr.u.num; /****************************/ if (imperial) { int dist_feet = dist_meters * FEET_PER_METER; if (vocabulary > 0) { /* normal statement */ if (type != attr_navigation_long_exact) dist_feet = round_distance(dist_feet); } else { /* statement with reduced vocabularies */ dist_feet = round_distance_reduced(dist_feet); } /* check for statement in feet */ if (dist_feet <= 500) { if (is_length) return g_strdup_printf(_("%d feet"), dist_feet); else return g_strdup_printf(_("in %d feet"), dist_feet); } int dist_miles = (double) dist_meters / (double)METERS_PER_MILE + 0.5; if (vocabulary == 0) { /* statement with reduced vocabularies */ dist_miles = round_distance_reduced(dist_miles); } if ((dist_meters < METERS_PER_MILE) && (vocabulary > 0)) { /* values smaller than one need extra treatment for one decimal place. For reduced vocabulary it shall remain 'one'. */ int rem = (((double)dist_meters / (double)METERS_PER_MILE) + 0.05) * 10.0; dist_miles= 0; if (is_length) return g_strdup_printf(_("%d.%d miles"), dist_miles, rem); else return g_strdup_printf(_("in %d.%d miles"), dist_miles, rem); } if (is_length) return g_strdup_printf(navit_nls_ngettext("one mile","%d miles", dist_miles), dist_miles); else return g_strdup_printf(navit_nls_ngettext("in one mile","in %d miles", dist_miles), dist_miles); } else { if (vocabulary > 0) { /* normal statement */ if (type != attr_navigation_long_exact) dist_meters = round_distance(dist_meters); } else { /* statement with reduced vocabularies */ dist_meters = round_distance_reduced(dist_meters); } if (dist_meters < 1000) { if (is_length) return g_strdup_printf(_("%d meters"), dist_meters); else return g_strdup_printf(_("in %d meters"), dist_meters); } if (dist_meters < 5000) { /* Distances below 5 km shall be announced with one decimal place. */ int rem=(dist_meters/100)%10; if (rem) { if (is_length) return g_strdup_printf(_("%d.%d kilometers"), dist_meters/1000, rem); else return g_strdup_printf(_("in %d.%d kilometers"), dist_meters/1000, rem); } } if (is_length) return g_strdup_printf(navit_nls_ngettext("one kilometer","%d kilometers", dist_meters/1000), dist_meters/1000); else return g_strdup_printf(navit_nls_ngettext("in one kilometer","in %d kilometers", dist_meters/1000), dist_meters/1000); } } /** * @brief Initializes a navigation_way * * This function analyzes the underlying map item and sets the entry bearing, names and flags for the way. * * Note that entry bearing is expressed as bearing towards the opposite end of the item. * * Note that this function is not suitable for ways on the route (created in {@code navigation_itm_new}) * as it may return incorrect coordinates for these ways. * * @param w The way to initialize. The {@code item}, {@code id_hi}, {@code id_lo} and {@code dir} * members of this struct must be set prior to calling this function. */ static void navigation_way_init(struct navigation_way *w) { struct coord cbuf[2]; struct item *realitem; struct coord c; struct map_rect *mr; struct attr attr; w->angle2 = invalid_angle; mr = map_rect_new(w->item.map, NULL); if (!mr) return; realitem = map_rect_get_item_byid(mr, w->item.id_hi, w->item.id_lo); if (!realitem) { dbg(lvl_warning,"Item from segment not found on map!\n"); map_rect_destroy(mr); return; } if (realitem->type < type_line || realitem->type >= type_area) { map_rect_destroy(mr); return; } if (item_attr_get(realitem, attr_flags, &attr)) w->flags=attr.u.num; else w->flags=0; if (item_attr_get(realitem, attr_street_name, &attr)) w->name=map_convert_string(realitem->map,attr.u.str); else w->name=NULL; if (item_attr_get(realitem, attr_street_name_systematic, &attr)) w->name_systematic=map_convert_string(realitem->map,attr.u.str); else w->name_systematic=NULL; if (w->dir < 0) { if (item_coord_get(realitem, cbuf, 2) != 2) { dbg(lvl_warning,"Using calculate_angle() with a less-than-two-coords-item?\n"); map_rect_destroy(mr); return; } while (item_coord_get(realitem, &c, 1)) { cbuf[0] = cbuf[1]; cbuf[1] = c; } } else { if (item_coord_get(realitem, cbuf, 2) != 2) { dbg(lvl_warning,"Using calculate_angle() with a less-than-two-coords-item?\n"); map_rect_destroy(mr); return; } c = cbuf[0]; cbuf[0] = cbuf[1]; cbuf[1] = c; } map_rect_destroy(mr); w->angle2=road_angle(&cbuf[1],&cbuf[0],0); } /** * @brief Returns the maximum delta between a reference bearing and any segment of a given way, up to a given distance from its start * * The return value is the maximum delta (in terms of absolute value), but the sign is preserved. If the maximum delta is encountered * more than once but with different signs, {@code dir} controls which of the two values is returned: *
    *
  • +1: Return the first maximum encountered when following the direction of the route
  • *
  • -1: Return the first maximum encountered when going against the direction of the route
  • *
* * {@code invalid_angle} will be returned if one of the following errors occurs: *
    *
  • The item is not found on the map
  • *
  • The item is not of the correct type
  • *
  • The item has fewer than 2 points
  • *
  • {@code dist} is zero
  • *
* * If {@code dist} exceeds the length of the way, the entire way is examined. * * @param pro The projection used by the map * @param w The way to examine * @param angle The reference bearing * @param dist The distance from the start of the way at which to determine bearing * @param dir Controls how to handle when the same delta is encountered multiple times but with different signs, * permissible values are either -1 or +1 * * @return The delta, {@code -180 < delta <= 180}, or {@code invalid_angle} if an error occurred. */ static int navigation_way_get_max_delta(struct navigation_way *w, enum projection pro, int angle, double dist, int dir) { double dist_left = dist; /* distance from last examined point */ int ret = invalid_angle; int tmp_delta; int eff_dir = dir * w->dir; /* effective direction: +1 to examine section from start of way, -1 from end of way */ struct coord cbuf[2]; struct item *realitem; struct coord c; struct map_rect *mr; mr = map_rect_new(w->item.map, NULL); if (!mr) return ret; realitem = map_rect_get_item_byid(mr, w->item.id_hi, w->item.id_lo); if (!realitem) { dbg(lvl_warning,"Item from segment not found on map!\n"); map_rect_destroy(mr); return ret; } if (realitem->type < type_line || realitem->type >= type_area) { map_rect_destroy(mr); return ret; } if (item_coord_get(realitem, &cbuf[1], 1) != 1) { dbg(lvl_warning,"item has no coords\n"); map_rect_destroy(mr); return ret; } if (eff_dir < 0) { /* we're going against the direction of the item: * measure its total length and set dist_left to difference of total length and distance */ dist_left = 0; while (item_coord_get(realitem, &c, 1)) { cbuf[0] = cbuf[1]; cbuf[1] = c; dist_left += transform_distance(pro, &cbuf[0], &cbuf[1]); } /* if dist is less that the distance of the way, make dist_left the distance from the other end * else set it to zero (so we'll examine the whole way) */ if (dist_left > dist) dist_left -= dist; else dist_left = 0; item_coord_rewind(realitem); if (item_coord_get(realitem, &cbuf[1], 1) != 1) { dbg(lvl_warning,"item has no more coords after rewind\n"); map_rect_destroy(mr); return ret; } } while (item_coord_get(realitem, &c, 1)) { if ((eff_dir > 0) && (dist_left <= 0)) break; cbuf[0] = cbuf[1]; cbuf[1] = c; dist_left -= transform_distance(pro, &cbuf[0], &cbuf[1]); if ((eff_dir < 0) && (dist_left > 0)) continue; tmp_delta = angle_delta(angle, road_angle(&cbuf[0], &cbuf[1], w->dir)); if ((ret == invalid_angle) || (abs(ret) < abs(tmp_delta)) || ((abs(ret) == abs(tmp_delta)) && (eff_dir < 0))) ret = tmp_delta; } map_rect_destroy(mr); return ret; } /** * @brief Clears the ways one can drive from itm * * @param itm The item that should have its ways cleared */ static void navigation_itm_ways_clear(struct navigation_itm *itm) { struct navigation_way *c,*n; c = itm->way.next; while (c) { n = c->next; map_convert_free(c->name); map_convert_free(c->name_systematic); g_free(c); c = n; } itm->way.next = NULL; } /** * @brief Updates the ways one can drive from itm * * This updates the list of possible ways to drive to from itm. The item "itm" is on * and the next navigation item are excluded. * * @param itm The item that should be updated * @param graph_map The route graph's map that these items are on */ static void navigation_itm_ways_update(struct navigation_itm *itm, struct map *graph_map) { struct map_selection coord_sel; struct map_rect *g_rect; /* Contains a map rectangle from the route graph's map */ struct item *i,*sitem; struct attr sitem_attr,direction_attr; struct navigation_way *w, *l, *h; dbg(lvl_debug, "entering for item: %s %s %s\n", item_to_name(itm->way.item.type), itm->way.name_systematic, itm->way.name); navigation_itm_ways_clear(itm); /* These values cause the code in route.c to get us only the route graph point and connected segments */ coord_sel.next = NULL; coord_sel.u.c_rect.lu = itm->start; coord_sel.u.c_rect.rl = itm->start; /* the selection's order is ignored */ g_rect = map_rect_new(graph_map, &coord_sel); i = map_rect_get_item(g_rect); if (!i || i->type != type_rg_point) { /* probably offroad? */ map_rect_destroy(g_rect); return ; } w = NULL; while (1) { i = map_rect_get_item(g_rect); if (!i) { break; } if (i->type != type_rg_segment) { continue; } if (!item_attr_get(i,attr_street_item,&sitem_attr)) { dbg(lvl_warning, "Got no street item for route graph item in entering_straight()\n"); continue; } if (!item_attr_get(i,attr_direction,&direction_attr)) { continue; } sitem = sitem_attr.u.item; if (sitem->type == type_street_turn_restriction_no || sitem->type == type_street_turn_restriction_only) continue; if (item_is_equal(itm->way.item,*sitem) || ((itm->prev) && item_is_equal(itm->prev->way.item,*sitem))) { continue; } l = w; w = g_new0(struct navigation_way, 1); w->dir = direction_attr.u.num; w->item = *sitem; w->next = l; navigation_way_init(w); /* calculate and set w->angle2 */ dbg(lvl_debug, "- retrieved way: %s %s %s\n", item_to_name(w->item.type), w->name_systematic, w->name); /* check if w is already in the list */ h = l; while (h) { if (is_same_way(w, h)) { g_free(w); w = l; dbg(lvl_debug, " - way is already in list, discarding\n"); } h = h->next; } } map_rect_destroy(g_rect); itm->way.next = w; } /** * @brief Destroys navigation items associated with a navigation object. * * This function destroys all or some of the {@code navigation_itm} instances associated with * {@code this_}, starting with the first one. Data structures associated with the items will * also be freed. * * @param this_ The navigation object whose command instances are to be destroyed * @param end The first navigation item to keep. If it is NULL or not found in the list, all items * will be destroyed. */ static void navigation_destroy_itms_cmds(struct navigation *this_, struct navigation_itm *end) { struct navigation_itm *itm; struct navigation_command *cmd; dbg(lvl_info,"enter this_=%p this_->first=%p this_->cmd_first=%p end=%p\n", this_, this_->first, this_->cmd_first, end); if (this_->cmd_first) dbg(lvl_info,"this_->cmd_first->itm=%p\n", this_->cmd_first->itm); while (this_->first && this_->first != end) { itm=this_->first; dbg(lvl_debug,"destroying %p\n", itm); item_hash_remove(this_->hash, &itm->way.item); this_->first=itm->next; if (this_->first) this_->first->prev=NULL; if (this_->cmd_first && this_->cmd_first->itm == itm->next) { cmd=this_->cmd_first; this_->cmd_first=cmd->next; if (cmd->next) { cmd->next->prev = NULL; } if (cmd->maneuver) g_free(cmd->maneuver); g_free(cmd); } map_convert_free(itm->way.name); map_convert_free(itm->way.name_systematic); map_convert_free(itm->way.exit_ref); map_convert_free(itm->way.exit_label); free_list(itm->way.destination); navigation_itm_ways_clear(itm); g_free(itm); } if (! this_->first) this_->last=NULL; if (! this_->first && end) dbg(lvl_error,"end wrong\n"); dbg(lvl_info,"ret this_->first=%p this_->cmd_first=%p\n",this_->first, this_->cmd_first); } static void navigation_itm_update(struct navigation_itm *itm, struct item *ritem) { struct attr length, time, speed; if (! item_attr_get(ritem, attr_length, &length)) { dbg(lvl_error,"no length\n"); return; } if (! item_attr_get(ritem, attr_time, &time)) { dbg(lvl_error,"no time\n"); return; } if (! item_attr_get(ritem, attr_speed, &speed)) { dbg(lvl_error,"no speed\n"); return; } dbg(lvl_debug,"length=%ld time=%ld speed=%ld\n", length.u.num, time.u.num, speed.u.num); itm->length=length.u.num; itm->time=time.u.num; itm->speed=speed.u.num; } /** * @brief Creates and adds a new navigation_itm to a linked list of such * * routeitem has an attr. streetitem, but that is only and id and a map, * allowing to fetch the actual streetitem, that will live under the same name. * * Known issue: * If a way splits in 2, exit_to info ends up on both continuations of the ramp, sometimes * leading to wrong guidance. * The case where a ramp itself splits in 2 is already covered by ignoring exit_to info * in such cases. * * @param this_ the navigation object * @param routeitem the routeitem from which to create a navigation item * @return the new navigation_itm (used nowhere) */ static struct navigation_itm * navigation_itm_new(struct navigation *this_, struct item *routeitem) { struct navigation_itm *ret=g_new0(struct navigation_itm, 1); int i=0; struct item *streetitem; struct map *graph_map = NULL; struct attr street_item,direction,route_attr; struct map_rect *mr; struct attr attr; struct coord c[5]; struct coord exitcoord; if (routeitem) { ret->streetname_told=0; if (! item_attr_get(routeitem, attr_street_item, &street_item)) { dbg(lvl_warning, "no street item\n"); g_free(ret); ret = NULL; return ret; } if (item_attr_get(routeitem, attr_direction, &direction)) ret->way.dir=direction.u.num; else ret->way.dir=0; streetitem=street_item.u.item; ret->way.item=*streetitem; item_hash_insert(this_->hash, streetitem, ret); mr=map_rect_new(streetitem->map, NULL); struct map *tmap = streetitem->map; if (! (streetitem=map_rect_get_item_byid(mr, streetitem->id_hi, streetitem->id_lo))) { g_free(ret); map_rect_destroy(mr); return NULL; } if (item_attr_get(streetitem, attr_flags, &attr)) ret->way.flags=attr.u.num; if (item_attr_get(streetitem, attr_street_name, &attr)) ret->way.name=map_convert_string(streetitem->map,attr.u.str); if (item_attr_get(streetitem, attr_street_name_systematic, &attr)) ret->way.name_systematic=map_convert_string(streetitem->map,attr.u.str); if (ret->way.flags && (ret->way.flags & AF_ONEWAY)) { if (item_attr_get(streetitem, attr_street_destination, &attr)) { char *destination_raw; destination_raw=map_convert_string(streetitem->map,attr.u.str); dbg(lvl_debug,"destination_raw =%s\n",destination_raw); split_string_to_list(&(ret->way),destination_raw, ';'); g_free(destination_raw); } } else { if (ret->way.dir == 1) { if (item_attr_get(streetitem, attr_street_destination_forward, &attr)) { char *destination_raw; destination_raw=map_convert_string(streetitem->map,attr.u.str); dbg(lvl_debug,"destination_raw forward =%s\n",destination_raw); split_string_to_list(&(ret->way),destination_raw, ';'); g_free(destination_raw); } } if (ret->way.dir == -1) { if (item_attr_get(streetitem, attr_street_destination_backward, &attr)) { char *destination_raw; destination_raw=map_convert_string(streetitem->map,attr.u.str); dbg(lvl_debug,"destination_raw backward =%s\n",destination_raw); split_string_to_list(&(ret->way),destination_raw, ';'); g_free(destination_raw); } } } navigation_itm_update(ret, routeitem); while (item_coord_get(routeitem, &c[i], 1)) { dbg(lvl_debug, "coord %d 0x%x 0x%x\n", i, c[i].x ,c[i].y); if (i < 4) i++; else { c[2]=c[3]; c[3]=c[4]; } } i--; if (i>=1) { ret->way.angle2=road_angle(&c[0], &c[1], 0); ret->angle_end=road_angle(&c[i-1], &c[i], 0); } ret->start=c[0]; ret->end=c[i]; if(item_attr_get(routeitem, attr_route, &route_attr)) graph_map = route_get_graph_map(route_attr.u.route); if (graph_map ) { if (this_->last) ret->prev=this_->last; navigation_itm_ways_update(ret,graph_map); } /* If we have a ramp, check the map for higway_exit info, * but only on the first node of the ramp. * We are doing the same for motorway-like roads because some * interchanges use motorway types for the links between two * motorways. * Ramps with nodes in reverse order and oneway=-1 are not * specifically handled, but no occurence known so far either. * If present, obtain exit_ref, exit_label and exit_to * from the map. */ if (ret->way.next && ((streetitem->type == type_ramp) || (streetitem->type == type_highway_land) || (streetitem->type == type_highway_city) || (streetitem->type == type_street_n_lanes))) { struct map_selection mselexit; struct item *rampitem; dbg(lvl_debug,"test ramp\n"); mselexit.next = NULL; mselexit.u.c_rect.lu = c[0] ; mselexit.u.c_rect.rl = c[0] ; mselexit.range = item_range_all; mselexit.order =18; map_rect_destroy(mr); mr = map_rect_new(tmap, &mselexit); while ((rampitem=map_rect_get_item(mr))) { if (rampitem->type == type_highway_exit && item_coord_get(rampitem, &exitcoord, 1) && exitcoord.x == c[0].x && exitcoord.y == c[0].y) { while (item_attr_get(rampitem, attr_any, &attr)) { if (attr.type && attr.type == attr_label) { dbg(lvl_debug,"exit_label=%s\n",attr.u.str); ret->way.exit_label= map_convert_string(tmap,attr.u.str); } if (attr.type == attr_ref) { dbg(lvl_debug,"exit_ref=%s\n",attr.u.str); ret->way.exit_ref= map_convert_string(tmap,attr.u.str); } if (attr.type == attr_exit_to) { /* use exit_to as a fall back in case : * - there is no regular destination info * - we are not coming from a ramp already */ if (attr.u.str && !ret->way.destination && (ret->way.item.type == type_ramp) && (this_->last) && (!(this_->last->way.item.type == type_ramp))) { char *destination_raw; destination_raw=map_convert_string(tmap,attr.u.str); dbg(lvl_debug,"destination_raw from exit_to =%s\n",destination_raw); if ((split_string_to_list(&(ret->way),destination_raw, ';')) < 2) /* * if a first try did not result in an actual splitting * retry with ',' as a separator because in France a bad * mapping practice exists to separate exit_to with ',' * instead of ';' */ (split_string_to_list(&(ret->way),destination_raw, ',')); g_free(destination_raw); } } } } } } dbg(lvl_debug,"i=%d start %d end %d '%s' \n", i, ret->way.angle2, ret->angle_end, ret->way.name_systematic); map_rect_destroy(mr); } else { if (this_->last) ret->start=ret->end=this_->last->end; } if (! this_->first) this_->first=ret; if (this_->last) { this_->last->next=ret; ret->prev=this_->last; } dbg(lvl_debug,"ret=%p\n", ret); this_->last=ret; return ret; } /** * @brief Counts how many times a driver could turn right/left * * This function counts how many times the driver theoretically could * turn right/left between two navigation items, not counting the final * turn itself. * * @param from The navigation item which should form the start * @param to The navigation item which should form the end * @param direction Set to < 0 to count turns to the left >= 0 for turns to the right * @return The number of possibilities to turn or -1 on error */ static int count_possible_turns(struct navigation *nav, struct navigation_itm *from, struct navigation_itm *to, int direction) { int count; struct navigation_itm *curr; struct navigation_way *w; count = 0; curr = from->next; while (curr && (curr != to)) { w = curr->way.next; while (w) { if (is_way_allowed(nav, w, 4)) { if (direction < 0) { if (angle_delta(curr->prev->angle_end, w->angle2) < 0) { count++; break; } } else { if (angle_delta(curr->prev->angle_end, w->angle2) > 0) { count++; break; } } } w = w->next; } curr = curr->next; } if (!curr) { /* from does not lead to to? */ return -1; } return count; } /** * @brief Calculates distance and time to the destination * * This function calculates the distance and the time to the destination of a * navigation. If incr is set, this is only calculated for the first navigation * item, which is a lot faster than re-calculation the whole destination, but works * only if the rest of the navigation already has been calculated. * * @param this_ The navigation whose destination / time should be calculated * @param incr Set this to true to only calculate the first item. See description. */ static void calculate_dest_distance(struct navigation *this_, int incr) { int len=0, time=0, count=0; struct navigation_itm *next,*itm=this_->last; dbg(lvl_debug, "enter this_=%p, incr=%d\n", this_, incr); if (incr) { if (itm) { dbg(lvl_info, "old values: (%p) time=%d lenght=%d\n", itm, itm->dest_length, itm->dest_time); } else { dbg(lvl_info, "old values: itm is null\n"); } itm=this_->first; next=itm->next; dbg(lvl_info, "itm values: time=%d lenght=%d\n", itm->length, itm->time); dbg(lvl_info, "next values: (%p) time=%d lenght=%d\n", next, next->dest_length, next->dest_time); itm->dest_length=next->dest_length+itm->length; itm->dest_count=next->dest_count+1; itm->dest_time=next->dest_time+itm->time; dbg(lvl_info, "new values: time=%d lenght=%d\n", itm->dest_length, itm->dest_time); return; } while (itm) { len+=itm->length; time+=itm->time; itm->dest_length=len; itm->dest_time=time; itm->dest_count=count++; itm=itm->prev; } dbg(lvl_debug,"len %d time %d\n", len, time); } static int maneuver_category(enum item_type type) { switch (type) { case type_street_0: return 1; case type_street_1_city: return 2; case type_street_2_city: return 3; case type_street_3_city: return 4; case type_street_4_city: return 5; case type_highway_city: return 7; case type_street_1_land: return 2; case type_street_2_land: return 3; case type_street_3_land: return 4; case type_street_4_land: return 5; case type_street_n_lanes: return 6; case type_highway_land: return 7; case type_ramp: return 0; case type_roundabout: return 0; case type_ferry: return 0; default: return 0; } } /** * @brief Checks whether a way is allowed * * This function checks whether a given vehicle is permitted to enter a given way by comparing the * access and one-way restrictions of the way against the settings in {@code nav->vehicleprofile}. * Turn restrictions are not taken into account. * * @param nav The navigation object * @param way The way to examine * @param mode If nonzero, oneway restrictions will be taken into account. If zero, only the vehicle type * will be taken into account. * * @return True if entry is permitted, false otherwise. If {@code nav->vehicleprofile} is null, true is returned. */ /* (jandegr) this gets called from within show_maneuver with mode=3 for roundabouts * and with mode=4 from within count_possible_turns() for the use with * 'take the manieth road to the left/right' * However over here mode is ignored, so the 'manieth' road excludes unallowed oneway's, * but IMHO it should count all drivable roads. For roundabouts it seems to be ok. * */ static int is_way_allowed(struct navigation *nav, struct navigation_way *way, int mode) { if (!nav->vehicleprofile || !way->flags) return 1; if (mode) return ((way->flags & (way->dir >= 0 ? nav->vehicleprofile->flags_forward_mask : nav->vehicleprofile->flags_reverse_mask)) == nav->vehicleprofile->flags); else return ((way->flags & nav->vehicleprofile->flags) == nav->vehicleprofile->flags); } /** * @brief Checks whether a way has motorway-like characteristics * * Motorway-like means one of the following: * * item type is highway_land or highway_city (OSM: highway=motorway) * item type is street_n_lanes (OSM: highway=trunk) and way is one-way * {@code extended} is true and item type is either ramp or street_service * * @param way The way to examine * @param extended Whether to consider ramps and service roads to be motorway-like * @return True for motorway-like, false otherwise */ static int is_motorway_like(struct navigation_way *way, int extended) { if ((way->item.type == type_highway_land) || (way->item.type == type_highway_city) || ((way->item.type == type_street_n_lanes) && (way->flags & AF_ONEWAYMASK))) return 1; if ((extended) && ((way->item.type == type_ramp) || (way->item.type == type_street_service))) return 1; return 0; } /** * @brief Checks whether a way is a ramp * * @param way The way to be examined * @return True for ramp, false otherwise */ static int is_ramp(struct navigation_way *way) { if (way->item.type == type_ramp) return 1; return 0; } /** * @brief Checks if navit has to create a maneuver to drive from old to new * * This function checks if it has to create a "maneuver" - i.e. guide the user - to drive * from "old" to "new". * * @param old The old navigation item, where we're coming from * @param new The new navigation item, where we're going to * @param maneuver Pointer to a buffer that will receive a pointer to a {@code struct navigation_maneuver} * in which detailed information on the maneuver will be stored. The buffer may receive a null pointer * for some cases that do not require a maneuver. If a non-null pointer is returned, the caller is responsible * for freeing up the buffer once it is no longer needed. * @return True if navit should guide the user, false otherwise */ static int maneuver_required2 (struct navigation *nav, struct navigation_itm *old, struct navigation_itm *new, struct navigation_maneuver **maneuver) { struct navigation_maneuver m; /* if the function returns true, this will be passed in the maneuver argument */ struct navigation_itm *ni; /* temporary navigation item used for comparisons that examine previous or subsequent maneuvers */ int ret=0; int dw; /* temporary bearing difference between old and w (way being examined) */ int dlim; /* if no other ways are within +/- dlim, the maneuver is unambiguous */ int dc; /* if new and another way are within +/-min_turn_limit and on the same side, bearing difference for the other way; else d */ char *r=NULL; /* human-legible reason for announcing or not announcing the maneuver */ struct navigation_way *w; /* temporary way to examine */ struct navigation_way *through_segment2 = NULL; /* off-route segment of through road at complex T junction */ int wcat; int junction_limit = 100; /* maximum distance between two carriageways at a junction */ int motorways_left = 0, motorways_right = 0; /* number of motorway-like roads left or right of new->way */ int coming_from_motorway = 0; /* when the maneuver changes from one ramp to another, * whether the last non-ramp road was motorway-like */ int route_leaves_motorway = 0; /* when the maneuver changes from a motorway-like road to a ramp, * whether a subsequent maneuver leaves the motorway (changing direction * is considered leaving the motorway) */ *maneuver = NULL; m.type = type_nav_none; m.delta = angle_delta(old->angle_end, new->way.angle2); m.merge_or_exit = mex_none; m.is_complex_t_junction = 0; m.num_options = 0; m.num_new_motorways = 0; m.num_other_ways = 0; m.num_similar_ways = 0; m.old_cat = maneuver_category(old->way.item.type); m.new_cat = maneuver_category(new->way.item.type); m.max_cat = -1; m.left = -180; m.right = 180; m.is_unambiguous = 1; /* Check whether the street keeps its name */ m.is_same_street = is_same_street2(old->way.name, old->way.name_systematic, new->way.name, new->way.name_systematic); dc = m.delta; dbg(lvl_debug,"enter %p %p %p\n",old, new, maneuver); #if 0 dbg(lvl_debug, "old=%s %s, new=%s %s, angle old=%d, angle new=%d, d=%i\n ", old->way.name, old->way.name_systematic, new->way.name, new->way.name_systematic, old->angle_end, new->way.angle2, d); #endif if (!new->way.next || (new->way.next && (new->way.next->angle2 == new->way.angle2) && !new->way.next->next)) { /* No announcement necessary (with extra magic to eliminate duplicate ways) */ r="no: Only one possibility"; } else if (!new->way.next->next && new->way.next->item.type == type_ramp && !is_way_allowed(nav,new->way.next,1)) { /* If the other way is only a ramp and it is one-way in the wrong direction, no announcement necessary */ r="no: Only ramp and unallowed direction "; ret=0; } if (! r) { /* Announce exit from roundabout, but not entry or staying in it */ if ((old->way.flags & AF_ROUNDABOUT) && ! (new->way.flags & AF_ROUNDABOUT)) { r="yes: leaving roundabout"; ret=1; } else if (!new->way.next->next && !(old->way.flags & AF_ROUNDABOUT) && (new->way.flags & AF_ROUNDABOUT) && (new->way.next->flags & AF_ROUNDABOUT)) { /* this rather complicated construct makes sure we suppress announcements * only when we're entering a roundabout AND there are no other options */ r="no: entering roundabout"; } else if ((old->way.flags & AF_ROUNDABOUT) && (new->way.flags & AF_ROUNDABOUT)) { r="no: staying in roundabout"; } } if (!r) { /* Analyze all options (including new->way). * Anything that iterates over the whole set of options should be done here. This avoids * looping over the entire set of ways multiple times, which aims to improve performance * and predictability (because the same filter is applied to the ways being analyzed). */ w = &(new->way); int through_segments = 0; while (w) { /* in case of overlapping ways, avoid counting the way on the route twice */ if ((w->angle2 != new->way.angle2) || (w == &(new->way))) { dw=angle_delta(old->angle_end, w->angle2); if (is_way_allowed(nav,w,1)) { dbg(lvl_debug, "- Examining allowed way: %s %s %s, delta=%i\n", item_to_name(w->item.type), w->name_systematic, w->name, dw); m.num_options++; /* ways of similar category */ if (maneuver_category(w->item.type) == m.old_cat) { /* TODO: considering a maneuver_category difference of 1 to be similar, e.g. * if (abs(maneuver_category(w->item.type) - m.old_cat) <= 1) * will improve things in some cases but also introduce some junk maneuvers, * e.g. at complex junctions. If we relax the maneuver_category requirement, * we may need some extra requirements. */ m.num_similar_ways++; } /* motorway-like ways */ if ((m.num_new_motorways < 2) && is_motorway_like(w, 0)) { /* Count all motorway-like segments: * - always count new * - if new or w have an exit_ref or exit_label, count w * - if old, new and w have the same name_systematic, do not count w * - if one of old, new and w has no name_systematic, count w * This is for handling temporary splits (e.g. at toll booths), which should * be counted as one motorway for the purpose of navigation. On the other hand, * occasionally a motorway may split at an interchange with both segments * retaining the name, in which case we want to count both motorways. */ if ((w == &(new->way)) || new->way.exit_ref || new->way.exit_label || w->exit_ref || w->exit_label || !old->way.name_systematic || !new->way.name_systematic || !w->name_systematic || strcmp(old->way.name_systematic, new->way.name_systematic) || strcmp(old->way.name_systematic, w->name_systematic)) m.num_new_motorways++; } else if (!is_motorway_like(w, 1)) { m.num_other_ways++; } if (w != &(new->way)) { /* if we're exiting from a motorway, check which side of the ramp the motorway is on */ if (is_motorway_like(w, 0) && is_motorway_like(&(old->way), 0) && new->way.item.type == type_ramp) { if (dw < m.delta) motorways_left++; else motorways_right++; } if (dw < m.delta) { if (dw > m.left) m.left=dw; } else { if (dw < m.right) m.right=dw; } /* If almost-straight ways are present, the maneuver is ambiguous. We are counting only ways having * a nonzero maneuver category (street_0 or higher), excluding ramps, service roads and anything closed * to motorized traffic. Exceptions apply when the new way itself has a maneuver category of 0. * Note that this is in addition for the dlim calculations we do further below, as they fail to * catch some ambiguous cases for very low deltas. */ if ((dw > -min_turn_limit) && (dw < min_turn_limit) && ((maneuver_category(w->item.type) != 0) || (maneuver_category(new->way.item.type) == 0))) m.is_unambiguous = 0; if (dw < 0) { if (dw > -min_turn_limit && m.delta < 0 && m.delta > -min_turn_limit) dc=dw; } else { if (dw < min_turn_limit && m.delta > 0 && m.delta < min_turn_limit) dc=dw; } wcat=maneuver_category(w->item.type); /* If any other street has the same name, we can't use the same name criterion. * Exceptions apply if we're coming from a motorway-like road and: * - the other road is motorway-like (a motorway might split up temporarily) or * - the other road is a ramp or service road (they are sometimes tagged with the name of the motorway) * The second one is really a workaround for bad tagging practice in OSM. Since entering * a ramp always creates a maneuver, we don't expect the workaround to have any unwanted * side effects. */ if (m.is_same_street && is_same_street2(old->way.name, old->way.name_systematic, w->name, w->name_systematic) && (!is_motorway_like(&(old->way), 0) || (!is_motorway_like(w, 0) && w->item.type != type_ramp)) && is_way_allowed(nav,w,2)) m.is_same_street=0; /* If the route category changes to a lower one but another road has the same route category as old, * it is not clear which of the two the driver would perceive as the "same street", hence reset is_same_street */ /* Mark if the street has a higher or the same category */ if (wcat > m.max_cat) m.max_cat=wcat; } /* if w != new->way */ /* if is_way_allowed */ } else { /* If we're merging onto a motorway, check which side of the ramp the motorway is on. * This requires examining the candidate ways which are NOT allowed. */ if (is_motorway_like(w, 0) && is_motorway_like(&(new->way), 0) && old->way.item.type == type_ramp) { if (dw < 0) motorways_left++; else motorways_right++; } /* if !is_way_allowed */ } /* if is_way_allowed || !is_way_allowed */ if (w->flags & AF_ONEWAYMASK) { /* count through_segments (even if they are not allowed) to check if we are at a complex T junction */ if (is_same_street2(new->way.name, new->way.name_systematic, w->name, w->name_systematic)) /* count segments belonging to the same street */ through_segments++; else if ((!through_segment2 && (abs(angle_delta(angle_opposite(w->angle2), new->way.angle2)) < min_turn_limit)) || (through_segment2 && (abs(angle_delta(angle_opposite(w->angle2), new->way.angle2)) < abs(angle_delta(angle_opposite(through_segment2->angle2), new->way.angle2))))) { /* also count near-straight continuations of new (the through road may change names at the junction) */ if (!through_segment2) through_segments++; through_segment2 = w; } } } /* if w is not a duplicate of way->next */ w = w->next; } /* while w */ if ((abs(m.delta) >= min_turn_limit) && (through_segments >= 2)) { /* If we have to make a considerable turn (min_turn_limit or more), * check whether we are approaching a complex T junction from the "stem" * (which would need an announcement). * Complex means that the through road is a dual-carriageway road. * This is the case only if at least 2 segments (including new) are one-way * (regardless of direction) and have the same name as new or through_segment2. * More than 2 such segments are possible e.g. where two physically separated * lanes join. * To find out if there is another carriageway, we need to analyze the previous * maneuvers. */ int hist_through_segments = 0; int hist_dist = old->length; /* distance between previous and current maneuver */ ni = old; while (ni && (hist_through_segments == 0) && (hist_dist <= junction_limit)) { /* TODO: shouldn't the condition be (hist_through_segments < 2) to catch through segments that are slightly offset?? */ struct navigation_way *w = ni->way.next; while (w) { if (is_same_street2(new->way.name, new->way.name_systematic, w->name, w->name_systematic) || (through_segment2 && is_same_street2(through_segment2->name, through_segment2->name_systematic, w->name, w->name_systematic))) hist_through_segments++; w = w->next; } ni = ni->prev; if (ni) hist_dist += ni->length; } if (hist_through_segments >= 2) { /* Require at least 2 segments (there may be more than two in cases such as * local-express lane systems or separate cycleways) */ ret=1; m.is_complex_t_junction = 1; r="yes: turning into multi-carriageway through-road of T junction"; } } } if (!r && abs(m.delta) > 75) { /* always make an announcement if you have to make a sharp turn */ r="yes: delta over 75"; ret=1; } else if (!r && abs(m.delta) >= min_turn_limit) { if ((m.new_cat >= maneuver_category(type_street_2_city)) && (m.num_similar_ways > 1)) { /* When coming from street_2_* or higher category road, check if * - we have multiple options of the same category and * - we have to make a considerable turn (at least min_turn_limit) * If both is the case, ANNOUNCE. */ ret=1; r="yes: more than one similar road and delta >= min_turn_limit"; } } if ((!r) && (m.num_options <= 1)) r="no: only one option permitted"; if (!r) { if (is_motorway_like(&(old->way), 0) && (m.num_other_ways == 0) && (m.num_new_motorways > 1) && ((m.left > -90) || (m.right < 90))) { /* If we are at a motorway interchange, ANNOUNCE * We are assuming a motorway interchange when old way and at least * two possible ways are motorway-like and allowed. * Additionally we require one way (other than the new way) within +/-90°. * This prevents the rule from essentially announcing "don't do the U turn" * at the beginning of a single-carriageway section, which is occasionally * found on motorways. * If any of the possible ways is neither motorway-like nor a ramp, * we are probably on a trunk road with level crossings and not * at a motorway interchange. */ r="yes: motorway interchange (multiple motorways)"; m.merge_or_exit = mex_interchange; ret=1; } else if (is_motorway_like(&(old->way), 0) && is_motorway_like(&(new->way), 0) && (m.num_other_ways == 0) && (!m.is_same_street)) { /* Another sign that we are at a motorway interchange is if the street name changes */ r="yes: motorway interchange (name changes)"; m.merge_or_exit = mex_interchange; ret=1; } else if ((new->way.item.type == type_ramp) && ((m.num_other_ways == 0) || (abs(m.delta) >= min_turn_limit)) && ((m.left > -90) || (m.right < 90))) { /* Motorway ramps can be confusing, therefore we need to lower the bar for announcing a maneuver. * When the new way is a ramp, we check for the following criteria: * - All available ways are either motorway-like or ramps. * This prevents this rule from firing in non-motorway settings, which is needed to avoid * superfluous maneuvers when the minor road of a complex T junction is a ramp. * - If the above is not met, the maneuver must involve a turn (min_turn_limit or more) to enter the ramp. * - Additionally, there must be one way (other than the new way) within +/-90°. * This prevents the rule from essentially announcing "don't do the U turn" where the ramps for * two opposite directions merge. * If the criteria are satisfied, announce. */ r="yes: entering ramp"; ret=1; } } if (!r) { /* get the delta limit for checking for other streets. It is lower if the street has no other streets of the same or higher category */ if (m.new_cat < m.old_cat) dlim=80; else dlim=120; /* if the street is really straight, the others might be closer to straight */ if (abs(m.delta) < 20) dlim/=2; /* if both old and new way have a category of 0, or if both ways and at least one other way are * in the same category and no other ways are higher, * dlim is 620/256 (roughly 2.5) times the delta of the maneuver */ if ((m.max_cat == m.new_cat && m.max_cat == m.old_cat) || (m.new_cat == 0 && m.old_cat == 0)) dlim=abs(m.delta)*620/256; /* if both old and new way are in higher than highest encountered category, * dlim is 128/256 times (i.e. one half) the delta of the maneuver */ else if (m.max_cat < m.new_cat && m.max_cat < m.old_cat) dlim=abs(m.delta)*128/256; /* if no other ways are within +/-dlim, the maneuver is unambiguous */ if (m.left >= -dlim || m.right <= dlim) m.is_unambiguous = 0; /* if another way is within +/-min_turn_limit and on the same side as new, the maneuver is ambiguous */ if (dc != m.delta) { dbg(lvl_debug, "m.delta %d vs dc %d\n", m.delta, dc); m.is_unambiguous=0; } if (!m.is_same_street && m.is_unambiguous < 1) { /* FIXME: why < 1? */ ret=1; r="yes: different street and ambiguous"; } /* we should have cat of the candidate within dlim * instead of testing against max_cat. * The highest cat road might be well outside dlim */ else if (m.max_cat >= m.new_cat && m.is_unambiguous < 1) { ret = 1; r="yes: ambiguous because of other candidates within dlim"; } else r="no: same street or unambiguous"; #ifdef DEBUG r=g_strdup_printf("%s: d %d left %d right %d dlim=%d cat old:%d new:%d max:%d unambiguous=%d same_street=%d", ret==1?"yes":"no", m.delta, m.left, m.right, dlim, m.old_cat, m.new_cat, m.max_cat, m.is_unambiguous, m.is_same_street); #endif } if (m.merge_or_exit == mex_none) { if (old->way.item.type == type_ramp && is_motorway_like(&(new->way), 0)) { if (motorways_left) m.merge_or_exit = mex_merge_left; else if (motorways_right) m.merge_or_exit = mex_merge_right; /* if there are no motorways on either side, we are not merging * (more likely the start of a motorway) */ if (m.merge_or_exit != mex_none) { ret=1; if (!r) r = "yes: merging onto motorway-like road"; } } else if (is_motorway_like(&(old->way), 1) && (new->way.item.type == type_ramp)) { /* Detect interchanges - if: * - we're entering a ramp, * - we're coming from a motorway-like road (directly or via ramps), * - the route is taking us onto another motorway-like road and * - none of the ways in between connects to any non-motorway roads, * set m.merge_or_exit = mex_interchange. * The last condition is to prevent direction changes (i.e. exit motorway and take * access ramp for opposite direction) from being misinterpreted as interchanges. */ ni = old; coming_from_motorway = 1; while (coming_from_motorway && ni && (ni->way.item.type == type_ramp)) { w = &(ni->way); while (coming_from_motorway && w) { coming_from_motorway = is_motorway_like(w, 1); w = w->next; } ni = ni->prev; } if (ni && coming_from_motorway) coming_from_motorway = is_motorway_like(&(ni->way), 0); ni = new->next; route_leaves_motorway = !coming_from_motorway; while (!route_leaves_motorway && ni && (ni->way.item.type == type_ramp)) { w = &(ni->way); while (!route_leaves_motorway && w) { route_leaves_motorway = !is_motorway_like(w, 1); w = w->next; } ni = ni->next; } if (ni && !route_leaves_motorway && is_motorway_like(&(ni->way), 0)) m.merge_or_exit = mex_interchange; else if (is_motorway_like(&(old->way), 0) || (coming_from_motorway && new->way.exit_ref)) { if (motorways_left && (m.left > -90)) m.merge_or_exit = mex_exit_right; else if (motorways_right && (m.right < 90)) m.merge_or_exit = mex_exit_left; /* if there are no motorways within +/-90 degrees on either side, this is not an exit * (more likely the end of a motorway) */ } if (is_motorway_like(&(old->way), 0) && (m.merge_or_exit != mex_none)) { ret=1; if (!r) r = "yes: leaving motorway-like road"; } } } if (ret) { *maneuver = g_new(struct navigation_maneuver, 1); memcpy(*maneuver, &m, sizeof(struct navigation_maneuver)); } if (r) dbg(lvl_debug, "%s %s %s -> %s %s %s: %s, delta=%i, merge_or_exit=%i\n", item_to_name(old->way.item.type), old->way.name_systematic, old->way.name, item_to_name(new->way.item.type), new->way.name_systematic, new->way.name, r, m.delta, m.merge_or_exit); return ret; } /** * @brief Adjusts a bearing delta to point in the same direction as a reference delta. * * Calculated delta results are constrained to -180 <= delta <= +180 degrees. Some heuristics, however, require values outside * that range, e.g. -190 rather than 170 degrees. Given a reference with approximately correct orientation, this function corrects * that delta to match the reference as closely as possible. This is done by adding or subtracting 360 degrees as needed. * * @param delta The delta to adjust. {@code abs(delta)} must be no greater than 180. * @param reference The reference delta. {@code abs(reference)} must be no greater then 180. * @return The adjusted delta, which is numerically within +/-180 degrees of the reference. If {@code delta} or {@code reference} * are outside of their specified range, the result is undefined. */ int adjust_delta(int delta, int reference) { if ((delta >= 0) && (delta - reference) > 180) { dbg(lvl_debug,"adjusting delta from %d to %d\n", delta, delta - 360); return delta - 360; } else if ((delta <= 0) && (reference - delta) > 180) { dbg(lvl_debug,"adjusting delta from %d to %d\n", delta, delta + 360); return delta + 360; } else return delta; } /** * @brief Analyzes a roundabout and sets maneuver information * * Exit from a roundabout requires a somewhat complex analysis of the ways involved in order to: *
    *
  • Calculate effective bearing change (between entry and exit) and store it in {@code cmd->roundabout_delta}
  • *
  • Set {@code cmd->maneuver->type} to {@code nav_roundabout_{r|l}{1..8}}, based on bearing change
  • *
  • Set {@code cmd->length}
  • *
* * Bearing change must be as close as possible to how drivers would perceive it. * Builds prior to r2017 used the difference between the last way before and the first way after the roundabout, * which tends to overestimate the angle when the ways leading towards and/or away from the roundabout split into * separate carriageways in a Y-shape. This is referred to as {@code delta1} here. * * In r2017 a different approach was introduced, which essentially distorts the roads so they enter and leave * the roundabout at a 90 degree angle. (To make calculations simpler, tangents of the roundabout at the entry * and exit points are used, with one of them reversed in direction, instead of the approach roads.) * However, this approach tends to underestimate the angle when the distance between approach roads is large. * This is referred to as {@code delta2} here. * * Combining {@code delta1} and {@code delta2}, calculating error estimates for each and using a weighted average between the * two delta estimates gives better results in many cases but fails for certain road layouts - namely, when corresponding * approach roads are connected by more than one roundabout segment, or when additional ways connect to an approach road. * These cases break error calculation and thus weight distribution. * * Project HighFive introduces a new approach, which compares bearings of ways leading towards and away from the * roundabout not immediately at entry and exit but at a certain distance from the roundabout, which is roughly proportional * to the circumference of the roundabout. Circumference is estimated using the arithmetic mean value of {@code delta1} and * {@code delta2}. This approach has produced the best results in tests. In code it is referred to as {@code delta3}. * * @param this_ The navigation object * @param cmd A {@code struct navigation_cmd}, whose {@code delta} and {@code maneuver} members must be set prior to calling * this function * @param itm The navigation item for the maneuver to exit the roundabout */ void navigation_analyze_roundabout(struct navigation *this_, struct navigation_command *cmd, struct navigation_itm *itm) { enum item_type r = type_none, l = type_none; int len = 0; /* length of roundabout segment */ int roundabout_length; /* estimated total length of roundabout */ int angle = 0; int entry_tangent; /* tangent of the roundabout at entry point, against direction of route */ int exit_tangent; /* tangent of the roundabout at exit point, in direction of route */ int entry_road_angle, exit_road_angle; /* angles before and after approach segments */ struct navigation_itm *itm2; /* items before itm to examine, up to first roundabout segment on route */ struct navigation_itm *itm3; /* items before itm2 and after itm to examine */ struct navigation_way *w; /* continuation of the roundabout after we leave it */ struct navigation_way *w2; /* segment of the roundabout leading to the point at which we enter it */ int dtsir = 0; /* delta to stay in roundabout */ int d, dmax = 0; /* when examining deltas of roundabout approaches, current and maximum encountered */ int delta1, delta2, delta3; /* for roundabout delta calculated with different approaches */ int dist_left; /* when examining ways around the roundabout to a certain threshold, the distance we have left to go */ int central_angle; /* approximate central angle for the roundabout arc that is part of the route */ int abort; /* whether a (complex) criterion for aborting a loop has been met */ /* Find continuation of roundabout after the exit. Don't simply use itm->way.next here, it will break * if a node in the roundabout is shared by more than one way */ w = itm->way.next; while (w && !(w->flags & AF_ROUNDABOUT)) w = w->next; if (w) { /* When exiting a roundabout, w should never be null, thus this * code will always be executed. Checking for the condition anyway ensures * that botched map data (roundabout ending with nowhere else to go) will not * cause a crash. For the same reason we're using dtsir with a default value of 0. */ dtsir = angle_delta(itm->prev->angle_end, w->angle2); dbg(lvl_debug,"delta to stay in roundabout %d\n", dtsir); exit_tangent = angle_median(itm->prev->angle_end, w->angle2); dbg(lvl_debug,"exit %d median from %d, %d\n", exit_tangent, itm->prev->angle_end, w->angle2); /* Move back to where we enter the roundabout, calculate length in roundabout */ itm2=itm; while (itm2->prev && (itm2->prev->way.flags & AF_ROUNDABOUT)) { itm2=itm2->prev; len+=itm2->length; angle=itm2->angle_end; } /* Find the segment of the roundabout leading up to the point at which we enter it. Again, don't simply * use itm2->way.next here, it will break if a node in the roundabout is shared by more than one way */ w2 = itm2->way.next; while (w2 && !(w2->flags & AF_ROUNDABOUT)) w2 = w2->next; /* Calculate entry angle */ if (itm2 && w2) { entry_tangent = angle_median(angle_opposite(itm2->way.angle2), w2->angle2); dbg(lvl_debug, "entry %d median from %d (%d), %d\n", entry_tangent, angle_opposite(itm2->way.angle2), itm2->way.angle2, itm2->way.next->angle2); } else { entry_tangent = angle_opposite(angle); } /* endif itm2 && w2 */ dbg(lvl_debug, "entry %d exit %d\n", entry_tangent, exit_tangent); delta2 = angle_delta(entry_tangent, exit_tangent); dbg(lvl_debug, "delta2 %d\n", delta2); if (itm2->prev) { /* If there are V-shaped approach segments and we are turning around or making a sharp turn, * delta1 may point in the wrong direction, thus we need adjust_delta() to correct this. */ delta1 = adjust_delta(angle_delta(itm2->prev->angle_end, itm->way.angle2), delta2); /* Now try to figure out the error range for delta1. Errors are caused by turns in the approach segments * just before the roundabout. We use the last segment before the approach as a reference. * We assume the approach to begin when one of the following is true: * - a way turns into a ramp * - a way turns into a one-way road * - a certain distance from the roundabout, proportional to its circumference, is exceeded * Simply comparing bearings at these points may cause confusion with certain road layouts (namely * S-shaped dual-carriageway roads), hence we examine the entire approach segment and take the largest * delta (relative to the end of the approach segment) which we encounter. * This is done for both ends of the roundabout. */ /* Approximate roundabout circumference based on len and approximate central angle of route segment. * The central angle is approximated using the unweighted average of delta1 and delta2, * which is somewhat crude but sufficient for our purposes. */ central_angle = abs((delta1 + delta2) / 2 + ((cmd->delta < dtsir) ? 180 : -180)); roundabout_length = len * 360 / central_angle; dbg(lvl_debug,"roundabout_length = %dm (for central_angle = %d degrees)\n", roundabout_length, central_angle); /* in the case of separate carriageways, approach roads become hard to identify, thus we keep a cap on distance. * Currently this is at most half the length of the roundabout, which has worked well in tests but can be tweaked * to further improve results. */ dist_left = roundabout_length / 2; dbg(lvl_debug,"examining roads for up to %dm\n", dist_left); /* examine items before roundabout */ itm3 = itm2->prev; /* last segment before roundabout */ abort = 0; while (itm3->prev) { if ((itm3->next && is_ramp(&(itm3->next->way)) && !is_ramp(&(itm3->way))) || !(itm3->way.flags & AF_ONEWAYMASK)) { dbg(lvl_debug,"items before roundabout: break because ramp or oneway ends, %dm left\n", dist_left); dist_left = 0; /* to make sure we don't examine the following way in depth */ break; } if (dist_left <= itm3->length) { dbg(lvl_debug,"items before roundabout: maximum distance reached, %dm left, item length %dm\n", dist_left, itm3->length); break; } d = navigation_way_get_max_delta(&(itm3->way), map_projection(this_->map), itm2->prev->angle_end, dist_left, -1); if ((d != invalid_angle) && (abs(d) > abs(dmax))) dmax = d; w2 = itm3->way.next; while (w2) { /* Stop examining ways at a turn maneuver (more than one way allowed and route does not follow straightest path) */ if (is_way_allowed(this_, w2, 0) && (abs(angle_delta(angle_opposite(w2->angle2), itm3->way.angle2)) <= abs(angle_delta(itm3->prev->angle_end, itm3->way.angle2)))) { /* FIXME: comparing angles probably does not work well for near-equal angles */ abort = 1; break; } w2 = w2->next; } if (abort) { dbg(lvl_debug,"items before roundabout: break because of potential turn maneuver, %dm left\n", dist_left); dist_left = itm3->length; break; } dist_left -= itm3->length; itm3 = itm3->prev; } if (dist_left == 0) { d = angle_delta(itm2->prev->angle_end, itm3->angle_end); } else if (dist_left < itm3->length) { d = navigation_way_get_max_delta(&(itm3->way), map_projection(this_->map), itm2->prev->angle_end, dist_left, -1); } else { /* not enough objects in navigation map, use most distant one * - or dist_left == itm3->length, this saves a few CPU cycles over the above */ d = angle_delta(itm2->prev->angle_end, itm3->way.angle2); } if ((d != invalid_angle) && (abs(d) > abs(dmax))) dmax = d; entry_road_angle = (itm2->prev->angle_end + dmax) % 360; dbg(lvl_debug,"entry_road_angle %d (%d + %d)\n", entry_road_angle, itm2->prev->angle_end, dmax); /* examine items after roundabout */ dmax = 0; dist_left = roundabout_length / 2; itm3 = itm; /* first segment after roundabout */ abort = 0; while (itm3->next) { if ((itm3->prev && is_ramp(&(itm3->prev->way)) && !is_ramp(&(itm3->way))) || !(itm3->way.flags & AF_ONEWAYMASK)) { dbg(lvl_debug,"items after roundabout: break because ramp or oneway ends, %dm left\n", dist_left); dist_left = 0; /* to make sure we don't examine the following way in depth */ break; } if (dist_left <= itm3->length) { dbg(lvl_debug,"items after roundabout: maximum distance reached, %dm left, item length %dm\n", dist_left, itm3->length); break; } d = navigation_way_get_max_delta(&(itm3->way), map_projection(this_->map), itm->way.angle2, dist_left, 1); if ((d != invalid_angle) && (abs(d) > abs(dmax))) dmax = d; w2 = itm3->next->way.next; while (w2) { /* Stop examining ways at a turn maneuver (more than one way allowed and route does not follow straightest path) */ if (is_way_allowed(this_, w2, 0) && (abs(angle_delta(itm3->angle_end, w2->angle2)) <= abs(angle_delta(itm3->angle_end, itm3->next->way.angle2)))) { /* FIXME: comparing angles probably does not work well for near-equal angles */ abort = 1; break; } w2 = w2->next; } if (abort) { dbg(lvl_debug,"items after roundabout: break because of potential turn maneuver, %dm left\n", dist_left); dist_left = itm3->length; break; } dist_left -= itm3->length; itm3 = itm3->next; } if (dist_left == 0) { d = angle_delta(itm->way.angle2, itm3->way.angle2); } else if (dist_left < itm3->length) { d = navigation_way_get_max_delta(&(itm3->way), map_projection(this_->map), itm->way.angle2, dist_left, 1); } else { /* not enough objects in navigation map, use most distant one * - or dist_left == itm3->length, this saves a few CPU cycles over the above */ d = angle_delta(itm->way.angle2, itm3->angle_end); } if ((d != invalid_angle) && (abs(d) > abs(dmax))) dmax = d; exit_road_angle = (itm->way.angle2 + dmax) % 360; dbg(lvl_debug,"exit_road_angle %d (%d + %d)\n", exit_road_angle, itm->way.angle2, dmax); dbg(lvl_debug,"delta1 %d\n", delta1); delta3 = adjust_delta(angle_delta(entry_road_angle, exit_road_angle), delta2); dbg(lvl_debug,"delta3 %d\n", delta3); cmd->roundabout_delta = delta3; dbg(lvl_debug,"roundabout_delta %d\n", cmd->roundabout_delta); } else { /* we don't know where we entered the roundabout, so we can't calculate delta1 */ cmd->roundabout_delta = delta2; } /* endif itm2->prev */ cmd->length=len+roundabout_extra_length; } /* if w */ /* set cmd->maneuver->type */ switch (((180 + 22) - cmd->roundabout_delta) / 45) { case 0: case 1: r = type_nav_roundabout_r1; l = type_nav_roundabout_l7; break; case 2: r = type_nav_roundabout_r2; l = type_nav_roundabout_l6; break; case 3: r = type_nav_roundabout_r3; l = type_nav_roundabout_l5; break; case 4: r = type_nav_roundabout_r4; l = type_nav_roundabout_l4; break; case 5: r = type_nav_roundabout_r5; l = type_nav_roundabout_l3; break; case 6: r = type_nav_roundabout_r6; l = type_nav_roundabout_l2; break; case 7: r = type_nav_roundabout_r7; l = type_nav_roundabout_l1; break; case 8: r = type_nav_roundabout_r8; l = type_nav_roundabout_l8; break; } dbg(lvl_debug,"delta %d\n", cmd->delta); /* if delta to leave the roundabout (cmd->delta) is less than delta to stay in roundabout (dtsir), * we're exiting to the left, so we're probably in a clockwise roundabout, and vice versa */ if (cmd->delta < dtsir) cmd->maneuver->type = l; else cmd->maneuver->type = r; dbg(lvl_debug,"type %s\n", item_to_name(cmd->maneuver->type)); } /** * @brief Creates a new {@code struct navigation_command} for a maneuver. * * This function creates a new command and inserts it into the command list of {@code this_}. * It also parses {@code maneuver} and sets its {@code type} appropriately so that other * functions can rely on that. * * @param this_ The navigation object * @param itm The navigation item following the maneuver * @param maneuver The {@code struct navigation_maneuver} returned by {@code maneuver_required2()}. For the destination, * initialize a zeroed-out {@code struct navigation_maneuver} and set its {@code type} member to {@code type_nav_destination} * prior to calling this function. * * @return The new command */ static struct navigation_command * command_new(struct navigation *this_, struct navigation_itm *itm, struct navigation_maneuver *maneuver) { struct navigation_command *ret=g_new0(struct navigation_command, 1); struct navigation_way *w; /* the way in which to turn. */ int more_ways_for_strength = 0; /* Counts the number of ways of the current node that turn to the same direction as the route way. Strengthening criterion. */ int turn_no_of_route_way = 0; /* The number of the route way of all ways that turn to the same direction. Count direction from abs(0 degree) up to abs(180 degree). Strengthening criterion. */ dbg(lvl_debug,"enter this_=%p itm=%p maneuver=%p delta=%d\n", this_, itm, maneuver, maneuver->delta); ret->maneuver = maneuver; ret->delta=maneuver->delta; ret->itm=itm; /* Possible maneuver types: * nav_none (default, change wherever we encounter it – unless the maneuver is a merge, which has only merge_or_exit) * nav_straight (set below) * nav_keep_{left|right} (set below) * nav_{right|left}_{1..3} (set below) * nav_turnaround (TODO: when we have a U turn without known direction? Needs full implementation!) * nav_turnaround_{left|right} (set below) * nav_roundabout_{r|l}{1..8} (set below, special handling) * nav_exit_{left|right} (do not set here) * nav_merge_{left|right} (do not set here) * nav_destination (if this is set, leave it) * nav_position (do not set here) */ if (ret->maneuver->type != type_nav_destination) { /* FIXME: this will not catch cases in which entry and exit share the same node and we just *touch* the roundabout */ if (itm && itm->prev && !(itm->way.flags & AF_ROUNDABOUT) && (itm->prev->way.flags & AF_ROUNDABOUT)) { navigation_analyze_roundabout(this_, ret, itm); } else { /* non-roundabout turn --> */ /* set ret->maneuver->type */ if (abs(ret->delta) >= min_turn_limit) { /* Strengthening criterion: If there are more ways in the same direction, in which the vehicle can turn, the announcement shall be more precise. I.e. the strengthening is dependent on which of the possible ways the route turn shall be. So, with the selection of one of the possible ways a certain turn angle pattern becomes active. Second criterion: the turn angle of the route way defines the strengthening of the announcement according to the pattern. */ w = itm->next->way.next; if (angle_delta(itm->next->way.angle2,itm->angle_end) < 0) { /* next turns or bends left */ while (w) { if (angle_delta(w->angle2,itm->angle_end) < -min_turn_limit) { more_ways_for_strength++; /* there is an additional way that also turns left. Note: the route turn is not contained Left means more than min_turn_limit, less is straight on */ if (angle_delta(w->angle2,itm->angle_end) < ret->delta) turn_no_of_route_way++; /* this way is on the left side of the route way */ } w = w->next; } } else { /* next turns or bends right. Same investigation, but mirrored. */ while (w) { if (angle_delta(w->angle2,itm->angle_end) > min_turn_limit) { more_ways_for_strength++; if (angle_delta(w->angle2,itm->angle_end) > ret->delta) turn_no_of_route_way++; /* this way is on the right side of the route way */ } w = w->next; } } /* Investigate the strengthening of announcement. */ switch (more_ways_for_strength) { case 0: /* Only one possibility to turn to this direction */ if (ret->delta < -sharp_turn_limit) { ret->maneuver->type = type_nav_left_3; /* strongly left */ } else if (ret->delta <= 0) { ret->maneuver->type = type_nav_left_2; /* normally left */ } else if (ret->delta <= sharp_turn_limit) { ret->maneuver->type = type_nav_right_2;/* normally right */ } else { ret->maneuver->type = type_nav_right_3;/* strongly right */ } break; case 1: /* One additional possibility to turn to the same direction */ if (turn_no_of_route_way == 0) { /* the route is less strong to turn */ if (ret->delta < -turn_2_limit) { ret->maneuver->type = type_nav_left_2; /* normally left */ } else if (ret->delta <= 0) { ret->maneuver->type = type_nav_left_1; /* easily left */ } else if (ret->delta <= turn_2_limit) { ret->maneuver->type = type_nav_right_1; /* easily right */ } else { ret->maneuver->type = type_nav_right_2; /* normally right */ } } else { if (ret->delta < -sharp_turn_limit) { ret->maneuver->type = type_nav_left_3; /* strongly left */ } else if (ret->delta <= 0) { ret->maneuver->type = type_nav_left_2; /* normally left */ } else if (ret->delta <= sharp_turn_limit) { ret->maneuver->type = type_nav_right_2; /* normally right */ } else { ret->maneuver->type = type_nav_right_3; /* strongly right */ } } break; default: /* Two or more additional possibilities to turn to the same direction. */ if (turn_no_of_route_way == 0) { if (ret->delta < -turn_2_limit) { ret->maneuver->type = type_nav_left_2; /* normally left */ } else if (ret->delta <= 0) { ret->maneuver->type = type_nav_left_1; /* easily left */ } else if (ret->delta <= turn_2_limit) { ret->maneuver->type = type_nav_right_1; /* easily right */ } else { ret->maneuver->type = type_nav_right_2; /* normally right */ } } else if (turn_no_of_route_way == 1) { if (ret->delta < -sharp_turn_limit) { ret->maneuver->type = type_nav_left_3; /* strongly left */ } else if (ret->delta <= 0) { ret->maneuver->type = type_nav_left_2; /* normally left */ } else if (ret->delta <= sharp_turn_limit) { ret->maneuver->type = type_nav_right_2; /* normally right */ } else { ret->maneuver->type = type_nav_right_3; /* strongly right */ } } else if (turn_no_of_route_way > 1) { /* if the route is the strongest of all possible turns here */ if (ret->delta < -u_turn_limit) { ret->maneuver->type = type_nav_turnaround_left; /* turn around left */ } else if (ret->delta < -sharp_turn_limit) { ret->maneuver->type = type_nav_left_3; /* strongly left */ } else if (ret->delta <= 0) { ret->maneuver->type = type_nav_left_2; /* normally left */ } else if (ret->delta <= sharp_turn_limit) { ret->maneuver->type = type_nav_right_2; /* normally right */ } else if (ret->delta <= u_turn_limit) { ret->maneuver->type = type_nav_right_3; /* strongly right */ } else { ret->maneuver->type = type_nav_turnaround_right; /* turn around right */ } } break; } } else { /* if the route goes straight: * If there's another way on one side of the route within 2 * min_turn_limit (not both - the expression below is a logical XOR), * the maneuver is "keep left" or "keep right", else it is "go straight". * Note that neighbors are not necessarily straight. * The boundary may need some tweaking, (2 * min_turn_limit) may not be ideal but it's a first shot which ensures that other straight ways * will always fulfill the neighbor criteria. */ int has_left_neighbor = (ret->maneuver->left - ret->delta > 2 * -min_turn_limit); int has_right_neighbor = (ret->maneuver->right - ret->delta < 2 * min_turn_limit); if (!(has_left_neighbor) != !(has_right_neighbor)) { if (has_left_neighbor) ret->maneuver->type = type_nav_keep_right; else ret->maneuver->type = type_nav_keep_left; } else ret->maneuver->type = type_nav_straight; } /* endif ret->delta */ } } if (this_->cmd_last) { this_->cmd_last->next=ret; ret->prev = this_->cmd_last; } this_->cmd_last=ret; if (!this_->cmd_first) this_->cmd_first=ret; return ret; } /** * @brief Creates turn instructions where needed * * @param this_ The navigation object for which to create turn instructions * @param route Not used */ static void make_maneuvers(struct navigation *this_, struct route *route) { struct navigation_itm *itm, *last=NULL, *last_itm=NULL; struct navigation_maneuver *maneuver; itm=this_->first; this_->cmd_last=NULL; this_->cmd_first=NULL; while (itm) { if (last) { if (maneuver_required2(this_, last_itm, itm, &maneuver)) { command_new(this_, itm, maneuver); } } else last=itm; last_itm=itm; itm=itm->next; } maneuver = g_new0(struct navigation_maneuver, 1); maneuver->type = type_nav_destination; command_new(this_, last_itm, maneuver); } static int contains_suffix(char *name, char *suffix) { if (!suffix) return 0; if (strlen(name) < strlen(suffix)) return 0; return !navit_utf8_strcasecmp(name+strlen(name)-strlen(suffix), suffix); } static char * replace_suffix(char *name, char *search, char *replace) { int len=strlen(name)-strlen(search); char *ret=g_malloc(len+strlen(replace)+1); strncpy(ret, name, len); strcpy(ret+len, replace); if (isupper(name[len])) { ret[len]=toupper(ret[len]); } return ret; } /** * @brief Creates a text description for the destination of a maneuver, which can be used in announcements. * * @param nav The navigation object * @param cmd The {@code navigation_command} for which to generate an announcement * @param next The current navigation item. In speech mode this should be set to the navigation * item starting at the vehicle's current position; in route description mode this should be set to * the {@code navigation_item} associated with the previous {@code navigation_command} * @param prefix A space will be added as a prefix to the string returned, or a null string for no prefix */ static char * navigation_item_destination(struct navigation *nav, struct navigation_command *cmd, struct navigation_itm *next, char *prefix) { char *ret = NULL, *name1 = NULL, *sep = "", *name2 = ""; char *name = NULL, *name_systematic=NULL; int i, gender = unknown; int vocabulary1=1; int vocabulary2=1; struct attr attr; struct navigation_itm *itm = cmd->itm; struct navigation_itm *itm_pre = NULL; struct navigation_itm *itm_post = NULL; if (! prefix) prefix=""; /* check the configuration of navit.xml */ if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_name, &attr, NULL)) vocabulary1=attr.u.num; /* shall the street name be announced? */ if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_name_systematic, &attr, NULL)) vocabulary2=attr.u.num; /* shall the systematic name be announced? */ /* On motorway links don't announce the name of the ramp as this is done by name_systematic and the street_destination. */ if (vocabulary1 && (itm->way.item.type != type_ramp)) name=itm->way.name; if (vocabulary2) name_systematic=itm->way.name_systematic; if (name) { name1 = g_strdup(name); for (i = 0; i < sizeof(suffixes)/sizeof(suffixes[0]); i++) { if (contains_suffix(name, suffixes[i].fullname)) { gender = suffixes[i].gender; g_free(name1); name1 = g_strdup(name); break; } if (contains_suffix(name, suffixes[i].abbrev)) { gender = suffixes[i].gender; g_free(name1); name1 = replace_suffix(name, suffixes[i].abbrev, suffixes[i].fullname); break; } } if (name_systematic) { name2 = name_systematic; sep=" "; } } else name1 = g_strdup(""); if (cmd->maneuver && cmd->maneuver->type && (cmd->maneuver->merge_or_exit & mex_merge)) { if (name_systematic) /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name */ ret = g_strdup_printf(_("%1$sonto the %2$s%3$s%4$s"), prefix, name_systematic, sep, name1); else if (name) switch (gender) { case unknown: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name */ ret = g_strdup_printf(_("%1$sonto %2$s"), prefix, name1); break; case masculine: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%1$sonto %2$s|masculine form"), prefix, name1); break; case feminine: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%1$sonto %2$s|feminine form"), prefix, name1); break; case neuter: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%1$sonto %2$s|neuter form"), prefix, name1); break; } else ret = g_strdup(""); } else if (!name && !name_systematic && itm->way.item.type == type_ramp && (!cmd->maneuver || (cmd->maneuver->merge_or_exit != mex_interchange))) { itm_pre = itm->prev; while (itm_pre && (itm_pre->way.item.type == type_ramp)) itm_pre = itm_pre->prev; itm_post = itm->next; while (itm_post && (itm_post->way.item.type == type_ramp) && (!cmd->next || (itm_post != cmd->next->itm))) itm_post = itm_post->next; if (((itm_post) && is_motorway_like(&(itm_post->way), 0)) && ((itm_pre) && !is_motorway_like(&(itm_pre->way), 0))) /* TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. */ ret = g_strdup_printf("%s%s",prefix,_("onto the motorway ramp")); /* This is only announced when there is no additional info about the ramp and the ramp leads to a motorway. */ else ret = g_strdup(""); } else if (!name && !name_systematic) ret = g_strdup(""); else if (name) { switch (gender) { case unknown: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name */ ret=g_strdup_printf(_("%sinto %s%s%s"), prefix, name, sep, name2); break; case masculine: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%sinto %s%s%s|masculine form"), prefix, name1, sep, name2); break; case feminine: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%sinto %s%s%s|feminine form"), prefix, name1, sep, name2); break; case neuter: /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included */ ret=g_strdup_printf(_("%sinto %s%s%s|neuter form"), prefix, name1, sep, name2); break; } } else /* TRANSLATORS: gives the name of the next road to turn into (into the E17) */ ret=g_strdup_printf(_("%sinto the %s"),prefix,name_systematic); g_free(name1); name1=ret; while (name1 && *name1) { switch (*name1) { case '|': *name1='\0'; break; case '/': *name1++=' '; break; default: name1++; break; } } return ret; } /** * @brief Formats the exit ref and name for display and speech output * * This function takes the navigation command for a motorway maneuver (exit or interchange) and * returns a string describing the exit. * * If the exit has a name and ref and the name is different from {@code street_destination_announce}, * a string of the form "ref name" is returned. If only one of the two is different from NULL, it * is returned unchanged. * * If the name matches {@code street_destination_announce}, it is always treated as if it were NULL. * This prevents redundancy in announcements. * * No checks are done that the maneuver actually has the appropriate merge_or_exit flags set. The * caller is responsible for performing such checks prior to calling this function. * * @param this_ The navigation command * @param street_destination_announce The name of the street following the maneuver. This argument * may be NULL, in which case the exit name will not be suppressed. */ static char * navigation_cmd_get_exit_announce(struct navigation_command *this_, char *street_destination_announce) { char * ret = NULL; char *folded_exit_label=NULL; char *folded_street_destination_announce=NULL; if (this_->itm->way.exit_label) { folded_exit_label = linguistics_casefold(this_->itm->way.exit_label); if (street_destination_announce) folded_street_destination_announce = linguistics_casefold(street_destination_announce); else folded_street_destination_announce = g_strdup(""); if (!strstr(folded_street_destination_announce, folded_exit_label)) { /* No redundancy? */ if (this_->itm->way.exit_ref) ret = g_strdup_printf("%1$s %2$s", this_->itm->way.exit_ref, this_->itm->way.exit_label); else ret = g_strdup_printf("%1$s", this_->itm->way.exit_label); } else if (this_->itm->way.exit_ref) ret = g_strdup_printf("%1$s", this_->itm->way.exit_ref); } else { if (this_->itm->way.exit_ref) ret = g_strdup_printf("%1$s", this_->itm->way.exit_ref); } g_free(folded_exit_label); g_free(folded_street_destination_announce); return ret; } /** * @brief Creates turn by turn guidance sentences for the speech and for the route description * * @param nav The navigation object * @param itm The current navigation item, which is used to determine the distance to the next * maneuver. In speech mode this should be set to the navigation item starting at the vehicle's * current position; in route description mode this should be set to the {@code navigation_item} * associated with the previous {@code navigation_command} * @param cmd The {@code navigation_command} for which to generate an announcement * @param type The type of announcements to generate. Set to {@code attr_navigation_long_exact} * to avoid rounding distances, or to {@code attr_navigation_speech} to avoid announcing street * names more than once * @param connect Whether this is the second of two connected announcements, as in "turn left * in..., then turn right" */ static char * show_maneuver(struct navigation *nav, struct navigation_itm *itm, struct navigation_command *cmd, enum attr_type type, enum announcement_level level) { int distance=itm->dest_length-cmd->itm->dest_length; char *d=NULL,*ret=NULL; char *street_destination_announce=NULL; int skip_roads = 0; int count_roundabout; struct navigation_itm *cur; struct navigation_way *candidate_way; int tellstreetname = 0; char *at = NULL; /* Motorway junction name */ char *direction = NULL; /* The direction-dependent part of the maneuver */ char *destination = NULL; char *street_destination = NULL; char *instruction = NULL; char *strength = NULL; /* Strength of turn like 'easily', 'strongly', etc. */ if (type != attr_navigation_long_exact) distance=round_distance(distance); if (type == attr_navigation_speech) { if (nav->turn_around && nav->turn_around == nav->turn_around_limit) { if (level == level_connect) { return g_strdup(""); /* there is no ',then turn around' */ } else { navigation_set_turnaround(nav, nav->turn_around_count+1); return g_strdup(_("When possible, please turn around")); } } navigation_set_turnaround(nav, 0); dbg(lvl_debug,"distance=%d level=%d type=0x%x\n", distance, level, itm->way.item.type); } street_destination=select_announced_destinations(cmd); if (street_destination) if (level == level_connect) { /* for the connected announcement suppress the destination, if this is the same as in the first part of the announcement */ if (cmd->prev) { char *street_destination_previous = select_announced_destinations(cmd->prev); if (street_destination_previous && strstr(street_destination_previous, street_destination)) { /* doesn't have any new information? */ street_destination_announce=g_strdup(""); } else { /* TRANSLATORS: the argument is the destination to follow */ street_destination_announce=g_strdup_printf(_("towards %s"),street_destination); } g_free(street_destination_previous); } else { street_destination_announce=g_strdup_printf(_("towards %s"),street_destination); } } else { street_destination_announce=g_strdup_printf(_("towards %s"),street_destination); } else street_destination_announce=g_strdup(""); g_free(street_destination); if (cmd->itm->prev->way.flags & AF_ROUNDABOUT) { cur = cmd->itm->prev; count_roundabout = 0; while (cur && (cur->way.flags & AF_ROUNDABOUT)) { candidate_way=cur->next->way.next; while (candidate_way) { if (candidate_way && is_way_allowed(nav,candidate_way,3)) /* If the next segment has no exit or the exit isn't allowed, don't count it */ { count_roundabout++; /* As soon as we have an allowed one on this node, * stop further counting for this node. */ break; } candidate_way=candidate_way->next; } cur = cur->prev; } /*try to figure out if the entry node has a usable exit as well * * this will fail for left-hand driving areas */ if (cur && cur->next) { candidate_way=cur->next->way.next; while (candidate_way) { if (candidate_way && is_way_allowed(nav,candidate_way,3) /*&& (angle_delta(cur->angle_end,candidate_way->angle2) > 0) && ( angle_delta(candidate_way->angle2,cur->next->way.angle2) < 0 )*/) /*for right-hand traffic, exits should be to the right anyway to allow smooth turns, so leave this out until we find a counterexample :)*/ { count_roundabout++; /* As soon as we have an allowed one on this node, * stop further counting for this node. */ break; } candidate_way=candidate_way->next; } } switch (level) { case level_follow: d=get_distance_str(nav, distance, type, 1); return g_strdup_printf(_("Follow the road for the next %s"), d); case level_soon: return g_strdup(_("Enter the roundabout soon")); case level_meters: d = get_distance_str(nav, distance, attr_navigation_short, 0); /* TRANSLATORS: %s is the distance to the roundabout */ ret = g_strdup_printf(_("Enter the roundabout %s"), d); g_free(d); return ret; case level_connect: return g_strdup(_("then enter the roundabout")); case level_now: /* TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow */ return g_strdup_printf(_("Leave the roundabout at the %1$s %2$s"), get_exit_count_str(count_roundabout),street_destination_announce); default : dbg(lvl_error,"unexpected announcement level %d\n", level); return g_strdup_printf("internal error"); } } if (cmd->maneuver && cmd->maneuver->type) { if (cmd->itm->next) { if(type == attr_navigation_speech) { /* In voice mode */ /* In Voice Mode only tell the street name in level_meters or in level_ if level 1 was skipped */ if (level == level_meters) { /* we are close to the intersection */ cmd->itm->streetname_told = 1; /* remember to be checked when we turn */ tellstreetname = 1; /* Ok, so we tell the name of the street */ } else if (level == level_now) { if(cmd->itm->streetname_told == 0) /* we are right at the intersection */ tellstreetname = 1; else cmd->itm->streetname_told = 0; /* reset just in case we come to the same street again */ } else if (level == level_connect) { tellstreetname = 1; } } else tellstreetname = 1; } switch (level) { case level_soon : d=g_strdup(_("soon")); break; case level_meters : d=get_distance_str(nav, distance, attr_navigation_short, 0); break; case level_now : d=g_strdup(_("now")); break; case level_connect : d=g_strdup(_("then")); break; default : d = g_strdup(""); break; } if (tellstreetname) destination=navigation_item_destination(nav, cmd, itm, " "); else destination = g_strdup(""); if (!(cmd->maneuver->merge_or_exit == mex_none )) { char *exit_announce=NULL; /* interchange or exit announcement shall be a long distance information only. But if so, exit_label shall not be announced in case it is a substring of destination info to avoid redundancy and not let the sentence become too long. Otherwise, if there is no additional destination info, just say it at level_meters. */ if ((level == level_soon) || ((level == level_meters) && (!street_destination_announce && !destination)) || (type != attr_navigation_speech)) { exit_announce = navigation_cmd_get_exit_announce(cmd, street_destination_announce); } switch (cmd->maneuver->merge_or_exit) { case mex_merge_left: case mex_merge_right: if (cmd->maneuver->merge_or_exit == mex_merge_right) { if (level == level_connect) /* TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. */ instruction = g_strdup_printf(_("then merge%1$s|right"), destination); else /* TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. */ instruction = g_strdup_printf(_("Merge %1$s%2$s|right"), d, destination); } else { if (level == level_connect) /* TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. */ instruction = g_strdup_printf(_("then merge%1$s|left"), destination); else /* TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. */ instruction = g_strdup_printf(_("Merge %1$s%2$s|left"), d, destination); } break; case mex_exit_left: case mex_exit_right: direction = (cmd->maneuver->merge_or_exit == mex_exit_left) ? g_strdup(_("on your left")) : g_strdup(_("on your right")); if (exit_announce) /* TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance */ instruction = g_strdup_printf(_("Take exit %1$s %2$s %3$s"), exit_announce, direction, d); else /* TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination */ instruction = g_strdup_printf(_("Take the exit %1$s %2$s%3$s"), direction, d, destination); break; } if (!instruction && exit_announce) { /* TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" */ at = g_strdup_printf(" %1$s %2$s", cmd->maneuver->merge_or_exit == mex_interchange ? (_("at interchange")) : (_( "at exit")), exit_announce ? exit_announce : ""); } g_free(exit_announce); } if (!instruction) { if (!at) at = g_strdup(""); switch (cmd->maneuver->type) { case type_nav_straight : if (level == level_connect) /* TRANSLATORS: the arg. is where to do the maneuver */ instruction = g_strdup_printf(_("then continue straight%1$s"), at); else /* TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination */ instruction = g_strdup_printf(_("Continue straight %1$s%2$s%3$s"), d, at, destination); break; case type_nav_keep_right : if (level == level_connect) /* TRANSLATORS: the arg. is where to do the maneuver */ instruction = g_strdup_printf(_("then keep right%1$s"), at); else /* TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination */ instruction = g_strdup_printf(_("Keep right %1$s%2$s%3$s"), d, at, destination); break; case type_nav_keep_left : if (level == level_connect) /* TRANSLATORS: the arg. is where to do the maneuver */ instruction = g_strdup_printf(_("then keep left%1$s"), at); else /* TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination */ instruction = g_strdup_printf(_("Keep left %1$s%2$s%3$s"), d, at, destination); break; case type_nav_right_1 : case type_nav_right_2 : case type_nav_right_3 : case type_nav_left_1 : case type_nav_left_2 : case type_nav_left_3 : /* generic turn case */ switch (cmd->maneuver->type) { case type_nav_right_1 : case type_nav_right_2 : case type_nav_right_3 : /* TRANSLATORS: "right" as in "turn right" */ direction = g_strdup(_("right")); if (level == level_now) skip_roads = count_possible_turns(nav, cmd->prev ? cmd->prev->itm : nav->first, cmd->itm, 90); else if (level == level_connect) /* Robotaxi: todo - must tidy up skip_roads == -1 issue */ skip_roads = count_possible_turns(nav, itm->next ? itm->next : itm, cmd->itm, 90); break; case type_nav_left_1 : case type_nav_left_2 : case type_nav_left_3 : /* TRANSLATORS: "left" as in "turn left" */ direction = g_strdup(_("left")); if (level == level_now) skip_roads = count_possible_turns(nav, cmd->prev ? cmd->prev->itm : nav->first, cmd->itm, -90); else if (level == level_connect) skip_roads = count_possible_turns(nav, itm->next ? itm->next : itm, cmd->itm, -90); break; default: direction = g_strdup(""); break; } switch (cmd->maneuver->type) { case type_nav_right_1 : case type_nav_left_1 : /* TRANSLATORS: as in "turn easily right" */ strength = g_strdup(_("easily ")); break; case type_nav_right_3 : case type_nav_left_3 : /* TRANSLATORS: as in "turn strongly right" */ strength = g_strdup(_("strongly ")); break; default: strength = g_strdup(""); break; } /* Robotaxi: todo - must tidy up skip_roads == -1 issue */ if (skip_roads > 0) { if (skip_roads < 6) { if (level == level_connect) instruction = g_strdup_printf(_("then take the %1$s road to the %2$s"), get_count_str(skip_roads+1), direction); else instruction = g_strdup_printf(_("Take the %1$s road to the %2$s"), get_count_str(skip_roads+1), direction); /*and preserve skip_roads to signal that we already have an instruction*/ } else { g_free(d); d=g_strdup_printf(_("after %i roads"),skip_roads); skip_roads = 0; /*signal an instruction still has to be created*/ } } /* cave: no else - may come from 'if (skip_roads)' above ! */ if (skip_roads <= 0) { /* TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination */ instruction = g_strdup_printf(_("Turn %1$s%2$s %3$s%4$s"), strength, direction, d, destination); } break; case type_nav_turnaround_left: if (level == level_connect) /* TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. */ instruction = g_strdup(_("then make a U-turn|left")); else /* TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. */ instruction = g_strdup_printf(_("Make a U-turn %1$s|left"), d); break; case type_nav_turnaround_right: if (level == level_connect) /* TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. */ instruction = g_strdup(_("then make a U-turn|right")); else /* TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. */ instruction = g_strdup_printf(_("Make a U-turn %1$s|right"), d); break; case type_nav_none: /*An empty placeholder that we can use in the future for * some motorway commands that are now suppressed but we * can in some cases make it say here : * 'follow destination blabla' without any further driving instructions, * in cases where relevant destination info is available. * Even if there is no driving command to be announced, in some cases * there is an overhead roadsign in preparation of an upcoming road-split, * and then we can give useful info to the driver. * * UNTESTED ! * */ instruction = g_strdup(_("follow")); break; case type_nav_destination: /* the old code used to clear the route destination when this was the only * instruction left. Was that useful ? * Should be tested with the old code what happens if the driver * 'overshoots' the destination and the route destination is already cleared. * I suppose it will now keep guiding the user to destination untill another one * is set or a 'stop navigation' action is done using the gui. */ if (level == level_connect) instruction=g_strdup(_("then you have reached your destination.")); else /* TRANSLATORS: the arg. is distance */ instruction=g_strdup_printf(_("You have reached your destination %s"), d); break; default: dbg(lvl_error,"unhandled instruction\n"); break; } } } switch (level) { case level_follow: d=get_distance_str(nav, distance, type, 1); ret=g_strdup_printf(_("Follow the road for the next %s"), d); break; case level_soon: if (at) /* 'at' contains interchange or exit information that shall not be combined with street_destination_announce */ ret= g_strdup_printf(("%1$s %2$s"),instruction,""); else ret= g_strdup_printf(("%1$s %2$s"),instruction,street_destination_announce); break; case level_meters: case level_connect: case level_now: ret= g_strdup_printf(("%1$s %2$s"),instruction,street_destination_announce); break; default : ret= g_strdup_printf(("%1$s %2$s"),instruction,street_destination_announce); dbg(lvl_error,"unexpected announcement level %d\n", level); break; } g_free(at); g_free(d); g_free(destination); g_free(direction); g_free(instruction); g_free(street_destination_announce); g_free(strength); return ret; } /** * @brief Creates announcements for maneuvers, plus maneuvers immediately following the next maneuver * * This function creates an announcement for the current maneuver and for maneuvers * immediately following that maneuver, if these are very close and we're in speech navigation. * The actual announcements are created by calling {@code show_maneuver()}. * * @param nav The navigation object * @param itm The current navigation item, which is used to determine the distance to the next * maneuver. In speech mode this should be set to the navigation item starting at the vehicle's * current position; in route description mode this should be set to the {@code navigation_item} * associated with the previous {@code navigation_command} * @param cmd The {@code navigation_command} for which to generate an announcement * @param type The type of announcements to generate. If set to {@code attr_navigation_speech}, * maneuvers will be grouped ("turn left, then turn right") if we are close to the first maneuver * and the second maneuver is within a short distance from the first. This parameter is passed to * {@code show_maneuver()}, where it is evaluated again. See {@code show_maneuver()} for details. * * @return An announcement that should be made */ static char * show_next_maneuvers(struct navigation *nav, struct navigation_itm *itm, struct navigation_command *cmd, enum attr_type type) { int distance = itm->dest_length-cmd->itm->dest_length; /* distance from e.g. current GPS position to next announced turn position */ enum announcement_level level; char *ret,*buf,*next; if (type != attr_navigation_speech) { return show_maneuver(nav, itm, cmd, type, level_meters); /* We only accumulate maneuvers in speech navigation */ } level = navigation_get_announce_level_cmd(nav, itm, cmd, distance-cmd->length); if (level > level_soon) { /* suppress the 'follow the road..' announcement, if the next 'soon' announcement is just a few meters away, so just quit */ if ((distance - cmd->length) < (nav->announce[itm->way.item.type - route_item_first][2] + 2 * nav->announce[itm->way.item.type - route_item_first][0])) { /* a few meters away is defined by two times the distance of the 'now'-distance. */ return g_strdup(""); } } else if ((level == level_soon) && (itm->told == 1)) { /* suppress the 'soon' announcement, if the last announcement already concatenated this, so just quit */ return g_strdup(""); } else if ((level == level_meters) && (itm->told == 1)) { /* suppress the 'in xx meters..' announcement, if the 'soon' announcement is just a few meters away, so just quit */ if ((distance - cmd->length) < (nav->announce[itm->way.item.type - route_item_first][1] + 2 * nav->announce[itm->way.item.type - route_item_first][0])) { /* a few meters away is defined by two times the distance of the 'now'-distance. */ return g_strdup(""); } } ret = show_maneuver(nav, itm, cmd, type, level); if (level > level_meters) { return ret; /* We only concatenate maneuvers that are close each other, so quit here */ } if (cmd->next && cmd->itm) { /* determine the level of the command that comes immediately after that. */ enum announcement_level nextlevel = navigation_get_announce_level(nav, cmd->itm->way.item.type, cmd->itm->dest_length - cmd->next->itm->dest_length); /* If this level starts with 1 or 0 concatenate the following announcement to the current: */ if (nextlevel <= level_soon) { next = show_maneuver(nav, cmd->itm, cmd->next, type, level_connect); if (*next != '\0') /* is the second announcement not an empty string? */ { cmd->itm->told = 1; buf = ret; ret = g_strdup_printf("%s, %s", buf, next); /* concatenate both announcements */ g_free(buf); } g_free(next); } } return ret; } static void navigation_call_callbacks(struct navigation *this_, int force_speech) { int distance, level = 0; void *p=this_; if (!this_->cmd_first) return; callback_list_call(this_->callback, 1, &p); dbg(lvl_debug,"force_speech=%d turn_around=%d turn_around_limit=%d\n", force_speech, this_->turn_around, this_->turn_around_limit); distance=this_->first->dest_length-this_->cmd_first->itm->dest_length; if (this_->turn_around_limit && this_->turn_around == this_->turn_around_limit) { dbg(lvl_debug,"distance=%d distance_turn=%d\n", distance, this_->distance_turn); while (distance > this_->distance_turn) { this_->level_last=4; level=4; force_speech=2; if (this_->distance_turn >= 500) this_->distance_turn*=2; else this_->distance_turn=500; } } else if (!this_->turn_around_limit || this_->turn_around == -this_->turn_around_limit+1) { this_->distance_turn=50; distance-=this_->cmd_first->length; level=navigation_get_announce_level_cmd(this_, this_->first, this_->cmd_first, distance); if (level < this_->level_last) { /* only tell if the level is valid for more than 3 seconds */ int speed_distance=this_->first->speed*30/36; if (distance < speed_distance || navigation_get_announce_level_cmd(this_, this_->first, this_->cmd_first, distance-speed_distance) == level) { dbg(lvl_debug,"distance %d speed_distance %d\n",distance,speed_distance); dbg(lvl_debug,"level %d < %d\n", level, this_->level_last); this_->level_last=level; force_speech=3; } } if (!item_is_equal(this_->cmd_first->itm->way.item, this_->item_last)) { this_->item_last=this_->cmd_first->itm->way.item; if (this_->delay) this_->curr_delay=this_->delay; else force_speech=5; } else { if (this_->curr_delay) { this_->curr_delay--; if (!this_->curr_delay) force_speech=4; } } } if (force_speech) { this_->level_last=level; this_->curr_delay=0; dbg(lvl_debug,"force_speech=%d distance=%d level=%d type=0x%x\n", force_speech, distance, level, this_->first->way.item.type); callback_list_call(this_->callback_speech, 1, &p); } } /** * @brief Cleans up and initiates maneuver creation. * * This function is called by {@link navigation_update_idle(struct navigation *)} * after it has retrieved all objects from the route map. * * It will reset the navigation object's idle event/callback, deallocate some temporary objects and * reset the {@code busy} flag. Arguments correspond to those of * {@link navigation_update_idle(struct navigation *)}. * * @param this_ Points to the navigation object. After the function returns, its {@code map_rect} * member will no longer be valid. * @param cancel If true, only cleanup (deallocation of objects) will be done and no maneuvers will be generated. * If false, maneuvers will be generated. */ static void navigation_update_done(struct navigation *this_, int cancel) { int incr = 0; struct map_rect *mr = this_->route_mr; struct attr nav_status; if (this_->idle_ev) event_remove_idle(this_->idle_ev); if (this_->idle_cb) callback_destroy(this_->idle_cb); this_->idle_ev=NULL; this_->idle_cb=NULL; if (!cancel) { nav_status.type = attr_nav_status; nav_status.u.num = status_routing; if (!(this_->status_int & status_has_sitem)) navigation_destroy_itms_cmds(this_, NULL); else { if (!(this_->status_int & status_has_ritem)) { navigation_itm_new(this_, NULL); make_maneuvers(this_,this_->route); } calculate_dest_distance(this_, incr); profile(0,"end"); navigation_call_callbacks(this_, FALSE); } navigation_set_attr(this_, &nav_status); } /* * In order to ensure that route_mr holds either NULL or a valid pointer at any given time, * always pass a copy of it to map_rect_destroy() and set route_mr to NULL prior to calling * map_rect_destroy(). The reason is that map_rect_destroy() for a route map may indirectly * call navigation_update(), which will modify the same members. For the same reason, * status_int must be reset before the call to map_rect_destroy(). */ this_->status_int = status_none; this_->route_mr = NULL; map_rect_destroy(mr); } /** * @brief Idle callback function to retrieve items from the route map. * * @param this_ Points to the navigation object. The caller is responsible for initializing its * {@code route_mr} member. After processing completes, the {@code route_mr} member will no longer * be valid. */ static void navigation_update_idle(struct navigation *this_) { int count = 100; /* Maximum number of items retrieved in one run of this function. * This should be set low enough for each pass to complete in less * than a second even on low-performance devices. */ struct item *ritem; /* Holds an item from the route map */ struct item *sitem; /* Holds the item from the actual map which corresponds to ritem */ struct attr street_item, street_direction; struct navigation_itm *itm; /* Do not use the route_path_flag_cancel flag here because it is also used whenever * destinations or waypoints change, not just when the user stops navigation altogether */ if (!route_has_graph(this_->route)) { navigation_update_done(this_, 1); return; } while (count > 0) { if (!(ritem = map_rect_get_item(this_->route_mr))) { this_->status_int &= ~(status_has_ritem); break; } this_->status_int |= status_has_ritem; if ((ritem)->type == type_route_start && this_->turn_around > -this_->turn_around_limit+1) this_->turn_around--; if ((ritem)->type == type_route_start_reverse && this_->turn_around < this_->turn_around_limit) this_->turn_around++; if ((ritem)->type != type_street_route) continue; if ((!(this_->status_int & status_has_sitem)) && item_attr_get(ritem, attr_street_item, &street_item)) { this_->status_int |= status_has_sitem; if (!item_attr_get(ritem, attr_direction, &street_direction)) street_direction.u.num = 0; sitem = street_item.u.item; dbg(lvl_debug,"sitem=%p\n", sitem); itm = item_hash_lookup(this_->hash, sitem); dbg(lvl_info,"itm for item with id (0x%x,0x%x) is %p\n", sitem->id_hi, sitem->id_lo, itm); if (itm && itm->way.dir != street_direction.u.num) { dbg(lvl_info,"wrong direction\n"); itm = NULL; } navigation_destroy_itms_cmds(this_, itm); if (itm) { navigation_itm_update(itm, ritem); break; } dbg(lvl_debug,"not on track\n"); } navigation_itm_new(this_, ritem); count--; } if (count > 0) { /* if count > 0, one of the break conditions in the loop was true and we're done */ navigation_update_done(this_, 0); return; } } /** * @brief Event handler for changes to the route. * * This function is added to the callback list of the current route. It is called whenever the * status of the route changes and will either discard the current list of maneuvers or build a new * list. * * @param this_ The navigation object * @param route The route * @param attr The route status attribute */ static void navigation_update(struct navigation *this_, struct route *route, struct attr *attr) { struct map *map; struct attr vehicleprofile; struct attr nav_status; if (attr->type != attr_route_status) return; dbg(lvl_debug,"enter\n"); nav_status.type = attr_nav_status; switch(attr->u.num) { case route_status_not_found: nav_status.u.num = status_no_route; break; case route_status_no_destination: nav_status.u.num = status_no_destination; break; case route_status_destination_set: nav_status.u.num = status_position_wait; break; case route_status_building_path: case route_status_building_graph: case route_status_path_done_new: case route_status_path_done_incremental: nav_status.u.num = (this_->nav_status >= status_recalculating) ? status_recalculating : status_calculating; } navigation_set_attr(this_, &nav_status); if (attr->u.num == route_status_no_destination || attr->u.num == route_status_not_found || attr->u.num == route_status_path_done_new) navigation_flush(this_); if (attr->u.num != route_status_path_done_new && attr->u.num != route_status_path_done_incremental) { if (this_->status_int & status_busy) { navigation_update_done(this_, 1); } return; } if (! this_->route) return; map=route_get_map(this_->route); if (! map) return; this_->route_mr = map_rect_new(map, NULL); if (! this_->route_mr) return; if (route_get_attr(route, attr_vehicleprofile, &vehicleprofile, NULL)) this_->vehicleprofile=vehicleprofile.u.vehicleprofile; else this_->vehicleprofile=NULL; dbg(lvl_debug,"enter\n"); this_->status_int = status_busy; if (route_get_flags(this_->route) & route_path_flag_async) { this_->idle_cb = callback_new_1(callback_cast(navigation_update_idle), this_); this_->idle_ev = event_add_idle(50, this_->idle_cb); } else { this_->idle_ev = NULL; this_->idle_cb = NULL; while (this_->status_int & status_busy) navigation_update_idle(this_); } } static void navigation_flush(struct navigation *this_) { navigation_destroy_itms_cmds(this_, NULL); } void navigation_destroy(struct navigation *this_) { navigation_flush(this_); item_hash_destroy(this_->hash); callback_list_destroy(this_->callback); callback_list_destroy(this_->callback_speech); g_free(this_); } /** * @brief Registers a new callback function. * * Callback functions are called whenever the attribute for which they are registered changes. * It is possible to register callbacks for {@code attr_any}, which will fire on any change. * * The {@code navigation} object has three callback lists. They differ by the arguments which are * passed to the callback function and are selected based on the attribute type: *
    *
  • Callbacks for the {@code navigation_speech} attribute are added to the * {@code callback_speech} list.
  • *
  • Callbacks for the {@code navigation_long} attribute are added to the {@code callback} list. *
  • *
  • Callbacks for any other attribute, including {@code attr_any}, are added to the list stored * in the {@code callback_list} attribute. This functionality is inherited from * {@code navit_object}.
  • *
* * @param this_ The navigation object. * @param type The attribute type * @param cb The callback function * * @return true on success, false on failure */ int navigation_register_callback(struct navigation *this_, enum attr_type type, struct callback *cb) { struct attr attr_cbl; if (type == attr_navigation_speech) callback_list_add(this_->callback_speech, cb); else if (type == attr_navigation_long) callback_list_add(this_->callback, cb); else { if (navigation_get_attr(this_, attr_callback_list, &attr_cbl, NULL)) callback_list_add(attr_cbl.u.callback_list, cb); else return 0; } return 1; } /** * @brief Unregisters a callback function. * * This function removes a previously registered callback function from the callback list to which * it was added. See the documentation on * {@link navigation_register_callback(struct navigation *, enum attr_type, struct callback *)} for * details on callback lists. * * @param this_ The navigation object. * @param type The attribute type * @param cb The callback function */ void navigation_unregister_callback(struct navigation *this_, enum attr_type type, struct callback *cb) { struct attr attr_cbl; if (type == attr_navigation_speech) callback_list_remove(this_->callback_speech, cb); else if (type == attr_navigation_long) callback_list_remove(this_->callback, cb); else if (navigation_get_attr(this_, attr_callback_list, &attr_cbl, NULL)) callback_list_remove(attr_cbl.u.callback_list, cb); } struct map * navigation_get_map(struct navigation *this_) { struct attr *attrs[5]; struct attr type,navigation,data,description; type.type=attr_type; type.u.str="navigation"; navigation.type=attr_navigation; navigation.u.navigation=this_; data.type=attr_data; data.u.str=""; description.type=attr_description; description.u.str="Navigation"; attrs[0]=&type; attrs[1]=&navigation; attrs[2]=&data; attrs[3]=&description; attrs[4]=NULL; if (! this_->map) this_->map=map_new(NULL, attrs); return this_->map; } struct map_priv { struct navigation *navigation; }; struct map_rect_priv { struct navigation *nav; struct navigation_command *cmd; struct navigation_command *cmd_next; struct navigation_itm *itm; struct navigation_itm *itm_next; struct navigation_itm *cmd_itm; struct navigation_itm *cmd_itm_next; struct item item; enum attr_type attr_next; int ccount; int debug_idx; struct navigation_way *ways; int show_all; char *str; }; static int navigation_map_item_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *this=priv_data; if (this->ccount || ! count) return 0; *c=this->itm->start; this->ccount=1; return 1; } static void navigation_map_item_coord_rewind(void *priv_data) { struct map_rect_priv *this=priv_data; this->ccount=0; } static int navigation_map_item_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *this_=priv_data; struct navigation_command *cmd=this_->cmd; struct navigation_maneuver *maneuver = NULL; struct navigation_itm *itm=this_->itm; struct navigation_itm *prev=itm->prev; char *exit_announce=NULL; attr->type=attr_type; if (this_->str) { g_free(this_->str); this_->str=NULL; } if (cmd) { if (cmd->itm != itm) cmd=NULL; } if (cmd && cmd->maneuver) maneuver = cmd->maneuver; switch(attr_type) { case attr_level: if (cmd) { int distance=this_->cmd_itm->dest_length-cmd->itm->dest_length; distance=round_distance(distance); attr->u.num=navigation_get_announce_level(this_->nav, this_->cmd_itm->way.item.type, distance-cmd->length); return 1; } return 0; case attr_navigation_short: this_->attr_next=attr_navigation_long; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); return 1; } return 0; case attr_navigation_long: this_->attr_next=attr_navigation_long_exact; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); return 1; } return 0; case attr_navigation_long_exact: this_->attr_next=attr_navigation_speech; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); return 1; } return 0; case attr_navigation_speech: this_->attr_next=attr_length; if (cmd) { this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, this_->cmd, attr_type); return 1; } return 0; case attr_length: this_->attr_next=attr_time; if (cmd) { attr->u.num=this_->cmd_itm->dest_length-cmd->itm->dest_length; return 1; } return 0; case attr_time: this_->attr_next=attr_destination_length; if (cmd) { attr->u.num=this_->cmd_itm->dest_time-cmd->itm->dest_time; return 1; } return 0; case attr_destination_length: attr->u.num=itm->dest_length; this_->attr_next=attr_destination_time; return 1; case attr_destination_time: attr->u.num=itm->dest_time; this_->attr_next=attr_street_name; return 1; case attr_street_name: attr->u.str=itm->way.name; this_->attr_next=attr_street_name_systematic; if (attr->u.str){ return 1;} return 0; case attr_street_name_systematic: attr->u.str=itm->way.name_systematic; this_->attr_next=attr_street_destination; if (attr->u.str){ return 1;} return 0; case attr_street_destination: this_->attr_next=attr_name; if (cmd && itm->way.destination && itm->way.destination->destination) this_->str=attr->u.str=select_announced_destinations(cmd); else attr->u.str=NULL; if (attr->u.str){ return 1;} return 0; case attr_name: /* attr_name returns exit_ref and exit_label if available, * preceded by the word 'exit' or 'interchange'. * * Otherwise it returns street name and name_systematic, if available * * FIXME should a new attr. be defined for this, and if yes, which ? */ this_->attr_next=attr_debug; attr->u.str=NULL; exit_announce = navigation_cmd_get_exit_announce(cmd, NULL); if (exit_announce && maneuver) /* TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" */ this_->str=attr->u.str=g_strdup_printf("%s %s", maneuver->merge_or_exit & mex_interchange ? (_("Interchange")) : (_("Exit")), exit_announce ? exit_announce : ""); else if (itm->way.name || itm->way.name_systematic) this_->str=attr->u.str=g_strdup_printf("%s %s", itm->way.name ? itm->way.name : "",itm->way.name_systematic ? itm->way.name_systematic : ""); if (attr->u.str){ return 1;} return 0; case attr_debug: switch(this_->debug_idx) { case 0: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("angle:%d (- %d)", itm->way.angle2, itm->angle_end); return 1; case 1: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("item type:%s", item_to_name(itm->way.item.type)); return 1; case 2: this_->debug_idx++; if (cmd) { this_->str=attr->u.str=g_strdup_printf("delta:%d", cmd->delta); return 1; } case 3: this_->debug_idx++; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev street_name:%s", prev->way.name); return 1; } case 4: this_->debug_idx++; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev street_name_systematic:%s", prev->way.name_systematic); return 1; } case 5: this_->debug_idx++; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev angle:(%d -) %d", prev->way.angle2, prev->angle_end); return 1; } case 6: this_->debug_idx++; this_->ways=itm->way.next; if (prev) { this_->str=attr->u.str=g_strdup_printf("prev item type:%s", item_to_name(prev->way.item.type)); return 1; } case 7: if (this_->ways && prev) { this_->str=attr->u.str=g_strdup_printf("other item angle:%d delta:%d flags:%d dir:%d type:%s id:(0x%x,0x%x)", this_->ways->angle2, angle_delta(prev->angle_end, this_->ways->angle2), this_->ways->flags, this_->ways->dir, item_to_name(this_->ways->item.type), this_->ways->item.id_hi, this_->ways->item.id_lo); this_->ways=this_->ways->next; return 1; } this_->debug_idx++; case 8: this_->debug_idx++; if (prev) { struct navigation_maneuver *maneuver = NULL; maneuver_required2(this_->nav, prev, itm, &maneuver); this_->str=attr->u.str=g_strdup_printf("type: %s, is_complex_t_junction: %d, is_same_street: %d, is_unambiguous: %d, merge_or_exit: %d, old_cat: %d, new_cat: %d, max_cat: %d, num_options: %d, num_similar_ways: %d, num_new_motorways: %d, num_other_ways: %d, left: %d, right: %d, delta: %d", item_to_name(maneuver->type), maneuver->is_complex_t_junction, maneuver->is_same_street, maneuver->is_unambiguous, maneuver->merge_or_exit, maneuver->old_cat, maneuver->new_cat, maneuver->max_cat, maneuver->num_options, maneuver->num_similar_ways, maneuver->num_new_motorways, maneuver->num_other_ways, maneuver->left, maneuver->right, maneuver->delta); return 1; } default: this_->attr_next=attr_none; return 0; } case attr_any: while (this_->attr_next != attr_none) { if (navigation_map_item_attr_get(priv_data, this_->attr_next, attr)) return 1; } return 0; default: attr->type=attr_none; return 0; } } static void navigation_map_item_attr_rewind(void *priv_data) { struct map_rect_priv *priv = priv_data; priv->debug_idx=0; priv->attr_next=attr_navigation_short; } static struct item_methods navigation_map_item_methods = { navigation_map_item_coord_rewind, navigation_map_item_coord_get, navigation_map_item_attr_rewind, navigation_map_item_attr_get, }; static void navigation_map_destroy(struct map_priv *priv) { g_free(priv); } static void navigation_map_rect_init(struct map_rect_priv *priv) { priv->cmd_next=priv->nav->cmd_first; priv->cmd_itm_next=priv->itm_next=priv->nav->first; } static struct map_rect_priv * navigation_map_rect_new(struct map_priv *priv, struct map_selection *sel) { struct navigation *nav=priv->navigation; struct map_rect_priv *ret=g_new0(struct map_rect_priv, 1); ret->nav=nav; navigation_map_rect_init(ret); ret->item.meth=&navigation_map_item_methods; ret->item.priv_data=ret; #ifdef DEBUG ret->show_all=1; #endif return ret; } static void navigation_map_rect_destroy(struct map_rect_priv *priv) { g_free(priv->str); g_free(priv); } /** * @brief Gets the next item from the navigation map. * * This function returns an item from a map rectangle on the navigation map and advances the item pointer, * so that at the next call the next item will be returned. * * The {@code type} member of the result, which indicates the type of maneuver, is generally copied over from * {@code maneuver->type}, though some exceptions apply: The first item in the map will have a type of * {@code nav_position} and the last one will have a type of {@code nav_destination}. * If {@code maneuver->merge_or_exit} indicates a merge or exit, the result will be of the corresponding * merge or exit type. * * Earlier versions of Navit had the entire logic for setting the maneuver type in this function, but this has * been moved to {@code command_new()} so that other functions can use the same results. * * @param priv The {@code struct map_rect_priv} of the map rect on the navigation map from which an item * is to be retrieved. * * @return The item, or NULL if there are no more items in the map rectangle */ static struct item * navigation_map_get_item(struct map_rect_priv *priv) { struct item *ret=&priv->item; if (!priv->itm_next) return NULL; priv->itm=priv->itm_next; priv->cmd=priv->cmd_next; priv->cmd_itm=priv->cmd_itm_next; if (!priv->cmd) return NULL; if (!priv->show_all && priv->itm->prev != NULL) priv->itm=priv->cmd->itm; priv->itm_next=priv->itm->next; if (priv->itm->prev) ret->type=type_nav_none; else ret->type=type_nav_position; if (priv->cmd->itm == priv->itm) { priv->cmd_itm_next=priv->cmd->itm; priv->cmd_next=priv->cmd->next; if (priv->cmd_itm_next && !priv->cmd_itm_next->next) ret->type=type_nav_destination; /* FIXME: do we need to set that here? The generic case should catch that now... */ else if (priv->cmd->maneuver && ((priv->cmd->maneuver->type != type_nav_none) || (priv->cmd->maneuver->merge_or_exit & (mex_merge | mex_exit)))) { /* if maneuver type or merge_or_exit is set, use these values */ /* FIXME: make decision to use merge_or_exit context-dependent */ switch (priv->cmd->maneuver->merge_or_exit) { case mex_merge_left: ret->type=type_nav_merge_left; break; case mex_merge_right: ret->type=type_nav_merge_right; break; case mex_exit_left: ret->type=type_nav_exit_left; break; case mex_exit_right: ret->type=type_nav_exit_right; break; default: /* exit or merge without a direction should never happen, * mex_intersection results in a regular instruction, * thus all these are handled by the default case, * which is to return the type field */ ret->type = priv->cmd->maneuver->type; } } /* else if priv->cmd->maneuver ... */ } /* if priv->cmd->itm == priv->itm */ navigation_map_item_coord_rewind(priv); navigation_map_item_attr_rewind(priv); ret->id_lo=priv->itm->dest_count; dbg(lvl_debug,"type=%d\n", ret->type); return ret; } /** * @brief Gets the item with the specified ID from the navigation map. * * This function returns the item with the ID specified in the arguments from a map rectangle on the * navigation map. * * Internally the function calls {@code navigation_map_get_item()}, thus the same logic applies for the * data of the item that is returned. See {@code navigation_map_get_item()} for details. * * The item pointer of the map rectangle will be moved so that a subsequent call to {@code navigation_map_get_item()} * will return the next item following the one returned by this function. * * @param priv The {@code struct map_rect_priv} of the map rect on the navigation map from which an item * is to be retrieved. * @param id_hi The high part of the ID * @param id_lo The low part of the ID * * @return The item, or NULL if an item with the ID specified was not found in the map rectangle */ static struct item * navigation_map_get_item_byid(struct map_rect_priv *priv, int id_hi, int id_lo) { struct item *ret; navigation_map_rect_init(priv); while ((ret=navigation_map_get_item(priv))) { if (ret->id_hi == id_hi && ret->id_lo == id_lo) return ret; } return NULL; } static struct map_methods navigation_map_meth = { projection_mg, "utf-8", navigation_map_destroy, navigation_map_rect_new, navigation_map_rect_destroy, navigation_map_get_item, navigation_map_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * navigation_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *ret; struct attr *navigation_attr; navigation_attr=attr_search(attrs, NULL, attr_navigation); if (! navigation_attr) return NULL; ret=g_new0(struct map_priv, 1); *meth=navigation_map_meth; ret->navigation=navigation_attr->u.navigation; return ret; } void navigation_set_route(struct navigation *this_, struct route *route) { struct attr callback; if (!this_->route_cb) this_->route_cb=callback_new_attr_1(callback_cast(navigation_update), attr_route_status, this_); callback.type=attr_callback; callback.u.callback=this_->route_cb; if (this_->route) route_remove_attr(this_->route, &callback); this_->route=route; if (this_->route) { struct attr route_status; route_add_attr(this_->route, &callback); if (route_get_attr(this_->route, attr_route_status, &route_status, NULL)) navigation_update(this_, this_->route, &route_status); } } void navigation_init(void) { plugin_register_map_type("navigation", navigation_map_new); } struct object_func navigation_func = { attr_navigation, (object_func_new)navigation_new, (object_func_get_attr)navigation_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navigation_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)navigation_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/navigation.h000066400000000000000000000057721264204753600173700ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_NAVIGATION_H #define NAVIT_NAVIGATION_H #define FEET_PER_METER 3.2808399 #define FEET_PER_MILE 5280 #define METERS_PER_MILE 1609 #ifdef __cplusplus extern "C" { #endif /** * Values for the {@code nav_status} attribute */ enum nav_status { status_invalid = -2, /*!< Status is unknown. The {@code nav_status} attribute will never return this value but code that listens to changes to this attribute may use this value as a placeholder until the first actual status has been obtained. */ status_no_route = -1, /*!< No route was found */ status_no_destination = 0, /*!< No destination set, not routing */ status_position_wait = 1, /*!< Destination is set but current position is unknown */ status_calculating = 2, /*!< A new route is being calculated and turn instructions are being generated */ status_recalculating = 3, /*!< The existing route is being recalculated, along with its turn instructions. Note that as the vehicle follows a route, status will flip between {@code status_routing} and {@code status_recalculating} with every position update. */ status_routing = 4, /*!< A route with turn instructions has been calculated and the user is being guided along it */ }; /* prototypes */ enum attr_type; enum item_type; struct attr; struct attr_iter; struct callback; struct map; struct navigation; struct route; char *nav_status_to_text(int status); int navigation_get_attr(struct navigation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int navigation_set_attr(struct navigation *this_, struct attr *attr); struct navigation *navigation_new(struct attr *parent, struct attr **attrs); int navigation_set_announce(struct navigation *this_, enum item_type type, int *level); void navigation_destroy(struct navigation *this_); int navigation_register_callback(struct navigation *this_, enum attr_type type, struct callback *cb); void navigation_unregister_callback(struct navigation *this_, enum attr_type type, struct callback *cb); struct map *navigation_get_map(struct navigation *this_); void navigation_set_route(struct navigation *this_, struct route *route); void navigation_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/navit.c000066400000000000000000003043071264204753600163410ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _USE_MATH_DEFINES 1 #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #include "debug.h" #include "navit.h" #include "callback.h" #include "gui.h" #include "item.h" #include "xmlconfig.h" #include "projection.h" #include "map.h" #include "mapset.h" #include "main.h" #include "coord.h" #include "point.h" #include "transform.h" #include "param.h" #include "menu.h" #include "graphics.h" #include "popup.h" #include "data_window.h" #include "route.h" #include "navigation.h" #include "speech.h" #include "track.h" #include "vehicle.h" #include "layout.h" #include "log.h" #include "attr.h" #include "event.h" #include "file.h" #include "profile.h" #include "command.h" #include "navit_nls.h" #include "map.h" #include "util.h" #include "messages.h" #include "vehicleprofile.h" #include "sunriset.h" #include "bookmarks.h" #ifdef HAVE_API_WIN32_BASE #include #include "util.h" #endif #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif /* define string for bookmark handling */ #define TEXTFILE_COMMENT_NAVI_STOPPED "# navigation stopped\n" /** * @defgroup navit The navit core instance * @brief navit is the object containing most global data structures. * * Among others: * - a set of maps * - one or more vehicles * - a graphics object for rendering the map * - a gui object for displaying the user interface * - a route object * - a navigation object * @{ */ //! The vehicle used for navigation. struct navit_vehicle { int follow; /*! Limit of the follow counter. See navit_add_vehicle */ int follow_curr; /*! Deprecated : follow counter itself. When it reaches 'update' counts, map is recentered*/ struct coord coord; int dir; int speed; struct coord last; /*< Position of the last update of this vehicle */ struct vehicle *vehicle; struct attr callback; int animate_cursor; }; struct navit { NAVIT_OBJECT struct attr self; GList *mapsets; GList *layouts; struct gui *gui; struct layout *layout_current; struct graphics *gra; struct action *action; struct transformation *trans, *trans_cursor; struct compass *compass; struct route *route; struct navigation *navigation; struct speech *speech; struct tracking *tracking; int ready; struct window *win; struct displaylist *displaylist; int tracking_flag; int orientation; int recentdest_count; int osd_configuration; GList *vehicles; GList *windows_items; struct navit_vehicle *vehicle; struct callback_list *attr_cbl; struct callback *nav_speech_cb, *roadbook_callback, *popup_callback, *route_cb, *progress_cb; struct datawindow *roadbook_window; struct map *former_destination; struct point pressed, last, current; int button_pressed,moved,popped,zoomed; int center_timeout; int autozoom_secs; int autozoom_min; int autozoom_max; int autozoom_active; struct event_timeout *button_timeout, *motion_timeout; struct callback *motion_timeout_callback; int ignore_button; int ignore_graphics_events; struct log *textfile_debug_log; struct pcoord destination; int destination_valid; int blocked; /**< Whether draw operations are currently blocked. This can be a combination of the following flags: 1: draw operations are blocked 2: draw operations are pending, requiring a redraw once draw operations are unblocked */ int w,h; int drag_bitmap; int use_mousewheel; struct messagelist *messages; struct callback *resize_callback,*button_callback,*motion_callback,*predraw_callback; struct vehicleprofile *vehicleprofile; GList *vehicleprofiles; int pitch; int follow_cursor; int prevTs; int graphics_flags; int zoom_min, zoom_max; int radius; struct bookmarks *bookmarks; int flags; /* 1=No graphics ok */ /* 2=No gui ok */ int border; int imperial; int waypoints_flag; struct coord_geo center; }; struct gui *main_loop_gui; struct attr_iter { void *iter; union { GList *list; struct mapset_handle *mapset_handle; } u; }; static void navit_vehicle_update_position(struct navit *this_, struct navit_vehicle *nv); static void navit_vehicle_draw(struct navit *this_, struct navit_vehicle *nv, struct point *pnt); static int navit_add_vehicle(struct navit *this_, struct vehicle *v); static int navit_set_attr_do(struct navit *this_, struct attr *attr, int init); static int navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, int *dir); static void navit_set_cursors(struct navit *this_); static void navit_cmd_zoom_to_route(struct navit *this); static void navit_cmd_set_center_cursor(struct navit *this_); static void navit_cmd_announcer_toggle(struct navit *this_); static void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv); static int navit_set_vehicleprofile(struct navit *this_, struct vehicleprofile *vp); struct object_func navit_func; struct navit *global_navit; void navit_add_mapset(struct navit *this_, struct mapset *ms) { this_->mapsets = g_list_append(this_->mapsets, ms); } struct mapset * navit_get_mapset(struct navit *this_) { if(this_->mapsets){ return this_->mapsets->data; } else { dbg(lvl_error,"No mapsets enabled! Is it on purpose? Navit can't draw a map. Please check your navit.xml\n"); } return NULL; } struct tracking * navit_get_tracking(struct navit *this_) { return this_->tracking; } /** * @brief Get the user data directory. * @param[in] create - create the directory if it does not exist * * @return char * to the data directory string. * * returns the directory used to store user data files (center.txt, * destination.txt, bookmark.txt, ...) * */ char* navit_get_user_data_directory(int create) { char *dir; dir = getenv("NAVIT_USER_DATADIR"); if (create && !file_exists(dir)) { dbg(lvl_debug,"creating dir %s\n", dir); if (file_mkdir(dir,0)) { dbg(lvl_error,"failed creating dir %s\n", dir); return NULL; } } return dir; } void navit_draw_async(struct navit *this_, int async) { if (this_->blocked) { this_->blocked |= 2; return; } transform_setup_source_rect(this_->trans); graphics_draw(this_->gra, this_->displaylist, this_->mapsets->data, this_->trans, this_->layout_current, async, NULL, this_->graphics_flags|1); } void navit_draw(struct navit *this_) { if (this_->ready == 3) navit_draw_async(this_, 0); } int navit_get_ready(struct navit *this_) { return this_->ready; } void navit_draw_displaylist(struct navit *this_) { if (this_->ready == 3) graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layout_current, this_->graphics_flags|1); } static void navit_map_progress(struct navit *this_) { struct map *map; struct mapset *ms; struct mapset_handle *msh; struct attr attr; struct point p; if (this_->ready != 3) return; p.x=10; p.y=32; ms=this_->mapsets->data; msh=mapset_open(ms); while (msh && (map=mapset_next(msh, 0))) { if (map_get_attr(map, attr_progress, &attr, NULL)) { char *str=g_strdup_printf("%s ",attr.u.str); graphics_draw_mode(this_->gra, draw_mode_begin); graphics_draw_text_std(this_->gra, 16, str, &p); g_free(str); p.y+=32; graphics_draw_mode(this_->gra, draw_mode_end); } } mapset_close(msh); } static void navit_redraw_route(struct navit *this_, struct route *route, struct attr *attr) { int updated; if (attr->type != attr_route_status) return; updated=attr->u.num; if (this_->ready != 3) return; if (updated != route_status_path_done_new) return; if (this_->vehicle) { if (this_->vehicle->follow_curr == 1) return; if (this_->vehicle->follow_curr <= this_->vehicle->follow) this_->vehicle->follow_curr=this_->vehicle->follow; } navit_draw(this_); } void navit_handle_resize(struct navit *this_, int w, int h) { struct map_selection sel; int callback=(this_->ready == 1); this_->ready |= 2; memset(&sel, 0, sizeof(sel)); this_->w=w; this_->h=h; sel.u.p_rect.rl.x=w; sel.u.p_rect.rl.y=h; transform_set_screen_selection(this_->trans, &sel); graphics_init(this_->gra); graphics_set_rect(this_->gra, &sel.u.p_rect); if (callback) callback_list_call_attr_1(this_->attr_cbl, attr_graphics_ready, this_); if (this_->ready == 3) navit_draw_async(this_, 1); } static void navit_resize(void *data, int w, int h) { struct navit *this=data; if (!this->ignore_graphics_events) navit_handle_resize(this, w, h); } int navit_get_width(struct navit *this_) { return this_->w; } int navit_get_height(struct navit *this_) { return this_->h; } static void navit_popup(void *data) { struct navit *this_=data; popup(this_, 1, &this_->pressed); this_->button_timeout=NULL; this_->popped=1; } /** * @brief Sets a flag indicating that the current button event should be ignored by subsequent handlers. * * Calling this function will set the {@code ignore_button} member to {@code true} and return its previous state. * The default handler, {@link navit_handle_button(navit *, int, int, point *, callback *)} calls this function * just before the actual event handling core and aborts if the result is {@code true}. In order to prevent * multiple handlers from firing on a single event, custom button click handlers should implement the same logic * for events they wish to handle. * * If a handler wishes to pass down an event to other handlers, it must abort without calling this function. * * @param this_ The navit instance * @return {@code true} if the caller should ignore the button event, {@code false} if it should handle it */ int navit_ignore_button(struct navit *this_) { if (this_->ignore_button) return 1; this_->ignore_button=1; return 0; } void navit_ignore_graphics_events(struct navit *this_, int ignore) { this_->ignore_graphics_events=ignore; } static int navit_restrict_to_range(int value, int min, int max){ if (value>max) { value = max; } if (valuex = navit_restrict_to_range(new_center->x, WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MAX_X); new_center->y = navit_restrict_to_range(new_center->y, WORLD_BOUNDINGBOX_MIN_Y, WORLD_BOUNDINGBOX_MAX_Y); } /** * @brief Change map center position by translating from "old" to "new". */ static void update_transformation(struct transformation *tr, struct point *old, struct point *new) { /* Code for rotation was removed in rev. 5252; see Trac #1078. */ struct coord coord_old,coord_new; struct coord center_new,*center_old; if (!transform_reverse(tr, old, &coord_old)) return; if (!transform_reverse(tr, new, &coord_new)) return; center_old=transform_get_center(tr); center_new.x=center_old->x+coord_old.x-coord_new.x; center_new.y=center_old->y+coord_old.y-coord_new.y; navit_restrict_map_center_to_world_boundingbox(tr, ¢er_new); dbg(lvl_debug,"change center from 0x%x,0x%x to 0x%x,0x%x\n", center_old->x, center_old->y, center_new.x, center_new.y); transform_set_center(tr, ¢er_new); } void navit_set_timeout(struct navit *this_) { struct attr follow; follow.type=attr_follow; follow.u.num=this_->center_timeout; navit_set_attr(this_, &follow); } int navit_handle_button(struct navit *this_, int pressed, int button, struct point *p, struct callback *popup_callback) { int border=16; dbg(lvl_debug,"button %d %s (ignore: %d)\n",button,pressed?"pressed":"released",this_->ignore_button); callback_list_call_attr_4(this_->attr_cbl, attr_button, this_, GINT_TO_POINTER(pressed), GINT_TO_POINTER(button), p); if (this_->ignore_button) { this_->ignore_button=0; return 0; } if (pressed) { this_->pressed=*p; this_->last=*p; this_->zoomed=0; if (button == 1) { this_->button_pressed=1; this_->moved=0; this_->popped=0; if (popup_callback) this_->button_timeout=event_add_timeout(500, 0, popup_callback); } if (button == 2) navit_set_center_screen(this_, p, 1); if (button == 3) popup(this_, button, p); if (button == 4 && this_->use_mousewheel) { this_->zoomed = 1; navit_zoom_in(this_, 2, p); } if (button == 5 && this_->use_mousewheel) { this_->zoomed = 1; navit_zoom_out(this_, 2, p); } } else { this_->button_pressed=0; if (this_->button_timeout) { event_remove_timeout(this_->button_timeout); this_->button_timeout=NULL; if (! this_->moved && ! transform_within_border(this_->trans, p, border)) { navit_set_center_screen(this_, p, !this_->zoomed); } } if (this_->motion_timeout) { event_remove_timeout(this_->motion_timeout); this_->motion_timeout=NULL; } if (this_->moved) { dbg(lvl_debug, "mouse drag (%d, %d)->(%d, %d)\n", this_->pressed.x, this_->pressed.y, p->x, p->y); update_transformation(this_->trans, &this_->pressed, p); graphics_draw_drag(this_->gra, NULL); transform_copy(this_->trans, this_->trans_cursor); graphics_overlay_disable(this_->gra, 0); if (!this_->zoomed) navit_set_timeout(this_); navit_draw(this_); } else return 1; } return 0; } static void navit_button(void *data, int pressed, int button, struct point *p) { struct navit *this=data; dbg(lvl_debug,"enter %d %d ignore %d\n",pressed,button,this->ignore_graphics_events); if (!this->ignore_graphics_events) { if (! this->popup_callback) this->popup_callback=callback_new_1(callback_cast(navit_popup), this); navit_handle_button(this, pressed, button, p, this->popup_callback); } } static void navit_motion_timeout(struct navit *this_) { int dx, dy; if (this_->drag_bitmap) { struct point point; point.x=(this_->current.x-this_->pressed.x); point.y=(this_->current.y-this_->pressed.y); if (graphics_draw_drag(this_->gra, &point)) { graphics_overlay_disable(this_->gra, 1); graphics_draw_mode(this_->gra, draw_mode_end); this_->moved=1; this_->motion_timeout=NULL; return; } } dx=(this_->current.x-this_->last.x); dy=(this_->current.y-this_->last.y); if (dx || dy) { struct transformation *tr; this_->last=this_->current; graphics_overlay_disable(this_->gra, 1); tr=transform_dup(this_->trans); update_transformation(tr, &this_->pressed, &this_->current); graphics_draw_cancel(this_->gra, this_->displaylist); graphics_displaylist_draw(this_->gra, this_->displaylist, tr, this_->layout_current, this_->graphics_flags|512); transform_destroy(tr); this_->moved=1; } this_->motion_timeout=NULL; return; } void navit_handle_motion(struct navit *this_, struct point *p) { int dx, dy; if (this_->button_pressed && !this_->popped) { dx=(p->x-this_->pressed.x); dy=(p->y-this_->pressed.y); if (dx < -8 || dx > 8 || dy < -8 || dy > 8) { this_->moved=1; if (this_->button_timeout) { event_remove_timeout(this_->button_timeout); this_->button_timeout=NULL; } this_->current=*p; if (! this_->motion_timeout_callback) this_->motion_timeout_callback=callback_new_1(callback_cast(navit_motion_timeout), this_); if (! this_->motion_timeout) this_->motion_timeout=event_add_timeout(this_->drag_bitmap?10:100, 0, this_->motion_timeout_callback); } } } static void navit_motion(void *data, struct point *p) { struct navit *this=data; if (!this->ignore_graphics_events) navit_handle_motion(this, p); } static void navit_predraw(struct navit *this_) { GList *l; struct navit_vehicle *nv; transform_copy(this_->trans, this_->trans_cursor); l=this_->vehicles; while (l) { nv=l->data; navit_vehicle_draw(this_, nv, NULL); l=g_list_next(l); } } static void navit_scale(struct navit *this_, long scale, struct point *p, int draw) { struct coord c1, c2, *center; if (scale < this_->zoom_min) scale=this_->zoom_min; if (scale > this_->zoom_max) scale=this_->zoom_max; if (p) transform_reverse(this_->trans, p, &c1); transform_set_scale(this_->trans, scale); if (p) { transform_reverse(this_->trans, p, &c2); center = transform_center(this_->trans); center->x += c1.x - c2.x; center->y += c1.y - c2.y; } if (draw) navit_draw(this_); } /** * @brief Automatically adjusts zoom level * * This function automatically adjusts the current * zoom level according to the current speed. * * @param this_ The navit struct * @param center The "immovable" point - i.e. the vehicles position if we're centering on the vehicle * @param speed The vehicles speed in meters per second * @param dir The direction into which the vehicle moves */ static void navit_autozoom(struct navit *this_, struct coord *center, int speed, int draw) { struct point pc; int distance,w,h; double new_scale; long scale; if (! this_->autozoom_active) { return; } distance = speed * this_->autozoom_secs; transform_get_size(this_->trans, &w, &h); transform(this_->trans, transform_get_projection(this_->trans), center, &pc, 1, 0, 0, NULL); scale = transform_get_scale(this_->trans); /* We make sure that the point we want to see is within a certain range * around the vehicle. The radius of this circle is the size of the * screen. This doesn't necessarily mean the point is visible because of * perspective etc. Quite rough, but should be enough. */ if (w > h) { new_scale = (double)distance / h * 16; } else { new_scale = (double)distance / w * 16; } if (abs(new_scale - scale) < 2) { return; // Smoothing } if (new_scale > this_->autozoom_max) new_scale=this_->autozoom_max; if (new_scale < this_->autozoom_min) new_scale=this_->autozoom_min; if (new_scale != scale) navit_scale(this_, (long)new_scale, &pc, 0); } /** * Change the current zoom level, zooming closer to the ground * * @param navit The navit instance * @param factor The zoom factor, usually 2 * @param p The invariant point (if set to NULL, default to center) * @returns nothing */ void navit_zoom_in(struct navit *this_, int factor, struct point *p) { long scale=transform_get_scale(this_->trans)/factor; if (scale < 1) scale=1; navit_scale(this_, scale, p, 1); } /** * Change the current zoom level * * @param navit The navit instance * @param factor The zoom factor, usually 2 * @param p The invariant point (if set to NULL, default to center) * @returns nothing */ void navit_zoom_out(struct navit *this_, int factor, struct point *p) { long scale=transform_get_scale(this_->trans)*factor; navit_scale(this_, scale, p, 1); } void navit_zoom_in_cursor(struct navit *this_, int factor) { struct point p; if (this_->vehicle && this_->vehicle->follow_curr <= 1 && navit_get_cursor_pnt(this_, &p, 0, NULL)) { navit_zoom_in(this_, factor, &p); this_->vehicle->follow_curr=this_->vehicle->follow; } else navit_zoom_in(this_, factor, NULL); } void navit_zoom_out_cursor(struct navit *this_, int factor) { struct point p; if (this_->vehicle && this_->vehicle->follow_curr <= 1 && navit_get_cursor_pnt(this_, &p, 0, NULL)) { navit_zoom_out(this_, 2, &p); this_->vehicle->follow_curr=this_->vehicle->follow; } else navit_zoom_out(this_, 2, NULL); } static int navit_cmd_zoom_in(struct navit *this_) { navit_zoom_in_cursor(this_, 2); return 0; } static int navit_cmd_zoom_out(struct navit *this_) { navit_zoom_out_cursor(this_, 2); return 0; } static void navit_cmd_say(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) navit_say(this, in[0]->u.str); } static GHashTable *cmd_int_var_hash = NULL; static GHashTable *cmd_attr_var_hash = NULL; /** * Store key value pair for the command system (for int typed values) * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] is the key string, in[1] is the integer value to store * @param out output attributes, unused * @param valid unused * @returns nothing */ static void navit_cmd_set_int_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { char*key; struct attr*val; if(!cmd_int_var_hash) { cmd_int_var_hash = g_hash_table_new(g_str_hash, g_str_equal); } if ( (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) && (in && in[1] && ATTR_IS_NUMERIC(in[1]->type))) { val = g_new(struct attr,1); attr_dup_content(in[1],val); key = g_strdup(in[0]->u.str); g_hash_table_insert(cmd_int_var_hash, key, val); } } /** * Store key value pair for the command system (for attr typed values, can be used as opaque handles) * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] is the key string, in[1] is the attr* value to store * @param out output attributes, unused * @param valid unused * @returns nothing */ static void navit_cmd_set_attr_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { char*key; struct attr*val; if(!cmd_attr_var_hash) { cmd_attr_var_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)attr_free); } if ( (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) && (in && in[1] )) { val = attr_dup(in[1]); key = g_strdup(in[0]->u.str); g_hash_table_insert(cmd_attr_var_hash, key, val); } else { dbg(lvl_warning, "Wrong parameters for set_attr_var() command function\n"); } } /** * command to toggle the active state of a named layer of the current layout * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the name of the layer * @param out output unused * @param valid unused * @returns nothing */ static void navit_cmd_toggle_layer(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { if(this->layout_current && this->layout_current->layers) { GList* layers = this->layout_current->layers; while (layers) { struct layer*l=layers->data; if(l && !strcmp(l->name,in[0]->u.str) ) { l->active ^= 1; navit_draw(this); return; } layers=g_list_next(layers); } } } } /** * adds an item with the current coordinate of the vehicle to a named map * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the name of the map * @param out output attribute, 0 on error or the id of the created item on success * @param valid unused * @returns nothing */ static void navit_cmd_map_add_curr_pos(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); struct attr*val = g_new0(struct attr,1); struct mapset* ms; struct map_selection sel; const int selection_range = 10; enum item_type item_type; struct item *it; struct map* curr_map = NULL; struct coord curr_coord; struct map_rect *mr; //return invalid item on error val->type = attr_none; val->u.item = NULL; list[0] = val; list[1] = NULL; *out = list; if ( in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str && //map name in[1] && ATTR_IS_STRING(in[1]->type) && in[1]->u.str //item type ) { if(!(ms=navit_get_mapset(this))) { dbg(lvl_error, "Command function map_add_curr_pos(): there is no active mapset\n"); return; } if((item_type = item_from_name(in[1]->u.str))==type_none) { dbg(lvl_error, "Command function map_add_curr_pos(): unknown item type\n"); return; } curr_map = mapset_get_map_by_name(ms, in[0]->u.str); //no map with the given name found if( ! curr_map) { dbg(lvl_error, "Command function map_add_curr_pos(): map not found\n"); return; } if(this->vehicle && this->vehicle->vehicle ) { struct attr pos_attr; if(vehicle_get_attr(this->vehicle->vehicle,attr_position_coord_geo,&pos_attr,NULL)) { transform_from_geo(projection_mg, pos_attr.u.coord_geo, &curr_coord); } else { dbg(lvl_error, "Command function map_add_curr_pos(): vehicle position is not accessible\n"); return; } } else { dbg(lvl_error, "Command function map_add_curr_pos(): no vehicle\n"); return; } sel.next=NULL; sel.order=18; sel.range.min=type_none; sel.range.max=type_tec_common; sel.u.c_rect.lu.x=curr_coord.x-selection_range; sel.u.c_rect.lu.y=curr_coord.y+selection_range; sel.u.c_rect.rl.x=curr_coord.x+selection_range; sel.u.c_rect.rl.y=curr_coord.y-selection_range; mr = map_rect_new(curr_map, &sel); if(mr) { it = map_rect_create_item( mr, item_type); if (it) { struct attr attr; attr.type=attr_type_item_begin; attr.u.item=it; attr_dup_content(&attr,val); item_coord_set(it,&curr_coord, 1, change_mode_modify); } } map_rect_destroy(mr); } } /** * sets an attribute (name value pair) of a map item specified by map name and item id * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] - name of the map ; in[1] - item ; in[2] - attr name ; in[3] - attr value * @param out output attribute, 0 on error, 1 on success * @param valid unused * @returns nothing */ static void navit_cmd_map_item_set_attr(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if ( in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str &&//map name in[1] && ATTR_IS_ITEM(in[1]->type) && in[2]->u.item &&//item in[2] && ATTR_IS_STRING(in[2]->type) && in[2]->u.str && //attr_type str in[3] && ATTR_IS_STRING(in[3]->type) && in[3]->u.str //attr_value str ) { struct attr attr_to_set; struct map* curr_map = NULL; struct mapset *ms; struct item *it; struct map_rect *mr; if(ATTR_IS_STRING(attr_from_name(in[2]->u.str))) { attr_to_set.u.str = in[3]->u.str; attr_to_set.type = attr_from_name(in[2]->u.str); } else if(ATTR_IS_INT(attr_from_name(in[2]->u.str))) { attr_to_set.u.num = atoi(in[3]->u.str); attr_to_set.type = attr_from_name(in[2]->u.str); } else if(ATTR_IS_DOUBLE(attr_from_name(in[2]->u.str))) { double* val = g_new0(double,1); *val = atof(in[3]->u.str); attr_to_set.u.numd = val; attr_to_set.type = attr_from_name(in[2]->u.str); } ms = navit_get_mapset(this); curr_map = mapset_get_map_by_name(ms, in[0]->u.str); if( ! curr_map) { return; } mr=map_rect_new(curr_map,NULL); it=in[1]->u.item; it=map_rect_get_item_byid(mr,it->id_hi,it->id_lo); if(it) { item_attr_set(it, &attr_to_set, change_mode_modify); } map_rect_destroy(mr); } else { dbg(lvl_debug,"Error in command function item_set_attr()\n"); dbg(lvl_debug,"Command function item_set_attr(): map cond: %d\n",(in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str)?1:0); dbg(lvl_debug,"Command function item_set_attr(): item cond: %d\n",(in[1] && ATTR_IS_ITEM(in[1]->type))?1:0); dbg(lvl_debug,"Command function item_set_attr(): attr type cond: %d\n",(in[2] && ATTR_IS_STRING(in[2]->type) && in[2]->u.str)?1:0); dbg(lvl_debug,"Command function item_set_attr(): attr val cond: %d\n",(in[3] && ATTR_IS_STRING(in[3]->type) && in[3]->u.str)?1:0); } } /** * Get attr variable given a key string for the command system (for opaque usage) * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the key string * @param out output attribute, the attr for the given key string if exists or NULL * @param valid unused * @returns nothing */ static void navit_cmd_get_attr_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); list[1] = NULL; *out = list; if(!cmd_attr_var_hash) { struct attr*val = g_new0(struct attr,1); val->type = attr_type_item_begin; val->u.item = NULL; list[0] = val; return; } if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { struct attr*ret = g_hash_table_lookup(cmd_attr_var_hash, in[0]->u.str); if(ret) { list[0] = attr_dup(ret); } else { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.item = NULL; list[0] = val; } } } /** * Get value given a key string for the command system * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the key string * @param out output attribute, the value for the given key string if exists or 0 * @param valid unused * @returns nothing */ static void navit_cmd_get_int_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); list[1] = NULL; *out = list; if(!cmd_int_var_hash) { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.num = 0; list[0] = val; return; } if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { struct attr*ret = g_hash_table_lookup(cmd_int_var_hash, in[0]->u.str); if(ret) { list[0] = attr_dup(ret); } else { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.num = 0; list[0] = val; } } } GList *cmd_int_var_stack = NULL; /** * Push an integer to the stack for the command system * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attribute in[0] is the integer attibute to push * @param out output attributes, unused * @param valid unused * @returns nothing */ static void navit_cmd_push_int(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_NUMERIC(in[0]->type)) { struct attr*val = g_new(struct attr,1); attr_dup_content(in[0],val); cmd_int_var_stack = g_list_prepend(cmd_int_var_stack, val); } } /** * Pop an integer from the command system's integer stack * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes unused * @param out output attribute, the value popped if stack isn't empty or 0 * @param valid unused * @returns nothing */ static void navit_cmd_pop_int(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list = g_new0(struct attr *,2); if(!cmd_int_var_stack) { struct attr*val = g_new0(struct attr,1); val->type = attr_type_int_begin; val->u.num = 0; list[0] = val; } else { list[0] = cmd_int_var_stack->data; cmd_int_var_stack = g_list_remove_link(cmd_int_var_stack,cmd_int_var_stack); } list[1] = NULL; *out = list; } /** * Get current size of command system's integer stack * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes unused * @param out output attribute, the size of stack * @param valid unused * @returns nothing */ static void navit_cmd_int_stack_size(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr **list; struct attr *attr = g_new0(struct attr ,1); attr->type = attr_type_int_begin; if(!cmd_int_var_stack) { attr->u.num = 0; } else { attr->u.num = g_list_length(cmd_int_var_stack); } list = g_new0(struct attr *,2); list[0] = attr; list[1] = NULL; *out = list; cmd_int_var_stack = g_list_remove_link(cmd_int_var_stack,cmd_int_var_stack); } static struct attr ** navit_get_coord(struct navit *this, struct attr **in, struct pcoord *pc) { if (!in) return NULL; if (!in[0]) return NULL; pc->pro = transform_get_projection(this->trans); if (ATTR_IS_STRING(in[0]->type)) { struct coord c; coord_parse(in[0]->u.str, pc->pro, &c); pc->x=c.x; pc->y=c.y; in++; } else if (ATTR_IS_COORD(in[0]->type)) { pc->x=in[0]->u.coord->x; pc->y=in[0]->u.coord->y; in++; } else if (ATTR_IS_PCOORD(in[0]->type)) { *pc=*in[0]->u.pcoord; in++; } else if (in[1] && in[2] && ATTR_IS_INT(in[0]->type) && ATTR_IS_INT(in[1]->type) && ATTR_IS_INT(in[2]->type)) { pc->pro=in[0]->u.num; pc->x=in[1]->u.num; pc->y=in[2]->u.num; in+=3; } else if (in[1] && ATTR_IS_INT(in[0]->type) && ATTR_IS_INT(in[1]->type)) { pc->x=in[0]->u.num; pc->y=in[1]->u.num; in+=2; } else return NULL; return in; } static void navit_cmd_set_destination(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct pcoord pc; char *description=NULL; in=navit_get_coord(this, in, &pc); if (!in) return; if (in[0] && ATTR_IS_STRING(in[0]->type)) description=in[0]->u.str; navit_set_destination(this, &pc, description, 1); } static void navit_cmd_route_remove_next_waypoint(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { navit_remove_waypoint(this); } static void navit_cmd_route_remove_last_waypoint(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { navit_remove_nth_waypoint(this, navit_get_destination_count(this)-1); } static void navit_cmd_set_center(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct pcoord pc; int set_timeout=0; in=navit_get_coord(this, in, &pc); if (!in) return; if(in[0] && ATTR_IS_INT(in[0]->type)) set_timeout=in[0]->u.num!=0; navit_set_center(this, &pc, set_timeout); } static void navit_cmd_set_position(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct pcoord pc; in=navit_get_coord(this, in, &pc); if (!in) return; navit_set_position(this, &pc); } static void navit_cmd_fmt_coordinates(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr; attr.type=attr_type_string_begin; attr.u.str="Fix me"; if (out) { *out=attr_generic_add_attr(*out, &attr); } } /** * Join several string attributes into one * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] - separator, in[1..] - attributes to join * @param out output attribute joined attribute as string * @param valid unused * @returns nothing */ static void navit_cmd_strjoin(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr; gchar *ret, *sep; int i; attr.type=attr_type_string_begin; attr.u.str=NULL; if(in[0] && in[1]) { sep=attr_to_text(in[0],NULL,1); ret=attr_to_text(in[1],NULL,1); for(i=2;in[i];i++) { gchar *in_i=attr_to_text(in[i],NULL,1); gchar *r=g_strjoin(sep,ret,in_i,NULL); g_free(in_i); g_free(ret); ret=r; } g_free(sep); attr.u.str=ret; if(out) { *out=attr_generic_add_attr(*out, &attr); } g_free(ret); } } /** * Call external program * * @param navit The navit instance * @param function unused (needed to match command function signiture) * @param in input attributes in[0] - name of executable, in[1..] - parameters * @param out output attribute unused * @param valid unused * @returns nothing */ static void navit_cmd_spawn(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { int i,j, nparms, nvalid; char ** argv=NULL; struct spawn_process_info *pi; nparms=0; nvalid=0; if(in) { while(in[nparms]) { if (in[nparms]->type!=attr_none) nvalid++; nparms++; } } if(nvalid>0) { argv=g_new(char*,nvalid+1); for(i=0,j=0;in[i];i++) { if(in[i]->type!=attr_none ) { argv[j++]=attr_to_text(in[i],NULL,1); } else { dbg(lvl_debug,"Parameter #%i is attr_none - skipping\n",i); } } argv[j]=NULL; pi=spawn_process(argv); // spawn_process() testing suite - uncomment following code to test. //sleep(3); // example of non-blocking wait //int st=spawn_process_check_status(pi,0);dbg(lvl_debug,"status %i\n",st); // example of blocking wait //st=spawn_process_check_status(pi,1);dbg(lvl_debug,"status %i\n",st); // example of wait after process is finished and status is // already tested //st=spawn_process_check_status(pi,1);dbg(lvl_debug,"status %i\n",st); // example of wait after process is finished and status is // already tested - unblocked //st=spawn_process_check_status(pi,0);dbg(lvl_debug,"status %i\n",st); // End testing suite spawn_process_info_free(pi); for(i=0;argv[i];i++) g_free(argv[i]); g_free(argv); } } static struct command_table commands[] = { {"zoom_in",command_cast(navit_cmd_zoom_in)}, {"zoom_out",command_cast(navit_cmd_zoom_out)}, {"zoom_to_route",command_cast(navit_cmd_zoom_to_route)}, {"say",command_cast(navit_cmd_say)}, {"set_center",command_cast(navit_cmd_set_center)}, {"set_center_cursor",command_cast(navit_cmd_set_center_cursor)}, {"set_destination",command_cast(navit_cmd_set_destination)}, {"route_remove_next_waypoint",command_cast(navit_cmd_route_remove_next_waypoint)}, {"route_remove_last_waypoint",command_cast(navit_cmd_route_remove_last_waypoint)}, {"set_position",command_cast(navit_cmd_set_position)}, {"announcer_toggle",command_cast(navit_cmd_announcer_toggle)}, {"fmt_coordinates",command_cast(navit_cmd_fmt_coordinates)}, {"set_int_var",command_cast(navit_cmd_set_int_var)}, {"get_int_var",command_cast(navit_cmd_get_int_var)}, {"push_int",command_cast(navit_cmd_push_int)}, {"pop_int",command_cast(navit_cmd_pop_int)}, {"int_stack_size",command_cast(navit_cmd_int_stack_size)}, {"toggle_layer",command_cast(navit_cmd_toggle_layer)}, {"strjoin",command_cast(navit_cmd_strjoin)}, {"spawn",command_cast(navit_cmd_spawn)}, {"map_add_curr_pos",command_cast(navit_cmd_map_add_curr_pos)}, {"map_item_set_attr",command_cast(navit_cmd_map_item_set_attr)}, {"set_attr_var",command_cast(navit_cmd_set_attr_var)}, {"get_attr_var",command_cast(navit_cmd_get_attr_var)}, }; void navit_command_add_table(struct navit*this_, struct command_table *commands, int count) { command_add_table(this_->attr_cbl, commands, count, this_); } struct navit * navit_new(struct attr *parent, struct attr **attrs) { struct navit *this_=g_new0(struct navit, 1); struct pcoord center; struct coord co; struct coord_geo g; enum projection pro=projection_mg; int zoom = 256; g.lat=53.13; g.lng=11.70; this_->func=&navit_func; navit_object_ref((struct navit_object *)this_); this_->attrs=attr_list_dup(attrs); this_->self.type=attr_navit; this_->self.u.navit=this_; this_->attr_cbl=callback_list_new(); this_->orientation=-1; this_->tracking_flag=1; this_->recentdest_count=10; this_->osd_configuration=-1; this_->center_timeout = 10; this_->use_mousewheel = 1; this_->autozoom_secs = 10; this_->autozoom_min = 7; this_->autozoom_active = 0; this_->zoom_min = 1; this_->zoom_max = 2097152; this_->autozoom_max = this_->zoom_max; this_->follow_cursor = 1; this_->radius = 30; this_->border = 16; transform_from_geo(pro, &g, &co); center.x=co.x; center.y=co.y; center.pro = pro; this_->trans = transform_new(¢er, zoom, (this_->orientation != -1) ? this_->orientation : 0); this_->trans_cursor = transform_new(¢er, zoom, (this_->orientation != -1) ? this_->orientation : 0); this_->bookmarks=bookmarks_new(&this_->self, NULL, this_->trans); this_->prevTs=0; for (;*attrs; attrs++) { navit_set_attr_do(this_, *attrs, 1); } this_->displaylist=graphics_displaylist_new(); command_add_table(this_->attr_cbl, commands, sizeof(commands)/sizeof(struct command_table), this_); this_->messages = messagelist_new(attrs); dbg(lvl_debug,"return %p\n",this_); return this_; } static int navit_set_gui(struct navit *this_, struct gui *gui) { if (this_->gui) return 0; this_->gui=gui; if (gui_has_main_loop(this_->gui)) { if (! main_loop_gui) { main_loop_gui=this_->gui; } else { dbg(lvl_error,"gui with main loop already active, ignoring this instance"); return 0; } } return 1; } void navit_add_message(struct navit *this_, const char *message) { message_new(this_->messages, message); } struct message *navit_get_messages(struct navit *this_) { return message_get(this_->messages); } static int navit_set_graphics(struct navit *this_, struct graphics *gra) { if (this_->gra) return 0; this_->gra=gra; this_->resize_callback=callback_new_attr_1(callback_cast(navit_resize), attr_resize, this_); graphics_add_callback(gra, this_->resize_callback); this_->button_callback=callback_new_attr_1(callback_cast(navit_button), attr_button, this_); graphics_add_callback(gra, this_->button_callback); this_->motion_callback=callback_new_attr_1(callback_cast(navit_motion), attr_motion, this_); graphics_add_callback(gra, this_->motion_callback); this_->predraw_callback=callback_new_attr_1(callback_cast(navit_predraw), attr_predraw, this_); graphics_add_callback(gra, this_->predraw_callback); return 1; } struct graphics * navit_get_graphics(struct navit *this_) { return this_->gra; } struct vehicleprofile * navit_get_vehicleprofile(struct navit *this_) { return this_->vehicleprofile; } GList * navit_get_vehicleprofiles(struct navit *this_) { return this_->vehicleprofiles; } static void navit_projection_set(struct navit *this_, enum projection pro, int draw) { struct coord_geo g; struct coord *c; c=transform_center(this_->trans); transform_to_geo(transform_get_projection(this_->trans), c, &g); transform_set_projection(this_->trans, pro); transform_from_geo(pro, &g, c); if (draw) navit_draw(this_); } static void navit_mark_navigation_stopped(char *former_destination_file){ FILE *f; f=fopen(former_destination_file, "a"); if (f) { fprintf(f,"%s", TEXTFILE_COMMENT_NAVI_STOPPED); fclose(f); }else{ dbg(lvl_error, "Error setting mark in destination file %s: %s\n", former_destination_file, strerror(errno)); } } /** * Start or add a given set of coordinates for route computing * * @param navit The navit instance * @param c The coordinate to start routing to * @param description A label which allows the user to later identify this destination in the former destinations selection * @param async Set to 1 to do route calculation asynchronously * @return nothing */ void navit_set_destination(struct navit *this_, struct pcoord *c, const char *description, int async) { char *destination_file; destination_file = bookmarks_get_destination_file(TRUE); if (c) { this_->destination=*c; this_->destination_valid=1; dbg(lvl_debug, "c=(%i,%i)\n", c->x,c->y); bookmarks_append_destinations(this_->former_destination, destination_file, c, 1, type_former_destination, description, this_->recentdest_count); } else { this_->destination_valid=0; bookmarks_append_destinations(this_->former_destination, destination_file, NULL, 0, type_former_destination, NULL, this_->recentdest_count); navit_mark_navigation_stopped(destination_file); } g_free(destination_file); callback_list_call_attr_0(this_->attr_cbl, attr_destination); if (this_->route) { struct attr attr; int dstcount; struct pcoord *pc; navit_get_attr(this_, attr_waypoints_flag, &attr, NULL); if (this_->waypoints_flag==0 || route_get_destination_count(this_->route)==0){ route_set_destination(this_->route, c, async); }else{ route_append_destination(this_->route, c, async); } dstcount=route_get_destination_count(this_->route); if(dstcount>0) { destination_file = bookmarks_get_destination_file(TRUE); pc=g_new(struct pcoord,dstcount); route_get_destinations(this_->route,pc,dstcount); bookmarks_append_destinations(this_->former_destination, destination_file, pc, dstcount, type_former_itinerary, description, this_->recentdest_count); g_free(pc); g_free(destination_file); } if (this_->ready == 3 && !(this_->flags & 4)) navit_draw(this_); } } /** * Add destination description to the recent dest file. Doesn't start routing. * * @param navit The navit instance * @param c The coordinate to start routing to * @param description A label which allows the user to later identify this destination in the former destinations selection * @returns nothing */ void navit_add_destination_description(struct navit *this_, struct pcoord *c, const char *description) { char *destination_file; if (c) { destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, c, 1, type_former_destination, description, this_->recentdest_count); g_free(destination_file); } } /** * Start the route computing to a given set of coordinates including waypoints * * @param this_ The navit instance * @param c The coordinate to start routing to * @param description A label which allows the user to later identify this destination in the former destinations selection * @param async If routing should be done asynchronously * @returns nothing */ void navit_set_destinations(struct navit *this_, struct pcoord *c, int count, const char *description, int async) { char *destination_file; if (c && count) { this_->destination=c[count-1]; this_->destination_valid=1; destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, c, count, type_former_itinerary, description, this_->recentdest_count); g_free(destination_file); } else this_->destination_valid=0; callback_list_call_attr_0(this_->attr_cbl, attr_destination); if (this_->route) { route_set_destinations(this_->route, c, count, async); if (this_->ready == 3) navit_draw(this_); } } int navit_get_destinations(struct navit *this_, struct pcoord *pc, int count) { if(!this_->route) return 0; return route_get_destinations(this_->route, pc, count); } int navit_get_destination_count(struct navit *this_) { if(!this_->route) return 0; return route_get_destination_count(this_->route); } char* navit_get_destination_description(struct navit *this_, int n) { if(!this_->route) return NULL; return route_get_destination_description(this_->route, n); } void navit_remove_nth_waypoint(struct navit *this_, int n) { if(!this_->route) return; if (route_get_destination_count(this_->route)>1){ route_remove_nth_waypoint(this_->route, n); }else{ navit_set_destination(this_, NULL, NULL, 0); } } void navit_remove_waypoint(struct navit *this_) { if(!this_->route) return; if (route_get_destination_count(this_->route)>1){ route_remove_waypoint(this_->route); }else{ navit_set_destination(this_, NULL, NULL, 0); } } /** * @brief Checks if a route is calculated * * This function checks if a route is calculated. * * @param this_ The navit struct whose route should be checked. * @return True if the route is set, false otherwise. */ int navit_check_route(struct navit *this_) { if (this_->route) { return route_get_path_set(this_->route); } return 0; } static int navit_former_destinations_active(struct navit *this_) { char *destination_file_name = bookmarks_get_destination_file(FALSE); FILE *destination_file; int active=0; char lastline[100]; destination_file=fopen(destination_file_name,"r"); if (destination_file) { while(fgets(lastline, sizeof(lastline), destination_file)); fclose(destination_file); if ((lastline != NULL) && (strcmp(lastline, TEXTFILE_COMMENT_NAVI_STOPPED))){ active=1; } } g_free(destination_file_name); return active; } struct map* read_former_destinations_from_file(){ struct attr type, data, no_warn, flags, *attrs[5]; char *destination_file = bookmarks_get_destination_file(FALSE); struct map *m; type.type=attr_type; type.u.str="textfile"; data.type=attr_data; data.u.str=destination_file; no_warn.type=attr_no_warning_if_map_file_missing; no_warn.u.num=1; flags.type=attr_flags; flags.u.num=1; attrs[0]=&type; attrs[1]=&data; attrs[2]=&flags; attrs[3]=&no_warn; attrs[4]=NULL; m=map_new(NULL, attrs); g_free(destination_file); return m; } static void navit_add_former_destinations_from_file(struct navit *this_) { struct item *item; int i,valid=0,count=0,maxcount=1; struct coord *c=g_new(struct coord, maxcount); struct pcoord *pc; struct map_rect *mr; this_->former_destination=read_former_destinations_from_file(); if (!this_->route || !navit_former_destinations_active(this_) || !this_->vehicle) return; mr=map_rect_new(this_->former_destination, NULL); while ((item=map_rect_get_item(mr))) { if (item->type == type_former_itinerary || item->type == type_former_itinerary_part) { count=item_coord_get(item, c, maxcount); while(count==maxcount) { maxcount*=2; c=g_realloc(c, sizeof(struct coord)*maxcount); count+=item_coord_get(item, &c[count], maxcount-count); } if(count) valid=1; } } map_rect_destroy(mr); if (valid && count > 0) { pc=g_new(struct pcoord, count); for (i = 0 ; i < count ; i++) { pc[i].pro=map_projection(this_->former_destination); pc[i].x=c[i].x; pc[i].y=c[i].y; } if (count == 1) route_set_destination(this_->route, &pc[0], 1); else route_set_destinations(this_->route, pc, count, 1); this_->destination=pc[count-1]; this_->destination_valid=1; g_free(pc); } g_free(c); } void navit_textfile_debug_log(struct navit *this_, const char *fmt, ...) { va_list ap; char *str1,*str2; va_start(ap, fmt); if (this_->textfile_debug_log && this_->vehicle) { str1=g_strdup_vprintf(fmt, ap); str2=g_strdup_printf("0x%x 0x%x%s%s\n", this_->vehicle->coord.x, this_->vehicle->coord.y, strlen(str1) ? " " : "", str1); log_write(this_->textfile_debug_log, str2, strlen(str2), 0); g_free(str2); g_free(str1); } va_end(ap); } void navit_textfile_debug_log_at(struct navit *this_, struct pcoord *pc, const char *fmt, ...) { va_list ap; char *str1,*str2; va_start(ap, fmt); if (this_->textfile_debug_log && this_->vehicle) { str1=g_strdup_vprintf(fmt, ap); str2=g_strdup_printf("0x%x 0x%x%s%s\n", pc->x, pc->y, strlen(str1) ? " " : "", str1); log_write(this_->textfile_debug_log, str2, strlen(str2), 0); g_free(str2); g_free(str1); } va_end(ap); } void navit_say(struct navit *this_, const char *text) { struct attr attr; if(this_->speech) { if (!speech_get_attr(this_->speech, attr_active, &attr, NULL)) attr.u.num = 1; dbg(lvl_debug, "this_.speech->active %ld\n", attr.u.num); if(attr.u.num) speech_say(this_->speech, text); } } /** * @brief Toggles the navigation announcer for navit * @param this_ The navit object */ static void navit_cmd_announcer_toggle(struct navit *this_) { struct attr attr, speechattr; // search for the speech attribute if(!navit_get_attr(this_, attr_speech, &speechattr, NULL)) return; // find out if the corresponding attribute attr_active has been set if(speech_get_attr(speechattr.u.speech, attr_active, &attr, NULL)) { // flip it then... attr.u.num = !attr.u.num; } else { // otherwise disable it because voice is enabled by default attr.type = attr_active; attr.u.num = 0; } // apply the new state if(!speech_set_attr(speechattr.u.speech, &attr)) return; // announce that the speech attribute has changed callback_list_call_attr_1(this_->attr_cbl, attr_speech, this_); } void navit_speak(struct navit *this_) { struct navigation *nav=this_->navigation; struct map *map=NULL; struct map_rect *mr=NULL; struct item *item; struct attr attr; if (!speech_get_attr(this_->speech, attr_active, &attr, NULL)) attr.u.num = 1; dbg(lvl_debug, "this_.speech->active %ld\n", attr.u.num); if(!attr.u.num) return; if (nav) map=navigation_get_map(nav); if (map) mr=map_rect_new(map, NULL); if (mr) { while ((item=map_rect_get_item(mr)) && (item->type == type_nav_position || item->type == type_nav_none)); if (item && item_attr_get(item, attr_navigation_speech, &attr)) { if (*attr.u.str != '\0') { speech_say(this_->speech, attr.u.str); navit_add_message(this_, attr.u.str); } navit_textfile_debug_log(this_, "type=announcement label=\"%s\"", attr.u.str); } map_rect_destroy(mr); } } static void navit_window_roadbook_update(struct navit *this_) { struct navigation *nav=this_->navigation; struct map *map=NULL; struct map_rect *mr=NULL; struct item *item; struct attr attr; struct param_list param[5]; int secs; dbg(lvl_debug,"enter\n"); datawindow_mode(this_->roadbook_window, 1); if (nav) map=navigation_get_map(nav); if (map) mr=map_rect_new(map, NULL); dbg(lvl_debug,"nav=%p map=%p mr=%p\n", nav, map, mr); if (mr) { dbg(lvl_debug,"while loop\n"); while ((item=map_rect_get_item(mr))) { dbg(lvl_debug,"item=%p\n", item); attr.u.str=NULL; if (item->type != type_nav_position) { item_attr_get(item, attr_navigation_long, &attr); if (attr.u.str == NULL) { continue; } dbg(lvl_info, "Command='%s'\n", attr.u.str); param[0].value=g_strdup(attr.u.str); } else param[0].value=_("Position"); param[0].name=_("Command"); item_attr_get(item, attr_length, &attr); dbg(lvl_info, "Length=%ld\n", attr.u.num); param[1].name=_("Length"); if ( attr.u.num >= 2000 ) { param[1].value=g_strdup_printf("%5.1f %s",(float)attr.u.num / 1000, _("km") ); } else { param[1].value=g_strdup_printf("%7ld %s",attr.u.num, _("m")); } item_attr_get(item, attr_time, &attr); dbg(lvl_info, "Time=%ld\n", attr.u.num); secs=attr.u.num/10; param[2].name=_("Time"); if ( secs >= 3600 ) { param[2].value=g_strdup_printf("%d:%02d:%02d",secs / 60, ( secs / 60 ) % 60 , secs % 60); } else { param[2].value=g_strdup_printf("%d:%02d",secs / 60, secs % 60); } item_attr_get(item, attr_destination_length, &attr); dbg(lvl_info, "Destlength=%ld\n", attr.u.num); param[3].name=_("Destination Length"); if ( attr.u.num >= 2000 ) { param[3].value=g_strdup_printf("%5.1f %s",(float)attr.u.num / 1000, _("km") ); } else { param[3].value=g_strdup_printf("%ld %s",attr.u.num, _("m")); } item_attr_get(item, attr_destination_time, &attr); dbg(lvl_info, "Desttime=%ld\n", attr.u.num); secs=attr.u.num/10; param[4].name=_("Destination Time"); if ( secs >= 3600 ) { param[4].value=g_strdup_printf("%d:%02d:%02d",secs / 3600, (secs / 60 ) % 60 , secs % 60); } else { param[4].value=g_strdup_printf("%d:%02d",secs / 60, secs % 60); } datawindow_add(this_->roadbook_window, param, 5); } map_rect_destroy(mr); } datawindow_mode(this_->roadbook_window, 0); } void navit_window_roadbook_destroy(struct navit *this_) { dbg(lvl_debug, "enter\n"); navigation_unregister_callback(this_->navigation, attr_navigation_long, this_->roadbook_callback); callback_destroy(this_->roadbook_callback); this_->roadbook_window=NULL; this_->roadbook_callback=NULL; } void navit_window_roadbook_new(struct navit *this_) { if (!this_->gui || this_->roadbook_callback || this_->roadbook_window) { return; } this_->roadbook_callback=callback_new_1(callback_cast(navit_window_roadbook_update), this_); navigation_register_callback(this_->navigation, attr_navigation_long, this_->roadbook_callback); this_->roadbook_window=gui_datawindow_new(this_->gui, _("Roadbook"), NULL, callback_new_1(callback_cast(navit_window_roadbook_destroy), this_)); navit_window_roadbook_update(this_); } void navit_init(struct navit *this_) { struct mapset *ms; struct map *map; int callback; char *center_file; dbg(lvl_info,"enter gui %p graphics %p\n",this_->gui,this_->gra); if (!this_->gui && !(this_->flags & 2)) { dbg(lvl_error,"Warning: No GUI available.\n"); return; } if (!this_->gra && !(this_->flags & 1)) { dbg(lvl_error,"Warning: No graphics subsystem available.\n"); return; } dbg(lvl_info,"Connecting gui to graphics\n"); if (this_->gui && this_->gra && gui_set_graphics(this_->gui, this_->gra)) { struct attr attr_type_gui, attr_type_graphics; gui_get_attr(this_->gui, attr_type, &attr_type_gui, NULL); graphics_get_attr(this_->gra, attr_type, &attr_type_graphics, NULL); dbg(lvl_error,"failed to connect graphics '%s' to gui '%s'\n", attr_type_graphics.u.str, attr_type_gui.u.str); dbg(lvl_error," Please see http://wiki.navit-project.org/index.php/Failed_to_connect_graphics_to_gui\n"); dbg(lvl_error," for explanations and solutions\n"); return; } if (this_->speech && this_->navigation) { struct attr speech; speech.type=attr_speech; speech.u.speech=this_->speech; navigation_set_attr(this_->navigation, &speech); } dbg(lvl_info,"Initializing graphics\n"); dbg(lvl_info,"Setting Vehicle\n"); navit_set_vehicle(this_, this_->vehicle); dbg(lvl_info,"Adding dynamic maps to mapset %p\n",this_->mapsets); if (this_->mapsets) { struct mapset_handle *msh; ms=this_->mapsets->data; this_->progress_cb=callback_new_attr_1(callback_cast(navit_map_progress), attr_progress, this_); msh=mapset_open(ms); while (msh && (map=mapset_next(msh, 0))) { //pass new callback instance for each map in the mapset to make map callback list destruction work correctly struct callback *pcb = callback_new_attr_1(callback_cast(navit_map_progress), attr_progress, this_); map_add_callback(map, pcb); } mapset_close(msh); if (this_->route) { if ((map=route_get_map(this_->route))) { struct attr map_a; map_a.type=attr_map; map_a.u.map=map; mapset_add_attr(ms, &map_a); } if ((map=route_get_graph_map(this_->route))) { struct attr map_a,active; map_a.type=attr_map; map_a.u.map=map; active.type=attr_active; active.u.num=0; mapset_add_attr(ms, &map_a); map_set_attr(map, &active); } route_set_mapset(this_->route, ms); route_set_projection(this_->route, transform_get_projection(this_->trans)); } if (this_->tracking) { tracking_set_mapset(this_->tracking, ms); if (this_->route) tracking_set_route(this_->tracking, this_->route); } if (this_->navigation) { if ((map=navigation_get_map(this_->navigation))) { struct attr map_a,active; map_a.type=attr_map; map_a.u.map=map; active.type=attr_active; active.u.num=0; mapset_add_attr(ms, &map_a); map_set_attr(map, &active); } } if (this_->tracking) { if ((map=tracking_get_map(this_->tracking))) { struct attr map_a,active; map_a.type=attr_map; map_a.u.map=map; active.type=attr_active; active.u.num=0; mapset_add_attr(ms, &map_a); map_set_attr(map, &active); } } navit_add_former_destinations_from_file(this_); } else { dbg(lvl_error, "FATAL: No mapset available. Please add a (valid) mapset to your configuration.\n"); exit(1); } if (this_->route) { struct attr callback; this_->route_cb=callback_new_attr_1(callback_cast(navit_redraw_route), attr_route_status, this_); callback.type=attr_callback; callback.u.callback=this_->route_cb; route_add_attr(this_->route, &callback); } if (this_->navigation) { if (this_->speech) { this_->nav_speech_cb=callback_new_1(callback_cast(navit_speak), this_); navigation_register_callback(this_->navigation, attr_navigation_speech, this_->nav_speech_cb); } if (this_->route) navigation_set_route(this_->navigation, this_->route); } dbg(lvl_info,"Setting Center\n"); center_file = bookmarks_get_center_file(FALSE); bookmarks_set_center_from_file(this_->bookmarks, center_file); g_free(center_file); global_navit=this_; messagelist_init(this_->messages); navit_set_cursors(this_); callback_list_call_attr_1(this_->attr_cbl, attr_navit, this_); callback=(this_->ready == 2); this_->ready|=1; dbg(lvl_info,"ready=%d\n",this_->ready); if (this_->ready == 3) navit_draw_async(this_, 1); if (callback) callback_list_call_attr_1(this_->attr_cbl, attr_graphics_ready, this_); } void navit_zoom_to_rect(struct navit *this_, struct coord_rect *r) { struct coord c; int w,h,scale=16; c.x=(r->rl.x+r->lu.x)/2; c.y=(r->rl.y+r->lu.y)/2; transform_set_center(this_->trans, &c); transform_get_size(this_->trans, &w, &h); dbg(lvl_debug,"center 0x%x,0x%x w %d h %d\n",c.x,c.y,w,h); dbg(lvl_debug,"%x,%x-%x,%x\n", r->lu.x,r->lu.y,r->rl.x,r->rl.y); while (scale < 1<<20) { struct point p1,p2; transform_set_scale(this_->trans, scale); transform_setup_source_rect(this_->trans); transform(this_->trans, transform_get_projection(this_->trans), &r->lu, &p1, 1, 0, 0, NULL); transform(this_->trans, transform_get_projection(this_->trans), &r->rl, &p2, 1, 0, 0, NULL); dbg(lvl_debug,"%d,%d-%d,%d\n",p1.x,p1.y,p2.x,p2.y); if (p1.x < 0 || p2.x < 0 || p1.x > w || p2.x > w || p1.y < 0 || p2.y < 0 || p1.y > h || p2.y > h) scale*=2; else break; } dbg(lvl_debug,"scale=%d (0x%x) of %d (0x%x)\n",scale,scale,1<<20,1<<20); if (this_->ready == 3) navit_draw_async(this_,0); } void navit_zoom_to_route(struct navit *this_, int orientation) { struct map *map; struct map_rect *mr=NULL; struct item *item; struct coord c; struct coord_rect r; int count=0; if (! this_->route) return; dbg(lvl_debug,"enter\n"); map=route_get_map(this_->route); dbg(lvl_debug,"map=%p\n",map); if (map) mr=map_rect_new(map, NULL); dbg(lvl_debug,"mr=%p\n",mr); if (mr) { while ((item=map_rect_get_item(mr))) { dbg(lvl_debug,"item=%s\n", item_to_name(item->type)); while (item_coord_get(item, &c, 1)) { dbg(lvl_debug,"coord\n"); if (!count) r.lu=r.rl=c; else coord_rect_extend(&r, &c); count++; } } map_rect_destroy(mr); } if (! count) return; if (orientation != -1) transform_set_yaw(this_->trans, orientation); navit_zoom_to_rect(this_, &r); } static void navit_cmd_zoom_to_route(struct navit *this) { navit_zoom_to_route(this, 0); } /** * Change the current zoom level * * @param navit The navit instance * @param center The point where to center the map, including its projection * @returns nothing */ void navit_set_center(struct navit *this_, struct pcoord *center, int set_timeout) { struct coord *c=transform_center(this_->trans); struct coord c1,c2; enum projection pro = transform_get_projection(this_->trans); if (pro != center->pro) { c1.x = center->x; c1.y = center->y; transform_from_to(&c1, center->pro, &c2, pro); } else { c2.x = center->x; c2.y = center->y; } *c=c2; if (set_timeout) navit_set_timeout(this_); if (this_->ready == 3) navit_draw(this_); } static void navit_set_center_coord_screen(struct navit *this_, struct coord *c, struct point *p, int set_timeout) { int width, height; struct point po; transform_set_center(this_->trans, c); transform_get_size(this_->trans, &width, &height); po.x=width/2; po.y=height/2; update_transformation(this_->trans, &po, p); if (set_timeout) navit_set_timeout(this_); } /** * Links all vehicles to a cursor depending on the current profile. * * @param this_ A navit instance * @author Ralph Sennhauser (10/2009) */ static void navit_set_cursors(struct navit *this_) { struct attr name; struct navit_vehicle *nv; struct cursor *c; GList *v; v=g_list_first(this_->vehicles); // GList of navit_vehicles while (v) { nv=v->data; if (vehicle_get_attr(nv->vehicle, attr_cursorname, &name, NULL)) { if (!strcmp(name.u.str,"none")) c=NULL; else c=layout_get_cursor(this_->layout_current, name.u.str); } else c=layout_get_cursor(this_->layout_current, "default"); vehicle_set_cursor(nv->vehicle, c, 0); v=g_list_next(v); } return; } static int navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, int *dir) { int width, height; struct navit_vehicle *nv=this_->vehicle; float offset=this_->radius; // Cursor offset from the center of the screen (percent). #if 0 /* Better improve track.c to get that issue resolved or make it configurable with being off the default, the jumping back to the center is a bit annoying */ float min_offset = 0.; // Percent offset at min_offset_speed. float max_offset = 30.; // Percent offset at max_offset_speed. int min_offset_speed = 2; // Speed in km/h int max_offset_speed = 50; // Speed ini km/h // Calculate cursor offset from the center of the screen, upon speed. if (nv->speed <= min_offset_speed) { offset = min_offset; } else if (nv->speed > max_offset_speed) { offset = max_offset; } else { offset = (max_offset - min_offset) / (max_offset_speed - min_offset_speed) * (nv->speed - min_offset_speed); } #endif transform_get_size(this_->trans, &width, &height); if (this_->orientation == -1 || keep_orientation) { p->x=50*width/100; p->y=(50 + offset)*height/100; if (dir) *dir=keep_orientation?this_->orientation:nv->dir; } else { int mdir; if (this_->tracking && this_->tracking_flag) { mdir = tracking_get_angle(this_->tracking) - this_->orientation; } else { mdir=nv->dir-this_->orientation; } p->x=(50 - offset*sin(M_PI*mdir/180.))*width/100; p->y=(50 + offset*cos(M_PI*mdir/180.))*height/100; if (dir) *dir=this_->orientation; } return 1; } /** * @brief Recalculates the map view so that the vehicle cursor is visible * * This function recalculates the parameters which control the visible map area, zoom and orientation. The * caller is responsible for redrawing the map after the function returns. * * If the vehicle supplies a {@code position_valid} attribute and it is {@code attr_position_valid_invalid}, * the map position is not changed. * * @param this_ The navit object * @param autozoom Whether to set zoom based on current speed. If false, current zoom will be maintained. * @param keep_orientation Whether to maintain the current map orientation. If false, the map will be rotated * so that the bearing of the vehicle is up. */ void navit_set_center_cursor(struct navit *this_, int autozoom, int keep_orientation) { int dir; struct point pn; struct navit_vehicle *nv=this_->vehicle; struct attr attr; if (vehicle_get_attr(nv->vehicle, attr_position_valid, &attr, NULL) && (attr.u.num == attr_position_valid_invalid)) return; navit_get_cursor_pnt(this_, &pn, keep_orientation, &dir); transform_set_yaw(this_->trans, dir); navit_set_center_coord_screen(this_, &nv->coord, &pn, 0); if (autozoom) navit_autozoom(this_, &nv->coord, nv->speed, 0); } /** * @brief Recenters the map so that the vehicle cursor is visible * * This function first calls {@code navit_set_center_cursor()} to recalculate the map display, then * triggers a redraw of the map. * *@param this_ The navit object */ static void navit_set_center_cursor_draw(struct navit *this_) { navit_set_center_cursor(this_,1,0); if (this_->ready == 3) navit_draw_async(this_, 1); } /** * @brief Recenters the map so that the vehicle cursor is visible * * This is the callback function for the {@code set_center_cursor()} command. It is just a wrapper around * {@code navit_set_center_cursor_draw()}. * *@param this_ The navit object */ static void navit_cmd_set_center_cursor(struct navit *this_) { navit_set_center_cursor_draw(this_); } void navit_set_center_screen(struct navit *this_, struct point *p, int set_timeout) { struct coord c; struct pcoord pc; transform_reverse(this_->trans, p, &c); pc.x = c.x; pc.y = c.y; pc.pro = transform_get_projection(this_->trans); navit_set_center(this_, &pc, set_timeout); } static int navit_set_attr_do(struct navit *this_, struct attr *attr, int init) { int dir=0, orient_old=0, attr_updated=0; struct coord co; long zoom; GList *l; struct navit_vehicle *nv; struct layout *lay; struct attr active; active.type=attr_active; active.u.num=0; dbg(lvl_debug, "enter, this_=%p, attr=%p (%s), init=%d\n", this_, attr, attr_to_name(attr->type), init); switch (attr->type) { case attr_autozoom: attr_updated=(this_->autozoom_secs != attr->u.num); this_->autozoom_secs = attr->u.num; break; case attr_autozoom_active: attr_updated=(this_->autozoom_active != attr->u.num); this_->autozoom_active = attr->u.num; break; case attr_center: transform_from_geo(transform_get_projection(this_->trans), attr->u.coord_geo, &co); dbg(lvl_debug,"0x%x,0x%x\n",co.x,co.y); transform_set_center(this_->trans, &co); break; case attr_drag_bitmap: attr_updated=(this_->drag_bitmap != !!attr->u.num); this_->drag_bitmap=!!attr->u.num; break; case attr_flags: attr_updated=(this_->flags != attr->u.num); this_->flags=attr->u.num; break; case attr_flags_graphics: attr_updated=(this_->graphics_flags != attr->u.num); this_->graphics_flags=attr->u.num; break; case attr_follow: if (!this_->vehicle) return 0; attr_updated=(this_->vehicle->follow_curr != attr->u.num); this_->vehicle->follow_curr = attr->u.num; break; case attr_layout: if(!attr->u.layout) return 0; if(this_->layout_current!=attr->u.layout) { this_->layout_current=attr->u.layout; graphics_font_destroy_all(this_->gra); navit_set_cursors(this_); if (this_->ready == 3) navit_draw(this_); attr_updated=1; } break; case attr_layout_name: if(!attr->u.str) return 0; l=this_->layouts; while (l) { lay=l->data; if (!strcmp(lay->name,attr->u.str)) { struct attr attr; attr.type=attr_layout; attr.u.layout=lay; return navit_set_attr_do(this_, &attr, init); } l=g_list_next(l); } return 0; case attr_map_border: if (this_->border != attr->u.num) { this_->border=attr->u.num; attr_updated=1; } break; case attr_orientation: orient_old=this_->orientation; this_->orientation=attr->u.num; if (!init) { if (this_->orientation != -1) { dir = this_->orientation; } else { if (this_->vehicle) { dir = this_->vehicle->dir; } } transform_set_yaw(this_->trans, dir); if (orient_old != this_->orientation) { #if 0 if (this_->ready == 3) navit_draw(this_); #endif attr_updated=1; } } break; case attr_osd_configuration: dbg(lvl_debug,"setting osd_configuration to %ld (was %d)\n", attr->u.num, this_->osd_configuration); attr_updated=(this_->osd_configuration != attr->u.num); this_->osd_configuration=attr->u.num; break; case attr_pitch: attr_updated=(this_->pitch != attr->u.num); this_->pitch=attr->u.num; transform_set_pitch(this_->trans, this_->pitch); if (!init && attr_updated && this_->ready == 3) navit_draw(this_); break; case attr_projection: if(this_->trans && transform_get_projection(this_->trans) != attr->u.projection) { navit_projection_set(this_, attr->u.projection, !init); attr_updated=1; } break; case attr_radius: attr_updated=(this_->radius != attr->u.num); this_->radius=attr->u.num; break; case attr_recent_dest: attr_updated=(this_->recentdest_count != attr->u.num); this_->recentdest_count=attr->u.num; break; case attr_speech: if(this_->speech && this_->speech != attr->u.speech) { attr_updated=1; this_->speech = attr->u.speech; } break; case attr_timeout: attr_updated=(this_->center_timeout != attr->u.num); this_->center_timeout = attr->u.num; break; case attr_tracking: attr_updated=(this_->tracking_flag != !!attr->u.num); this_->tracking_flag=!!attr->u.num; break; case attr_transformation: this_->trans=attr->u.transformation; break; case attr_use_mousewheel: attr_updated=(this_->use_mousewheel != !!attr->u.num); this_->use_mousewheel=!!attr->u.num; break; case attr_vehicle: if (!attr->u.vehicle) { if (this_->vehicle) { vehicle_set_attr(this_->vehicle->vehicle, &active); navit_set_vehicle(this_, NULL); attr_updated=1; } break; } l=this_->vehicles; while(l) { nv=l->data; if (nv->vehicle == attr->u.vehicle) { if (!this_->vehicle || this_->vehicle->vehicle != attr->u.vehicle) { if (this_->vehicle) vehicle_set_attr(this_->vehicle->vehicle, &active); active.u.num=1; vehicle_set_attr(nv->vehicle, &active); attr_updated=1; } navit_set_vehicle(this_, nv); } l=g_list_next(l); } break; case attr_vehicleprofile: attr_updated=navit_set_vehicleprofile(this_, attr->u.vehicleprofile); break; case attr_zoom: zoom=transform_get_scale(this_->trans); attr_updated=(zoom != attr->u.num); transform_set_scale(this_->trans, attr->u.num); if (attr_updated && !init) navit_draw(this_); break; case attr_zoom_min: attr_updated=(attr->u.num != this_->zoom_min); this_->zoom_min=attr->u.num; break; case attr_zoom_max: attr_updated=(attr->u.num != this_->zoom_max); this_->zoom_max=attr->u.num; break; case attr_message: navit_add_message(this_, attr->u.str); break; case attr_follow_cursor: attr_updated=(this_->follow_cursor != !!attr->u.num); this_->follow_cursor=!!attr->u.num; break; case attr_imperial: attr_updated=(this_->imperial != attr->u.num); this_->imperial=attr->u.num; break; case attr_waypoints_flag: attr_updated=(this_->waypoints_flag != !!attr->u.num); this_->waypoints_flag=!!attr->u.num; break; default: dbg(lvl_debug, "calling generic setter method for attribute type %s\n", attr_to_name(attr->type)) return navit_object_set_attr((struct navit_object *) this_, attr); } if (attr_updated && !init) { callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); if (attr->type == attr_osd_configuration) graphics_draw_mode(this_->gra, draw_mode_end); } return 1; } int navit_set_attr(struct navit *this_, struct attr *attr) { return navit_set_attr_do(this_, attr, 0); } int navit_get_attr(struct navit *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { struct message *msg; struct coord *c; int len,offset; int ret=1; switch (type) { case attr_message: msg = navit_get_messages(this_); if (!msg) { return 0; } len = 0; while (msg) { len += strlen(msg->text) + 1; msg = msg->next; } attr->u.str = g_malloc(len + 1); msg = navit_get_messages(this_); offset = 0; while (msg) { g_stpcpy((attr->u.str + offset), msg->text); offset += strlen(msg->text); attr->u.str[offset] = '\n'; offset++; msg = msg->next; } attr->u.str[len] = '\0'; break; case attr_imperial: attr->u.num=this_->imperial; break; case attr_bookmark_map: attr->u.map=bookmarks_get_map(this_->bookmarks); break; case attr_bookmarks: attr->u.bookmarks=this_->bookmarks; break; case attr_callback_list: attr->u.callback_list=this_->attr_cbl; break; case attr_center: c=transform_get_center(this_->trans); transform_to_geo(transform_get_projection(this_->trans), c, &this_->center); attr->u.coord_geo=&this_->center; break; case attr_destination: if (! this_->destination_valid) return 0; attr->u.pcoord=&this_->destination; break; case attr_displaylist: attr->u.displaylist=this_->displaylist; return (attr->u.displaylist != NULL); case attr_follow: if (!this_->vehicle) return 0; attr->u.num=this_->vehicle->follow_curr; break; case attr_former_destination_map: attr->u.map=this_->former_destination; break; case attr_graphics: attr->u.graphics=this_->gra; ret=(attr->u.graphics != NULL); break; case attr_gui: attr->u.gui=this_->gui; ret=(attr->u.gui != NULL); break; case attr_layer: ret=attr_generic_get_attr(this_->attrs, NULL, type, attr, iter?(struct attr_iter *)&iter->iter:NULL); break; case attr_layout: if (iter) { if (iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->layouts; } if (!iter->u.list) return 0; attr->u.layout=(struct layout *)iter->u.list->data; } else { attr->u.layout=this_->layout_current; } break; case attr_map: if (iter && this_->mapsets) { if (!iter->u.mapset_handle) { iter->u.mapset_handle=mapset_open((struct mapset *)this_->mapsets->data); } attr->u.map=mapset_next(iter->u.mapset_handle, 0); if(!attr->u.map) { mapset_close(iter->u.mapset_handle); return 0; } } else { return 0; } break; case attr_mapset: attr->u.mapset=this_->mapsets->data; ret=(attr->u.mapset != NULL); break; case attr_navigation: attr->u.navigation=this_->navigation; break; case attr_orientation: attr->u.num=this_->orientation; break; case attr_osd: ret=attr_generic_get_attr(this_->attrs, NULL, type, attr, iter?(struct attr_iter *)&iter->iter:NULL); break; case attr_osd_configuration: attr->u.num=this_->osd_configuration; break; case attr_pitch: attr->u.num=transform_get_pitch(this_->trans); break; case attr_projection: if(this_->trans) { attr->u.num=transform_get_projection(this_->trans); } else { return 0; } break; case attr_route: attr->u.route=this_->route; break; case attr_speech: if(this_->speech) { attr->u.speech=this_->speech; } else { return 0; } break; case attr_timeout: attr->u.num=this_->center_timeout; break; case attr_tracking: attr->u.num=this_->tracking_flag; break; case attr_trackingo: attr->u.tracking=this_->tracking; break; case attr_transformation: attr->u.transformation=this_->trans; break; case attr_vehicle: if(iter) { if(iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->vehicles; } if(!iter->u.list) return 0; attr->u.vehicle=((struct navit_vehicle*)iter->u.list->data)->vehicle; } else { if(this_->vehicle) { attr->u.vehicle=this_->vehicle->vehicle; } else { return 0; } } break; case attr_vehicleprofile: if (iter) { if(iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->vehicleprofiles; } if(!iter->u.list) return 0; attr->u.vehicleprofile=iter->u.list->data; } else { attr->u.vehicleprofile=this_->vehicleprofile; } break; case attr_zoom: attr->u.num=transform_get_scale(this_->trans); break; case attr_autozoom_active: attr->u.num=this_->autozoom_active; break; case attr_follow_cursor: attr->u.num=this_->follow_cursor; break; case attr_waypoints_flag: attr->u.num=this_->waypoints_flag; break; default: dbg(lvl_debug, "calling generic getter method for attribute type %s\n", attr_to_name(type)) return navit_object_get_attr((struct navit_object *) this_, type, attr, iter); } attr->type=type; return ret; } static int navit_add_log(struct navit *this_, struct log *log) { struct attr type_attr; if (!log_get_attr(log, attr_type, &type_attr, NULL)) return 0; if (!strcmp(type_attr.u.str, "textfile_debug")) { char *header = "type=track_tracked\n"; if (this_->textfile_debug_log) return 0; log_set_header(log, header, strlen(header)); this_->textfile_debug_log=log; return 1; } return 0; } static int navit_add_layout(struct navit *this_, struct layout *layout) { struct attr active; this_->layouts = g_list_append(this_->layouts, layout); layout_get_attr(layout, attr_active, &active, NULL); if(active.u.num || !this_->layout_current) { this_->layout_current=layout; return 1; } return 0; } int navit_add_attr(struct navit *this_, struct attr *attr) { int ret=1; switch (attr->type) { case attr_callback: navit_add_callback(this_, attr->u.callback); break; case attr_log: ret=navit_add_log(this_, attr->u.log); break; case attr_gui: ret=navit_set_gui(this_, attr->u.gui); break; case attr_graphics: ret=navit_set_graphics(this_, attr->u.graphics); break; case attr_layout: navit_add_layout(this_, attr->u.layout); break; case attr_route: this_->route=attr->u.route; break; case attr_mapset: this_->mapsets = g_list_append(this_->mapsets, attr->u.mapset); break; case attr_navigation: this_->navigation=attr->u.navigation; break; case attr_osd: break; case attr_recent_dest: this_->recentdest_count = attr->u.num; break; case attr_speech: this_->speech=attr->u.speech; break; case attr_trackingo: this_->tracking=attr->u.tracking; break; case attr_vehicle: ret=navit_add_vehicle(this_, attr->u.vehicle); break; case attr_vehicleprofile: this_->vehicleprofiles=g_list_append(this_->vehicleprofiles, attr->u.vehicleprofile); break; case attr_autozoom_min: this_->autozoom_min = attr->u.num; break; case attr_autozoom_max: this_->autozoom_max = attr->u.num; break; case attr_layer: case attr_script: break; default: return 0; } if (ret) this_->attrs=attr_generic_add_attr(this_->attrs, attr); callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); return ret; } int navit_remove_attr(struct navit *this_, struct attr *attr) { int ret=1; switch (attr->type) { case attr_callback: navit_remove_callback(this_, attr->u.callback); break; case attr_vehicle: case attr_osd: this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; default: return 0; } return ret; } struct attr_iter * navit_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void navit_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } void navit_add_callback(struct navit *this_, struct callback *cb) { callback_list_add(this_->attr_cbl, cb); } void navit_remove_callback(struct navit *this_, struct callback *cb) { callback_list_remove(this_->attr_cbl, cb); } static int coord_not_set(struct coord c){ return !(c.x || c.y); } /** * Toggle the cursor update : refresh the map each time the cursor has moved (instead of only when it reaches a border) * * @param this_ The navit instance * @param nv vehicle to draw * @param pnt Screen coordinates of the vehicle. If NULL, position stored in nv is used. * @returns nothing */ static void navit_vehicle_draw(struct navit *this_, struct navit_vehicle *nv, struct point *pnt) { struct point cursor_pnt; enum projection pro; if (this_->blocked||coord_not_set(nv->coord)) return; if (pnt) cursor_pnt=*pnt; else { pro=transform_get_projection(this_->trans_cursor); if (!pro) return; transform(this_->trans_cursor, pro, &nv->coord, &cursor_pnt, 1, 0, 0, NULL); } vehicle_draw(nv->vehicle, this_->gra, &cursor_pnt, nv->dir-transform_get_yaw(this_->trans_cursor), nv->speed); } /** * @brief Called when the position of a vehicle changes. * * This function is called when the position of any configured vehicle changes and triggers all actions * that need to happen in response, such as: *
    *
  • Switching between day and night layout (based on the new position timestamp)
  • *
  • Updating position, bearing and speed of {@code nv} with the data of the active vehicle * (which may be different from the vehicle reporting the update)
  • *
  • Invoking callbacks for {@code navit}'s {@code attr_position} and {@code attr_position_coord_geo} * attributes
  • *
  • Triggering an update of the vehicle's position on the map and, if needed, an update of the * visible map area ad orientation
  • *
  • Logging a new track point, if enabled
  • *
  • Updating the position on the route
  • *
  • Stopping navigation if the destination has been reached
  • *
* * @param this_ The navit object * @param nv The {@code navit_vehicle} which reported a new position */ static void navit_vehicle_update_position(struct navit *this_, struct navit_vehicle *nv) { struct attr attr_valid, attr_dir, attr_speed, attr_pos; struct pcoord cursor_pc; struct point cursor_pnt, *pnt=&cursor_pnt; struct tracking *tracking=NULL; struct pcoord *pc; enum projection pro=transform_get_projection(this_->trans_cursor); int count; int (*get_attr)(void *, enum attr_type, struct attr *, struct attr_iter *); void *attr_object; char *destination_file; char *description; profile(0,NULL); if (this_->ready == 3) navit_layout_switch(this_); if (this_->vehicle == nv && this_->tracking_flag) tracking=this_->tracking; if (tracking) { tracking_update(tracking, nv->vehicle, this_->vehicleprofile, pro); attr_object=tracking; get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))tracking_get_attr; } else { attr_object=nv->vehicle; get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))vehicle_get_attr; } if (get_attr(attr_object, attr_position_valid, &attr_valid, NULL)) if (!attr_valid.u.num != attr_position_valid_invalid) return; if (! get_attr(attr_object, attr_position_direction, &attr_dir, NULL) || ! get_attr(attr_object, attr_position_speed, &attr_speed, NULL) || ! get_attr(attr_object, attr_position_coord_geo, &attr_pos, NULL)) { profile(0,"return 2\n"); return; } nv->dir=*attr_dir.u.numd; nv->speed=*attr_speed.u.numd; transform_from_geo(pro, attr_pos.u.coord_geo, &nv->coord); if (nv != this_->vehicle) { if (this_->ready == 3) navit_vehicle_draw(this_, nv, NULL); profile(0,"return 3\n"); return; } cursor_pc.x = nv->coord.x; cursor_pc.y = nv->coord.y; cursor_pc.pro = pro; if (this_->route) { if (tracking) route_set_position_from_tracking(this_->route, tracking, pro); else route_set_position(this_->route, &cursor_pc); } callback_list_call_attr_0(this_->attr_cbl, attr_position); navit_textfile_debug_log(this_, "type=trackpoint_tracked"); if (this_->ready == 3) { if (this_->gui && nv->speed > 2) navit_disable_suspend(); transform(this_->trans_cursor, pro, &nv->coord, &cursor_pnt, 1, 0, 0, NULL); if (this_->button_pressed != 1 && this_->follow_cursor && nv->follow_curr <= nv->follow && (nv->follow_curr == 1 || !transform_within_border(this_->trans_cursor, &cursor_pnt, this_->border))) navit_set_center_cursor_draw(this_); else navit_vehicle_draw(this_, nv, pnt); if (nv->follow_curr > 1) nv->follow_curr--; else nv->follow_curr=nv->follow; } callback_list_call_attr_2(this_->attr_cbl, attr_position_coord_geo, this_, nv->vehicle); /* Finally, if we reached our destination, stop navigation. */ if (this_->route) { switch(route_destination_reached(this_->route)) { case 1: description=route_get_destination_description(this_->route, 0); route_remove_waypoint(this_->route); count=route_get_destination_count(this_->route); pc=g_alloca(sizeof(*pc)*count); route_get_destinations(this_->route, pc, count); destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, pc, count, type_former_itinerary_part, description, this_->recentdest_count); g_free(destination_file); g_free(description); break; case 2: destination_file = bookmarks_get_destination_file(TRUE); bookmarks_append_destinations(this_->former_destination, destination_file, NULL, 0, type_former_itinerary_part, NULL, this_->recentdest_count); navit_set_destination(this_, NULL, NULL, 0); g_free(destination_file); break; } } profile(0,"return 5\n"); } /** * @brief Called when a status attribute of a vehicle changes. * * This function is called when the {@code position_fix_type}, {@code position_sats_used} or {@code position_hdop} * attribute of any configured vehicle changes. * * The function checks if {@code nv} refers to the active vehicle and if {@code type} is one of the above types. * If this is the case, it invokes the callback functions for {@code navit}'s respective attributes. * * Future actions that need to happen when one of these three attribute changes for any vehicle should be * implemented here. * * @param this_ The navit object * @param nv The {@code navit_vehicle} which reported a new status attribute * @param type The type of attribute with has changed */ static void navit_vehicle_update_status(struct navit *this_, struct navit_vehicle *nv, enum attr_type type) { if (this_->vehicle != nv) return; switch(type) { case attr_position_fix_type: case attr_position_sats_used: case attr_position_hdop: callback_list_call_attr_2(this_->attr_cbl, type, this_, nv->vehicle); break; default: return; } } /** * Set the position of the vehicle * * @param navit The navit instance * @param c The coordinate to set as position * @returns nothing */ void navit_set_position(struct navit *this_, struct pcoord *c) { if (this_->route) { route_set_position(this_->route, c); callback_list_call_attr_0(this_->attr_cbl, attr_position); } if (this_->ready == 3) navit_draw(this_); } static int navit_set_vehicleprofile(struct navit *this_, struct vehicleprofile *vp) { if (this_->vehicleprofile == vp) return 0; this_->vehicleprofile=vp; if (this_->route) route_set_profile(this_->route, this_->vehicleprofile); return 1; } static int navit_set_vehicleprofile_name(struct navit *this_, char *name) { struct attr attr; GList *l; l=this_->vehicleprofiles; while (l) { if (vehicleprofile_get_attr(l->data, attr_name, &attr, NULL)) { if (!strcmp(attr.u.str, name)) { navit_set_vehicleprofile(this_, l->data); return 1; } } l=g_list_next(l); } return 0; } static void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv) { struct attr attr; this_->vehicle=nv; if (nv && vehicle_get_attr(nv->vehicle, attr_profilename, &attr, NULL)) { if (navit_set_vehicleprofile_name(this_, attr.u.str)) return; } if (!navit_set_vehicleprofile_name(this_,"car")) { /* We do not have a fallback "car" profile * so lets set any profile */ GList *l; l=this_->vehicleprofiles; if (l) { this_->vehicleprofile=l->data; if (this_->route) route_set_profile(this_->route, this_->vehicleprofile); } } } /** * @brief Registers a new vehicle. * * @param this_ The navit instance * @param v The vehicle to register * @return True for success */ static int navit_add_vehicle(struct navit *this_, struct vehicle *v) { struct navit_vehicle *nv=g_new0(struct navit_vehicle, 1); struct attr follow, active, animate; nv->vehicle=v; nv->follow=0; nv->last.x = 0; nv->last.y = 0; nv->animate_cursor=0; if ((vehicle_get_attr(v, attr_follow, &follow, NULL))) nv->follow=follow.u.num; nv->follow_curr=nv->follow; this_->vehicles=g_list_append(this_->vehicles, nv); if ((vehicle_get_attr(v, attr_active, &active, NULL)) && active.u.num) navit_set_vehicle(this_, nv); if ((vehicle_get_attr(v, attr_animate, &animate, NULL))) nv->animate_cursor=animate.u.num; nv->callback.type=attr_callback; nv->callback.u.callback=callback_new_attr_2(callback_cast(navit_vehicle_update_position), attr_position_coord_geo, this_, nv); vehicle_add_attr(nv->vehicle, &nv->callback); nv->callback.u.callback=callback_new_attr_3(callback_cast(navit_vehicle_update_status), attr_position_fix_type, this_, nv, attr_position_fix_type); vehicle_add_attr(nv->vehicle, &nv->callback); nv->callback.u.callback=callback_new_attr_3(callback_cast(navit_vehicle_update_status), attr_position_sats_used, this_, nv, attr_position_sats_used); vehicle_add_attr(nv->vehicle, &nv->callback); nv->callback.u.callback=callback_new_attr_3(callback_cast(navit_vehicle_update_status), attr_position_hdop, this_, nv, attr_position_hdop); vehicle_add_attr(nv->vehicle, &nv->callback); vehicle_set_attr(nv->vehicle, &this_->self); return 1; } struct gui * navit_get_gui(struct navit *this_) { return this_->gui; } struct transformation * navit_get_trans(struct navit *this_) { return this_->trans; } struct route * navit_get_route(struct navit *this_) { return this_->route; } struct navigation * navit_get_navigation(struct navit *this_) { return this_->navigation; } struct displaylist * navit_get_displaylist(struct navit *this_) { return this_->displaylist; } void navit_layout_switch(struct navit *n) { int currTs=0; struct attr iso8601_attr,geo_attr,valid_attr,layout_attr; double trise,tset,trise_actual; struct layout *l; int year, month, day; if (navit_get_attr(n,attr_layout,&layout_attr,NULL)!=1) { return; //No layout - nothing to switch } if (!n->vehicle) return; l=layout_attr.u.layout; if (l->dayname || l->nightname) { //Ok, we know that we have profile to switch //Check that we aren't calculating too fast if (vehicle_get_attr(n->vehicle->vehicle, attr_position_time_iso8601,&iso8601_attr,NULL)==1) { currTs=iso8601_to_secs(iso8601_attr.u.str); dbg(lvl_debug,"currTs: %u:%u\n",currTs%86400/3600,((currTs%86400)%3600)/60); } if (currTs-(n->prevTs)<60) { //We've have to wait a little return; } if (sscanf(iso8601_attr.u.str,"%d-%02d-%02dT",&year,&month,&day) != 3) return; if (vehicle_get_attr(n->vehicle->vehicle, attr_position_valid, &valid_attr,NULL) && valid_attr.u.num==attr_position_valid_invalid) { return; //No valid fix yet } if (vehicle_get_attr(n->vehicle->vehicle, attr_position_coord_geo,&geo_attr,NULL)!=1) { //No position - no sun return; } //We calculate sunrise anyway, cause it is needed both for day and for night if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { //near the pole sun never rises/sets, so we should never switch profiles dbg(lvl_warning,"trise: %u:%u, sun never visible, never switch profile\n",HOURS(trise),MINUTES(trise)); n->prevTs=currTs; return; } trise_actual=trise; dbg(lvl_debug,"trise: %u:%u\n",HOURS(trise),MINUTES(trise)); if (l->dayname) { if ((HOURS(trise)*60+MINUTES(trise)==(currTs%86400)/60) || (n->prevTs==0 && ((HOURS(trise)*60+MINUTES(trise)<(currTs%86400)/60)))) { //The sun is rising now! if (strcmp(l->name,l->dayname)) { navit_set_layout_by_name(n,l->dayname); } } } if (l->nightname) { if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { //near the pole sun never rises/sets, so we should never switch profiles dbg(lvl_warning,"tset: %u:%u, sun always visible, never switch profile\n",HOURS(tset),MINUTES(tset)); n->prevTs=currTs; return; } dbg(lvl_debug,"tset: %u:%u\n",HOURS(tset),MINUTES(tset)); if (HOURS(tset)*60+MINUTES(tset)==((currTs%86400)/60) || (n->prevTs==0 && (((HOURS(tset)*60+MINUTES(tset)<(currTs%86400)/60)) || ((HOURS(trise_actual)*60+MINUTES(trise_actual)>(currTs%86400)/60))))) { //Time to sleep if (strcmp(l->name,l->nightname)) { navit_set_layout_by_name(n,l->nightname); } } } n->prevTs=currTs; } } int navit_set_vehicle_by_name(struct navit *n,const char *name) { struct vehicle *v; struct attr_iter *iter; struct attr vehicle_attr, name_attr; iter=navit_attr_iter_new(); while (navit_get_attr(n,attr_vehicle,&vehicle_attr,iter)) { v=vehicle_attr.u.vehicle; vehicle_get_attr(v,attr_name,&name_attr,NULL); if (name_attr.type==attr_name) { if (!strcmp(name,name_attr.u.str)) { navit_set_attr(n,&vehicle_attr); navit_attr_iter_destroy(iter); return 1; } } } navit_attr_iter_destroy(iter); return 0; } int navit_set_layout_by_name(struct navit *n,const char *name) { struct layout *l; struct attr_iter iter; struct attr layout_attr; iter.u.list=0x00; if (navit_get_attr(n,attr_layout,&layout_attr,&iter)!=1) { return 0; //No layouts - nothing to do } if (iter.u.list==NULL) { return 0; } iter.u.list=g_list_first(iter.u.list); while(iter.u.list) { l=(struct layout*)iter.u.list->data; if (!strcmp(name,l->name)) { layout_attr.u.layout=l; layout_attr.type=attr_layout; navit_set_attr(n,&layout_attr); iter.u.list=g_list_first(iter.u.list); return 1; } iter.u.list=g_list_next(iter.u.list); } iter.u.list=g_list_first(iter.u.list); return 0; } void navit_disable_suspend() { gui_disable_suspend(global_navit->gui); callback_list_call_attr_0(global_navit->attr_cbl,attr_unsuspend); } /** * @brief Blocks or unblocks redraw operations. * * The {@code block} parameter specifies the operation to carry out: * * {@code block > 0} cancels all draw operations in progress and blocks future operations. It sets flag 1 of the * {@code blocked} member. If draw operations in progress were canceled, flag 2 is also set. * * {@code block = 0} unblocks redraw operations, resetting {@code blocked} to 0. If flag 2 was previously set, * indicating that draw operations had been previously canceled, a redraw is triggered. * * {@code block < 0} unblocks redraw operations and forces a redraw. As above, {@code blocked} is reset to 0. * * @param this_ The navit instance * @param block The operation to perform, see description * * @return {@code true} if a redraw operation was triggered, {@code false} if not */ int navit_block(struct navit *this_, int block) { if (block > 0) { this_->blocked |= 1; if (graphics_draw_cancel(this_->gra, this_->displaylist)) this_->blocked |= 2; return 0; } if ((this_->blocked & 2) || block < 0) { this_->blocked=0; navit_draw(this_); return 1; } this_->blocked=0; return 0; } /** * @brief Returns whether redraw operations are currently blocked. */ int navit_get_blocked(struct navit *this_) { return this_->blocked; } void navit_destroy(struct navit *this_) { dbg(lvl_debug,"enter %p\n",this_); graphics_draw_cancel(this_->gra, this_->displaylist); callback_list_call_attr_1(this_->attr_cbl, attr_destroy, this_); attr_list_free(this_->attrs); if(cmd_int_var_hash) { g_hash_table_destroy(cmd_int_var_hash); cmd_int_var_hash=NULL; } if(cmd_attr_var_hash) { g_hash_table_destroy(cmd_attr_var_hash); cmd_attr_var_hash=NULL; } if(cmd_int_var_stack) { g_list_foreach(cmd_int_var_stack, (GFunc)attr_free, NULL); g_list_free(cmd_int_var_stack); cmd_int_var_stack=NULL; } if (this_->bookmarks) { char *center_file = bookmarks_get_center_file(TRUE); bookmarks_write_center_to_file(this_->bookmarks, center_file); g_free(center_file); bookmarks_destroy(this_->bookmarks); } callback_destroy(this_->nav_speech_cb); callback_destroy(this_->roadbook_callback); callback_destroy(this_->popup_callback); callback_destroy(this_->motion_timeout_callback); callback_destroy(this_->progress_cb); if(this_->gra) { graphics_remove_callback(this_->gra, this_->resize_callback); graphics_remove_callback(this_->gra, this_->button_callback); graphics_remove_callback(this_->gra, this_->motion_callback); graphics_remove_callback(this_->gra, this_->predraw_callback); } callback_destroy(this_->resize_callback); callback_destroy(this_->motion_callback); callback_destroy(this_->predraw_callback); callback_destroy(this_->route_cb); if (this_->route) route_destroy(this_->route); map_destroy(this_->former_destination); graphics_displaylist_destroy(this_->displaylist); graphics_free(this_->gra); g_free(this_); } struct object_func navit_func = { attr_navit, (object_func_new)navit_new, (object_func_get_attr)navit_get_attr, (object_func_iter_new)navit_attr_iter_new, (object_func_iter_destroy)navit_attr_iter_destroy, (object_func_set_attr)navit_set_attr, (object_func_add_attr)navit_add_attr, (object_func_remove_attr)navit_remove_attr, (object_func_init)navit_init, (object_func_destroy)navit_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; /** @} */ navit-0.5.0+dfsg.1/navit/navit.dtd000066400000000000000000000125071264204753600166700ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/navit.h000066400000000000000000000135501264204753600163430ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_NAVIT_H #define NAVIT_NAVIT_H #ifdef __cplusplus extern "C" { #endif extern struct gui *main_loop_gui; // defined in glib.h. #ifndef __G_LIST_H__ struct _GList; typedef struct _GList GList; #endif /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct callback; struct coord_rect; struct displaylist; struct graphics; struct gui; struct mapset; struct message; struct navigation; struct navit; struct pcoord; struct point; struct route; struct tracking; struct transformation; struct vehicleprofile; struct command_table; struct item; void navit_add_mapset(struct navit *this_, struct mapset *ms); struct mapset *navit_get_mapset(struct navit *this_); struct tracking *navit_get_tracking(struct navit *this_); char *navit_get_user_data_directory(int create); void navit_draw_async(struct navit *this_, int async); void navit_draw(struct navit *this_); int navit_get_ready(struct navit *this_); void navit_draw_displaylist(struct navit *this_); void navit_handle_resize(struct navit *this_, int w, int h); int navit_get_width(struct navit *this_); int navit_get_height(struct navit *this_); int navit_ignore_button(struct navit *this_); void navit_ignore_graphics_events(struct navit *this_, int ignore); void navit_set_timeout(struct navit *this_); int navit_handle_button(struct navit *this_, int pressed, int button, struct point *p, struct callback *popup_callback); void navit_handle_motion(struct navit *this_, struct point *p); void navit_zoom_in(struct navit *this_, int factor, struct point *p); void navit_zoom_out(struct navit *this_, int factor, struct point *p); void navit_zoom_in_cursor(struct navit *this_, int factor); void navit_zoom_out_cursor(struct navit *this_, int factor); struct navit *navit_new(struct attr *parent, struct attr **attrs); void navit_add_message(struct navit *this_, const char *message); struct message *navit_get_messages(struct navit *this_); struct graphics *navit_get_graphics(struct navit *this_); struct vehicleprofile *navit_get_vehicleprofile(struct navit *this_); GList *navit_get_vehicleprofiles(struct navit *this_); void navit_set_destination(struct navit *this_, struct pcoord *c, const char *description, int async); void navit_set_destinations(struct navit *this_, struct pcoord *c, int count, const char *description, int async); void navit_add_destination_description(struct navit *this_, struct pcoord *c, const char *description); int navit_get_destinations(struct navit *this_, struct pcoord *pc, int count); int navit_get_destination_count(struct navit *this_); char* navit_get_destination_description(struct navit *this_, int n); void navit_remove_nth_waypoint(struct navit *this_, int n); void navit_remove_waypoint(struct navit *this_); char* navit_get_coord_description(struct navit *this_, struct pcoord *c); int navit_check_route(struct navit *this_); struct map* read_former_destinations_from_file(void); void navit_textfile_debug_log(struct navit *this_, const char *fmt, ...); void navit_textfile_debug_log_at(struct navit *this_, struct pcoord *pc, const char *fmt, ...); int navit_speech_estimate(struct navit *this_, char *str); void navit_say(struct navit *this_, const char *text); void navit_speak(struct navit *this_); void navit_window_roadbook_destroy(struct navit *this_); void navit_window_roadbook_new(struct navit *this_); void navit_init(struct navit *this_); void navit_zoom_to_rect(struct navit *this_, struct coord_rect *r); void navit_zoom_to_route(struct navit *this_, int orientation); void navit_set_center(struct navit *this_, struct pcoord *center, int set_timeout); void navit_set_center_cursor(struct navit *this_, int autozoom, int keep_orientation); void navit_set_center_screen(struct navit *this_, struct point *p, int set_timeout); int navit_set_attr(struct navit *this_, struct attr *attr); int navit_get_attr(struct navit *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int navit_add_attr(struct navit *this_, struct attr *attr); int navit_remove_attr(struct navit *this_, struct attr *attr); struct attr_iter *navit_attr_iter_new(void); void navit_attr_iter_destroy(struct attr_iter *iter); void navit_add_callback(struct navit *this_, struct callback *cb); void navit_remove_callback(struct navit *this_, struct callback *cb); void navit_set_position(struct navit *this_, struct pcoord *c); struct gui *navit_get_gui(struct navit *this_); struct transformation *navit_get_trans(struct navit *this_); struct route *navit_get_route(struct navit *this_); struct navigation *navit_get_navigation(struct navit *this_); struct displaylist *navit_get_displaylist(struct navit *this_); void navit_layout_switch(struct navit *n); int navit_set_vehicle_by_name(struct navit *n, const char *name); int navit_set_layout_by_name(struct navit *n, const char *name); void navit_disable_suspend(void); int navit_block(struct navit *this_, int block); int navit_get_blocked(struct navit *this_); void navit_destroy(struct navit *this_); void navit_command_add_table(struct navit*this_, struct command_table *commands, int count); struct navit * navit_ref(struct navit *this_); void navit_unref(struct navit *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/navit_lfs.h000066400000000000000000000032131264204753600172020ustar00rootroot00000000000000#ifndef __NAVIT_LFS_H__ /** * Navit, a modular navigation system. * Copyright (C) 2005-2014 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef BUFSIZ #error "Don't #include stdio.h directly if you later #include navit_lfs.h" #endif #ifdef F_OK #error "Don't #include unistd.h directly if you later #include navit_lfs.h" #endif #ifdef O_RDWR #error "Don't #include unistd.h directly if you later #include navit_lfs.h" #endif #define _LARGEFILE_SOURCE #define _FILE_OFFSET_BITS 64 #ifdef __MSVCRT__ #define __USE_MINGW_FSEEK #endif #include #include #include #ifdef __MSVCRT__ #undef lseek #define lseek(fd,offset,whence) _lseeki64(fd,offset,whence) #undef ftello #define ftello(f) ftello64(f) #undef fseeko #define fseeko(f,offset,whence) fseeko64(f,offset,whence) #undef off_t #define off_t long long #endif #ifdef HAVE_API_ANDROID #undef lseek #define lseek lseek64 #endif #ifndef O_LARGEFILE #define O_LARGEFILE 0 #endif #ifndef O_BINARY #define O_BINARY 0 #endif #define __NAVIT_LFS_H__ #endif navit-0.5.0+dfsg.1/navit/navit_nls.c000066400000000000000000000034351264204753600172130ustar00rootroot00000000000000#include "config.h" #include "debug.h" #include #include #include #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif #ifdef USE_LIBGNUINTL #include #else #include #endif #ifdef USE_NATIVE_LANGUAGE_SUPPORT static GList *textdomains; #endif char * navit_nls_add_textdomain(const char *package, const char *dir) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT char *ret=bindtextdomain(package, dir); bind_textdomain_codeset(package, "UTF-8"); textdomains=g_list_append(textdomains, g_strdup(package)); return ret; #else return NULL; #endif } void navit_nls_remove_textdomain(const char *package) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT GList *i=textdomains; while (i) { if (!strcmp(i->data, package)) { textdomains=g_list_remove_all(textdomains, i->data); g_free(i->data); return; } i=g_list_next(i); } #endif } const char * navit_nls_gettext(const char *msgid) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT GList *i=textdomains; while (i) { const char *ret=dgettext(i->data, msgid); if (ret != msgid) return ret; i=g_list_next(i); } #endif return msgid; } const char * navit_nls_ngettext(const char *msgid, const char *msgid_plural, unsigned long int n) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT GList *i=textdomains; while (i) { const char *ret=dngettext(i->data, msgid, msgid_plural, n); if (ret != msgid && ret != msgid_plural) return ret; i=g_list_next(i); } #endif if (n == 1) { return msgid; } else { return msgid_plural; } } void navit_nls_main_init(void) { #ifdef USE_NATIVE_LANGUAGE_SUPPORT #ifdef FORCE_LOCALE #define STRINGIFY2(x) #x #define STRINGIFY(x) STRINGIFY2(x) setlocale(LC_MESSAGES,STRINGIFY(FORCE_LOCALE)); #endif navit_nls_add_textdomain(PACKAGE, getenv("NAVIT_LOCALEDIR")); textdomain(PACKAGE); #endif } navit-0.5.0+dfsg.1/navit/navit_nls.h000066400000000000000000000007511264204753600172160ustar00rootroot00000000000000#ifndef __NAVIT_NLS_H__ char *navit_nls_add_textdomain(const char *package, const char *dir); void navit_nls_remove_textdomain(const char *package); const char *navit_nls_gettext(const char *msgid); const char *navit_nls_ngettext(const char *msgid, const char *msgid_plural, unsigned long int n); void navit_nls_main_init(void); #define _(STRING) navit_nls_gettext(STRING) #define gettext_noop(String) String #define _n(STRING) gettext_noop(STRING) #define __NAVIT_NLS_H__ #endif navit-0.5.0+dfsg.1/navit/navit_shipped.xml000066400000000000000000010533651264204753600204410ustar00rootroot00000000000000
Main menu Actions Show Map Settings Tools Route About Quit Actions Bookmarks Former Destinations Town Coordinates Stop Navigation Settings Display Maps Vehicle Rules Display Layout Fullscreen Window Mode 3D 2D Tools Show Locale Route Description Height Profile Waypoints Drop last Waypoint Drop next Waypoint Map Point Layout Maps Vehicle Satellite Status NMEA Data ]]> navit-0.5.0+dfsg.1/navit/osd.c000066400000000000000000000306451264204753600160060ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "plugin.h" #include "item.h" #include "xmlconfig.h" #include "color.h" #include "point.h" #include "navit.h" #include "graphics.h" #include "command.h" #include "callback.h" #include "osd.h" struct osd { NAVIT_OBJECT struct osd_methods meth; struct osd_priv *priv; }; int osd_set_methods(struct osd_methods *in, int in_size, struct osd_methods *out) { return navit_object_set_methods(in, in_size, out, sizeof(struct osd_methods)); } struct osd * osd_new(struct attr *parent, struct attr **attrs) { struct osd *o; struct osd_priv *(*new)(struct navit *nav, struct osd_methods *meth, struct attr **attrs); struct attr *type=attr_search(attrs, NULL, attr_type),cbl; if (! type) return NULL; new=plugin_get_osd_type(type->u.str); if (! new) { dbg(lvl_error, "invalid OSD type '%s'\n", type->u.str); return NULL; } o=g_new0(struct osd, 1); o->attrs=attr_list_dup(attrs); cbl.type=attr_callback_list; cbl.u.callback_list=callback_list_new(); o->attrs=attr_generic_prepend_attr(o->attrs, &cbl); o->priv=new(parent->u.navit, &o->meth, o->attrs); if (o->priv) { o->func=&osd_func; navit_object_ref((struct navit_object *)o); } else { attr_list_free(o->attrs); g_free(o); o=NULL; } dbg(lvl_debug,"new osd %p\n",o); return o; } int osd_get_attr(struct osd *osd, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret=0; if(osd && osd->meth.get_attr) /* values for ret: -1: Not possible, 0: Ignored by driver, 1 valid */ ret=osd->meth.get_attr(osd->priv, type, attr); if (ret == -1) return 0; if (ret > 0) return 1; return navit_object_get_attr((struct navit_object *)osd, type, attr, iter); } int osd_set_attr(struct osd *osd, struct attr* attr) { int ret=0; if(osd && osd->meth.set_attr) /* values for ret: -1: Not possible, 0: Ignored by driver, 1 set and store, 2 set, don't store */ ret=osd->meth.set_attr(osd->priv, attr); if (ret == -1) return 0; if (ret == 2) return 1; return navit_object_set_attr((struct navit_object *)osd, attr); } static void osd_destroy(struct osd *osd) { if (!osd) return; if (osd->meth.destroy) osd->meth.destroy(osd->priv); attr_list_free(osd->attrs); g_free(osd); } void osd_wrap_point(struct point *p, struct navit *nav) { if (p->x < 0) p->x += navit_get_width(nav); if (p->y < 0) p->y += navit_get_height(nav); } static void osd_evaluate_command(struct osd_item *this, struct navit *nav) { struct attr navit; navit.type=attr_navit; navit.u.navit=nav; dbg(lvl_debug, "calling command '%s'\n", this->command); command_evaluate(&navit, this->command); } void osd_std_click(struct osd_item *this, struct navit *nav, int pressed, int button, struct point *p) { int click_is_outside_item; struct point bp = this->p; if (!this->command || !this->command[0]) return; osd_wrap_point(&bp, nav); click_is_outside_item = p->x < bp.x || p->y < bp.y || p->x > bp.x + this->w || p->y > bp.y + this->h; if ((click_is_outside_item || !this->configured) && !this->pressed) return; if (button != 1) return; if (!!pressed == !!this->pressed) return; if (navit_ignore_button(nav)) return; this->pressed = pressed; if (pressed && this->command) osd_evaluate_command(this, nav); } void osd_std_resize(struct osd_item *item) { graphics_overlay_resize(item->gr, &item->p, item->w, item->h, 1); } /** * @brief Calculates the size and position of an OSD item. * * If the geometry of the OSD item is specified relative to screen dimensions, * this function will set its absolute dimensions accordingly. If relative width * or relative height is set to 0% (int value is equal to ATTR_REL_RELSHIFT), * object width (height) is not changed here, for button and image osds it means * to derive values from the underlying image. * @param item * @param w Available screen width in pixels (the width that corresponds to * 100%) * @param h Available screen height in pixels (the height that corresponds to * 100%) */ void osd_std_calculate_sizes(struct osd_item *item, int w, int h) { if(item->rel_w!=ATTR_REL_RELSHIFT) item->w=attr_rel2real(item->rel_w, w, 1); if(item->w<0) item->w=0; if(item->rel_h!=ATTR_REL_RELSHIFT) item->h=attr_rel2real(item->rel_h, h, 1); if(item->h<0) item->h=0; item->p.x=attr_rel2real(item->rel_x, w, 1); item->p.y=attr_rel2real(item->rel_y, h, 1); } /** * @brief Recalculates the size and position of an OSD item and * triggers a redraw of the item. * * @param item * @param priv * @param w Available screen width in pixels (the width that corresponds to * 100%) * @param h Available screen height in pixels (the height that corresponds to * 100%) */ static void osd_std_calculate_sizes_and_redraw(struct osd_item *item, struct osd_priv *priv, int w, int h) { struct attr vehicle_attr; osd_std_calculate_sizes(item, w, h); osd_std_resize(item); item->do_draw=1; if (item->meth.draw) { if (navit_get_attr(item->navit, attr_vehicle, &vehicle_attr, NULL)) { item->meth.draw(priv, item->navit, vehicle_attr.u.vehicle); item->do_draw=0; } } } static void osd_std_keypress(struct osd_item *item, struct navit *nav, char *key) { #if 0 int i; dbg(lvl_debug,"key=%s\n",key); for (i = 0 ; i < strlen(key) ; i++) { dbg(lvl_debug,"key:0x%02x\n",key[i]); } for (i = 0 ; i < strlen(item->accesskey) ; i++) { dbg(lvl_debug,"accesskey:0x%02x\n",item->accesskey[i]); } #endif if ( ! graphics_is_disabled(item->gr) && item->accesskey && key && !strcmp(key, item->accesskey)) osd_evaluate_command(item, nav); } /** * @brief Configures or unconfigures an OSD item. * * This method evaluates the result of the last execution of {@code cs}. If it evaluates to true, the * item is configured, else it is unconfigured. (A configured item is displayed on the screen and can * respond to user input, an unconfigured item is invisible and cannot receive user input.) * * If an error occurred during evaluation of {@code cs}, the item's configuration state is not changed. * * @param item The OSD item to reconfigure * @param cs The command to evaluate */ static void osd_std_reconfigure(struct osd_item *item, struct command_saved *cs) { char *err = NULL; /* Error description */ dbg(lvl_debug, "enter, item=%p, cs=%p\n", item, cs); if (!command_saved_error(cs)) { item->configured = !! command_saved_get_int(cs); if (item->gr && !(item->flags & 16)) graphics_overlay_disable(item->gr, !item->configured); } else { err = command_error_to_text(command_saved_error(cs)); dbg(lvl_error, "Error in saved command: %s, cs=%p.\n", err, cs); g_free(err); } } void osd_set_std_attr(struct attr **attrs, struct osd_item *item, int flags) { struct attr *attr; item->flags=flags; item->osd_configuration=-1; item->color_fg.r = 0xffff; item->color_fg.g = 0xffff; item->color_fg.b = 0xffff; item->color_fg.a = 0xffff; item->text_color.r = 0xffff; item->text_color.g = 0xffff; item->text_color.b = 0xffff; item->text_color.a = 0xffff; if (flags & 1) { item->color_bg.r = 0x0808; item->color_bg.g = 0x0808; item->color_bg.b = 0xf8f8; item->color_bg.a = 0x0000; } else { item->color_bg.r = 0x0; item->color_bg.g = 0x0; item->color_bg.b = 0x0; item->color_bg.a = 0x5fff; } attr=attr_search(attrs, NULL, attr_osd_configuration); if (attr) item->osd_configuration = attr->u.num; attr=attr_search(attrs, NULL, attr_enable_expression); if (attr) { item->enable_cs = command_saved_new(attr->u.str, item->navit, NULL, 0); } attr = attr_search(attrs, NULL, attr_w); if (attr) { item->rel_w = attr->u.num; } attr = attr_search(attrs, NULL, attr_h); if (attr) { item->rel_h = attr->u.num; } attr = attr_search(attrs, NULL, attr_x); if (attr) { item->rel_x = attr->u.num; } attr = attr_search(attrs, NULL, attr_y); if (attr) { item->rel_y = attr->u.num; } attr = attr_search(attrs, NULL, attr_font_size); if (attr) item->font_size = attr->u.num; attr=attr_search(attrs, NULL, attr_background_color); if (attr) item->color_bg=*attr->u.color; attr = attr_search(attrs, NULL, attr_command); if (attr) item->command = g_strdup(attr->u.str); attr=attr_search(attrs, NULL, attr_text_color); if (attr) item->text_color=*attr->u.color; attr=attr_search(attrs, NULL, attr_foreground_color); if (attr) item->color_fg=*attr->u.color; attr=attr_search(attrs, NULL, attr_accesskey); if (attr) item->accesskey = g_strdup(attr->u.str); attr=attr_search(attrs, NULL, attr_font); if (attr) item->font_name = g_strdup(attr->u.str); } void osd_std_config(struct osd_item *item, struct navit *navit) { struct attr attr; char *err = NULL; /* Error description */ dbg(lvl_debug, "enter, item=%p, enable_cs=%p\n", item, item->enable_cs); if (item->enable_cs) { item->reconfig_cb = callback_new_1(callback_cast(osd_std_reconfigure), item); command_saved_set_cb(item->enable_cs, item->reconfig_cb); if (!command_saved_error(item->enable_cs)) { item->configured = !! command_saved_get_int(item->enable_cs); } else { err = command_error_to_text(command_saved_error(item->enable_cs)); dbg(lvl_error, "Error in saved command: %s, item=%p.\n", err, item); g_free(err); } } else { if (!navit_get_attr(navit, attr_osd_configuration, &attr, NULL)) attr.u.num=-1; item->configured = !!(attr.u.num & item->osd_configuration); } if (item->gr && !(item->flags & 16)) graphics_overlay_disable(item->gr, !item->configured); } void osd_set_std_config(struct navit *nav, struct osd_item *item) { dbg(lvl_debug, "enter, item=%p\n", item); item->cb = callback_new_attr_2(callback_cast(osd_std_config), attr_osd_configuration, item, nav); navit_add_callback(nav, item->cb); osd_std_config(item, nav); } void osd_set_keypress(struct navit *nav, struct osd_item *item) { struct graphics *navit_gr = navit_get_graphics(nav); dbg(lvl_info,"accesskey %s\n",item->accesskey); if (item->accesskey) { item->keypress_cb=callback_new_attr_2(callback_cast(osd_std_keypress), attr_keypress, item, nav); graphics_add_callback(navit_gr, item->keypress_cb); } } void osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv) { struct graphics *navit_gr; navit_gr = navit_get_graphics(nav); osd_std_calculate_sizes(item, navit_get_width(nav), navit_get_height(nav)); item->gr = graphics_overlay_new(navit_gr, &item->p, item->w, item->h, 1); item->graphic_bg = graphics_gc_new(item->gr); graphics_gc_set_foreground(item->graphic_bg, &item->color_bg); graphics_background_gc(item->gr, item->graphic_bg); item->graphic_fg = graphics_gc_new(item->gr); graphics_gc_set_foreground(item->graphic_fg, &item->color_fg); if (item->flags & 2) { item->font = graphics_named_font_new(item->gr, item->font_name, item->font_size, 1); item->graphic_fg_text = graphics_gc_new(item->gr); graphics_gc_set_foreground(item->graphic_fg_text, &item->text_color); } osd_set_std_config(nav, item); item->resize_cb = callback_new_attr_2(callback_cast(osd_std_calculate_sizes_and_redraw), attr_resize, item, priv); graphics_add_callback(navit_gr, item->resize_cb); osd_set_keypress(nav, item); } void osd_fill_with_bgcolor(struct osd_item *item) { struct point p[1]; graphics_draw_mode(item->gr, draw_mode_begin); p[0].x=0; p[0].y=0; graphics_draw_rectangle(item->gr, item->graphic_bg, p, item->w, item->h); } struct object_func osd_func = { attr_osd, (object_func_new)osd_new, (object_func_get_attr)osd_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)osd_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)osd_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/osd.h000066400000000000000000000057041264204753600160110ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_OSD_H #define NAVIT_OSD_H struct osd_priv; struct attr; struct osd_methods { void (*osd_destroy)(struct osd_priv *osd); int (*set_attr)(struct osd_priv *osd, struct attr* attr); void (*destroy)(struct osd_priv *osd); int (*get_attr)(struct osd_priv *osd, enum attr_type type, struct attr* attr); }; #define osd_draw_cast(x) (void (*)(struct osd_priv *osd, struct navit *navit, struct vehicle *v))(x) struct osd_item_methods { void (*draw)(struct osd_priv *osd, struct navit *navit, struct vehicle *v); }; struct osd_item { struct point p; struct osd_item_methods meth; int flags, w, h, fg_line_width, font_size, osd_configuration, configured; int rel_w, rel_h, rel_x, rel_y; struct color color_bg, color_fg, text_color; struct navit *navit; struct graphics *gr; struct graphics_gc *graphic_bg, *graphic_fg, *graphic_fg_text; struct graphics_font *font; char *font_name; struct callback *cb; struct callback *resize_cb; struct callback *reconfig_cb; struct callback *keypress_cb; int pressed; char *command; struct command_saved *enable_cs; char *accesskey; int do_draw; /**< Whether the item needs to be redrawn. */ }; /* prototypes */ struct attr; struct navit; struct osd; struct osd *osd_new(struct attr *parent, struct attr **attrs); int osd_set_methods(struct osd_methods *in, int in_size, struct osd_methods *out); void osd_wrap_point(struct point *p, struct navit *nav); void osd_std_click(struct osd_item *this, struct navit *nav, int pressed, int button, struct point *p); void osd_set_std_attr(struct attr **attrs, struct osd_item *item, int flags); void osd_std_config(struct osd_item *item, struct navit *navit); void osd_set_keypress(struct navit *nav, struct osd_item *item); void osd_set_std_config(struct navit *nav, struct osd_item *item); void osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv); void osd_std_resize(struct osd_item *item); void osd_std_calculate_sizes(struct osd_item *item, int w, int h); void osd_fill_with_bgcolor(struct osd_item *item); int osd_set_attr(struct osd *osd, struct attr* attr); int osd_get_attr(struct osd *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); /* end of prototypes */ #endif navit-0.5.0+dfsg.1/navit/osd/000077500000000000000000000000001264204753600156325ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/osd/Makefile.am000066400000000000000000000000761264204753600176710ustar00rootroot00000000000000SUBDIRS= DIST_SUBDIRS=core if OSD_CORE SUBDIRS+=core endif navit-0.5.0+dfsg.1/navit/osd/core/000077500000000000000000000000001264204753600165625ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/osd/core/CMakeLists.txt000066400000000000000000000000501264204753600213150ustar00rootroot00000000000000module_add_library(osd_core osd_core.c) navit-0.5.0+dfsg.1/navit/osd/core/Makefile.am000066400000000000000000000004711264204753600206200ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=osd_core if PLUGINS moduleosd_LTLIBRARIES = libosd_core.la else noinst_LTLIBRARIES = libosd_core.la endif libosd_core_la_SOURCES = osd_core.c libosd_core_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/osd/core/osd_core.c000066400000000000000000003314711264204753600205340ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef _MSC_VER #define _USE_MATH_DEFINES 1 #endif /* _MSC_VER */ #include #include #include #include #include #ifdef HAVE_SYS_TIME_H #include #endif #include #include "item.h" #include "xmlconfig.h" #include "point.h" #include "coord.h" #include "graphics.h" #include "transform.h" #include "route.h" #include "navit.h" #include "plugin.h" #include "debug.h" #include "callback.h" #include "color.h" #include "vehicle.h" #include "navigation.h" #include "track.h" #include "map.h" #include "file.h" #include "attr.h" #include "command.h" #include "navit_nls.h" #include "messages.h" #include "vehicleprofile.h" #include "roadprofile.h" #include "osd.h" #include "speech.h" #include "event.h" #include "mapset.h" #include "util.h" #ifdef HAVE_API_WIN32_CE #include "libc.h" #endif #ifdef _MSC_VER static double round(double x) { if (x >= 0.0) return floor(x + 0.5); else return ceil(x - 0.5); } #endif /* MSC_VER */ struct osd_priv_common { struct osd_item osd_item; struct osd_priv *data; int (*spec_set_attr_func)(struct osd_priv_common *opc, struct attr* attr); }; struct odometer; int set_std_osd_attr(struct osd_priv *priv, struct attr*the_attr); static void osd_odometer_reset(struct osd_priv_common *opc, int flags); static void osd_cmd_odometer_reset(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid); static void osd_odometer_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v); static struct osd_text_item * oti_new(struct osd_text_item * parent); int osd_button_set_attr(struct osd_priv_common *opc, struct attr* attr); static int b_commandtable_added = 0; struct compass { int width; struct graphics_gc *green; struct callback *click_cb; }; static void transform_rotate(struct point *center, int angle, struct point *p, int count) { int i, x, y; double dx, dy; for (i = 0; i < count; i++) { dx = sin(M_PI * angle / 180.0); dy = cos(M_PI * angle / 180.0); x = dy * p->x - dx * p->y; y = dx * p->x + dy * p->y; p->x = center->x + x; p->y = center->y + y; p++; } } static void handle(struct graphics *gr, struct graphics_gc *gc, struct point *p, int r, int dir) { struct point ph[3]; int l = r * 0.4; ph[0].x = 0; ph[0].y = r; ph[1].x = 0; ph[1].y = -r; transform_rotate(p, dir, ph, 2); graphics_draw_lines(gr, gc, ph, 2); ph[0].x = -l; ph[0].y = -r + l; ph[1].x = 0; ph[1].y = -r; ph[2].x = l; ph[2].y = -r + l; transform_rotate(p, dir, ph, 3); graphics_draw_lines(gr, gc, ph, 3); } /** * * Format distance, choosing the unit (m or km) and precision depending on distance * * * * @param distance distance in meters * * @param sep separator character to be inserted between distance value and unit * * @returns a pointer to a string containing the formatted distance * */ static char * format_distance(double distance, char *sep, int imperial) { if (imperial){ distance *= FEET_PER_METER; if(distance <= 500){ return g_strdup_printf("%.0f%sft", round(distance / 10) * 10, sep); } else { return g_strdup_printf("%.1f%smi", distance / FEET_PER_MILE, sep); } } else { if (distance >= 100000) return g_strdup_printf("%.0f%skm", distance / 1000, sep); else if (distance >= 10000) return g_strdup_printf("%.1f%skm", distance / 1000, sep); else if (distance >= 300) return g_strdup_printf("%.0f%sm", round(distance / 25) * 25, sep); else if (distance >= 50) return g_strdup_printf("%.0f%sm", round(distance / 10) * 10, sep); else if (distance >= 10) return g_strdup_printf("%.0f%sm", distance, sep); else return g_strdup_printf("%.1f%sm", distance, sep); } } /** * * Format time (duration) * * * * @param tm pointer to a tm structure specifying the time * * @param days days * * @returns a pointer to a string containing the formatted time * */ static char * format_time(struct tm *tm, int days) { if (days) return g_strdup_printf("%d+%02d:%02d", days, tm->tm_hour, tm->tm_min); else return g_strdup_printf("%02d:%02d", tm->tm_hour, tm->tm_min); } /** * * Format speed in km/h * * * * @param speed speed in km/h * * @param sep separator character to be inserted between speed value and unit * * @returns a pointer to a string containing the formatted speed * */ static char * format_speed(double speed, char *sep, char *format, int imperial) { char *unit="km/h"; if (imperial) { speed = speed*1000*FEET_PER_METER/FEET_PER_MILE; unit="mph"; } if (!format || !strcmp(format,"named")) return g_strdup_printf((speed < 10) ? "%.1f%s%s":"%.0f%s%s", speed, sep, unit); else if (!strcmp(format,"value") || !strcmp(format,"unit")) { if (!strcmp(format,"value")) return g_strdup_printf((speed < 10) ? "%.1f":"%.0f", speed); else return g_strdup(unit); } return g_strdup(""); } static char * format_float_0(double num) { return g_strdup_printf("%.0f", num); } int set_std_osd_attr(struct osd_priv *priv, struct attr*the_attr) { struct osd_priv_common *opc=(struct osd_priv_common *)priv; if(opc && the_attr && ATTR_IS_INT(the_attr->type)) { int attr_set=0; if(attr_w == the_attr->type) { opc->osd_item.rel_w = the_attr->u.num; attr_set=1; } else if(attr_h == the_attr->type) { opc->osd_item.rel_h = the_attr->u.num; attr_set=1; } else if(attr_x == the_attr->type) { opc->osd_item.rel_x = the_attr->u.num; attr_set=1; } else if(attr_y == the_attr->type) { opc->osd_item.rel_y = the_attr->u.num; attr_set=1; } else if(attr_font_size == the_attr->type) { opc->osd_item.font_size = the_attr->u.num; attr_set=1; } if(attr_set && opc->osd_item.gr) { osd_std_calculate_sizes(&opc->osd_item, navit_get_width(opc->osd_item.navit), navit_get_height(opc->osd_item.navit)); osd_std_resize(&opc->osd_item); return 1; } } if(opc->spec_set_attr_func) { opc->spec_set_attr_func(opc, the_attr); } return 0; } struct route_guard { int coord_num; struct coord *coords; double min_dist; //distance treshold, exceeding this distance will trigger announcement double max_dist; //out of range distance, farther than this distance no warning will be given char*item_name; char*map_name; int warned; double last_time; int update_period; struct color active_color; struct graphics_gc *red; int width; }; static void osd_route_guard_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { int i=0; struct vehicle* curr_vehicle = v; struct attr position_attr, vehicle_attr, imperial_attr; struct coord curr_coord; struct route_guard *this = (struct route_guard *)opc->data; double curr_time; struct timeval tv; struct point p; struct point bbox[4]; char* dist_str; struct graphics_gc *curr_color; int imperial=0; double min_dist; //do not execute for each gps update gettimeofday(&tv,NULL); curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; if ( this->last_time+this->update_period > curr_time) { return; } this->last_time = curr_time; if(nav) { navit_get_attr(nav, attr_vehicle, &vehicle_attr, NULL); if (vehicle_attr.u.vehicle) { curr_vehicle = vehicle_attr.u.vehicle; } if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) { imperial=imperial_attr.u.num; } } if(0==curr_vehicle) return; if(!vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL)) { return; } transform_from_geo(projection_mg, position_attr.u.coord_geo, &curr_coord); min_dist = 1000000; //calculate min dist if(this->coord_num > 1) { double scale = transform_scale(curr_coord.y); for( i=1 ; icoord_num ; ++i ) { struct coord proj_coord; double curr_dist; transform_distance_line_sq(&this->coords[i-1], &this->coords[i], &curr_coord, &proj_coord); curr_dist = transform_distance(projection_mg, &proj_coord, &curr_coord); curr_dist /= scale; if (curr_distwarned == 0 && this->min_dist < min_dist && min_dist < this->max_dist) { navit_say(nav, _("Return to route!")); this->warned = 1; } else if( min_dist < this->min_dist ) { this->warned = 0; } } osd_fill_with_bgcolor(&opc->osd_item); dist_str = format_distance(min_dist, "", imperial); graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, dist_str, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; curr_color = (this->min_dist < min_dist && min_dist < this->max_dist) ? this->red : opc->osd_item.graphic_fg; graphics_draw_text(opc->osd_item.gr, curr_color, NULL, opc->osd_item.font, dist_str, &p, 0x10000, 0); g_free(dist_str); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_route_guard_init(struct osd_priv_common *opc, struct navit *nav) { struct color red_color={0xffff,0x0000,0x0000,0xffff}; struct route_guard *this = (struct route_guard *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); //load coord data if (this->map_name && this->item_name) { struct mapset* ms; struct map_rect *mr; struct mapset_handle *msh; struct map *map = NULL; struct item *item = NULL; if(!(ms=navit_get_mapset(nav))) { return; } msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { struct attr attr; if(map_get_attr(map, attr_name, &attr, NULL)) { if( ! strcmp(this->map_name, attr.u.str) ) { mr=map_rect_new(map, NULL); if (mr) { while ((item=map_rect_get_item(mr))) { struct attr item_attr; if(item_attr_get(item, attr_name, &item_attr)) { if (!strcmp(item_attr.u.str,this->item_name)) { //item found, get coords struct coord c; this->coord_num=0; while (item_coord_get(item,&c,1)) { this->coords = g_renew(struct coord,this->coords,this->coord_num+1); this->coords[this->coord_num] = c; ++this->coord_num; } } } } } } else { continue; } } else { continue; } } mapset_close(msh); } this->red = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->red, &red_color); graphics_gc_set_linewidth(this->red, this->width); opc->osd_item.graphic_fg = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(opc->osd_item.graphic_fg, &opc->osd_item.text_color); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); //setup draw callback navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_draw), attr_position_coord_geo, opc)); } static void osd_route_guard_destroy(struct osd_priv_common *opc) { struct route_guard *this = (struct route_guard *)opc->data; g_free(this->coords); } static struct osd_priv * osd_route_guard_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct route_guard *this = g_new0(struct route_guard, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = 120; opc->osd_item.rel_y = 20; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_route_guard_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_min_dist); if (attr) { this->min_dist = attr->u.num; } else this->min_dist = 30; //default tolerance is 30m attr = attr_search(attrs, NULL, attr_max_dist); if (attr) { this->max_dist = attr->u.num; } else this->max_dist = 500; //default attr = attr_search(attrs, NULL, attr_item_name); if (attr) { this->item_name = g_strdup(attr->u.str); } else this->item_name = NULL; attr = attr_search(attrs, NULL, attr_map_name); if (attr) { this->map_name = g_strdup(attr->u.str); } else this->map_name = NULL; attr = attr_search(attrs, NULL, attr_update_period); this->update_period=attr ? attr->u.num : 10; attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_init), attr_graphics_ready, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_destroy), attr_destroy, opc)); return (struct osd_priv *) opc; } static int odometers_saved = 0; static GList* odometer_list = NULL; static struct command_table commands[] = { {"odometer_reset",command_cast(osd_cmd_odometer_reset)}, }; struct odometer { int width; struct graphics_gc *orange; struct callback *click_cb; char *text; //text of label attribute for this osd char *name; //unique name of the odometer (needed for handling multiple odometers persistently) struct color idle_color; //text color when counter is idle int bDisableReset; int bAutoStart; int bActive; //counting or not int autosave_period; //autosave period in seconds double sum_dist; //sum of distance ofprevious intervals in meters double sum_time; //sum of time of previous intervals in seconds (needed for avg spd calculation) double time_all; double last_click_time; //time of last click (for double click handling) double last_start_time; //time of last start of counting double last_update_time; //time of last position update struct coord last_coord; double last_speed; double max_speed; double acceleration; }; static void osd_cmd_odometer_reset(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { GList* list = odometer_list; while(list) { if(!strcmp(((struct odometer*)((struct osd_priv_common *)(list->data))->data)->name,in[0]->u.str)) { osd_odometer_reset(list->data,3); osd_odometer_draw(list->data,this,NULL); } list = g_list_next(list); } } } static char* str_replace(char*output, char*input, char*pattern, char*replacement) { char *pos; char *pos2; if (!output || !input || !pattern || !replacement) { return NULL; } if(!strcmp(pattern,"")) { return input; } pos = &input[0]; pos2 = &input[0]; output[0] = 0; while ( (pos2=strstr(pos,pattern)) ) { strncat(output,pos,pos2-pos); strcat(output,replacement); pos = pos2 + strlen(pattern); } strcat(output,pos); return NULL; } /* * save current odometer state to string */ static char *osd_odometer_to_string(struct odometer *this_) { return g_strdup_printf("odometer %s %lf %lf %d %lf\n",this_->name,this_->sum_dist,this_->time_all,this_->bActive,this_->max_speed); } /* * load current odometer state from string */ static void osd_odometer_from_string(struct odometer *this_, char*str) { char* tok; char* name_str; char* sum_dist_str; char* sum_time_str; char* active_str; char* max_spd_str; tok = strtok(str, " "); if( !tok || strcmp("odometer",tok)) { return; } name_str = g_strdup(strtok(NULL, " ")); if(!name_str) { return; } sum_dist_str = g_strdup(strtok(NULL, " ")); if(!sum_dist_str) { g_free(name_str); return; } sum_time_str = g_strdup(strtok(NULL, " ")); if(!sum_time_str) { g_free(name_str); g_free(sum_dist_str); return; } active_str = g_strdup(strtok(NULL, " ")); if(!active_str) { g_free(name_str); g_free(sum_dist_str); g_free(sum_time_str); return; } max_spd_str = g_strdup(strtok(NULL, " ")); if(!max_spd_str) { g_free(name_str); g_free(sum_dist_str); g_free(sum_time_str); g_free(active_str); return; } this_->name = name_str; this_->sum_dist = atof(sum_dist_str); this_->sum_time = atof(sum_time_str); this_->bActive = atoi(active_str); this_->max_speed = atof(max_spd_str); this_->last_coord.x = -1; g_free(active_str); g_free(sum_dist_str); g_free(sum_time_str); g_free(max_spd_str); } static void draw_multiline_osd_text(char *buffer,struct osd_item *osd_item, struct graphics_gc *curr_color) { gchar**bufvec = g_strsplit(buffer,"\n",0); struct point p, bbox[4]; //count strings int strnum = 0; gchar**pch = bufvec; while(*pch) { ++strnum; ++pch; } if(0h / strnum; pch = bufvec; p.y = 0; while (*pch) { graphics_get_text_bbox(osd_item->gr, osd_item->font, *pch, 0x10000, 0, bbox, 0); p.x=(osd_item->w-bbox[2].x)/2; p.y += dh; graphics_draw_text(osd_item->gr, curr_color, NULL, osd_item->font, *pch, &p, 0x10000, 0); ++pch; } } g_free(bufvec); } static void osd_odometer_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct odometer *this = (struct odometer *)opc->data; struct coord curr_coord; struct graphics_gc *curr_color; char *dist_buffer=0; char *spd_buffer=0; char *max_spd_buffer=0; char *time_buffer = 0; char *acc_buffer = 0; struct attr position_attr,vehicle_attr,imperial_attr,speed_attr; enum projection pro; struct vehicle* curr_vehicle = v; double spd = 0; double curr_spd = 0; int remainder; int days; int hours; int mins; int secs; int imperial=0; char buffer [256+1]=""; char buffer2[256+1]=""; if(nav) { if (navit_get_attr(nav, attr_vehicle, &vehicle_attr, NULL)) curr_vehicle=vehicle_attr.u.vehicle; if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; } if(0==curr_vehicle) return; osd_fill_with_bgcolor(&opc->osd_item); if(this->bActive) { if(!vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL)) { return; } pro = projection_mg;//position_attr.u.pcoord->pro; transform_from_geo(pro, position_attr.u.coord_geo, &curr_coord); if (this->last_coord.x != -1 ) { const double cStepDistLimit = 10000; struct timeval tv; double curr_time; double dt; double dCurrDist = 0; gettimeofday(&tv,NULL); curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; //we have valid previous position dt = curr_time-this->last_update_time; dCurrDist = transform_distance(pro, &curr_coord, &this->last_coord); if(dCurrDist<=cStepDistLimit) { this->sum_dist += dCurrDist; } this->time_all = curr_time-this->last_click_time+this->sum_time; spd = 3.6*(double)this->sum_dist/(double)this->time_all; if(dt != 0) { if (curr_coord.x!=this->last_coord.x || curr_coord.y!=this->last_coord.y) { if(vehicle_get_attr(curr_vehicle, attr_position_speed,&speed_attr, NULL)) { double dv; curr_spd = *speed_attr.u.numd; dv = (curr_spd-this->last_speed)/3.6; //speed difference in m/sec this->acceleration = dv/dt; this->last_speed = curr_spd; this->last_update_time = curr_time; } } } this->max_speed = (curr_spd<=this->max_speed) ? this->max_speed : curr_spd; } this->last_coord = curr_coord; } dist_buffer = format_distance(this->sum_dist,"",imperial); spd_buffer = format_speed(spd,"","value",imperial); max_spd_buffer = format_speed(this->max_speed,"","value",imperial); acc_buffer = g_strdup_printf("%.3f m/s2",this->acceleration); remainder = (int)this->time_all; days = remainder / (24*60*60); remainder = remainder % (24*60*60); hours = remainder / (60*60); remainder = remainder % (60*60); mins = remainder / (60); remainder = remainder % (60); secs = remainder; if(0text) { str_replace(buffer,this->text,"${avg_spd}",spd_buffer); str_replace(buffer2,buffer,"${distance}",dist_buffer); str_replace(buffer,buffer2,"${time}",time_buffer); str_replace(buffer2,buffer,"${acceleration}",acc_buffer); str_replace(buffer,buffer2,"${max_spd}",max_spd_buffer); } g_free(time_buffer); curr_color = this->bActive?opc->osd_item.graphic_fg:this->orange; draw_multiline_osd_text(buffer,&opc->osd_item, curr_color); g_free(dist_buffer); g_free(spd_buffer); g_free(max_spd_buffer); g_free(acc_buffer); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_odometer_reset(struct osd_priv_common *opc, int flags) { struct odometer *this = (struct odometer *)opc->data; if(!this->bDisableReset || (flags & 1)) { if (!(flags & 2)) this->bActive = 0; this->sum_dist = 0; this->sum_time = 0; this->max_speed = 0; this->last_start_time = 0; this->last_coord.x = -1; this->last_coord.y = -1; } } static void osd_odometer_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) { struct odometer *this = (struct odometer *)opc->data; struct point bp = opc->osd_item.p; struct timeval tv; double curr_time; const double double_click_timewin = .5; osd_wrap_point(&bp, nav); if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h || !opc->osd_item.configured ) && !opc->osd_item.pressed) return; if (button != 1) return; if (navit_ignore_button(nav)) return; if (!!pressed == !!opc->osd_item.pressed) return; gettimeofday(&tv,NULL); curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; if (pressed) { //single click handling if(this->bActive) { //being stopped this->last_coord.x = -1; this->last_coord.y = -1; this->sum_time += curr_time-this->last_click_time; } this->bActive ^= 1; //toggle active flag if (curr_time-double_click_timewin <= this->last_click_time) { //double click handling osd_odometer_reset(opc,0); } this->last_click_time = curr_time; osd_odometer_draw(opc, nav,NULL); } } static int osd_odometer_save(struct navit* nav) { //save odometers that are persistent(ie have name) FILE*f; GList* list = odometer_list; char* fn = g_strdup_printf("%s/odometer.txt",navit_get_user_data_directory(TRUE)); f = fopen(fn,"w+"); g_free(fn); if(!f) { return TRUE; } while (list) { if(((struct odometer*)((struct osd_priv_common *)(list->data))->data)->name) { char*odo_str = osd_odometer_to_string((struct odometer*)((struct osd_priv_common *)(list->data))->data); fprintf(f,"%s",odo_str); g_free(odo_str); } list = g_list_next(list); } fclose(f); return TRUE; } static void osd_odometer_init(struct osd_priv_common *opc, struct navit *nav) { struct odometer *this = (struct odometer *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->orange = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->orange, &this->idle_color); graphics_gc_set_linewidth(this->orange, this->width); opc->osd_item.graphic_fg = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(opc->osd_item.graphic_fg, &opc->osd_item.text_color); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_draw), attr_position_coord_geo, opc)); navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_odometer_click), attr_button, opc)); if(this->autosave_period>0) { event_add_timeout(this->autosave_period*1000, 1, callback_new_1(callback_cast(osd_odometer_save), NULL)); } if(this->bAutoStart) { this->bActive = 1; } osd_odometer_draw(opc, nav, NULL); } static void osd_odometer_destroy(struct navit* nav) { if(!odometers_saved) { odometers_saved = 1; osd_odometer_save(NULL); } } static struct osd_priv * osd_odometer_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { FILE* f; char* fn; struct odometer *this = g_new0(struct odometer, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; struct color orange_color={0xffff,0xa5a5,0x0000,0xffff}; opc->data = (void*)this; opc->osd_item.rel_x = 120; opc->osd_item.rel_y = 20; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_odometer_draw); meth->set_attr = set_std_osd_attr; this->bActive = 0; //do not count on init this->sum_dist = 0; this->max_speed = 0; this->last_click_time = time(0); this->last_coord.x = -1; this->last_coord.y = -1; attr = attr_search(attrs, NULL, attr_label); //FIXME find some way to free text!!!! if (attr) { this->text = g_strdup(attr->u.str); } else this->text = NULL; attr = attr_search(attrs, NULL, attr_name); //FIXME find some way to free text!!!! if (attr) { this->name = g_strdup(attr->u.str); } else this->name = NULL; attr = attr_search(attrs, NULL, attr_disable_reset); if (attr) this->bDisableReset = attr->u.num; else this->bDisableReset = 0; attr = attr_search(attrs, NULL, attr_autostart); if (attr) this->bAutoStart = attr->u.num; else this->bAutoStart = 0; attr = attr_search(attrs, NULL, attr_autosave_period); if (attr) this->autosave_period = attr->u.num; else this->autosave_period = -1; //disabled by default osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_idle_color); this->idle_color=attr ? *attr->u.color : orange_color; // text idle_color defaults to orange this->last_coord.x = -1; this->last_coord.y = -1; this->sum_dist = 0.0; //load state from file fn = g_strdup_printf("%s/odometer.txt",navit_get_user_data_directory(FALSE)); f = fopen(fn,"r+"); if(f) { g_free(fn); while(!feof(f)) { char str[128]; char *line; if(fgets(str,128,f)) { char *tok; line = g_strdup(str); tok = strtok(str," "); if(!strcmp(tok,"odometer")) { tok = strtok(NULL," "); if(this->name && tok && !strcmp(this->name,tok)) { osd_odometer_from_string(this,line); } } g_free(line); } } fclose(f); } if(b_commandtable_added == 0) { navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); b_commandtable_added = 1; } navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_init), attr_graphics_ready, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_destroy), attr_destroy, nav)); odometer_list = g_list_append(odometer_list, opc); return (struct osd_priv *) opc; } struct cmd_interface { int width; struct graphics_gc *orange; int update_period; //in sec char* text; struct graphics_image *img; char*img_filename; char* command; int bReserved; }; static void osd_cmd_interface_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct cmd_interface *this = (struct cmd_interface *)opc->data; struct point p; struct point bbox[4]; struct graphics_gc *curr_color; struct attr navit; p.x = 0; p.y = 0; navit.type=attr_navit; navit.u.navit = opc->osd_item.navit; if(0==this->bReserved) { this->bReserved = 1; command_evaluate(&navit, this->command); this->bReserved = 0; } osd_fill_with_bgcolor(&opc->osd_item); //display image if(this->img) { graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, this->img); } //display text graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, this->text, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; curr_color = opc->osd_item.graphic_fg; if(this->text) draw_multiline_osd_text(this->text,&opc->osd_item, curr_color); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_cmd_interface_init(struct osd_priv_common *opc, struct navit *nav) { struct cmd_interface *this = (struct cmd_interface *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); opc->osd_item.graphic_fg = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(opc->osd_item.graphic_fg, &opc->osd_item.text_color); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); if(this->update_period>0) { event_add_timeout(this->update_period*1000, 1, callback_new_1(callback_cast(osd_cmd_interface_draw), opc)); } navit_add_callback(nav, callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); this->text = g_strdup(""); } static int osd_cmd_interface_set_attr(struct osd_priv_common *opc, struct attr* attr) { struct cmd_interface *this_ = (struct cmd_interface *)opc->data; if(NULL==attr || NULL==this_) { return 0; } if(attr->type == attr_status_text) { if(this_->text) { g_free(this_->text); } if(attr->u.str) { this_->text = g_strdup(attr->u.str); } return 1; } if(attr->type == attr_src) { if(attr->u.str) { if((!this_->img_filename) || strcmp(this_->img_filename, graphics_icon_path(attr->u.str))) { //destroy old img, create new image if(this_->img) { graphics_image_free(opc->osd_item.gr, this_->img); } if(this_->img_filename) { g_free(this_->img_filename); } this_->img_filename = graphics_icon_path(attr->u.str); this_->img = graphics_image_new(opc->osd_item.gr, this_->img_filename); } } return 1; } return 0; } static struct osd_priv * osd_cmd_interface_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct cmd_interface *this = g_new0(struct cmd_interface, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = 120; opc->osd_item.rel_y = 20; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_cmd_interface_draw); opc->spec_set_attr_func = osd_cmd_interface_set_attr; meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_update_period); this->update_period=attr ? attr->u.num : 5; //default update period is 5 seconds attr = attr_search(attrs, NULL, attr_command); this->command = attr ? g_strdup(attr->u.str) : g_strdup(""); if(b_commandtable_added == 0) { navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); b_commandtable_added = 1; } navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_cmd_interface_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct stopwatch { int width; struct graphics_gc *orange; struct callback *click_cb; struct color idle_color; //text color when counter is idle int bDisableReset; int bActive; //counting or not time_t current_base_time; //base time of currently measured time interval time_t sum_time; //sum of previous time intervals (except current intervals) time_t last_click_time; //time of last click (for double click handling) }; static void osd_stopwatch_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct stopwatch *this = (struct stopwatch *)opc->data; struct graphics_gc *curr_color; char buffer[32]="00:00:00"; struct point p; struct point bbox[4]; time_t total_sec,total_min,total_hours,total_days; total_sec = this->sum_time; osd_fill_with_bgcolor(&opc->osd_item); if(this->bActive) { total_sec += time(0)-this->current_base_time; } total_min = total_sec/60; total_hours = total_min/60; total_days = total_hours/24; if (total_days==0) { g_snprintf(buffer,32,"%02d:%02d:%02d", (int)total_hours%24, (int)total_min%60, (int)total_sec%60); } else { g_snprintf(buffer,32,"%02dd %02d:%02d:%02d", (int)total_days, (int)total_hours%24, (int)total_min%60, (int)total_sec%60); } graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; curr_color = this->bActive?opc->osd_item.graphic_fg:this->orange; graphics_draw_text(opc->osd_item.gr, curr_color, NULL, opc->osd_item.font, buffer, &p, 0x10000, 0); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_stopwatch_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) { struct stopwatch *this = (struct stopwatch *)opc->data; struct point bp = opc->osd_item.p; osd_wrap_point(&bp, nav); if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h || !opc->osd_item.configured ) && !opc->osd_item.pressed) return; if (button != 1) return; if (navit_ignore_button(nav)) return; if (!!pressed == !!opc->osd_item.pressed) return; if (pressed) { //single click handling if(this->bActive) { this->sum_time += time(0)-this->current_base_time; this->current_base_time = 0; } else { this->current_base_time = time(0); } this->bActive ^= 1; //toggle active flag if (this->last_click_time == time(0) && !this->bDisableReset) { //double click handling this->bActive = 0; this->current_base_time = 0; this->sum_time = 0; } this->last_click_time = time(0); } osd_stopwatch_draw(opc, nav,NULL); } static void osd_stopwatch_init(struct osd_priv_common *opc, struct navit *nav) { struct stopwatch *this = (struct stopwatch *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->orange = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->orange, &this->idle_color); graphics_gc_set_linewidth(this->orange, this->width); opc->osd_item.graphic_fg = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(opc->osd_item.graphic_fg, &opc->osd_item.text_color); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); event_add_timeout(500, 1, callback_new_1(callback_cast(osd_stopwatch_draw), opc)); navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_stopwatch_click), attr_button, opc)); osd_stopwatch_draw(opc, nav, NULL); } static struct osd_priv * osd_stopwatch_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct stopwatch *this = g_new0(struct stopwatch, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; struct color orange_color={0xffff,0xa5a5,0x0000,0xffff}; opc->data = (void*)this; opc->osd_item.rel_x = 120; opc->osd_item.rel_y = 20; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_stopwatch_draw); meth->set_attr = set_std_osd_attr; this->bActive = 0; //do not count on init this->current_base_time = 0; this->sum_time = 0; this->last_click_time = 0; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_idle_color); this->idle_color=attr ? *attr->u.color : orange_color; // text idle_color defaults to orange attr = attr_search(attrs, NULL, attr_disable_reset); if (attr) this->bDisableReset = attr->u.num; else this->bDisableReset = 0; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_stopwatch_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } static void osd_compass_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) { struct compass *this = (struct compass *)opc->data; struct point p,bbox[4]; struct attr attr_dir, destination_attr, position_attr, imperial_attr; double dir, vdir = 0; char *buffer; struct coord c1, c2; enum projection pro; int imperial=0; if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; osd_fill_with_bgcolor(&opc->osd_item); p.x = opc->osd_item.w/2; p.y = opc->osd_item.w/2; graphics_draw_circle(opc->osd_item.gr, opc->osd_item.graphic_fg, &p, opc->osd_item.w*5/6); if (v) { if (vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL)) { vdir = *attr_dir.u.numd; handle(opc->osd_item.gr, opc->osd_item.graphic_fg, &p, opc->osd_item.w/3, -vdir); } if (navit_get_attr(nav, attr_destination, &destination_attr, NULL) && vehicle_get_attr(v, attr_position_coord_geo,&position_attr, NULL)) { pro = destination_attr.u.pcoord->pro; transform_from_geo(pro, position_attr.u.coord_geo, &c1); c2.x = destination_attr.u.pcoord->x; c2.y = destination_attr.u.pcoord->y; dir = atan2(c2.x - c1.x, c2.y - c1.y) * 180.0 / M_PI; dir -= vdir; handle(opc->osd_item.gr, this->green, &p, opc->osd_item.w/3, dir); buffer=format_distance(transform_distance(pro, &c1, &c2),"",imperial); graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y = opc->osd_item.h-opc->osd_item.h/10; graphics_draw_text(opc->osd_item.gr, this->green, NULL, opc->osd_item.font, buffer, &p, 0x10000, 0); g_free(buffer); } } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_compass_init(struct osd_priv_common *opc, struct navit *nav) { struct color c; struct compass *this = (struct compass *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->green = graphics_gc_new(opc->osd_item.gr); c.r = 0; c.g = 65535; c.b = 0; c.a = 65535; graphics_gc_set_foreground(this->green, &c); graphics_gc_set_linewidth(this->green, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_compass_draw), attr_position_coord_geo, opc)); if (opc->osd_item.command) navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); osd_compass_draw(opc, nav, NULL); } static struct osd_priv * osd_compass_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct compass *this = g_new0(struct compass, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = 20; opc->osd_item.rel_y = 20; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_compass_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_compass_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_button { int use_overlay; struct callback *draw_cb,*navit_init_cb; struct graphics_image *img; char *src_dir,*src; }; static void osd_button_adjust_sizes(struct osd_priv_common *opc, struct graphics_image *img) { if(opc->osd_item.rel_w==ATTR_REL_RELSHIFT) opc->osd_item.w=img->width; if(opc->osd_item.rel_h==ATTR_REL_RELSHIFT) opc->osd_item.h=img->height; } static void osd_button_draw(struct osd_priv_common *opc, struct navit *nav) { struct osd_button *this = (struct osd_button *)opc->data; // FIXME: Do we need this check? if(navit_get_blocked(nav)&1) return; struct point p; if (this->use_overlay) { struct graphics_image *img; img=graphics_image_new(opc->osd_item.gr, this->src); osd_button_adjust_sizes(opc, img); p.x=(opc->osd_item.w-img->width)/2; p.y=(opc->osd_item.h-img->height)/2; osd_fill_with_bgcolor(&opc->osd_item); graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); graphics_image_free(opc->osd_item.gr, img); } else { struct graphics *gra; gra = navit_get_graphics(nav); this->img = graphics_image_new(gra, this->src); if (!this->img) { dbg(lvl_warning, "failed to load '%s'\n", this->src); return; } osd_std_calculate_sizes(&opc->osd_item, navit_get_width(nav), navit_get_height(nav)); osd_button_adjust_sizes(opc, this->img); p = opc->osd_item.p; p.x+=(opc->osd_item.w-this->img->width)/2; p.y+=(opc->osd_item.h-this->img->height)/2; if (!opc->osd_item.configured) return; graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, this->img); } } static void osd_button_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_button *this = (struct osd_button *)opc->data; struct graphics *gra = navit_get_graphics(nav); dbg(lvl_debug, "enter\n"); this->img = graphics_image_new(gra, this->src); if (!this->img) { dbg(lvl_warning, "failed to load '%s'\n", this->src); return; } osd_button_adjust_sizes(opc, this->img); if (this->use_overlay) { struct graphics_image *img; struct point p; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); img=graphics_image_new(opc->osd_item.gr, this->src); p.x=(opc->osd_item.w-this->img->width)/2; p.y=(opc->osd_item.h-this->img->height)/2; osd_fill_with_bgcolor(&opc->osd_item); graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); graphics_image_free(opc->osd_item.gr, img); } else { osd_set_std_config(nav, &opc->osd_item); osd_set_keypress(nav, &opc->osd_item); opc->osd_item.gr=gra; opc->osd_item.graphic_bg=graphics_gc_new(opc->osd_item.gr); graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_button_draw), attr_postdraw, opc, nav)); } navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); osd_button_draw(opc,nav); } static char * osd_button_icon_path(struct osd_button *this_, char *src) { if (!this_->src_dir) return graphics_icon_path(src); return g_strdup_printf("%s%s%s",this_->src_dir, G_DIR_SEPARATOR_S, src); } int osd_button_set_attr(struct osd_priv_common *opc, struct attr* attr) { struct osd_button *this_ = (struct osd_button *)opc->data; if(NULL==attr || NULL==this_) { return 0; } if(attr->type == attr_src) { struct navit *nav; struct graphics *gra; if(this_->src) { g_free(this_->src); } if(attr->u.str) { this_->src = osd_button_icon_path(this_, attr->u.str); } nav = opc->osd_item.navit; gra = navit_get_graphics(nav); this_->img = graphics_image_new(gra, this_->src); if (!this_->img) { dbg(lvl_warning, "failed to load '%s'\n", this_->src); return 0; } if(navit_get_blocked(nav)&1) return 1; osd_button_draw(opc,nav); navit_draw(opc->osd_item.navit); return 1; } return 0; } static struct osd_priv * osd_button_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_button *this = g_new0(struct osd_button, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.navit = nav; opc->osd_item.meth.draw = osd_draw_cast(osd_button_draw); /*Value of 0% is stored in relative attributes as ATTR_REL_RELSHIFT, we use this value as "width/height unset" flag */ opc->osd_item.rel_w = ATTR_REL_RELSHIFT; opc->osd_item.rel_h = ATTR_REL_RELSHIFT; meth->set_attr = set_std_osd_attr; opc->spec_set_attr_func = osd_button_set_attr; attr=attr_search(attrs, NULL, attr_use_overlay); if (attr) this->use_overlay=attr->u.num; osd_set_std_attr(attrs, &opc->osd_item, this->use_overlay ? 1:(1|16)); if (!opc->osd_item.command) { dbg(lvl_error, "no command\n"); goto error; } attr = attr_search(attrs, NULL, attr_src_dir); if (attr) this->src_dir=graphics_icon_path(attr->u.str); else this->src_dir=NULL; attr = attr_search(attrs, NULL, attr_src); if (!attr) { dbg(lvl_error, "no src\n"); goto error; } this->src = osd_button_icon_path(this, attr->u.str); navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_button_init), attr_graphics_ready, opc)); if(b_commandtable_added == 0) { navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); b_commandtable_added = 1; } return (struct osd_priv *) opc; error: g_free(this); g_free(opc); return NULL; } static void osd_image_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_button *this = (struct osd_button *)opc->data; struct graphics *gra = navit_get_graphics(nav); dbg(lvl_debug, "enter\n"); this->img = graphics_image_new(gra, this->src); if (!this->img) { dbg(lvl_warning, "failed to load '%s'\n", this->src); return; } osd_button_adjust_sizes(opc, this->img); if (this->use_overlay) { struct graphics_image *img; struct point p; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); img=graphics_image_new(opc->osd_item.gr, this->src); p.x=(opc->osd_item.w-this->img->width)/2; p.y=(opc->osd_item.h-this->img->height)/2; osd_fill_with_bgcolor(&opc->osd_item); graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); graphics_image_free(opc->osd_item.gr, img); } else { opc->osd_item.configured=1; opc->osd_item.gr=gra; opc->osd_item.graphic_bg=graphics_gc_new(opc->osd_item.gr); graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_button_draw), attr_postdraw, opc, nav)); } osd_button_draw(opc,nav); } static struct osd_priv * osd_image_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_button *this = g_new0(struct osd_button, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.navit = nav; opc->osd_item.meth.draw = osd_draw_cast(osd_button_draw); /*Value of 0% is stored in relative attributes as ATTR_REL_RELSHIFT, we use this value as "width/height unset" flag */ opc->osd_item.rel_w = ATTR_REL_RELSHIFT; opc->osd_item.rel_h = ATTR_REL_RELSHIFT; meth->set_attr = set_std_osd_attr; opc->spec_set_attr_func = osd_button_set_attr; osd_set_std_attr(attrs, &opc->osd_item, 1); attr=attr_search(attrs, NULL, attr_use_overlay); if (attr) this->use_overlay=attr->u.num; attr = attr_search(attrs, NULL, attr_src); if (!attr) { dbg(lvl_error, "no src\n"); goto error; } this->src = graphics_icon_path(attr->u.str); navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_image_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; error: g_free(opc); g_free(this); return NULL; } /** * Internal data for {@code navigation_status} OSD. */ struct navigation_status { char *icon_src; /**< Source for icon, with a placeholder */ int icon_h; int icon_w; int last_status; /**< Last status displayed. Apart from the usual values of {@code nav_status}, -2 is used to indicate we have not yet received a status. */ }; /** * @brief Draws a {@code navigation_status} OSD. * * @param opc The OSD to draw * @param status The status of the navigation engine (the value of the {@code nav_status} attribute) */ static void osd_navigation_status_draw(struct osd_priv_common *opc, int status) { struct navigation_status *this = (struct navigation_status *)opc->data; struct point p; int do_draw = opc->osd_item.do_draw; struct graphics_image *gr_image; char *image; /* When we're routing, the status will flip from 4 (routing) to 3 (recalculating) and back on * every position update. This hack prevents unnecessary (and even undesirable) updates. */ int status2 = (status == 3) ? 4 : status; if ((status2 != this->last_status) && (status2 != status_invalid)) { this->last_status = status2; do_draw = 1; } if (do_draw) { osd_fill_with_bgcolor(&opc->osd_item); image = g_strdup_printf(this->icon_src, nav_status_to_text(status2)); dbg(lvl_debug, "image=%s\n", image); gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); if (!gr_image) { dbg(lvl_error,"failed to load %s in %dx%d\n",image,this->icon_w,this->icon_h); g_free(image); image = graphics_icon_path("unknown.png"); gr_image = graphics_image_new_scaled(opc-> osd_item.gr, image, this->icon_w, this-> icon_h); } dbg(lvl_debug, "gr_image=%p\n", gr_image); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(image); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } /** * @brief Initializes a new {@code navigation_status} OSD. * * This function is registered as a callback function in {@link osd_navigation_status_new(struct navit *, struct osd_methods *, struct attr **)}. * It is called after graphics initialization has finished and can be used for any initialization * tasks which rely on a functional graphics system. * * @param opc The OSD to initialize * @param navit The navit instance */ static void osd_navigation_status_init(struct osd_priv_common *opc, struct navit *navit) { struct navigation *nav = NULL; struct attr attr; dbg(lvl_debug, "enter, opc=%p\n", opc); osd_set_std_graphic(navit, &opc->osd_item, (struct osd_priv *)opc); if (navit) nav = navit_get_navigation(navit); if (nav) { navigation_register_callback(nav, attr_nav_status, callback_new_attr_1(callback_cast(osd_navigation_status_draw), attr_nav_status, opc)); if (navigation_get_attr(nav, attr_nav_status, &attr, NULL)) osd_navigation_status_draw(opc, attr.u.num); } else dbg(lvl_error, "navigation instance is NULL, OSD will never update\n"); //navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); // FIXME do we need this? } /** * @brief Creates a new {@code navigation_status} OSD. * * This initializes the data structures and registers {@link osd_navigation_status_init(struct osd_priv_common *, struct navit *)} * as a callback. * * Note that this function runs before the graphics system has been initialized. Therefore, code * that requires a functional graphics system must be placed in * {@link osd_navigation_status_init(struct osd_priv_common *, struct navit *)}. * * @param nav The navit instance * @param meth The methods for the new OSD * @param attrs The attributes for the new OSD */ static struct osd_priv *osd_navigation_status_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct navigation_status *this = g_new0(struct navigation_status, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = 20; opc->osd_item.rel_y = -80; opc->osd_item.rel_w = 70; opc->osd_item.navit = nav; opc->osd_item.rel_h = 70; opc->osd_item.font_size = 200; // FIXME may not be needed opc->osd_item.meth.draw = osd_draw_cast(osd_navigation_status_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->last_status = status_invalid; attr = attr_search(attrs, NULL, attr_icon_w); if (attr) this->icon_w = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_h); if (attr) this->icon_h = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = graphics_icon_path(array[0]); file_wordexp_destroy(we); } else { this->icon_src = graphics_icon_path("%s_wh.svg"); } navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_navigation_status_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct nav_next_turn { char *test_text; char *icon_src; int icon_h, icon_w, active; char *last_name; int level; }; static void osd_nav_next_turn_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct nav_next_turn *this = (struct nav_next_turn *)opc->data; struct point p; int do_draw = opc->osd_item.do_draw; struct navigation *nav = NULL; struct map *map = NULL; struct map_rect *mr = NULL; struct item *item = NULL; struct graphics_image *gr_image; char *image; char *name = "unknown"; int level = this->level; if (navit) nav = navit_get_navigation(navit); if (nav) map = navigation_get_map(nav); if (map) mr = map_rect_new(map, NULL); if (mr) while ((item = map_rect_get_item(mr)) && (item->type == type_nav_position || item->type == type_nav_none || level-- > 0)); if (item) { name = item_to_name(item->type); dbg(lvl_debug, "name=%s\n", name); if (this->active != 1 || this->last_name != name) { this->active = 1; this->last_name = name; do_draw = 1; } } else { if (this->active != 0) { this->active = 0; do_draw = 1; } } if (mr) map_rect_destroy(mr); if (do_draw) { osd_fill_with_bgcolor(&opc->osd_item); if (this->active) { image = g_strdup_printf(this->icon_src, name); dbg(lvl_debug, "image=%s\n", image); gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); if (!gr_image) { dbg(lvl_error,"failed to load %s in %dx%d\n",image,this->icon_w,this->icon_h); g_free(image); image = graphics_icon_path("unknown.png"); gr_image = graphics_image_new_scaled(opc-> osd_item.gr, image, this->icon_w, this-> icon_h); } dbg(lvl_debug, "gr_image=%p\n", gr_image); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(image); } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } static void osd_nav_next_turn_init(struct osd_priv_common *opc, struct navit *nav) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_next_turn_draw), attr_position_coord_geo, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); osd_nav_next_turn_draw(opc, nav, NULL); } static struct osd_priv * osd_nav_next_turn_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct nav_next_turn *this = g_new0(struct nav_next_turn, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = 20; opc->osd_item.rel_y = -80; opc->osd_item.rel_w = 70; opc->osd_item.navit = nav; opc->osd_item.rel_h = 70; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_nav_next_turn_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->active = -1; this->level = 0; attr = attr_search(attrs, NULL, attr_icon_w); if (attr) this->icon_w = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_h); if (attr) this->icon_h = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = graphics_icon_path(array[0]); file_wordexp_destroy(we); } else { this->icon_src = graphics_icon_path("%s_wh.svg"); } attr = attr_search(attrs, NULL, attr_level); if (attr) this->level=attr->u.num; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_next_turn_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct nav_toggle_announcer { int w,h; struct callback *navit_init_cb; char *icon_src; int icon_h, icon_w, active, last_state; }; static void osd_nav_toggle_announcer_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct nav_toggle_announcer *this = (struct nav_toggle_announcer *)opc->data; struct point p; int do_draw = opc->osd_item.do_draw; struct graphics_image *gr_image; char *path; char *gui_sound_off = "gui_sound_off"; char *gui_sound_on = "gui_sound"; struct attr attr, speechattr; if (!navit_get_attr(navit, attr_speech, &speechattr, NULL)) { dbg(lvl_error, "No speech plugin available, toggle_announcer disabled.\n"); return; } if (!speech_get_attr(speechattr.u.speech, attr_active, &attr, NULL)) attr.u.num = 1; this->active = attr.u.num; if(this->active != this->last_state) { this->last_state = this->active; do_draw = 1; } if (do_draw) { graphics_draw_mode(opc->osd_item.gr, draw_mode_begin); p.x = 0; p.y = 0; graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, opc->osd_item.w, opc->osd_item.h); if (this->active) path = g_strdup_printf(this->icon_src, gui_sound_on); else path = g_strdup_printf(this->icon_src, gui_sound_off); gr_image = graphics_image_new_scaled(opc->osd_item.gr, path, this->icon_w, this->icon_h); if (!gr_image) { g_free(path); path = graphics_icon_path("unknown.png"); gr_image = graphics_image_new_scaled(opc->osd_item.gr, path, this->icon_w, this->icon_h); } dbg(lvl_debug, "gr_image=%p\n", gr_image); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_fg, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(path); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } static void osd_nav_toggle_announcer_init(struct osd_priv_common *opc, struct navit *nav) { struct nav_toggle_announcer *this = (struct nav_toggle_announcer *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_toggle_announcer_draw), attr_speech, opc)); navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); osd_nav_toggle_announcer_draw(opc, nav, NULL); } static struct osd_priv * osd_nav_toggle_announcer_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct nav_toggle_announcer *this = g_new0(struct nav_toggle_announcer, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; char *command = "announcer_toggle()"; opc->data = (void*)this; opc->osd_item.rel_w = 48; opc->osd_item.rel_h = 48; opc->osd_item.rel_x = -64; opc->osd_item.rel_y = 76; opc->osd_item.navit = nav; opc->osd_item.meth.draw = osd_draw_cast(osd_nav_toggle_announcer_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->last_state = -1; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = g_strdup(array[0]); file_wordexp_destroy(we); } else this->icon_src = graphics_icon_path("%s_32.xpm"); opc->osd_item.command = g_strdup(command); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_toggle_announcer_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } enum osd_speed_warner_eAnnounceState {eNoWarn=0,eWarningTold=1}; enum camera_t {CAM_FIXED=1, CAM_TRAFFIC_LAMP, CAM_RED, CAM_SECTION, CAM_MOBILE, CAM_RAIL, CAM_TRAFFIPAX}; char*camera_t_strs[] = {"None","Fix","Traffic lamp","Red detect","Section","Mobile","Rail","Traffipax(non persistent)"}; char*camdir_t_strs[] = {"All dir.","UNI-dir","BI-dir"}; enum cam_dir_t {CAMDIR_ALL=0, CAMDIR_ONE, CAMDIR_TWO}; struct osd_speed_cam_entry { double lon; double lat; enum camera_t cam_type; int speed_limit; enum cam_dir_t cam_dir; int direction; }; struct osd_speed_cam { int width; int flags; struct graphics_gc *orange; struct graphics_gc *red; struct color idle_color; int announce_on; enum osd_speed_warner_eAnnounceState announce_state; char *text; //text of label attribute for this osd }; static double angle_diff(int firstAngle,int secondAngle) { double difference = secondAngle - firstAngle; while (difference < -180) difference += 360; while (difference > 180) difference -= 360; return difference; } static void osd_speed_cam_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct osd_speed_cam *this_ = (struct osd_speed_cam *)opc->data; struct attr position_attr,vehicle_attr,imperial_attr; struct point bbox[4]; struct attr speed_attr; struct vehicle* curr_vehicle = v; struct coord curr_coord; struct coord cam_coord; struct mapset* ms; double dCurrDist = -1; int dir_idx = -1; int dir = -1; int spd = -1; int idx = -1; double speed = -1; int bFound = 0; int dst=2000; int dstsq=dst*dst; struct map_selection sel; struct map_rect *mr; struct mapset_handle *msh; struct map *map; struct item *item; struct attr attr_dir; struct graphics_gc *curr_color; int ret_attr = 0; int imperial=0; if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; if(navit) { navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL); } else { return; } if (vehicle_attr.u.vehicle) { curr_vehicle = vehicle_attr.u.vehicle; } if(0==curr_vehicle) return; if(!(ms=navit_get_mapset(navit))) { return; } ret_attr = vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL); if(0==ret_attr) { return; } transform_from_geo(projection_mg, position_attr.u.coord_geo, &curr_coord); sel.next=NULL; sel.order=18; sel.range.min=type_tec_common; sel.range.max=type_tec_common; sel.u.c_rect.lu.x=curr_coord.x-dst; sel.u.c_rect.lu.y=curr_coord.y+dst; sel.u.c_rect.rl.x=curr_coord.x+dst; sel.u.c_rect.rl.y=curr_coord.y-dst; msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { struct attr attr; if(map_get_attr(map, attr_type, &attr, NULL)) { if( strcmp("csv", attr.u.str) && strcmp("binfile", attr.u.str)) { continue; } } else { continue; } mr=map_rect_new(map, &sel); if (!mr) continue; while ((item=map_rect_get_item(mr))) { struct coord cn; if (item->type == type_tec_common && item_coord_get(item, &cn, 1)) { int dist=transform_distance_sq(&cn, &curr_coord); if (dist < dstsq) { struct attr tec_attr; bFound = 1; dstsq=dist; dCurrDist = sqrt(dist); cam_coord = cn; idx = -1; if(item_attr_get(item,attr_tec_type,&tec_attr)) { idx = tec_attr.u.num; } dir_idx = -1; if(item_attr_get(item,attr_tec_dirtype,&tec_attr)) { dir_idx = tec_attr.u.num; } dir= 0; if(item_attr_get(item,attr_tec_direction,&tec_attr)) { dir = tec_attr.u.num; } spd= 0; if(item_attr_get(item,attr_maxspeed,&tec_attr)) { spd = tec_attr.u.num; } } } } map_rect_destroy(mr); } mapset_close(msh); if(bFound && (idx==-1 || this_->flags & (1<<(idx-1))) ) { dCurrDist = transform_distance(projection_mg, &curr_coord, &cam_coord); ret_attr = vehicle_get_attr(curr_vehicle,attr_position_speed,&speed_attr, NULL); if(0==ret_attr) { graphics_overlay_disable(opc->osd_item.gr,1); return; } if (opc->osd_item.configured) { graphics_overlay_disable(opc->osd_item.gr,0); } speed = *speed_attr.u.numd; if(dCurrDist <= speed*750.0/130.0) { //at speed 130 distance limit is 750m if(this_->announce_state==eNoWarn && this_->announce_on) { this_->announce_state=eWarningTold; //warning told navit_say(navit, _("Look out! Camera!")); } } else { this_->announce_state=eNoWarn; } if(this_->text) { char buffer [256]=""; char buffer2[256]=""; char dir_str[16]; char spd_str[16]; buffer [0] = 0; buffer2[0] = 0; osd_fill_with_bgcolor(&opc->osd_item); str_replace(buffer,this_->text,"${distance}",format_distance(dCurrDist,"",imperial)); str_replace(buffer2,buffer,"${camera_type}",(0<=idx && idx<=CAM_TRAFFIPAX)?camera_t_strs[idx]:""); str_replace(buffer,buffer2,"${camera_dir}",(0<=dir_idx && dir_idx<=CAMDIR_TWO)?camdir_t_strs[dir_idx]:""); sprintf(dir_str,"%d",dir); sprintf(spd_str,"%d",spd); str_replace(buffer2,buffer,"${direction}",dir_str); str_replace(buffer,buffer2,"${speed_limit}",spd_str); graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); curr_color = this_->orange; //tolerance is +-20 degrees if( dir_idx==CAMDIR_ONE && dCurrDist <= speed*750.0/130.0 && vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL) && fabs(angle_diff(dir,*attr_dir.u.numd))<=20 ) { curr_color = this_->red; } //tolerance is +-20 degrees in both directions else if( dir_idx==CAMDIR_TWO && dCurrDist <= speed*750.0/130.0 && vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL) && (fabs(angle_diff(dir,*attr_dir.u.numd))<=20 || fabs(angle_diff(dir+180,*attr_dir.u.numd))<=20 )) { curr_color = this_->red; } else if(dCurrDist <= speed*750.0/130.0) { curr_color = this_->red; } draw_multiline_osd_text(buffer,&opc->osd_item, curr_color); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } else { graphics_overlay_disable(opc->osd_item.gr,1); } } static void osd_speed_cam_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_speed_cam *this = (struct osd_speed_cam *)opc->data; struct color red_color={0xffff,0x0000,0x0000,0xffff}; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); this->red = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->red, &red_color); graphics_gc_set_linewidth(this->red, this->width); this->orange = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->orange, &this->idle_color); graphics_gc_set_linewidth(this->orange, this->width); opc->osd_item.graphic_fg = graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(opc->osd_item.graphic_fg, &opc->osd_item.text_color); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->width); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_cam_draw), attr_position_coord_geo, opc)); } static struct osd_priv * osd_speed_cam_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct color default_color={0xffff,0xa5a5,0x0000,0xffff}; struct osd_speed_cam *this = g_new0(struct osd_speed_cam, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.p.x = 120; opc->osd_item.p.y = 20; opc->osd_item.w = 60; opc->osd_item.h = 80; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_speed_cam_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; attr = attr_search(attrs, NULL, attr_idle_color); this->idle_color=attr ? *attr->u.color : default_color; // text idle_color defaults to orange attr = attr_search(attrs, NULL, attr_label); if (attr) { this->text = g_strdup(attr->u.str); } else this->text = NULL; attr = attr_search(attrs, NULL, attr_announce_on); if (attr) { this->announce_on = attr->u.num; } else { this->announce_on = 1; //announce by default } attr = attr_search(attrs, NULL, attr_flags); if (attr) { this->flags = attr->u.num; } else { this->flags = -1; //every cam type is on by default } navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_cam_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_speed_warner { struct graphics_gc *red; struct graphics_gc *green; struct graphics_gc *grey; struct graphics_gc *black; int width; int active; int d; double speed_exceed_limit_offset; double speed_exceed_limit_percent; int announce_on; enum osd_speed_warner_eAnnounceState announce_state; int bTextOnly; struct graphics_image *img_active,*img_passive,*img_off; char* label_str; }; static void osd_speed_warner_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct osd_speed_warner *this = (struct osd_speed_warner *)opc->data; struct point p,bbox[4]; char text[16]=""; struct tracking *tracking = NULL; struct graphics_gc *osd_color=this->grey; struct graphics_image *img = this->img_off; osd_fill_with_bgcolor(&opc->osd_item); p.x=opc->osd_item.w/2-this->d/4; p.y=opc->osd_item.h/2-this->d/4; p.x=opc->osd_item.w/2; p.y=opc->osd_item.h/2; if (navit) { tracking = navit_get_tracking(navit); } if (tracking) { struct attr maxspeed_attr,speed_attr,imperial_attr; int *flags; double routespeed = -1; double tracking_speed = -1; int osm_data = 0; struct item *item; int imperial=0; item=tracking_get_current_item(tracking); if(navit) { if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; } flags=tracking_get_current_flags(tracking); if (flags && (*flags & AF_SPEED_LIMIT) && tracking_get_attr(tracking, attr_maxspeed, &maxspeed_attr, NULL)) { routespeed = maxspeed_attr.u.num; osm_data = 1; } if (routespeed == -1) { struct vehicleprofile *prof=navit_get_vehicleprofile(navit); struct roadprofile *rprof=NULL; if (prof && item) rprof=vehicleprofile_get_roadprofile(prof, item->type); if (rprof) { if(rprof->maxspeed!=0) routespeed=rprof->maxspeed; } } tracking_get_attr(tracking, attr_position_speed, &speed_attr, NULL); tracking_speed = *speed_attr.u.numd; if( -1 != tracking_speed && -1 != routespeed ) { char*routespeed_str = format_speed(routespeed,"","value",imperial); g_snprintf(text,16,"%s%s",osm_data ? "" : "~",routespeed_str); g_free(routespeed_str); if( this->speed_exceed_limit_offset+routespeedspeed_exceed_limit_percent)/100.0*routespeedannounce_state==eNoWarn && this->announce_on) { this->announce_state=eWarningTold; //warning told navit_say(navit,_("Please decrease your speed")); } } if( tracking_speed <= routespeed ) { this->announce_state=eNoWarn; //no warning osd_color = this->green; img = this->img_passive; } else { osd_color = this->red; img = this->img_active; } } else { osd_color = this->grey; img = this->img_off; this->announce_state = eNoWarn; } } else { //when tracking is not available display grey osd_color = this->grey; img = this->img_off; this->announce_state = eNoWarn; } if(this->img_active && this->img_passive && this->img_off) { struct point p; p.x=(opc->osd_item.w-img->width)/2; p.y=(opc->osd_item.h-img->height)/2; graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); } else if(0==this->bTextOnly) { graphics_draw_circle(opc->osd_item.gr, osd_color, &p, this->d-this->width*2 ); } graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, text, 0x10000, 0, bbox, 0); p.x=(opc->osd_item.w-bbox[2].x)/2; p.y=(opc->osd_item.h+bbox[2].y)/2-bbox[2].y; graphics_draw_text(opc->osd_item.gr, osd_color, NULL, opc->osd_item.font, text, &p, 0x10000, 0); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_speed_warner_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_speed_warner *this = (struct osd_speed_warner *)opc->data; struct color red_color={0xffff,0,0,0xffff}; struct color green_color={0,0xffff,0,0xffff}; struct color grey_color={0x8888,0x8888,0x8888,0x8888}; struct color black_color={0x1111,0x1111,0x1111,0x9999}; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_warner_draw), attr_position_coord_geo, opc)); this->d=opc->osd_item.w; if (opc->osd_item.h < this->d) this->d=opc->osd_item.h; this->width=this->d/10; if(this->label_str && !strncmp("images:",this->label_str,7)) { char *tok1=NULL, *tok2=NULL, *tok3=NULL; strtok(this->label_str,":"); tok1 = strtok(NULL,":"); if(tok1) { tok2 = strtok(NULL,":"); } if(tok1 && tok2) { tok3 = strtok(NULL,":"); } if(tok1 && tok2 && tok3) { tok1 = graphics_icon_path(tok1); tok2 = graphics_icon_path(tok2); tok3 = graphics_icon_path(tok3); this->img_active = graphics_image_new(opc->osd_item.gr, tok1); this->img_passive = graphics_image_new(opc->osd_item.gr, tok2); this->img_off = graphics_image_new(opc->osd_item.gr, tok3); g_free(tok1); g_free(tok2); g_free(tok3); } } g_free(this->label_str); this->label_str = NULL; graphics_gc_set_linewidth(opc->osd_item.graphic_fg, this->d/2-2 /*-this->width*/ ); this->red=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->red, &red_color); graphics_gc_set_linewidth(this->red, this->width); this->green=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->green, &green_color); graphics_gc_set_linewidth(this->green, this->width-2); this->grey=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->grey, &grey_color); graphics_gc_set_linewidth(this->grey, this->width); this->black=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->black, &black_color); graphics_gc_set_linewidth(this->black, this->width); osd_speed_warner_draw(opc, nav, NULL); } static struct osd_priv * osd_speed_warner_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_speed_warner *this=g_new0(struct osd_speed_warner, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x=-80; opc->osd_item.rel_y=20; opc->osd_item.rel_w=60; opc->osd_item.rel_h=60; opc->osd_item.navit = nav; this->active=-1; opc->osd_item.meth.draw = osd_draw_cast(osd_speed_warner_draw); meth->set_attr = set_std_osd_attr; attr = attr_search(attrs, NULL, attr_speed_exceed_limit_offset); if (attr) { this->speed_exceed_limit_offset = attr->u.num; } else this->speed_exceed_limit_offset = 15; //by default 15 km/h attr = attr_search(attrs, NULL, attr_speed_exceed_limit_percent); if (attr) { this->speed_exceed_limit_percent = attr->u.num; } else this->speed_exceed_limit_percent = 10; //by default factor of 1.1 this->bTextOnly = 0; //by default display graphics also attr = attr_search(attrs, NULL, attr_label); if (attr) { this->label_str = g_strdup(attr->u.str); if (!strcmp("text_only",attr->u.str)) { this->bTextOnly = 1; } } attr = attr_search(attrs, NULL, attr_announce_on); if (attr) this->announce_on = attr->u.num; else this->announce_on = 1; //announce by default osd_set_std_attr(attrs, &opc->osd_item, 2); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_warner_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_text_item { int static_text; char *text; void *prev; void *next; enum attr_type section; enum attr_type attr_typ; void *root; int offset; char *format; }; struct osd_text { int active; char *text; int align; char *last; struct osd_text_item *items; }; /** * @brief Formats a text attribute * * Returns the formatted current value of an attribute as a string * * @param attr The attribute to be formatted * @param format A string specifying how to format the attribute. Allowed format strings depend on the attribute; this member can be NULL. * @param imperial True to convert values to imperial, false to return metric values * @returns The formatted value */ static char * osd_text_format_attr(struct attr *attr, char *format, int imperial) { struct tm tm, text_tm, text_tm0; time_t textt; int days=0; char buffer[1024]; switch (attr->type) { case attr_position_speed: return format_speed(*attr->u.numd,"",format,imperial); case attr_position_height: case attr_position_direction: return format_float_0(*attr->u.numd); case attr_position_magnetic_direction: return g_strdup_printf("%ld",attr->u.num); case attr_position_coord_geo: if ((!format) || (!strcmp(format,"pos_degminsec"))) { coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"pos_degmin")) { coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"pos_deg")) { coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lat_degminsec")) { coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lat_degmin")) { coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lat_deg")) { coord_format(attr->u.coord_geo->lat,360,DEGREES_DECIMAL,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lng_degminsec")) { coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lng_degmin")) { coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); return g_strdup(buffer); } else if (!strcmp(format,"lng_deg")) { coord_format(360,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); return g_strdup(buffer); } else { // fall back to pos_degminsec coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); return g_strdup(buffer); } case attr_destination_time: if (!format || (strcmp(format,"arrival") && strcmp(format,"remaining"))) break; textt = time(NULL); tm = *localtime(&textt); if (!strcmp(format,"remaining")) { textt-=tm.tm_hour*3600+tm.tm_min*60+tm.tm_sec; tm = *localtime(&textt); } textt += attr->u.num / 10; text_tm = *localtime(&textt); if (tm.tm_year != text_tm.tm_year || tm.tm_mon != text_tm.tm_mon || tm.tm_mday != text_tm.tm_mday) { text_tm0 = text_tm; text_tm0.tm_sec = 0; text_tm0.tm_min = 0; text_tm0.tm_hour = 0; tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; days = (mktime(&text_tm0) - mktime(&tm) + 43200) / 86400; } return format_time(&text_tm, days); case attr_length: case attr_destination_length: if (!format) break; if (!strcmp(format,"named")) return format_distance(attr->u.num,"",imperial); if (!strcmp(format,"value") || !strcmp(format,"unit")) { char *ret,*tmp=format_distance(attr->u.num," ",imperial); char *pos=strchr(tmp,' '); if (! pos) return tmp; *pos++='\0'; if (!strcmp(format,"value")) return tmp; ret=g_strdup(pos); g_free(tmp); return ret; } case attr_position_time_iso8601: if ((!format) || (!strcmp(format,"iso8601"))) { break; } else { if (strstr(format, "local;") == format) { textt = iso8601_to_secs(attr->u.str); memcpy ((void *) &tm, (void *) localtime(&textt), sizeof(tm)); strftime(buffer, sizeof(buffer), (char *)(format + 6), &tm); } else if ((sscanf(format, "%*c%2d:%2d;", &(text_tm.tm_hour), &(text_tm.tm_min)) == 2) && (strchr("+-", format[0]))) { if (strchr("-", format[0])) { textt = iso8601_to_secs(attr->u.str) - text_tm.tm_hour * 3600 - text_tm.tm_min * 60; } else { textt = iso8601_to_secs(attr->u.str) + text_tm.tm_hour * 3600 + text_tm.tm_min * 60; } memcpy ((void *) &tm, (void *) gmtime(&textt), sizeof(tm)); strftime(buffer, sizeof(buffer), &format[strcspn(format, ";") + 1], &tm); } else { sscanf(attr->u.str, "%4d-%2d-%2dT%2d:%2d:%2d", &(tm.tm_year), &(tm.tm_mon), &(tm.tm_mday), &(tm.tm_hour), &(tm.tm_min), &(tm.tm_sec)); // the tm structure definition is kinda weird and needs some extra voodoo tm.tm_year-=1900; tm.tm_mon--; // get weekday and day of the year mktime(&tm); strftime(buffer, sizeof(buffer), format, &tm); } return g_strdup(buffer); } default: break; } return attr_to_text(attr, NULL, 1); } /** * @brief Parses a string of the form key.subkey or key[index].subkey into its components, where subkey * can itself have its own index and further subkeys * * @param in String to parse (the part before subkey will be modified by the function); upon returning * this pointer will point to a string containing key * @param index Pointer to an address that will receive a pointer to a string containing index or NULL * if key does not have an index * @returns If the function succeeds, a pointer to a string containing subkey, i.e. everything following * the first period, or a pointer to an empty string if there is nothing left to parse. If the function * fails (index with missing closed bracket or passing a null pointer as index argument when an index * was encountered), the return value is NULL */ static char * osd_text_split(char *in, char **index) { char *pos; int len; if (index) *index=NULL; len=strcspn(in,"[."); in+=len; switch (in[0]) { case '\0': return in; case '.': *in++='\0'; return in; case '[': if (!index) return NULL; *in++='\0'; *index=in; pos=strchr(in,']'); if (pos) { *pos++='\0'; if (*pos == '.') { *pos++='\0'; } return pos; } return NULL; } return NULL; } static void osd_text_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct osd_text *this = (struct osd_text *)opc->data; struct point p, p2[4]; char *str,*last,*next,*value,*absbegin; int do_draw = opc->osd_item.do_draw; struct attr attr, vehicle_attr, maxspeed_attr, imperial_attr; struct navigation *nav = NULL; struct tracking *tracking = NULL; struct map *nav_map = NULL; struct map_rect *nav_mr = NULL; struct item *item; struct osd_text_item *oti; int offset,lines; int height=opc->osd_item.font_size*13/256; int yspacing=height/2; int xspacing=height/4; int imperial=0; if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; vehicle_attr.u.vehicle=NULL; oti=this->items; str=NULL; while (oti) { item=NULL; value=NULL; if (oti->static_text) { value=g_strdup(oti->text); } else if (oti->section == attr_navigation) { if (navit && !nav) nav = navit_get_navigation(navit); if (nav && !nav_map) nav_map = navigation_get_map(nav); if (nav_map ) nav_mr = map_rect_new(nav_map, NULL); if (nav_mr) item = map_rect_get_item(nav_mr); offset=oti->offset; while (item) { if (item->type == type_nav_none) item=map_rect_get_item(nav_mr); else if (!offset) break; else { offset--; item=map_rect_get_item(nav_mr); } } if (item) { dbg(lvl_debug,"name %s\n", item_to_name(item->type)); dbg(lvl_debug,"type %s\n", attr_to_name(oti->attr_typ)); if (item_attr_get(item, oti->attr_typ, &attr)) value=osd_text_format_attr(&attr, oti->format, imperial); } if (nav_mr) map_rect_destroy(nav_mr); } else if (oti->section == attr_vehicle) { if (navit && !vehicle_attr.u.vehicle) { navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL); } if (vehicle_attr.u.vehicle) { if (vehicle_get_attr(vehicle_attr.u.vehicle, oti->attr_typ, &attr, NULL)) { value=osd_text_format_attr(&attr, oti->format, imperial); } } } else if (oti->section == attr_tracking) { if (navit) { tracking = navit_get_tracking(navit); } if (tracking) { item=tracking_get_current_item(tracking); if (item && (oti->attr_typ == attr_speed)) { double routespeed = -1; int *flags=tracking_get_current_flags(tracking); if (flags && (*flags & AF_SPEED_LIMIT) && tracking_get_attr(tracking, attr_maxspeed, &maxspeed_attr, NULL)) { routespeed = maxspeed_attr.u.num; } if (routespeed == -1) { struct vehicleprofile *prof=navit_get_vehicleprofile(navit); struct roadprofile *rprof=NULL; if (prof) rprof=vehicleprofile_get_roadprofile(prof, item->type); if (rprof) { routespeed=rprof->speed; } } value = format_speed(routespeed,"", oti->format, imperial); } else if (item) { if (tracking_get_attr(tracking, oti->attr_typ, &attr, NULL)) value=osd_text_format_attr(&attr, oti->format, imperial); } } } else if (oti->section == attr_navit) { if (oti->attr_typ == attr_message) { struct message *msg; int len,offset; char *tmp; msg = navit_get_messages(navit); len = 0; while (msg) { len+= strlen(msg->text) + 2; msg = msg->next; } value = g_malloc(len +1); msg = navit_get_messages(navit); offset = 0; while (msg) { tmp = g_stpcpy((value+offset), msg->text); g_stpcpy(tmp, "\\n"); offset += strlen(msg->text) + 2; msg = msg->next; } value[len] = '\0'; } } next=g_strdup_printf("%s%s",str ? str:"",value ? value:" "); if (value) g_free(value); if (str) g_free(str); str=next; oti=oti->next; } if ( !this->last || !str || strcmp(this->last, str) ) { do_draw=1; if (this->last) g_free(this->last); this->last = g_strdup(str); } absbegin=str; if (do_draw) { //osd_fill_with_bgcolor(&opc->osd_item); } if (do_draw && str) { osd_fill_with_bgcolor(&opc->osd_item); lines=0; next=str; last=str; while ((next=strstr(next, "\\n"))) { last = next; lines++; next++; } while (*last) { if (! g_ascii_isspace(*last)) { lines++; break; } last++; } dbg(lvl_debug,"this->align=%d\n", this->align); switch (this->align & 51) { case 1: p.y=0; break; case 2: p.y=(opc->osd_item.h-lines*(height+yspacing)-yspacing); break; case 16: // Grow from top to bottom p.y = 0; if (lines != 0) { opc->osd_item.h = (lines-1) * (height+yspacing) + height; } else { opc->osd_item.h = 0; } if (do_draw) { osd_std_resize(&opc->osd_item); } default: p.y=(opc->osd_item.h-lines*(height+yspacing)-yspacing)/2; } while (str) { next=strstr(str, "\\n"); if (next) { *next='\0'; next+=2; } graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, str, 0x10000, 0x0, p2, 0); switch (this->align & 12) { case 4: p.x=xspacing; break; case 8: p.x=opc->osd_item.w-(p2[2].x-p2[0].x)-xspacing; break; default: p.x = ((p2[0].x - p2[2].x) / 2) + (opc->osd_item.w / 2); } p.y += height+yspacing; graphics_draw_text(opc->osd_item.gr, opc->osd_item.graphic_fg_text, NULL, opc->osd_item.font, str, &p, 0x10000, 0); str=next; } } if(do_draw) { graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } g_free(absbegin); } /** * @brief Creates a new osd_text_item and inserts it into a linked list * * @param parent The preceding {@code osd_text_item} in the list. If NULL, the new item becomes the root * element of a new list * @returns The new {@code osd_text_item} */ static struct osd_text_item * oti_new(struct osd_text_item * parent) { struct osd_text_item *this; this=g_new0(struct osd_text_item, 1); this->prev=parent; if(!parent) { this->root=this; } else { parent->next=this; this->root=parent->root; } return this; } /** * @brief Prepares a text type OSD element * * This function parses the label string (as specified in the XML file) for a text type OSD element * into attributes and static text. * * @param opc The {@code struct osd_priv_common} for the OSD element. {@code opc->data->items} will * receive a pointer to a list of {@code osd_text_item} structures. * @param nav The navit structure */ static void osd_text_prepare(struct osd_priv_common *opc, struct navit *nav) { struct osd_text *this = (struct osd_text *)opc->data; char *absbegin,*str,*start,*end,*key,*subkey,*index; struct osd_text_item *oti; oti=NULL; str=g_strdup(this->text); absbegin=str; while ((start=strstr(str, "${"))) { *start='\0'; start+=2; // find plain text before if (start!=str) { oti = oti_new(oti); oti->static_text=1; oti->text=g_strdup(str); } end=strstr(start,"}"); if (! end) break; *end++='\0'; key=start; subkey=osd_text_split(key,NULL); oti = oti_new(oti); oti->section=attr_from_name(key); if (( oti->section == attr_navigation || oti->section == attr_tracking) && subkey) { key=osd_text_split(subkey,&index); if (index) oti->offset=atoi(index); subkey=osd_text_split(key,&index); if (!strcmp(key,"route_speed")) { oti->attr_typ=attr_speed; } else { oti->attr_typ=attr_from_name(key); } oti->format = g_strdup(index); } else if ((oti->section == attr_vehicle || oti->section == attr_navit) && subkey) { key=osd_text_split(subkey,&index); if (!strcmp(subkey,"messages")) { oti->attr_typ=attr_message; } else { oti->attr_typ=attr_from_name(subkey); } oti->format = g_strdup(index); } switch(oti->attr_typ) { default: navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_text_draw), attr_position_coord_geo, opc)); break; } str=(end); } if(*str!='\0'){ oti = oti_new(oti); oti->static_text=1; oti->text=g_strdup(str); } if (oti) this->items=oti->root; else this->items=NULL; g_free(absbegin); } static void osd_text_init(struct osd_priv_common *opc, struct navit *nav) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); osd_text_prepare(opc,nav); osd_text_draw(opc, nav, NULL); } static int osd_text_set_attr(struct osd_priv_common *opc, struct attr* attr) { struct osd_text *this_ = (struct osd_text *)opc->data; if(NULL==attr || NULL==this_) { return 0; } if(attr->type == attr_label) { struct navit *nav=opc->osd_item.navit; if(this_->text) g_free(this_->text); if(attr->u.str) this_->text = g_strdup(attr->u.str); else this_->text=g_strdup(""); osd_text_prepare(opc,nav); if(navit_get_blocked(nav)&1) return 1; osd_text_draw(opc,nav,NULL); navit_draw(opc->osd_item.navit); return 1; } return 0; } static struct osd_priv * osd_text_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_text *this = g_new0(struct osd_text, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = -80; opc->osd_item.rel_y = 20; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 20; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_text_draw); meth->set_attr = set_std_osd_attr; opc->spec_set_attr_func = osd_text_set_attr; osd_set_std_attr(attrs, &opc->osd_item, 2); this->active = -1; this->last = NULL; attr = attr_search(attrs, NULL, attr_label); if (attr) this->text = g_strdup(attr->u.str); else this->text = NULL; attr = attr_search(attrs, NULL, attr_align); if (attr) this->align=attr->u.num; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_text_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct gps_status { char *icon_src; int icon_h, icon_w, active; int strength; }; static void osd_gps_status_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) { struct gps_status *this = (struct gps_status *)opc->data; struct point p; int do_draw = opc->osd_item.do_draw; struct graphics_image *gr_image; char *image; struct attr attr, vehicle_attr; int strength=-1; if (navit && navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL)) { if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_fix_type, &attr, NULL)) { switch(attr.u.num) { case 1: case 2: strength=2; if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_sats_used, &attr, NULL)) { dbg(lvl_debug,"num=%ld\n", attr.u.num); if (attr.u.num >= 3) strength=attr.u.num-1; if (strength > 5) strength=5; if (strength > 3) { if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_hdop, &attr, NULL)) { if (*attr.u.numd > 2.0 && strength > 4) strength=4; if (*attr.u.numd > 4.0 && strength > 3) strength=3; } } } break; default: strength=1; } } } if (this->strength != strength) { this->strength=strength; do_draw=1; } if (do_draw) { osd_fill_with_bgcolor(&opc->osd_item); if (this->active) { image = g_strdup_printf(this->icon_src, strength); gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(image); } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } } static void osd_gps_status_init(struct osd_priv_common *opc, struct navit *nav) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_draw), attr_position_coord_geo, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_draw), attr_position_fix_type, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_draw), attr_position_sats_used, opc)); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_draw), attr_position_hdop, opc)); osd_gps_status_draw(opc, nav, NULL); } static struct osd_priv * osd_gps_status_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct gps_status *this = g_new0(struct gps_status, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = 20; opc->osd_item.rel_y = -80; opc->osd_item.rel_w = 60; opc->osd_item.navit = nav; opc->osd_item.rel_h = 40; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_gps_status_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->active = -1; this->strength = -2; attr = attr_search(attrs, NULL, attr_icon_w); if (attr) this->icon_w = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_h); if (attr) this->icon_h = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = g_strdup(array[0]); file_wordexp_destroy(we); } else this->icon_src = graphics_icon_path("gui_strength_%d_32_32.png"); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct volume { char *icon_src; int icon_h, icon_w, active; int strength; struct callback *click_cb; }; static void osd_volume_draw(struct osd_priv_common *opc, struct navit *navit) { struct volume *this = (struct volume *)opc->data; struct point p; struct graphics_image *gr_image; char *image; osd_fill_with_bgcolor(&opc->osd_item); if (this->active) { image = g_strdup_printf(this->icon_src, this->strength); gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); if (gr_image) { p.x = (opc->osd_item.w - gr_image->width) / 2; p.y = (opc->osd_item.h - gr_image->height) / 2; graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg, &p, gr_image); graphics_image_free(opc->osd_item.gr, gr_image); } g_free(image); } graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_volume_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) { struct volume *this = (struct volume *)opc->data; struct point bp = opc->osd_item.p; if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h) && !opc->osd_item.pressed) return; navit_ignore_button(nav); if (pressed) { if (p->y - bp.y < opc->osd_item.h/2) this->strength++; else this->strength--; if (this->strength < 0) this->strength=0; if (this->strength > 5) this->strength=5; osd_volume_draw(opc, nav); } } static void osd_volume_init(struct osd_priv_common *opc, struct navit *nav) { struct volume *this = (struct volume *)opc->data; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_volume_click), attr_button, opc)); osd_volume_draw(opc, nav); } static struct osd_priv * osd_volume_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct volume *this = g_new0(struct volume, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.rel_x = 20; opc->osd_item.rel_y = -80; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 40; opc->osd_item.navit = nav; opc->osd_item.font_size = 200; opc->osd_item.meth.draw = osd_draw_cast(osd_volume_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); this->icon_w = -1; this->icon_h = -1; this->active = -1; this->strength = -1; attr = attr_search(attrs, NULL, attr_icon_w); if (attr) this->icon_w = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_h); if (attr) this->icon_h = attr->u.num; attr = attr_search(attrs, NULL, attr_icon_src); if (attr) { struct file_wordexp *we; char **array; we = file_wordexp_new(attr->u.str); array = file_wordexp_get_array(we); this->icon_src = g_strdup(array[0]); file_wordexp_destroy(we); } else this->icon_src = graphics_icon_path("gui_strength_%d_32_32.png"); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_volume_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct osd_scale { int use_overlay; struct callback *draw_cb,*navit_init_cb; struct graphics_gc *black; }; static int round_to_nice_value(double value) { double nearest_power_of10,mantissa; nearest_power_of10=pow(10,floor(log10(value))); mantissa=value/nearest_power_of10; if (mantissa >= 5) mantissa=5; else if (mantissa >= 2) mantissa=2; else mantissa=1; return mantissa*nearest_power_of10; } static void osd_scale_draw(struct osd_priv_common *opc, struct navit *nav) { struct osd_scale *this = (struct osd_scale *)opc->data; struct point item_pos,scale_line_start,scale_line_end; struct point p[10],bbox[4]; struct attr transformation,imperial_attr; int scale_x_offset,scale_length_on_map,scale_length_pixels; double distance_on_map; char *text; int width_reduced; int imperial=0; osd_std_calculate_sizes(&opc->osd_item, navit_get_width(nav), navit_get_height(nav)); width_reduced=opc->osd_item.w*9/10; if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) imperial=imperial_attr.u.num; if (!navit_get_attr(nav, attr_transformation, &transformation, NULL)) return; if (this->use_overlay) { graphics_draw_mode(opc->osd_item.gr, draw_mode_begin); item_pos.x=0; item_pos.y=0; graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_bg, &item_pos, opc->osd_item.w, opc->osd_item.h); } else { item_pos=opc->osd_item.p; } scale_line_start=item_pos; scale_line_start.y+=opc->osd_item.h/2; scale_line_start.x+=(opc->osd_item.w-width_reduced)/2; scale_line_end=scale_line_start; scale_line_end.x+=width_reduced; distance_on_map=transform_pixels_to_map_distance(transformation.u.transformation, width_reduced); scale_length_on_map=round_to_nice_value(distance_on_map); scale_length_pixels=scale_length_on_map/distance_on_map*width_reduced; scale_x_offset=(opc->osd_item.w-scale_length_pixels) / 2; p[0]=scale_line_start; p[1]=scale_line_end; p[0].x+=scale_x_offset; p[1].x-=scale_x_offset; p[2]=p[0]; p[3]=p[0]; p[2].y-=opc->osd_item.h/10; p[3].y+=opc->osd_item.h/10; p[4]=p[1]; p[5]=p[1]; p[4].y-=opc->osd_item.h/10; p[5].y+=opc->osd_item.h/10; p[6]=p[2]; p[6].x-=2; p[6].y-=2; p[7]=p[0]; p[7].y-=2; p[8]=p[4]; p[8].x-=2; p[8].y-=2; graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_fg, p+6, 4,opc->osd_item.h/5+4); graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_fg, p+7, p[1].x-p[0].x, 4); graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_fg, p+8, 4,opc->osd_item.h/5+4); graphics_draw_lines(opc->osd_item.gr, this->black, p, 2); graphics_draw_lines(opc->osd_item.gr, this->black, p+2, 2); graphics_draw_lines(opc->osd_item.gr, this->black, p+4, 2); text=format_distance(scale_length_on_map, "", imperial); graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, text, 0x10000, 0, bbox, 0); p[0].x=(opc->osd_item.w-bbox[2].x)/2+item_pos.x; p[0].y=item_pos.y+opc->osd_item.h-opc->osd_item.h/10; graphics_draw_text(opc->osd_item.gr, this->black, opc->osd_item.graphic_fg, opc->osd_item.font, text, &p[0], 0x10000, 0); g_free(text); if (this->use_overlay) graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_scale_init(struct osd_priv_common *opc, struct navit *nav) { struct osd_scale *this = (struct osd_scale *)opc->data; struct color color_black={COLOR_BLACK_}; struct graphics *gra = navit_get_graphics(nav); dbg(lvl_debug, "enter\n"); if (this->use_overlay) { osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); } else { opc->osd_item.configured=1; opc->osd_item.gr=gra; opc->osd_item.font = graphics_font_new(opc->osd_item.gr, opc->osd_item.font_size, 1); opc->osd_item.graphic_fg=graphics_gc_new(opc->osd_item.gr); } this->black=graphics_gc_new(opc->osd_item.gr); graphics_gc_set_foreground(this->black, &color_black); graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_scale_draw), attr_postdraw, opc, nav)); if (navit_get_ready(nav) == 3) osd_scale_draw(opc, nav); } static struct osd_priv * osd_scale_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct osd_scale *this = g_new0(struct osd_scale, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); struct attr *attr; opc->data = (void*)this; opc->osd_item.navit = nav; opc->osd_item.meth.draw = osd_draw_cast(osd_scale_draw); meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 3); attr=attr_search(attrs, NULL, attr_use_overlay); if (attr) this->use_overlay=attr->u.num; navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_scale_init), attr_graphics_ready, opc)); return (struct osd_priv *) opc; } struct auxmap { struct displaylist *displaylist; struct transformation *ntrans; struct transformation *trans; struct layout *layout; struct callback *postdraw_cb; struct graphics_gc *red; struct navit *nav; }; static void osd_auxmap_draw(struct osd_priv_common *opc) { struct auxmap *this = (struct auxmap *)opc->data; int d=10; struct point p; struct attr mapset; if (!opc->osd_item.configured) return; if (!navit_get_attr(this->nav, attr_mapset, &mapset, NULL) || !mapset.u.mapset) return; p.x=opc->osd_item.w/2; p.y=opc->osd_item.h/2; if (opc->osd_item.rel_h || opc->osd_item.rel_w) { struct map_selection sel; memset(&sel, 0, sizeof(sel)); sel.u.p_rect.rl.x=opc->osd_item.w; sel.u.p_rect.rl.y=opc->osd_item.h; dbg(lvl_debug,"osd_auxmap_draw: sel.u.p_rect.rl=(%d, %d)\n", opc->osd_item.w, opc->osd_item.h); transform_set_screen_selection(this->trans, &sel); graphics_set_rect(opc->osd_item.gr, &sel.u.p_rect); } transform_set_center(this->trans, transform_get_center(this->ntrans)); transform_set_scale(this->trans, 64); transform_set_yaw(this->trans, transform_get_yaw(this->ntrans)); transform_setup_source_rect(this->trans); transform_set_projection(this->trans, transform_get_projection(this->ntrans)); #if 0 graphics_displaylist_draw(opc->osd_item.gr, this->displaylist, this->trans, this->layout, 4); #endif graphics_draw(opc->osd_item.gr, this->displaylist, mapset.u.mapset, this->trans, this->layout, 0, NULL, 1); graphics_draw_circle(opc->osd_item.gr, this->red, &p, d); graphics_draw_mode(opc->osd_item.gr, draw_mode_end); } static void osd_auxmap_init(struct osd_priv_common *opc, struct navit *nav) { struct auxmap *this = (struct auxmap *)opc->data; struct graphics *gra; struct attr attr; struct map_selection sel; struct pcoord center={ projection_mg, 0, 0}; struct color red={0xffff,0x0,0x0,0xffff}; this->nav=nav; if (! navit_get_attr(nav, attr_graphics, &attr, NULL)) return; gra=attr.u.graphics; graphics_add_callback(gra, callback_new_attr_1(callback_cast(osd_auxmap_draw), attr_postdraw, opc)); if (! navit_get_attr(nav, attr_transformation, &attr, NULL)) return; this->ntrans=attr.u.transformation; if (! navit_get_attr(nav, attr_displaylist, &attr, NULL)) return; this->displaylist=attr.u.displaylist; if (! navit_get_attr(nav, attr_layout, &attr, NULL)) return; this->layout=attr.u.layout; osd_set_std_graphic(nav, &opc->osd_item, NULL); graphics_init(opc->osd_item.gr); this->red=graphics_gc_new(gra); graphics_gc_set_foreground(this->red,&red); graphics_gc_set_linewidth(this->red,3); memset(&sel, 0, sizeof(sel)); sel.u.p_rect.rl.x=opc->osd_item.w; sel.u.p_rect.rl.y=opc->osd_item.h; this->trans=transform_new(¢er, 16, 0); transform_set_screen_selection(this->trans, &sel); graphics_set_rect(opc->osd_item.gr, &sel.u.p_rect); #if 0 osd_auxmap_draw(opc, nav); #endif } static struct osd_priv * osd_auxmap_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct auxmap *this = g_new0(struct auxmap, 1); struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); opc->data = (void*)this; opc->osd_item.rel_x = 20; opc->osd_item.rel_y = -80; opc->osd_item.rel_w = 60; opc->osd_item.rel_h = 40; opc->osd_item.font_size = 200; meth->set_attr = set_std_osd_attr; osd_set_std_attr(attrs, &opc->osd_item, 0); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_auxmap_init), attr_navit, opc)); return (struct osd_priv *) opc; } void plugin_init(void) { plugin_register_osd_type("compass", osd_compass_new); plugin_register_osd_type("navigation_next_turn", osd_nav_next_turn_new); plugin_register_osd_type("button", osd_button_new); plugin_register_osd_type("toggle_announcer", osd_nav_toggle_announcer_new); plugin_register_osd_type("speed_warner", osd_speed_warner_new); plugin_register_osd_type("speed_cam", osd_speed_cam_new); plugin_register_osd_type("text", osd_text_new); plugin_register_osd_type("gps_status", osd_gps_status_new); plugin_register_osd_type("volume", osd_volume_new); plugin_register_osd_type("scale", osd_scale_new); plugin_register_osd_type("image", osd_image_new); plugin_register_osd_type("stopwatch", osd_stopwatch_new); plugin_register_osd_type("odometer", osd_odometer_new); plugin_register_osd_type("auxmap", osd_auxmap_new); plugin_register_osd_type("cmd_interface", osd_cmd_interface_new); plugin_register_osd_type("route_guard", osd_route_guard_new); plugin_register_osd_type("navigation_status", osd_navigation_status_new); } navit-0.5.0+dfsg.1/navit/param.c000066400000000000000000000035501264204753600163140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "param.h" void param_add_string(const char *name, const char *value, struct param_list **param, int *count) { char *param_name; char *param_value; if (*count > 0) { param_name=malloc(strlen(value)+strlen(name)+2); param_value=param_name+strlen(name)+1; strcpy(param_name, name); strcpy(param_value, value); (*param)->name=param_name; (*param)->value=param_value; (*count)--; (*param)++; } } void param_add_dec(const char *name, unsigned long value, struct param_list **param, int *count) { char buffer[1024]; sprintf(buffer, "%ld", value); param_add_string(name, buffer, param, count); } void param_add_hex(const char *name, unsigned long value, struct param_list **param, int *count) { char buffer[1024]; sprintf(buffer, "0x%lx", value); param_add_string(name, buffer, param, count); } void param_add_hex_sig(const char *name, long value, struct param_list **param, int *count) { char buffer[1024]; if (value < 0) sprintf(buffer, "-0x%lx", -value); else sprintf(buffer, "0x%lx", value); param_add_string(name, buffer, param, count); } navit-0.5.0+dfsg.1/navit/param.h000066400000000000000000000023731264204753600163230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PARAM_H #define NAVIT_PARAM_H struct param_list { const char *name; const char *value; }; void param_add_string(const char *name, const char *value, struct param_list **param, int *count); void param_add_dec(const char *name, unsigned long value, struct param_list **param, int *count); void param_add_hex(const char *name, unsigned long value, struct param_list **param, int *count); void param_add_hex_sig(const char *name, long value, struct param_list **param, int *count); #endif navit-0.5.0+dfsg.1/navit/phrase.c000066400000000000000000000025201264204753600164720ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "coord.h" #include "item.h" #include "route.h" #include "speech.h" #include "phrase.h" void phrase_route_calc(void *speech) { #if 0 if (! speech) return; speech_say(speech,"Die Route wird berechnet\n"); #endif } void phrase_route_calculated(void *speech, void *route) { #if 0 struct tm *eta; #endif if (! speech) return; #if 0 /* FIXME */ eta=route_get_eta(route); speech_sayf(speech,"Die Route wurde berechnet, geschätzte Ankunftszeit %d Uhr %d Entfernung %4.0f Kilometer", eta->tm_hour,eta->tm_min,route_get_len(route)/1000); #endif } navit-0.5.0+dfsg.1/navit/phrase.h000066400000000000000000000016311264204753600165010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PHRASE_H #define NAVIT_PHRASE_H void phrase_route_calc(void *speech); void phrase_route_calculated(void *speech, void *route); #endif navit-0.5.0+dfsg.1/navit/plugin.c000066400000000000000000000211641264204753600165130ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "config.h" #ifdef USE_PLUGINS #ifdef HAVE_GMODULE #include #else #ifdef HAVE_API_WIN32_BASE #include #else #include #endif #endif #endif #include "plugin.h" #include "file.h" #define PLUGIN_C #include "plugin.h" #include "item.h" #include "debug.h" #ifdef USE_PLUGINS #ifndef HAVE_GMODULE typedef void * GModule; #define G_MODULE_BIND_LOCAL 1 #define G_MODULE_BIND_LAZY 2 static int g_module_supported(void) { return 1; } #ifdef HAVE_API_WIN32_BASE static DWORD last_error; static char errormsg[64]; static void * g_module_open(char *name, int flags) { HINSTANCE handle; int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, 0, 0); wchar_t filename[len]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, filename, len) ; handle = LoadLibraryW (filename); if (!handle) last_error=GetLastError(); return handle; } static char * g_module_error(void) { sprintf(errormsg,"dll error %d",(int)last_error); return errormsg; } static int g_module_symbol(GModule *handle, char *symbol, gpointer *addr) { #ifdef HAVE_API_WIN32_CE int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, 0, 0); wchar_t wsymbol[len+1]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, wsymbol, len) ; *addr=GetProcAddress ((HANDLE)handle, wsymbol); #else *addr=GetProcAddress ((HANDLE)handle, symbol); #endif if (*addr) return 1; last_error=GetLastError(); return 0; } static void g_module_close(GModule *handle) { FreeLibrary((HANDLE)handle); } #else static void * g_module_open(char *name, int flags) { return dlopen(name, (flags & G_MODULE_BIND_LAZY ? RTLD_LAZY : RTLD_NOW) | (flags & G_MODULE_BIND_LOCAL ? RTLD_LOCAL : RTLD_GLOBAL)); } static char * g_module_error(void) { return dlerror(); } static int g_module_symbol(GModule *handle, char *symbol, gpointer *addr) { *addr=dlsym(handle, symbol); return (*addr != NULL); } static void g_module_close(GModule *handle) { dlclose(handle); } #endif #endif #endif struct plugin { int active; int lazy; int ondemand; char *name; #ifdef USE_PLUGINS GModule *mod; #endif void (*init)(void); }; struct plugins { GHashTable *hash; GList *list; } *pls; static struct plugin * plugin_new_from_path(char *plugin) { #ifdef USE_PLUGINS struct plugin *ret; if (! g_module_supported()) { return NULL; } ret=g_new0(struct plugin, 1); ret->name=g_strdup(plugin); return ret; #else return NULL; #endif } int plugin_load(struct plugin *pl) { #ifdef USE_PLUGINS gpointer init; GModule *mod; if (pl->mod) { dbg(lvl_debug,"'%s' already loaded, returning\n", pl->name); return 1; } mod=g_module_open(pl->name, G_MODULE_BIND_LOCAL | (pl->lazy ? G_MODULE_BIND_LAZY : 0)); if (! mod) { dbg(lvl_error,"can't load '%s', Error '%s'\n", pl->name, g_module_error()); return 0; } if (!g_module_symbol(mod, "plugin_init", &init)) { dbg(lvl_error,"can't load '%s', plugin_init not found\n", pl->name); g_module_close(mod); return 0; } else { dbg(lvl_debug, "loaded module %s\n", pl->name); pl->mod=mod; pl->init=init; } return 1; #else return 0; #endif } char * plugin_get_name(struct plugin *pl) { return pl->name; } int plugin_get_active(struct plugin *pl) { return pl->active; } void plugin_set_active(struct plugin *pl, int active) { pl->active=active; } void plugin_set_lazy(struct plugin *pl, int lazy) { pl->lazy=lazy; } #ifdef USE_PLUGINS static int plugin_get_ondemand(struct plugin *pl) { return pl->ondemand; } #endif static void plugin_set_ondemand(struct plugin *pl, int ondemand) { pl->ondemand=ondemand; } void plugin_call_init(struct plugin *pl) { pl->init(); } void plugin_unload(struct plugin *pl) { #ifdef USE_PLUGINS g_module_close(pl->mod); pl->mod=NULL; #endif } void plugin_destroy(struct plugin *pl) { g_free(pl); } struct plugins * plugins_new(void) { struct plugins *ret=g_new0(struct plugins, 1); ret->hash=g_hash_table_new(g_str_hash, g_str_equal); pls=ret; return ret; } struct plugin * plugin_new(struct attr *parent, struct attr **attrs) { #ifdef USE_PLUGINS struct attr *path_attr, *attr; struct file_wordexp *we; int active=1; // default active int lazy=0, ondemand=0; int i, count; char **array; char *name; struct plugin *pl=NULL; struct plugins *pls=NULL; if (parent) pls=parent->u.plugins; if (! (path_attr=attr_search(attrs, NULL, attr_path))) { dbg(lvl_error,"missing path\n"); return NULL; } if ( (attr=attr_search(attrs, NULL, attr_active))) { active=attr->u.num; } if ( (attr=attr_search(attrs, NULL, attr_lazy))) { lazy=attr->u.num; } if ( (attr=attr_search(attrs, NULL, attr_ondemand))) { ondemand=attr->u.num; } dbg(lvl_debug, "path=\"%s\", active=%d, lazy=%d, ondemand=%d\n",path_attr->u.str, active, lazy, ondemand); we=file_wordexp_new(path_attr->u.str); count=file_wordexp_get_count(we); array=file_wordexp_get_array(we); dbg(lvl_info,"expanded to %d words\n",count); if (count != 1 || file_exists(array[0])) { for (i = 0 ; i < count ; i++) { name=array[i]; dbg(lvl_info,"found plugin module file [%d]: '%s'\n", i, name); if (! (pls && (pl=g_hash_table_lookup(pls->hash, name)))) { pl=plugin_new_from_path(name); if (! pl) { dbg(lvl_error,"failed to create plugin from file '%s'\n", name); continue; } if (pls) { g_hash_table_insert(pls->hash, plugin_get_name(pl), pl); pls->list=g_list_append(pls->list, pl); } } else { if (pls) { pls->list=g_list_remove(pls->list, pl); pls->list=g_list_append(pls->list, pl); } } plugin_set_active(pl, active); plugin_set_lazy(pl, lazy); plugin_set_ondemand(pl, ondemand); if (!pls && active) { if (!plugin_load(pl)) plugin_set_active(pl, 0); else plugin_call_init(pl); } } } file_wordexp_destroy(we); return pl; #else return 0; #endif } void plugins_init(struct plugins *pls) { #ifdef USE_PLUGINS struct plugin *pl; GList *l; l=pls->list; if (l){ while (l) { pl=l->data; if (! plugin_get_ondemand(pl)) { if (plugin_get_active(pl)) if (!plugin_load(pl)) plugin_set_active(pl, 0); if (plugin_get_active(pl)) plugin_call_init(pl); } l=g_list_next(l); } } else { dbg(lvl_error, "Warning: No plugins found. Is Navit installed correctly?\n"); } #endif } void plugins_destroy(struct plugins *pls) { GList *l; struct plugin *pl; l=pls->list; while (l) { pl=l->data; plugin_unload(pl); plugin_destroy(pl); } g_list_free(pls->list); g_hash_table_destroy(pls->hash); g_free(pls); } static void * find_by_name(enum plugin_type type, const char *name) { GList *name_list=plugin_types[type]; while (name_list) { struct name_val *nv=name_list->data; if (!g_ascii_strcasecmp(nv->name, name)) return nv->val; name_list=g_list_next(name_list); } return NULL; } void * plugin_get_type(enum plugin_type type, const char *type_name, const char *name) { GList *plugin_list; struct plugin *pl; char *mod_name, *filename=NULL, *corename=NULL; void *result=NULL; dbg(lvl_debug, "type=\"%s\", name=\"%s\"\n", type_name, name); if ((result=find_by_name(type, name))) { return result; } if (!pls) return NULL; plugin_list=pls->list; filename=g_strjoin("", "lib", type_name, "_", name, NULL); corename=g_strjoin("", "lib", type_name, "_", "core", NULL); while (plugin_list) { pl=plugin_list->data; if ((mod_name=g_strrstr(pl->name, "/"))) mod_name++; else mod_name=pl->name; if (!g_ascii_strncasecmp(mod_name, filename, strlen(filename)) || !g_ascii_strncasecmp(mod_name, corename, strlen(corename))) { dbg(lvl_debug, "Loading module \"%s\"\n",pl->name) ; if (plugin_get_active(pl)) if (!plugin_load(pl)) plugin_set_active(pl, 0); if (plugin_get_active(pl)) plugin_call_init(pl); if ((result=find_by_name(type, name))) { g_free(filename); g_free(corename); return result; } } plugin_list=g_list_next(plugin_list); } g_free(filename); g_free(corename); return NULL; } navit-0.5.0+dfsg.1/navit/plugin.h000066400000000000000000000107511264204753600165200ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef PLUGIN_C #ifdef __cplusplus extern "C" { #endif struct plugin; enum plugin_type { plugin_type_graphics, plugin_type_gui, plugin_type_map, plugin_type_osd, plugin_type_speech, plugin_type_vehicle, plugin_type_event, plugin_type_font, plugin_type_last, }; #endif struct container; struct popup; struct popup_item; #undef PLUGIN_FUNC1 #undef PLUGIN_FUNC3 #undef PLUGIN_FUNC4 #undef PLUGIN_TYPE #define PLUGIN_PROTO(name,...) void name(__VA_ARGS__) #ifdef PLUGIN_C #define PLUGIN_REGISTER(name,...) \ void \ plugin_register_##name(PLUGIN_PROTO((*func),__VA_ARGS__)) \ { \ plugin_##name##_func=func; \ } #define PLUGIN_CALL(name,...) \ { \ if (plugin_##name##_func) \ (*plugin_##name##_func)(__VA_ARGS__); \ } #define PLUGIN_FUNC1(name,t1,p1) \ PLUGIN_PROTO((*plugin_##name##_func),t1 p1); \ void plugin_call_##name(t1 p1) PLUGIN_CALL(name,p1) \ PLUGIN_REGISTER(name,t1 p1) #define PLUGIN_FUNC3(name,t1,p1,t2,p2,t3,p3) \ PLUGIN_PROTO((*plugin_##name##_func),t1 p1,t2 p2,t3 p3); \ void plugin_call_##name(t1 p1,t2 p2, t3 p3) PLUGIN_CALL(name,p1,p2,p3) \ PLUGIN_REGISTER(name,t1 p1,t2 p2,t3 p3) #define PLUGIN_FUNC4(name,t1,p1,t2,p2,t3,p3,t4,p4) \ PLUGIN_PROTO((*plugin_##name##_func),t1 p1,t2 p2,t3 p3,t4 p4); \ void plugin_call_##name(t1 p1,t2 p2, t3 p3, t4 p4) PLUGIN_CALL(name,p1,p2,p3,p4) \ PLUGIN_REGISTER(name,t1 p1,t2 p2,t3 p3,t4 p4) struct name_val { char *name; void *val; }; GList *plugin_types[plugin_type_last]; #define PLUGIN_TYPE(type,newargs) \ struct type##_priv; \ struct type##_methods; \ void \ plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs) \ { \ struct name_val *nv; \ nv=g_new(struct name_val, 1); \ nv->name=g_strdup(name); \ nv->val=new_; \ plugin_types[plugin_type_##type]=g_list_append(plugin_types[plugin_type_##type], nv); \ } \ \ void * \ plugin_get_##type##_type(const char *name) \ { \ return plugin_get_type(plugin_type_##type, #type, name); \ } #else #define PLUGIN_FUNC1(name,t1,p1) \ void plugin_register_##name(void(*func)(t1 p1)); \ void plugin_call_##name(t1 p1); #define PLUGIN_FUNC3(name,t1,p1,t2,p2,t3,p3) \ void plugin_register_##name(void(*func)(t1 p1,t2 p2,t3 p3)); \ void plugin_call_##name(t1 p1,t2 p2,t3 p3); #define PLUGIN_FUNC4(name,t1,p1,t2,p2,t3,p3,t4,p4) \ void plugin_register_##name(void(*func)(t1 p1,t2 p2,t3 p3,t4 p4)); \ void plugin_call_##name(t1 p1,t2 p2,t3 p3,t4 p4); #define PLUGIN_TYPE(type,newargs) \ struct type##_priv; \ struct type##_methods; \ void plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs); \ void *plugin_get_##type##_type(const char *name); #endif #include "plugin_def.h" #ifndef USE_PLUGINS #define plugin_module_cat3(pre,mod,post) pre##mod##post #define plugin_module_cat2(pre,mod,post) plugin_module_cat3(pre,mod,post) #define plugin_module_cat(pre,post) plugin_module_cat2(pre,MODULE,post) #define plugin_init plugin_module_cat(module_,_init) #endif struct attr; /* prototypes */ void plugin_init(void); int plugin_load(struct plugin *pl); char *plugin_get_name(struct plugin *pl); int plugin_get_active(struct plugin *pl); void plugin_set_active(struct plugin *pl, int active); void plugin_set_lazy(struct plugin *pl, int lazy); void plugin_call_init(struct plugin *pl); void plugin_unload(struct plugin *pl); void plugin_destroy(struct plugin *pl); struct plugins *plugins_new(void); struct plugin *plugin_new(struct attr *parent, struct attr ** attrs); void plugins_init(struct plugins *pls); void plugins_destroy(struct plugins *pls); void *plugin_get_type(enum plugin_type type, const char *type_name, const char *name); /* end of prototypes */ #ifdef __cplusplus } #endif navit-0.5.0+dfsg.1/navit/plugin/000077500000000000000000000000001264204753600163435ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/plugin/Makefile.am000066400000000000000000000001251264204753600203750ustar00rootroot00000000000000SUBDIRS= if PLUGIN_PEDESTRIAN SUBDIRS += pedestrian endif DIST_SUBDIRS=pedestrian navit-0.5.0+dfsg.1/navit/plugin/j1850/000077500000000000000000000000001264204753600171125ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/plugin/j1850/CMakeLists.txt000066400000000000000000000000511264204753600216460ustar00rootroot00000000000000module_add_library(plugin_j1850 j1850.c) navit-0.5.0+dfsg.1/navit/plugin/j1850/j1850.c000066400000000000000000000363761264204753600200440ustar00rootroot00000000000000/* vim: set tabstop=4 expandtab: */ /** * Navit, a modular navigation system. * Copyright (C) 2005-2014 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* This plugin implements a small subset of the SAE j1850 protocal used in some cars. So far the code assumes that it is run on Linux. It allows Navit to read the steering wheel inputs and some metrics like RPM or the fuel tank level */ #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "graphics.h" #include "color.h" #include "osd.h" struct j1850 { struct navit *nav; int status; int device; int index; char message[255]; char * filename; struct event_idle *idle; struct callback *callback; struct osd_item osd_item; int width; struct graphics_gc *orange,*white; struct callback *click_cb; int init_string_index; int engine_rpm; int trans_rpm; int map; int tank_level; int odo; }; /** * @brief Generates a fake sentence. Used for debugging * @param[in] dest - the char * to which we will write the sentence * lenght - the length of the sentence to generate * * @return nothing * * Generates a fake string to simulate data from the serial port * */ void rand_str(char *dest, size_t length) { char charset[] = "0123456789" "ABCDEF"; while (length-- > 0) { size_t index = (double) rand() / RAND_MAX * (sizeof charset - 1); *dest++ = charset[index]; } *dest = '\0'; } /** * @brief Writes 'cmd' to the serial port' * @param[in] cmd - the char * that we will write to the serial port * device - the serial port device * * @return nothing * * Write the cmd to the serial port * */ void write_to_serial_port(unsigned char *cmd, int device) { int n_written = 0; do { n_written += write( device, &cmd[n_written], 1 ); } while (cmd[n_written-1] != '\r' && n_written > 0); dbg(lvl_info,"sent %s to the serial port\n",cmd); } /** * @brief Function called when navit is idle. Does the continous reading * @param[in] j1850 - the j1850 struct containing the state of the plugin * * @return nothing * * This is the main function of this plugin. It is called when navit is idle, * and performs the initialization of the obd device if needed, then reads * one char each time it is called, and puts this char in a buffer. When it * reads an EOL character, the buffer is parsed, and the appropriate action is * taken. The buffer is then cleared and we start over. * */ static void j1850_idle(struct j1850 *j1850) { int n; // used to keep track of the numbers of char read from the device int value; // used to convert the ascii char to an int char buf = '\0'; // the buffer where we store the char read from the device char header[3]; // a buffer to store the j1850 header for easier matching struct timeval tv; // used to timestamp the logs struct attr navit; const char *init_string[] = { "ATZ\r\n", "ATI\r\n", "ATL1\r\n", "ATH1\r\n", "ATS1\r\n", "ATAL\r\n", "ATMA\r\n", NULL }; // Make sure we sent all init commands before trying to read if ( init_string[j1850->init_string_index]) { dbg(lvl_info,"Sending next init command : %s\n",init_string[j1850->init_string_index]); if (j1850->device > 0 ){ write_to_serial_port(init_string[j1850->init_string_index++],j1850->device); } // Did we reach the last init command? if ( !init_string[j1850->init_string_index]) { // if yes, switch to idle read instead of timed read event_remove_timeout(j1850->idle); j1850->idle=event_add_idle(125, j1850->callback); } return; } navit.type=attr_navit; navit.u.navit=j1850->nav; // If not connected, generate random messages for debugging purpose if (j1850->device < 0 ){ rand_str(j1850->message,8); return; } n = read( j1850->device, &buf, 1 ); if(n == -1) { dbg(lvl_debug,"x\n"); } else if (n==0) { dbg(lvl_debug,".\n"); } else { if( buf == 13 ) { gettimeofday(&tv, NULL); unsigned long long millisecondsSinceEpoch = (unsigned long long)(tv.tv_sec) * 1000 + (unsigned long long)(tv.tv_usec) / 1000; j1850->message[j1850->index]='\0'; FILE *fp; fp = fopen(j1850->filename,"a"); fprintf(fp, "%llu,%s\n", millisecondsSinceEpoch, j1850->message); fclose(fp); strncpy(header, j1850->message, 2); header[2]='\0'; if( strncmp(header,"10",2)==0 ) { char * w1 = strndup(j1850->message+2, 2); char * w2 = strndup(j1850->message+4, 2); char * w3 = strndup(j1850->message+6, 2); j1850->engine_rpm = ((int)strtol(w1, NULL, 16) ) / 4 ; j1850->trans_rpm = ((int)strtol(w2, NULL, 16) ) / 4 ; j1850->map = (int)strtol(w3, NULL, 16); } else if( strncmp(header,"3D",2)==0 ) { if (strcmp(j1850->message, "3D110000EE") == 0) { // noise } else if (strcmp(j1850->message, "3D1120009B") == 0) { dbg(lvl_error,"L1\n"); command_evaluate(&navit, "gui.spotify_volume_up()" ); } else if (strcmp(j1850->message, "3D110080C8") == 0) { dbg(lvl_error,"L2\n"); command_evaluate(&navit, "gui.spotify_volume_toggle()" ); } else if (strcmp(j1850->message, "3D1110005A") == 0) { dbg(lvl_error,"L3\n"); command_evaluate(&navit, "gui.spotify_volume_down()" ); } else if (strcmp(j1850->message, "3D110400C3") == 0) { dbg(lvl_error,"R1\n"); command_evaluate(&navit, "gui.spotify_next_track()" ); } else if (strcmp(j1850->message, "3D110002D4") == 0) { dbg(lvl_error,"R2\n"); command_evaluate(&navit, "gui.spotify_toggle()" ); } else if (strcmp(j1850->message, "3D11020076") == 0) { dbg(lvl_error,"R3\n"); command_evaluate(&navit, "gui.spotify_previous_track()" ); } else { dbg(lvl_error,"Got button from %s\n", j1850->message); } } else if( strncmp(header,"72",2)==0 ) { char * data=strndup(j1850->message+2, 8); j1850->odo=((int)strtol(data, NULL, 16) )/8000; } else if( strncmp(header,"90",2)==0 ) { } else if( strncmp(header,"A4",2)==0 ) { char * w1 =strndup(j1850->message+2, 4); j1850->tank_level = ((int)strtol(w1, NULL, 16) ) / 4 ; } else { // printf(" ascii: %i [%s] with header [%s]\n",buf, response, header); } // Message has been processed. Let's clear it j1850->message[0]='\0'; j1850->index=0; } else { value=buf-48; if(value==-16 || buf == 10 ){ //space and newline, discard return; } else if (value>16) { // chars, need to shift down value-=7; j1850->message[j1850->index]=buf; j1850->index++; } else if (buf == '<' ) { // We have a data error. Let's truncate the message j1850->message[j1850->index]='\0'; j1850->index++; } else { j1850->message[j1850->index]=buf; j1850->index++; } // printf("{%c:%i}", buf,value); } } } /** * @brief Draws the j1850 OSD * @param[in] j1850 - the j1850 struct containing the state of the plugin * nav - the navit object * v - the vehicle object * * @return nothing * * Draws the j1850 OSD. Currently it only displays the last parsed message * */ static void osd_j1850_draw(struct j1850 *this, struct navit *nav, struct vehicle *v) { osd_std_draw(&this->osd_item); struct point p, bbox[4]; graphics_get_text_bbox(this->osd_item.gr, this->osd_item.font, this->message, 0x10000, 0, bbox, 0); p.x=(this->osd_item.w-bbox[2].x)/2; p.y = this->osd_item.h-this->osd_item.h/10; struct graphics_gc *curr_color = this->white; // online? use this->bActive?this->white:this->orange; graphics_draw_text(this->osd_item.gr, curr_color, NULL, this->osd_item.font, this->message, &p, 0x10000, 0); graphics_draw_mode(this->osd_item.gr, draw_mode_end); } /** * @brief Initialize the j1850 OSD * @param[in] j1850 - the j1850 struct containing the state of the plugin * nav - the navit object * * @return nothing * * Initialize the j1850 OSD * */ static void osd_j1850_init(struct j1850 *this, struct navit *nav) { struct color c; osd_set_std_graphic(nav, &this->osd_item, (struct osd_priv *)this); // Used when debugging or when the device is offline this->orange = graphics_gc_new(this->osd_item.gr); c.r = 0xFFFF; c.g = 0xA5A5; c.b = 0x0000; c.a = 65535; graphics_gc_set_foreground(this->orange, &c); graphics_gc_set_linewidth(this->orange, this->width); // Used when we are receiving real datas from the device this->white = graphics_gc_new(this->osd_item.gr); c.r = 65535; c.g = 65535; c.b = 65535; c.a = 65535; graphics_gc_set_foreground(this->white, &c); graphics_gc_set_linewidth(this->white, this->width); graphics_gc_set_linewidth(this->osd_item.graphic_fg_white, this->width); event_add_timeout(500, 1, callback_new_1(callback_cast(osd_j1850_draw), this)); j1850_init_serial_port(this); // navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_j1850_click), attr_button, this)); osd_j1850_draw(this, nav, NULL); } /** * @brief Sends 'cmd' and reads the reply from the device * @param[in] cmd - the char * that we will write to the serial port * device - the serial port device * * @return nothing * * Sends 'cmd' and reads the reply from the device * */ void send_and_read(unsigned char *cmd, int USB) { int n_written = 0; do { n_written += write( USB, &cmd[n_written], 1 ); } while (cmd[n_written-1] != '\r' && n_written > 0); int n = 0; char buf = '\0'; /* Whole response*/ char response[255]; do { n = read( USB, &buf, 1 ); if(n == -1) { dbg(lvl_debug,"x"); } else if (n==0) { dbg(lvl_debug,"."); } else { dbg(lvl_debug,"[%s]", &buf); } } while( buf != '\r' && n > 0); if (n < 0) { dbg(lvl_error,"Read error\n"); } else if (n == 0) { dbg(lvl_error,"Nothing to read?\n"); } else { dbg(lvl_error,"Response : \n"); } } /** * @brief Opens the serial port and saves state to the j1850 object * @param[in] j1850 - the j1850 struct containing the state of the plugin * * @return nothing * * Opens the serial port and saves state to the j1850 object * */ void j1850_init_serial_port(struct j1850 *j1850) { j1850->callback=callback_new_1(callback_cast(j1850_idle), j1850); // Fixme : we should read the device path from the config file j1850->device = open( "/dev/ttyUSB0", O_RDWR| O_NOCTTY ); if ( j1850->device < 0 ) { dbg(lvl_error,"Can't open port\n"); j1850->idle=event_add_timeout(100, 1, j1850->callback); return; } struct termios tty; struct termios tty_old; memset (&tty, 0, sizeof tty); /* Error Handling */ if ( tcgetattr ( j1850->device, &tty ) != 0 ) { dbg(lvl_error,"Error\n"); return; } /* Save old tty parameters */ tty_old = tty; /* Set Baud Rate */ cfsetospeed (&tty, (speed_t)B115200); cfsetispeed (&tty, (speed_t)B115200); /* Setting other Port Stuff */ tty.c_cflag &= ~PARENB; // Make 8n1 tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CSIZE; tty.c_cflag |= CS8; tty.c_cflag &= ~CRTSCTS; // no flow control tty.c_cc[VMIN] = 1; // read doesn't block tty.c_cc[VTIME] = 10; // 0.5 seconds read timeout tty.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines /* Make raw */ cfmakeraw(&tty); /* Flush Port, then applies attributes */ tcflush( j1850->device, TCIFLUSH ); if ( tcsetattr ( j1850->device, TCSANOW, &tty ) != 0) { dbg(lvl_error,"Flush error\n"); return; } dbg(lvl_error,"Port init ok\n"); // For the init part, we want to wait 1sec before each init string j1850->idle=event_add_timeout(1000, 1, j1850->callback); } /** * @brief Creates the j1850 OSD and set some default properties * @param[in] nav - the navit object * meth - the osd_methods * attrs - pointer to the attributes * * @return nothing * * Creates the j1850 OSD and set some default properties * */ static struct osd_priv * osd_j1850_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct j1850 *this=g_new0(struct j1850, 1); this->nav=nav; time_t current_time = time(NULL); // FIXME : make sure that the directory we log to exists! this->filename=g_strdup_printf("/home/navit/.navit/obd/%ld.log",(long)current_time); dbg(lvl_error,"Will log to %s\n", this->filename); this->init_string_index=0; struct attr *attr; this->osd_item.p.x = 120; this->osd_item.p.y = 20; this->osd_item.w = 160; this->osd_item.h = 20; this->osd_item.navit = nav; this->osd_item.font_size = 200; this->osd_item.meth.draw = osd_draw_cast(osd_j1850_draw); osd_set_std_attr(attrs, &this->osd_item, 2); attr = attr_search(attrs, NULL, attr_width); this->width=attr ? attr->u.num : 2; navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_j1850_init), attr_graphics_ready, this)); return (struct osd_priv *) this; } /** * @brief The plugin entry point * * @return nothing * * The plugin entry point * */ void plugin_init(void) { struct attr callback,navit; struct attr_iter *iter; plugin_register_osd_type("j1850", osd_j1850_new); } navit-0.5.0+dfsg.1/navit/plugin/pedestrian/000077500000000000000000000000001264204753600205015ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/plugin/pedestrian/CMakeLists.txt000066400000000000000000000000631264204753600232400ustar00rootroot00000000000000module_add_library(plugin_pedestrian pedestrian.c) navit-0.5.0+dfsg.1/navit/plugin/pedestrian/Makefile.am000066400000000000000000000007011264204753600225330ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_pedestrian moduleplugin_LTLIBRARIES = libplugin_pedestrian.la libplugin_pedestrian_la_LDFLAGS=-module -avoid-version @NAVIT_MODULE_LDFLAGS@ #-Wl,--no-undefined libplugin_pedestrian_la_SOURCES = pedestrian.c android: libplugin_pedestrian.la cp .libs/libplugin_pedestrian.so ../../android/libs/armeabi xslt: cp *.xslt ../../xslt navit-0.5.0+dfsg.1/navit/plugin/pedestrian/pedestrian.c000066400000000000000000001052751264204753600230150ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #define DEMO 1 */ #ifdef HAVE_API_ANDROID #include #endif static struct map *global_map; int orientation,orientation_old; struct pedestrian { struct navit *nav; int w,h; int yaw; } pedestrian_data; int sensors_locked; struct attr initial_layout, main_layout; struct rocket { struct navit *navit; struct layout *layout; struct graphics *gra; struct transformation *trans; struct displaylist *dl; struct mapset *ms; int a,g,t,hog,v,vscale; struct callback *callback; struct event_idle *idle; }; static void pedestrian_rocket_idle(struct rocket *rocket) { struct attr follow; follow.type=attr_follow; follow.u.num=100; transform_set_hog(rocket->trans, rocket->hog); graphics_displaylist_draw(rocket->gra, rocket->dl, rocket->trans, rocket->layout, 0); rocket->v+=rocket->a-rocket->g; dbg(lvl_debug,"enter v=%d\n",rocket->v); if (rocket->t > 0) rocket->t--; else rocket->a=0; rocket->hog+=rocket->v/rocket->vscale; dbg(lvl_debug,"hog=%d\n",rocket->hog); if (rocket->hog < 0) { transform_set_hog(rocket->trans, 0); transform_set_order_base(rocket->trans, 14); transform_set_scale(rocket->trans, transform_get_scale(rocket->trans)); graphics_overlay_disable(rocket->gra, 0); navit_draw(rocket->navit); follow.u.num=1; event_remove_idle(rocket->idle); rocket->idle=NULL; sensors_locked=0; } navit_set_attr(rocket->navit, &follow); } static void pedestrian_cmd_pedestrian_rocket(struct rocket *rocket) { struct attr attr; int max=0; #if 0 int i,step=10; #endif rocket->a=2; rocket->g=1; rocket->t=100; rocket->hog=0; rocket->v=0; rocket->vscale=10; if (! navit_get_attr(rocket->navit, attr_graphics, &attr, NULL)) return; rocket->gra=attr.u.graphics; if (! navit_get_attr(rocket->navit, attr_transformation, &attr, NULL)) return; rocket->trans=attr.u.transformation; if (! navit_get_attr(rocket->navit, attr_displaylist, &attr, NULL)) return; rocket->dl=attr.u.displaylist; if (! navit_get_attr(rocket->navit, attr_mapset, &attr, NULL)) return; rocket->ms=attr.u.mapset; transform_set_hog(rocket->trans, max); transform_set_order_base(rocket->trans, 14); transform_set_scale(rocket->trans, transform_get_scale(rocket->trans)); transform_setup_source_rect(rocket->trans); graphics_overlay_disable(rocket->gra, 1); graphics_draw(rocket->gra, rocket->dl, rocket->ms, rocket->trans, rocket->layout, 0, NULL, 0); sensors_locked=1; if (!rocket->idle) rocket->idle=event_add_idle(50, rocket->callback); #if 0 while (hog >= 0) { transform_set_hog(trans, hog); #if 0 graphics_draw(gra, dl, ms, trans, layout, 0, NULL); #else graphics_displaylist_draw(gra, dl, trans, layout, 0); #endif v=v+a-g; if (t > 0) t--; else a=0; hog=hog+v/vscale; } #if 0 for (i = 0 ; i < max ; i+=step) { transform_set_hog(trans, i); graphics_displaylist_draw(gra, dl, trans, layout, 0); } for (i = max ; i >= 0 ; i-=step) { transform_set_hog(trans, i); graphics_displaylist_draw(gra, dl, trans, layout, 0); } #endif #endif } static struct command_table commands[] = { {"pedestrian_rocket",command_cast(pedestrian_cmd_pedestrian_rocket)}, }; static void osd_rocket_init(struct navit *nav) { struct rocket *rocket=g_new0(struct rocket, 1); struct attr attr; rocket->navit=nav; rocket->callback=callback_new_1(callback_cast(pedestrian_rocket_idle), rocket); if (navit_get_attr(nav, attr_layout, &attr, NULL)) rocket->layout=attr.u.layout; if (navit_get_attr(nav, attr_callback_list, &attr, NULL)) { dbg(lvl_debug,"ok\n"); command_add_table(attr.u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), rocket); } } struct marker { struct cursor *cursor; }; static void osd_marker_draw(struct marker *this, struct navit *nav) { #if 0 struct attr graphics; struct point p; dbg(lvl_debug,"enter\n"); if (!navit_get_attr(nav, attr_graphics, &graphics, NULL)) return; p.x=40; p.y=50; cursor_draw(this->cursor, graphics.u.graphics, &p, 0, 45, 0); #endif } static void osd_marker_init(struct marker *this, struct navit *nav) { struct attr cursor; struct attr itemgra,polygon,polygoncoord1,polygoncoord2,polygoncoord3; struct attr *color=attr_new_from_text("color","#ff0000"); cursor=(struct attr){attr_cursor, {(void *)cursor_new(NULL, (struct attr *[]){ &(struct attr){attr_w,{(void *)26}}, &(struct attr){attr_h,{(void *)26}}, NULL})}}; itemgra=(struct attr){attr_itemgra, {(void *)itemgra_new(&cursor, (struct attr *[]){ NULL})}}; cursor_add_attr(cursor.u.cursor, &itemgra); polygon=(struct attr){attr_polygon, {(void *)polygon_new(&itemgra, (struct attr *[]){ color, &(struct attr){attr_width,{(void *)2}}, NULL})}}; itemgra_add_attr(itemgra.u.itemgra, &polygon); polygoncoord1=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ &(struct attr){attr_x,{(void *)-7}}, &(struct attr){attr_y,{(void *)-10}}, NULL})}}; element_add_attr(polygon.u.element, &polygoncoord1); polygoncoord2=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ &(struct attr){attr_x,{(void *)0}}, &(struct attr){attr_y,{(void *)12}}, NULL})}}; element_add_attr(polygon.u.element, &polygoncoord2); polygoncoord3=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ &(struct attr){attr_x,{(void *)7}}, &(struct attr){attr_y,{(void *)-10}}, NULL})}}; element_add_attr(polygon.u.element, &polygoncoord3); attr_free(color); this->cursor=cursor.u.cursor; osd_marker_draw(this, nav); } static struct osd_priv * osd_marker_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) { struct marker *this = g_new0(struct marker, 1); navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_marker_init), attr_navit, this)); return (struct osd_priv *) this; } struct map_priv { struct navit *navit; }; struct map_rect_priv { struct map_priv *mpriv; struct item item; struct map_rect *route_map_rect; struct item *route_item; struct street_data *sd; struct coord c0; struct coord c_base; int checked; int idx_base; int idx_next; int idx; int first,last; int route_item_done; struct coord c_out; struct coord c_next; struct coord c_next_base; struct coord lseg[2]; struct coord lseg_base[2]; int lseg_done; int lseg_done_base; }; static int map_route_occluded_bbox(struct map *map, struct coord_rect *bbox) { struct coord c[128]; struct coord_rect r; int i,first=1,ccount; struct map_rect *map_rect=map_rect_new(map, NULL); struct item *item; while ((item=map_rect_get_item(map_rect))) { ccount=item_coord_get(item, c, 128); if (ccount && first) { r.lu=c[0]; r.rl=c[0]; first=0; } for (i = 0 ; i < ccount ; i++) coord_rect_extend(&r, &c[i]); } map_rect_destroy(map_rect); if (first) return 0; *bbox=r; return 1; } static struct building { struct street_data *sd; struct coord left,right; struct building *next; } *buildings; static void map_route_occluded_buildings_free(void) { struct building *next,*b=buildings; while (b) { street_data_free(b->sd); next=b->next; g_free(b); b=next; } buildings=NULL; } static void map_route_occluded_get_buildings(struct mapset *mapset, struct coord_rect *r) { struct mapset_handle *msh=mapset_open(mapset); struct map *map; struct map_selection sel; struct map_rect *mr; struct item *item; struct building *b; sel.next=NULL; sel.u.c_rect=*r; sel.order=18; sel.range.min=type_poly_building; sel.range.max=type_poly_building; map_route_occluded_buildings_free(); while ((map = mapset_next(msh, 1))) { mr=map_rect_new(map, &sel); while ((item = map_rect_get_item(mr))) { if (item->type == type_poly_building) { #if 0 if (item->id_hi != 0x1 || item->id_lo != 0x1f69) continue; #endif #if 0 if (item->id_hi != 0x8) continue; #if 1 if (item->id_lo != 0x2b3e0 && item->id_lo != 0x2ae7a && item->id_lo != 0x2af1a && item->id_lo != 0x2b348 && item->id_lo != 0x18bb5 && item->id_lo != 0x18ce5 && item->id_lo != 0x18a85) #else if (item->id_lo != 0x18bb5 && item->id_lo != 0x18ce5 && item->id_lo != 0x18a85) #endif continue; #endif b=g_new(struct building, 1); b->sd=street_get_data(item); b->next=buildings; buildings=b; } } map_rect_destroy(mr); } } FILE *debug,*debug2; /* < 0 left, > 0 right */ static int side(struct coord *l0, struct coord *l1, struct coord *p) { int dxl=l1->x-l0->x; int dyl=l1->y-l0->y; int dxp=p->x-l0->x; int dyp=p->y-l0->y; return dxp*dyl-dyp*dxl; } static void map_route_occluded_check_buildings(struct coord *c0) { struct building *b=buildings; dbg(lvl_debug,"enter\n"); int i,count; struct coord *c; #if 1 FILE *bdebug,*bldebug; bdebug=fopen("tstb.txt","w"); bldebug=fopen("tstbl.txt","w"); #endif while (b) { c=b->sd->c; count=b->sd->count; if (c[count-1].x == c[0].x && c[count-1].y == c[0].y) { #if 0 dbg(lvl_debug,"closed\n"); #endif count--; } for (i = 0 ; i < count ; i++) { if (!i || side(c0, &b->left, &c[i]) < 0) b->left=c[i]; if (!i || side(c0, &b->right, &c[i]) > 0) b->right=c[i]; } #if 1 if (bdebug) { fprintf(bdebug,"0x%x 0x%x type=poi_hospital\n", b->left.x, b->left.y); fprintf(bdebug,"0x%x 0x%x type=poi_hospital\n", b->right.x, b->right.y); } if (bldebug) { fprintf(bldebug,"type=street_nopass\n"); fprintf(bldebug,"0x%x 0x%x\n", c0->x, c0->y); fprintf(bldebug,"0x%x 0x%x\n", c0->x+(b->left.x-c0->x)*10, c0->y+(b->left.y-c0->y)*10); fprintf(bldebug,"type=street_nopass\n"); fprintf(bldebug,"0x%x 0x%x\n", c0->x, c0->y); fprintf(bldebug,"0x%x 0x%x\n", c0->x+(b->right.x-c0->x)*10, c0->y+(b->right.y-c0->y)*10); } #endif b=b->next; } #if 1 if (bdebug) fclose(bdebug); if (bldebug) fclose(bldebug); #endif } static int intersect(struct coord *p1, struct coord *p2, struct coord *p3, struct coord *p4, struct coord *i) { double num=(p4->x-p3->x)*(p1->y-p3->y)-(p4->y-p3->y)*(p1->x-p3->x); double den=(p4->y-p3->y)*(p2->x-p1->x)-(p4->x-p3->x)*(p2->y-p1->y); if (num < 0 && den < 0) { num=-num; den=-den; } dbg(lvl_debug,"num=%f den=%f\n", num, den); if (i) { i->x=p1->x+(num/den)*(p2->x-p1->x)+0.5; i->y=p1->y+(num/den)*(p2->y-p1->y)+0.5; dbg(lvl_debug,"i=0x%x,0x%x\n", i->x, i->y); if (debug2) fprintf(debug2, "0x%x 0x%x type=town_label_5e3\n", i->x, i->y); } if (num < 0 || den < 0) return -1; if (num > den) return 257; return 256*num/den; } /* return 0=Not clipped 1=Start clipped 2=End clipped 3=Both clipped 4=Invisible */ /* #define DEBUG_VISIBLE */ static int is_visible_line(struct coord *c0, struct coord *c1, struct coord *c2) { int res,ret=0; struct building *b=buildings; struct coord cn; #ifdef DEBUG_VISIBLE dbg(lvl_debug,"enter\n"); #endif while (b) { if (side(&b->left, &b->right, c1) < 0 || side(&b->left, &b->right, c2) < 0) { #ifdef DEBUG_VISIBLE dbg(lvl_debug,"sides left: start %d end %d right: start %d end %d\n", side(c0, &b->left, c1), side(c0, &b->left, c2), side(c0, &b->right, c1), side(c0, &b->right, c2)); #endif for (;;) { if (side(c0, &b->left, c1) <= 0) { if (side(c0, &b->left, c2) > 0) { #ifdef DEBUG_VISIBLE dbg(lvl_debug,"visible: start is left of left corner and end is right of left corner, clipping end\n"); #endif res=intersect(c0, &b->left, c1, c2, &cn); if (res < 256) break; if (c1->x != cn.x || c1->y != cn.y) { *c2=cn; ret|=2; break; } } else break; } if (side(c0, &b->right, c1) >= 0) { if (side(c0, &b->right, c2) < 0) { #ifdef DEBUG_VISIBLE dbg(lvl_debug,"visible: start is right of right corner and end is left of right corner, clipping end\n"); #endif res=intersect(c0, &b->right, c1, c2, &cn); if (res < 256) break; if (c1->x != cn.x || c1->y != cn.y) { *c2=cn; ret|=2; break; } } else break; } if (side(c0, &b->left, c2) <= 0) { if (side(c0, &b->left, c1) > 0) { #ifdef DEBUG_VISIBLE dbg(lvl_debug,"visible: end is left of left corner and start is right of left corner, clipping start\n"); #endif res=intersect(c0, &b->left, c1, c2, &cn); if (res < 256) break; if (c2->x != cn.x || c2->y != cn.y) { *c1=cn; ret|=1; break; } } else break; } if (side(c0, &b->right, c2) >= 0) { if (side(c0, &b->right, c1) < 0) { #ifdef DEBUG_VISIBLE dbg(lvl_debug,"visible: end is right of right corner and start is left of right corner, clipping start\n"); #endif res=intersect(c0, &b->right, c1, c2, &cn); if (res < 256) break; if (c2->x != cn.x || c2->y != cn.y) { *c1=cn; ret|=1; break; } } else break; } #ifdef DEBUG_VISIBLE dbg(lvl_debug,"visible: not visible\n"); #endif return 4; } } b=b->next; } #ifdef DEBUG_VISIBLE dbg(lvl_debug,"return %d\n",ret); #endif return ret; } static void map_route_occluded_coord_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; dbg(lvl_debug,"enter\n"); mr->idx=mr->idx_base; mr->first=1; mr->lseg_done=mr->lseg_done_base; mr->c_next=mr->c_next_base; mr->lseg[0]=mr->lseg_base[0]; mr->lseg[1]=mr->lseg_base[1]; mr->last=0; item_coord_rewind(mr->route_item); } static void map_route_occluded_attr_rewind(void *priv_data) { struct map_rect_priv *mr=priv_data; dbg(lvl_debug,"enter\n"); item_attr_rewind(mr->route_item); } static int map_route_occluded_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; dbg(lvl_debug,"enter\n"); return item_attr_get(mr->route_item, attr_type, attr); } static int coord_next(struct map_rect_priv *mr, struct coord *c) { if (mr->idx >= mr->sd->count) return 1; *c=mr->sd->c[mr->idx++]; return 0; } #define DEBUG_COORD_GET static int map_route_occluded_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr=priv_data; struct coord l0,l1; int vis,ret=0; char buffer[4096]; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"enter\n"); #endif dbg_assert(count >= 2); if (! mr->checked) { mr->c0=mr->sd->c[0]; map_route_occluded_check_buildings(&mr->c0); mr->checked=1; } while (ret < count && !mr->last) { #ifdef DEBUG_COORD_GET dbg(lvl_debug,"coord first %d lseg_done %d\n",mr->first,mr->lseg_done); #endif if (mr->lseg_done) { #ifdef DEBUG_COORD_GET dbg(lvl_debug,"loading %d of %d from id_lo %d\n", mr->idx, mr->sd->count, mr->sd->item.id_lo); #endif if (!mr->idx) { if (coord_next(mr, &mr->lseg[0])) { mr->route_item_done=1; mr->last=1; mr->idx_base=mr->idx=0; break; } mr->first=1; } else mr->lseg[0]=mr->lseg[1]; if (coord_next(mr, &mr->lseg[1])) { mr->route_item_done=1; mr->last=1; mr->idx_base=mr->idx=0; break; } mr->c_next=mr->lseg[0]; mr->lseg_done=0; } l0=mr->c_next; l1=mr->lseg[1]; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"line (0x%x,0x%x)-(0x%x,0x%x)\n", l0.x,l0.y,l1.x,l1.y); #endif vis=is_visible_line(&mr->c0, &l0, &l1); if (debug) { fprintf(debug,"type=tracking_%d debug=\"%s\"\n",vis*20,buffer); fprintf(debug,"0x%x 0x%x\n", l0.x, l0.y); fprintf(debug,"0x%x 0x%x\n", l1.x, l1.y); } #ifdef DEBUG_COORD_GET dbg(lvl_debug,"vis=%d line (0x%x,0x%x)-(0x%x,0x%x)\n", vis, l0.x,l0.y,l1.x,l1.y); #endif mr->idx_base=mr->idx; mr->c_next_base=mr->c_next; mr->lseg_base[0]=mr->lseg[0]; mr->lseg_base[1]=mr->lseg[1]; mr->lseg_done_base=mr->lseg_done; switch (vis) { case 0: mr->c_next_base=mr->c_next; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->lseg_done_base=mr->lseg_done=1; mr->last=1; break; case 1: #ifdef DEBUG_COORD_GET dbg(lvl_debug,"begin clipped\n"); dbg(lvl_debug,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->c_next_base=mr->c_next=l1; mr->last=1; break; case 2: #ifdef DEBUG_COORD_GET dbg(lvl_debug,"end clipped\n"); #endif mr->c_next_base=mr->c_next; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->c_next_base=mr->c_next=l1; mr->last=1; break; case 3: #ifdef DEBUG_COORD_GET dbg(lvl_debug,"both clipped\n"); #endif mr->c_next_base=mr->c_next; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"out 0x%x,0x%x\n", l0.x, l1.y); #endif c[ret++]=l0; #ifdef DEBUG_COORD_GET dbg(lvl_debug,"out 0x%x,0x%x\n", l1.x, l1.y); #endif c[ret++]=l1; mr->c_next_base=mr->c_next=l1; mr->last=1; break; case 4: mr->last=1; mr->lseg_done_base=mr->lseg_done=1; break; #if 0 case 2: dbg(lvl_debug,"visible up to 0x%x,0x%x\n",l1.x,l1.y); if (mr->first) { mr->first=0; c[ret++]=mr->c_out; dbg(lvl_debug,"out 0x%x,0x%x\n", mr->c_out.x, mr->c_out.y); } c[ret++]=mr->c_out=l1; dbg(lvl_debug,"out 0x%x,0x%x\n", l1.x, l1.y); mr->last=1; mr->route_item_done=1; break; case 1: case 3: case 4: dbg(lvl_debug,"invisible\n"); mr->c_out=l1; mr->idx++; mr->last=1; mr->route_item_done=1; break; } if (!vis) break; #endif } } #ifdef DEBUG_COORD_GET dbg(lvl_debug,"ret=%d last=%d\n", ret, mr->last); #endif return ret; } static struct item_methods methods_route_occluded_item = { map_route_occluded_coord_rewind, map_route_occluded_coord_get, map_route_occluded_attr_rewind, map_route_occluded_attr_get, }; static void map_route_occluded_destroy(struct map_priv *priv) { g_free(priv); } static int no_recurse; static struct map_rect_priv * map_route_occluded_rect_new(struct map_priv *priv, struct map_selection *sel) { struct map_rect_priv * mr; struct attr route; struct attr route_map; struct map_rect *route_map_rect; struct coord_rect r; if (!navit_get_attr(priv->navit, attr_route, &route, NULL)) { dbg(lvl_debug,"no route in navit\n"); return NULL; } if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) { dbg(lvl_debug,"no map in route\n"); return NULL; } route_map_rect=map_rect_new(route_map.u.map, sel); if (!route_map_rect) { dbg(lvl_debug,"no route map rect\n"); return NULL; } map_dump_file(route_map.u.map, "route.txt"); mr=g_new0(struct map_rect_priv, 1); mr->route_map_rect=route_map_rect; mr->mpriv = priv; mr->item.priv_data = mr; mr->item.meth = &methods_route_occluded_item; mr->item.id_lo = -1; mr->route_item_done=1; mr->lseg_done_base=1; mr->last=1; if (!no_recurse && map_route_occluded_bbox(route_map.u.map, &r)) { struct attr mapset; no_recurse++; if (navit_get_attr(mr->mpriv->navit, attr_mapset, &mapset, NULL)) map_route_occluded_get_buildings(mapset.u.mapset, &r); debug=fopen("tst.txt","w"); debug2=fopen("tstp.txt","w"); no_recurse--; } return mr; } static void map_route_occluded_rect_destroy(struct map_rect_priv *mr) { map_rect_destroy(mr->route_map_rect); street_data_free(mr->sd); g_free(mr); if (!no_recurse) { if (debug) { fclose(debug); debug=NULL; } if (debug2) { fclose(debug2); debug2=NULL; } } #if 0 static int in_dump; if (! in_dump) { in_dump=1; map_dump_file(global_map,"route.txt"); in_dump=0; } #endif } static struct item * map_route_occluded_get_item(struct map_rect_priv *mr) { dbg(lvl_debug,"enter last=%d\n",mr->last); while (!mr->last) { struct coord c[128]; map_route_occluded_coord_get(mr, c, 128); } if (mr->route_item_done) { dbg(lvl_debug,"next route item\n"); do { mr->route_item=map_rect_get_item(mr->route_map_rect); } while (mr->route_item && mr->route_item->type != type_street_route); dbg(lvl_debug,"item %p\n", mr->route_item); if (!mr->route_item) return NULL; mr->item.type=type_street_route_occluded; street_data_free(mr->sd); mr->sd=street_get_data(mr->route_item); mr->route_item_done=0; } mr->item.id_lo++; #if 0 if (mr->item.id_lo > 20) return NULL; #endif map_route_occluded_coord_rewind(mr); dbg(lvl_debug,"type %s\n", item_to_name(mr->route_item->type)); return &mr->item; } static struct item * map_route_occluded_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct item *ret=NULL; while (id_lo-- > 0) ret=map_route_occluded_get_item(mr); return ret; } static struct map_methods map_route_occluded_methods = { projection_mg, "utf-8", map_route_occluded_destroy, map_route_occluded_rect_new, map_route_occluded_rect_destroy, map_route_occluded_get_item, map_route_occluded_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * map_route_occluded_new(struct map_methods *meth, struct attr **attrs) { struct map_priv *ret; struct attr *navit; dbg(lvl_debug,"enter\n"); navit=attr_search(attrs, NULL, attr_navit); if (! navit) return NULL; ret=g_new0(struct map_priv, 1); *meth=map_route_occluded_methods; ret->navit=navit->u.navit; dbg(lvl_debug,"m=%p navit=%p\n", ret, ret->navit); return ret; } static void pedestrian_graphics_resize(struct graphics *gra, int w, int h) { #ifndef HAVE_API_ANDROID static int done; if (!done) { int id=(int)graphics_get_data(gra, "xwindow_id"); char buffer[1024]; sprintf(buffer,"testxv %d &",id); system(buffer); done=1; } #endif pedestrian_data.w=w; pedestrian_data.h=h; } static void pedestrian_draw_arrow(struct graphics *gra, char *name, int x, int y) { char *src=graphics_icon_path(name); struct graphics_image *img=graphics_image_new(gra, src); struct graphics_gc *gc=graphics_gc_new(gra); struct color col={0xffff,0xffff,0xffff,0xffff}; struct point p; graphics_gc_set_foreground(gc, &col); p.x=x; p.y=y; graphics_draw_image(gra, gc, &p, img); graphics_image_free(gra, img); graphics_gc_destroy(gc); g_free(src); } static void pedestrian_draw_arrows(struct graphics *gra) { struct attr route, route_map; struct map_rect *route_map_rect; struct item *item; if (orientation == 2) return; if (!navit_get_attr(pedestrian_data.nav, attr_route, &route, NULL)) { dbg(lvl_debug,"no route in navit\n"); return; } if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) { dbg(lvl_debug,"no map in route\n"); return; } route_map_rect=map_rect_new(route_map.u.map, NULL); if (!route_map_rect) { dbg(lvl_debug,"no route map rect\n"); return; } while ((item=map_rect_get_item(route_map_rect))) { if (item->type == type_street_route) { struct coord c[2]; if (item_coord_get(item, c, 2) == 2) { struct coord *center=transform_get_center(navit_get_trans(pedestrian_data.nav)); int angle=transform_get_angle_delta(center, &c[1], 0); angle-=pedestrian_data.yaw; if (angle < 0) angle+=360; if (angle >= 360) angle-=360; if (angle > 180 && angle < 350) pedestrian_draw_arrow(gra,"gui_arrow_left_32_32.png",0,pedestrian_data.h/2-16); if (angle > 10 && angle <= 180) pedestrian_draw_arrow(gra,"gui_arrow_right_32_32.png",pedestrian_data.w-32,pedestrian_data.h/2-16); } break; } } map_rect_destroy(route_map_rect); } static void pedestrian_graphics_postdraw(struct graphics *gra) { #if 0 struct graphics_gc * gc = graphics_gc_new(gra); struct point p; struct color c = {0xadad,0xd8d8,0xe6e6,0xffff}; p.x=0; p.y=0; graphics_gc_set_foreground(gc, &c); graphics_draw_rectangle(gra, gc, &p, 1000, 200); graphics_gc_destroy(gc); #endif pedestrian_draw_arrows(gra); } #ifndef HAVE_API_ANDROID struct tilt_data { int len,axis; char buffer[32]; }; void pedestrian_write_tilt(int fd, int axis) { char *buffer="01"; int ret; ret=write(fd, buffer+axis, 1); if (ret != 2) { dbg(lvl_debug,"ret=%d\n",ret); } } void pedestrian_read_tilt(int fd, struct navit *nav, struct tilt_data *data) { int val,ret,maxlen=3; ret=read(fd, data->buffer+data->len, maxlen-data->len); if (ret > 0) { data->len+=ret; data->buffer[data->len]='\0'; } if (data->len == 3) { struct attr attr; sscanf(data->buffer,"%02x",&val); data->len=0; if (navit_get_attr(nav, attr_transformation, &attr, NULL)) { struct transformation *trans=attr.u.transformation; dbg(lvl_debug,"ok axis=%d val=0x%x\n", data->axis, val); if (data->axis != 1) { transform_set_pitch(trans, 90+(val-0x80)); } else { transform_set_roll(trans, 0x80-val); } } data->axis=1-data->axis; #if 0 pedestrian_write_tilt(fd, data->axis); #endif } } void pedestrian_write_tilt_timer(int fd, struct tilt_data *data) { pedestrian_write_tilt(fd, data->axis); } void pedestrian_setup_tilt(struct navit *nav) { int fd,on=1; struct termios t; struct callback *cb,*cbt; struct tilt_data *data=g_new0(struct tilt_data, 1); char buffer[32]; fd=open("/dev/tiltsensor",O_RDWR); if (fd == -1) { dbg(lvl_error,"Failed to set up tilt sensor, error %d\n",errno); return; } tcgetattr(fd, &t); cfmakeraw(&t); cfsetspeed(&t, B19200); tcsetattr(fd, TCSANOW, &t); ioctl(fd, FIONBIO, &on); cb=callback_new_3(callback_cast(pedestrian_read_tilt), fd, nav, data); cbt=callback_new_2(callback_cast(pedestrian_write_tilt_timer), fd, data); event_add_watch(fd, event_watch_cond_read, cb); event_add_timeout(300, 1, cbt); read(fd, buffer, 32); #if 0 pedestrian_write_tilt(fd, 0); #endif } #else float sensors[2][3]; static void android_sensors(struct navit *nav, int sensor, float *x, float *y, float *z) { float yaw=0,pitch=0; struct attr attr; sensors[sensor-1][0]=*x; sensors[sensor-1][1]=*y; sensors[sensor-1][2]=*z; if (sensors_locked) return; dbg(lvl_debug,"enter %d %f %f %f\n",sensor,*x,*y,*z); if (sensor == 1) { if (*x > 7.5) orientation=1; /* landscape */ if (*y > 7.5) orientation=0; /* portrait */ if (*z > 7.5) orientation=2; /* flat */ dbg(lvl_debug,"orientation=%d\n",orientation); } if ((orientation_old == 2) != (orientation == 2)) { struct attr attr, flags_graphics, osd_configuration; navit_set_attr(nav, orientation == 2 ? &initial_layout:&main_layout); navit_get_attr(nav, attr_transformation, &attr, NULL); transform_set_scale(attr.u.transformation, orientation == 2 ? 64:16); flags_graphics.type=attr_flags_graphics; flags_graphics.u.num=orientation == 2 ? 0:10; navit_set_attr(nav, &flags_graphics); osd_configuration.type=attr_osd_configuration; osd_configuration.u.num=orientation == 2 ? 1:2; navit_set_attr(nav, &osd_configuration); } orientation_old=orientation; switch (orientation) { case 2: if (sensor == 2) { yaw=atan2f(-*y,-*x)*180/M_PI+180; } pitch=0; break; case 1: if (sensor == 1) { pitch=atan2f(*x,*z)*180/M_PI; } if (sensor == 2) { yaw=atan2f(-*y,*z)*180/M_PI+180; } break; case 0: if (sensor == 1) { pitch=atan2f(*y,*z)*180/M_PI; } if (sensor == 2) { yaw=atan2f(*x,*z)*180/M_PI+180; } break; } if (navit_get_attr(nav, attr_transformation, &attr, NULL)) { struct transformation *trans=attr.u.transformation; if (sensor == 1) { if (orientation != 2) pitch+=2.0; transform_set_pitch(trans, (int)pitch); dbg(lvl_debug,"pich %d %f\n",orientation,pitch); } else { struct attr attr; attr.type=attr_orientation; attr.u.num=yaw-1.0; if (attr.u.num < 0) attr.u.num+=360; pedestrian_data.yaw=attr.u.num; navit_set_attr(nav, &attr); dbg(lvl_debug,"yaw %d %f\n",orientation,yaw); if (orientation == 2) navit_set_center_cursor(nav, 1, 0); } } } #endif static void pedestrian_log(char **logstr) { #ifdef HAVE_API_ANDROID char *tag=g_strdup_printf( "\t\t%f\n" "\t\t%f\n" "\t\t%f\n" "\t\t%f\n" "\t\t%f\n" "\t\t%f\n", sensors[0][0],sensors[0][1],sensors[0][2], sensors[1][0],sensors[1][1],sensors[1][2]); vehicle_log_gpx_add_tag(tag, logstr); #endif } #ifdef DEMO static void vehicle_changed(struct vehicle *v, struct transformation *trans) { struct attr attr; if (vehicle_get_attr(v, attr_position_direction, &attr, NULL)) { int dir=(int)(*attr.u.numd); dbg(lvl_debug,"enter %d\n",dir); transform_set_pitch(trans, 90); transform_set_yaw(trans, dir); } } #endif static void pedestrian_navit_init(struct navit *nav) { struct attr route; struct attr route_map; struct attr map; struct attr mapset; struct attr graphics,attr,flags_graphics; struct transformation *trans; struct attr_iter *iter; #ifdef HAVE_API_ANDROID struct callback *cb; jclass navitsensorsclass; jmethodID cid; jobject navitsensors; dbg(lvl_debug,"enter\n"); if (android_find_class_global("org/navitproject/navit/NavitSensors", &navitsensorsclass)) { dbg(lvl_debug,"class found\n"); cid = (*jnienv)->GetMethodID(jnienv, navitsensorsclass, "", "(Landroid/content/Context;I)V"); dbg(lvl_debug,"cid=%p\n",cid); if (cid) { cb=callback_new_1(callback_cast(android_sensors), nav); navitsensors=(*jnienv)->NewObject(jnienv, navitsensorsclass, cid, android_activity, cb); dbg(lvl_debug,"object=%p\n",navitsensors); if (navitsensors) navitsensors = (*jnienv)->NewGlobalRef(jnienv, navitsensors); } } #endif pedestrian_data.nav=nav; flags_graphics.type=attr_flags_graphics; flags_graphics.u.num=10; navit_set_attr(nav, &flags_graphics); if (navit_get_attr(nav, attr_graphics, &graphics, NULL)) { struct attr attr; struct callback *cb=callback_new_attr_1(callback_cast(pedestrian_graphics_resize),attr_resize,graphics.u.graphics); graphics_add_callback(graphics.u.graphics, cb); cb=callback_new_attr_1(callback_cast(pedestrian_graphics_postdraw),attr_postdraw,graphics.u.graphics); graphics_add_callback(graphics.u.graphics, cb); attr.type=attr_use_camera; attr.u.num=1; graphics_set_attr(graphics.u.graphics, &attr); } osd_rocket_init(nav); #if 1 #ifndef HAVE_API_ANDROID pedestrian_setup_tilt(nav); #endif trans=navit_get_trans(nav); transform_set_pitch(trans, 90); transform_set_roll(trans, 0); transform_set_hog(trans, 2); transform_set_distance(trans, 0); transform_set_scales(trans, 750, 620, 32 << 8); if (!navit_get_attr(nav, attr_route, &route, NULL)) return; if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) return; dbg(lvl_debug,"enter 1\n"); #if 0 struct attr active; active.type=attr_active; active.u.num=0; if (!map_set_attr(route_map.u.map, &active)) return; dbg(lvl_debug,"enter 2\n"); #endif if (!navit_get_attr(nav, attr_mapset, &mapset, NULL)) return; map.type=attr_map; map.u.map=map_new(NULL, (struct attr*[]){ &(struct attr){attr_type,{"route_occluded"}}, &(struct attr){attr_data,{""}}, &(struct attr){attr_description,{"Occluded Route"}}, &(struct attr){attr_navit,{(void *)nav}}, NULL}); global_map=map.u.map; mapset_add_attr(mapset.u.mapset, &map); #if 0 map=route_get_attr(route, attr_map); #endif #endif transform_set_scale(trans, 16); navit_get_attr(nav, attr_layout, &initial_layout, NULL); iter=navit_attr_iter_new(); while(navit_get_attr(nav, attr_layout, &attr, iter)) { if (!strcmp(attr.u.layout->name, "Route")) { dbg(lvl_debug,"found %s\n",attr_to_name(attr.type)); main_layout=attr; #if 1 navit_set_attr(nav, &attr); #endif break; } } navit_attr_iter_destroy(iter); if (navit_get_attr(nav, attr_vehicle, &attr, NULL)) { struct attr cbattr; cbattr.u.callback=callback_new_attr_0(callback_cast(pedestrian_log), attr_log_gpx); cbattr.type=attr_callback; vehicle_add_attr(attr.u.vehicle, &cbattr); #ifdef DEMO cbattr.u.callback=callback_new_attr_2(callback_cast(vehicle_changed), attr_position_coord_geo, attr.u.vehicle, trans); cbattr.type=attr_callback; vehicle_add_attr(attr.u.vehicle, &cbattr); #endif } } static void pedestrian_navit(struct navit *nav, int add) { dbg(lvl_debug,"enter\n"); struct attr callback; if (add) { callback.type=attr_callback; callback.u.callback=callback_new_attr_0(callback_cast(pedestrian_navit_init), attr_navit); navit_add_attr(nav, &callback); } } void plugin_init(void) { struct attr callback,navit; struct attr_iter *iter; #ifdef HAVE_API_ANDROID jclass ActivityClass; jmethodID Activity_setRequestedOrientation; if (!android_find_class_global("android/app/Activity", &ActivityClass)) dbg(lvl_error,"failed to get class android/app/Activity\n"); Activity_setRequestedOrientation = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setRequestedOrientation", "(I)V"); if (Activity_setRequestedOrientation == NULL) dbg(lvl_error,"failed to get method setRequestedOrientation from android/app/Activity\n"); (*jnienv)->CallVoidMethod(jnienv, android_activity, Activity_setRequestedOrientation, 0); #endif plugin_register_osd_type("marker", osd_marker_new); plugin_register_map_type("route_occluded", map_route_occluded_new); callback.type=attr_callback; callback.u.callback=callback_new_attr_0(callback_cast(pedestrian_navit), attr_navit); config_add_attr(config, &callback); iter=config_attr_iter_new(); while (config_get_attr(config, attr_navit, &navit, iter)) pedestrian_navit_init(navit.u.navit); config_attr_iter_destroy(iter); } navit-0.5.0+dfsg.1/navit/plugin_def.h000066400000000000000000000031621264204753600173340ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ struct attr; struct navit; struct callback_list; struct gui; PLUGIN_FUNC1(draw, struct container *, co) PLUGIN_FUNC3(popup, struct container *, map, struct popup *, p, struct popup_item **, list) PLUGIN_TYPE(graphics, (struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)) PLUGIN_TYPE(gui, (struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui)) PLUGIN_TYPE(map, (struct map_methods *meth, struct attr **attrs, struct callback_list *cbl)) PLUGIN_TYPE(osd, (struct navit *nav, struct osd_methods *meth, struct attr **attrs)) PLUGIN_TYPE(speech, (struct speech_methods *meth, struct attr **attrs, struct attr *parent)) PLUGIN_TYPE(vehicle, (struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs)) PLUGIN_TYPE(event, (struct event_methods *meth)) PLUGIN_TYPE(font, (void *meth)) navit-0.5.0+dfsg.1/navit/point.h000066400000000000000000000016241264204753600163520ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_POINT_H #define NAVIT_POINT_H struct point { int x; int y; }; struct point_rect { struct point lu; struct point rl; }; #endif navit-0.5.0+dfsg.1/navit/popup.c000066400000000000000000000304061264204753600163570ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008, 2010 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include "popup.h" #include "debug.h" #include "navit.h" #include "coord.h" #include "gui.h" #include "menu.h" #include "point.h" #include "transform.h" #include "projection.h" #include "item.h" #include "map.h" #include "graphics.h" #include "callback.h" #include "route.h" #include "navit_nls.h" #include "bookmarks.h" #if 0 static void popup_set_no_passing(struct popup_item *item, void *param) { #if 0 struct display_list *l=param; struct segment *seg=(struct segment *)(l->data); struct street_str *str=(struct street_str *)(seg->data[0]); char log[256]; int segid=str->segid; if (segid < 0) segid=-segid; sprintf(log,"Attributes Street 0x%x updated: limit=0x%x(0x%x)", segid, 0x33, str->limit); str->limit=0x33; log_write(log, seg->blk_inf.file, str, sizeof(*str)); #endif } #endif static void popup_traffic_distortion(struct item *item, char *attr) { /* add the configuration directory to the name of the file to use */ char *dist_filename = g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/distortion.txt", NULL); if (dist_filename) /* if we built the filename */ { FILE *map=fopen(dist_filename,"a"); if (map) /* if the file was opened */ { struct coord c; struct map_rect *mr; fprintf(map,"type=traffic_distortion %s\n",attr); mr=map_rect_new(item->map,NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); while (item_coord_get(item, &c, 1)) { fprintf(map,"0x%x 0x%x\n",c.x,c.y); } fclose(map); } else { dbg(lvl_error,"could not open file for distortions !!"); } /* else - if (map) */ g_free(dist_filename); /* free the file name */ } /* if (dist_filename) */ } /* end: popup_traffic_distortion(..) */ static void popup_traffic_distortion_blocked(struct item *item) { dbg(lvl_debug,"item=%p\n",item); popup_traffic_distortion(item, "maxspeed=0"); } static void popup_traffic_distortion_speed(struct item *item, int maxspeed) { char buffer[256]; sprintf(buffer,"maxspeed=%d",maxspeed); popup_traffic_distortion(item,buffer); } static void popup_traffic_distortion_delay(struct item *item, int delay) { char buffer[256]; sprintf(buffer,"delay=%d",delay*600); popup_traffic_distortion(item,buffer); } static void popup_set_destination(struct navit *nav, struct pcoord *pc) { struct coord c; struct coord_geo g; char buffer[1024]; char buffer_geo[1024]; c.x = pc->x; c.y = pc->y; transform_to_geo(transform_get_projection(navit_get_trans(nav)), &c, &g); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer_geo,sizeof(buffer_geo)); sprintf(buffer,"Map Point %s", buffer_geo); navit_set_destination(nav, pc, buffer, 1); } void popup_set_visitbefore(struct navit *nav, struct pcoord *pc,int visitbefore) { struct pcoord *dst; char buffer[1024]; int i, dstcount_new; sprintf(buffer, _("Waypoint %d"), visitbefore+1); dstcount_new=navit_get_destination_count(nav)+1; dst=g_alloca(dstcount_new*sizeof(struct pcoord)); navit_get_destinations(nav,dst,dstcount_new); for (i=dstcount_new-1;i>visitbefore;i--){ dst[i]=dst[i-1]; } dst[visitbefore]=*pc; navit_add_destination_description(nav,pc,buffer); navit_set_destinations(nav, dst, dstcount_new, buffer, 1); } static void popup_set_bookmark(struct navit *nav, struct pcoord *pc) { struct attr attr; struct coord c; struct coord_geo g; char buffer[1024]; char buffer_geo[1024]; c.x = pc->x; c.y = pc->y; transform_to_geo(pc->pro, &c, &g); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer_geo,sizeof(buffer_geo)); sprintf(buffer,"Map Point %s", buffer_geo); if (!gui_add_bookmark(navit_get_gui(nav), pc, buffer)) { navit_get_attr(nav, attr_bookmarks, &attr, NULL); bookmarks_add_bookmark(attr.u.bookmarks, pc, buffer); } } extern void *vehicle; static void popup_set_position(struct navit *nav, struct pcoord *pc) { dbg(lvl_debug,"%p %p\n", nav, pc); navit_set_position(nav, pc); } #if 0 static void popup_break_crossing(struct display_list *l) { struct segment *seg=(struct segment *)(l->data); struct street_str *str=(struct street_str *)(seg->data[0]); char log[256]; int segid=str->segid; if (segid < 0) segid=-segid; sprintf(log,"Coordinates Street 0x%x updated: limit=0x%x(0x%x)", segid, 0x33, str->limit); str->limit=0x33; log_write(log, seg->blk_inf.file, str, sizeof(*str)); } #endif #define popup_printf(menu, type, ...) popup_printf_cb(menu, type, NULL, __VA_ARGS__) static void * popup_printf_cb(void *menu, enum menu_type type, struct callback *cb, const char *fmt, ...) { gchar *str,*us; int usc=0; va_list ap; void *ret; va_start(ap, fmt); str=g_strdup_vprintf(fmt, ap); dbg(lvl_debug,"%s\n", str); us=str; while (*us) { if (*us == '_') usc++; us++; } if (usc) { gchar *str2=g_malloc(strlen(str)+usc+1); gchar *us2=str2; us=str; while (*us) { if (*us == '_') *us2++=*us; *us2++=*us++; } *us2='\0'; g_free(str); str=str2; } ret=menu_add(menu, str, type, cb); va_end(ap); g_free(str); return ret; } static void popup_show_visitbefore(struct navit *nav,struct pcoord *pc, void *menu) { void *menuvisitbefore; char buffer[100]; int i, dstcount; dstcount=navit_get_destination_count(nav); if (dstcount>=1){ menuvisitbefore=popup_printf(menu, menu_type_submenu, _("Visit before...")); for (i=0;itype); char *str; str=attr_to_text(attr, map, 1); popup_printf(menu, menu_type_menu, "%s: %s", attr_name, str); g_free(str); } #if 0 static void popup_show_attr(void *menu, struct item *item, enum attr_type attr_type) { struct attr attr; memset(&attr, 0, sizeof(attr)); attr.type=attr_type; if (item_attr_get(item, attr_type, &attr)) popup_show_attr_val(menu, &attr); } #endif static void popup_show_attrs(struct map *map, void *menu, struct item *item) { #if 0 popup_show_attr(menu, item, attr_debug); popup_show_attr(menu, item, attr_address); popup_show_attr(menu, item, attr_phone); popup_show_attr(menu, item, attr_phone); popup_show_attr(menu, item, attr_entry_fee); popup_show_attr(menu, item, attr_open_hours); #else struct attr attr; for (;;) { memset(&attr, 0, sizeof(attr)); if (item_attr_get(item, attr_any, &attr)) popup_show_attr_val(map, menu, &attr); else break; } #endif } static void popup_item_dump(struct item *item) { struct map_rect *mr; mr=map_rect_new(item->map,NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); dbg(lvl_debug,"item=%p\n",item); item_dump_filedesc(item,item->map,stdout); map_rect_destroy(mr); } static void popup_show_item(struct navit *nav, void *popup, struct displayitem *di) { struct map_rect *mr; void *menu, *menu_item, *menu_dist; char *label; struct item *item,*diitem; int count; label=graphics_displayitem_get_label(di); diitem=graphics_displayitem_get_item(di); count=graphics_displayitem_get_coord_count(di); dbg_assert(diitem); if (label) menu=popup_printf(popup, menu_type_submenu, "%s '%s' (%d coords)", item_to_name(diitem->type), label, count); else menu=popup_printf(popup, menu_type_submenu, "%s (%d coords)", item_to_name(diitem->type), count); menu_item=popup_printf(menu, menu_type_submenu, "Item"); popup_printf(menu_item, menu_type_menu, "type: 0x%x", diitem->type); popup_printf(menu_item, menu_type_menu, "id: 0x%x 0x%x", diitem->id_hi, diitem->id_lo); if (diitem->map) { struct attr type,data; if (!map_get_attr(diitem->map, attr_type, &type, NULL)) type.u.str=""; if (!map_get_attr(diitem->map, attr_data, &data, NULL)) data.u.str=""; popup_printf(menu_item, menu_type_menu, "map: %s:%s", type.u.str, data.u.str); } if (diitem->map) { mr=map_rect_new(diitem->map,NULL); item=map_rect_get_item_byid(mr, diitem->id_hi, diitem->id_lo); dbg(lvl_debug,"item=%p\n", item); if (item) { popup_show_attrs(item->map, menu_item, item); popup_printf_cb(menu_item, menu_type_menu, callback_new_1(callback_cast(popup_item_dump), diitem), "Dump"); if (item->type < type_line) { struct coord co; struct pcoord *c; if (item_coord_get(item, &co, 1)) { c=g_new(struct pcoord, 1); c->pro = transform_get_projection(navit_get_trans(nav)); c->x = co.x; c->y = co.y; popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_position), nav, c), _("Set as position")); popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_destination), nav, c), _("Set as destination")); popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_bookmark), nav, c), _("Add as bookmark")); } } } map_rect_destroy(mr); } else { popup_printf(menu, menu_type_menu, "(No map)"); } if (item_get_default_flags(diitem->type)) { int speeds[]={5,10,20,30,40,50,60,70,80,90,100}; int delays[]={1,2,3,5,10,15,20,30,45,60,75,90,120,150,180,240,300}; int i; menu_dist=popup_printf(menu, menu_type_submenu, "Traffic distortion"); popup_printf_cb(menu_dist, menu_type_menu, callback_new_1(callback_cast(popup_traffic_distortion_blocked), diitem), "Blocked"); menu_item=popup_printf(menu_dist, menu_type_submenu,"Max speed"); for (i = 0 ; i < sizeof(speeds)/sizeof(int); i++) { popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_speed), diitem, speeds[i]), "%d km/h",speeds[i]); } menu_item=popup_printf(menu_dist, menu_type_submenu,"Delay"); for (i = 0 ; i < sizeof(delays)/sizeof(int); i++) { popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_delay), diitem, delays[i]*600), "%d min",delays[i]); } } } static void popup_display(struct navit *nav, void *popup, struct point *p) { struct displaylist_handle *dlh; struct displaylist *display; struct displayitem *di; display=navit_get_displaylist(nav); dlh=graphics_displaylist_open(display); while ((di=graphics_displaylist_next(dlh))) { if (graphics_displayitem_within_dist(display, di, p, 5)) { popup_show_item(nav, popup, di); } } graphics_displaylist_close(dlh); } static struct pcoord c; void popup(struct navit *nav, int button, struct point *p) { void *popup,*men; char buffer[1024]; struct coord_geo g; struct coord co; popup=gui_popup_new(navit_get_gui(nav)); if (! popup) return; transform_reverse(navit_get_trans(nav), p, &co); men=popup_printf(popup, menu_type_submenu, _("Point 0x%x 0x%x"), co.x, co.y); popup_printf(men, menu_type_menu, _("Screen coord : %d %d"), p->x, p->y); transform_to_geo(transform_get_projection(navit_get_trans(nav)), &co, &g); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); popup_printf(men, menu_type_menu, "%s", buffer); popup_printf(men, menu_type_menu, "%f %f", g.lat, g.lng); dbg(lvl_debug,"%p %p\n", nav, &c); c.pro = transform_get_projection(navit_get_trans(nav)); c.x = co.x; c.y = co.y; popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_position), nav, &c), _("Set as position")); popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_destination), nav, &c), _("Set as destination")); popup_show_visitbefore(nav,&c,men); popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_bookmark), nav, &c), _("Add as bookmark")); popup_display(nav, popup, p); menu_popup(popup); } navit-0.5.0+dfsg.1/navit/popup.h000066400000000000000000000017601264204753600163650ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_POPUP_H #define NAVIT_POPUP_H struct navit; struct point; struct pcoord; void popup(struct navit *nav, int button, struct point *p); void popup_set_visitbefore(struct navit *nav, struct pcoord *pc, int visitbefore); #endif navit-0.5.0+dfsg.1/navit/profile.c000066400000000000000000000060301264204753600166500ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #ifndef _MSC_VER #include #endif /* _MSC_VER */ #include "profile.h" #include "debug.h" #define PROFILE_LEVEL_MAX 9 /** * @brief Log timing information. * * @note Normally this function is called via the macro 'profile', which automatically fills in * parameters 'module' and 'function'. * * Successive calls to this function will print the elapsed time between calls, using an * internal timer. To start/reset the internal timer without printing a message, set parameter * 'fmt' to NULL. * * To run multiple timers in parallel, the parameter 'level' can be used. Each invocation will * print the elapsed time to the last invocation with the same level. As an exception, calling * with 'fmt'=NULL wll reset all timers with a level greater or equal to the level parameter. * * Typically, profiling is started by calling profile(0, NULL). Then calls with various levels * can be used to print different intermediate timings. * * @param level level of timer to use (0 to PROFILE_LEVEL_MAX). * @param module name of current module (for logging) * @param function name of current function (for logging) * @param fmt format string Log message to print (as a printf format string), followed by required * parameters as varargs. May be NULL; then no message is printed, and all timers with the * same or higher level are reset. */ void profile_timer(int level, const char *module, const char *function, const char *fmt, ...) { #ifndef _MSC_VER va_list ap; static struct timeval last[PROFILE_LEVEL_MAX+1]; struct timeval curr; double msec; char buffer[strlen(module)+20]; if (level < 0) level=0; if (level > PROFILE_LEVEL_MAX) level=PROFILE_LEVEL_MAX; if (fmt) { gettimeofday(&curr, NULL); msec=(curr.tv_usec-last[level].tv_usec)/((double)1000)+ (curr.tv_sec-last[level].tv_sec)*1000; sprintf(buffer, "profile:%s", module); va_start(ap, fmt); debug_vprintf(lvl_debug, buffer, strlen(buffer), function, strlen(function), 1, fmt, ap); va_end(ap); debug_printf(lvl_debug, buffer, strlen(buffer), function, strlen(function), 0, " %7.1f ms\n", msec); gettimeofday(&last[level], NULL); } else { gettimeofday(&curr, NULL); while (level <= PROFILE_LEVEL_MAX) last[level++]=curr; } #endif /*_MSC_VER*/ } navit-0.5.0+dfsg.1/navit/profile.h000066400000000000000000000025201264204753600166550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PROFILE_H #define NAVIT_PROFILE_H #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #define __PRETTY_FUNCTION__ __FUNCTION__ #endif #define profile_str2(x) #x #define profile_str1(x) profile_str2(x) #define profile_module profile_str1(MODULE) /* * Macro for logging timing information. * See function profile_timer for more information. */ #define profile(level,...) profile_timer(level,profile_module,__PRETTY_FUNCTION__,__VA_ARGS__) void profile_timer(int level, const char *module, const char *function, const char *fmt, ...); #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/profile_option.c000066400000000000000000000035131264204753600202430ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2012 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terpo of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "debug.h" #include "xmlconfig.h" struct profile_option { NAVIT_OBJECT }; static struct profile_option * profile_option_new(struct attr *parent, struct attr **attrs) { struct profile_option *po=g_new0(struct profile_option, 1); po->func=&profile_option_func; navit_object_ref((struct navit_object *)po); po->attrs=attr_list_dup(attrs); dbg(lvl_debug,"return %p\n",po); return po; } static void profile_option_destroy(struct profile_option *po) { attr_list_free(po->attrs); g_free(po); } struct object_func profile_option_func = { attr_profile_option, (object_func_new)profile_option_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navit_object_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)profile_option_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/projection.c000066400000000000000000000057511264204753600173750ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "coord.h" #include "debug.h" #include "projection.h" struct projection_name { enum projection projection; char *name; }; struct projection_name projection_names[]={ {projection_none, ""}, {projection_mg, "mg"}, {projection_garmin, "garmin"}, {projection_utm, "utm"}, }; static int utmref_letter(char l) { if (l < 'a' || l == 'i' || l == 'o') return -1; if (l < 'i') return l-'a'; if (l < 'o') return l-'a'-1; if (l <= 'z') return l-'a'-2; return -1; } /** * Look up a projection by name. * * @param name name of projection to look up (values from projection_names, and UTM projections) * @utm_offset Only for UTM projections: Used to return the offset for the UTM projection * @returns projection, or projection_none if no projection could be determined */ enum projection projection_from_name(const char *name, struct coord *utm_offset) { int i; int zone,baserow; char ns,zone_field,square_x,square_y; for (i=0 ; i < sizeof(projection_names)/sizeof(struct projection_name) ; i++) { if (! strcmp(projection_names[i].name, name)) return projection_names[i].projection; } if (utm_offset) { if (sscanf(name,"utm%d%c",&zone,&ns) == 2 && zone > 0 && zone <= 60 && (ns == 'n' || ns == 's')) { utm_offset->x=zone*1000000; utm_offset->y=(ns == 's' ? -10000000:0); return projection_utm; } if (sscanf(name,"utmref%d%c%c%c",&zone,&zone_field,&square_x,&square_y)) { i=utmref_letter(zone_field); if (i < 2 || i > 21) { dbg(lvl_error,"invalid zone field '%c' in '%s'\n",zone_field,name); return projection_none; } i-=12; dbg(lvl_debug,"zone_field %d\n",i); baserow=i*887.6/100; utm_offset->x=zone*1000000; i=utmref_letter(square_x); utm_offset->x+=((i%8)+1)*100000; i=utmref_letter(square_y); dbg(lvl_debug,"baserow %d\n",baserow); if (!(zone % 2)) i-=5; dbg(lvl_debug,"i=%d\n",i); i=(i-baserow+100)%20+baserow; utm_offset->y=i*100000; return projection_utm; } } return projection_none; } char * projection_to_name(enum projection proj) { int i; for (i=0 ; i < sizeof(projection_names)/sizeof(struct projection_name) ; i++) { if (projection_names[i].projection == proj) return projection_names[i].name; } return NULL; } navit-0.5.0+dfsg.1/navit/projection.h000066400000000000000000000024321264204753600173730ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_PROJECTION_H #define NAVIT_PROJECTION_H enum projection { projection_none, /*!< No projection or unknown projection */ projection_mg, /*!< Mercator projection */ projection_garmin, /*!< Garmin projection */ projection_screen, /*!< Screen projection */ projection_utm /*!< UTM projection */ }; enum map_datum { map_datum_none, map_datum_wgs84, map_datum_dhdn }; struct coord; enum projection projection_from_name(const char *name, struct coord *offset); char * projection_to_name(enum projection proj); #endif navit-0.5.0+dfsg.1/navit/roadprofile.c000066400000000000000000000063321264204753600175230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "roadprofile.h" static void roadprofile_set_attr_do(struct roadprofile *this, struct attr *attr) { switch (attr->type) { case attr_speed: this->speed=attr->u.num; break; case attr_maxspeed: this->maxspeed=attr->u.num; break; case attr_route_weight: this->route_weight=attr->u.num; break; default: break; } } struct roadprofile * roadprofile_new(struct attr *parent, struct attr **attrs) { struct roadprofile *this_; struct attr **attr; this_=g_new0(struct roadprofile, 1); this_->func=&roadprofile_func; navit_object_ref((struct navit_object *)this_); this_->attrs=attr_list_dup(attrs); for (attr=attrs;*attr; attr++) roadprofile_set_attr_do(this_, *attr); return this_; } int roadprofile_get_attr(struct roadprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int roadprofile_set_attr(struct roadprofile *this_, struct attr *attr) { roadprofile_set_attr_do(this_, attr); this_->attrs=attr_generic_set_attr(this_->attrs, attr); return 1; } int roadprofile_add_attr(struct roadprofile *this_, struct attr *attr) { this_->attrs=attr_generic_add_attr(this_->attrs, attr); return 1; } int roadprofile_remove_attr(struct roadprofile *this_, struct attr *attr) { this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; } struct attr_iter * roadprofile_attr_iter_new(void) { return (struct attr_iter *)g_new0(void *,1); } void roadprofile_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } static struct roadprofile * roadprofile_dup(struct roadprofile *this_) { struct roadprofile *ret=g_new(struct roadprofile, 1); *ret=*this_; ret->refcount=1; ret->attrs=attr_list_dup(this_->attrs); return ret; } static void roadprofile_destroy(struct roadprofile *this_) { attr_list_free(this_->attrs); g_free(this_); } struct object_func roadprofile_func = { attr_roadprofile, (object_func_new)roadprofile_new, (object_func_get_attr)roadprofile_get_attr, (object_func_iter_new)roadprofile_attr_iter_new, (object_func_iter_destroy)roadprofile_attr_iter_destroy, (object_func_set_attr)roadprofile_set_attr, (object_func_add_attr)roadprofile_add_attr, (object_func_remove_attr)roadprofile_remove_attr, (object_func_init)NULL, (object_func_destroy)roadprofile_destroy, (object_func_dup)roadprofile_dup, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/roadprofile.h000066400000000000000000000026401264204753600175260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef __cplusplus extern "C" { #endif struct roadprofile { NAVIT_OBJECT int speed; int route_weight; int maxspeed; }; struct roadprofile * roadprofile_new(struct attr *parent, struct attr **attrs); int roadprofile_get_attr(struct roadprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int roadprofile_set_attr(struct roadprofile *this_, struct attr *attr); int roadprofile_add_attr(struct roadprofile *this_, struct attr *attr); int roadprofile_remove_attr(struct roadprofile *this_, struct attr *attr); struct attr_iter *roadprofile_attr_iter_new(void); void roadprofile_attr_iter_destroy(struct attr_iter *iter); #ifdef __cplusplus } #endif navit-0.5.0+dfsg.1/navit/route.c000066400000000000000000003561461264204753600163660ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * @brief Contains code related to finding a route from a position to a destination * * Routing uses segments, points and items. Items are items from the map: Streets, highways, etc. * Segments represent such items, or parts of it. Generally, a segment is a driveable path. An item * can be represented by more than one segment - in that case it is "segmented". Each segment has an * "offset" associated, that indicates at which position in a segmented item this segment is - a * segment representing a not-segmented item always has the offset 1. * A point is located at the end of segments, often connecting several segments. * * The code in this file will make navit find a route between a position and a destination. * It accomplishes this by first building a "route graph". This graph contains segments and * points. * * After building this graph in route_graph_build(), the function route_graph_flood() assigns every * point and segment a "value" which represents the "costs" of traveling from this point to the * destination. This is done by Dijkstra's algorithm. * * When the graph is built a "route path" is created, which is a path in this graph from a given * position to the destination determined at time of building the graph. */ #include #include #include #include #if 0 #include #include #include #endif #include "navit_nls.h" #include "glib_slice.h" #include "config.h" #include "point.h" #include "graphics.h" #include "profile.h" #include "coord.h" #include "projection.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "mapset.h" #include "route.h" #include "track.h" #include "transform.h" #include "plugin.h" #include "fib.h" #include "event.h" #include "callback.h" #include "vehicle.h" #include "vehicleprofile.h" #include "roadprofile.h" #include "debug.h" struct map_priv { struct route *route; }; int debug_route=0; /** * @brief A point in the route graph * * This represents a point in the route graph. A point usually connects two or more segments, * but there are also points which don't do that (e.g. at the end of a dead-end). */ struct route_graph_point { struct route_graph_point *hash_next; /**< Pointer to a chained hashlist of all route_graph_points with this hash */ struct route_graph_segment *start; /**< Pointer to a list of segments of which this point is the start. The links * of this linked-list are in route_graph_segment->start_next.*/ struct route_graph_segment *end; /**< Pointer to a list of segments of which this pointer is the end. The links * of this linked-list are in route_graph_segment->end_next. */ struct route_graph_segment *seg; /**< Pointer to the segment one should use to reach the destination at * least costs */ struct fibheap_el *el; /**< When this point is put on a Fibonacci heap, this is a pointer * to this point's heap-element */ int value; /**< The cost at which one can reach the destination from this point on */ struct coord c; /**< Coordinates of this point */ int flags; /**< Flags for this point (eg traffic distortion) */ }; #define RP_TRAFFIC_DISTORTION 1 #define RP_TURN_RESTRICTION 2 #define RP_TURN_RESTRICTION_RESOLVED 4 /** * @brief A segment in the route graph or path * * This is a segment in the route graph or path. A segment represents a driveable way. */ struct route_segment_data { struct item item; /**< The item (e.g. street) that this segment represents. */ int flags; int len; /**< Length of this segment */ /*NOTE: After a segment, various fields may follow, depending on what flags are set. Order of fields: 1.) maxspeed Maximum allowed speed on this segment. Present if AF_SPEED_LIMIT is set. 2.) offset If the item is segmented (i.e. represented by more than one segment), this indicates the position of this segment in the item. Present if AF_SEGMENTED is set. */ }; struct size_weight_limit { int width; int length; int height; int weight; int axle_weight; }; #define RSD_OFFSET(x) *((int *)route_segment_data_field_pos((x), attr_offset)) #define RSD_MAXSPEED(x) *((int *)route_segment_data_field_pos((x), attr_maxspeed)) #define RSD_SIZE_WEIGHT(x) *((struct size_weight_limit *)route_segment_data_field_pos((x), attr_vehicle_width)) #define RSD_DANGEROUS_GOODS(x) *((int *)route_segment_data_field_pos((x), attr_vehicle_dangerous_goods)) struct route_graph_segment_data { struct item *item; int offset; int flags; int len; int maxspeed; struct size_weight_limit size_weight; int dangerous_goods; }; /** * @brief A segment in the route graph * * This is a segment in the route graph. A segment represents a driveable way. */ struct route_graph_segment { struct route_graph_segment *next; /**< Linked-list pointer to a list of all route_graph_segments */ struct route_graph_segment *start_next; /**< Pointer to the next element in the list of segments that start at the * same point. Start of this list is in route_graph_point->start. */ struct route_graph_segment *end_next; /**< Pointer to the next element in the list of segments that end at the * same point. Start of this list is in route_graph_point->end. */ struct route_graph_point *start; /**< Pointer to the point this segment starts at. */ struct route_graph_point *end; /**< Pointer to the point this segment ends at. */ struct route_segment_data data; /**< The segment data */ }; /** * @brief A traffic distortion * * Traffic distortions represent delays or closures on the route, which can occur for a variety of * reasons such as roadworks, accidents or heavy traffic. They are also used internally by Navit to * avoid using a particular segment. * * A traffic distortion can limit the speed on a segment, or introduce a delay. If both are given, * at the same time, they are cumulative. */ struct route_traffic_distortion { int maxspeed; /**< Maximum speed possible in km/h. Use {@code INT_MAX} to leave the speed unchanged, or 0 to mark the segment as impassable. */ int delay; /**< Delay in tenths of seconds (0 for no delay) */ }; /** * @brief A segment in the route path * * This is a segment in the route path. */ struct route_path_segment { struct route_path_segment *next; /**< Pointer to the next segment in the path */ struct route_segment_data *data; /**< The segment data */ int direction; /**< Order in which the coordinates are ordered. >0 means "First * coordinate of the segment is the first coordinate of the item", <=0 * means reverse. */ unsigned ncoords; /**< How many coordinates does this segment have? */ struct coord c[0]; /**< Pointer to the ncoords coordinates of this segment */ /* WARNING: There will be coordinates following here, so do not create new fields after c! */ }; /** * @brief Usually represents a destination or position * * This struct usually represents a destination or position */ struct route_info { struct coord c; /**< The actual destination / position */ struct coord lp; /**< The nearest point on a street to c */ int pos; /**< The position of lp within the coords of the street */ int lenpos; /**< Distance between lp and the end of the street */ int lenneg; /**< Distance between lp and the start of the street */ int lenextra; /**< Distance between lp and c */ int percent; /**< ratio of lenneg to lenght of whole street in percent */ struct street_data *street; /**< The street lp is on */ int street_direction; /**< Direction of vehicle on street -1 = Negative direction, 1 = Positive direction, 0 = Unknown */ int dir; /**< Direction to take when following the route -1 = Negative direction, 1 = Positive direction */ }; /** * @brief A complete route path * * This structure describes a whole routing path */ struct route_path { int in_use; /**< The path is in use and can not be updated */ int update_required; /**< The path needs to be updated after it is no longer in use */ int updated; /**< The path has only been updated */ int path_time; /**< Time to pass the path */ int path_len; /**< Length of the path */ struct route_path_segment *path; /**< The first segment in the path, i.e. the segment one should * drive in next */ struct route_path_segment *path_last; /**< The last segment in the path */ /* XXX: path_hash is not necessery now */ struct item_hash *path_hash; /**< A hashtable of all the items represented by this route's segements */ struct route_path *next; /**< Next route path in case of intermediate destinations */ }; /** * @brief A complete route * * This struct holds all information about a route. */ struct route { NAVIT_OBJECT struct mapset *ms; /**< The mapset this route is built upon */ enum route_path_flags flags; struct route_info *pos; /**< Current position within this route */ GList *destinations; /**< Destinations of the route */ int reached_destinations_count; /**< Used as base to calculate waypoint numbers */ struct route_info *current_dst; /**< Current destination */ struct route_graph *graph; /**< Pointer to the route graph */ struct route_path *path2; /**< Pointer to the route path */ struct map *map; struct map *graph_map; struct callback * route_graph_done_cb ; /**< Callback when route graph is done */ struct callback * route_graph_flood_done_cb ; /**< Callback when route graph flooding is done */ struct callback_list *cbl2; /**< Callback list to call when route changes */ int destination_distance; /**< Distance to the destination at which the destination is considered "reached" */ struct vehicleprofile *vehicleprofile; /**< Routing preferences */ int route_status; /**< Route Status */ int link_path; /**< Link paths over multiple waypoints together */ struct pcoord pc; struct vehicle *v; }; /** * @brief A complete route graph * * This structure describes a whole routing graph */ struct route_graph { int busy; /**< The graph is being built */ struct map_selection *sel; /**< The rectangle selection for the graph */ struct mapset_handle *h; /**< Handle to the mapset */ struct map *m; /**< Pointer to the currently active map */ struct map_rect *mr; /**< Pointer to the currently active map rectangle */ struct vehicleprofile *vehicleprofile; /**< The vehicle profile */ struct callback *idle_cb; /**< Idle callback to process the graph */ struct callback *done_cb; /**< Callback when graph is done */ struct event_idle *idle_ev; /**< The pointer to the idle event */ struct route_graph_segment *route_segments; /**< Pointer to the first route_graph_segment in the linked list of all segments */ struct route_graph_segment *avoid_seg; #define HASH_SIZE 8192 struct route_graph_point *hash[HASH_SIZE]; /**< A hashtable containing all route_graph_points in this graph */ }; #define HASHCOORD(c) ((((c)->x +(c)->y) * 2654435761UL) & (HASH_SIZE-1)) /** * @brief Iterator to iterate through all route graph segments in a route graph point * * This structure can be used to iterate through all route graph segments connected to a * route graph point. Use this with the rp_iterator_* functions. */ struct route_graph_point_iterator { struct route_graph_point *p; /**< The route graph point whose segments should be iterated */ int end; /**< Indicates if we have finished iterating through the "start" segments */ struct route_graph_segment *next; /**< The next segment to be returned */ }; struct attr_iter { union { GList *list; } u; }; static struct route_info * route_find_nearest_street(struct vehicleprofile *vehicleprofile, struct mapset *ms, struct pcoord *c); static struct route_graph_point *route_graph_get_point(struct route_graph *this, struct coord *c); static void route_graph_update(struct route *this, struct callback *cb, int async); static void route_graph_build_done(struct route_graph *rg, int cancel); static struct route_path *route_path_new(struct route_graph *this, struct route_path *oldpath, struct route_info *pos, struct route_info *dst, struct vehicleprofile *profile); static void route_process_street_graph(struct route_graph *this, struct item *item, struct vehicleprofile *profile); static void route_graph_destroy(struct route_graph *this); static void route_path_update(struct route *this, int cancel, int async); static int route_time_seg(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist); static void route_graph_flood(struct route_graph *this, struct route_info *dst, struct vehicleprofile *profile, struct callback *cb); static void route_graph_reset(struct route_graph *this); /** * @brief Returns the projection used for this route * * @param route The route to return the projection for * @return The projection used for this route */ static enum projection route_projection(struct route *route) { struct street_data *street; struct route_info *dst=route_get_dst(route); if (!route->pos && !dst) return projection_none; street = route->pos ? route->pos->street : dst->street; if (!street || !street->item.map) return projection_none; return map_projection(street->item.map); } /** * @brief Creates a new graph point iterator * * This function creates a new route graph point iterator, that can be used to * iterate through all segments connected to the point. * * @param p The route graph point to create the iterator from * @return A new iterator. */ static struct route_graph_point_iterator rp_iterator_new(struct route_graph_point *p) { struct route_graph_point_iterator it; it.p = p; if (p->start) { it.next = p->start; it.end = 0; } else { it.next = p->end; it.end = 1; } return it; } /** * @brief Gets the next segment connected to a route graph point from an iterator * * @param it The route graph point iterator to get the segment from * @return The next segment or NULL if there are no more segments */ static struct route_graph_segment *rp_iterator_next(struct route_graph_point_iterator *it) { struct route_graph_segment *ret; ret = it->next; if (!ret) { return NULL; } if (!it->end) { if (ret->start_next) { it->next = ret->start_next; } else { it->next = it->p->end; it->end = 1; } } else { it->next = ret->end_next; } return ret; } /** * @brief Checks if the last segment returned from a route_graph_point_iterator comes from the end * * @param it The route graph point iterator to be checked * @return 1 if the last segment returned comes from the end of the route graph point, 0 otherwise */ static int rp_iterator_end(struct route_graph_point_iterator *it) { if (it->end && (it->next != it->p->end)) { return 1; } else { return 0; } } static void route_path_get_distances(struct route_path *path, struct coord *c, int count, int *distances) { int i; for (i = 0 ; i < count ; i++) distances[i]=INT_MAX; while (path) { struct route_path_segment *seg=path->path; while (seg) { for (i = 0 ; i < count ; i++) { int dist=transform_distance_polyline_sq(seg->c, seg->ncoords, &c[i], NULL, NULL); if (dist < distances[i]) distances[i]=dist; } seg=seg->next; } path=path->next; } for (i = 0 ; i < count ; i++) { if (distances[i] != INT_MAX) distances[i]=sqrt(distances[i]); } } void route_get_distances(struct route *this, struct coord *c, int count, int *distances) { return route_path_get_distances(this->path2, c, count, distances); } /** * @brief Destroys a route_path * * @param this The route_path to be destroyed */ static void route_path_destroy(struct route_path *this, int recurse) { struct route_path_segment *c,*n; struct route_path *next; while (this) { next=this->next; if (this->path_hash) { item_hash_destroy(this->path_hash); this->path_hash=NULL; } c=this->path; while (c) { n=c->next; g_free(c); c=n; } this->in_use--; if (!this->in_use) g_free(this); if (!recurse) break; this=next; } } /** * @brief Creates a completely new route structure * * @param attrs Not used * @return The newly created route */ struct route * route_new(struct attr *parent, struct attr **attrs) { struct route *this=g_new0(struct route, 1); struct attr dest_attr; this->func=&route_func; navit_object_ref((struct navit_object *)this); if (attr_generic_get_attr(attrs, NULL, attr_destination_distance, &dest_attr, NULL)) { this->destination_distance = dest_attr.u.num; } else { this->destination_distance = 50; // Default value } this->cbl2=callback_list_new(); return this; } /** * @brief Duplicates a route object * * @return The duplicated route */ struct route * route_dup(struct route *orig) { struct route *this=g_new0(struct route, 1); this->func=&route_func; navit_object_ref((struct navit_object *)this); this->cbl2=callback_list_new(); this->destination_distance=orig->destination_distance; this->ms=orig->ms; this->flags=orig->flags; this->vehicleprofile=orig->vehicleprofile; return this; } /** * @brief Checks if a segment is part of a roundabout * * This function checks if a segment is part of a roundabout. * * @param seg The segment to be checked * @param level How deep to scan the route graph * @param direction Set this to 1 if we're entering the segment through its end, to 0 otherwise * @param origin Used internally, set to NULL * @return 1 If a roundabout was detected, 0 otherwise */ static int route_check_roundabout(struct route_graph_segment *seg, int level, int direction, struct route_graph_segment *origin) { struct route_graph_point_iterator it,it2; struct route_graph_segment *cur; int count=0; if (!level) { return 0; } if (!direction && !(seg->data.flags & AF_ONEWAY)) { return 0; } if (direction && !(seg->data.flags & AF_ONEWAYREV)) { return 0; } if (seg->data.flags & AF_ROUNDABOUT_VALID) return 0; if (!origin) { origin = seg; } if (!direction) { it = rp_iterator_new(seg->end); } else { it = rp_iterator_new(seg->start); } it2=it; while ((cur = rp_iterator_next(&it2))) count++; if (count > 3) return 0; cur = rp_iterator_next(&it); while (cur) { if (cur == seg) { cur = rp_iterator_next(&it); continue; } if (cur->data.item.type != origin->data.item.type) { // This street is of another type, can't be part of the roundabout cur = rp_iterator_next(&it); continue; } if (cur == origin) { seg->data.flags |= AF_ROUNDABOUT; return 1; } if (route_check_roundabout(cur, (level-1), rp_iterator_end(&it), origin)) { seg->data.flags |= AF_ROUNDABOUT; return 1; } cur = rp_iterator_next(&it); } return 0; } /** * @brief Sets the mapset of the route passwd * * @param this The route to set the mapset for * @param ms The mapset to set for this route */ void route_set_mapset(struct route *this, struct mapset *ms) { this->ms=ms; } /** * @brief Sets the vehicle profile of a route * * @param this The route to set the profile for * @param prof The vehicle profile */ void route_set_profile(struct route *this, struct vehicleprofile *prof) { if (this->vehicleprofile != prof) { int dest_count = g_list_length(this->destinations); struct pcoord *pc; this->vehicleprofile = prof; pc = g_alloca(dest_count*sizeof(struct pcoord)); route_get_destinations(this, pc, dest_count); route_set_destinations(this, pc, dest_count, 1); } } /** * @brief Returns the mapset of the route passed * * @param this The route to get the mapset of * @return The mapset of the route passed */ struct mapset * route_get_mapset(struct route *this) { return this->ms; } /** * @brief Returns the current position within the route passed * * @param this The route to get the position for * @return The position within the route passed */ struct route_info * route_get_pos(struct route *this) { return this->pos; } /** * @brief Returns the destination of the route passed * * @param this The route to get the destination for * @return The destination of the route passed */ struct route_info * route_get_dst(struct route *this) { struct route_info *dst=NULL; if (this->destinations) dst=g_list_last(this->destinations)->data; return dst; } /** * @brief Checks if the path is calculated for the route passed * * @param this The route to check * @return True if the path is calculated, false if not */ int route_get_path_set(struct route *this) { return this->path2 != NULL; } /** * @brief Checks if the route passed contains a certain item within the route path * * This function checks if a certain items exists in the path that navit will guide * the user to his destination. It does *not* check if this item exists in the route * graph! * * @param this The route to check for this item * @param item The item to search for * @return True if the item was found, false if the item was not found or the route was not calculated */ int route_contains(struct route *this, struct item *item) { if (! this->path2 || !this->path2->path_hash) return 0; if (item_hash_lookup(this->path2->path_hash, item)) return 1; if (! this->pos || !this->pos->street) return 0; return item_is_equal(this->pos->street->item, *item); } static struct route_info * route_next_destination(struct route *this) { if (!this->destinations) return NULL; return this->destinations->data; } /** * @brief Checks if a route has reached its destination * * @param this The route to be checked * @return True if the destination is "reached", false otherwise. */ int route_destination_reached(struct route *this) { struct street_data *sd = NULL; enum projection pro; struct route_info *dst=route_next_destination(this); if (!this->pos) return 0; if (!dst) return 0; sd = this->pos->street; if (!this->path2) { return 0; } if (!item_is_equal(this->pos->street->item, dst->street->item)) { return 0; } if ((sd->flags & AF_ONEWAY) && (this->pos->lenneg >= dst->lenneg)) { // We would have to drive against the one-way road return 0; } if ((sd->flags & AF_ONEWAYREV) && (this->pos->lenpos >= dst->lenpos)) { return 0; } pro=route_projection(this); if (pro == projection_none) return 0; if (transform_distance(pro, &this->pos->c, &dst->lp) > this->destination_distance) { return 0; } if (g_list_next(this->destinations)) return 1; else return 2; } /** * @brief Returns the position from which to route to the current destination of the route. * * This function examines the destination list of the route. If present, it returns the destination * which precedes the one indicated by the {@code current_dst} member of the route. Failing that, * the current position of the route is returned. * * @param this The route object * @return The previous destination or current position, see description */ static struct route_info * route_previous_destination(struct route *this) { GList *l=g_list_find(this->destinations, this->current_dst); if (!l) return this->pos; l=g_list_previous(l); if (!l) return this->pos; return l->data; } /** * @brief Updates or recreates the route graph. * * This function is called after the route graph has been changed or rebuilt and flooding has * completed. It then updates the route path to reflect these changes. * * If multiple destinations are set, this function will reset and re-flood the route graph for each * destination, thus recursively calling itself for each destination. * * @param this The route object * @param new_graph FIXME Whether the route graph has been rebuilt from scratch */ /* FIXME Should we rename this function to route_graph_flood_done, in order to avoid confusion? */ static void route_path_update_done(struct route *this, int new_graph) { struct route_path *oldpath=this->path2; struct attr route_status; struct route_info *prev_dst; /* previous destination or current position */ route_status.type=attr_route_status; if (this->path2 && (this->path2->in_use>1)) { this->path2->update_required=1+new_graph; return; } route_status.u.num=route_status_building_path; route_set_attr(this, &route_status); prev_dst=route_previous_destination(this); if (this->link_path) { this->path2=route_path_new(this->graph, NULL, prev_dst, this->current_dst, this->vehicleprofile); if (this->path2) this->path2->next=oldpath; else route_path_destroy(oldpath,0); } else { this->path2=route_path_new(this->graph, oldpath, prev_dst, this->current_dst, this->vehicleprofile); if (oldpath && this->path2) { this->path2->next=oldpath->next; route_path_destroy(oldpath,0); } } if (this->path2) { struct route_path_segment *seg=this->path2->path; int path_time=0,path_len=0; while (seg) { /* FIXME */ int seg_time=route_time_seg(this->vehicleprofile, seg->data, NULL); if (seg_time == INT_MAX) { dbg(lvl_debug,"error\n"); } else path_time+=seg_time; path_len+=seg->data->len; seg=seg->next; } this->path2->path_time=path_time; this->path2->path_len=path_len; if (prev_dst != this->pos) { this->link_path=1; this->current_dst=prev_dst; route_graph_reset(this->graph); route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, this->route_graph_flood_done_cb); return; } if (!new_graph && this->path2->updated) route_status.u.num=route_status_path_done_incremental; else route_status.u.num=route_status_path_done_new; } else route_status.u.num=route_status_not_found; this->link_path=0; route_set_attr(this, &route_status); } /** * @brief Updates the route graph and the route path if something changed with the route * * This will update the route graph and the route path of the route if some of the * route's settings (destination, position) have changed. * * The behavior of this function can be controlled via flags: *
    *
  • {@code route_path_flag_cancel}: Cancel navigation, clear route graph and route path
  • *
  • {@code route_path_flag_async}: Perform operations asynchronously
  • *
  • {@code route_path_flag_no_rebuild}: Do not rebuild the route graph
  • *
* * These flags will be stored in the {@code flags} member of the route object. * * @attention For this to work the route graph has to be destroyed if the route's * @attention destination is changed somewhere! * * @param this The route to update * @param flags Flags to control the behavior of this function, see description */ static void route_path_update_flags(struct route *this, enum route_path_flags flags) { dbg(lvl_debug,"enter %d\n", flags); this->flags = flags; if (! this->pos || ! this->destinations) { dbg(lvl_debug,"destroy\n"); route_path_destroy(this->path2,1); this->path2 = NULL; return; } if (flags & route_path_flag_cancel) { route_graph_destroy(this->graph); this->graph=NULL; } /* the graph is destroyed when setting the destination */ if (this->graph) { if (this->graph->busy) { dbg(lvl_debug,"busy building graph\n"); return; } // we can try to update dbg(lvl_debug,"try update\n"); route_path_update_done(this, 0); } else { route_path_destroy(this->path2,1); this->path2 = NULL; } if (!this->graph || (!this->path2 && !(flags & route_path_flag_no_rebuild))) { dbg(lvl_debug,"rebuild graph %p %p\n",this->graph,this->path2); if (! this->route_graph_flood_done_cb) this->route_graph_flood_done_cb=callback_new_2(callback_cast(route_path_update_done), this, (long)1); dbg(lvl_debug,"route_graph_update\n"); route_graph_update(this, this->route_graph_flood_done_cb, !!(flags & route_path_flag_async)); } } /** * @brief Updates the route graph and the route path if something changed with the route * * This function is a wrapper around {@link route_path_update_flags(route *, enum route_path)}. * * @param this The route to update * @param cancel If true, cancel navigation, clear route graph and route path * @param async If true, perform processing asynchronously */ static void route_path_update(struct route *this, int cancel, int async) { enum route_path_flags flags=(cancel ? route_path_flag_cancel:0)|(async ? route_path_flag_async:0); route_path_update_flags(this, flags); } /** * @brief This will calculate all the distances stored in a route_info * * @param ri The route_info to calculate the distances for * @param pro The projection used for this route */ static void route_info_distances(struct route_info *ri, enum projection pro) { int npos=ri->pos+1; struct street_data *sd=ri->street; /* 0 1 2 X 3 4 5 6 pos=2 npos=3 count=7 0,1,2 3,4,5,6*/ ri->lenextra=transform_distance(pro, &ri->lp, &ri->c); ri->lenneg=transform_polyline_length(pro, sd->c, npos)+transform_distance(pro, &sd->c[ri->pos], &ri->lp); ri->lenpos=transform_polyline_length(pro, sd->c+npos, sd->count-npos)+transform_distance(pro, &sd->c[npos], &ri->lp); if (ri->lenneg || ri->lenpos) ri->percent=(ri->lenneg*100)/(ri->lenneg+ri->lenpos); else ri->percent=50; } /** * @brief This sets the current position of the route passed * * This will set the current position of the route passed to the street that is nearest to the * passed coordinates. It also automatically updates the route. * * @param this The route to set the position of * @param pos Coordinates to set as position * @param flags Flags to use for building the graph */ static int route_set_position_flags(struct route *this, struct pcoord *pos, enum route_path_flags flags) { if (this->pos) route_info_free(this->pos); this->pos=NULL; this->pos=route_find_nearest_street(this->vehicleprofile, this->ms, pos); // If there is no nearest street, bail out. if (!this->pos) return 0; this->pos->street_direction=0; dbg(lvl_debug,"this->pos=%p\n", this->pos); route_info_distances(this->pos, pos->pro); route_path_update_flags(this, flags); return 1; } /** * @brief This sets the current position of the route passed * * This will set the current position of the route passed to the street that is nearest to the * passed coordinates. It also automatically updates the route. * * @param this The route to set the position of * @param pos Coordinates to set as position */ void route_set_position(struct route *this, struct pcoord *pos) { route_set_position_flags(this, pos, route_path_flag_async); } /** * @brief Sets a route's current position based on coordinates from tracking * * @param this The route to set the current position of * @param tracking The tracking to get the coordinates from */ void route_set_position_from_tracking(struct route *this, struct tracking *tracking, enum projection pro) { struct coord *c; struct route_info *ret; struct street_data *sd; dbg(lvl_info,"enter\n"); c=tracking_get_pos(tracking); ret=g_new0(struct route_info, 1); if (!ret) { printf("%s:Out of memory\n", __FUNCTION__); return; } if (this->pos) route_info_free(this->pos); this->pos=NULL; ret->c=*c; ret->lp=*c; ret->pos=tracking_get_segment_pos(tracking); ret->street_direction=tracking_get_street_direction(tracking); sd=tracking_get_street_data(tracking); if (sd) { ret->street=street_data_dup(sd); route_info_distances(ret, pro); } dbg(lvl_debug,"position 0x%x,0x%x item 0x%x,0x%x direction %d pos %d lenpos %d lenneg %d\n",c->x,c->y,sd?sd->item.id_hi:0,sd?sd->item.id_lo:0,ret->street_direction,ret->pos,ret->lenpos,ret->lenneg); dbg(lvl_debug,"c->x=0x%x, c->y=0x%x pos=%d item=(0x%x,0x%x)\n", c->x, c->y, ret->pos, ret->street?ret->street->item.id_hi:0, ret->street?ret->street->item.id_lo:0); dbg(lvl_debug,"street 0=(0x%x,0x%x) %d=(0x%x,0x%x)\n", ret->street?ret->street->c[0].x:0, ret->street?ret->street->c[0].y:0, ret->street?ret->street->count-1:0, ret->street?ret->street->c[ret->street->count-1].x:0, ret->street?ret->street->c[ret->street->count-1].y:0); this->pos=ret; if (this->destinations) route_path_update(this, 0, 1); dbg(lvl_info,"ret\n"); } /* Used for debuging of route_rect, what routing sees */ struct map_selection *route_selection; /** * @brief Returns a single map selection */ struct map_selection * route_rect(int order, struct coord *c1, struct coord *c2, int rel, int abs) { int dx,dy,sx=1,sy=1,d,m; struct map_selection *sel=g_new(struct map_selection, 1); if (!sel) { printf("%s:Out of memory\n", __FUNCTION__); return sel; } sel->order=order; sel->range.min=route_item_first; sel->range.max=route_item_last; dbg(lvl_debug,"%p %p\n", c1, c2); dx=c1->x-c2->x; dy=c1->y-c2->y; if (dx < 0) { sx=-1; sel->u.c_rect.lu.x=c1->x; sel->u.c_rect.rl.x=c2->x; } else { sel->u.c_rect.lu.x=c2->x; sel->u.c_rect.rl.x=c1->x; } if (dy < 0) { sy=-1; sel->u.c_rect.lu.y=c2->y; sel->u.c_rect.rl.y=c1->y; } else { sel->u.c_rect.lu.y=c1->y; sel->u.c_rect.rl.y=c2->y; } if (dx*sx > dy*sy) d=dx*sx; else d=dy*sy; m=d*rel/100+abs; sel->u.c_rect.lu.x-=m; sel->u.c_rect.rl.x+=m; sel->u.c_rect.lu.y+=m; sel->u.c_rect.rl.y-=m; sel->next=NULL; return sel; } /** * @brief Appends a map selection to the selection list. Selection list may be NULL. */ static struct map_selection * route_rect_add(struct map_selection *sel, int order, struct coord *c1, struct coord *c2, int rel, int abs) { struct map_selection *ret; ret=route_rect(order, c1, c2, rel, abs); ret->next=sel; return ret; } /** * @brief Returns a list of map selections useable to create a route graph * * Returns a list of map selections useable to get a map rect from which items can be * retrieved to build a route graph. * * @param c Array containing route points, including start, intermediate and destination ones. * @param count number of route points * @param proifle vehicleprofile */ static struct map_selection * route_calc_selection(struct coord *c, int count, struct vehicleprofile *profile) { struct map_selection *ret=NULL; int i; struct coord_rect r; char *depth, *str, *tok; if (!count) return NULL; r.lu=c[0]; r.rl=c[0]; for (i = 1 ; i < count ; i++) coord_rect_extend(&r, &c[i]); depth=profile->route_depth; if (!depth) depth="4:25%,8:40000,18:10000"; depth=str=g_strdup(depth); while((tok=strtok(str,","))!=NULL) { int order=0, dist=0; sscanf(tok,"%d:%d",&order,&dist); if(strchr(tok,'%')) ret=route_rect_add(ret, order, &r.lu, &r.rl, dist, 0); else for (i = 0 ; i < count ; i++) { ret=route_rect_add(ret, order, &c[i], &c[i], 0, dist); } str=NULL; } g_free(depth); return ret; } /** * @brief Destroys a list of map selections * * @param sel Start of the list to be destroyed */ static void route_free_selection(struct map_selection *sel) { struct map_selection *next; while (sel) { next=sel->next; g_free(sel); sel=next; } } static void route_clear_destinations(struct route *this_) { g_list_foreach(this_->destinations, (GFunc)route_info_free, NULL); g_list_free(this_->destinations); this_->destinations=NULL; } /** * @brief Sets the destination of a route * * This sets the destination of a route to the street nearest to the coordinates passed * and updates the route. * * @param this The route to set the destination for * @param dst Coordinates to set as destination * @param count Number of destinations (last one is final) * @param async If set, do routing asynchronously */ void route_set_destinations(struct route *this, struct pcoord *dst, int count, int async) { struct attr route_status; struct route_info *dsti; int i; route_status.type=attr_route_status; profile(0,NULL); route_clear_destinations(this); if (dst && count) { for (i = 0 ; i < count ; i++) { dsti=route_find_nearest_street(this->vehicleprofile, this->ms, &dst[i]); if(dsti) { route_info_distances(dsti, dst->pro); this->destinations=g_list_append(this->destinations, dsti); } } route_status.u.num=route_status_destination_set; } else { this->reached_destinations_count=0; route_status.u.num=route_status_no_destination; } callback_list_call_attr_1(this->cbl2, attr_destination, this); route_set_attr(this, &route_status); profile(1,"find_nearest_street"); /* The graph has to be destroyed and set to NULL, otherwise route_path_update() doesn't work */ route_graph_destroy(this->graph); this->graph=NULL; this->current_dst=route_get_dst(this); route_path_update(this, 1, async); profile(0,"end"); } int route_get_destinations(struct route *this, struct pcoord *pc, int count) { int ret=0; GList *l=this->destinations; while (l && ret < count) { struct route_info *dst=l->data; pc->x=dst->c.x; pc->y=dst->c.y; pc->pro=projection_mg; /* FIXME */ pc++; ret++; l=g_list_next(l); } return ret; } /** * @brief Get the destinations count for the route * * @param this The route instance * @return destination count for the route */ int route_get_destination_count(struct route *this) { return g_list_length(this->destinations); } /** * @brief Returns a description for a waypoint as (type or street_name_systematic) + (label or WayID[osm_wayid]) * * @param this The route instance * @param n The nth waypoint * @return The description */ char* route_get_destination_description(struct route *this, int n) { struct route_info *dst; struct map_rect *mr=NULL; struct item *item; struct attr attr; char *type=NULL; char *label=NULL; char *desc=NULL; if(!this->destinations) return NULL; dst=g_list_nth_data(this->destinations,n); mr=map_rect_new(dst->street->item.map, NULL); item = map_rect_get_item_byid(mr, dst->street->item.id_hi, dst->street->item.id_lo); type=g_strdup(item_to_name(dst->street->item.type)); while(item_attr_get(item, attr_any, &attr)) { if (attr.type==attr_street_name_systematic ){ g_free(type); type=attr_to_text(&attr, item->map, 1); } else if (attr.type==attr_label){ g_free(label); label=attr_to_text(&attr, item->map, 1); } else if (attr.type==attr_osm_wayid && !label){ char *tmp=attr_to_text(&attr, item->map, 1); label=g_strdup_printf("WayID %s", tmp); g_free(tmp); } } if(!label && !type) { desc=g_strdup(_("unknown street")); } else if (!label || strcmp(type, label)==0){ desc=g_strdup(type); } else { desc=g_strdup_printf("%s %s", type, label); } g_free(label); g_free(type); if (mr) map_rect_destroy(mr); return desc; } /** * @brief Start a route given set of coordinates * * @param this The route instance * @param dst The coordinate to start routing to * @param async Set to 1 to do route calculation asynchronously * @return nothing */ void route_set_destination(struct route *this, struct pcoord *dst, int async) { route_set_destinations(this, dst, dst?1:0, async); } /** * @brief Append a waypoint to the route. * * This appends a waypoint to the current route, targetting the street * nearest to the coordinates passed, and updates the route. * * @param this The route to set the destination for * @param dst Coordinates of the new waypoint * @param async: If set, do routing asynchronously */ void route_append_destination(struct route *this, struct pcoord *dst, int async) { if (dst){ struct route_info *dsti; dsti=route_find_nearest_street(this->vehicleprofile, this->ms, &dst[0]); if(dsti) { route_info_distances(dsti, dst->pro); this->destinations=g_list_append(this->destinations, dsti); } /* The graph has to be destroyed and set to NULL, otherwise route_path_update() doesn't work */ route_graph_destroy(this->graph); this->graph=NULL; this->current_dst=route_get_dst(this); route_path_update(this, 1, async); }else{ route_set_destinations(this, NULL, 0, async); } } /** * @brief Remove the nth waypoint of the route * * @param this The route instance * @param n The waypoint to remove * @return nothing */ void route_remove_nth_waypoint(struct route *this, int n) { struct route_info *ri=g_list_nth_data(this->destinations, n); this->destinations=g_list_remove(this->destinations,ri); route_info_free(ri); /* The graph has to be destroyed and set to NULL, otherwise route_path_update() doesn't work */ route_graph_destroy(this->graph); this->graph=NULL; this->current_dst=route_get_dst(this); route_path_update(this, 1, 1); } void route_remove_waypoint(struct route *this) { if (this->path2) { struct route_path *path = this->path2; struct route_info *ri = this->destinations->data; this->destinations = g_list_remove(this->destinations, ri); route_info_free(ri); this->path2 = this->path2->next; route_path_destroy(path, 0); if (!this->destinations) { this->route_status=route_status_no_destination; this->reached_destinations_count=0; return; } this->reached_destinations_count++; route_graph_reset(this->graph); this->current_dst = this->destinations->data; route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, this->route_graph_flood_done_cb); } } /** * @brief Gets the next route_graph_point with the specified coordinates * * @param this The route in which to search * @param c Coordinates to search for * @param last The last route graph point returned to iterate over multiple points with the same coordinates, * or {@code NULL} to return the first point * @return The point at the specified coordinates or NULL if not found */ static struct route_graph_point * route_graph_get_point_next(struct route_graph *this, struct coord *c, struct route_graph_point *last) { struct route_graph_point *p; int seen=0,hashval=HASHCOORD(c); p=this->hash[hashval]; while (p) { if (p->c.x == c->x && p->c.y == c->y) { if (!last || seen) return p; if (p == last) seen=1; } p=p->hash_next; } return NULL; } /** * @brief Gets the first route_graph_point with the specified coordinates * * @param this The route in which to search * @param c Coordinates to search for * @return The point at the specified coordinates or NULL if not found */ static struct route_graph_point * route_graph_get_point(struct route_graph *this, struct coord *c) { return route_graph_get_point_next(this, c, NULL); } /** * @brief Gets the last route_graph_point with the specified coordinates * * @param this The route in which to search * @param c Coordinates to search for * @return The point at the specified coordinates or NULL if not found */ static struct route_graph_point * route_graph_get_point_last(struct route_graph *this, struct coord *c) { struct route_graph_point *p,*ret=NULL; int hashval=HASHCOORD(c); p=this->hash[hashval]; while (p) { if (p->c.x == c->x && p->c.y == c->y) ret=p; p=p->hash_next; } return ret; } /** * @brief Create a new point for the route graph with the specified coordinates * * @param this The route to insert the point into * @param f The coordinates at which the point should be created * @return The point created */ static struct route_graph_point * route_graph_point_new(struct route_graph *this, struct coord *f) { int hashval; struct route_graph_point *p; hashval=HASHCOORD(f); if (debug_route) printf("p (0x%x,0x%x)\n", f->x, f->y); p=g_slice_new0(struct route_graph_point); p->hash_next=this->hash[hashval]; this->hash[hashval]=p; p->value=INT_MAX; p->c=*f; return p; } /** * @brief Inserts a point into the route graph at the specified coordinates * * This will insert a point into the route graph at the coordinates passed in f. * Note that the point is not yet linked to any segments. * * If the route graph already contains a point at the specified coordinates, the existing point * will be returned. * * @param this The route graph to insert the point into * @param f The coordinates at which the point should be inserted * @return The point inserted or NULL on failure */ static struct route_graph_point * route_graph_add_point(struct route_graph *this, struct coord *f) { struct route_graph_point *p; p=route_graph_get_point(this,f); if (!p) p=route_graph_point_new(this,f); return p; } /** * @brief Frees all the memory used for points in the route graph passed * * @param this The route graph to delete all points from */ static void route_graph_free_points(struct route_graph *this) { struct route_graph_point *curr,*next; int i; for (i = 0 ; i < HASH_SIZE ; i++) { curr=this->hash[i]; while (curr) { next=curr->hash_next; g_slice_free(struct route_graph_point, curr); curr=next; } this->hash[i]=NULL; } } /** * @brief Resets all nodes * * This iterates through all the points in the route graph, resetting them to their initial state. * The {@code value} member of each point (cost to reach the destination) is reset to * {@code INT_MAX}, the {@code seg} member (cheapest way to destination) is reset to {@code NULL} * and the {@code el} member (pointer to element in Fibonacci heap) is also reset to {@code NULL}. * * References to elements of the route graph which were obtained prior to calling this function * remain valid after it returns. * * @param this The route graph to reset */ static void route_graph_reset(struct route_graph *this) { struct route_graph_point *curr; int i; for (i = 0 ; i < HASH_SIZE ; i++) { curr=this->hash[i]; while (curr) { curr->value=INT_MAX; curr->seg=NULL; curr->el=NULL; curr=curr->hash_next; } } } /** * @brief Returns the position of a certain field appended to a route graph segment * * This function returns a pointer to a field that is appended to a route graph * segment. * * @param seg The route graph segment the field is appended to * @param type Type of the field that should be returned * @return A pointer to a field of a certain type, or NULL if no such field is present */ static void * route_segment_data_field_pos(struct route_segment_data *seg, enum attr_type type) { unsigned char *ptr; ptr = ((unsigned char*)seg) + sizeof(struct route_segment_data); if (seg->flags & AF_SPEED_LIMIT) { if (type == attr_maxspeed) return (void*)ptr; ptr += sizeof(int); } if (seg->flags & AF_SEGMENTED) { if (type == attr_offset) return (void*)ptr; ptr += sizeof(int); } if (seg->flags & AF_SIZE_OR_WEIGHT_LIMIT) { if (type == attr_vehicle_width) return (void*)ptr; ptr += sizeof(struct size_weight_limit); } if (seg->flags & AF_DANGEROUS_GOODS) { if (type == attr_vehicle_dangerous_goods) return (void*)ptr; ptr += sizeof(int); } return NULL; } /** * @brief Calculates the size of a route_segment_data struct with given flags * * @param flags The flags of the route_segment_data */ static int route_segment_data_size(int flags) { int ret=sizeof(struct route_segment_data); if (flags & AF_SPEED_LIMIT) ret+=sizeof(int); if (flags & AF_SEGMENTED) ret+=sizeof(int); if (flags & AF_SIZE_OR_WEIGHT_LIMIT) ret+=sizeof(struct size_weight_limit); if (flags & AF_DANGEROUS_GOODS) ret+=sizeof(int); return ret; } static int route_graph_segment_is_duplicate(struct route_graph_point *start, struct route_graph_segment_data *data) { struct route_graph_segment *s; s=start->start; while (s) { if (item_is_equal(*data->item, s->data.item)) { if (data->flags & AF_SEGMENTED) { if (RSD_OFFSET(&s->data) == data->offset) { return 1; } } else return 1; } s=s->start_next; } return 0; } /** * @brief Inserts a new segment into the route graph * * This function performs a check if a segment for the item specified already exists, and inserts * a new segment representing this item if it does not. * * @param this The route graph to insert the segment into * @param start The graph point which should be connected to the start of this segment * @param end The graph point which should be connected to the end of this segment * @param len The length of this segment * @param item The item that is represented by this segment * @param flags Flags for this segment * @param offset If the item passed in "item" is segmented (i.e. divided into several segments), this indicates the position of this segment within the item * @param maxspeed The maximum speed allowed on this segment in km/h. -1 if not known. */ static void route_graph_add_segment(struct route_graph *this, struct route_graph_point *start, struct route_graph_point *end, struct route_graph_segment_data *data) { struct route_graph_segment *s; int size; size = sizeof(struct route_graph_segment)-sizeof(struct route_segment_data)+route_segment_data_size(data->flags); s = g_slice_alloc0(size); if (!s) { printf("%s:Out of memory\n", __FUNCTION__); return; } s->start=start; s->start_next=start->start; start->start=s; s->end=end; s->end_next=end->end; end->end=s; dbg_assert(data->len >= 0); s->data.len=data->len; s->data.item=*data->item; s->data.flags=data->flags; if (data->flags & AF_SPEED_LIMIT) RSD_MAXSPEED(&s->data)=data->maxspeed; if (data->flags & AF_SEGMENTED) RSD_OFFSET(&s->data)=data->offset; if (data->flags & AF_SIZE_OR_WEIGHT_LIMIT) RSD_SIZE_WEIGHT(&s->data)=data->size_weight; if (data->flags & AF_DANGEROUS_GOODS) RSD_DANGEROUS_GOODS(&s->data)=data->dangerous_goods; s->next=this->route_segments; this->route_segments=s; if (debug_route) printf("l (0x%x,0x%x)-(0x%x,0x%x)\n", start->c.x, start->c.y, end->c.x, end->c.y); } /** * @brief Gets all the coordinates of an item * * This will get all the coordinates of the item i and return them in c, * up to max coordinates. Additionally it is possible to limit the coordinates * returned to all the coordinates of the item between the two coordinates * start end end. * * @important Make sure that whatever c points to has enough memory allocated * @important to hold max coordinates! * * @param i The item to get the coordinates of * @param c Pointer to memory allocated for holding the coordinates * @param max Maximum number of coordinates to return * @param start First coordinate to get * @param end Last coordinate to get * @return The number of coordinates returned */ static int get_item_seg_coords(struct item *i, struct coord *c, int max, struct coord *start, struct coord *end) { struct map_rect *mr; struct item *item; int rc = 0, p = 0; struct coord c1; mr=map_rect_new(i->map, NULL); if (!mr) return 0; item = map_rect_get_item_byid(mr, i->id_hi, i->id_lo); if (item) { rc = item_coord_get(item, &c1, 1); while (rc && (c1.x != start->x || c1.y != start->y)) { rc = item_coord_get(item, &c1, 1); } while (rc && p < max) { c[p++] = c1; if (c1.x == end->x && c1.y == end->y) break; rc = item_coord_get(item, &c1, 1); } } map_rect_destroy(mr); return p; } /** * @brief Returns and removes one segment from a path * * @param path The path to take the segment from * @param item The item whose segment to remove * @param offset Offset of the segment within the item to remove. If the item is not segmented this should be 1. * @return The segment removed */ static struct route_path_segment * route_extract_segment_from_path(struct route_path *path, struct item *item, int offset) { int soffset; struct route_path_segment *sp = NULL, *s; s = path->path; while (s) { if (item_is_equal(s->data->item,*item)) { if (s->data->flags & AF_SEGMENTED) soffset=RSD_OFFSET(s->data); else soffset=1; if (soffset == offset) { if (sp) { sp->next = s->next; break; } else { path->path = s->next; break; } } } sp = s; s = s->next; } if (s) item_hash_remove(path->path_hash, item); return s; } /** * @brief Adds a segment and the end of a path * * @param this The path to add the segment to * @param segment The segment to add */ static void route_path_add_segment(struct route_path *this, struct route_path_segment *segment) { if (!this->path) this->path=segment; if (this->path_last) this->path_last->next=segment; this->path_last=segment; } /** * @brief Adds a two coordinate line to a path * * This adds a new line to a path, creating a new segment for it. * * @param this The path to add the item to * @param start coordinate to add to the start of the item. If none should be added, make this NULL. * @param end coordinate to add to the end of the item. If none should be added, make this NULL. * @param len The length of the item */ static void route_path_add_line(struct route_path *this, struct coord *start, struct coord *end, int len) { int ccnt=2; struct route_path_segment *segment; int seg_size,seg_dat_size; dbg(lvl_debug,"line from 0x%x,0x%x-0x%x,0x%x\n", start->x, start->y, end->x, end->y); seg_size=sizeof(*segment) + sizeof(struct coord) * ccnt; seg_dat_size=sizeof(struct route_segment_data); segment=g_malloc0(seg_size + seg_dat_size); segment->data=(struct route_segment_data *)((char *)segment+seg_size); segment->ncoords=ccnt; segment->direction=0; segment->c[0]=*start; segment->c[1]=*end; segment->data->len=len; route_path_add_segment(this, segment); } /** * @brief Inserts a new item into the path * * This function does almost the same as "route_path_add_item()", but identifies * the item to add by a segment from the route graph. Another difference is that it "copies" the * segment from the route graph, i.e. if the item is segmented, only the segment passed in rgs will * be added to the route path, not all segments of the item. * * The function can be sped up by passing an old path already containing this segment in oldpath - * the segment will then be extracted from this old path. Please note that in this case the direction * parameter has no effect. * * @param this The path to add the item to * @param oldpath Old path containing the segment to be added. Speeds up the function, but can be NULL. * @param rgs Segment of the route graph that should be "copied" to the route path * @param dir Order in which to add the coordinates. See route_path_add_item() * @param pos Information about start point if this is the first segment * @param dst Information about end point if this is the last segment */ static int route_path_add_item_from_graph(struct route_path *this, struct route_path *oldpath, struct route_graph_segment *rgs, int dir, struct route_info *pos, struct route_info *dst) { struct route_path_segment *segment=NULL; int i, ccnt, extra=0, ret=0; struct coord *c,*cd,ca[2048]; int offset=1; int seg_size,seg_dat_size; int len=rgs->data.len; if (rgs->data.flags & AF_SEGMENTED) offset=RSD_OFFSET(&rgs->data); dbg(lvl_debug,"enter (0x%x,0x%x) dir=%d pos=%p dst=%p\n", rgs->data.item.id_hi, rgs->data.item.id_lo, dir, pos, dst); if (oldpath) { segment=item_hash_lookup(oldpath->path_hash, &rgs->data.item); if (segment && segment->direction == dir) { segment = route_extract_segment_from_path(oldpath, &rgs->data.item, offset); if (segment) { ret=1; if (!pos) goto linkold; } g_free(segment); } } if (pos) { if (dst) { extra=2; if (dst->lenneg >= pos->lenneg) { dir=1; ccnt=dst->pos-pos->pos; c=pos->street->c+pos->pos+1; len=dst->lenneg-pos->lenneg; } else { dir=-1; ccnt=pos->pos-dst->pos; c=pos->street->c+dst->pos+1; len=pos->lenneg-dst->lenneg; } } else { extra=1; dbg(lvl_debug,"pos dir=%d\n", dir); dbg(lvl_debug,"pos pos=%d\n", pos->pos); dbg(lvl_debug,"pos count=%d\n", pos->street->count); if (dir > 0) { c=pos->street->c+pos->pos+1; ccnt=pos->street->count-pos->pos-1; len=pos->lenpos; } else { c=pos->street->c; ccnt=pos->pos+1; len=pos->lenneg; } } pos->dir=dir; } else if (dst) { extra=1; dbg(lvl_debug,"dst dir=%d\n", dir); dbg(lvl_debug,"dst pos=%d\n", dst->pos); if (dir > 0) { c=dst->street->c; ccnt=dst->pos+1; len=dst->lenneg; } else { c=dst->street->c+dst->pos+1; ccnt=dst->street->count-dst->pos-1; len=dst->lenpos; } } else { ccnt=get_item_seg_coords(&rgs->data.item, ca, 2047, &rgs->start->c, &rgs->end->c); c=ca; } seg_size=sizeof(*segment) + sizeof(struct coord) * (ccnt + extra); seg_dat_size=route_segment_data_size(rgs->data.flags); segment=g_malloc0(seg_size + seg_dat_size); segment->data=(struct route_segment_data *)((char *)segment+seg_size); segment->direction=dir; cd=segment->c; if (pos && (c[0].x != pos->lp.x || c[0].y != pos->lp.y)) *cd++=pos->lp; if (dir < 0) c+=ccnt-1; for (i = 0 ; i < ccnt ; i++) { *cd++=*c; c+=dir; } segment->ncoords+=ccnt; if (dst && (cd[-1].x != dst->lp.x || cd[-1].y != dst->lp.y)) *cd++=dst->lp; segment->ncoords=cd-segment->c; if (segment->ncoords <= 1) { g_free(segment); return 1; } /* We check if the route graph segment is part of a roundabout here, because this * only matters for route graph segments which form parts of the route path */ if (!(rgs->data.flags & AF_ROUNDABOUT)) { // We identified this roundabout earlier route_check_roundabout(rgs, 13, (dir < 1), NULL); } memcpy(segment->data, &rgs->data, seg_dat_size); linkold: segment->data->len=len; segment->next=NULL; item_hash_insert(this->path_hash, &rgs->data.item, segment); route_path_add_segment(this, segment); return ret; } /** * @brief Destroys all segments of a route graph * * @param this The graph to destroy all segments from */ static void route_graph_free_segments(struct route_graph *this) { struct route_graph_segment *curr,*next; int size; curr=this->route_segments; while (curr) { next=curr->next; size = sizeof(struct route_graph_segment)-sizeof(struct route_segment_data)+route_segment_data_size(curr->data.flags); g_slice_free1(size, curr); curr=next; } this->route_segments=NULL; } /** * @brief Destroys a route graph * * @param this The route graph to be destroyed */ static void route_graph_destroy(struct route_graph *this) { if (this) { route_graph_build_done(this, 1); route_graph_free_points(this); route_graph_free_segments(this); g_free(this); } } /** * @brief Returns the estimated speed on a segment, or 0 for an impassable segment * * This function returns the estimated speed to be driven on a segment, calculated as follows: *
    *
  • Initially the route weight of the vehicle profile for the given item type is used. If the * item type does not have a route weight in the vehicle profile given, it is considered impassable * and 0 is returned.
  • *
  • If the {@code maxspeed} attribute of the segment's item is set, either it or the previous * speed estimate for the segment is used, as governed by the vehicle profile's * {@code maxspeed_handling} attribute.
  • *
  • If a traffic distortion is present, its {@code maxspeed} is taken into account in a similar * manner. Unlike the regular {@code maxspeed}, a {@code maxspeed} resulting from a traffic * distortion is always considered if it limits the speed, regardless of {@code maxspeed_handling}. *
  • *
  • Access restrictions for dangerous goods, size or weight are evaluated, and 0 is returned if * the given vehicle profile violates one of them.
  • *
* * @param profile The routing preferences * @param over The segment which is passed * @param dist A traffic distortion if applicable, or {@code NULL} * @return The estimated speed in km/h, or 0 if the segment is impassable */ static int route_seg_speed(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist) { struct roadprofile *roadprofile=vehicleprofile_get_roadprofile(profile, over->item.type); int speed,maxspeed; if (!roadprofile || !roadprofile->route_weight) return 0; speed=roadprofile->route_weight; if (profile->maxspeed_handling != maxspeed_ignore) { if (over->flags & AF_SPEED_LIMIT) { maxspeed=RSD_MAXSPEED(over); if (profile->maxspeed_handling == maxspeed_enforce) speed=maxspeed; } else maxspeed=INT_MAX; if (dist && maxspeed > dist->maxspeed) maxspeed=dist->maxspeed; if (maxspeed != INT_MAX && (profile->maxspeed_handling != maxspeed_restrict || maxspeed < speed)) speed=maxspeed; } if (over->flags & AF_DANGEROUS_GOODS) { if (profile->dangerous_goods & RSD_DANGEROUS_GOODS(over)) return 0; } if (over->flags & AF_SIZE_OR_WEIGHT_LIMIT) { struct size_weight_limit *size_weight=&RSD_SIZE_WEIGHT(over); if (size_weight->width != -1 && profile->width != -1 && profile->width > size_weight->width) return 0; if (size_weight->height != -1 && profile->height != -1 && profile->height > size_weight->height) return 0; if (size_weight->length != -1 && profile->length != -1 && profile->length > size_weight->length) return 0; if (size_weight->weight != -1 && profile->weight != -1 && profile->weight > size_weight->weight) return 0; if (size_weight->axle_weight != -1 && profile->axle_weight != -1 && profile->axle_weight > size_weight->axle_weight) return 0; } return speed; } /** * @brief Returns the time needed to travel along a segment, or {@code INT_MAX} if the segment is impassable. * * This function returns the time needed to travel along the entire length of {@code over} in * tenths of seconds. Restrictions for dangerous goods, weight or size are taken into account. * Traffic distortions are also taken into account if a valid {@code dist} argument is given. * * @param profile The vehicle profile (routing preferences) * @param over The segment which is passed * @param dist A traffic distortion if applicable, or {@code NULL} * @return The time needed in tenths of seconds */ static int route_time_seg(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist) { int speed=route_seg_speed(profile, over, dist); if (!speed) return INT_MAX; return over->len*36/speed+(dist ? dist->delay : 0); } /** * @brief Returns the traffic distortion for a segment. * * @param seg The segment for which the traffic distortion is to be returned * @param ret Points to a {@code struct route_traffic_distortion}, whose members will be filled * * @return true if a traffic distortion was found, 0 if not */ static int route_get_traffic_distortion(struct route_graph_segment *seg, struct route_traffic_distortion *ret) { struct route_graph_point *start=seg->start; struct route_graph_point *end=seg->end; struct route_graph_segment *tmp,*found=NULL; tmp=start->start; while (tmp && !found) { if (tmp->data.item.type == type_traffic_distortion && tmp->start == start && tmp->end == end) found=tmp; tmp=tmp->start_next; } tmp=start->end; while (tmp && !found) { if (tmp->data.item.type == type_traffic_distortion && tmp->end == start && tmp->start == end) found=tmp; tmp=tmp->end_next; } if (found) { ret->delay=found->data.len; if (found->data.flags & AF_SPEED_LIMIT) ret->maxspeed=RSD_MAXSPEED(&found->data); else ret->maxspeed=INT_MAX; return 1; } return 0; } static int route_through_traffic_allowed(struct vehicleprofile *profile, struct route_graph_segment *seg) { return (seg->data.flags & AF_THROUGH_TRAFFIC_LIMIT) == 0; } /** * @brief Returns the "cost" of driving from point {@code from} along segment {@code over} in direction {@code dir} * * Cost is relative to time, indicated in tenths of seconds. * * This function considers traffic distortions as well as penalties. If the segment is impassable * due to traffic distortions or restrictions, {@code INT_MAX} is returned in order to prevent use * of this segment for routing. * * @param profile The routing preferences * @param from The point where we are starting * @param over The segment we are using * @param dir The direction of segment which we are driving. Positive values indicate we are * traveling in the direction of the segment, negative values indicate we are traveling against * that direction. Values of +2 or -2 cause the function to ignore traffic distortions. * * @return The "cost" needed to travel along the segment */ static int route_value_seg(struct vehicleprofile *profile, struct route_graph_point *from, struct route_graph_segment *over, int dir) { int ret; struct route_traffic_distortion dist,*distp=NULL; #if 0 dbg(lvl_debug,"flags 0x%x mask 0x%x flags 0x%x\n", over->flags, dir >= 0 ? profile->flags_forward_mask : profile->flags_reverse_mask, profile->flags); #endif if ((over->data.flags & (dir >= 0 ? profile->flags_forward_mask : profile->flags_reverse_mask)) != profile->flags) return INT_MAX; if (dir > 0 && (over->start->flags & RP_TURN_RESTRICTION)) return INT_MAX; if (dir < 0 && (over->end->flags & RP_TURN_RESTRICTION)) return INT_MAX; if (from && from->seg == over) return INT_MAX; if ((over->start->flags & RP_TRAFFIC_DISTORTION) && (over->end->flags & RP_TRAFFIC_DISTORTION) && route_get_traffic_distortion(over, &dist) && dir != 2 && dir != -2) { distp=&dist; } ret=route_time_seg(profile, &over->data, distp); if (ret == INT_MAX) return ret; if (!route_through_traffic_allowed(profile, over) && from && route_through_traffic_allowed(profile, from->seg)) ret+=profile->through_traffic_penalty; return ret; } static int route_graph_segment_match(struct route_graph_segment *s1, struct route_graph_segment *s2) { if (!s1 || !s2) return 0; return (s1->start->c.x == s2->start->c.x && s1->start->c.y == s2->start->c.y && s1->end->c.x == s2->end->c.x && s1->end->c.y == s2->end->c.y); } /** * @brief Sets or clears a traffic distortion for a segment. * * This sets or clears a delay. It cannot be used to set speed. * * @param this The route graph * @param seg The segment to which the traffic distortion applies * @param delay Delay in tenths of a second */ static void route_graph_set_traffic_distortion(struct route_graph *this, struct route_graph_segment *seg, int delay) { struct route_graph_point *start=NULL; struct route_graph_segment *s; while ((start=route_graph_get_point_next(this, &seg->start->c, start))) { s=start->start; while (s) { if (route_graph_segment_match(s, seg)) { if (s->data.item.type != type_none && s->data.item.type != type_traffic_distortion && delay) { struct route_graph_segment_data data; struct item item; memset(&data, 0, sizeof(data)); memset(&item, 0, sizeof(item)); item.type=type_traffic_distortion; data.item=&item; data.len=delay; s->start->flags |= RP_TRAFFIC_DISTORTION; s->end->flags |= RP_TRAFFIC_DISTORTION; route_graph_add_segment(this, s->start, s->end, &data); } else if (s->data.item.type == type_traffic_distortion && !delay) { s->data.item.type = type_none; } } s=s->start_next; } } } /** * @brief Adds a route distortion item to the route graph * * @param this The route graph to add to * @param item The item to add */ static void route_process_traffic_distortion(struct route_graph *this, struct item *item) { struct route_graph_point *s_pnt,*e_pnt; struct coord c,l; struct attr delay_attr, maxspeed_attr; struct route_graph_segment_data data; data.item=item; data.len=0; data.flags=0; data.offset=1; data.maxspeed = INT_MAX; if (item_coord_get(item, &l, 1)) { s_pnt=route_graph_add_point(this,&l); while (item_coord_get(item, &c, 1)) { l=c; } e_pnt=route_graph_add_point(this,&l); s_pnt->flags |= RP_TRAFFIC_DISTORTION; e_pnt->flags |= RP_TRAFFIC_DISTORTION; if (item_attr_get(item, attr_maxspeed, &maxspeed_attr)) { data.flags |= AF_SPEED_LIMIT; data.maxspeed=maxspeed_attr.u.num; } if (item_attr_get(item, attr_delay, &delay_attr)) data.len=delay_attr.u.num; route_graph_add_segment(this, s_pnt, e_pnt, &data); } } /** * @brief Adds a turn restriction item to the route graph * * @param this The route graph to add to * @param item The item to add */ static void route_process_turn_restriction(struct route_graph *this, struct item *item) { struct route_graph_point *pnt[4]; struct coord c[5]; int i,count; struct route_graph_segment_data data; count=item_coord_get(item, c, 5); if (count != 3 && count != 4) { dbg(lvl_debug,"wrong count %d\n",count); return; } if (count == 4) return; for (i = 0 ; i < count ; i++) pnt[i]=route_graph_add_point(this,&c[i]); dbg(lvl_debug,"%s: (0x%x,0x%x)-(0x%x,0x%x)-(0x%x,0x%x) %p-%p-%p\n",item_to_name(item->type),c[0].x,c[0].y,c[1].x,c[1].y,c[2].x,c[2].y,pnt[0],pnt[1],pnt[2]); data.item=item; data.flags=0; data.len=0; route_graph_add_segment(this, pnt[0], pnt[1], &data); route_graph_add_segment(this, pnt[1], pnt[2], &data); #if 1 if (count == 4) { pnt[1]->flags |= RP_TURN_RESTRICTION; pnt[2]->flags |= RP_TURN_RESTRICTION; route_graph_add_segment(this, pnt[2], pnt[3], &data); } else pnt[1]->flags |= RP_TURN_RESTRICTION; #endif } /** * @brief Adds an item to the route graph * * This adds an item (e.g. a street) to the route graph, creating as many segments as needed for a * segmented item. * * @param this The route graph to add to * @param item The item to add * @param profile The vehicle profile currently in use */ static void route_process_street_graph(struct route_graph *this, struct item *item, struct vehicleprofile *profile) { #ifdef AVOID_FLOAT int len=0; #else double len=0; #endif int segmented = 0; struct roadprofile *roadp; struct route_graph_point *s_pnt,*e_pnt; /* Start and end point */ struct coord c,l; /* Current and previous point */ struct attr attr; struct route_graph_segment_data data; data.flags=0; data.offset=1; data.maxspeed=-1; data.item=item; roadp = vehicleprofile_get_roadprofile(profile, item->type); if (!roadp) { /* Don't include any roads that don't have a road profile in our vehicle profile */ return; } if (item_coord_get(item, &l, 1)) { int default_flags_value=AF_ALL; int *default_flags=item_get_default_flags(item->type); if (! default_flags) default_flags=&default_flags_value; if (item_attr_get(item, attr_flags, &attr)) { data.flags = attr.u.num; if (data.flags & AF_SEGMENTED) segmented = 1; } else data.flags = *default_flags; if (data.flags & AF_SPEED_LIMIT) { if (item_attr_get(item, attr_maxspeed, &attr)) data.maxspeed = attr.u.num; } if (data.flags & AF_DANGEROUS_GOODS) { if (item_attr_get(item, attr_vehicle_dangerous_goods, &attr)) data.dangerous_goods = attr.u.num; else data.flags &= ~AF_DANGEROUS_GOODS; } if (data.flags & AF_SIZE_OR_WEIGHT_LIMIT) { if (item_attr_get(item, attr_vehicle_width, &attr)) data.size_weight.width=attr.u.num; else data.size_weight.width=-1; if (item_attr_get(item, attr_vehicle_height, &attr)) data.size_weight.height=attr.u.num; else data.size_weight.height=-1; if (item_attr_get(item, attr_vehicle_length, &attr)) data.size_weight.length=attr.u.num; else data.size_weight.length=-1; if (item_attr_get(item, attr_vehicle_weight, &attr)) data.size_weight.weight=attr.u.num; else data.size_weight.weight=-1; if (item_attr_get(item, attr_vehicle_axle_weight, &attr)) data.size_weight.axle_weight=attr.u.num; else data.size_weight.axle_weight=-1; } s_pnt=route_graph_add_point(this,&l); if (!segmented) { while (item_coord_get(item, &c, 1)) { len+=transform_distance(map_projection(item->map), &l, &c); l=c; } e_pnt=route_graph_add_point(this,&l); dbg_assert(len >= 0); data.len=len; if (!route_graph_segment_is_duplicate(s_pnt, &data)) route_graph_add_segment(this, s_pnt, e_pnt, &data); } else { int isseg,rc; int sc = 0; do { isseg = item_coord_is_node(item); rc = item_coord_get(item, &c, 1); if (rc) { len+=transform_distance(map_projection(item->map), &l, &c); l=c; if (isseg) { e_pnt=route_graph_add_point(this,&l); data.len=len; if (!route_graph_segment_is_duplicate(s_pnt, &data)) route_graph_add_segment(this, s_pnt, e_pnt, &data); data.offset++; s_pnt=route_graph_add_point(this,&l); len = 0; } } } while(rc); e_pnt=route_graph_add_point(this,&l); dbg_assert(len >= 0); sc++; data.len=len; if (!route_graph_segment_is_duplicate(s_pnt, &data)) route_graph_add_segment(this, s_pnt, e_pnt, &data); } } } /** * @brief Gets the next route_graph_segment belonging to the specified street * * @param graph The route graph in which to search * @param sd The street to search for * @param last The last route graph segment returned to iterate over multiple segments of the same * item. If {@code NULL}, the first matching segment will be returned. * * @return The route graph segment, or {@code NULL} if none was found. */ static struct route_graph_segment * route_graph_get_segment(struct route_graph *graph, struct street_data *sd, struct route_graph_segment *last) { struct route_graph_point *start=NULL; struct route_graph_segment *s; int seen=0; while ((start=route_graph_get_point_next(graph, &sd->c[0], start))) { s=start->start; while (s) { if (item_is_equal(sd->item, s->data.item)) { if (!last || seen) return s; if (last == s) seen=1; } s=s->start_next; } } return NULL; } /** * @brief Calculates the routing costs for each point * * This function is the heart of routing. It assigns each point in the route graph a * cost at which one can reach the destination from this point on. Additionally it assigns * each point a segment one should follow from this point on to reach the destination at the * stated costs. * * This function uses Dijkstra's algorithm to do the routing. To understand it you should have a look * at this algorithm. * * References to elements of the route graph which were obtained prior to calling this function * remain valid after it returns. * * @param this_ The route graph to flood * @param dst The destination of the route * @param profile The vehicle profile to use for routing. This determines which ways are passable * and how their costs are calculated. * @param cb The callback function to call when flooding is complete */ static void route_graph_flood(struct route_graph *this, struct route_info *dst, struct vehicleprofile *profile, struct callback *cb) { struct route_graph_point *p_min; struct route_graph_segment *s=NULL; int min,new,val; struct fibheap *heap; /* This heap will hold all points with "temporarily" calculated costs */ heap = fh_makekeyheap(); while ((s=route_graph_get_segment(this, dst->street, s))) { val=route_value_seg(profile, NULL, s, -1); if (val != INT_MAX) { val=val*(100-dst->percent)/100; s->end->seg=s; s->end->value=val; s->end->el=fh_insertkey(heap, s->end->value, s->end); } val=route_value_seg(profile, NULL, s, 1); if (val != INT_MAX) { val=val*dst->percent/100; s->start->seg=s; s->start->value=val; s->start->el=fh_insertkey(heap, s->start->value, s->start); } } for (;;) { p_min=fh_extractmin(heap); /* Starting Dijkstra by selecting the point with the minimum costs on the heap */ if (! p_min) /* There are no more points with temporarily calculated costs, Dijkstra has finished */ break; min=p_min->value; if (debug_route) printf("extract p=%p free el=%p min=%d, 0x%x, 0x%x\n", p_min, p_min->el, min, p_min->c.x, p_min->c.y); p_min->el=NULL; /* This point is permanently calculated now, we've taken it out of the heap */ s=p_min->start; while (s) { /* Iterating all the segments leading away from our point to update the points at their ends */ val=route_value_seg(profile, p_min, s, -1); if (val != INT_MAX && item_is_equal(s->data.item,p_min->seg->data.item)) { if (profile->turn_around_penalty2) val+=profile->turn_around_penalty2; else val=INT_MAX; } if (val != INT_MAX) { new=min+val; if (debug_route) printf("begin %d len %d vs %d (0x%x,0x%x)\n",new,val,s->end->value, s->end->c.x, s->end->c.y); if (new < s->end->value) { /* We've found a less costly way to reach the end of s, update it */ s->end->value=new; s->end->seg=s; if (! s->end->el) { if (debug_route) printf("insert_end p=%p el=%p val=%d ", s->end, s->end->el, s->end->value); s->end->el=fh_insertkey(heap, new, s->end); if (debug_route) printf("el new=%p\n", s->end->el); } else { if (debug_route) printf("replace_end p=%p el=%p val=%d\n", s->end, s->end->el, s->end->value); fh_replacekey(heap, s->end->el, new); } } if (debug_route) printf("\n"); } s=s->start_next; } s=p_min->end; while (s) { /* Doing the same as above with the segments leading towards our point */ val=route_value_seg(profile, p_min, s, 1); if (val != INT_MAX && item_is_equal(s->data.item,p_min->seg->data.item)) { if (profile->turn_around_penalty2) val+=profile->turn_around_penalty2; else val=INT_MAX; } if (val != INT_MAX) { new=min+val; if (debug_route) printf("end %d len %d vs %d (0x%x,0x%x)\n",new,val,s->start->value,s->start->c.x, s->start->c.y); if (new < s->start->value) { s->start->value=new; s->start->seg=s; if (! s->start->el) { if (debug_route) printf("insert_start p=%p el=%p val=%d ", s->start, s->start->el, s->start->value); s->start->el=fh_insertkey(heap, new, s->start); if (debug_route) printf("el new=%p\n", s->start->el); } else { if (debug_route) printf("replace_start p=%p el=%p val=%d\n", s->start, s->start->el, s->start->value); fh_replacekey(heap, s->start->el, new); } } if (debug_route) printf("\n"); } s=s->end_next; } } fh_deleteheap(heap); callback_call_0(cb); dbg(lvl_debug,"return\n"); } /** * @brief Starts an "offroad" path * * This starts a path that is not located on a street. It creates a new route path * adding only one segment, that leads from pos to dest, and which is not associated with an item. * * @param this Not used * @param pos The starting position for the new path * @param dst The destination of the new path * @param dir Not used * @return The new path */ static struct route_path * route_path_new_offroad(struct route_graph *this, struct route_info *pos, struct route_info *dst) { struct route_path *ret; ret=g_new0(struct route_path, 1); ret->in_use=1; ret->path_hash=item_hash_new(); route_path_add_line(ret, &pos->c, &dst->c, pos->lenextra+dst->lenextra); ret->updated=1; return ret; } /** * @brief Returns a coordinate at a given distance * * This function returns the coordinate, where the user will be if he * follows the current route for a certain distance. * * @param this_ The route we're driving upon * @param dist The distance in meters * @return The coordinate where the user will be in that distance */ struct coord route_get_coord_dist(struct route *this_, int dist) { int d,l,i,len; int dx,dy; double frac; struct route_path_segment *cur; struct coord ret; enum projection pro=route_projection(this_); struct route_info *dst=route_get_dst(this_); d = dist; if (!this_->path2 || pro == projection_none) { return this_->pos->c; } ret = this_->pos->c; cur = this_->path2->path; while (cur) { if (cur->data->len < d) { d -= cur->data->len; } else { for (i=0; i < (cur->ncoords-1); i++) { l = d; len = (int)transform_polyline_length(pro, (cur->c + i), 2); d -= len; if (d <= 0) { // We interpolate a bit here... frac = (double)l / len; dx = (cur->c + i + 1)->x - (cur->c + i)->x; dy = (cur->c + i + 1)->y - (cur->c + i)->y; ret.x = (cur->c + i)->x + (frac * dx); ret.y = (cur->c + i)->y + (frac * dy); return ret; } } return cur->c[(cur->ncoords-1)]; } cur = cur->next; } return dst->c; } /** * @brief Creates a new route path * * This creates a new non-trivial route. It therefore needs the routing information created by route_graph_flood, so * make sure to run route_graph_flood() after changing the destination before using this function. * * @param this The route graph to create the route from * @param oldpath (Optional) old path which may contain parts of the new part - this speeds things up a bit. May be NULL. * @param pos The starting position of the route * @param dst The destination of the route * @param preferences The routing preferences * @return The new route path */ static struct route_path * route_path_new(struct route_graph *this, struct route_path *oldpath, struct route_info *pos, struct route_info *dst, struct vehicleprofile *profile) { struct route_graph_segment *s=NULL,*s1=NULL,*s2=NULL; /* candidate segments for cheapest path */ struct route_graph_point *start; /* point at which the next segment starts, i.e. up to which the path is complete */ struct route_info *posinfo, *dstinfo; /* same as pos and dst, but NULL if not part of current segment */ int segs=0,dir; /* number of segments added to graph, direction of first segment */ int val1=INT_MAX,val2=INT_MAX; /* total cost for s1 and s2, respectively */ int val,val1_new,val2_new; struct route_path *ret; if (! pos->street || ! dst->street) { dbg(lvl_error,"pos or dest not set\n"); return NULL; } if (profile->mode == 2 || (profile->mode == 0 && pos->lenextra + dst->lenextra > transform_distance(map_projection(pos->street->item.map), &pos->c, &dst->c))) return route_path_new_offroad(this, pos, dst); while ((s=route_graph_get_segment(this, pos->street, s))) { val=route_value_seg(profile, NULL, s, 2); if (val != INT_MAX && s->end->value != INT_MAX) { val=val*(100-pos->percent)/100; dbg(lvl_debug,"val1 %d\n",val); if (route_graph_segment_match(s,this->avoid_seg) && pos->street_direction < 0) val+=profile->turn_around_penalty; dbg(lvl_debug,"val1 %d\n",val); val1_new=s->end->value+val; dbg(lvl_debug,"val1 +%d=%d\n",s->end->value,val1_new); if (val1_new < val1) { val1=val1_new; s1=s; } } val=route_value_seg(profile, NULL, s, -2); if (val != INT_MAX && s->start->value != INT_MAX) { val=val*pos->percent/100; dbg(lvl_debug,"val2 %d\n",val); if (route_graph_segment_match(s,this->avoid_seg) && pos->street_direction > 0) val+=profile->turn_around_penalty; dbg(lvl_debug,"val2 %d\n",val); val2_new=s->start->value+val; dbg(lvl_debug,"val2 +%d=%d\n",s->start->value,val2_new); if (val2_new < val2) { val2=val2_new; s2=s; } } } if (val1 == INT_MAX && val2 == INT_MAX) { dbg(lvl_error,"no route found, pos blocked\n"); return NULL; } if (val1 == val2) { val1=s1->end->value; val2=s2->start->value; } if (val1 < val2) { start=s1->start; s=s1; dir=1; } else { start=s2->end; s=s2; dir=-1; } if (pos->street_direction && dir != pos->street_direction && profile->turn_around_penalty) { if (!route_graph_segment_match(this->avoid_seg,s)) { dbg(lvl_debug,"avoid current segment\n"); if (this->avoid_seg) route_graph_set_traffic_distortion(this, this->avoid_seg, 0); this->avoid_seg=s; route_graph_set_traffic_distortion(this, this->avoid_seg, profile->turn_around_penalty); route_graph_reset(this); route_graph_flood(this, dst, profile, NULL); return route_path_new(this, oldpath, pos, dst, profile); } } ret=g_new0(struct route_path, 1); ret->in_use=1; ret->updated=1; if (pos->lenextra) route_path_add_line(ret, &pos->c, &pos->lp, pos->lenextra); ret->path_hash=item_hash_new(); dstinfo=NULL; posinfo=pos; while (s && !dstinfo) { /* following start->seg, which indicates the least costly way to reach our destination */ segs++; #if 0 printf("start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y); #endif if (s->start == start) { if (item_is_equal(s->data.item, dst->street->item) && (s->end->seg == s || !posinfo)) dstinfo=dst; if (!route_path_add_item_from_graph(ret, oldpath, s, 1, posinfo, dstinfo)) ret->updated=0; start=s->end; } else { if (item_is_equal(s->data.item, dst->street->item) && (s->start->seg == s || !posinfo)) dstinfo=dst; if (!route_path_add_item_from_graph(ret, oldpath, s, -1, posinfo, dstinfo)) ret->updated=0; start=s->start; } posinfo=NULL; s=start->seg; } if (dst->lenextra) route_path_add_line(ret, &dst->lp, &dst->c, dst->lenextra); dbg(lvl_debug, "%d segments\n", segs); return ret; } static int route_graph_build_next_map(struct route_graph *rg) { do { rg->m=mapset_next(rg->h, 2); if (! rg->m) return 0; map_rect_destroy(rg->mr); rg->mr=map_rect_new(rg->m, rg->sel); } while (!rg->mr); return 1; } static int is_turn_allowed(struct route_graph_point *p, struct route_graph_segment *from, struct route_graph_segment *to) { struct route_graph_point *prev,*next; struct route_graph_segment *tmp1,*tmp2; if (item_is_equal(from->data.item, to->data.item)) return 0; if (from->start == p) prev=from->end; else prev=from->start; if (to->start == p) next=to->end; else next=to->start; tmp1=p->end; while (tmp1) { if (tmp1->start->c.x == prev->c.x && tmp1->start->c.y == prev->c.y && (tmp1->data.item.type == type_street_turn_restriction_no || tmp1->data.item.type == type_street_turn_restriction_only)) { tmp2=p->start; dbg(lvl_debug,"found %s (0x%x,0x%x) (0x%x,0x%x)-(0x%x,0x%x) %p-%p\n",item_to_name(tmp1->data.item.type),tmp1->data.item.id_hi,tmp1->data.item.id_lo,tmp1->start->c.x,tmp1->start->c.y,tmp1->end->c.x,tmp1->end->c.y,tmp1->start,tmp1->end); while (tmp2) { dbg(lvl_debug,"compare %s (0x%x,0x%x) (0x%x,0x%x)-(0x%x,0x%x) %p-%p\n",item_to_name(tmp2->data.item.type),tmp2->data.item.id_hi,tmp2->data.item.id_lo,tmp2->start->c.x,tmp2->start->c.y,tmp2->end->c.x,tmp2->end->c.y,tmp2->start,tmp2->end); if (item_is_equal(tmp1->data.item, tmp2->data.item)) break; tmp2=tmp2->start_next; } dbg(lvl_debug,"tmp2=%p\n",tmp2); if (tmp2) { dbg(lvl_debug,"%s tmp2->end=%p next=%p\n",item_to_name(tmp1->data.item.type),tmp2->end,next); } if (tmp1->data.item.type == type_street_turn_restriction_no && tmp2 && tmp2->end->c.x == next->c.x && tmp2->end->c.y == next->c.y) { dbg(lvl_debug,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x not allowed (no)\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); return 0; } if (tmp1->data.item.type == type_street_turn_restriction_only && tmp2 && (tmp2->end->c.x != next->c.x || tmp2->end->c.y != next->c.y)) { dbg(lvl_debug,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x not allowed (only)\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); return 0; } } tmp1=tmp1->end_next; } dbg(lvl_debug,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x allowed\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); return 1; } static void route_graph_clone_segment(struct route_graph *this, struct route_graph_segment *s, struct route_graph_point *start, struct route_graph_point *end, int flags) { struct route_graph_segment_data data; data.flags=s->data.flags|flags; data.offset=1; data.maxspeed=-1; data.item=&s->data.item; data.len=s->data.len+1; if (s->data.flags & AF_SPEED_LIMIT) data.maxspeed=RSD_MAXSPEED(&s->data); if (s->data.flags & AF_SEGMENTED) data.offset=RSD_OFFSET(&s->data); dbg(lvl_debug,"cloning segment from %p (0x%x,0x%x) to %p (0x%x,0x%x)\n",start,start->c.x,start->c.y, end, end->c.x, end->c.y); route_graph_add_segment(this, start, end, &data); } static void route_graph_process_restriction_segment(struct route_graph *this, struct route_graph_point *p, struct route_graph_segment *s, int dir) { struct route_graph_segment *tmp; struct route_graph_point *pn; struct coord c=p->c; int dx=0; int dy=0; c.x+=dx; c.y+=dy; dbg(lvl_debug,"From %s %d,%d\n",item_to_name(s->data.item.type),dx,dy); pn=route_graph_point_new(this, &c); if (dir > 0) { /* going away */ dbg(lvl_debug,"other 0x%x,0x%x\n",s->end->c.x,s->end->c.y); if (s->data.flags & AF_ONEWAY) { dbg(lvl_debug,"Not possible\n"); return; } route_graph_clone_segment(this, s, pn, s->end, AF_ONEWAYREV); } else { /* coming in */ dbg(lvl_debug,"other 0x%x,0x%x\n",s->start->c.x,s->start->c.y); if (s->data.flags & AF_ONEWAYREV) { dbg(lvl_debug,"Not possible\n"); return; } route_graph_clone_segment(this, s, s->start, pn, AF_ONEWAY); } tmp=p->start; while (tmp) { if (tmp != s && tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only && !(tmp->data.flags & AF_ONEWAYREV) && is_turn_allowed(p, s, tmp)) { route_graph_clone_segment(this, tmp, pn, tmp->end, AF_ONEWAY); dbg(lvl_debug,"To start %s\n",item_to_name(tmp->data.item.type)); } tmp=tmp->start_next; } tmp=p->end; while (tmp) { if (tmp != s && tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only && !(tmp->data.flags & AF_ONEWAY) && is_turn_allowed(p, s, tmp)) { route_graph_clone_segment(this, tmp, tmp->start, pn, AF_ONEWAYREV); dbg(lvl_debug,"To end %s\n",item_to_name(tmp->data.item.type)); } tmp=tmp->end_next; } } static void route_graph_process_restriction_point(struct route_graph *this, struct route_graph_point *p) { struct route_graph_segment *tmp; tmp=p->start; dbg(lvl_debug,"node 0x%x,0x%x\n",p->c.x,p->c.y); while (tmp) { if (tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only) route_graph_process_restriction_segment(this, p, tmp, 1); tmp=tmp->start_next; } tmp=p->end; while (tmp) { if (tmp->data.item.type != type_street_turn_restriction_no && tmp->data.item.type != type_street_turn_restriction_only) route_graph_process_restriction_segment(this, p, tmp, -1); tmp=tmp->end_next; } p->flags |= RP_TURN_RESTRICTION_RESOLVED; } static void route_graph_process_restrictions(struct route_graph *this) { struct route_graph_point *curr; int i; dbg(lvl_debug,"enter\n"); for (i = 0 ; i < HASH_SIZE ; i++) { curr=this->hash[i]; while (curr) { if (curr->flags & RP_TURN_RESTRICTION) route_graph_process_restriction_point(this, curr); curr=curr->hash_next; } } } static void route_graph_build_done(struct route_graph *rg, int cancel) { dbg(lvl_debug,"cancel=%d\n",cancel); if (rg->idle_ev) event_remove_idle(rg->idle_ev); if (rg->idle_cb) callback_destroy(rg->idle_cb); map_rect_destroy(rg->mr); mapset_close(rg->h); route_free_selection(rg->sel); rg->idle_ev=NULL; rg->idle_cb=NULL; rg->mr=NULL; rg->h=NULL; rg->sel=NULL; if (! cancel) { route_graph_process_restrictions(rg); callback_call_0(rg->done_cb); } rg->busy=0; } static void route_graph_build_idle(struct route_graph *rg, struct vehicleprofile *profile) { int count=1000; struct item *item; while (count > 0) { for (;;) { item=map_rect_get_item(rg->mr); if (item) break; if (!route_graph_build_next_map(rg)) { route_graph_build_done(rg, 0); return; } } if (item->type == type_traffic_distortion) route_process_traffic_distortion(rg, item); else if (item->type == type_street_turn_restriction_no || item->type == type_street_turn_restriction_only) route_process_turn_restriction(rg, item); else route_process_street_graph(rg, item, profile); count--; } } /** * @brief Builds a new route graph from a mapset * * This function builds a new route graph from a map. Please note that this function does not * add any routing information to the route graph - this has to be done via the route_graph_flood() * function. * * The function does not create a graph covering the whole map, but only covering the rectangle * between c1 and c2. * * @param ms The mapset to build the route graph from * @param c The coordinates of the destination or next waypoint * @param c1 Corner 1 of the rectangle to use from the map * @param c2 Corner 2 of the rectangle to use from the map * @param done_cb The callback which will be called when graph is complete * @return The new route graph. */ // FIXME documentation does not match argument list static struct route_graph * route_graph_build(struct mapset *ms, struct coord *c, int count, struct callback *done_cb, int async, struct vehicleprofile *profile) { struct route_graph *ret=g_new0(struct route_graph, 1); dbg(lvl_debug,"enter\n"); ret->sel=route_calc_selection(c, count, profile); ret->h=mapset_open(ms); ret->done_cb=done_cb; ret->busy=1; if (route_graph_build_next_map(ret)) { if (async) { ret->idle_cb=callback_new_2(callback_cast(route_graph_build_idle), ret, profile); ret->idle_ev=event_add_idle(50, ret->idle_cb); } } else route_graph_build_done(ret, 0); return ret; } static void route_graph_update_done(struct route *this, struct callback *cb) { route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, cb); } /** * @brief Updates the route graph * * This updates the route graph after settings in the route have changed. It also * adds routing information afterwards by calling route_graph_flood(). * * @param this The route to update the graph for * @param cb The callback function to call when the route graph update is complete (used only in asynchronous mode) * @param async Set to nonzero in order to update the route graph asynchronously */ static void route_graph_update(struct route *this, struct callback *cb, int async) { struct attr route_status; struct coord *c=g_alloca(sizeof(struct coord)*(1+g_list_length(this->destinations))); int i=0; GList *tmp; route_status.type=attr_route_status; route_graph_destroy(this->graph); this->graph=NULL; callback_destroy(this->route_graph_done_cb); this->route_graph_done_cb=callback_new_2(callback_cast(route_graph_update_done), this, cb); route_status.u.num=route_status_building_graph; route_set_attr(this, &route_status); c[i++]=this->pos->c; tmp=this->destinations; while (tmp) { struct route_info *dst=tmp->data; c[i++]=dst->c; tmp=g_list_next(tmp); } this->graph=route_graph_build(this->ms, c, i, this->route_graph_done_cb, async, this->vehicleprofile); if (! async) { while (this->graph->busy) route_graph_build_idle(this->graph, this->vehicleprofile); } } /** * @brief Gets street data for an item * * @param item The item to get the data for * @return Street data for the item */ struct street_data * street_get_data (struct item *item) { int count=0,*flags; struct street_data *ret = NULL, *ret1; struct attr flags_attr, maxspeed_attr; const int step = 128; int c; do { ret1=g_realloc(ret, sizeof(struct street_data)+(count+step)*sizeof(struct coord)); if (!ret1) { if (ret) g_free(ret); return NULL; } ret = ret1; c = item_coord_get(item, &ret->c[count], step); count += c; } while (c && c == step); ret1=g_realloc(ret, sizeof(struct street_data)+count*sizeof(struct coord)); if (ret1) ret = ret1; ret->item=*item; ret->count=count; if (item_attr_get(item, attr_flags, &flags_attr)) ret->flags=flags_attr.u.num; else { flags=item_get_default_flags(item->type); if (flags) ret->flags=*flags; else ret->flags=0; } ret->maxspeed = -1; if (ret->flags & AF_SPEED_LIMIT) { if (item_attr_get(item, attr_maxspeed, &maxspeed_attr)) { ret->maxspeed = maxspeed_attr.u.num; } } return ret; } /** * @brief Copies street data * * @param orig The street data to copy * @return The copied street data */ struct street_data * street_data_dup(struct street_data *orig) { struct street_data *ret; int size=sizeof(struct street_data)+orig->count*sizeof(struct coord); ret=g_malloc(size); memcpy(ret, orig, size); return ret; } /** * @brief Frees street data * * @param sd Street data to be freed */ void street_data_free(struct street_data *sd) { g_free(sd); } /** * @brief Finds the nearest street to a given coordinate * * @param ms The mapset to search in for the street * @param pc The coordinate to find a street nearby * @return The nearest street */ static struct route_info * route_find_nearest_street(struct vehicleprofile *vehicleprofile, struct mapset *ms, struct pcoord *pc) { struct route_info *ret=NULL; int max_dist=1000; struct map_selection *sel; int dist,mindist=0,pos; struct mapset_handle *h; struct map *m; struct map_rect *mr; struct item *item; struct coord lp; struct street_data *sd; struct coord c; struct coord_geo g; if(!vehicleprofile) return NULL; ret=g_new0(struct route_info, 1); mindist = INT_MAX; h=mapset_open(ms); while ((m=mapset_next(h,2))) { c.x = pc->x; c.y = pc->y; if (map_projection(m) != pc->pro) { transform_to_geo(pc->pro, &c, &g); transform_from_geo(map_projection(m), &g, &c); } sel = route_rect(18, &c, &c, 0, max_dist); if (!sel) continue; mr=map_rect_new(m, sel); if (!mr) { map_selection_destroy(sel); continue; } while ((item=map_rect_get_item(mr))) { if (item_get_default_flags(item->type)) { sd=street_get_data(item); if (!sd) continue; dist=transform_distance_polyline_sq(sd->c, sd->count, &c, &lp, &pos); if (dist < mindist && ( (sd->flags & vehicleprofile->flags_forward_mask) == vehicleprofile->flags || (sd->flags & vehicleprofile->flags_reverse_mask) == vehicleprofile->flags)) { mindist = dist; if (ret->street) { street_data_free(ret->street); } ret->c=c; ret->lp=lp; ret->pos=pos; ret->street=sd; dbg(lvl_debug,"dist=%d id 0x%x 0x%x pos=%d\n", dist, item->id_hi, item->id_lo, pos); } else { street_data_free(sd); } } } map_selection_destroy(sel); map_rect_destroy(mr); } mapset_close(h); if (!ret->street || mindist > max_dist*max_dist) { if (ret->street) { street_data_free(ret->street); dbg(lvl_debug,"Much too far %d > %d\n", mindist, max_dist); } g_free(ret); ret = NULL; } return ret; } /** * @brief Destroys a route_info * * @param info The route info to be destroyed */ void route_info_free(struct route_info *inf) { if (!inf) return; if (inf->street) street_data_free(inf->street); g_free(inf); } #include "point.h" /** * @brief Returns street data for a route info * * @param rinf The route info to return the street data for * @return Street data for the route info */ struct street_data * route_info_street(struct route_info *rinf) { return rinf->street; } #if 0 struct route_crossings * route_crossings_get(struct route *this, struct coord *c) { struct route_point *pnt; struct route_segment *seg; int crossings=0; struct route_crossings *ret; pnt=route_graph_get_point(this, c); seg=pnt->start; while (seg) { printf("start: 0x%x 0x%x\n", seg->item.id_hi, seg->item.id_lo); crossings++; seg=seg->start_next; } seg=pnt->end; while (seg) { printf("end: 0x%x 0x%x\n", seg->item.id_hi, seg->item.id_lo); crossings++; seg=seg->end_next; } ret=g_malloc(sizeof(struct route_crossings)+crossings*sizeof(struct route_crossing)); ret->count=crossings; return ret; } #endif struct map_rect_priv { struct route_info_handle *ri; enum attr_type attr_next; int pos; struct map_priv *mpriv; struct item item; unsigned int last_coord; struct route_path *path; struct route_path_segment *seg,*seg_next; struct route_graph_point *point; struct route_graph_segment *rseg; char *str; int hash_bucket; struct coord *coord_sel; /**< Set this to a coordinate if you want to filter for just a single route graph point */ struct route_graph_point_iterator it; /* Pointer to current waypoint element of route->destinations */ GList *dest; }; static void rm_coord_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; mr->last_coord = 0; } static void rm_attr_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; mr->attr_next = attr_street_item; } static int rm_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr = priv_data; struct route_path_segment *seg=mr->seg; struct route *route=mr->mpriv->route; if (mr->item.type != type_street_route && mr->item.type != type_waypoint && mr->item.type != type_route_end) return 0; attr->type=attr_type; switch (attr_type) { case attr_any: while (mr->attr_next != attr_none) { if (rm_attr_get(priv_data, mr->attr_next, attr)) return 1; } return 0; case attr_maxspeed: mr->attr_next = attr_street_item; if (seg && seg->data->flags & AF_SPEED_LIMIT) { attr->u.num=RSD_MAXSPEED(seg->data); } else { return 0; } return 1; case attr_street_item: mr->attr_next=attr_direction; if (seg && seg->data->item.map) attr->u.item=&seg->data->item; else return 0; return 1; case attr_direction: mr->attr_next=attr_route; if (seg) attr->u.num=seg->direction; else return 0; return 1; case attr_route: mr->attr_next=attr_length; attr->u.route = mr->mpriv->route; return 1; case attr_length: mr->attr_next=attr_time; if (seg) attr->u.num=seg->data->len; else return 0; return 1; case attr_time: mr->attr_next=attr_speed; if (seg) attr->u.num=route_time_seg(route->vehicleprofile, seg->data, NULL); else return 0; return 1; case attr_speed: mr->attr_next=attr_label; if (seg) attr->u.num=route_seg_speed(route->vehicleprofile, seg->data, NULL); else return 0; return 1; case attr_label: mr->attr_next=attr_none; if(mr->item.type==type_waypoint || mr->item.type == type_route_end) { if(mr->str) g_free(mr->str); mr->str=g_strdup_printf("%d",route->reached_destinations_count+g_list_position(route->destinations,mr->dest)+1); attr->u.str=mr->str; return 1; } return 0; default: mr->attr_next=attr_none; attr->type=attr_none; return 0; } return 0; } static int rm_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr = priv_data; struct route_path_segment *seg = mr->seg; int i,rc=0; struct route *r = mr->mpriv->route; enum projection pro = route_projection(r); if (pro == projection_none) return 0; if (mr->item.type == type_route_start || mr->item.type == type_route_start_reverse || mr->item.type == type_route_end || mr->item.type == type_waypoint ) { if (! count || mr->last_coord) return 0; mr->last_coord=1; if (mr->item.type == type_route_start || mr->item.type == type_route_start_reverse) c[0]=r->pos->c; else if (mr->item.type == type_waypoint) { c[0]=((struct route_info *)mr->dest->data)->c; } else { /*type_route_end*/ c[0]=route_get_dst(r)->c; } return 1; } if (! seg) return 0; for (i=0; i < count; i++) { if (mr->last_coord >= seg->ncoords) break; if (i >= seg->ncoords) break; if (pro != projection_mg) transform_from_to(&seg->c[mr->last_coord++], pro, &c[i],projection_mg); else c[i] = seg->c[mr->last_coord++]; rc++; } dbg(lvl_debug,"return %d\n",rc); return rc; } static struct item_methods methods_route_item = { rm_coord_rewind, rm_coord_get, rm_attr_rewind, rm_attr_get, }; static void rp_attr_rewind(void *priv_data) { struct map_rect_priv *mr = priv_data; mr->attr_next = attr_label; } static int rp_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr = priv_data; struct route_graph_point *p = mr->point; struct route_graph_segment *seg = mr->rseg; struct route *route=mr->mpriv->route; attr->type=attr_type; switch (attr_type) { case attr_any: // works only with rg_points for now while (mr->attr_next != attr_none) { dbg(lvl_debug,"querying %s\n", attr_to_name(mr->attr_next)); if (rp_attr_get(priv_data, mr->attr_next, attr)) return 1; } return 0; case attr_maxspeed: mr->attr_next = attr_label; if (mr->item.type != type_rg_segment) return 0; if (seg && (seg->data.flags & AF_SPEED_LIMIT)) { attr->type = attr_maxspeed; attr->u.num=RSD_MAXSPEED(&seg->data); return 1; } else { return 0; } case attr_label: mr->attr_next=attr_street_item; attr->type = attr_label; if (mr->str) g_free(mr->str); if (mr->item.type == type_rg_point) { if (p->value != INT_MAX) mr->str=g_strdup_printf("%d", p->value); else mr->str=g_strdup("-"); } else { int len=seg->data.len; int speed=route_seg_speed(route->vehicleprofile, &seg->data, NULL); int time=route_time_seg(route->vehicleprofile, &seg->data, NULL); if (speed) mr->str=g_strdup_printf("%dm %dkm/h %d.%ds",len,speed,time/10,time%10); else if (len) mr->str=g_strdup_printf("%dm",len); else { mr->str=NULL; return 0; } } attr->u.str = mr->str; return 1; case attr_street_item: mr->attr_next=attr_flags; if (mr->item.type != type_rg_segment) return 0; if (seg && seg->data.item.map) attr->u.item=&seg->data.item; else return 0; return 1; case attr_flags: mr->attr_next = attr_direction; if (mr->item.type != type_rg_segment) return 0; if (seg) { attr->u.num = seg->data.flags; } else { return 0; } return 1; case attr_direction: mr->attr_next = attr_debug; // This only works if the map has been opened at a single point, and in that case indicates if the // segment returned last is connected to this point via its start (1) or its end (-1) if (!mr->coord_sel || (mr->item.type != type_rg_segment)) return 0; if (seg->start == mr->point) { attr->u.num=1; } else if (seg->end == mr->point) { attr->u.num=-1; } else { return 0; } return 1; case attr_debug: mr->attr_next=attr_none; if (mr->str) g_free(mr->str); mr->str=NULL; switch (mr->item.type) { case type_rg_point: { struct route_graph_segment *tmp; int start=0; int end=0; tmp=p->start; while (tmp) { start++; tmp=tmp->start_next; } tmp=p->end; while (tmp) { end++; tmp=tmp->end_next; } mr->str=g_strdup_printf("%d %d %p (0x%x,0x%x)", start, end, p, p->c.x, p->c.y); attr->u.str = mr->str; } return 1; case type_rg_segment: if (! seg) return 0; mr->str=g_strdup_printf("len %d time %d start %p end %p",seg->data.len, route_time_seg(route->vehicleprofile, &seg->data, NULL), seg->start, seg->end); attr->u.str = mr->str; return 1; default: return 0; } default: mr->attr_next=attr_none; attr->type=attr_none; return 0; } } /** * @brief Returns the coordinates of a route graph item * * @param priv_data The route graph item's private data * @param c Pointer where to store the coordinates * @param count How many coordinates to get at a max? * @return The number of coordinates retrieved */ static int rp_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *mr = priv_data; struct route_graph_point *p = mr->point; struct route_graph_segment *seg = mr->rseg; int rc = 0,i,dir; struct route *r = mr->mpriv->route; enum projection pro = route_projection(r); if (pro == projection_none) return 0; for (i=0; i < count; i++) { if (mr->item.type == type_rg_point) { if (mr->last_coord >= 1) break; if (pro != projection_mg) transform_from_to(&p->c, pro, &c[i],projection_mg); else c[i] = p->c; } else { if (mr->last_coord >= 2) break; dir=0; if (seg->end->seg == seg) dir=1; if (mr->last_coord) dir=1-dir; if (dir) { if (pro != projection_mg) transform_from_to(&seg->end->c, pro, &c[i],projection_mg); else c[i] = seg->end->c; } else { if (pro != projection_mg) transform_from_to(&seg->start->c, pro, &c[i],projection_mg); else c[i] = seg->start->c; } } mr->last_coord++; rc++; } return rc; } static struct item_methods methods_point_item = { rm_coord_rewind, rp_coord_get, rp_attr_rewind, rp_attr_get, }; static void rp_destroy(struct map_priv *priv) { g_free(priv); } static void rm_destroy(struct map_priv *priv) { g_free(priv); } static struct map_rect_priv * rm_rect_new(struct map_priv *priv, struct map_selection *sel) { struct map_rect_priv * mr; dbg(lvl_debug,"enter\n"); #if 0 if (! route_get_pos(priv->route)) return NULL; if (! route_get_dst(priv->route)) return NULL; #endif #if 0 if (! priv->route->path2) return NULL; #endif mr=g_new0(struct map_rect_priv, 1); mr->mpriv = priv; mr->item.priv_data = mr; mr->item.type = type_none; mr->item.meth = &methods_route_item; if (priv->route->path2) { mr->path=priv->route->path2; mr->seg_next=mr->path->path; mr->path->in_use++; } else mr->seg_next=NULL; return mr; } /** * @brief Opens a new map rectangle on the route graph's map * * This function opens a new map rectangle on the route graph's map. * The "sel" parameter enables you to only search for a single route graph * point on this map (or exactly: open a map rectangle that only contains * this one point). To do this, pass here a single map selection, whose * c_rect has both coordinates set to the same point. Otherwise this parameter * has no effect. * * @param priv The route graph map's private data * @param sel Here it's possible to specify a point for which to search. Please read the function's description. * @return A new map rect's private data */ static struct map_rect_priv * rp_rect_new(struct map_priv *priv, struct map_selection *sel) { struct map_rect_priv * mr; dbg(lvl_debug,"enter\n"); if (! priv->route->graph) return NULL; mr=g_new0(struct map_rect_priv, 1); mr->mpriv = priv; mr->item.priv_data = mr; mr->item.type = type_rg_point; mr->item.meth = &methods_point_item; if (sel) { if ((sel->u.c_rect.lu.x == sel->u.c_rect.rl.x) && (sel->u.c_rect.lu.y == sel->u.c_rect.rl.y)) { mr->coord_sel = g_malloc(sizeof(struct coord)); *(mr->coord_sel) = sel->u.c_rect.lu; } } return mr; } static void rm_rect_destroy(struct map_rect_priv *mr) { if (mr->str) g_free(mr->str); if (mr->coord_sel) { g_free(mr->coord_sel); } if (mr->path) { mr->path->in_use--; if (mr->path->update_required && (mr->path->in_use==1) && (mr->mpriv->route->route_status & ~route_status_destination_set)) route_path_update_done(mr->mpriv->route, mr->path->update_required-1); else if (!mr->path->in_use) g_free(mr->path); } g_free(mr); } static struct item * rp_get_item(struct map_rect_priv *mr) { struct route *r = mr->mpriv->route; struct route_graph_point *p = mr->point; struct route_graph_segment *seg = mr->rseg; if (mr->item.type == type_rg_point) { if (mr->coord_sel) { // We are supposed to return only the point at one specified coordinate... if (!p) { p = route_graph_get_point_last(r->graph, mr->coord_sel); if (!p) { mr->point = NULL; // This indicates that no point has been found } else { mr->it = rp_iterator_new(p); } } else { p = NULL; } } else { if (!p) { mr->hash_bucket=0; p = r->graph->hash[0]; } else p=p->hash_next; while (!p) { mr->hash_bucket++; if (mr->hash_bucket >= HASH_SIZE) break; p = r->graph->hash[mr->hash_bucket]; } } if (p) { mr->point = p; mr->item.id_lo++; rm_coord_rewind(mr); rp_attr_rewind(mr); return &mr->item; } else mr->item.type = type_rg_segment; } if (mr->coord_sel) { if (!mr->point) { /* This means that no point has been found */ return NULL; } seg = rp_iterator_next(&(mr->it)); } else { if (!seg) seg=r->graph->route_segments; else seg=seg->next; } if (seg) { mr->rseg = seg; mr->item.id_lo++; rm_coord_rewind(mr); rp_attr_rewind(mr); return &mr->item; } return NULL; } static struct item * rp_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct item *ret=NULL; while (id_lo-- > 0) ret=rp_get_item(mr); return ret; } static struct item * rm_get_item(struct map_rect_priv *mr) { struct route *route=mr->mpriv->route; void *id=0; switch (mr->item.type) { case type_none: if (route->pos && route->pos->street_direction && route->pos->street_direction != route->pos->dir) mr->item.type=type_route_start_reverse; else mr->item.type=type_route_start; if (route->pos) { id=route->pos; break; } case type_route_start: case type_route_start_reverse: mr->seg=NULL; mr->dest=mr->mpriv->route->destinations; default: if (mr->item.type == type_waypoint) mr->dest=g_list_next(mr->dest); mr->item.type=type_street_route; mr->seg=mr->seg_next; if (!mr->seg && mr->path && mr->path->next) { struct route_path *p=NULL; mr->path->in_use--; if (!mr->path->in_use) p=mr->path; mr->path=mr->path->next; mr->path->in_use++; mr->seg=mr->path->path; if (p) g_free(p); if (mr->dest) { id=mr->dest; mr->item.type=type_waypoint; mr->seg_next=mr->seg; break; } } if (mr->seg) { mr->seg_next=mr->seg->next; id=mr->seg; break; } if (mr->dest && g_list_next(mr->dest)) { id=mr->dest; mr->item.type=type_waypoint; break; } mr->item.type=type_route_end; id=&(mr->mpriv->route->destinations); if (mr->mpriv->route->destinations) break; case type_route_end: return NULL; } mr->last_coord = 0; item_id_from_ptr(&mr->item,id); rm_attr_rewind(mr); return &mr->item; } static struct item * rm_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { struct item *ret=NULL; do { ret=rm_get_item(mr); } while (ret && (ret->id_lo!=id_lo || ret->id_hi!=id_hi)); return ret; } static struct map_methods route_meth = { projection_mg, "utf-8", rm_destroy, rm_rect_new, rm_rect_destroy, rm_get_item, rm_get_item_byid, NULL, NULL, NULL, }; static struct map_methods route_graph_meth = { projection_mg, "utf-8", rp_destroy, rp_rect_new, rm_rect_destroy, rp_get_item, rp_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * route_map_new_helper(struct map_methods *meth, struct attr **attrs, int graph) { struct map_priv *ret; struct attr *route_attr; route_attr=attr_search(attrs, NULL, attr_route); if (! route_attr) return NULL; ret=g_new0(struct map_priv, 1); if (graph) *meth=route_graph_meth; else *meth=route_meth; ret->route=route_attr->u.route; return ret; } static struct map_priv * route_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { return route_map_new_helper(meth, attrs, 0); } static struct map_priv * route_graph_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { return route_map_new_helper(meth, attrs, 1); } static struct map * route_get_map_helper(struct route *this_, struct map **map, char *type, char *description) { struct attr *attrs[5]; struct attr a_type,navigation,data,a_description; a_type.type=attr_type; a_type.u.str=type; navigation.type=attr_route; navigation.u.route=this_; data.type=attr_data; data.u.str=""; a_description.type=attr_description; a_description.u.str=description; attrs[0]=&a_type; attrs[1]=&navigation; attrs[2]=&data; attrs[3]=&a_description; attrs[4]=NULL; if (! *map) { *map=map_new(NULL, attrs); navit_object_ref((struct navit_object *)*map); } return *map; } /** * @brief Returns a new map containing the route path * * This function returns a new map containing the route path. * * @important Do not map_destroy() this! * * @param this_ The route to get the map of * @return A new map containing the route path */ struct map * route_get_map(struct route *this_) { return route_get_map_helper(this_, &this_->map, "route","Route"); } /** * @brief Returns a new map containing the route graph * * This function returns a new map containing the route graph. * * @important Do not map_destroy() this! * * @param this_ The route to get the map of * @return A new map containing the route graph */ struct map * route_get_graph_map(struct route *this_) { return route_get_map_helper(this_, &this_->graph_map, "route_graph","Route Graph"); } /** * @brief Returns the flags for the route. */ enum route_path_flags route_get_flags(struct route *this_) { return this_->flags; } /** * @brief Whether the route has a valid graph. * * @return True if the route has a graph, false if not. */ int route_has_graph(struct route *this_) { return (this_->graph != NULL); } void route_set_projection(struct route *this_, enum projection pro) { } int route_set_attr(struct route *this_, struct attr *attr) { int attr_updated=0; switch (attr->type) { case attr_route_status: attr_updated = (this_->route_status != attr->u.num); this_->route_status = attr->u.num; break; case attr_destination: route_set_destination(this_, attr->u.pcoord, 1); return 1; case attr_position: route_set_position_flags(this_, attr->u.pcoord, route_path_flag_async); return 1; case attr_position_test: return route_set_position_flags(this_, attr->u.pcoord, route_path_flag_no_rebuild); case attr_vehicle: attr_updated = (this_->v != attr->u.vehicle); this_->v=attr->u.vehicle; if (attr_updated) { struct attr g; struct pcoord pc; struct coord c; if (vehicle_get_attr(this_->v, attr_position_coord_geo, &g, NULL)) { pc.pro=projection_mg; transform_from_geo(projection_mg, g.u.coord_geo, &c); pc.x=c.x; pc.y=c.y; route_set_position(this_, &pc); } } break; default: dbg(lvl_error,"unsupported attribute: %s\n",attr_to_name(attr->type)); return 0; } if (attr_updated) callback_list_call_attr_2(this_->cbl2, attr->type, this_, attr); return 1; } int route_add_attr(struct route *this_, struct attr *attr) { switch (attr->type) { case attr_callback: callback_list_add(this_->cbl2, attr->u.callback); return 1; default: return 0; } } int route_remove_attr(struct route *this_, struct attr *attr) { dbg(lvl_debug,"enter\n"); switch (attr->type) { case attr_callback: callback_list_remove(this_->cbl2, attr->u.callback); return 1; case attr_vehicle: this_->v=NULL; return 1; default: return 0; } } int route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret=1; switch (type) { case attr_map: attr->u.map=route_get_map(this_); ret=(attr->u.map != NULL); break; case attr_destination: if (this_->destinations) { struct route_info *dst; if (iter) { if (iter->u.list) { iter->u.list=g_list_next(iter->u.list); } else { iter->u.list=this_->destinations; } if (!iter->u.list) { return 0; } dst = (struct route_info*)iter->u.list->data; } else { //No iter handling dst=route_get_dst(this_); } attr->u.pcoord=&this_->pc; this_->pc.pro=projection_mg; /* fixme */ this_->pc.x=dst->c.x; this_->pc.y=dst->c.y; } else ret=0; break; case attr_vehicle: attr->u.vehicle=this_->v; ret=(this_->v != NULL); dbg(lvl_debug,"get vehicle %p\n",this_->v); break; case attr_vehicleprofile: attr->u.vehicleprofile=this_->vehicleprofile; ret=(this_->vehicleprofile != NULL); break; case attr_route_status: attr->u.num=this_->route_status; break; case attr_destination_time: if (this_->path2 && (this_->route_status == route_status_path_done_new || this_->route_status == route_status_path_done_incremental)) { struct route_path *path=this_->path2; attr->u.num=0; while (path) { attr->u.num+=path->path_time; path=path->next; } dbg(lvl_debug,"path_time %ld\n",attr->u.num); } else ret=0; break; case attr_destination_length: if (this_->path2 && (this_->route_status == route_status_path_done_new || this_->route_status == route_status_path_done_incremental)) { struct route_path *path=this_->path2; attr->u.num=0; while (path) { attr->u.num+=path->path_len; path=path->next; } } else ret=0; break; default: return 0; } attr->type=type; return ret; } struct attr_iter * route_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void route_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } void route_init(void) { plugin_register_map_type("route", route_map_new); plugin_register_map_type("route_graph", route_graph_map_new); } void route_destroy(struct route *this_) { this_->refcount++; /* avoid recursion */ route_path_destroy(this_->path2,1); route_graph_destroy(this_->graph); route_clear_destinations(this_); route_info_free(this_->pos); map_destroy(this_->map); map_destroy(this_->graph_map); g_free(this_); } struct object_func route_func = { attr_route, (object_func_new)route_new, (object_func_get_attr)route_get_attr, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)route_set_attr, (object_func_add_attr)route_add_attr, (object_func_remove_attr)route_remove_attr, (object_func_init)NULL, (object_func_destroy)route_destroy, (object_func_dup)route_dup, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/route.h000066400000000000000000000115461264204753600163630ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file * * @brief Contains exported code for route.c * * This file contains code that works together with route.c and that is exported to * other modules. */ #ifndef NAVIT_ROUTE_H #define NAVIT_ROUTE_H #ifdef __cplusplus extern "C" { #endif enum route_path_flags { route_path_flag_none=0, route_path_flag_cancel=1, route_path_flag_async=2, route_path_flag_no_rebuild=4, }; enum route_status { route_status_no_destination=0, route_status_destination_set=1, route_status_not_found=1|2, route_status_building_path=1|4, route_status_building_graph=1|4|8, route_status_path_done_new=1|16, route_status_path_done_incremental=1|32, }; struct route_crossing { long segid; int dir; }; struct route_crossings { int count; struct route_crossing crossing[0]; }; /** * @brief Information about a street * * This contains information about a certain street */ struct street_data { struct item item; /**< The map item for this street */ int count; /**< Number of coordinates this street has */ int flags; int maxspeed; /**< Maximum speed allowed on this street. */ struct coord c[0]; /**< Pointer to the coordinates of this street. * DO NOT INSERT FIELDS AFTER THIS. */ }; /* prototypes */ enum attr_type; enum projection; struct attr; struct attr_iter; struct coord; struct item; struct map; struct map_selection; struct mapset; struct pcoord; struct route; struct route_info; struct street_data; struct tracking; struct vehicleprofile; struct route *route_new(struct attr *parent, struct attr **attrs); struct route *route_dup(struct route *orig); void route_set_mapset(struct route *this_, struct mapset *ms); void route_set_profile(struct route *this_, struct vehicleprofile *prof); struct mapset *route_get_mapset(struct route *this_); struct route_info *route_get_pos(struct route *this_); struct route_info *route_get_dst(struct route *this_); int route_get_path_set(struct route *this_); int route_contains(struct route *this_, struct item *item); int route_destination_reached(struct route *this_); void route_set_position(struct route *this_, struct pcoord *pos); void route_set_position_from_tracking(struct route *this_, struct tracking *tracking, enum projection pro); struct map_selection *route_rect(int order, struct coord *c1, struct coord *c2, int rel, int abs); void route_set_destinations(struct route *this_, struct pcoord *dst, int count, int async); int route_get_destinations(struct route *this_, struct pcoord *pc, int count); int route_get_destination_count(struct route *this_); void route_get_distances(struct route *this_, struct coord *c, int count, int *distances); void route_set_destination(struct route *this_, struct pcoord *dst, int async); void route_append_destination(struct route *this_, struct pcoord *dst, int async); void route_remove_nth_waypoint(struct route *this_, int n); void route_remove_waypoint(struct route *this_); char* route_get_destination_description(struct route *this_, int n); struct coord route_get_coord_dist(struct route *this_, int dist); struct street_data *street_get_data(struct item *item); struct street_data *street_data_dup(struct street_data *orig); void street_data_free(struct street_data *sd); void route_info_free(struct route_info *inf); struct street_data *route_info_street(struct route_info *rinf); struct map *route_get_map(struct route *this_); struct map *route_get_graph_map(struct route *this_); enum route_path_flags route_get_flags(struct route *this_); int route_has_graph(struct route *this_); void route_set_projection(struct route *this_, enum projection pro); void route_set_destinations(struct route *this_, struct pcoord *dst, int count, int async); int route_set_attr(struct route *this_, struct attr *attr); int route_add_attr(struct route *this_, struct attr *attr); int route_remove_attr(struct route *this_, struct attr *attr); struct attr_iter * route_attr_iter_new(void); void route_attr_iter_destroy(struct attr_iter *iter); int route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); void route_init(void); void route_destroy(struct route *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/script.c000066400000000000000000000060021264204753600165130ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2012 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terscr of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include "item.h" #include "debug.h" #include "event.h" #include "callback.h" #include "command.h" #include "xmlconfig.h" struct script { NAVIT_OBJECT struct attr parent; struct callback *cb; struct event_timeout *timeout; struct command_saved *cs; }; static void script_run(struct script *scr) { struct attr *xml_text=attr_search(scr->attrs, NULL, attr_xml_text); int error; if (!xml_text || !xml_text->u.str) { dbg(lvl_error,"no text\n"); return; } dbg(lvl_debug,"running '%s'\n",xml_text->u.str); command_evaluate_to_void(&scr->parent, xml_text->u.str, &error); } static int script_set_attr_int(struct script *scr, struct attr *attr) { switch (attr->type) { case attr_refresh_cond: dbg(lvl_debug,"refresh_cond\n"); if (scr->cs) command_saved_destroy(scr->cs); scr->cs=command_saved_attr_new(attr->u.str, &scr->parent, scr->cb, 0); return 1; case attr_update_period: if (scr->timeout) event_remove_timeout(scr->timeout); scr->timeout=event_add_timeout(attr->u.num, 1, scr->cb); return 1; default: return 0; } } static struct script * script_new(struct attr *parent, struct attr **attrs) { struct script *scr=g_new0(struct script, 1); scr->func=&script_func; navit_object_ref((struct navit_object *)scr); scr->attrs=attr_list_dup(attrs); attrs=scr->attrs; scr->cb=callback_new_1(callback_cast(script_run), scr); scr->parent=*parent; while (attrs && *attrs) script_set_attr_int(scr, *attrs++); dbg(lvl_debug,"return %p\n",scr); return scr; } static void script_destroy(struct script *scr) { dbg(lvl_debug,"enter %p\n",scr); if (scr->timeout) event_remove_timeout(scr->timeout); if (scr->cs) command_saved_destroy(scr->cs); callback_destroy(scr->cb); attr_list_free(scr->attrs); g_free(scr); } struct object_func script_func = { attr_script, (object_func_new)script_new, (object_func_get_attr)navit_object_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)navit_object_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)script_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/search.c000066400000000000000000000620701264204753600164630ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "projection.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "mapset.h" #include "coord.h" #include "transform.h" #include "search.h" #include "country.h" #include "linguistics.h" #include "geom.h" #include "util.h" #include "search_houseno_interpol.h" #ifdef HAVE_API_ANDROID #include "android.h" #endif #include "layout.h" static struct search_list_result *search_list_result_dup(struct search_list_result *slr); static void search_list_country_destroy(struct search_list_country *this_); static void search_list_town_destroy(struct search_list_town *this_); static void search_list_street_destroy(struct search_list_street *this_); static void search_list_house_number_destroy(struct search_list_house_number *this_); struct search_list_level { struct mapset *ms; struct search_list_common *parent; struct attr *attr; int partial; int selected; struct mapset_search *search; GHashTable *hash; GList *list,*curr,*last; }; struct search_list { struct mapset *ms; struct item *item; int level; struct search_list_level levels[4]; struct search_list_result result; struct search_list_result last_result; int last_result_valid; char *postal; struct house_number_interpolation inter; int use_address_results; GList *address_results,*address_results_pos; }; static guint search_item_hash_hash(gconstpointer key) { const struct item *itm=key; gconstpointer hashkey=(gconstpointer)GINT_TO_POINTER(itm->id_hi^itm->id_lo); return g_direct_hash(hashkey); } static gboolean search_item_hash_equal(gconstpointer a, gconstpointer b) { const struct item *itm_a=a; const struct item *itm_b=b; if (item_is_equal_id(*itm_a, *itm_b)) return TRUE; return FALSE; } /** * @brief Create new instance of search_list to run a search. * * @param ms mapset that is to be searched * @returns new search_list */ struct search_list * search_list_new(struct mapset *ms) { struct search_list *ret; ret=g_new0(struct search_list, 1); ret->ms=ms; return ret; } static void search_list_search_free(struct search_list *sl, int level); /** * @brief Determine search list level for given attr_type. * @param attr_type attribute value * @return corresponding search list level (country=0, town=1, ...) */ int search_list_level(enum attr_type attr_type) { switch(attr_type) { case attr_country_all: case attr_country_id: case attr_country_iso2: case attr_country_iso3: case attr_country_car: case attr_country_name: return 0; case attr_town_postal: return 1; case attr_town_name: case attr_district_name: case attr_town_or_district_name: return 1; case attr_street_name: return 2; case attr_house_number: return 3; case attr_postal: return -1; default: dbg(lvl_error,"unknown search '%s'\n",attr_to_name(attr_type)); return -1; } } static char * search_fix_spaces(char *str) { int i; int len=strlen(str); char c,*s,*d,*ret=g_strdup(str); for (i = 0 ; i < len ; i++) { if (ret[i] == ',' || ret[i] == ',' || ret[i] == '/') ret[i]=' '; } s=ret; d=ret; len=0; do { c=*s++; if (c != ' ' || len != 0) { *d++=c; len++; } while (c == ' ' && *s == ' ') s++; if (c == ' ' && *s == '\0') { d--; len--; } } while (c); return ret; } struct phrase { char *start; char *end; int wordcount; }; static GList * search_split_phrases(char *str) { char *s,*d; int wordcount=0; GList *ret=NULL; s=str; do { d=s; wordcount=0; do { d++; if (*d == ' ' || *d == '\0') { struct phrase *phrase=g_new(struct phrase, 1); phrase->start=s; phrase->end=d; phrase->wordcount=++wordcount; ret=g_list_append(ret, phrase); } } while (*d != '\0'); do { s++; if (*s == ' ') { s++; break; } } while (*s != '\0'); } while (*s != '\0'); return ret; } static char * search_phrase_str(struct phrase *p) { int len=p->end-p->start; char *ret=g_malloc(len+1); strncpy(ret, p->start, len); ret[len]='\0'; return ret; } static int search_phrase_used(struct phrase *p, GList *used_phrases) { while (used_phrases) { struct phrase *pu=used_phrases->data; dbg(lvl_debug,"'%s'-'%s' vs '%s'-'%s'\n",p->start,p->end,pu->start,pu->end); if (p->start < pu->end && p->end > pu->start) return 1; dbg(lvl_debug,"unused\n"); used_phrases=g_list_next(used_phrases); } return 0; } static gint search_by_address_compare(gconstpointer a, gconstpointer b) { const struct search_list_result *slra=a; const struct search_list_result *slrb=b; return slrb->id-slra->id; } static GList * search_by_address_attr(GList *results, struct search_list *sl, GList *phrases, GList *exclude, enum attr_type attr_type, int wordcount) { GList *tmp=phrases; struct attr attr; attr.type=attr_type; while (tmp) { if (!search_phrase_used(tmp->data, exclude)) { struct phrase *p=tmp->data; int count=0,wordcount_all=wordcount+p->wordcount; struct search_list_result *slr; attr.u.str=search_phrase_str(p); dbg(lvl_debug,"%s phrase '%s'\n",attr_to_name(attr_type),attr.u.str); search_list_search(sl, &attr, 0); while ((slr=search_list_get_result(sl))) { if (attr_type != attr_country_all) { struct search_list_result *slrd=search_list_result_dup(slr); slrd->id=wordcount_all; results=g_list_insert_sorted(results, slrd, search_by_address_compare); } count++; } dbg(lvl_debug,"%d results wordcount %d\n",count,wordcount_all); if (count) { GList *used=g_list_prepend(g_list_copy(exclude), tmp->data); enum attr_type new_attr_type=attr_none; switch (attr_type) { case attr_country_all: new_attr_type=attr_town_or_district_name; break; case attr_town_or_district_name: new_attr_type=attr_street_name; break; case attr_street_name: new_attr_type=attr_house_number; break; default: break; } if (new_attr_type != attr_none) results=search_by_address_attr(results, sl, phrases, used, new_attr_type, wordcount_all); g_list_free(used); } g_free(attr.u.str); } tmp=g_list_next(tmp); } return results; } static void search_by_address(struct search_list *this_, char *addr) { char *str=search_fix_spaces(addr); GList *tmp,*phrases=search_split_phrases(str); struct search_list *sl=search_list_new(this_->ms); this_->address_results=search_by_address_attr(NULL, sl, phrases, NULL, attr_country_all, 0); this_->address_results_pos=this_->address_results; search_list_destroy(sl); tmp=phrases; while (tmp) { g_free(tmp->data); tmp=g_list_next(tmp); } g_list_free(phrases); // TODO: Looks like we should g_free(str) here. But this is // currently dead code, so no way to test it. } static void search_address_results_free(struct search_list *this_) { GList *tmp; tmp=this_->address_results; while (tmp) { struct search_list_result *slr=tmp->data; if (slr->country) search_list_country_destroy(slr->country); if (slr->town) search_list_town_destroy(slr->town); if (slr->street) search_list_street_destroy(slr->street); if (slr->house_number) search_list_house_number_destroy(slr->house_number); if (slr->c) g_free(slr->c); g_free(slr); tmp=g_list_next(tmp); } g_list_free(this_->address_results); this_->address_results=this_->address_results_pos=NULL; } /** * @brief Start a search. * * @param this search_list to use for the search * @param search_attr attributes to use for the search * @param partial do partial search? (1=yes,0=no) */ void search_list_search(struct search_list *this_, struct attr *search_attr, int partial) { struct search_list_level *le; int level; dbg(lvl_info,"Starting search for '=%s' of type %s\n", search_attr->u.str, attr_to_name(search_attr->type)); search_address_results_free(this_); if (search_attr->type == attr_address) { search_by_address(this_, search_attr->u.str); this_->use_address_results=1; return; } this_->use_address_results=0; level=search_list_level(search_attr->type); this_->item=NULL; house_number_interpolation_clear_all(&this_->inter); if (level != -1) { this_->result.id=0; this_->level=level; le=&this_->levels[level]; search_list_search_free(this_, level); le->attr=attr_dup(search_attr); le->partial=partial; if (level > 0) { le=&this_->levels[level-1]; le->curr=le->list; } } else if (search_attr->type == attr_postal) { g_free(this_->postal); this_->postal=g_strdup(search_attr->u.str); } } struct search_list_common * search_list_select(struct search_list *this_, enum attr_type attr_type, int id, int mode) { int level; int num; struct search_list_level *le; struct search_list_common *slc; GList *curr; level = search_list_level(attr_type); if (level < 0) return NULL; le=&this_->levels[level]; curr=le->list; if (mode > 0 || !id) le->selected=mode; //dbg(lvl_debug,"enter level=%d %d %d %p\n", level, id, mode, curr); num = 0; while (curr) { num++; if (! id || num == id) { slc=curr->data; slc->selected=mode; if (id) { le->last=curr; //dbg(lvl_debug,"found\n"); return slc; } } curr=g_list_next(curr); } //dbg(lvl_debug,"not found\n"); return NULL; } static void search_list_common_addattr(struct attr* attr,struct search_list_common *common) { common->attrs=attr_generic_prepend_attr(common->attrs,attr); switch(attr->type) { case attr_town_name: common->town_name=common->attrs[0]->u.str; break; case attr_county_name: common->county_name=common->attrs[0]->u.str; break; case attr_district_name: common->district_name=common->attrs[0]->u.str; break; case attr_postal: common->postal=common->attrs[0]->u.str; break; case attr_town_postal: if(!common->postal) common->postal=common->attrs[0]->u.str; break; case attr_postal_mask: common->postal_mask=common->attrs[0]->u.str; break; default: break; } } static void search_list_common_new(struct item *item, struct search_list_common *common) { struct attr attr; int i; enum attr_type common_attrs[]={ attr_state_name, attr_county_name, attr_municipality_name, attr_town_name, attr_district_name, attr_postal, attr_town_postal, attr_postal_mask, attr_none }; common->town_name=NULL; common->district_name=NULL; common->county_name=NULL; common->postal=NULL; common->postal_mask=NULL; common->attrs=NULL; for(i=0;common_attrs[i];i++) { if (item_attr_get(item, common_attrs[i], &attr)) { struct attr at; at.type=attr.type; at.u.str=map_convert_string(item->map, attr.u.str); search_list_common_addattr(&at,common); map_convert_free(at.u.str); } } } static void search_list_common_dup(struct search_list_common *src, struct search_list_common *dst) { int i; if(dst->attrs) { for(i=0;dst->attrs[i];i++) search_list_common_addattr(src->attrs[i],dst); } if (src->c) { dst->c=g_new(struct pcoord, 1); *dst->c=*src->c; } else dst->c=NULL; } static void search_list_common_destroy(struct search_list_common *common) { g_free(common->c); attr_list_free(common->attrs); common->town_name=NULL; common->district_name=NULL; common->county_name=NULL; common->postal=NULL; common->postal_mask=NULL; common->c=NULL; common->attrs=NULL; } static struct search_list_country * search_list_country_new(struct item *item) { struct search_list_country *ret=g_new0(struct search_list_country, 1); struct attr attr; ret->common.item=ret->common.unique=*item; if (item_attr_get(item, attr_country_car, &attr)) ret->car=g_strdup(attr.u.str); if (item_attr_get(item, attr_country_iso2, &attr)) { #ifdef HAVE_API_ANDROID ret->iso2=g_malloc(strlen(attr.u.str)+1); strtolower(ret->iso2, attr.u.str); #else ret->iso2=g_strdup(attr.u.str); #endif ret->flag=g_strdup_printf("country_%s", ret->iso2); } if (item_attr_get(item, attr_country_iso3, &attr)) ret->iso3=g_strdup(attr.u.str); if (item_attr_get(item, attr_country_name, &attr)) ret->name=g_strdup(attr.u.str); return ret; } static struct search_list_country * search_list_country_dup(struct search_list_country *this_) { struct search_list_country *ret=g_new(struct search_list_country, 1); ret->car=g_strdup(this_->car); ret->iso2=g_strdup(this_->iso2); ret->iso3=g_strdup(this_->iso3); ret->flag=g_strdup(this_->flag); ret->name=g_strdup(this_->name); return ret; } static void search_list_country_destroy(struct search_list_country *this_) { g_free(this_->car); g_free(this_->iso2); g_free(this_->iso3); g_free(this_->flag); g_free(this_->name); g_free(this_); } static struct search_list_town * search_list_town_new(struct item *item) { struct search_list_town *ret=g_new0(struct search_list_town, 1); struct attr attr; struct coord c; ret->itemt=*item; ret->common.item=ret->common.unique=*item; if (item_attr_get(item, attr_town_streets_item, &attr)) { dbg(lvl_debug,"town_assoc 0x%x 0x%x\n", attr.u.item->id_hi, attr.u.item->id_lo); ret->common.unique=*attr.u.item; } search_list_common_new(item, &ret->common); if (item_attr_get(item, attr_county_name, &attr)) ret->county=map_convert_string(item->map,attr.u.str); else ret->county=NULL; if (item_coord_get(item, &c, 1)) { ret->common.c=g_new(struct pcoord, 1); ret->common.c->x=c.x; ret->common.c->y=c.y; ret->common.c->pro = map_projection(item->map); } return ret; } static struct search_list_town * search_list_town_dup(struct search_list_town *this_) { struct search_list_town *ret=g_new0(struct search_list_town, 1); ret->county=map_convert_dup(this_->county); search_list_common_dup(&this_->common, &ret->common); return ret; } static void search_list_town_destroy(struct search_list_town *this_) { map_convert_free(this_->county); search_list_common_destroy(&this_->common); g_free(this_); } static struct search_list_street * search_list_street_new(struct item *item) { struct search_list_street *ret=g_new0(struct search_list_street, 1); struct attr attr; struct coord p[1024]; struct coord c; int count; ret->common.item=ret->common.unique=*item; if (item_attr_get(item, attr_street_name, &attr)) ret->name=map_convert_string(item->map, attr.u.str); else ret->name=NULL; search_list_common_new(item, &ret->common); count=item_coord_get(item, p, sizeof(p)/sizeof(*p)); if (count) { geom_line_middle(p,count,&c); ret->common.c=g_new(struct pcoord, 1); ret->common.c->x=c.x; ret->common.c->y=c.y; ret->common.c->pro = map_projection(item->map); } return ret; } static struct search_list_street * search_list_street_dup(struct search_list_street *this_) { struct search_list_street *ret=g_new0(struct search_list_street, 1); ret->name=map_convert_dup(this_->name); search_list_common_dup(&this_->common, &ret->common); return ret; } static void search_list_street_destroy(struct search_list_street *this_) { map_convert_free(this_->name); search_list_common_destroy(&this_->common); g_free(this_); } static struct search_list_house_number * search_list_house_number_new(struct item *item, struct house_number_interpolation *inter, char *inter_match, int inter_partial) { struct search_list_house_number *ret=g_new0(struct search_list_house_number, 1); struct attr attr; char *house_number=NULL; ret->common.item=ret->common.unique=*item; if (item_attr_get(item, attr_house_number, &attr)) { house_number=attr.u.str; } else { ret->house_number_interpolation=1; memset(&ret->common.unique, 0, sizeof(ret->common.unique)); house_number=search_next_interpolated_house_number(item, inter, inter_match, inter_partial); } if (!house_number) { g_free(ret); return NULL; } ret->house_number=map_convert_string(item->map, house_number); search_list_common_new(item, &ret->common); ret->common.c=search_house_number_coordinate(item, ret->house_number_interpolation?inter:NULL); return ret; } static struct search_list_house_number * search_list_house_number_dup(struct search_list_house_number *this_) { struct search_list_house_number *ret=g_new0(struct search_list_house_number, 1); ret->house_number=map_convert_dup(this_->house_number); search_list_common_dup(&this_->common, &ret->common); return ret; } static void search_list_house_number_destroy(struct search_list_house_number *this_) { map_convert_free(this_->house_number); search_list_common_destroy(&this_->common); g_free(this_); } static void search_list_result_destroy(int level, void *p) { switch (level) { case 0: search_list_country_destroy(p); break; case 1: search_list_town_destroy(p); break; case 2: search_list_street_destroy(p); break; case 3: search_list_house_number_destroy(p); break; } } static struct search_list_result * search_list_result_dup(struct search_list_result *slr) { struct search_list_result *ret=g_new0(struct search_list_result, 1); ret->id=slr->id; if (slr->c) { ret->c=g_new(struct pcoord, 1); *ret->c=*slr->c; } if (slr->country) ret->country=search_list_country_dup(slr->country); if (slr->town) ret->town=search_list_town_dup(slr->town); if (slr->street) ret->street=search_list_street_dup(slr->street); if (slr->house_number) ret->house_number=search_list_house_number_dup(slr->house_number); return ret; } static void search_list_search_free(struct search_list *sl, int level) { struct search_list_level *le=&sl->levels[level]; GList *next,*curr; if (le->search) { mapset_search_destroy(le->search); le->search=NULL; } #if 0 /* FIXME */ if (le->hash) { g_hash_table_destroy(le->hash); le->hash=NULL; } #endif curr=le->list; while (curr) { search_list_result_destroy(level, curr->data); next=g_list_next(curr); curr=next; } attr_free(le->attr); g_list_free(le->list); le->list=NULL; le->curr=NULL; le->last=NULL; } char * search_postal_merge(char *mask, char *new) { int i; char *ret=NULL; dbg(lvl_debug,"enter %s %s\n", mask, new); if (!new) return NULL; if (!mask) return g_strdup(new); i=0; while (mask[i] && new[i]) { if (mask[i] != '.' && mask[i] != new[i]) break; i++; } if (mask[i]) { ret=g_strdup(mask); while (mask[i]) ret[i++]='.'; } dbg(lvl_debug,"merged %s with %s as %s\n", mask, new, ret); return ret; } char * search_postal_merge_replace(char *mask, char *new) { char *ret=search_postal_merge(mask, new); if (!ret) return mask; g_free(mask); return ret; } static int postal_match(char *postal, char *mask) { for (;;) { if ((*postal != *mask) && (*mask != '.')) return 0; if (!*postal) { if (!*mask) return 1; else return 0; } postal++; mask++; } } static int search_add_result(struct search_list_level *le, struct search_list_common *slc) { struct search_list_common *slo; char *merged; int unique=0; if (slc->unique.type || slc->unique.id_hi || slc->unique.id_lo) unique=1; if (unique) slo=g_hash_table_lookup(le->hash, &slc->unique); else slo=NULL; if (!slo) { if (unique) g_hash_table_insert(le->hash, &slc->unique, slc); if (slc->postal && !slc->postal_mask) { slc->postal_mask=g_strdup(slc->postal); } le->list=g_list_append(le->list, slc); return 1; } merged=search_postal_merge(slo->postal_mask, slc->postal); if (merged) { g_free(slo->postal_mask); slo->postal_mask=merged; } return 0; } /** * @brief Get (next) result from a search. * * @param this_ search_list representing the search * @return next result */ struct search_list_result * search_list_get_result(struct search_list *this_) { struct search_list_level *le,*leu; int level=this_->level; struct attr attr2; int has_street_name=0; if (this_->use_address_results) { struct search_list_result *ret=NULL; if (this_->address_results_pos) { ret=this_->address_results_pos->data; this_->address_results_pos=g_list_next(this_->address_results_pos); } return ret; } //dbg(lvl_debug,"enter\n"); le=&this_->levels[level]; //dbg(lvl_debug,"le=%p\n", le); for (;;) { //dbg(lvl_debug,"le->search=%p\n", le->search); if (! le->search) { //dbg(lvl_debug,"partial=%d level=%d\n", le->partial, level); if (! level) le->parent=NULL; else { leu=&this_->levels[level-1]; //dbg(lvl_debug,"leu->curr=%p\n", leu->curr); for (;;) { //dbg(lvl_debug,"*********########"); struct search_list_common *slc; if (! leu->curr) { return NULL; } le->parent=leu->curr->data; leu->last=leu->curr; leu->curr=g_list_next(leu->curr); slc=(struct search_list_common *)(le->parent); if (!slc) break; if (slc->selected == leu->selected) break; } } if (le->parent) { //dbg(lvl_debug,"mapset_search_new with item(%d,%d)\n", le->parent->item.id_hi, le->parent->item.id_lo); } //dbg(lvl_debug,"############## attr=%s\n", attr_to_name(le->attr->type)); le->search=mapset_search_new(this_->ms, &le->parent->item, le->attr, le->partial); le->hash=g_hash_table_new(search_item_hash_hash, search_item_hash_equal); } //dbg(lvl_debug,"le->search=%p\n", le->search); if (!this_->item) { //dbg(lvl_debug,"sssss 1"); this_->item=mapset_search_get_item(le->search); //dbg(lvl_debug,"sssss 1 %p\n",this_->item); } if (this_->item) { void *p=NULL; //dbg(lvl_debug,"id_hi=%d id_lo=%d\n", this_->item->id_hi, this_->item->id_lo); if (this_->postal) { struct attr postal; if (item_attr_get(this_->item, attr_postal_mask, &postal)) { if (!postal_match(this_->postal, postal.u.str)) continue; } else if (item_attr_get(this_->item, attr_postal, &postal)) { if (strcmp(this_->postal, postal.u.str)) continue; } } this_->result.country=NULL; this_->result.town=NULL; this_->result.street=NULL; this_->result.c=NULL; //dbg(lvl_debug,"case x LEVEL start %d\n",level); switch (level) { case 0: //dbg(lvl_debug,"case 0 COUNTRY"); p=search_list_country_new(this_->item); this_->result.country=p; this_->result.country->common.parent=NULL; this_->result.town=NULL; this_->result.street=NULL; this_->result.house_number=NULL; this_->item=NULL; break; case 1: //dbg(lvl_debug,"case 1 TOWN"); p=search_list_town_new(this_->item); this_->result.town=p; this_->result.town->common.parent=this_->levels[0].last->data; this_->result.country=this_->result.town->common.parent; this_->result.c=this_->result.town->common.c; this_->result.street=NULL; this_->result.house_number=NULL; this_->item=NULL; break; case 2: //dbg(lvl_debug,"case 2 STREET"); p=search_list_street_new(this_->item); this_->result.street=p; this_->result.street->common.parent=this_->levels[1].last->data; this_->result.town=this_->result.street->common.parent; this_->result.country=this_->result.town->common.parent; this_->result.c=this_->result.street->common.c; this_->result.house_number=NULL; this_->item=NULL; break; case 3: dbg(lvl_debug,"case 3 HOUSENUMBER\n"); has_street_name=0; // if this housenumber has a streetname tag, set the name now if (item_attr_get(this_->item, attr_street_name, &attr2)) { dbg(lvl_debug,"streetname: %s\n",attr2.u.str); has_street_name=1; } p=search_list_house_number_new(this_->item, &this_->inter, le->attr->u.str, le->partial); if (!p) { house_number_interpolation_clear_all(&this_->inter); this_->item=NULL; continue; } this_->result.house_number=p; if (!this_->result.house_number->house_number_interpolation) { this_->item=NULL; } else { dbg(lvl_debug,"interpolation!\n"); } if(le->parent && has_street_name) { struct search_list_street *street=this_->levels[level-1].last->data; if(navit_utf8_strcasecmp(street->name, attr2.u.str)) { search_list_house_number_destroy(p); //this_->item=NULL; continue; } } this_->result.house_number->common.parent=this_->levels[2].last->data; this_->result.street=this_->result.house_number->common.parent; this_->result.town=this_->result.street->common.parent; this_->result.country=this_->result.town->common.parent; this_->result.c=this_->result.house_number->common.c; #if 0 if(!has_street_name) { static struct search_list_street null_street; this_->result.street=&null_street; } #endif } if (p) { if (search_add_result(le, p)) { this_->result.id++; return &this_->result; } else { search_list_result_destroy(level, p); } } } else { mapset_search_destroy(le->search); le->search=NULL; g_hash_table_destroy(le->hash); if (! level) break; } } return NULL; } void search_list_destroy(struct search_list *this_) { g_free(this_->postal); g_free(this_); } void search_init(void) { } navit-0.5.0+dfsg.1/navit/search.h000066400000000000000000000047731264204753600164760ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_SEARCH_H #define NAVIT_SEARCH_H #ifdef __cplusplus extern "C" { #endif struct search_list_common { void *parent; struct item unique,item; int selected; struct pcoord *c; char *town_name; char *district_name; char *postal; char *postal_mask; char *county_name; struct attr **attrs; }; struct search_list_country { struct search_list_common common; char *car; char *iso2; char *iso3; char *name; char *flag; }; struct search_list_town { struct search_list_common common; struct item itemt; char *county; }; struct search_list_street { struct search_list_common common; char *name; }; struct search_list_house_number { struct search_list_common common; char *house_number; int house_number_interpolation; }; struct search_list_result { int id; struct pcoord *c; struct search_list_country *country; struct search_list_town *town; struct search_list_street *street; struct search_list_house_number *house_number; }; /* prototypes */ struct attr; struct mapset; struct search_list; struct search_list_result; struct jni_object; struct search_list *search_list_new(struct mapset *ms); int search_list_level(enum attr_type attr_type); void search_list_search(struct search_list *this_, struct attr *search_attr, int partial); char *search_postal_merge(char *mask, char *new_); char *search_postal_merge_replace(char *mask, char *new_); struct search_list_common *search_list_select(struct search_list *this_, enum attr_type attr_type, int id, int mode); char *search_list_get_unique(struct search_list *this_, char *unique); struct search_list_result *search_list_get_result(struct search_list *this_); void search_list_destroy(struct search_list *this_); void search_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/search_houseno_interpol.c000066400000000000000000000163031264204753600221350ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "debug.h" #include "projection.h" #include "item.h" #include "xmlconfig.h" #include "map.h" #include "mapset.h" #include "coord.h" #include "transform.h" #include "search.h" #include "country.h" #include "linguistics.h" #include "geom.h" #include "util.h" #include "search_houseno_interpol.h" struct hn_interpol_attr { enum attr_type house_number_interpol_attr; int interpol_increment; enum include_end_nodes include_end_nodes; }; #define house_number_interpol_attr_END -1 /** * Attributes that indicate a house number interpolation, * along with interpolation information. */ struct hn_interpol_attr house_number_interpol_attrs[] = { { attr_house_number_left, 1, end_nodes_yes }, { attr_house_number_left_odd, 2, end_nodes_yes }, { attr_house_number_left_even, 2, end_nodes_yes }, { attr_house_number_right, 1, end_nodes_yes }, { attr_house_number_right_odd, 2, end_nodes_yes }, { attr_house_number_right_even, 2, end_nodes_yes }, { attr_house_number_interpolation_no_ends_incrmt_1, 1, end_nodes_no }, { attr_house_number_interpolation_no_ends_incrmt_2, 2, end_nodes_no }, { house_number_interpol_attr_END, -1, -1 }, }; void house_number_interpolation_clear_current(struct house_number_interpolation *inter) { g_free(inter->first); g_free(inter->last); g_free(inter->curr); inter->first=inter->last=inter->curr=NULL; inter->increment=inter->include_end_nodes=-1; } void house_number_interpolation_clear_all(struct house_number_interpolation *inter) { inter->curr_interpol_attr_idx=0; house_number_interpolation_clear_current(inter); } static char * search_next_house_number_curr_interpol_with_ends(struct house_number_interpolation *inter) { dbg(lvl_debug,"interpolate %s-%s %s\n",inter->first,inter->last,inter->curr); if (!inter->first || !inter->last) return NULL; if (!inter->curr) inter->curr=g_strdup(inter->first); else { if (strcmp(inter->curr, inter->last)) { int next=atoi(inter->curr)+(inter->increment); g_free(inter->curr); if (next == atoi(inter->last)) inter->curr=g_strdup(inter->last); else inter->curr=g_strdup_printf("%d",next); } else { g_free(inter->curr); inter->curr=NULL; } } dbg(lvl_debug,"interpolate result %s\n",inter->curr); return inter->curr; } static int house_number_is_end_number(char* house_number, struct house_number_interpolation *inter) { return ( (!strcmp(house_number, inter->first)) || (!strcmp(house_number, inter->last)) ); } static char * search_next_house_number_curr_interpol(struct house_number_interpolation *inter) { char* hn=NULL; switch (inter->include_end_nodes) { case end_nodes_yes: hn=search_next_house_number_curr_interpol_with_ends(inter); break; case end_nodes_no: do { hn=search_next_house_number_curr_interpol_with_ends(inter); } while (hn!=NULL && house_number_is_end_number(hn, inter)); break; } return hn; } static void search_house_number_interpolation_split(char *str, struct house_number_interpolation *inter) { char *pos=strchr(str,'-'); char *first,*last; int len; if (!pos) { inter->first=g_strdup(str); inter->last=g_strdup(str); inter->rev=0; return; } len=pos-str; first=g_malloc(len+1); strncpy(first, str, len); first[len]='\0'; last=g_strdup(pos+1); dbg(lvl_debug,"%s = %s - %s\n",str, first, last); if (atoi(first) > atoi(last)) { inter->first=last; inter->last=first; inter->rev=1; } else { inter->first=first; inter->last=last; inter->rev=0; } } struct pcoord * search_house_number_coordinate(struct item *item, struct house_number_interpolation *inter) { struct pcoord *ret=g_new(struct pcoord, 1); ret->pro = map_projection(item->map); dbg(lvl_debug,"%s\n",item_to_name(item->type)); if (!inter) { struct coord c; if (item_coord_get(item, &c, 1)) { ret->x=c.x; ret->y=c.y; } else { g_free(ret); ret=NULL; } } else { int count,max=1024; int hn_pos,hn_length; int inter_increment=inter->increment; struct coord *c=g_alloca(sizeof(struct coord)*max); item_coord_rewind(item); count=item_coord_get(item, c, max); hn_length=atoi(inter->last)-atoi(inter->first); if (inter->rev) hn_pos=atoi(inter->last)-atoi(inter->curr); else hn_pos=atoi(inter->curr)-atoi(inter->first); if (count) { int i,distance_sum=0,hn_distance; int *distances=g_alloca(sizeof(int)*(count-1)); dbg(lvl_debug,"count=%d hn_length=%d hn_pos=%d (%s of %s-%s)\n",count,hn_length,hn_pos,inter->curr,inter->first,inter->last); if (!hn_length) { hn_length=2; hn_pos=1; } if (count == max) dbg(lvl_error,"coordinate overflow\n"); for (i = 0 ; i < count-1 ; i++) { distances[i]=navit_sqrt(transform_distance_sq(&c[i],&c[i+1])); distance_sum+=distances[i]; dbg(lvl_debug,"distance[%d]=%d\n",i,distances[i]); } dbg(lvl_debug,"sum=%d\n",distance_sum); #if 0 hn_distance=distance_sum*hn_pos/hn_length; #else hn_distance=(distance_sum*hn_pos+distance_sum*inter_increment/2)/(hn_length+inter_increment); #endif dbg(lvl_debug,"hn_distance=%d\n",hn_distance); i=0; while (i < count-1 && hn_distance > distances[i]) hn_distance-=distances[i++]; dbg(lvl_debug,"remaining distance=%d from %d\n",hn_distance,distances[i]); ret->x=(c[i+1].x-c[i].x)*hn_distance/distances[i]+c[i].x; ret->y=(c[i+1].y-c[i].y)*hn_distance/distances[i]+c[i].y; } } return ret; } static int search_match(char *str, char *search, int partial) { if (!partial) return (!g_ascii_strcasecmp(str, search)); else return (!g_ascii_strncasecmp(str, search, strlen(search))); } char * search_next_interpolated_house_number(struct item *item, struct house_number_interpolation *inter, char *inter_match, int inter_partial) { while (1) { char *hn; struct attr attr; struct hn_interpol_attr curr_interpol_attr; while((hn=search_next_house_number_curr_interpol(inter))){ if (search_match(hn, inter_match, inter_partial)) { return map_convert_string(item->map, hn); } } house_number_interpolation_clear_current(inter); curr_interpol_attr=house_number_interpol_attrs[inter->curr_interpol_attr_idx]; if (curr_interpol_attr.house_number_interpol_attr==house_number_interpol_attr_END) { return NULL; } if (item_attr_get(item, curr_interpol_attr.house_number_interpol_attr, &attr)) { search_house_number_interpolation_split(attr.u.str, inter); inter->increment=curr_interpol_attr.interpol_increment; inter->include_end_nodes=curr_interpol_attr.include_end_nodes; } inter->curr_interpol_attr_idx++; } } navit-0.5.0+dfsg.1/navit/search_houseno_interpol.h000066400000000000000000000033441264204753600221430ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301, USA. */ enum include_end_nodes { end_nodes_yes, end_nodes_no, }; /** Data for a house number interpolation. */ struct house_number_interpolation { /** Index of interpolation attribute currently used. */ int curr_interpol_attr_idx; /** Interpolation increment */ int increment; /** Reverse interpolation? (0/1) */ int rev; /** First number. */ char *first; /** Last number. */ char *last; /** Include first and last node in interpolation results? */ enum include_end_nodes include_end_nodes; /** Current number in running interpolation. */ char *curr; }; void house_number_interpolation_clear_current(struct house_number_interpolation *inter); void house_number_interpolation_clear_all(struct house_number_interpolation *inter); char * search_next_interpolated_house_number(struct item *item, struct house_number_interpolation *inter, char *inter_match, int inter_partial); struct pcoord * search_house_number_coordinate(struct item *item, struct house_number_interpolation *inter); navit-0.5.0+dfsg.1/navit/speech.c000066400000000000000000000114141264204753600164610ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "debug.h" #include "item.h" #include "speech.h" #include "plugin.h" #include "xmlconfig.h" struct speech { NAVIT_OBJECT; struct speech_priv *priv; struct speech_methods meth; }; struct speech * speech_new(struct attr *parent, struct attr **attrs) { struct speech *this_; struct speech_priv *(*speech_new)(struct speech_methods *meth, struct attr **attrs, struct attr *parent); struct attr *attr; attr=attr_search(attrs, NULL, attr_type); if (! attr) { dbg(lvl_error,"type missing\n"); return NULL; } dbg(lvl_debug,"type='%s'\n", attr->u.str); speech_new=plugin_get_speech_type(attr->u.str); dbg(lvl_debug,"new=%p\n", speech_new); if (! speech_new) { dbg(lvl_error,"wrong type '%s'\n", attr->u.str); return NULL; } this_=(struct speech *)navit_object_new(attrs, &speech_func, sizeof(struct speech)); this_->priv=speech_new(&this_->meth, this_->attrs, parent); dbg(lvl_debug, "say=%p\n", this_->meth.say); dbg(lvl_debug,"priv=%p\n", this_->priv); if (! this_->priv) { speech_destroy(this_); return NULL; } dbg(lvl_debug,"return %p\n", this_); return this_; } void speech_destroy(struct speech *this_) { if (this_->priv) this_->meth.destroy(this_->priv); navit_object_destroy((struct navit_object *)this_); } int speech_say(struct speech *this_, const char *text) { dbg(lvl_debug, "this_=%p text='%s' calling %p\n", this_, text, this_->meth.say); return (this_->meth.say)(this_->priv, text); } struct attr active=ATTR_INT(active, 1); struct attr *speech_default_attrs[]={ &active, NULL, }; /** * @brief Gets an attribute from a speech plugin * * @param this_ The speech plugin the attribute should be read from * @param type The type of the attribute to be read * @param attr Pointer to an attrib-structure where the attribute should be written to * @param iter (NOT IMPLEMENTED) Used to iterate through all attributes of a type. Set this to NULL to get the first attribute, set this to an attr_iter to get the next attribute * @return True if the attribute type was found, false if not */ int speech_get_attr(struct speech *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, speech_default_attrs, type, attr, iter); } /** * @brief Tries to estimate how long it will take to speak a certain string * * This function tries to estimate how long it will take to speak a certain string * passed in str. It relies on the "characters per second"-value passed from the * configuration. * * @param this_ The speech whose speed should be used * @param str The string that should be estimated * @return Time in tenth of seconds or -1 on error */ int speech_estimate_duration(struct speech *this_, char *str) { int count; struct attr cps_attr; if (!speech_get_attr(this_,attr_cps,&cps_attr,NULL)) { return -1; } count = strlen(str); return (count * 10) / cps_attr.u.num; } /** * @brief Sets an attribute from an speech plugin * * This sets an attribute of a speech plugin, overwriting an attribute of the same type if it * already exists. This function also calls all the callbacks that are registred * to be called when attributes change. * * @param this_ The speech plugin to set the attribute of * @param attr The attribute to set * @return True if the attr could be set, false otherwise */ int speech_set_attr(struct speech *this_, struct attr *attr) { this_->attrs=attr_generic_set_attr(this_->attrs, attr); //callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); return 1; } struct object_func speech_func = { attr_speech, (object_func_new)speech_new, (object_func_get_attr)speech_get_attr, (object_func_iter_new)navit_object_attr_iter_new, (object_func_iter_destroy)navit_object_attr_iter_destroy, (object_func_set_attr)speech_set_attr, (object_func_add_attr)navit_object_add_attr, (object_func_remove_attr)navit_object_remove_attr, (object_func_init)NULL, (object_func_destroy)speech_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/speech.h000066400000000000000000000027361264204753600164750ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_SPEECH_H #define NAVIT_SPEECH_H struct speech_priv; struct attr_iter; struct speech_methods { void (*destroy)(struct speech_priv *this_); int (*say)(struct speech_priv *this_, const char *text); }; /* prototypes */ struct speech * speech_new(struct attr *parent, struct attr **attrs); int speech_say(struct speech *this_, const char *text); int speech_sayf(struct speech *this_, const char *format, ...); void speech_destroy(struct speech *this_); int speech_get_attr(struct speech *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int speech_set_attr(struct speech *this_, struct attr *attr); int speech_estimate_duration(struct speech *this_, char *str); /* end of prototypes */ #endif navit-0.5.0+dfsg.1/navit/speech/000077500000000000000000000000001264204753600163145ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/speech/Makefile.am000066400000000000000000000003661264204753600203550ustar00rootroot00000000000000SUBDIRS= if SPEECH_ANDROID SUBDIRS += android endif if SPEECH_CMDLINE SUBDIRS += cmdline endif if SPEECH_DBUS SUBDIRS += dbus endif if SPEECH_ESPEAK SUBDIRS += espeak endif if SPEECH_SPEECH_DISPATCHER SUBDIRS += speech_dispatcher endif navit-0.5.0+dfsg.1/navit/speech/cmdline/000077500000000000000000000000001264204753600177275ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/speech/cmdline/CMakeLists.txt000066400000000000000000000000641264204753600224670ustar00rootroot00000000000000module_add_library(speech_cmdline speech_cmdline.c) navit-0.5.0+dfsg.1/navit/speech/cmdline/Makefile.am000066400000000000000000000005331264204753600217640ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_cmdline if PLUGINS modulespeech_LTLIBRARIES = libspeech_cmdline.la else noinst_LTLIBRARIES = libspeech_cmdline.la endif libspeech_cmdline_la_SOURCES = speech_cmdline.c libspeech_cmdline_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/speech/cmdline/speech_cmdline.c000066400000000000000000000153471264204753600230470ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "config.h" #include "debug.h" #include "item.h" #include "plugin.h" #include "file.h" #include "speech.h" #include "util.h" #ifdef HAVE_API_WIN32_BASE #include #endif #ifdef USE_EXEC #include #include #include #endif static char *urldecode(char *str) { char *ret=g_strdup(str); char *src=ret; char *dst=ret; while (*src) { if (*src == '%') { int val; if (sscanf(src+1,"%02x",&val)) { src+=2; *dst++=val; } src++; } else *dst++=*src++; } *dst++='\0'; return ret; } static GList * speech_cmdline_search(GList *samples, int suffix_len, const char *text, int decode) { GList *loop_samples=samples,*result=NULL,*recursion_result; int shortest_result_length=INT_MAX; dbg(lvl_debug,"searching samples for text: '%s'\n",text); while (loop_samples) { char *sample_name=loop_samples->data; int sample_name_len; if (decode) sample_name=urldecode(sample_name); sample_name_len=strlen(sample_name)-suffix_len; // TODO: Here we compare UTF-8 text with a filename. // It's unclear how a case-insensitive comparison should work // in general, so for now we only do it for ASCII text. if (!g_ascii_strncasecmp(text, sample_name, sample_name_len)) { const char *remaining_text=text+sample_name_len; while (*remaining_text == ' ' || *remaining_text == ',') remaining_text++; dbg(lvl_debug,"sample '%s' matched; remaining text: '%s'\n",sample_name,remaining_text); if (*remaining_text) { recursion_result=speech_cmdline_search(samples, suffix_len, remaining_text, decode); if (recursion_result && g_list_length(recursion_result) < shortest_result_length) { g_list_free(result); result=recursion_result; result=g_list_prepend(result, loop_samples->data); shortest_result_length=g_list_length(result); } else { dbg(lvl_debug,"no (shorter) result found for remaining text '%s', " "trying next sample\n", remaining_text); g_list_free(recursion_result); } } else { g_list_free(result); result=g_list_prepend(NULL, loop_samples->data); break; } } if (decode) g_free(sample_name); loop_samples=g_list_next(loop_samples); } return result; } #if 0 r=search(l, strlen(path)+1, suffix_len, argv[1]); while (r) { printf("%s/%s\n",path,r->data); r=g_list_next(r); } return 0; #endif struct speech_priv { char *cmdline; char *sample_dir; char *sample_suffix; int flags; GList *samples; struct spawn_process_info *spi; }; static int speechd_say(struct speech_priv *this, const char *text) { char **cmdv=g_strsplit(this->cmdline," ", -1); int variable_arg_no=-1; GList *argl=NULL; guint listlen; int samplesmode=0; int i; for(i=0;cmdv[i];i++) if(strchr(cmdv[i],'%')) { variable_arg_no=i; break; } if (this->sample_dir && this->sample_suffix) { argl=speech_cmdline_search(this->samples, strlen(this->sample_suffix), text, !!(this->flags & 1)); samplesmode=1; listlen=g_list_length(argl); dbg(lvl_debug,"For text: '%s', found %d samples.\n",text,listlen); if (!listlen){ dbg(lvl_error,"No matching samples found. Cannot speak text: '%s'\n",text); } } else { listlen=1; } if(listlen>0) { dbg(lvl_debug,"Speaking text '%s'\n",text); int argc; char**argv; int j; int cmdvlen=g_strv_length(cmdv); argc=cmdvlen + listlen - (variable_arg_no>0?1:0); argv=g_new(char *,argc+1); if(variable_arg_no==-1) { argv[cmdvlen]=g_strdup("%s"); variable_arg_no=cmdvlen; } for(i=0,j=0;jsample_dir,(char *)l->data); dbg(lvl_debug,"new_arg %s\n",new_arg); argv[j++]=g_strdup_printf(cmdv[i],new_arg); g_free(new_arg); l=g_list_next(l); } } else { argv[j++]=g_strdup_printf(cmdv[i],text); } i++; } else { argv[j++]=g_strdup(cmdv[i++]); } } argv[j]=NULL; if (argl) // No need to free data elements here as they are // still referenced from this->samples g_list_free(argl); if(this->spi) { spawn_process_check_status(this->spi,1); // Block until previous spawned speech process is terminated. spawn_process_info_free(this->spi); } this->spi=spawn_process(argv); g_strfreev(argv); } g_strfreev(cmdv); return 0; } static void speechd_destroy(struct speech_priv *this) { GList *l=this->samples; g_free(this->cmdline); g_free(this->sample_dir); g_free(this->sample_suffix); while(l) { g_free(l->data); } g_list_free(this->samples); if(this->spi) spawn_process_info_free(this->spi); g_free(this); } static struct speech_methods speechd_meth = { speechd_destroy, speechd_say, }; static struct speech_priv * speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { struct speech_priv *this; struct attr *attr; attr=attr_search(attrs, NULL, attr_data); if (! attr) return NULL; this=g_new0(struct speech_priv,1); this->cmdline=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_sample_dir))) this->sample_dir=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_sample_suffix))) this->sample_suffix=g_strdup(attr->u.str); if ((attr=attr_search(attrs, NULL, attr_flags))) this->flags=attr->u.num; if (this->sample_dir && this->sample_suffix) { void *handle=file_opendir(this->sample_dir); if (!handle) { dbg(lvl_error,"Cannot read sample directory contents: %s", this->sample_dir); return NULL; } char *name; int suffix_len=strlen(this->sample_suffix); while((name=file_readdir(handle))) { int len=strlen(name); if (len > suffix_len) { if (!strcmp(name+len-suffix_len, this->sample_suffix)) { dbg(lvl_debug,"found %s\n",name); this->samples=g_list_prepend(this->samples, g_strdup(name)); } } } file_closedir(handle); } *meth=speechd_meth; return this; } void plugin_init(void) { plugin_register_speech_type("cmdline", speechd_new); } navit-0.5.0+dfsg.1/navit/speech/dbus/000077500000000000000000000000001264204753600172515ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/speech/dbus/CMakeLists.txt000066400000000000000000000000571264204753600220130ustar00rootroot00000000000000module_add_library(speech_dbus speech_dbus.c) navit-0.5.0+dfsg.1/navit/speech/dbus/Makefile.am000066400000000000000000000004141264204753600213040ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_dbus modulespeech_LTLIBRARIES = libspeech_dbus.la libspeech_dbus_la_SOURCES = speech_dbus.c libspeech_dbus_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/speech/dbus/speech_dbus.c000066400000000000000000000037271264204753600217120ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include "config.h" #include "item.h" #include "plugin.h" #include "navit.h" #include "attr.h" #include "callback.h" #include "speech.h" struct speech_priv { struct navit *nav; }; static int speech_dbus_say(struct speech_priv *this, const char *text) { struct attr attr1,attr2,cb,*attr_list[3]; int valid=0; attr1.type=attr_type; attr1.u.str="speech"; attr2.type=attr_data; attr2.u.str=(char *)text; attr_list[0]=&attr1; attr_list[1]=&attr2; attr_list[2]=NULL; if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); return 0; } static void speech_dbus_destroy(struct speech_priv *this) { g_free(this); } static struct speech_methods speech_dbus_meth = { speech_dbus_destroy, speech_dbus_say, }; static struct speech_priv * speech_dbus_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { struct speech_priv *this; if (!parent || parent->type != attr_navit) return NULL; this=g_new(struct speech_priv,1); this->nav=parent->u.navit; *meth=speech_dbus_meth; return this; } void plugin_init(void) { plugin_register_speech_type("dbus", speech_dbus_new); } navit-0.5.0+dfsg.1/navit/speech/espeak/000077500000000000000000000000001264204753600175645ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/speech/espeak/CMakeLists.txt000066400000000000000000000001361264204753600223240ustar00rootroot00000000000000module_add_library(speech_espeak speak.c) target_link_libraries(speech_espeak support_espeak) navit-0.5.0+dfsg.1/navit/speech/espeak/Makefile.am000066400000000000000000000007141264204753600216220ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_espeak if PLUGINS modulespeech_LTLIBRARIES = libspeech_espeak.la else noinst_LTLIBRARIES = libspeech_espeak.la endif libspeech_espeak_la_SOURCES = speak.c libspeech_espeak_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ -L$(top_builddir)/navit/support/espeak -lsupport_espeak if !SUPPORT_WIN32CE libspeech_espeak_la_LDFLAGS += -Wl,-lwinmm endif navit-0.5.0+dfsg.1/navit/speech/espeak/speak.c000066400000000000000000000267331264204753600210460ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _WIN32_WINNT 0x0500 #include "config.h" #ifdef HAVE_API_WIN32_BASE #include #include #include #else #include #endif #include #include #include #include "item.h" #include "plugin.h" #include "speech.h" #include "util.h" #include "file.h" #include "debug.h" #include "support/espeak/speech.h" #include "support/espeak/speak_lib.h" #include "support/espeak/phoneme.h" #include "support/espeak/synthesize.h" #include "support/espeak/voice.h" #include "support/espeak/translate.h" #define BUFFERS 4 // ----- some stuff needed by espeak ---------------------------------- char path_home[N_PATH_HOME]; // this is the espeak-data directory int (* uri_callback)(int, const char *, const char *) = NULL; int (* phoneme_callback)(const char *) = NULL; FILE *f_wave = NULL; int GetFileLength(const char *filename) { struct stat statbuf; if(stat(filename,&statbuf) != 0) return(0); if((statbuf.st_mode & S_IFMT) == S_IFDIR) return(-2); // a directory return(statbuf.st_size); } void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr) { } char *Alloc(int size) { return g_malloc(size); } void Free(void *ptr) { g_free(ptr); } // -------------------------------------------------------------------- enum speech_messages { msg_say = WM_USER, msg_exit }; enum speech_state { state_available, state_speaking_phase_1, state_speaking_phase_2, state_speaking_phase_3 }; struct speech_priv { GList *free_buffers; HWAVEOUT h_wave_out; enum speech_state state; GList *phrases; HWND h_queue; HANDLE h_message_thread; }; static void waveout_close(struct speech_priv* sp_priv) { waveOutClose(sp_priv->h_wave_out); } static BOOL waveout_open(struct speech_priv* sp_priv) { MMRESULT result = 0; HWAVEOUT hwo; static WAVEFORMATEX wmTemp; wmTemp.wFormatTag = WAVE_FORMAT_PCM; wmTemp.nChannels = 1; wmTemp.nSamplesPerSec = 22050; wmTemp.wBitsPerSample = 16; wmTemp.nBlockAlign = wmTemp.nChannels * wmTemp.wBitsPerSample / 8; wmTemp.nAvgBytesPerSec = wmTemp.nSamplesPerSec * wmTemp.nBlockAlign; wmTemp.cbSize = 0; result = waveOutOpen(&hwo, (UINT) WAVE_MAPPER, &wmTemp, (DWORD)sp_priv->h_queue, (DWORD)sp_priv, CALLBACK_WINDOW); sp_priv->h_wave_out = hwo; return (result==MMSYSERR_NOERROR); } static int wave_out(struct speech_priv* sp_priv) { int isDone; WAVEHDR *WaveHeader = g_list_first(sp_priv->free_buffers)->data; sp_priv->free_buffers = g_list_remove(sp_priv->free_buffers, WaveHeader); out_ptr = out_start = WaveHeader->lpData; out_end = WaveHeader->lpData + WaveHeader->dwBufferLength; isDone = WavegenFill(0); if ( out_ptr < out_end ) { memset ( out_ptr, 0, out_end - out_ptr ); } waveOutWrite(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); return isDone; } static BOOL initialise(void) { int param; int result; WavegenInit(22050,0); // 22050 if((result = LoadPhData()) != 1) { if(result == -1) { dbg(lvl_error, "Failed to load espeak-data\n"); return FALSE; } else dbg(lvl_error, "Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); } LoadConfig(); SetVoiceStack(NULL); SynthesizeInit(); for(param=0; paramfree_buffers && this->state != state_speaking_phase_3 ) { if(Generate(phoneme_list,&n_phoneme_list,1)==0) { if (!SpeakNextClause(NULL,NULL,1)) { this->state = state_speaking_phase_2; } } if ( wave_out(this)!= 0 && this->state == state_speaking_phase_2) { this->state = state_speaking_phase_3; } } } static void start_speaking(struct speech_priv* sp_priv) { char *phrase = g_list_first(sp_priv->phrases)->data; sp_priv->state = state_speaking_phase_1; SpeakNextClause(NULL, phrase,0); wave_out(sp_priv); fill_buffer(sp_priv); } static LRESULT CALLBACK speech_message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { dbg(lvl_debug, "message_handler called\n"); switch (uMsg) { case msg_say: { struct speech_priv* sp_priv = (struct speech_priv*)wParam; sp_priv->phrases = g_list_append(sp_priv->phrases, (char*)lParam); if ( sp_priv->state == state_available ) { start_speaking(sp_priv); } } break; case MM_WOM_DONE: { WAVEHDR *WaveHeader = (WAVEHDR *)lParam; struct speech_priv* sp_priv; dbg(lvl_info, "Wave buffer done\n"); sp_priv = (struct speech_priv*)WaveHeader->dwUser; sp_priv->free_buffers = g_list_append(sp_priv->free_buffers, WaveHeader); if ( sp_priv->state != state_speaking_phase_3) { fill_buffer(sp_priv); } else if ( g_list_length(sp_priv->free_buffers) == BUFFERS && sp_priv->state == state_speaking_phase_3 ) { // remove the spoken phrase from the list char *phrase = g_list_first(sp_priv->phrases)->data; g_free( phrase ); sp_priv->phrases = g_list_remove(sp_priv->phrases, phrase); if ( sp_priv->phrases ) { start_speaking(sp_priv); } else { sp_priv->state = state_available; } } } break; case msg_exit: ExitThread(0); break; default: break; } return TRUE; } static void speech_message_dispatcher( struct speech_priv * sp_priv) { BOOL bRet; MSG msg; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { dbg(lvl_error, "Error getting message from queue\n"); break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } } static void create_buffers(struct speech_priv *sp_priv) { int buffer_counter; char *buffer_head; SYSTEM_INFO system_info; GetSystemInfo (&system_info); buffer_head = VirtualAlloc(0, system_info.dwPageSize * BUFFERS, MEM_RESERVE, PAGE_NOACCESS); for (buffer_counter = 0; buffer_counter < BUFFERS; buffer_counter++) { WAVEHDR *WaveHeader = g_new0(WAVEHDR, 1); WaveHeader->dwBufferLength = system_info.dwPageSize; WaveHeader->lpData = (char *)VirtualAlloc(buffer_head, WaveHeader->dwBufferLength, MEM_COMMIT, PAGE_READWRITE); buffer_head += WaveHeader->dwBufferLength; WaveHeader->dwUser = (DWORD)sp_priv; waveOutPrepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); sp_priv->free_buffers = g_list_append( sp_priv->free_buffers, WaveHeader ); } } static DWORD startThread( LPVOID sp_priv) { struct speech_priv *this = (struct speech_priv *) sp_priv; // Create message queue TCHAR *g_szClassName = TEXT("SpeechQueue"); WNDCLASS wc; HWND hwnd; HWND hWndParent; memset(&wc, 0 , sizeof(WNDCLASS)); wc.lpfnWndProc = speech_message_handler; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = g_szClassName; if (!RegisterClass(&wc)) { dbg(lvl_error, "Window registration for message queue failed\n"); return 1; } hWndParent = NULL; #ifndef HAVE_API_WIN32_CE hWndParent = HWND_MESSAGE; #endif // create a message only window hwnd = CreateWindow( g_szClassName, TEXT("Navit"), 0, 0, 0, 0, 0, hWndParent, NULL, GetModuleHandle(NULL), NULL); if (hwnd == NULL) { dbg(lvl_error, "Window creation failed: %d\n", GetLastError()); return 1; } this->h_queue = hwnd; this->phrases = NULL; this->state = state_available; if(!waveout_open(this)) { dbg(lvl_error, "Can't open wave output\n"); return 1; } this->free_buffers = NULL; create_buffers(this); speech_message_dispatcher(this); return 0; } static int espeak_say(struct speech_priv *this, const char *text) { char *phrase = g_strdup(text); dbg(lvl_debug, "Speak: '%s'\n", text); if (!PostMessage(this->h_queue, msg_say, (WPARAM)this, (LPARAM)phrase)) { dbg(lvl_error, "PostThreadMessage 'say' failed\n"); } return 0; } static void free_list(gpointer pointer, gpointer this ) { if ( this ) { struct speech_priv *sp_priv = (struct speech_priv *)this; WAVEHDR *WaveHeader = (WAVEHDR *)pointer; waveOutUnprepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); VirtualFree(WaveHeader->lpData, WaveHeader->dwBufferLength, MEM_DECOMMIT); } g_free(pointer); } static void espeak_destroy(struct speech_priv *this) { g_list_foreach( this->free_buffers, free_list, (gpointer)this ); g_list_free( this->free_buffers ); g_list_foreach( this->phrases, free_list, 0 ); g_list_free(this->phrases); waveout_close(this); g_free(this); } static struct speech_methods espeak_meth = { espeak_destroy, espeak_say, }; static struct speech_priv * espeak_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { struct speech_priv *this = NULL; struct attr *path; struct attr *language; char *lang_str=NULL; path=attr_search(attrs, NULL, attr_path); if (path) strcpy(path_home,path->u.str); else sprintf(path_home,"%s/espeak-data",getenv("NAVIT_SHAREDIR")); dbg(lvl_debug,"path_home set to %s\n",path_home); if ( !initialise() ) { return NULL; } language=attr_search(attrs, NULL, attr_language); if ( language ) { lang_str=g_strdup(language->u.str); } else { char *lang_env=getenv("LANG"); if (lang_env) { char *country,*lang,*lang_full; char *file1; char *file2; lang_full=g_strdup(lang_env); strtolower(lang_full,lang_env); lang=g_strdup(lang_full); country=strchr(lang_full,'_'); if (country) { lang[country-lang_full]='\0'; *country++='-'; } file1=g_strdup_printf("%s/voices/%s",path_home,lang_full); file2=g_strdup_printf("%s/voices/%s/%s",path_home,lang,lang_full); dbg(lvl_debug,"Testing %s and %s\n",file1,file2); if (file_exists(file1) || file_exists(file2)) lang_str=g_strdup(lang_full); else lang_str=g_strdup(lang); dbg(lvl_debug,"Language full %s lang %s result %s\n",lang_full,lang,lang_str); g_free(lang_full); g_free(lang); g_free(file1); g_free(file2); } } if(lang_str && SetVoiceByName(lang_str) != EE_OK) { dbg(lvl_error, "Error setting language to: '%s',falling back to default\n", lang_str); g_free(lang_str); lang_str=NULL; } if(!lang_str && SetVoiceByName("default") != EE_OK) { dbg(lvl_error, "Error setting language to default\n"); } SetParameter(espeakRATE,170,0); SetParameter(espeakVOLUME,100,0); SetParameter(espeakCAPITALS,option_capitals,0); SetParameter(espeakPUNCTUATION,option_punctuation,0); SetParameter(espeakWORDGAP,0,0); // if(pitch_adjustment != 50) // { // SetParameter(espeakPITCH,pitch_adjustment,0); // } DoVoiceChange(voice); this=g_new(struct speech_priv,1); this->h_message_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)startThread, (PVOID)this, 0, NULL); *meth=espeak_meth; return this; } void plugin_init(void) { plugin_register_speech_type("espeak", espeak_new); } navit-0.5.0+dfsg.1/navit/speech/speech_dispatcher/000077500000000000000000000000001264204753600217715ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/speech/speech_dispatcher/CMakeLists.txt000066400000000000000000000001101264204753600245210ustar00rootroot00000000000000module_add_library(speech_speech_dispatcher speech_speech_dispatcher.c) navit-0.5.0+dfsg.1/navit/speech/speech_dispatcher/Makefile.am000066400000000000000000000005551264204753600240320ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_speech_dispatcher modulespeech_LTLIBRARIES = libspeech_speech_dispatcher.la libspeech_speech_dispatcher_la_SOURCES = speech_speech_dispatcher.c libspeech_speech_dispatcher_la_LIBADD = @SPEECHD_LIBS@ libspeech_speech_dispatcher_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/speech/speech_dispatcher/speech_speech_dispatcher.c000066400000000000000000000035671264204753600271540ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include "config.h" #include #include "plugin.h" #include "speech.h" struct speech_priv { SPDConnection *conn; }; static int speechd_say(struct speech_priv *this, const char *text) { int err; err = spd_sayf(this->conn, SPD_MESSAGE, text); if (err != 1) return 1; return 0; } static void speechd_destroy(struct speech_priv *this) { spd_close(this->conn); g_free(this); } static struct speech_methods speechd_meth = { speechd_destroy, speechd_say, }; static struct speech_priv * speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *attr) { struct speech_priv *this; SPDConnection *conn; conn = spd_open("navit","main",NULL,SPD_MODE_SINGLE); if (! conn) return NULL; this=g_new(struct speech_priv,1); if (this) { this->conn=conn; *meth=speechd_meth; spd_set_punctuation(conn, SPD_PUNCT_NONE); } return this; } void plugin_init(void) { plugin_register_speech_type("speech_dispatcher", speechd_new); } navit-0.5.0+dfsg.1/navit/start.c000066400000000000000000000015061264204753600163500ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "start_real.h" int main(int argc, char **argv) { return main_real(argc, argv); } navit-0.5.0+dfsg.1/navit/start_apple.m000066400000000000000000000027711264204753600175500ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "start_real.h" #import #include #include int main(int argc, char **argv) { int ret; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *appFolderPath = [[NSBundle mainBundle] resourcePath]; NSString *locale = [[NSLocale currentLocale] localeIdentifier]; char *lang=g_strdup_printf("%s.UTF-8",[locale UTF8String]); dbg(0,"lang %s\n",lang); setenv("LANG",lang,0); setlocale(LC_ALL, NULL); const char *s=[appFolderPath UTF8String]; char *user=g_strdup_printf("%s/../Documents",s); chdir(s); argv[0]=g_strdup_printf("%s/bin/navit",s); setenv("NAVIT_USER_DATADIR",user,0); dbg(0,"calling main_real\n"); ret=main_real(argc, argv); g_free(argv[0]); g_free(user); [pool release]; return ret; } navit-0.5.0+dfsg.1/navit/start_real.c000066400000000000000000000147441264204753600173630ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "config.h" #ifdef HAVE_GETOPT_H #include #else #include #endif #include "config_.h" #include "version.h" #include "item.h" #include "coord.h" #include "main.h" #include "route.h" #include "navigation.h" #include "track.h" #include "debug.h" #include "event.h" #include "event_glib.h" #include "xmlconfig.h" #include "file.h" #include "search.h" #include "start_real.h" #include "linguistics.h" #include "navit_nls.h" #include "atom.h" #include "command.h" #include "geom.h" #ifdef HAVE_API_WIN32_CE #include #include #endif char *version=PACKAGE_VERSION"+git:"GIT_VERSION""NAVIT_VARIANT; int main_argc; char * const* main_argv; static void print_usage(void) { printf("%s",_("navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, 2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n")); } #ifndef USE_PLUGINS extern void builtin_init(void); #endif /* USE_PLUGINS*/ int main_real(int argc, char * const* argv) { xmlerror *error = NULL; char *config_file = NULL, *command=NULL, *startup_file=NULL; int opt; char *cp; struct attr navit, conf; GList *list = NULL, *li; main_argc=argc; main_argv=argv; #ifdef HAVE_GLIB event_glib_init(); #else _g_slice_thread_init_nomessage(); #endif atom_init(); main_init(argv[0]); navit_nls_main_init(); debug_init(argv[0]); cp = getenv("NAVIT_LOGFILE"); if (cp) { debug_set_logfile(cp); } #ifdef HAVE_API_WIN32_CE else { debug_set_logfile("/Storage Card/navit.log"); } #endif file_init(); #ifndef USE_PLUGINS builtin_init(); #endif route_init(); navigation_init(); tracking_init(); search_init(); linguistics_init(); geom_init(); config_file=NULL; #ifdef HAVE_GETOPT_H opterr=0; //don't bomb out on errors. #endif /* _MSC_VER */ /* ingore iphone command line argument */ if (argc == 2 && !strcmp(argv[1],"-RegisterForSystemEvents")) argc=1; if (argc > 1) { /* Don't forget to update the manpage if you modify theses options */ while((opt = getopt(argc, argv, ":hvc:d:e:s:")) != -1) { switch(opt) { case 'h': print_usage(); exit(0); break; case 'v': printf("%s %s\n", "navit", version); exit(0); break; case 'c': printf("config file n is set to `%s'\n", optarg); config_file = optarg; break; case 'd': debug_set_global_level(atoi(optarg), 1); break; case 'e': command=optarg; break; case 's': startup_file=optarg; break; #ifdef HAVE_GETOPT_H case ':': fprintf(stderr, "navit: Error - Option `%c' needs a value\n", optopt); print_usage(); exit(2); break; case '?': fprintf(stderr, "navit: Error - No such option: `%c'\n", optopt); print_usage(); exit(3); #endif } } // use 1st cmd line option that is left for the config file if (optind < argc) config_file = argv[optind]; } // if config file is explicitely given only look for it, otherwise try std paths if (config_file) { list = g_list_append(list,g_strdup(config_file)); } else { list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_USER_DATADIR"), "/navit.xml" , NULL)); list = g_list_append(list,g_strdup("navit.xml.local")); list = g_list_append(list,g_strdup("navit.xml")); list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml.local" , NULL)); list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml" , NULL)); #ifndef _WIN32 list = g_list_append(list,g_strdup("/etc/navit/navit.xml")); #endif } li = list; for (;;) { if (li == NULL) { // We have not found an existing config file from all possibilities dbg(lvl_error, "%s", _("No config file navit.xml, navit.xml.local found\n")); return 4; } // Try the next config file possibility from the list config_file = li->data; dbg(lvl_debug,"trying %s\n",config_file); if (file_exists(config_file)) { break; } g_free(config_file); li = g_list_next(li); } dbg(lvl_debug,"Loading %s\n",config_file); if (!config_load(config_file, &error)) { dbg(lvl_error, _("Error parsing config file '%s': %s\n"), config_file, error ? error->message : ""); } else { dbg(lvl_info, _("Using config file '%s'\n"), config_file); } if (! config) { dbg(lvl_error, _("Error: No configuration found in config file '%s'\n"), config_file); } while (li) { g_free(li->data); li = g_list_next(li); } g_list_free(list); if (! (config && config_get_attr(config, attr_navit, &navit, NULL))) { dbg(lvl_error, "%s", _("Internal initialization failed, exiting. Check previous error messages.\n")); exit(5); } conf.type=attr_config; conf.u.config=config; if (startup_file) { FILE *f = fopen(startup_file,"r"); if (f) { char buffer[4096]; int fclose_ret; while(fgets(buffer, sizeof(buffer), f)) { command_evaluate(&conf, buffer); } fclose_ret = fclose(f); if (fclose_ret != 0) { dbg(lvl_error, "Could not close the specified startup file: %s\n", startup_file); } } else { dbg(lvl_error, "Could not open the specified startup file: %s", startup_file); } } if (command) { command_evaluate(&conf, command); } event_main_loop_run(); /* TODO: Android actually has no event loop, so we can't free all allocated resources here. Have to find better place to * free all allocations on program exit. And don't forget to free all the stuff allocated in the code above. */ #ifndef HAVE_API_ANDROID linguistics_free(); debug_finished(); #endif return 0; } navit-0.5.0+dfsg.1/navit/start_real.h000066400000000000000000000015261264204753600173620ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_MAIN_REAL_H #define NAVIT_MAIN_REAL_H int main_real(int argc, char * const* argv); #endif navit-0.5.0+dfsg.1/navit/startonce.sh000077500000000000000000000027301264204753600174100ustar00rootroot00000000000000#!/bin/sh # This script is part of navit, a navigation system. # It can be used to make sure that navit is only started # once. If navit is already running it will be brought to # the front. # Set this to a place where a pidfile should be stored. # Make sure you have write access... PIDFILE="/var/run/navit/navit.pid" # Set this to navit's executable. NAVIT="./navit" # Optional: Set this to an alternative configuration file #CONFIG="./navit.xml" ############################################################ ### You should not need to edit anything below this line ### ############################################################ function check_wmctrl() { which wmctrl > /dev/null if [ $? -ne 0 ] ; then echo "I need the 'wmctrl' program. Exit." exit 1 fi } function start_navit() { if [ "x" != "x$CONFIG" ] ; then $NAVIT -c $CONFIG & else $NAVIT & fi pid=$! echo -n "$pid" > $PIDFILE if [ $? -eq 0 ] ; then echo "Started navit with PID $pid." else kill $pid echo "Could not create pidfile!" exit 1 fi # Waiting for navit to close... wait $pid rm $PIDFILE } function check_navit() { if [ -f $PIDFILE ] ; then pid=`cat $PIDFILE` kill -0 $pid 2>/dev/null if [ $? -eq 0 ] ; then echo "Bringing Navit to front" winid=`wmctrl -l -p | grep -e "^[^:blank:]*[:blank:]*[^:blank:]*[:blank:]*$pid[:blank:]*" | sed 's/ .*//'` wmctrl -i -R $winid exit 0 fi fi } ### Start of the main script ### check_wmctrl check_navit start_navit navit-0.5.0+dfsg.1/navit/sunriset.c000066400000000000000000000307721264204753600170760ustar00rootroot00000000000000/* SUNRISET.C - computes Sun rise/set times, start/end of twilight, and the length of the day at any date and latitude Written as DAYLEN.C, 1989-08-16 Modified to SUNRISET.C, 1992-12-01 (c) Paul Schlyter, 1989, 1992 Released to the public domain by Paul Schlyter, December 1992 */ #include #include #include "sunriset.h" /* The "workhorse" function for sun rise/set times */ int __sunriset__( int year, int month, int day, double lon, double lat, double altit, int upper_limb, double *trise, double *tset ) /***************************************************************************/ /* Note: year,month,date = calendar date, 1801-2099 only. */ /* Eastern longitude positive, Western longitude negative */ /* Northern latitude positive, Southern latitude negative */ /* The longitude value IS critical in this function! */ /* altit = the altitude which the Sun should cross */ /* Set to -35/60 degrees for rise/set, -6 degrees */ /* for civil, -12 degrees for nautical and -18 */ /* degrees for astronomical twilight. */ /* upper_limb: non-zero -> upper limb, zero -> center */ /* Set to non-zero (e.g. 1) when computing rise/set */ /* times, and to zero when computing start/end of */ /* twilight. */ /* *rise = where to store the rise time */ /* *set = where to store the set time */ /* Both times are relative to the specified altitude, */ /* and thus this function can be used to comupte */ /* various twilight times, as well as rise/set times */ /* Return value: 0 = sun rises/sets this day, times stored at */ /* *trise and *tset. */ /* +1 = sun above the specified "horizon" 24 hours. */ /* *trise set to time when the sun is at south, */ /* minus 12 hours while *tset is set to the south */ /* time plus 12 hours. "Day" length = 24 hours */ /* -1 = sun is below the specified "horizon" 24 hours */ /* "Day" length = 0 hours, *trise and *tset are */ /* both set to the time when the sun is at south. */ /* */ /**********************************************************************/ { double d, /* Days since 2000 Jan 0.0 (negative before) */ sr, /* Solar distance, astronomical units */ sRA, /* Sun's Right Ascension */ sdec, /* Sun's declination */ sradius, /* Sun's apparent radius */ t, /* Diurnal arc */ tsouth, /* Time when Sun is at south */ sidtime; /* Local sidereal time */ int rc = 0; /* Return cde from function - usually 0 */ /* Compute d of 12h local mean solar time */ d = days_since_2000_Jan_0(year,month,day) + 0.5 - lon/360.0; /* Compute local sideral time of this moment */ sidtime = revolution( GMST0(d) + 180.0 + lon ); /* Compute Sun's RA + Decl at this moment */ sun_RA_dec( d, &sRA, &sdec, &sr ); /* Compute time when Sun is at south - in hours UT */ tsouth = 12.0 - rev180(sidtime - sRA)/15.0; /* Compute the Sun's apparent radius, degrees */ sradius = 0.2666 / sr; /* Do correction to upper limb, if necessary */ if ( upper_limb ) altit -= sradius; /* Compute the diurnal arc that the Sun traverses to reach */ /* the specified altitide altit: */ { double cost; cost = ( sind(altit) - sind(lat) * sind(sdec) ) / ( cosd(lat) * cosd(sdec) ); if ( cost >= 1.0 ) rc = -1, t = 0.0; /* Sun always below altit */ else if ( cost <= -1.0 ) rc = +1, t = 12.0; /* Sun always above altit */ else t = acosd(cost)/15.0; /* The diurnal arc, hours */ } /* Store rise and set times - in hours UT */ *trise = tsouth - t; *tset = tsouth + t; return rc; } /* __sunriset__ */ /* The "workhorse" function */ double __daylen__( int year, int month, int day, double lon, double lat, double altit, int upper_limb ) /**********************************************************************/ /* Note: year,month,date = calendar date, 1801-2099 only. */ /* Eastern longitude positive, Western longitude negative */ /* Northern latitude positive, Southern latitude negative */ /* The longitude value is not critical. Set it to the correct */ /* longitude if you're picky, otherwise set to to, say, 0.0 */ /* The latitude however IS critical - be sure to get it correct */ /* altit = the altitude which the Sun should cross */ /* Set to -35/60 degrees for rise/set, -6 degrees */ /* for civil, -12 degrees for nautical and -18 */ /* degrees for astronomical twilight. */ /* upper_limb: non-zero -> upper limb, zero -> center */ /* Set to non-zero (e.g. 1) when computing day length */ /* and to zero when computing day+twilight length. */ /**********************************************************************/ { double d, /* Days since 2000 Jan 0.0 (negative before) */ obl_ecl, /* Obliquity (inclination) of Earth's axis */ sr, /* Solar distance, astronomical units */ slon, /* True solar longitude */ sin_sdecl, /* Sine of Sun's declination */ cos_sdecl, /* Cosine of Sun's declination */ sradius, /* Sun's apparent radius */ t; /* Diurnal arc */ /* Compute d of 12h local mean solar time */ d = days_since_2000_Jan_0(year,month,day) + 0.5 - lon/360.0; /* Compute obliquity of ecliptic (inclination of Earth's axis) */ obl_ecl = 23.4393 - 3.563E-7 * d; /* Compute Sun's position */ sunpos( d, &slon, &sr ); /* Compute sine and cosine of Sun's declination */ sin_sdecl = sind(obl_ecl) * sind(slon); cos_sdecl = sqrt( 1.0 - sin_sdecl * sin_sdecl ); /* Compute the Sun's apparent radius, degrees */ sradius = 0.2666 / sr; /* Do correction to upper limb, if necessary */ if ( upper_limb ) altit -= sradius; /* Compute the diurnal arc that the Sun traverses to reach */ /* the specified altitide altit: */ { double cost; cost = ( sind(altit) - sind(lat) * sin_sdecl ) / ( cosd(lat) * cos_sdecl ); if ( cost >= 1.0 ) t = 0.0; /* Sun always below altit */ else if ( cost <= -1.0 ) t = 24.0; /* Sun always above altit */ else t = (2.0/15.0) * acosd(cost); /* The diurnal arc, hours */ } return t; } /* __daylen__ */ /* This function computes the Sun's position at any instant */ void sunpos( double d, double *lon, double *r ) /******************************************************/ /* Computes the Sun's ecliptic longitude and distance */ /* at an instant given in d, number of days since */ /* 2000 Jan 0.0. The Sun's ecliptic latitude is not */ /* computed, since it's always very near 0. */ /******************************************************/ { double M, /* Mean anomaly of the Sun */ w, /* Mean longitude of perihelion */ /* Note: Sun's mean longitude = M + w */ e, /* Eccentricity of Earth's orbit */ E, /* Eccentric anomaly */ x, y, /* x, y coordinates in orbit */ v; /* True anomaly */ /* Compute mean elements */ M = revolution( 356.0470 + 0.9856002585 * d ); w = 282.9404 + 4.70935E-5 * d; e = 0.016709 - 1.151E-9 * d; /* Compute true longitude and radius vector */ E = M + e * RADEG * sind(M) * ( 1.0 + e * cosd(M) ); x = cosd(E) - e; y = sqrt( 1.0 - e*e ) * sind(E); *r = sqrt( x*x + y*y ); /* Solar distance */ v = atan2d( y, x ); /* True anomaly */ *lon = v + w; /* True solar longitude */ if ( *lon >= 360.0 ) *lon -= 360.0; /* Make it 0..360 degrees */ } void sun_RA_dec( double d, double *RA, double *dec, double *r ) { double lon, obl_ecl; double xs, ys; double xe, ye, ze; /* Compute Sun's ecliptical coordinates */ sunpos( d, &lon, r ); /* Compute ecliptic rectangular coordinates */ xs = *r * cosd(lon); ys = *r * sind(lon); /* No zs, because the Sun is always in the ecliptic plane! */ /* Compute obliquity of ecliptic (inclination of Earth's axis) */ obl_ecl = 23.4393 - 3.563E-7 * d; /* Convert to equatorial rectangular coordinates - x is unchanged */ xe = xs; ye = ys * cosd(obl_ecl); ze = ys * sind(obl_ecl); /* Convert to spherical coordinates */ *RA = atan2d( ye, xe ); *dec = atan2d( ze, sqrt(xe*xe + ye*ye) ); } /* sun_RA_dec */ /******************************************************************/ /* This function reduces any angle to within the first revolution */ /* by subtracting or adding even multiples of 360.0 until the */ /* result is >= 0.0 and < 360.0 */ /******************************************************************/ #define INV360 ( 1.0 / 360.0 ) double revolution( double x ) /*****************************************/ /* Reduce angle to within 0..360 degrees */ /*****************************************/ { return( x - 360.0 * floor( x * INV360 ) ); } /* revolution */ double rev180( double x ) /*********************************************/ /* Reduce angle to within -180..+180 degrees */ /*********************************************/ { return( x - 360.0 * floor( x * INV360 + 0.5 ) ); } /* revolution */ /*******************************************************************/ /* This function computes GMST0, the Greenwhich Mean Sidereal Time */ /* at 0h UT (i.e. the sidereal time at the Greenwhich meridian at */ /* 0h UT). GMST is then the sidereal time at Greenwich at any */ /* time of the day. I've generelized GMST0 as well, and define it */ /* as: GMST0 = GMST - UT -- this allows GMST0 to be computed at */ /* other times than 0h UT as well. While this sounds somewhat */ /* contradictory, it is very practical: instead of computing */ /* GMST like: */ /* */ /* GMST = (GMST0) + UT * (366.2422/365.2422) */ /* */ /* where (GMST0) is the GMST last time UT was 0 hours, one simply */ /* computes: */ /* */ /* GMST = GMST0 + UT */ /* */ /* where GMST0 is the GMST "at 0h UT" but at the current moment! */ /* Defined in this way, GMST0 will increase with about 4 min a */ /* day. It also happens that GMST0 (in degrees, 1 hr = 15 degr) */ /* is equal to the Sun's mean longitude plus/minus 180 degrees! */ /* (if we neglect aberration, which amounts to 20 seconds of arc */ /* or 1.33 seconds of time) */ /* */ /*******************************************************************/ double GMST0( double d ) { double sidtim0; /* Sidtime at 0h UT = L (Sun's mean longitude) + 180.0 degr */ /* L = M + w, as defined in sunpos(). Since I'm too lazy to */ /* add these numbers, I'll let the C compiler do it for me. */ /* Any decent C compiler will add the constants at compile */ /* time, imposing no runtime or code overhead. */ sidtim0 = revolution( ( 180.0 + 356.0470 + 282.9404 ) + ( 0.9856002585 + 4.70935E-5 ) * d ); return sidtim0; } /* GMST0 */ navit-0.5.0+dfsg.1/navit/sunriset.h000066400000000000000000000116511264204753600170760ustar00rootroot00000000000000extern const char* timezone_name; extern long int timezone_offset; #define TMOD(x) ((x)<0?(x)+24:((x)>=24?(x)-24:(x))) #define DAYSOFF(x) ((x)<0?"(-1) ":((x)>=24?"(+1) ":"")) #define HOURS(h) ((int)(floor(h))) #define MINUTES(h) ((int)(60*(h-floor(h)))) #ifndef ABS #define ABS(x) ((x)<0?-(x):(x)) #endif /* A macro to compute the number of days elapsed since 2000 Jan 0.0 */ /* (which is equal to 1999 Dec 31, 0h UT) */ /* Dan R sez: This is some pretty fucking high magic. */ #define days_since_2000_Jan_0(y,m,d) \ (367L*(y)-((7*((y)+(((m)+9)/12)))/4)+((275*(m))/9)+(d)-730530L) /* Some conversion factors between radians and degrees */ #ifndef PI #define PI 3.1415926535897932384 #endif #define RADEG ( 180.0 / PI ) #define DEGRAD ( PI / 180.0 ) /* The trigonometric functions in degrees */ #define sind(x) sin((x)*DEGRAD) #define cosd(x) cos((x)*DEGRAD) #define tand(x) tan((x)*DEGRAD) #define atand(x) (RADEG*atan(x)) #define asind(x) (RADEG*asin(x)) #define acosd(x) (RADEG*acos(x)) #define atan2d(y,x) (RADEG*atan2(y,x)) /* Following are some macros around the "workhorse" function __daylen__ */ /* They mainly fill in the desired values for the reference altitude */ /* below the horizon, and also selects whether this altitude should */ /* refer to the Sun's center or its upper limb. */ /* This macro computes the length of the day, from sunrise to sunset. */ /* Sunrise/set is considered to occur when the Sun's upper limb is */ /* 50 arc minutes below the horizon (this accounts for the refraction */ /* of the Earth's atmosphere). */ /* The original version of the program used the value of 35 arc mins, */ /* which is the accepted value in Sweden. */ #define day_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -50.0/60.0, 1 ) /* This macro computes the length of the day, including civil twilight. */ /* Civil twilight starts/ends when the Sun's center is 6 degrees below */ /* the horizon. */ #define day_civil_twilight_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -6.0, 0 ) /* This macro computes the length of the day, incl. nautical twilight. */ /* Nautical twilight starts/ends when the Sun's center is 12 degrees */ /* below the horizon. */ #define day_nautical_twilight_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -12.0, 0 ) /* This macro computes the length of the day, incl. astronomical twilight. */ /* Astronomical twilight starts/ends when the Sun's center is 18 degrees */ /* below the horizon. */ #define day_astronomical_twilight_length(year,month,day,lon,lat) \ __daylen__( year, month, day, lon, lat, -18.0, 0 ) /* This macro computes times for sunrise/sunset. */ /* Sunrise/set is considered to occur when the Sun's upper limb is */ /* 35 arc minutes below the horizon (this accounts for the refraction */ /* of the Earth's atmosphere). */ #define sun_rise_set(year,month,day,lon,lat,rise,set) \ __sunriset__( year, month, day, lon, lat, -35.0/60.0, 1, rise, set ) /* This macro computes the start and end times of civil twilight. */ /* Civil twilight starts/ends when the Sun's center is 6 degrees below */ /* the horizon. */ #define civil_twilight(year,month,day,lon,lat,start,end) \ __sunriset__( year, month, day, lon, lat, -6.0, 0, start, end ) /* This macro computes the start and end times of nautical twilight. */ /* Nautical twilight starts/ends when the Sun's center is 12 degrees */ /* below the horizon. */ #define nautical_twilight(year,month,day,lon,lat,start,end) \ __sunriset__( year, month, day, lon, lat, -12.0, 0, start, end ) /* This macro computes the start and end times of astronomical twilight. */ /* Astronomical twilight starts/ends when the Sun's center is 18 degrees */ /* below the horizon. */ #define astronomical_twilight(year,month,day,lon,lat,start,end) \ __sunriset__( year, month, day, lon, lat, -18.0, 0, start, end ) /* Function prototypes */ double __daylen__( int year, int month, int day, double lon, double lat, double altit, int upper_limb ); int __sunriset__( int year, int month, int day, double lon, double lat, double altit, int upper_limb, double *rise, double *set ); void sunpos( double d, double *lon, double *r ); void sun_RA_dec( double d, double *RA, double *dec, double *r ); double revolution( double x ); double rev180( double x ); double GMST0( double d ); navit-0.5.0+dfsg.1/navit/support/000077500000000000000000000000001264204753600165615ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/support/Makefile.am000066400000000000000000000007601264204753600206200ustar00rootroot00000000000000SUBDIRS= if SUPPORT_ESPEAK SUBDIRS+=espeak endif if SUPPORT_EZXML SUBDIRS+=ezxml endif if SUPPORT_GLIB SUBDIRS+=glib endif if SUPPORT_WORDEXP SUBDIRS+=wordexp endif if SUPPORT_WIN32 SUBDIRS+=win32 endif if SUPPORT_ZLIB SUBDIRS+=zlib endif if SUPPORT_LIBC SUBDIRS+=libc endif if SUPPORT_LIBPNG SUBDIRS+=libpng endif if SPEECH_ESPEAK SUBDIRS+=espeak endif if !HAVE_SYSTEM_SHAPEFILELIB SUBDIRS+=shapefile endif DIST_SUBDIRS=espeak ezxml glib wordexp win32 zlib libc libpng shapefile navit-0.5.0+dfsg.1/navit/support/shapefile/000077500000000000000000000000001264204753600205215ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/support/shapefile/CMakeLists.txt000066400000000000000000000001101264204753600232510ustar00rootroot00000000000000supportlib_add_library(support_shapefile dbfopen.c shpopen.c shptree.c) navit-0.5.0+dfsg.1/navit/support/shapefile/Makefile.am000066400000000000000000000003511264204753600225540ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_shapefile noinst_LTLIBRARIES = libsupport_shapefile.la libsupport_shapefile_la_SOURCES = dbfopen.c shpopen.c shptree.c shapefil.h navit-0.5.0+dfsg.1/navit/support/shapefile/dbfopen.c000066400000000000000000002017661264204753600223160ustar00rootroot00000000000000/****************************************************************************** * $Id: dbfopen.c,v 1.83 2008/11/12 14:28:15 fwarmerdam Exp $ * * Project: Shapelib * Purpose: Implementation of .dbf access API documented in dbf_api.html. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: dbfopen.c,v $ * Revision 1.83 2008/11/12 14:28:15 fwarmerdam * DBFCreateField() now works on files with records * * Revision 1.82 2008/11/11 17:47:09 fwarmerdam * added DBFDeleteField() function * * Revision 1.81 2008/01/03 17:48:13 bram * in DBFCreate, use default code page LDID/87 (= 0x57, ANSI) * instead of LDID/3. This seems to be the same as what ESRI * would be doing by default. * * Revision 1.80 2007/12/30 14:36:39 fwarmerdam * avoid syntax issue with last comment. * * Revision 1.79 2007/12/30 14:35:48 fwarmerdam * Avoid char* / unsigned char* warnings. * * Revision 1.78 2007/12/18 18:28:07 bram * - create hook for client specific atof (bugzilla ticket 1615) * - check for NULL handle before closing cpCPG file, and close after reading. * * Revision 1.77 2007/12/15 20:25:21 bram * dbfopen.c now reads the Code Page information from the DBF file, and exports * this information as a string through the DBFGetCodePage function. This is * either the number from the LDID header field ("LDID/") or as the * content of an accompanying .CPG file. When creating a DBF file, the code can * be set using DBFCreateEx. * * Revision 1.76 2007/12/12 22:21:32 bram * DBFClose: check for NULL psDBF handle before trying to close it. * * Revision 1.75 2007/12/06 13:58:19 fwarmerdam * make sure file offset calculations are done in as SAOffset * * Revision 1.74 2007/12/06 07:00:25 fwarmerdam * dbfopen now using SAHooks for fileio * * Revision 1.73 2007/09/03 19:48:11 fwarmerdam * move DBFReadAttribute() static dDoubleField into dbfinfo * * Revision 1.72 2007/09/03 19:34:06 fwarmerdam * Avoid use of static tuple buffer in DBFReadTuple() * * Revision 1.71 2006/06/22 14:37:18 fwarmerdam * avoid memory leak if dbfopen fread fails * * Revision 1.70 2006/06/17 17:47:05 fwarmerdam * use calloc() for dbfinfo in DBFCreate * * Revision 1.69 2006/06/17 15:34:32 fwarmerdam * disallow creating fields wider than 255 * * Revision 1.68 2006/06/17 15:12:40 fwarmerdam * Fixed C++ style comments. * * Revision 1.67 2006/06/17 00:24:53 fwarmerdam * Don't treat non-zero decimals values as high order byte for length * for strings. It causes serious corruption for some files. * http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 * * Revision 1.66 2006/03/29 18:26:20 fwarmerdam * fixed bug with size of pachfieldtype in dbfcloneempty * * Revision 1.65 2006/02/15 01:14:30 fwarmerdam * added DBFAddNativeFieldType * * Revision 1.64 2006/02/09 00:29:04 fwarmerdam * Changed to put spaces into string fields that are NULL as * per http://bugzilla.maptools.org/show_bug.cgi?id=316. * * Revision 1.63 2006/01/25 15:35:43 fwarmerdam * check success on DBFFlushRecord * * Revision 1.62 2006/01/10 16:28:03 fwarmerdam * Fixed typo in CPLError. * * Revision 1.61 2006/01/10 16:26:29 fwarmerdam * Push loading record buffer into DBFLoadRecord. * Implement CPL error reporting if USE_CPL defined. * * Revision 1.60 2006/01/05 01:27:27 fwarmerdam * added dbf deletion mark/fetch * * Revision 1.59 2005/03/14 15:20:28 fwarmerdam * Fixed last change. * * Revision 1.58 2005/03/14 15:18:54 fwarmerdam * Treat very wide fields with no decimals as double. This is * more than 32bit integer fields. * * Revision 1.57 2005/02/10 20:16:54 fwarmerdam * Make the pszStringField buffer for DBFReadAttribute() static char [256] * as per bug 306. * * Revision 1.56 2005/02/10 20:07:56 fwarmerdam * Fixed bug 305 in DBFCloneEmpty() - header length problem. * * Revision 1.55 2004/09/26 20:23:46 fwarmerdam * avoid warnings with rcsid and signed/unsigned stuff * * Revision 1.54 2004/09/15 16:26:10 fwarmerdam * Treat all blank numeric fields as null too. */ #include "shapefil.h" #include #include #include #include #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* DBFWriteHeader() */ /* */ /* This is called to write out the file header, and field */ /* descriptions before writing any actual data records. This */ /* also computes all the DBFDataSet field offset/size/decimals */ /* and so forth values. */ /************************************************************************/ static void DBFWriteHeader(DBFHandle psDBF) { unsigned char abyHeader[XBASE_FLDHDR_SZ]; int i; if( !psDBF->bNoHeader ) return; psDBF->bNoHeader = FALSE; /* -------------------------------------------------------------------- */ /* Initialize the file header information. */ /* -------------------------------------------------------------------- */ for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) abyHeader[i] = 0; abyHeader[0] = 0x03; /* memo field? - just copying */ /* write out a dummy date */ abyHeader[1] = 95; /* YY */ abyHeader[2] = 7; /* MM */ abyHeader[3] = 26; /* DD */ /* record count preset at zero */ abyHeader[8] = (unsigned char) (psDBF->nHeaderLength % 256); abyHeader[9] = (unsigned char) (psDBF->nHeaderLength / 256); abyHeader[10] = (unsigned char) (psDBF->nRecordLength % 256); abyHeader[11] = (unsigned char) (psDBF->nRecordLength / 256); abyHeader[29] = (unsigned char) (psDBF->iLanguageDriver); /* -------------------------------------------------------------------- */ /* Write the initial 32 byte file header, and all the field */ /* descriptions. */ /* -------------------------------------------------------------------- */ psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); psDBF->sHooks.FWrite( abyHeader, XBASE_FLDHDR_SZ, 1, psDBF->fp ); psDBF->sHooks.FWrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, psDBF->fp ); /* -------------------------------------------------------------------- */ /* Write out the newline character if there is room for it. */ /* -------------------------------------------------------------------- */ if( psDBF->nHeaderLength > 32*psDBF->nFields + 32 ) { char cNewline; cNewline = 0x0d; psDBF->sHooks.FWrite( &cNewline, 1, 1, psDBF->fp ); } } /************************************************************************/ /* DBFFlushRecord() */ /* */ /* Write out the current record if there is one. */ /************************************************************************/ static int DBFFlushRecord( DBFHandle psDBF ) { SAOffset nRecordOffset; if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) { psDBF->bCurrentRecordModified = FALSE; nRecordOffset = psDBF->nRecordLength * (SAOffset) psDBF->nCurrentRecord + psDBF->nHeaderLength; if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ) != 0 || psDBF->sHooks.FWrite( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_FileIO, "Failure writing DBF record %d.", psDBF->nCurrentRecord ); #else fprintf( stderr, "Failure writing DBF record %d.", psDBF->nCurrentRecord ); #endif return FALSE; } } return TRUE; } /************************************************************************/ /* DBFLoadRecord() */ /************************************************************************/ static int DBFLoadRecord( DBFHandle psDBF, int iRecord ) { if( psDBF->nCurrentRecord != iRecord ) { SAOffset nRecordOffset; if( !DBFFlushRecord( psDBF ) ) return FALSE; nRecordOffset = psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, SEEK_SET ) != 0 ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_FileIO, "fseek(%ld) failed on DBF file.\n", (long) nRecordOffset ); #else fprintf( stderr, "fseek(%ld) failed on DBF file.\n", (long) nRecordOffset ); #endif return FALSE; } if( psDBF->sHooks.FRead( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_FileIO, "fread(%d) failed on DBF file.\n", psDBF->nRecordLength ); #else fprintf( stderr, "fread(%d) failed on DBF file.\n", psDBF->nRecordLength ); #endif return FALSE; } psDBF->nCurrentRecord = iRecord; } return TRUE; } /************************************************************************/ /* DBFUpdateHeader() */ /************************************************************************/ void SHPAPI_CALL DBFUpdateHeader( DBFHandle psDBF ) { unsigned char abyFileHeader[32]; if( psDBF->bNoHeader ) DBFWriteHeader( psDBF ); DBFFlushRecord( psDBF ); psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); psDBF->sHooks.FRead( abyFileHeader, 32, 1, psDBF->fp ); abyFileHeader[4] = (unsigned char) (psDBF->nRecords % 256); abyFileHeader[5] = (unsigned char) ((psDBF->nRecords/256) % 256); abyFileHeader[6] = (unsigned char) ((psDBF->nRecords/(256*256)) % 256); abyFileHeader[7] = (unsigned char) ((psDBF->nRecords/(256*256*256)) % 256); psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); psDBF->sHooks.FWrite( abyFileHeader, 32, 1, psDBF->fp ); psDBF->sHooks.FFlush( psDBF->fp ); } /************************************************************************/ /* DBFOpen() */ /* */ /* Open a .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFOpen( const char * pszFilename, const char * pszAccess ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return DBFOpenLL( pszFilename, pszAccess, &sHooks ); } /************************************************************************/ /* DBFOpen() */ /* */ /* Open a .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) { DBFHandle psDBF; SAFile pfCPG; unsigned char *pabyBuf; int nFields, nHeadLen, iField, i; char *pszBasename, *pszFullname; int nBufSize = 500; /* -------------------------------------------------------------------- */ /* We only allow the access strings "rb" and "r+". */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 && strcmp(pszAccess,"r+b") != 0 ) return( NULL ); if( strcmp(pszAccess,"r") == 0 ) pszAccess = "rb"; if( strcmp(pszAccess,"r+") == 0 ) pszAccess = "rb+"; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) ); psDBF->fp = psHooks->FOpen( pszFullname, pszAccess ); memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); if( psDBF->fp == NULL ) { sprintf( pszFullname, "%s.DBF", pszBasename ); psDBF->fp = psDBF->sHooks.FOpen(pszFullname, pszAccess ); } sprintf( pszFullname, "%s.cpg", pszBasename ); pfCPG = psHooks->FOpen( pszFullname, "r" ); if( pfCPG == NULL ) { sprintf( pszFullname, "%s.CPG", pszBasename ); pfCPG = psHooks->FOpen( pszFullname, "r" ); } free( pszBasename ); free( pszFullname ); if( psDBF->fp == NULL ) { free( psDBF ); if( pfCPG ) psHooks->FClose( pfCPG ); return( NULL ); } psDBF->bNoHeader = FALSE; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; /* -------------------------------------------------------------------- */ /* Read Table Header info */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) malloc(nBufSize); if( psDBF->sHooks.FRead( pabyBuf, 32, 1, psDBF->fp ) != 1 ) { psDBF->sHooks.FClose( psDBF->fp ); if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); free( pabyBuf ); free( psDBF ); return NULL; } psDBF->nRecords = pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + pabyBuf[7]*256*256*256; psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256; psDBF->nRecordLength = pabyBuf[10] + pabyBuf[11]*256; psDBF->iLanguageDriver = pabyBuf[29]; psDBF->nFields = nFields = (nHeadLen - 32) / 32; psDBF->pszCurrentRecord = (char *) malloc(psDBF->nRecordLength); /* -------------------------------------------------------------------- */ /* Figure out the code page from the LDID and CPG */ /* -------------------------------------------------------------------- */ psDBF->pszCodePage = NULL; if( pfCPG ) { size_t n; char *buffer = (char *) pabyBuf; buffer[0] = '\0'; psDBF->sHooks.FRead( pabyBuf, nBufSize - 1, 1, pfCPG ); n = strcspn( (char *) pabyBuf, "\n\r" ); if( n > 0 ) { pabyBuf[n] = '\0'; psDBF->pszCodePage = (char *) malloc(n + 1); memcpy( psDBF->pszCodePage, pabyBuf, n + 1 ); } psDBF->sHooks.FClose( pfCPG ); } if( psDBF->pszCodePage == NULL && pabyBuf[29] != 0 ) { sprintf( (char *) pabyBuf, "LDID/%d", psDBF->iLanguageDriver ); psDBF->pszCodePage = (char *) malloc(strlen((char*)pabyBuf) + 1); strcpy( psDBF->pszCodePage, (char *) pabyBuf ); } /* -------------------------------------------------------------------- */ /* Read in Field Definitions */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen); psDBF->pszHeader = (char *) pabyBuf; psDBF->sHooks.FSeek( psDBF->fp, 32, 0 ); if( psDBF->sHooks.FRead( pabyBuf, nHeadLen-32, 1, psDBF->fp ) != 1 ) { psDBF->sHooks.FClose( psDBF->fp ); free( pabyBuf ); free( psDBF->pszCurrentRecord ); free( psDBF ); return NULL; } psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields); psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields); for( iField = 0; iField < nFields; iField++ ) { unsigned char *pabyFInfo; pabyFInfo = pabyBuf+iField*32; if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) { psDBF->panFieldSize[iField] = pabyFInfo[16]; psDBF->panFieldDecimals[iField] = pabyFInfo[17]; } else { psDBF->panFieldSize[iField] = pabyFInfo[16]; psDBF->panFieldDecimals[iField] = 0; /* ** The following seemed to be used sometimes to handle files with long ** string fields, but in other cases (such as bug 1202) the decimals field ** just seems to indicate some sort of preferred formatting, not very ** wide fields. So I have disabled this code. FrankW. psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; psDBF->panFieldDecimals[iField] = 0; */ } psDBF->pachFieldType[iField] = (char) pabyFInfo[11]; if( iField == 0 ) psDBF->panFieldOffset[iField] = 1; else psDBF->panFieldOffset[iField] = psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; } return( psDBF ); } /************************************************************************/ /* DBFClose() */ /************************************************************************/ void SHPAPI_CALL DBFClose(DBFHandle psDBF) { if( psDBF == NULL ) return; /* -------------------------------------------------------------------- */ /* Write out header if not already written. */ /* -------------------------------------------------------------------- */ if( psDBF->bNoHeader ) DBFWriteHeader( psDBF ); DBFFlushRecord( psDBF ); /* -------------------------------------------------------------------- */ /* Update last access date, and number of records if we have */ /* write access. */ /* -------------------------------------------------------------------- */ if( psDBF->bUpdated ) DBFUpdateHeader( psDBF ); /* -------------------------------------------------------------------- */ /* Close, and free resources. */ /* -------------------------------------------------------------------- */ psDBF->sHooks.FClose( psDBF->fp ); if( psDBF->panFieldOffset != NULL ) { free( psDBF->panFieldOffset ); free( psDBF->panFieldSize ); free( psDBF->panFieldDecimals ); free( psDBF->pachFieldType ); } if( psDBF->pszWorkField != NULL ) free( psDBF->pszWorkField ); free( psDBF->pszHeader ); free( psDBF->pszCurrentRecord ); free( psDBF->pszCodePage ); free( psDBF ); } /************************************************************************/ /* DBFCreate() */ /* */ /* Create a new .dbf file with default code page LDID/87 (0x57) */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCreate( const char * pszFilename ) { return DBFCreateEx( pszFilename, "LDID/87" ); // 0x57 } /************************************************************************/ /* DBFCreateEx() */ /* */ /* Create a new .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCreateEx( const char * pszFilename, const char* pszCodePage ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return DBFCreateLL( pszFilename, pszCodePage , &sHooks ); } /************************************************************************/ /* DBFCreate() */ /* */ /* Create a new .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHooks ) { DBFHandle psDBF; SAFile fp; char *pszFullname, *pszBasename; int i, ldid = -1; char chZero = '\0'; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); /* -------------------------------------------------------------------- */ /* Create the file. */ /* -------------------------------------------------------------------- */ fp = psHooks->FOpen( pszFullname, "wb" ); if( fp == NULL ) return( NULL ); psHooks->FWrite( &chZero, 1, 1, fp ); psHooks->FClose( fp ); fp = psHooks->FOpen( pszFullname, "rb+" ); if( fp == NULL ) return( NULL ); sprintf( pszFullname, "%s.cpg", pszBasename ); if( pszCodePage != NULL ) { if( strncmp( pszCodePage, "LDID/", 5 ) == 0 ) { ldid = atoi( pszCodePage + 5 ); if( ldid > 255 ) ldid = -1; // don't use 0 to indicate out of range as LDID/0 is a valid one } if( ldid < 0 ) { SAFile fpCPG = psHooks->FOpen( pszFullname, "w" ); psHooks->FWrite( (char*) pszCodePage, strlen(pszCodePage), 1, fpCPG ); psHooks->FClose( fpCPG ); } } if( pszCodePage == NULL || ldid >= 0 ) { psHooks->Remove( pszFullname ); } free( pszBasename ); free( pszFullname ); /* -------------------------------------------------------------------- */ /* Create the info structure. */ /* -------------------------------------------------------------------- */ psDBF = (DBFHandle) calloc(1,sizeof(DBFInfo)); memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); psDBF->fp = fp; psDBF->nRecords = 0; psDBF->nFields = 0; psDBF->nRecordLength = 1; psDBF->nHeaderLength = 33; psDBF->panFieldOffset = NULL; psDBF->panFieldSize = NULL; psDBF->panFieldDecimals = NULL; psDBF->pachFieldType = NULL; psDBF->pszHeader = NULL; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; psDBF->pszCurrentRecord = NULL; psDBF->bNoHeader = TRUE; psDBF->iLanguageDriver = ldid > 0 ? ldid : 0; psDBF->pszCodePage = NULL; if( pszCodePage ) { psDBF->pszCodePage = (char * ) malloc( strlen(pszCodePage) + 1 ); strcpy( psDBF->pszCodePage, pszCodePage ); } return( psDBF ); } /************************************************************************/ /* DBFAddField() */ /* */ /* Add a field to a newly created .dbf or to an existing one */ /************************************************************************/ int SHPAPI_CALL DBFAddField(DBFHandle psDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ) { char chNativeType = 'C'; if( eType == FTLogical ) chNativeType = 'L'; else if( eType == FTString ) chNativeType = 'C'; else chNativeType = 'N'; return DBFAddNativeFieldType( psDBF, pszFieldName, chNativeType, nWidth, nDecimals ); } /************************************************************************/ /* DBFAddField() */ /* */ /* Add a field to a newly created .dbf file before any records */ /* are written. */ /************************************************************************/ int SHPAPI_CALL DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, char chType, int nWidth, int nDecimals ) { char *pszFInfo; int i; int nOldRecordLength, nOldHeaderLength; char *pszRecord; char chFieldFill; SAOffset nRecordOffset; /* -------------------------------------------------------------------- */ /* Do some checking to ensure we can add records to this file. */ /* -------------------------------------------------------------------- */ if( nWidth < 1 ) return -1; if( nWidth > 255 ) nWidth = 255; nOldRecordLength = psDBF->nRecordLength; nOldHeaderLength = psDBF->nHeaderLength; /* -------------------------------------------------------------------- */ /* SfRealloc all the arrays larger to hold the additional field */ /* information. */ /* -------------------------------------------------------------------- */ psDBF->nFields++; psDBF->panFieldOffset = (int *) SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); psDBF->panFieldSize = (int *) SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); psDBF->panFieldDecimals = (int *) SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); psDBF->pachFieldType = (char *) SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); /* -------------------------------------------------------------------- */ /* Assign the new field information fields. */ /* -------------------------------------------------------------------- */ psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; psDBF->nRecordLength += nWidth; psDBF->panFieldSize[psDBF->nFields-1] = nWidth; psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; psDBF->pachFieldType[psDBF->nFields-1] = chType; /* -------------------------------------------------------------------- */ /* Extend the required header information. */ /* -------------------------------------------------------------------- */ psDBF->nHeaderLength += 32; psDBF->bUpdated = FALSE; psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); pszFInfo = psDBF->pszHeader + 32 * (psDBF->nFields-1); for( i = 0; i < 32; i++ ) pszFInfo[i] = '\0'; if( (int) strlen(pszFieldName) < 10 ) strncpy( pszFInfo, pszFieldName, strlen(pszFieldName)); else strncpy( pszFInfo, pszFieldName, 10); pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; if( chType == 'C' ) { pszFInfo[16] = (unsigned char) (nWidth % 256); pszFInfo[17] = (unsigned char) (nWidth / 256); } else { pszFInfo[16] = (unsigned char) nWidth; pszFInfo[17] = (unsigned char) nDecimals; } /* -------------------------------------------------------------------- */ /* Make the current record buffer appropriately larger. */ /* -------------------------------------------------------------------- */ psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, psDBF->nRecordLength); /* we're done if dealing with new .dbf */ if( psDBF->bNoHeader ) return( psDBF->nFields - 1 ); /* -------------------------------------------------------------------- */ /* For existing .dbf file, shift records */ /* -------------------------------------------------------------------- */ /* alloc record */ pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); switch (chType) { case 'N': case 'F': chFieldFill = '*'; break; case 'D': chFieldFill = '0'; break; case 'L': chFieldFill = '?'; break; default: chFieldFill = ' '; break; } for (i = psDBF->nRecords-1; i >= 0; --i) { nRecordOffset = nOldRecordLength * (SAOffset) i + nOldHeaderLength; /* load record */ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); /* set new field's value to NULL */ memset(pszRecord + nOldRecordLength, chFieldFill, nWidth); nRecordOffset = psDBF->nRecordLength * (SAOffset) i + psDBF->nHeaderLength; /* move record to the new place*/ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); } /* free record */ free(pszRecord); /* force update of header with new header, record length and new field */ psDBF->bNoHeader = TRUE; DBFUpdateHeader( psDBF ); return( psDBF->nFields-1 ); } /************************************************************************/ /* DBFReadAttribute() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, char chReqType ) { unsigned char *pabyRec; void *pReturnField = NULL; /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( iField < 0 || iField >= psDBF->nFields ) return( NULL ); /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return NULL; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Ensure we have room to extract the target field. */ /* -------------------------------------------------------------------- */ if( psDBF->panFieldSize[iField] >= psDBF->nWorkFieldLength ) { psDBF->nWorkFieldLength = psDBF->panFieldSize[iField] + 100; if( psDBF->pszWorkField == NULL ) psDBF->pszWorkField = (char *) malloc(psDBF->nWorkFieldLength); else psDBF->pszWorkField = (char *) realloc(psDBF->pszWorkField, psDBF->nWorkFieldLength); } /* -------------------------------------------------------------------- */ /* Extract the requested field. */ /* -------------------------------------------------------------------- */ strncpy( psDBF->pszWorkField, ((const char *) pabyRec) + psDBF->panFieldOffset[iField], psDBF->panFieldSize[iField] ); psDBF->pszWorkField[psDBF->panFieldSize[iField]] = '\0'; pReturnField = psDBF->pszWorkField; /* -------------------------------------------------------------------- */ /* Decode the field. */ /* -------------------------------------------------------------------- */ if( chReqType == 'N' ) { psDBF->dfDoubleField = psDBF->sHooks.Atof(psDBF->pszWorkField); pReturnField = &(psDBF->dfDoubleField); } /* -------------------------------------------------------------------- */ /* Should we trim white space off the string attribute value? */ /* -------------------------------------------------------------------- */ #ifdef TRIM_DBF_WHITESPACE else { char *pchSrc, *pchDst; pchDst = pchSrc = psDBF->pszWorkField; while( *pchSrc == ' ' ) pchSrc++; while( *pchSrc != '\0' ) *(pchDst++) = *(pchSrc++); *pchDst = '\0'; while( pchDst != psDBF->pszWorkField && *(--pchDst) == ' ' ) *pchDst = '\0'; } #endif return( pReturnField ); } /************************************************************************/ /* DBFReadIntAttribute() */ /* */ /* Read an integer attribute. */ /************************************************************************/ int SHPAPI_CALL DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0; else return( (int) *pdValue ); } /************************************************************************/ /* DBFReadDoubleAttribute() */ /* */ /* Read a double attribute. */ /************************************************************************/ double SHPAPI_CALL DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0.0; else return( *pdValue ); } /************************************************************************/ /* DBFReadStringAttribute() */ /* */ /* Read a string attribute. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); } /************************************************************************/ /* DBFReadLogicalAttribute() */ /* */ /* Read a logical attribute. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) ); } /************************************************************************/ /* DBFIsAttributeNULL() */ /* */ /* Return TRUE if value for field is NULL. */ /* */ /* Contributed by Jim Matthews. */ /************************************************************************/ int SHPAPI_CALL DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) { const char *pszValue; int i; pszValue = DBFReadStringAttribute( psDBF, iRecord, iField ); if( pszValue == NULL ) return TRUE; switch(psDBF->pachFieldType[iField]) { case 'N': case 'F': /* ** We accept all asterisks or all blanks as NULL ** though according to the spec I think it should be all ** asterisks. */ if( pszValue[0] == '*' ) return TRUE; for( i = 0; pszValue[i] != '\0'; i++ ) { if( pszValue[i] != ' ' ) return FALSE; } return TRUE; case 'D': /* NULL date fields have value "00000000" */ return strncmp(pszValue,"00000000",8) == 0; case 'L': /* NULL boolean fields have value "?" */ return pszValue[0] == '?'; default: /* empty string fields are considered NULL */ return strlen(pszValue) == 0; } } /************************************************************************/ /* DBFGetFieldCount() */ /* */ /* Return the number of fields in this table. */ /************************************************************************/ int SHPAPI_CALL DBFGetFieldCount( DBFHandle psDBF ) { return( psDBF->nFields ); } /************************************************************************/ /* DBFGetRecordCount() */ /* */ /* Return the number of records in this table. */ /************************************************************************/ int SHPAPI_CALL DBFGetRecordCount( DBFHandle psDBF ) { return( psDBF->nRecords ); } /************************************************************************/ /* DBFGetFieldInfo() */ /* */ /* Return any requested information about the field. */ /************************************************************************/ DBFFieldType SHPAPI_CALL DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ) { if( iField < 0 || iField >= psDBF->nFields ) return( FTInvalid ); if( pnWidth != NULL ) *pnWidth = psDBF->panFieldSize[iField]; if( pnDecimals != NULL ) *pnDecimals = psDBF->panFieldDecimals[iField]; if( pszFieldName != NULL ) { int i; strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 ); pszFieldName[11] = '\0'; for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- ) pszFieldName[i] = '\0'; } if ( psDBF->pachFieldType[iField] == 'L' ) return( FTLogical); else if( psDBF->pachFieldType[iField] == 'N' || psDBF->pachFieldType[iField] == 'F' ) { if( psDBF->panFieldDecimals[iField] > 0 || psDBF->panFieldSize[iField] > 10 ) return( FTDouble ); else return( FTInteger ); } else { return( FTString ); } } /************************************************************************/ /* DBFWriteAttribute() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, void * pValue ) { int i, j, nRetResult = TRUE; unsigned char *pabyRec; char szSField[400], szFormat[20]; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { if( !DBFFlushRecord( psDBF ) ) return FALSE; psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return FALSE; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; /* -------------------------------------------------------------------- */ /* Translate NULL value to valid DBF file representation. */ /* */ /* Contributed by Jim Matthews. */ /* -------------------------------------------------------------------- */ if( pValue == NULL ) { switch(psDBF->pachFieldType[iField]) { case 'N': case 'F': /* NULL numeric fields have value "****************" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '*', psDBF->panFieldSize[iField] ); break; case 'D': /* NULL date fields have value "00000000" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '0', psDBF->panFieldSize[iField] ); break; case 'L': /* NULL boolean fields have value "?" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '?', psDBF->panFieldSize[iField] ); break; default: /* empty string fields are considered NULL */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), ' ', psDBF->panFieldSize[iField] ); break; } return TRUE; } /* -------------------------------------------------------------------- */ /* Assign all the record fields. */ /* -------------------------------------------------------------------- */ switch( psDBF->pachFieldType[iField] ) { case 'D': case 'N': case 'F': if( psDBF->panFieldDecimals[iField] == 0 ) { int nWidth = psDBF->panFieldSize[iField]; if( (int) sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%dd", nWidth ); sprintf(szSField, szFormat, (int) *((double *) pValue) ); if( (int)strlen(szSField) > psDBF->panFieldSize[iField] ) { szSField[psDBF->panFieldSize[iField]] = '\0'; nRetResult = FALSE; } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } else { int nWidth = psDBF->panFieldSize[iField]; if( (int) sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%d.%df", nWidth, psDBF->panFieldDecimals[iField] ); sprintf(szSField, szFormat, *((double *) pValue) ); if( (int) strlen(szSField) > psDBF->panFieldSize[iField] ) { szSField[psDBF->panFieldSize[iField]] = '\0'; nRetResult = FALSE; } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } break; case 'L': if (psDBF->panFieldSize[iField] >= 1 && (*(char*)pValue == 'F' || *(char*)pValue == 'T')) *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue; break; default: if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] ) { j = psDBF->panFieldSize[iField]; nRetResult = FALSE; } else { memset( pabyRec+psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField] ); j = strlen((char *) pValue); } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), (char *) pValue, j ); break; } return( nRetResult ); } /************************************************************************/ /* DBFWriteAttributeDirectly() */ /* */ /* Write an attribute record to the file, but without any */ /* reformatting based on type. The provided buffer is written */ /* as is to the field position in the record. */ /************************************************************************/ int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, void * pValue ) { int i, j; unsigned char *pabyRec; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { if( !DBFFlushRecord( psDBF ) ) return FALSE; psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return FALSE; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Assign all the record fields. */ /* -------------------------------------------------------------------- */ if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] ) j = psDBF->panFieldSize[iField]; else { memset( pabyRec+psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField] ); j = strlen((char *) pValue); } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), (char *) pValue, j ); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFWriteDoubleAttribute() */ /* */ /* Write a double attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, double dValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteIntegerAttribute() */ /* */ /* Write a integer attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, int nValue ) { double dValue = nValue; return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteStringAttribute() */ /* */ /* Write a string attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, const char * pszValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) ); } /************************************************************************/ /* DBFWriteNULLAttribute() */ /* */ /* Write a string attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) ); } /************************************************************************/ /* DBFWriteLogicalAttribute() */ /* */ /* Write a logical attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField, const char lValue) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) ); } /************************************************************************/ /* DBFWriteTuple() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) { int i; unsigned char *pabyRec; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { if( !DBFFlushRecord( psDBF ) ) return FALSE; psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, hEntity ) ) return FALSE; pabyRec = (unsigned char *) psDBF->pszCurrentRecord; memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFReadTuple() */ /* */ /* Read a complete record. Note that the result is only valid */ /* till the next record read for any reason. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity ) { if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( !DBFLoadRecord( psDBF, hEntity ) ) return NULL; return (const char *) psDBF->pszCurrentRecord; } /************************************************************************/ /* DBFCloneEmpty() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) { DBFHandle newDBF; newDBF = DBFCreateEx ( pszFilename, psDBF->pszCodePage ); if ( newDBF == NULL ) return ( NULL ); newDBF->nFields = psDBF->nFields; newDBF->nRecordLength = psDBF->nRecordLength; newDBF->nHeaderLength = psDBF->nHeaderLength; newDBF->pszHeader = (char *) malloc ( newDBF->nHeaderLength ); memcpy ( newDBF->pszHeader, psDBF->pszHeader, newDBF->nHeaderLength ); newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); newDBF->pachFieldType = (char *) malloc ( sizeof(char) * psDBF->nFields ); memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(char)*psDBF->nFields ); newDBF->bNoHeader = TRUE; newDBF->bUpdated = TRUE; DBFWriteHeader ( newDBF ); DBFClose ( newDBF ); newDBF = DBFOpen ( pszFilename, "rb+" ); return ( newDBF ); } /************************************************************************/ /* DBFGetNativeFieldType() */ /* */ /* Return the DBase field type for the specified field. */ /* */ /* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */ /* 'N' (Numeric, with or without decimal), */ /* 'L' (Logical), */ /* 'M' (Memo: 10 digits .DBT block ptr) */ /************************************************************************/ char SHPAPI_CALL DBFGetNativeFieldType( DBFHandle psDBF, int iField ) { if( iField >=0 && iField < psDBF->nFields ) return psDBF->pachFieldType[iField]; return ' '; } /************************************************************************/ /* str_to_upper() */ /************************************************************************/ static void str_to_upper (char *string) { int len; short i = -1; len = strlen (string); while (++i < len) if (isalpha(string[i]) && islower(string[i])) string[i] = (char) toupper ((int)string[i]); } /************************************************************************/ /* DBFGetFieldIndex() */ /* */ /* Get the index number for a field in a .dbf file. */ /* */ /* Contributed by Jim Matthews. */ /************************************************************************/ int SHPAPI_CALL DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) { char name[12], name1[12], name2[12]; int i; strncpy(name1, pszFieldName,11); name1[11] = '\0'; str_to_upper(name1); for( i = 0; i < DBFGetFieldCount(psDBF); i++ ) { DBFGetFieldInfo( psDBF, i, name, NULL, NULL ); strncpy(name2,name,11); str_to_upper(name2); if(!strncmp(name1,name2,10)) return(i); } return(-1); } /************************************************************************/ /* DBFIsRecordDeleted() */ /* */ /* Returns TRUE if the indicated record is deleted, otherwise */ /* it returns FALSE. */ /************************************************************************/ int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ) { /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( iShape < 0 || iShape >= psDBF->nRecords ) return TRUE; /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, iShape ) ) return FALSE; /* -------------------------------------------------------------------- */ /* '*' means deleted. */ /* -------------------------------------------------------------------- */ return psDBF->pszCurrentRecord[0] == '*'; } /************************************************************************/ /* DBFMarkRecordDeleted() */ /************************************************************************/ int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, int bIsDeleted ) { char chNewFlag; /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( iShape < 0 || iShape >= psDBF->nRecords ) return FALSE; /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( !DBFLoadRecord( psDBF, iShape ) ) return FALSE; /* -------------------------------------------------------------------- */ /* Assign value, marking record as dirty if it changes. */ /* -------------------------------------------------------------------- */ if( bIsDeleted ) chNewFlag = '*'; else chNewFlag = ' '; if( psDBF->pszCurrentRecord[0] != chNewFlag ) { psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; psDBF->pszCurrentRecord[0] = chNewFlag; } return TRUE; } /************************************************************************/ /* DBFGetCodePage */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFGetCodePage(DBFHandle psDBF ) { if( psDBF == NULL ) return NULL; return psDBF->pszCodePage; } /************************************************************************/ /* DBFDeleteField() */ /* */ /* Remove a field from a .dbf file */ /************************************************************************/ int SHPAPI_CALL DBFDeleteField(DBFHandle psDBF, int iField) { int nOldRecordLength, nOldHeaderLength; int nDeletedFieldOffset, nDeletedFieldSize; SAOffset nRecordOffset; char* pszRecord; int i, iRecord; if (iField < 0 || iField >= psDBF->nFields) return FALSE; /* make sure that everything is written in .dbf */ if( !DBFFlushRecord( psDBF ) ) return FALSE; /* get information about field to be deleted */ nOldRecordLength = psDBF->nRecordLength; nOldHeaderLength = psDBF->nHeaderLength; nDeletedFieldOffset = psDBF->panFieldOffset[iField]; nDeletedFieldSize = psDBF->panFieldSize[iField]; /* update fields info */ for (i = iField + 1; i < psDBF->nFields; i++) { psDBF->panFieldOffset[i-1] = psDBF->panFieldOffset[i] - nDeletedFieldSize; psDBF->panFieldSize[i-1] = psDBF->panFieldSize[i]; psDBF->panFieldDecimals[i-1] = psDBF->panFieldDecimals[i]; psDBF->pachFieldType[i-1] = psDBF->pachFieldType[i]; } /* resize fields arrays */ psDBF->nFields--; psDBF->panFieldOffset = (int *) SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); psDBF->panFieldSize = (int *) SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); psDBF->panFieldDecimals = (int *) SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); psDBF->pachFieldType = (char *) SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); /* update header information */ psDBF->nHeaderLength -= 32; psDBF->nRecordLength -= nDeletedFieldSize; /* overwrite field information in header */ memcpy(psDBF->pszHeader + iField*32, psDBF->pszHeader + (iField+1)*32, sizeof(char) * (psDBF->nFields - iField)*32); psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); /* update size of current record appropriately */ psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, psDBF->nRecordLength); /* we're done if we're dealing with not yet created .dbf */ if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) return TRUE; /* force update of header with new header and record length */ psDBF->bNoHeader = TRUE; DBFUpdateHeader( psDBF ); /* alloc record */ pszRecord = (char *) malloc(sizeof(char) * nOldRecordLength); /* shift records to their new positions */ for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) { nRecordOffset = nOldRecordLength * (SAOffset) iRecord + nOldHeaderLength; /* load record */ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); nRecordOffset = psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; /* move record in two steps */ psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); psDBF->sHooks.FWrite( pszRecord, nDeletedFieldOffset, 1, psDBF->fp ); psDBF->sHooks.FWrite( pszRecord + nDeletedFieldOffset + nDeletedFieldSize, nOldRecordLength - nDeletedFieldOffset - nDeletedFieldSize, 1, psDBF->fp ); } /* TODO: truncate file */ /* free record */ free(pszRecord); return TRUE; } navit-0.5.0+dfsg.1/navit/support/shapefile/shapefil.h000066400000000000000000000517471264204753600225030ustar00rootroot00000000000000#ifndef SHAPEFILE_H_INCLUDED #define SHAPEFILE_H_INCLUDED /****************************************************************************** * $Id: shapefil.h 15715 2008-11-12 15:15:21Z warmerdam $ * * Project: Shapelib * Purpose: Primary include file for Shapelib. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shapefil.h,v $ * Revision 1.46 2008/11/12 14:28:15 fwarmerdam * DBFCreateField() now works on files with records * * Revision 1.45 2008/11/11 17:47:10 fwarmerdam * added DBFDeleteField() function * * Revision 1.44 2008/01/16 20:05:19 bram * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this * is only available on the Windows platform that decodes the UTF-8 filenames to wide * character strings and feeds them to _wfopen and _wremove. * * Revision 1.43 2008/01/10 16:35:30 fwarmerdam * avoid _ prefix on #defined symbols (bug 1840) * * Revision 1.42 2007/12/18 18:28:14 bram * - create hook for client specific atof (bugzilla ticket 1615) * - check for NULL handle before closing cpCPG file, and close after reading. * * Revision 1.41 2007/12/15 20:25:32 bram * dbfopen.c now reads the Code Page information from the DBF file, and exports * this information as a string through the DBFGetCodePage function. This is * either the number from the LDID header field ("LDID/") or as the * content of an accompanying .CPG file. When creating a DBF file, the code can * be set using DBFCreateEx. * * Revision 1.40 2007/12/06 07:00:25 fwarmerdam * dbfopen now using SAHooks for fileio * * Revision 1.39 2007/12/04 20:37:56 fwarmerdam * preliminary implementation of hooks api for io and errors * * Revision 1.38 2007/11/21 22:39:56 fwarmerdam * close shx file in readonly mode (GDAL #1956) * * Revision 1.37 2007/10/27 03:31:14 fwarmerdam * limit default depth of tree to 12 levels (gdal ticket #1594) * * Revision 1.36 2007/09/10 23:33:15 fwarmerdam * Upstreamed support for visibility flag in SHPAPI_CALL for the needs * of GDAL (gdal ticket #1810). * * Revision 1.35 2007/09/03 19:48:10 fwarmerdam * move DBFReadAttribute() static dDoubleField into dbfinfo * * Revision 1.34 2006/06/17 15:33:32 fwarmerdam * added pszWorkField - bug 1202 (rso) * * Revision 1.33 2006/02/15 01:14:30 fwarmerdam * added DBFAddNativeFieldType * * Revision 1.32 2006/01/26 15:07:32 fwarmerdam * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 * * Revision 1.31 2006/01/05 01:27:27 fwarmerdam * added dbf deletion mark/fetch * * Revision 1.30 2005/01/03 22:30:13 fwarmerdam * added support for saved quadtrees * * Revision 1.29 2004/09/26 20:09:35 fwarmerdam * avoid rcsid warnings * * Revision 1.28 2003/12/29 06:02:18 fwarmerdam * added cpl_error.h option * * Revision 1.27 2003/04/21 18:30:37 warmerda * added header write/update public methods * * Revision 1.26 2002/09/29 00:00:08 warmerda * added FTLogical and logical attribute read/write calls * * Revision 1.25 2002/05/07 13:46:30 warmerda * added DBFWriteAttributeDirectly(). * * Revision 1.24 2002/04/10 16:59:54 warmerda * added SHPRewindObject * * Revision 1.23 2002/01/15 14:36:07 warmerda * updated email address * * Revision 1.22 2002/01/15 14:32:00 warmerda * try to improve SHPAPI_CALL docs */ #include #ifdef USE_DBMALLOC #include #endif #ifdef USE_CPL #include "cpl_error.h" #include "cpl_vsi.h" #endif #ifdef __cplusplus extern "C" { #endif /************************************************************************/ /* Configuration options. */ /************************************************************************/ /* -------------------------------------------------------------------- */ /* Should the DBFReadStringAttribute() strip leading and */ /* trailing white space? */ /* -------------------------------------------------------------------- */ #define TRIM_DBF_WHITESPACE /* -------------------------------------------------------------------- */ /* Should we write measure values to the Multipatch object? */ /* Reportedly ArcView crashes if we do write it, so for now it */ /* is disabled. */ /* -------------------------------------------------------------------- */ #define DISABLE_MULTIPATCH_MEASURE /* -------------------------------------------------------------------- */ /* SHPAPI_CALL */ /* */ /* The following two macros are present to allow forcing */ /* various calling conventions on the Shapelib API. */ /* */ /* To force __stdcall conventions (needed to call Shapelib */ /* from Visual Basic and/or Dephi I believe) the makefile could */ /* be modified to define: */ /* */ /* /DSHPAPI_CALL=__stdcall */ /* */ /* If it is desired to force export of the Shapelib API without */ /* using the shapelib.def file, use the following definition. */ /* */ /* /DSHAPELIB_DLLEXPORT */ /* */ /* To get both at once it will be necessary to hack this */ /* include file to define: */ /* */ /* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ /* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ /* */ /* The complexity of the situtation is partly caused by the */ /* peculiar requirement of Visual C++ that __stdcall appear */ /* after any "*"'s in the return value of a function while the */ /* __declspec(dllexport) must appear before them. */ /* -------------------------------------------------------------------- */ #ifdef SHAPELIB_DLLEXPORT # define SHPAPI_CALL __declspec(dllexport) # define SHPAPI_CALL1(x) __declspec(dllexport) x #endif #ifndef SHPAPI_CALL # if defined(USE_GCC_VISIBILITY_FLAG) # define SHPAPI_CALL __attribute__ ((visibility("default"))) # define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x # else # define SHPAPI_CALL # endif #endif #ifndef SHPAPI_CALL1 # define SHPAPI_CALL1(x) x SHPAPI_CALL #endif /* -------------------------------------------------------------------- */ /* Macros for controlling CVSID and ensuring they don't appear */ /* as unreferenced variables resulting in lots of warnings. */ /* -------------------------------------------------------------------- */ #ifndef DISABLE_CVSID # define SHP_CVSID(string) static char cpl_cvsid[] = string; \ static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : cpl_cvsid ); } #else # define SHP_CVSID(string) #endif /* -------------------------------------------------------------------- */ /* On some platforms, additional file IO hooks are defined that */ /* UTF-8 encoded filenames Unicode filenames */ /* -------------------------------------------------------------------- */ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) # define SHPAPI_WINDOWS # define SHPAPI_UTF8_HOOKS #endif /* -------------------------------------------------------------------- */ /* IO/Error hook functions. */ /* -------------------------------------------------------------------- */ typedef int *SAFile; #ifndef SAOffset typedef unsigned long SAOffset; #endif typedef struct { SAFile (*FOpen) ( const char *filename, const char *access); SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); SAOffset (*FTell) ( SAFile file ); int (*FFlush)( SAFile file ); int (*FClose)( SAFile file ); int (*Remove) ( const char *filename ); void (*Error) ( const char *message ); double (*Atof) ( const char *str ); } SAHooks; void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); #ifdef SHPAPI_UTF8_HOOKS void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); #endif /************************************************************************/ /* SHP Support. */ /************************************************************************/ typedef struct { SAHooks sHooks; SAFile fpSHP; SAFile fpSHX; int nShapeType; /* SHPT_* */ int nFileSize; /* SHP file */ int nRecords; int nMaxRecords; int *panRecOffset; int *panRecSize; double adBoundsMin[4]; double adBoundsMax[4]; int bUpdated; unsigned char *pabyRec; int nBufSize; } SHPInfo; typedef SHPInfo * SHPHandle; /* -------------------------------------------------------------------- */ /* Shape types (nSHPType) */ /* -------------------------------------------------------------------- */ #define SHPT_NULL 0 #define SHPT_POINT 1 #define SHPT_ARC 3 #define SHPT_POLYGON 5 #define SHPT_MULTIPOINT 8 #define SHPT_POINTZ 11 #define SHPT_ARCZ 13 #define SHPT_POLYGONZ 15 #define SHPT_MULTIPOINTZ 18 #define SHPT_POINTM 21 #define SHPT_ARCM 23 #define SHPT_POLYGONM 25 #define SHPT_MULTIPOINTM 28 #define SHPT_MULTIPATCH 31 /* -------------------------------------------------------------------- */ /* Part types - everything but SHPT_MULTIPATCH just uses */ /* SHPP_RING. */ /* -------------------------------------------------------------------- */ #define SHPP_TRISTRIP 0 #define SHPP_TRIFAN 1 #define SHPP_OUTERRING 2 #define SHPP_INNERRING 3 #define SHPP_FIRSTRING 4 #define SHPP_RING 5 /* -------------------------------------------------------------------- */ /* SHPObject - represents on shape (without attributes) read */ /* from the .shp file. */ /* -------------------------------------------------------------------- */ typedef struct { int nSHPType; int nShapeId; /* -1 is unknown/unassigned */ int nParts; int *panPartStart; int *panPartType; int nVertices; double *padfX; double *padfY; double *padfZ; double *padfM; double dfXMin; double dfYMin; double dfZMin; double dfMMin; double dfXMax; double dfYMax; double dfZMax; double dfMMax; int bMeasureIsUsed; } SHPObject; /* -------------------------------------------------------------------- */ /* SHP API Prototypes */ /* -------------------------------------------------------------------- */ /* If pszAccess is read-only, the fpSHX field of the returned structure */ /* will be NULL as it is not necessary to keep the SHX file open */ SHPHandle SHPAPI_CALL SHPOpen( const char * pszShapeFile, const char * pszAccess ); SHPHandle SHPAPI_CALL SHPOpenLL( const char *pszShapeFile, const char *pszAccess, SAHooks *psHooks ); SHPHandle SHPAPI_CALL SHPCreate( const char * pszShapeFile, int nShapeType ); SHPHandle SHPAPI_CALL SHPCreateLL( const char * pszShapeFile, int nShapeType, SAHooks *psHooks ); void SHPAPI_CALL SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ); SHPObject SHPAPI_CALL1(*) SHPReadObject( SHPHandle hSHP, int iShape ); int SHPAPI_CALL SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); void SHPAPI_CALL SHPDestroyObject( SHPObject * psObject ); void SHPAPI_CALL SHPComputeExtents( SHPObject * psObject ); SHPObject SHPAPI_CALL1(*) SHPCreateObject( int nSHPType, int nShapeId, int nParts, const int * panPartStart, const int * panPartType, int nVertices, const double * padfX, const double * padfY, const double * padfZ, const double * padfM ); SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject( int nSHPType, int nVertices, const double * padfX, const double * padfY, const double * padfZ ); int SHPAPI_CALL SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); void SHPAPI_CALL SHPClose( SHPHandle hSHP ); void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); const char SHPAPI_CALL1(*) SHPTypeName( int nSHPType ); const char SHPAPI_CALL1(*) SHPPartTypeName( int nPartType ); /* -------------------------------------------------------------------- */ /* Shape quadtree indexing API. */ /* -------------------------------------------------------------------- */ /* this can be two or four for binary or quad tree */ #define MAX_SUBNODE 4 /* upper limit of tree levels for automatic estimation */ #define MAX_DEFAULT_TREE_DEPTH 12 typedef struct shape_tree_node { /* region covered by this node */ double adfBoundsMin[4]; double adfBoundsMax[4]; /* list of shapes stored at this node. The papsShapeObj pointers or the whole list can be NULL */ int nShapeCount; int *panShapeIds; SHPObject **papsShapeObj; int nSubNodes; struct shape_tree_node *apsSubNode[MAX_SUBNODE]; } SHPTreeNode; typedef struct { SHPHandle hSHP; int nMaxDepth; int nDimension; int nTotalCount; SHPTreeNode *psRoot; } SHPTree; SHPTree SHPAPI_CALL1(*) SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, double *padfBoundsMin, double *padfBoundsMax ); void SHPAPI_CALL SHPDestroyTree( SHPTree * hTree ); int SHPAPI_CALL SHPWriteTree( SHPTree *hTree, const char * pszFilename ); SHPTree SHPAPI_CALL SHPReadTree( const char * pszFilename ); int SHPAPI_CALL SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject ); int SHPAPI_CALL SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); int SHPAPI_CALL SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); void SHPAPI_CALL SHPTreeTrimExtraNodes( SHPTree * hTree ); int SHPAPI_CALL1(*) SHPTreeFindLikelyShapes( SHPTree * hTree, double * padfBoundsMin, double * padfBoundsMax, int * ); int SHPAPI_CALL SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); int SHPAPI_CALL1(*) SHPSearchDiskTree( FILE *fp, double *padfBoundsMin, double *padfBoundsMax, int *pnShapeCount ); /************************************************************************/ /* DBF Support. */ /************************************************************************/ typedef struct { SAHooks sHooks; SAFile fp; int nRecords; int nRecordLength; int nHeaderLength; int nFields; int *panFieldOffset; int *panFieldSize; int *panFieldDecimals; char *pachFieldType; char *pszHeader; int nCurrentRecord; int bCurrentRecordModified; char *pszCurrentRecord; int nWorkFieldLength; char *pszWorkField; int bNoHeader; int bUpdated; double dfDoubleField; int iLanguageDriver; char *pszCodePage; } DBFInfo; typedef DBFInfo * DBFHandle; typedef enum { FTString, FTInteger, FTDouble, FTLogical, FTInvalid } DBFFieldType; #define XBASE_FLDHDR_SZ 32 DBFHandle SHPAPI_CALL DBFOpen( const char * pszDBFFile, const char * pszAccess ); DBFHandle SHPAPI_CALL DBFOpenLL( const char * pszDBFFile, const char * pszAccess, SAHooks *psHooks ); DBFHandle SHPAPI_CALL DBFCreate( const char * pszDBFFile ); DBFHandle SHPAPI_CALL DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); DBFHandle SHPAPI_CALL DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); int SHPAPI_CALL DBFGetFieldCount( DBFHandle psDBF ); int SHPAPI_CALL DBFGetRecordCount( DBFHandle psDBF ); int SHPAPI_CALL DBFAddField( DBFHandle hDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ); int SHPAPI_CALL DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, char chType, int nWidth, int nDecimals ); int SHPAPI_CALL DBFDeleteField( DBFHandle hDBF, int iField ); DBFFieldType SHPAPI_CALL DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ); int SHPAPI_CALL DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); int SHPAPI_CALL DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); double SHPAPI_CALL DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); const char SHPAPI_CALL1(*) DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); const char SHPAPI_CALL1(*) DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, int nFieldValue ); int SHPAPI_CALL DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, double dFieldValue ); int SHPAPI_CALL DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, const char * pszFieldValue ); int SHPAPI_CALL DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, const char lFieldValue); int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, void * pValue ); const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity ); int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, int bIsDeleted ); DBFHandle SHPAPI_CALL DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); void SHPAPI_CALL DBFClose( DBFHandle hDBF ); void SHPAPI_CALL DBFUpdateHeader( DBFHandle hDBF ); char SHPAPI_CALL DBFGetNativeFieldType( DBFHandle hDBF, int iField ); const char SHPAPI_CALL1(*) DBFGetCodePage(DBFHandle psDBF ); #ifdef __cplusplus } #endif #endif /* ndef SHAPEFILE_H_INCLUDED */ navit-0.5.0+dfsg.1/navit/support/shapefile/shpopen.c000066400000000000000000002450771264204753600223600ustar00rootroot00000000000000/****************************************************************************** * $Id: shpopen.c,v 1.59 2008/03/14 05:25:31 fwarmerdam Exp $ * * Project: Shapelib * Purpose: Implementation of core Shapefile read/write functions. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, 2001, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shpopen.c,v $ * Revision 1.59 2008/03/14 05:25:31 fwarmerdam * Correct crash on buggy geometries (gdal #2218) * * Revision 1.58 2008/01/08 23:28:26 bram * on line 2095, use a float instead of a double to avoid a compiler warning * * Revision 1.57 2007/12/06 07:00:25 fwarmerdam * dbfopen now using SAHooks for fileio * * Revision 1.56 2007/12/04 20:37:56 fwarmerdam * preliminary implementation of hooks api for io and errors * * Revision 1.55 2007/11/21 22:39:56 fwarmerdam * close shx file in readonly mode (GDAL #1956) * * Revision 1.54 2007/11/15 00:12:47 mloskot * Backported recent changes from GDAL (Ticket #1415) to Shapelib. * * Revision 1.53 2007/11/14 22:31:08 fwarmerdam * checks after mallocs to detect for corrupted/voluntary broken shapefiles. * http://trac.osgeo.org/gdal/ticket/1991 * * Revision 1.52 2007/06/21 15:58:33 fwarmerdam * fix for SHPRewindObject when rings touch at one vertex (gdal #976) * * Revision 1.51 2006/09/04 15:24:01 fwarmerdam * Fixed up log message for 1.49. * * Revision 1.50 2006/09/04 15:21:39 fwarmerdam * fix of last fix * * Revision 1.49 2006/09/04 15:21:00 fwarmerdam * MLoskot: Added stronger test of Shapefile reading failures, e.g. truncated * files. The problem was discovered by Tim Sutton and reported here * https://svn.qgis.org/trac/ticket/200 * * Revision 1.48 2006/01/26 15:07:32 fwarmerdam * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 * * Revision 1.47 2006/01/04 20:07:23 fwarmerdam * In SHPWriteObject() make sure that the record length is updated * when rewriting an existing record. * * Revision 1.46 2005/02/11 17:17:46 fwarmerdam * added panPartStart[0] validation * * Revision 1.45 2004/09/26 20:09:48 fwarmerdam * const correctness changes * * Revision 1.44 2003/12/29 00:18:39 fwarmerdam * added error checking for failed IO and optional CPL error reporting * * Revision 1.43 2003/12/01 16:20:08 warmerda * be careful of zero vertex shapes * * Revision 1.42 2003/12/01 14:58:27 warmerda * added degenerate object check in SHPRewindObject() * * Revision 1.41 2003/07/08 15:22:43 warmerda * avoid warning * * Revision 1.40 2003/04/21 18:30:37 warmerda * added header write/update public methods * * Revision 1.39 2002/08/26 06:46:56 warmerda * avoid c++ comments * * Revision 1.38 2002/05/07 16:43:39 warmerda * Removed debugging printf. * * Revision 1.37 2002/04/10 17:35:22 warmerda * fixed bug in ring reversal code * * Revision 1.36 2002/04/10 16:59:54 warmerda * added SHPRewindObject * * Revision 1.35 2001/12/07 15:10:44 warmerda * fix if .shx fails to open * * Revision 1.34 2001/11/01 16:29:55 warmerda * move pabyRec into SHPInfo for thread safety * * Revision 1.33 2001/07/03 12:18:15 warmerda * Improved cleanup if SHX not found, provied by Riccardo Cohen. * * Revision 1.32 2001/06/22 01:58:07 warmerda * be more careful about establishing initial bounds in face of NULL shapes * * Revision 1.31 2001/05/31 19:35:29 warmerda * added support for writing null shapes * * Revision 1.30 2001/05/28 12:46:29 warmerda * Add some checking on reasonableness of record count when opening. * * Revision 1.29 2001/05/23 13:36:52 warmerda * added use of SHPAPI_CALL * * Revision 1.28 2001/02/06 22:25:06 warmerda * fixed memory leaks when SHPOpen() fails * * Revision 1.27 2000/07/18 15:21:33 warmerda * added better enforcement of -1 for append in SHPWriteObject * * Revision 1.26 2000/02/16 16:03:51 warmerda * added null shape support * * Revision 1.25 1999/12/15 13:47:07 warmerda * Fixed record size settings in .shp file (was 4 words too long) * Added stdlib.h. * * Revision 1.24 1999/11/05 14:12:04 warmerda * updated license terms * * Revision 1.23 1999/07/27 00:53:46 warmerda * added support for rewriting shapes * * Revision 1.22 1999/06/11 19:19:11 warmerda * Cleanup pabyRec static buffer on SHPClose(). * * Revision 1.21 1999/06/02 14:57:56 kshih * Remove unused variables * * Revision 1.20 1999/04/19 21:04:17 warmerda * Fixed syntax error. * * Revision 1.19 1999/04/19 21:01:57 warmerda * Force access string to binary in SHPOpen(). * * Revision 1.18 1999/04/01 18:48:07 warmerda * Try upper case extensions if lower case doesn't work. * * Revision 1.17 1998/12/31 15:29:39 warmerda * Disable writing measure values to multipatch objects if * DISABLE_MULTIPATCH_MEASURE is defined. * * Revision 1.16 1998/12/16 05:14:33 warmerda * Added support to write MULTIPATCH. Fixed reading Z coordinate of * MULTIPATCH. Fixed record size written for all feature types. * * Revision 1.15 1998/12/03 16:35:29 warmerda * r+b is proper binary access string, not rb+. * * Revision 1.14 1998/12/03 15:47:56 warmerda * Fixed setting of nVertices in SHPCreateObject(). * * Revision 1.13 1998/12/03 15:33:54 warmerda * Made SHPCalculateExtents() separately callable. * * Revision 1.12 1998/11/11 20:01:50 warmerda * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. * * Revision 1.11 1998/11/09 20:56:44 warmerda * Fixed up handling of file wide bounds. * * Revision 1.10 1998/11/09 20:18:51 warmerda * Converted to support 3D shapefiles, and use of SHPObject. * * Revision 1.9 1998/02/24 15:09:05 warmerda * Fixed memory leak. * * Revision 1.8 1997/12/04 15:40:29 warmerda * Fixed byte swapping of record number, and record length fields in the * .shp file. * * Revision 1.7 1995/10/21 03:15:58 warmerda * Added support for binary file access, the magic cookie 9997 * and tried to improve the int32 selection logic for 16bit systems. * * Revision 1.6 1995/09/04 04:19:41 warmerda * Added fix for file bounds. * * Revision 1.5 1995/08/25 15:16:44 warmerda * Fixed a couple of problems with big endian systems ... one with bounds * and the other with multipart polygons. * * Revision 1.4 1995/08/24 18:10:17 warmerda * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() * functions (such as on the Sun). * * Revision 1.3 1995/08/23 02:23:15 warmerda * Added support for reading bounds, and fixed up problems in setting the * file wide bounds. * * Revision 1.2 1995/08/04 03:16:57 warmerda * Added header. * */ #include "shapefil.h" #include #include #include #include #include #include #include typedef unsigned char uchar; #if UINT_MAX == 65535 typedef long int32; #else typedef int int32; #endif #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif #define ByteCopy( a, b, c ) memcpy( b, a, c ) #ifndef MAX # define MIN(a,b) ((ab) ? a : b) #endif static int bBigEndian; /************************************************************************/ /* SwapWord() */ /* */ /* Swap a 2, 4 or 8 byte word. */ /************************************************************************/ static void SwapWord( int length, void * wordP ) { int i; uchar temp; for( i=0; i < length/2; i++ ) { temp = ((uchar *) wordP)[i]; ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; ((uchar *) wordP)[length-i-1] = temp; } } /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* SHPWriteHeader() */ /* */ /* Write out a header for the .shp and .shx files as well as the */ /* contents of the index (.shx) file. */ /************************************************************************/ void SHPWriteHeader( SHPHandle psSHP ) { uchar abyHeader[100]; int i; int32 i32; double dValue; int32 *panSHX; if (psSHP->fpSHX == NULL) { psSHP->sHooks.Error( "SHPWriteHeader failed : SHX file is closed"); return; } /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = psSHP->nFileSize/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = psSHP->nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = psSHP->adBoundsMin[0]; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+36 ); dValue = psSHP->adBoundsMin[1]; ByteCopy( &dValue, abyHeader+44, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+44 ); dValue = psSHP->adBoundsMax[0]; ByteCopy( &dValue, abyHeader+52, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+52 ); dValue = psSHP->adBoundsMax[1]; ByteCopy( &dValue, abyHeader+60, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+60 ); dValue = psSHP->adBoundsMin[2]; /* z */ ByteCopy( &dValue, abyHeader+68, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+68 ); dValue = psSHP->adBoundsMax[2]; ByteCopy( &dValue, abyHeader+76, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+76 ); dValue = psSHP->adBoundsMin[3]; /* m */ ByteCopy( &dValue, abyHeader+84, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+84 ); dValue = psSHP->adBoundsMax[3]; ByteCopy( &dValue, abyHeader+92, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+92 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 ) { psSHP->sHooks.Error( "Failure writing .shp header" ); return; } /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 ) { psSHP->sHooks.Error( "Failure writing .shx header" ); return; } /* -------------------------------------------------------------------- */ /* Write out the .shx contents. */ /* -------------------------------------------------------------------- */ panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords); for( i = 0; i < psSHP->nRecords; i++ ) { panSHX[i*2 ] = psSHP->panRecOffset[i]/2; panSHX[i*2+1] = psSHP->panRecSize[i]/2; if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); } if( (int)psSHP->sHooks.FWrite( panSHX, sizeof(int32)*2, psSHP->nRecords, psSHP->fpSHX ) != psSHP->nRecords ) { psSHP->sHooks.Error( "Failure writing .shx contents" ); } free( panSHX ); /* -------------------------------------------------------------------- */ /* Flush to disk. */ /* -------------------------------------------------------------------- */ psSHP->sHooks.FFlush( psSHP->fpSHP ); psSHP->sHooks.FFlush( psSHP->fpSHX ); } /************************************************************************/ /* SHPOpen() */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPOpen( const char * pszLayer, const char * pszAccess ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return SHPOpenLL( pszLayer, pszAccess, &sHooks ); } /************************************************************************/ /* SHPOpen() */ /* */ /* Open the .shp and .shx files based on the basename of the */ /* files or either file name. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) { char *pszFullname, *pszBasename; SHPHandle psSHP; uchar *pabyBuf; int i; double dValue; /* -------------------------------------------------------------------- */ /* Ensure the access string is one of the legal ones. We */ /* ensure the result string indicates binary to avoid common */ /* problems on Windows. */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 || strcmp(pszAccess,"r+") == 0 ) pszAccess = "r+b"; else pszAccess = "rb"; /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Initialize the info structure. */ /* -------------------------------------------------------------------- */ psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1); psSHP->bUpdated = FALSE; memcpy( &(psSHP->sHooks), psHooks, sizeof(SAHooks) ); /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ) ; psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); if( psSHP->fpSHP == NULL ) { sprintf( pszFullname, "%s.SHP", pszBasename ); psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); } if( psSHP->fpSHP == NULL ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_OpenFailed, "Unable to open %s.shp or %s.SHP.", pszBasename, pszBasename ); #endif free( psSHP ); free( pszBasename ); free( pszFullname ); return( NULL ); } sprintf( pszFullname, "%s.shx", pszBasename ); psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); if( psSHP->fpSHX == NULL ) { sprintf( pszFullname, "%s.SHX", pszBasename ); psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); } if( psSHP->fpSHX == NULL ) { #ifdef USE_CPL CPLError( CE_Failure, CPLE_OpenFailed, "Unable to open %s.shx or %s.SHX.", pszBasename, pszBasename ); #endif psSHP->sHooks.FClose( psSHP->fpSHP ); free( psSHP ); free( pszBasename ); free( pszFullname ); return( NULL ); } free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Read the file size from the SHP file. */ /* -------------------------------------------------------------------- */ pabyBuf = (uchar *) malloc(100); psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHP ); psSHP->nFileSize = (pabyBuf[24] * 256 * 256 * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[26] * 256 + pabyBuf[27]) * 2; /* -------------------------------------------------------------------- */ /* Read SHX file Header info */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHX ) != 1 || pabyBuf[0] != 0 || pabyBuf[1] != 0 || pabyBuf[2] != 0x27 || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) { psSHP->sHooks.Error( ".shx file is unreadable, or corrupt." ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); free( psSHP ); return( NULL ); } psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256; psSHP->nRecords = (psSHP->nRecords*2 - 100) / 8; psSHP->nShapeType = pabyBuf[32]; if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) { char szError[200]; sprintf( szError, "Record count in .shp header is %d, which seems\n" "unreasonable. Assuming header is corrupt.", psSHP->nRecords ); psSHP->sHooks.Error( szError ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); free( psSHP ); free(pabyBuf); return( NULL ); } /* -------------------------------------------------------------------- */ /* Read the bounds. */ /* -------------------------------------------------------------------- */ if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); memcpy( &dValue, pabyBuf+36, 8 ); psSHP->adBoundsMin[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); memcpy( &dValue, pabyBuf+44, 8 ); psSHP->adBoundsMin[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); memcpy( &dValue, pabyBuf+52, 8 ); psSHP->adBoundsMax[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); memcpy( &dValue, pabyBuf+60, 8 ); psSHP->adBoundsMax[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ memcpy( &dValue, pabyBuf+68, 8 ); psSHP->adBoundsMin[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); memcpy( &dValue, pabyBuf+76, 8 ); psSHP->adBoundsMax[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ memcpy( &dValue, pabyBuf+84, 8 ); psSHP->adBoundsMin[3] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); memcpy( &dValue, pabyBuf+92, 8 ); psSHP->adBoundsMax[3] = dValue; free( pabyBuf ); /* -------------------------------------------------------------------- */ /* Read the .shx file to get the offsets to each record in */ /* the .shp file. */ /* -------------------------------------------------------------------- */ psSHP->nMaxRecords = psSHP->nRecords; psSHP->panRecOffset = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); psSHP->panRecSize = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) ); if (psSHP->panRecOffset == NULL || psSHP->panRecSize == NULL || pabyBuf == NULL) { char szError[200]; sprintf(szError, "Not enough memory to allocate requested memory (nRecords=%d).\n" "Probably broken SHP file", psSHP->nRecords ); psSHP->sHooks.Error( szError ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); if (psSHP->panRecOffset) free( psSHP->panRecOffset ); if (psSHP->panRecSize) free( psSHP->panRecSize ); if (pabyBuf) free( pabyBuf ); free( psSHP ); return( NULL ); } if( (int) psSHP->sHooks.FRead( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ) != psSHP->nRecords ) { char szError[200]; sprintf( szError, "Failed to read all values for %d records in .shx file.", psSHP->nRecords ); psSHP->sHooks.Error( szError ); /* SHX is short or unreadable for some reason. */ psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); free( psSHP->panRecOffset ); free( psSHP->panRecSize ); free( pabyBuf ); free( psSHP ); return( NULL ); } /* In read-only mode, we can close the SHX now */ if (strcmp(pszAccess, "rb") == 0) { psSHP->sHooks.FClose( psSHP->fpSHX ); psSHP->fpSHX = NULL; } for( i = 0; i < psSHP->nRecords; i++ ) { int32 nOffset, nLength; memcpy( &nOffset, pabyBuf + i * 8, 4 ); if( !bBigEndian ) SwapWord( 4, &nOffset ); memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); if( !bBigEndian ) SwapWord( 4, &nLength ); psSHP->panRecOffset[i] = nOffset*2; psSHP->panRecSize[i] = nLength*2; } free( pabyBuf ); return( psSHP ); } /************************************************************************/ /* SHPClose() */ /* */ /* Close the .shp and .shx files. */ /************************************************************************/ void SHPAPI_CALL SHPClose(SHPHandle psSHP ) { if( psSHP == NULL ) return; /* -------------------------------------------------------------------- */ /* Update the header if we have modified anything. */ /* -------------------------------------------------------------------- */ if( psSHP->bUpdated ) SHPWriteHeader( psSHP ); /* -------------------------------------------------------------------- */ /* Free all resources, and close files. */ /* -------------------------------------------------------------------- */ free( psSHP->panRecOffset ); free( psSHP->panRecSize ); if ( psSHP->fpSHX != NULL) psSHP->sHooks.FClose( psSHP->fpSHX ); psSHP->sHooks.FClose( psSHP->fpSHP ); if( psSHP->pabyRec != NULL ) { free( psSHP->pabyRec ); } free( psSHP ); } /************************************************************************/ /* SHPGetInfo() */ /* */ /* Fetch general information about the shape file. */ /************************************************************************/ void SHPAPI_CALL SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ) { int i; if( psSHP == NULL ) return; if( pnEntities != NULL ) *pnEntities = psSHP->nRecords; if( pnShapeType != NULL ) *pnShapeType = psSHP->nShapeType; for( i = 0; i < 4; i++ ) { if( padfMinBound != NULL ) padfMinBound[i] = psSHP->adBoundsMin[i]; if( padfMaxBound != NULL ) padfMaxBound[i] = psSHP->adBoundsMax[i]; } } /************************************************************************/ /* SHPCreate() */ /* */ /* Create a new shape file and return a handle to the open */ /* shape file with read/write access. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPCreate( const char * pszLayer, int nShapeType ) { SAHooks sHooks; SASetupDefaultHooks( &sHooks ); return SHPCreateLL( pszLayer, nShapeType, &sHooks ); } /************************************************************************/ /* SHPCreate() */ /* */ /* Create a new shape file and return a handle to the open */ /* shape file with read/write access. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) { char *pszBasename, *pszFullname; int i; SAFile fpSHP, fpSHX; uchar abyHeader[100]; int32 i32; double dValue; /* -------------------------------------------------------------------- */ /* Establish the byte order on this system. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the two files so we can write their headers. */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ); fpSHP = psHooks->FOpen(pszFullname, "wb" ); if( fpSHP == NULL ) { psHooks->Error( "Failed to create file .shp file." ); return( NULL ); } sprintf( pszFullname, "%s.shx", pszBasename ); fpSHX = psHooks->FOpen(pszFullname, "wb" ); if( fpSHX == NULL ) { psHooks->Error( "Failed to create file .shx file." ); return( NULL ); } free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = 0.0; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); ByteCopy( &dValue, abyHeader+44, 8 ); ByteCopy( &dValue, abyHeader+52, 8 ); ByteCopy( &dValue, abyHeader+60, 8 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 ) { psHooks->Error( "Failed to write .shp header." ); return NULL; } /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 ) { psHooks->Error( "Failed to write .shx header." ); return NULL; } /* -------------------------------------------------------------------- */ /* Close the files, and then open them as regular existing files. */ /* -------------------------------------------------------------------- */ psHooks->FClose( fpSHP ); psHooks->FClose( fpSHX ); return( SHPOpenLL( pszLayer, "r+b", psHooks ) ); } /************************************************************************/ /* _SHPSetBounds() */ /* */ /* Compute a bounds rectangle for a shape, and set it into the */ /* indicated location in the record. */ /************************************************************************/ static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) { ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); if( bBigEndian ) { SwapWord( 8, pabyRec + 0 ); SwapWord( 8, pabyRec + 8 ); SwapWord( 8, pabyRec + 16 ); SwapWord( 8, pabyRec + 24 ); } } /************************************************************************/ /* SHPComputeExtents() */ /* */ /* Recompute the extents of a shape. Automatically done by */ /* SHPCreateObject(). */ /************************************************************************/ void SHPAPI_CALL SHPComputeExtents( SHPObject * psObject ) { int i; /* -------------------------------------------------------------------- */ /* Build extents for this object. */ /* -------------------------------------------------------------------- */ if( psObject->nVertices > 0 ) { psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0]; psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; } for( i = 0; i < psObject->nVertices; i++ ) { psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]); psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]); psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]); psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]); psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]); psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]); } } /************************************************************************/ /* SHPCreateObject() */ /* */ /* Create a shape object. It should be freed with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPCreateObject( int nSHPType, int nShapeId, int nParts, const int * panPartStart, const int * panPartType, int nVertices, const double *padfX, const double *padfY, const double * padfZ, const double * padfM ) { SHPObject *psObject; int i, bHasM, bHasZ; psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); psObject->nSHPType = nSHPType; psObject->nShapeId = nShapeId; psObject->bMeasureIsUsed = FALSE; /* -------------------------------------------------------------------- */ /* Establish whether this shape type has M, and Z values. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARCM || nSHPType == SHPT_POINTM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_MULTIPOINTM ) { bHasM = TRUE; bHasZ = FALSE; } else if( nSHPType == SHPT_ARCZ || nSHPType == SHPT_POINTZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPOINTZ || nSHPType == SHPT_MULTIPATCH ) { bHasM = TRUE; bHasZ = TRUE; } else { bHasM = FALSE; bHasZ = FALSE; } /* -------------------------------------------------------------------- */ /* Capture parts. Note that part type is optional, and */ /* defaults to ring. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPATCH ) { psObject->nParts = MAX(1,nParts); psObject->panPartStart = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartType = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartStart[0] = 0; psObject->panPartType[0] = SHPP_RING; for( i = 0; i < nParts; i++ ) { psObject->panPartStart[i] = panPartStart[i]; if( panPartType != NULL ) psObject->panPartType[i] = panPartType[i]; else psObject->panPartType[i] = SHPP_RING; } if( psObject->panPartStart[0] != 0 ) psObject->panPartStart[0] = 0; } /* -------------------------------------------------------------------- */ /* Capture vertices. Note that Z and M are optional, but X and */ /* Y are not. */ /* -------------------------------------------------------------------- */ if( nVertices > 0 ) { psObject->padfX = (double *) calloc(sizeof(double),nVertices); psObject->padfY = (double *) calloc(sizeof(double),nVertices); psObject->padfZ = (double *) calloc(sizeof(double),nVertices); psObject->padfM = (double *) calloc(sizeof(double),nVertices); assert( padfX != NULL ); assert( padfY != NULL ); for( i = 0; i < nVertices; i++ ) { psObject->padfX[i] = padfX[i]; psObject->padfY[i] = padfY[i]; if( padfZ != NULL && bHasZ ) psObject->padfZ[i] = padfZ[i]; if( padfM != NULL && bHasM ) psObject->padfM[i] = padfM[i]; } if( padfM != NULL && bHasM ) psObject->bMeasureIsUsed = TRUE; } /* -------------------------------------------------------------------- */ /* Compute the extents. */ /* -------------------------------------------------------------------- */ psObject->nVertices = nVertices; SHPComputeExtents( psObject ); return( psObject ); } /************************************************************************/ /* SHPCreateSimpleObject() */ /* */ /* Create a simple (common) shape object. Destroy with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject( int nSHPType, int nVertices, const double * padfX, const double * padfY, const double * padfZ ) { return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL, nVertices, padfX, padfY, padfZ, NULL ) ); } /************************************************************************/ /* SHPWriteObject() */ /* */ /* Write out the vertices of a new structure. Note that it is */ /* only possible to write vertices at the end of the file. */ /************************************************************************/ int SHPAPI_CALL SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) { int nRecordOffset, i, nRecordSize=0; uchar *pabyRec; int32 i32; psSHP->bUpdated = TRUE; /* -------------------------------------------------------------------- */ /* Ensure that shape object matches the type of the file it is */ /* being written to. */ /* -------------------------------------------------------------------- */ assert( psObject->nSHPType == psSHP->nShapeType || psObject->nSHPType == SHPT_NULL ); /* -------------------------------------------------------------------- */ /* Ensure that -1 is used for appends. Either blow an */ /* assertion, or if they are disabled, set the shapeid to -1 */ /* for appends. */ /* -------------------------------------------------------------------- */ assert( nShapeId == -1 || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) nShapeId = -1; /* -------------------------------------------------------------------- */ /* Add the new entity to the in memory index. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) { psSHP->nMaxRecords =(int) ( psSHP->nMaxRecords * 1.3 + 100); psSHP->panRecOffset = (int *) SfRealloc(psSHP->panRecOffset,sizeof(int) * psSHP->nMaxRecords ); psSHP->panRecSize = (int *) SfRealloc(psSHP->panRecSize,sizeof(int) * psSHP->nMaxRecords ); } /* -------------------------------------------------------------------- */ /* Initialize record. */ /* -------------------------------------------------------------------- */ pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) + psObject->nParts * 8 + 128); /* -------------------------------------------------------------------- */ /* Extract vertices for a Polygon or Arc. */ /* -------------------------------------------------------------------- */ if( psObject->nSHPType == SHPT_POLYGON || psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_POLYGONM || psObject->nSHPType == SHPT_ARC || psObject->nSHPType == SHPT_ARCZ || psObject->nSHPType == SHPT_ARCM || psObject->nSHPType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i; nPoints = psObject->nVertices; nParts = psObject->nParts; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); nRecordSize = 52; /* * Write part start positions. */ ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, 4 * psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); nRecordSize += 4; } /* * Write multipatch part types if needed. */ if( psObject->nSHPType == SHPT_MULTIPATCH ) { memcpy( pabyRec + nRecordSize, psObject->panPartType, 4*psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); nRecordSize += 4; } } /* * Write the (x,y) vertex values. */ for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize + 8 ); nRecordSize += 2 * 8; } /* * Write the Z coordinates (if any). */ if( psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_ARCZ || psObject->nSHPType == SHPT_MULTIPATCH ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } /* * Write the M values, if any. */ if( psObject->bMeasureIsUsed && (psObject->nSHPType == SHPT_POLYGONM || psObject->nSHPType == SHPT_ARCM #ifndef DISABLE_MULTIPATCH_MEASURE || psObject->nSHPType == SHPT_MULTIPATCH #endif || psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_ARCZ) ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Extract vertices for a MultiPoint. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_MULTIPOINT || psObject->nSHPType == SHPT_MULTIPOINTZ || psObject->nSHPType == SHPT_MULTIPOINTM ) { int32 nPoints; int i; nPoints = psObject->nVertices; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); ByteCopy( &nPoints, pabyRec + 44, 4 ); for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); } nRecordSize = 48 + 16 * psObject->nVertices; if( psObject->nSHPType == SHPT_MULTIPOINTZ ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } if( psObject->bMeasureIsUsed && (psObject->nSHPType == SHPT_MULTIPOINTZ || psObject->nSHPType == SHPT_MULTIPOINTM) ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Write point. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_POINT || psObject->nSHPType == SHPT_POINTZ || psObject->nSHPType == SHPT_POINTM ) { ByteCopy( psObject->padfX, pabyRec + 12, 8 ); ByteCopy( psObject->padfY, pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); nRecordSize = 28; if( psObject->nSHPType == SHPT_POINTZ ) { ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } if( psObject->bMeasureIsUsed && (psObject->nSHPType == SHPT_POINTZ || psObject->nSHPType == SHPT_POINTM) ) { ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } /* -------------------------------------------------------------------- */ /* Not much to do for null geometries. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_NULL ) { nRecordSize = 12; } else { /* unknown type */ assert( FALSE ); } /* -------------------------------------------------------------------- */ /* Establish where we are going to put this record. If we are */ /* rewriting and existing record, and it will fit, then put it */ /* back where the original came from. Otherwise write at the end. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) { if( nShapeId == -1 ) nShapeId = psSHP->nRecords++; psSHP->panRecOffset[nShapeId] = nRecordOffset = psSHP->nFileSize; psSHP->panRecSize[nShapeId] = nRecordSize-8; psSHP->nFileSize += nRecordSize; } else { nRecordOffset = psSHP->panRecOffset[nShapeId]; psSHP->panRecSize[nShapeId] = nRecordSize-8; } /* -------------------------------------------------------------------- */ /* Set the shape type, record number, and record size. */ /* -------------------------------------------------------------------- */ i32 = nShapeId+1; /* record # */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec, 4 ); i32 = (nRecordSize-8)/2; /* record size */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 4, 4 ); i32 = psObject->nSHPType; /* shape type */ if( bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 8, 4 ); /* -------------------------------------------------------------------- */ /* Write out record. */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FSeek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 || psSHP->sHooks.FWrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) { psSHP->sHooks.Error( "Error in psSHP->sHooks.FSeek() or fwrite() writing object to .shp file." ); free( pabyRec ); return -1; } free( pabyRec ); /* -------------------------------------------------------------------- */ /* Expand file wide bounds based on this shape. */ /* -------------------------------------------------------------------- */ if( psSHP->adBoundsMin[0] == 0.0 && psSHP->adBoundsMax[0] == 0.0 && psSHP->adBoundsMin[1] == 0.0 && psSHP->adBoundsMax[1] == 0.0 ) { if( psObject->nSHPType == SHPT_NULL || psObject->nVertices == 0 ) { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = 0.0; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = 0.0; psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = 0.0; psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = 0.0; } else { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ[0]; psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM[0]; } } for( i = 0; i < psObject->nVertices; i++ ) { psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); } return( nShapeId ); } /************************************************************************/ /* SHPReadObject() */ /* */ /* Read the vertices, parts, and other non-attribute information */ /* for one shape. */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPReadObject( SHPHandle psSHP, int hEntity ) { int nEntitySize, nRequiredSize; SHPObject *psShape; char pszErrorMsg[128]; /* -------------------------------------------------------------------- */ /* Validate the record/entity number. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psSHP->nRecords ) return( NULL ); /* -------------------------------------------------------------------- */ /* Ensure our record buffer is large enough. */ /* -------------------------------------------------------------------- */ nEntitySize = psSHP->panRecSize[hEntity]+8; if( nEntitySize > psSHP->nBufSize ) { psSHP->pabyRec = (uchar *) SfRealloc(psSHP->pabyRec,nEntitySize); if (psSHP->pabyRec == NULL) { char szError[200]; /* Reallocate previous successfull size for following features */ psSHP->pabyRec = malloc(psSHP->nBufSize); sprintf( szError, "Not enough memory to allocate requested memory (nBufSize=%d). " "Probably broken SHP file", psSHP->nBufSize ); psSHP->sHooks.Error( szError ); return NULL; } /* Only set new buffer size after successfull alloc */ psSHP->nBufSize = nEntitySize; } /* In case we were not able to reallocate the buffer on a previous step */ if (psSHP->pabyRec == NULL) { return NULL; } /* -------------------------------------------------------------------- */ /* Read the record. */ /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FSeek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ) != 0 || psSHP->sHooks.FRead( psSHP->pabyRec, nEntitySize, 1, psSHP->fpSHP ) != 1 ) { /* * TODO - mloskot: Consider detailed diagnostics of shape file, * for example to detect if file is truncated. */ psSHP->sHooks.Error( "Error in fseek() or fread() reading object from .shp file." ); return NULL; } /* -------------------------------------------------------------------- */ /* Allocate and minimally initialize the object. */ /* -------------------------------------------------------------------- */ psShape = (SHPObject *) calloc(1,sizeof(SHPObject)); psShape->nShapeId = hEntity; psShape->bMeasureIsUsed = FALSE; if ( 8 + 4 > nEntitySize ) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } memcpy( &psShape->nSHPType, psSHP->pabyRec + 8, 4 ); if( bBigEndian ) SwapWord( 4, &(psShape->nSHPType) ); /* ==================================================================== */ /* Extract vertices for a Polygon or Arc. */ /* ==================================================================== */ if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC || psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_POLYGONM || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_ARCM || psShape->nSHPType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i, nOffset; if ( 40 + 8 + 4 > nEntitySize ) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* Extract part/point count, and build vertex and part arrays */ /* to proper size. */ /* -------------------------------------------------------------------- */ memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 ); memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); if (nPoints < 0 || nParts < 0 || nPoints > 50 * 1000 * 1000 || nParts > 10 * 1000 * 1000) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d, nPoints=%d, nParts=%d.", hEntity, nPoints, nParts); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } /* With the previous checks on nPoints and nParts, */ /* we should not overflow here and after */ /* since 50 M * (16 + 8 + 8) = 1 600 MB */ nRequiredSize = 44 + 8 + 4 * nParts + 16 * nPoints; if ( psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_MULTIPATCH ) { nRequiredSize += 16 + 8 * nPoints; } if( psShape->nSHPType == SHPT_MULTIPATCH ) { nRequiredSize += 4 * nParts; } if (nRequiredSize > nEntitySize) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d, nPoints=%d, nParts=%d, nEntitySize=%d.", hEntity, nPoints, nParts, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); psShape->nParts = nParts; psShape->panPartStart = (int *) calloc(nParts,sizeof(int)); psShape->panPartType = (int *) calloc(nParts,sizeof(int)); if (psShape->padfX == NULL || psShape->padfY == NULL || psShape->padfZ == NULL || psShape->padfM == NULL || psShape->panPartStart == NULL || psShape->panPartType == NULL) { g_snprintf(pszErrorMsg, 128, "Not enough memory to allocate requested memory (nPoints=%d, nParts=%d) for shape %d. " "Probably broken SHP file", hEntity, nPoints, nParts ); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } for( i = 0; i < nParts; i++ ) psShape->panPartType[i] = SHPP_RING; /* -------------------------------------------------------------------- */ /* Copy out the part array from the record. */ /* -------------------------------------------------------------------- */ memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); /* We check that the offset is inside the vertex array */ if (psShape->panPartStart[i] < 0 || psShape->panPartStart[i] >= psShape->nVertices) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : panPartStart[%d] = %d, nVertices = %d", hEntity, i, psShape->panPartStart[i], psShape->nVertices); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } if (i > 0 && psShape->panPartStart[i] <= psShape->panPartStart[i-1]) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : panPartStart[%d] = %d, panPartStart[%d] = %d", hEntity, i, psShape->panPartStart[i], i - 1, psShape->panPartStart[i - 1]); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } } nOffset = 44 + 8 + 4*nParts; /* -------------------------------------------------------------------- */ /* If this is a multipatch, we will also have parts types. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); } nOffset += 4*nParts; } /* -------------------------------------------------------------------- */ /* Copy out the vertices from the record. */ /* -------------------------------------------------------------------- */ for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX + i, psSHP->pabyRec + nOffset + i * 16, 8 ); memcpy(psShape->padfY + i, psSHP->pabyRec + nOffset + i * 16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset += 16*nPoints; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( nEntitySize >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } psShape->bMeasureIsUsed = TRUE; } } /* ==================================================================== */ /* Extract vertices for a MultiPoint. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_MULTIPOINT || psShape->nSHPType == SHPT_MULTIPOINTM || psShape->nSHPType == SHPT_MULTIPOINTZ ) { int32 nPoints; int i, nOffset; if ( 44 + 4 > nEntitySize ) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } memcpy( &nPoints, psSHP->pabyRec + 44, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); if (nPoints < 0 || nPoints > 50 * 1000 * 1000) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nPoints = %d", hEntity, nPoints); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } nRequiredSize = 48 + nPoints * 16; if( psShape->nSHPType == SHPT_MULTIPOINTZ ) { nRequiredSize += 16 + nPoints * 8; } if (nRequiredSize > nEntitySize) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nPoints = %d, nEntitySize = %d", hEntity, nPoints, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); if (psShape->padfX == NULL || psShape->padfY == NULL || psShape->padfZ == NULL || psShape->padfM == NULL) { g_snprintf(pszErrorMsg, 128, "Not enough memory to allocate requested memory (nPoints=%d) for shape %d. " "Probably broken SHP file", hEntity, nPoints ); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 ); memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset = 48 + 16*nPoints; /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPOINTZ ) { memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( nEntitySize >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } psShape->bMeasureIsUsed = TRUE; } } /* ==================================================================== */ /* Extract vertices for a point. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_POINT || psShape->nSHPType == SHPT_POINTM || psShape->nSHPType == SHPT_POINTZ ) { int nOffset; psShape->nVertices = 1; psShape->padfX = (double *) calloc(1,sizeof(double)); psShape->padfY = (double *) calloc(1,sizeof(double)); psShape->padfZ = (double *) calloc(1,sizeof(double)); psShape->padfM = (double *) calloc(1,sizeof(double)); if (20 + 8 + (( psShape->nSHPType == SHPT_POINTZ ) ? 8 : 0)> nEntitySize) { g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); psSHP->sHooks.Error( pszErrorMsg ); SHPDestroyObject(psShape); return NULL; } memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 ); memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX ); if( bBigEndian ) SwapWord( 8, psShape->padfY ); nOffset = 20 + 8; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POINTZ ) { memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ ); nOffset += 8; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( nEntitySize >= nOffset + 8 ) { memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM ); psShape->bMeasureIsUsed = TRUE; } /* -------------------------------------------------------------------- */ /* Since no extents are supplied in the record, we will apply */ /* them from the single vertex. */ /* -------------------------------------------------------------------- */ psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; } return( psShape ); } /************************************************************************/ /* SHPTypeName() */ /************************************************************************/ const char SHPAPI_CALL1(*) SHPTypeName( int nSHPType ) { switch( nSHPType ) { case SHPT_NULL: return "NullShape"; case SHPT_POINT: return "Point"; case SHPT_ARC: return "Arc"; case SHPT_POLYGON: return "Polygon"; case SHPT_MULTIPOINT: return "MultiPoint"; case SHPT_POINTZ: return "PointZ"; case SHPT_ARCZ: return "ArcZ"; case SHPT_POLYGONZ: return "PolygonZ"; case SHPT_MULTIPOINTZ: return "MultiPointZ"; case SHPT_POINTM: return "PointM"; case SHPT_ARCM: return "ArcM"; case SHPT_POLYGONM: return "PolygonM"; case SHPT_MULTIPOINTM: return "MultiPointM"; case SHPT_MULTIPATCH: return "MultiPatch"; default: return "UnknownShapeType"; } } /************************************************************************/ /* SHPPartTypeName() */ /************************************************************************/ const char SHPAPI_CALL1(*) SHPPartTypeName( int nPartType ) { switch( nPartType ) { case SHPP_TRISTRIP: return "TriangleStrip"; case SHPP_TRIFAN: return "TriangleFan"; case SHPP_OUTERRING: return "OuterRing"; case SHPP_INNERRING: return "InnerRing"; case SHPP_FIRSTRING: return "FirstRing"; case SHPP_RING: return "Ring"; default: return "UnknownPartType"; } } /************************************************************************/ /* SHPDestroyObject() */ /************************************************************************/ void SHPAPI_CALL SHPDestroyObject( SHPObject * psShape ) { if( psShape == NULL ) return; if( psShape->padfX != NULL ) free( psShape->padfX ); if( psShape->padfY != NULL ) free( psShape->padfY ); if( psShape->padfZ != NULL ) free( psShape->padfZ ); if( psShape->padfM != NULL ) free( psShape->padfM ); if( psShape->panPartStart != NULL ) free( psShape->panPartStart ); if( psShape->panPartType != NULL ) free( psShape->panPartType ); free( psShape ); } /************************************************************************/ /* SHPRewindObject() */ /* */ /* Reset the winding of polygon objects to adhere to the */ /* specification. */ /************************************************************************/ int SHPAPI_CALL SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ) { int iOpRing, bAltered = 0; /* -------------------------------------------------------------------- */ /* Do nothing if this is not a polygon object. */ /* -------------------------------------------------------------------- */ if( psObject->nSHPType != SHPT_POLYGON && psObject->nSHPType != SHPT_POLYGONZ && psObject->nSHPType != SHPT_POLYGONM ) return 0; if( psObject->nVertices == 0 || psObject->nParts == 0 ) return 0; /* -------------------------------------------------------------------- */ /* Process each of the rings. */ /* -------------------------------------------------------------------- */ for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ ) { int bInner, iVert, nVertCount, nVertStart, iCheckRing; double dfSum, dfTestX, dfTestY; /* -------------------------------------------------------------------- */ /* Determine if this ring is an inner ring or an outer ring */ /* relative to all the other rings. For now we assume the */ /* first ring is outer and all others are inner, but eventually */ /* we need to fix this to handle multiple island polygons and */ /* unordered sets of rings. */ /* */ /* -------------------------------------------------------------------- */ /* Use point in the middle of segment to avoid testing * common points of rings. */ dfTestX = ( psObject->padfX[psObject->panPartStart[iOpRing]] + psObject->padfX[psObject->panPartStart[iOpRing] + 1] ) / 2; dfTestY = ( psObject->padfY[psObject->panPartStart[iOpRing]] + psObject->padfY[psObject->panPartStart[iOpRing] + 1] ) / 2; bInner = FALSE; for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) { int iEdge; if( iCheckRing == iOpRing ) continue; nVertStart = psObject->panPartStart[iCheckRing]; if( iCheckRing == psObject->nParts-1 ) nVertCount = psObject->nVertices - psObject->panPartStart[iCheckRing]; else nVertCount = psObject->panPartStart[iCheckRing+1] - psObject->panPartStart[iCheckRing]; for( iEdge = 0; iEdge < nVertCount; iEdge++ ) { int iNext; if( iEdge < nVertCount-1 ) iNext = iEdge+1; else iNext = 0; /* Rule #1: * Test whether the edge 'straddles' the horizontal ray from the test point (dfTestY,dfTestY) * The rule #1 also excludes edges collinear with the ray. */ if ( ( psObject->padfY[iEdge+nVertStart] < dfTestY && dfTestY <= psObject->padfY[iNext+nVertStart] ) || ( psObject->padfY[iNext+nVertStart] < dfTestY && dfTestY <= psObject->padfY[iEdge+nVertStart] ) ) { /* Rule #2: * Test if edge-ray intersection is on the right from the test point (dfTestY,dfTestY) */ double const intersect = ( psObject->padfX[iEdge+nVertStart] + ( dfTestY - psObject->padfY[iEdge+nVertStart] ) / ( psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart] ) * ( psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart] ) ); if (intersect < dfTestX) { bInner = !bInner; } } } } /* for iCheckRing */ /* -------------------------------------------------------------------- */ /* Determine the current order of this ring so we will know if */ /* it has to be reversed. */ /* -------------------------------------------------------------------- */ nVertStart = psObject->panPartStart[iOpRing]; if( iOpRing == psObject->nParts-1 ) nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; else nVertCount = psObject->panPartStart[iOpRing+1] - psObject->panPartStart[iOpRing]; dfSum = 0.0; for( iVert = nVertStart; iVert < nVertStart+nVertCount-1; iVert++ ) { dfSum += psObject->padfX[iVert] * psObject->padfY[iVert+1] - psObject->padfY[iVert] * psObject->padfX[iVert+1]; } dfSum += psObject->padfX[iVert] * psObject->padfY[nVertStart] - psObject->padfY[iVert] * psObject->padfX[nVertStart]; /* -------------------------------------------------------------------- */ /* Reverse if necessary. */ /* -------------------------------------------------------------------- */ if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) ) { int i; bAltered++; for( i = 0; i < nVertCount/2; i++ ) { double dfSaved; /* Swap X */ dfSaved = psObject->padfX[nVertStart+i]; psObject->padfX[nVertStart+i] = psObject->padfX[nVertStart+nVertCount-i-1]; psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved; /* Swap Y */ dfSaved = psObject->padfY[nVertStart+i]; psObject->padfY[nVertStart+i] = psObject->padfY[nVertStart+nVertCount-i-1]; psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved; /* Swap Z */ if( psObject->padfZ ) { dfSaved = psObject->padfZ[nVertStart+i]; psObject->padfZ[nVertStart+i] = psObject->padfZ[nVertStart+nVertCount-i-1]; psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved; } /* Swap M */ if( psObject->padfM ) { dfSaved = psObject->padfM[nVertStart+i]; psObject->padfM[nVertStart+i] = psObject->padfM[nVertStart+nVertCount-i-1]; psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved; } } } } return bAltered; } navit-0.5.0+dfsg.1/navit/support/shapefile/shptree.c000066400000000000000000001157151264204753600223510ustar00rootroot00000000000000/****************************************************************************** * $Id: shptree.c,v 1.12 2008/11/12 15:39:50 fwarmerdam Exp $ * * Project: Shapelib * Purpose: Implementation of quadtree building and searching functions. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shptree.c,v $ * Revision 1.12 2008/11/12 15:39:50 fwarmerdam * improve safety in face of buggy .shp file. * * Revision 1.11 2007/10/27 03:31:14 fwarmerdam * limit default depth of tree to 12 levels (gdal ticket #1594) * * Revision 1.10 2005/01/03 22:30:13 fwarmerdam * added support for saved quadtrees * * Revision 1.9 2003/01/28 15:53:41 warmerda * Avoid build warnings. * * Revision 1.8 2002/05/07 13:07:45 warmerda * use qsort() - patch from Bernhard Herzog * * Revision 1.7 2002/01/15 14:36:07 warmerda * updated email address * * Revision 1.6 2001/05/23 13:36:52 warmerda * added use of SHPAPI_CALL * * Revision 1.5 1999/11/05 14:12:05 warmerda * updated license terms * * Revision 1.4 1999/06/02 18:24:21 warmerda * added trimming code * * Revision 1.3 1999/06/02 17:56:12 warmerda * added quad'' subnode support for trees * * Revision 1.2 1999/05/18 19:11:11 warmerda * Added example searching capability * * Revision 1.1 1999/05/18 17:49:20 warmerda * New * */ #include "shapefil.h" #include #include #include #include #ifdef USE_CPL #include #endif #if 0 SHP_CVSID("$Id: shptree.c,v 1.12 2008/11/12 15:39:50 fwarmerdam Exp $") #endif #ifndef TRUE # define TRUE 1 # define FALSE 0 #endif static int bBigEndian = 0; void SHPAPI_CALL SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, double *padfBoundsMin1, double * padfBoundsMax1, double *padfBoundsMin2, double * padfBoundsMax2 ); void SHPAPI_CALL SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, double * padfBoundsMin, double * padfBoundsMax, int * pnShapeCount, int * pnMaxShapes, int ** ppanShapeList ); /* -------------------------------------------------------------------- */ /* If the following is 0.5, nodes will be split in half. If it */ /* is 0.6 then each subnode will contain 60% of the parent */ /* node, with 20% representing overlap. This can be help to */ /* prevent small objects on a boundary from shifting too high */ /* up the tree. */ /* -------------------------------------------------------------------- */ #define SHP_SPLIT_RATIO 0.55 /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* SHPTreeNodeInit() */ /* */ /* Initialize a tree node. */ /************************************************************************/ static SHPTreeNode *SHPTreeNodeCreate( double * padfBoundsMin, double * padfBoundsMax ) { SHPTreeNode *psTreeNode; psTreeNode = (SHPTreeNode *) malloc(sizeof(SHPTreeNode)); if( NULL == psTreeNode ) { #ifdef USE_CPL CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); #endif return NULL; } psTreeNode->nShapeCount = 0; psTreeNode->panShapeIds = NULL; psTreeNode->papsShapeObj = NULL; psTreeNode->nSubNodes = 0; if( padfBoundsMin != NULL ) memcpy( psTreeNode->adfBoundsMin, padfBoundsMin, sizeof(double) * 4 ); if( padfBoundsMax != NULL ) memcpy( psTreeNode->adfBoundsMax, padfBoundsMax, sizeof(double) * 4 ); return psTreeNode; } /************************************************************************/ /* SHPCreateTree() */ /************************************************************************/ SHPTree SHPAPI_CALL1(*) SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, double *padfBoundsMin, double *padfBoundsMax ) { SHPTree *psTree; if( padfBoundsMin == NULL && hSHP == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* Allocate the tree object */ /* -------------------------------------------------------------------- */ psTree = (SHPTree *) malloc(sizeof(SHPTree)); if( NULL == psTree ) { #ifdef USE_CPL CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); #endif return NULL; } psTree->hSHP = hSHP; psTree->nMaxDepth = nMaxDepth; psTree->nDimension = nDimension; psTree->nTotalCount = 0; /* -------------------------------------------------------------------- */ /* If no max depth was defined, try to select a reasonable one */ /* that implies approximately 8 shapes per node. */ /* -------------------------------------------------------------------- */ if( psTree->nMaxDepth == 0 && hSHP != NULL ) { int nMaxNodeCount = 1; int nShapeCount; SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); while( nMaxNodeCount*4 < nShapeCount ) { psTree->nMaxDepth += 1; nMaxNodeCount = nMaxNodeCount * 2; } #ifdef USE_CPL CPLDebug( "Shape", "Estimated spatial index tree depth: %d", psTree->nMaxDepth ); #endif /* NOTE: Due to problems with memory allocation for deep trees, * automatically estimated depth is limited up to 12 levels. * See Ticket #1594 for detailed discussion. */ if( psTree->nMaxDepth > MAX_DEFAULT_TREE_DEPTH ) { psTree->nMaxDepth = MAX_DEFAULT_TREE_DEPTH; #ifdef USE_CPL CPLDebug( "Shape", "Falling back to max number of allowed index tree levels (%d).", MAX_DEFAULT_TREE_DEPTH ); #endif } } /* -------------------------------------------------------------------- */ /* Allocate the root node. */ /* -------------------------------------------------------------------- */ psTree->psRoot = SHPTreeNodeCreate( padfBoundsMin, padfBoundsMax ); if( NULL == psTree->psRoot ) { return NULL; } /* -------------------------------------------------------------------- */ /* Assign the bounds to the root node. If none are passed in, */ /* use the bounds of the provided file otherwise the create */ /* function will have already set the bounds. */ /* -------------------------------------------------------------------- */ assert( NULL != psTree ); assert( NULL != psTree->psRoot ); if( padfBoundsMin == NULL ) { SHPGetInfo( hSHP, NULL, NULL, psTree->psRoot->adfBoundsMin, psTree->psRoot->adfBoundsMax ); } /* -------------------------------------------------------------------- */ /* If we have a file, insert all it's shapes into the tree. */ /* -------------------------------------------------------------------- */ if( hSHP != NULL ) { int iShape, nShapeCount; SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); for( iShape = 0; iShape < nShapeCount; iShape++ ) { SHPObject *psShape; psShape = SHPReadObject( hSHP, iShape ); if( psShape != NULL ) { SHPTreeAddShapeId( psTree, psShape ); SHPDestroyObject( psShape ); } } } return psTree; } /************************************************************************/ /* SHPDestroyTreeNode() */ /************************************************************************/ static void SHPDestroyTreeNode( SHPTreeNode * psTreeNode ) { int i; assert( NULL != psTreeNode ); for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( psTreeNode->apsSubNode[i] != NULL ) SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); } if( psTreeNode->panShapeIds != NULL ) free( psTreeNode->panShapeIds ); if( psTreeNode->papsShapeObj != NULL ) { for( i = 0; i < psTreeNode->nShapeCount; i++ ) { if( psTreeNode->papsShapeObj[i] != NULL ) SHPDestroyObject( psTreeNode->papsShapeObj[i] ); } free( psTreeNode->papsShapeObj ); } free( psTreeNode ); } /************************************************************************/ /* SHPDestroyTree() */ /************************************************************************/ void SHPAPI_CALL SHPDestroyTree( SHPTree * psTree ) { SHPDestroyTreeNode( psTree->psRoot ); free( psTree ); } /************************************************************************/ /* SHPCheckBoundsOverlap() */ /* */ /* Do the given boxes overlap at all? */ /************************************************************************/ int SHPAPI_CALL SHPCheckBoundsOverlap( double * padfBox1Min, double * padfBox1Max, double * padfBox2Min, double * padfBox2Max, int nDimension ) { int iDim; for( iDim = 0; iDim < nDimension; iDim++ ) { if( padfBox2Max[iDim] < padfBox1Min[iDim] ) return FALSE; if( padfBox1Max[iDim] < padfBox2Min[iDim] ) return FALSE; } return TRUE; } /************************************************************************/ /* SHPCheckObjectContained() */ /* */ /* Does the given shape fit within the indicated extents? */ /************************************************************************/ static int SHPCheckObjectContained( SHPObject * psObject, int nDimension, double * padfBoundsMin, double * padfBoundsMax ) { if( psObject->dfXMin < padfBoundsMin[0] || psObject->dfXMax > padfBoundsMax[0] ) return FALSE; if( psObject->dfYMin < padfBoundsMin[1] || psObject->dfYMax > padfBoundsMax[1] ) return FALSE; if( nDimension == 2 ) return TRUE; if( psObject->dfZMin < padfBoundsMin[2] || psObject->dfZMax < padfBoundsMax[2] ) return FALSE; if( nDimension == 3 ) return TRUE; if( psObject->dfMMin < padfBoundsMin[3] || psObject->dfMMax < padfBoundsMax[3] ) return FALSE; return TRUE; } /************************************************************************/ /* SHPTreeSplitBounds() */ /* */ /* Split a region into two subregion evenly, cutting along the */ /* longest dimension. */ /************************************************************************/ void SHPAPI_CALL SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, double *padfBoundsMin1, double * padfBoundsMax1, double *padfBoundsMin2, double * padfBoundsMax2 ) { /* -------------------------------------------------------------------- */ /* The output bounds will be very similar to the input bounds, */ /* so just copy over to start. */ /* -------------------------------------------------------------------- */ memcpy( padfBoundsMin1, padfBoundsMinIn, sizeof(double) * 4 ); memcpy( padfBoundsMax1, padfBoundsMaxIn, sizeof(double) * 4 ); memcpy( padfBoundsMin2, padfBoundsMinIn, sizeof(double) * 4 ); memcpy( padfBoundsMax2, padfBoundsMaxIn, sizeof(double) * 4 ); /* -------------------------------------------------------------------- */ /* Split in X direction. */ /* -------------------------------------------------------------------- */ if( (padfBoundsMaxIn[0] - padfBoundsMinIn[0]) > (padfBoundsMaxIn[1] - padfBoundsMinIn[1]) ) { double dfRange = padfBoundsMaxIn[0] - padfBoundsMinIn[0]; padfBoundsMax1[0] = padfBoundsMinIn[0] + dfRange * SHP_SPLIT_RATIO; padfBoundsMin2[0] = padfBoundsMaxIn[0] - dfRange * SHP_SPLIT_RATIO; } /* -------------------------------------------------------------------- */ /* Otherwise split in Y direction. */ /* -------------------------------------------------------------------- */ else { double dfRange = padfBoundsMaxIn[1] - padfBoundsMinIn[1]; padfBoundsMax1[1] = padfBoundsMinIn[1] + dfRange * SHP_SPLIT_RATIO; padfBoundsMin2[1] = padfBoundsMaxIn[1] - dfRange * SHP_SPLIT_RATIO; } } /************************************************************************/ /* SHPTreeNodeAddShapeId() */ /************************************************************************/ static int SHPTreeNodeAddShapeId( SHPTreeNode * psTreeNode, SHPObject * psObject, int nMaxDepth, int nDimension ) { int i; /* -------------------------------------------------------------------- */ /* If there are subnodes, then consider wiether this object */ /* will fit in them. */ /* -------------------------------------------------------------------- */ if( nMaxDepth > 1 && psTreeNode->nSubNodes > 0 ) { for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( SHPCheckObjectContained(psObject, nDimension, psTreeNode->apsSubNode[i]->adfBoundsMin, psTreeNode->apsSubNode[i]->adfBoundsMax)) { return SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[i], psObject, nMaxDepth-1, nDimension ); } } } /* -------------------------------------------------------------------- */ /* Otherwise, consider creating four subnodes if could fit into */ /* them, and adding to the appropriate subnode. */ /* -------------------------------------------------------------------- */ #if MAX_SUBNODE == 4 else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) { double adfBoundsMinH1[4], adfBoundsMaxH1[4]; double adfBoundsMinH2[4], adfBoundsMaxH2[4]; double adfBoundsMin1[4], adfBoundsMax1[4]; double adfBoundsMin2[4], adfBoundsMax2[4]; double adfBoundsMin3[4], adfBoundsMax3[4]; double adfBoundsMin4[4], adfBoundsMax4[4]; SHPTreeSplitBounds( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, adfBoundsMinH1, adfBoundsMaxH1, adfBoundsMinH2, adfBoundsMaxH2 ); SHPTreeSplitBounds( adfBoundsMinH1, adfBoundsMaxH1, adfBoundsMin1, adfBoundsMax1, adfBoundsMin2, adfBoundsMax2 ); SHPTreeSplitBounds( adfBoundsMinH2, adfBoundsMaxH2, adfBoundsMin3, adfBoundsMax3, adfBoundsMin4, adfBoundsMax4 ); if( SHPCheckObjectContained(psObject, nDimension, adfBoundsMin1, adfBoundsMax1) || SHPCheckObjectContained(psObject, nDimension, adfBoundsMin2, adfBoundsMax2) || SHPCheckObjectContained(psObject, nDimension, adfBoundsMin3, adfBoundsMax3) || SHPCheckObjectContained(psObject, nDimension, adfBoundsMin4, adfBoundsMax4) ) { psTreeNode->nSubNodes = 4; psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, adfBoundsMax1 ); psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, adfBoundsMax2 ); psTreeNode->apsSubNode[2] = SHPTreeNodeCreate( adfBoundsMin3, adfBoundsMax3 ); psTreeNode->apsSubNode[3] = SHPTreeNodeCreate( adfBoundsMin4, adfBoundsMax4 ); /* recurse back on this node now that it has subnodes */ return( SHPTreeNodeAddShapeId( psTreeNode, psObject, nMaxDepth, nDimension ) ); } } #endif /* MAX_SUBNODE == 4 */ /* -------------------------------------------------------------------- */ /* Otherwise, consider creating two subnodes if could fit into */ /* them, and adding to the appropriate subnode. */ /* -------------------------------------------------------------------- */ #if MAX_SUBNODE == 2 else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) { double adfBoundsMin1[4], adfBoundsMax1[4]; double adfBoundsMin2[4], adfBoundsMax2[4]; SHPTreeSplitBounds( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, adfBoundsMin1, adfBoundsMax1, adfBoundsMin2, adfBoundsMax2 ); if( SHPCheckObjectContained(psObject, nDimension, adfBoundsMin1, adfBoundsMax1)) { psTreeNode->nSubNodes = 2; psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, adfBoundsMax1 ); psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, adfBoundsMax2 ); return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[0], psObject, nMaxDepth - 1, nDimension ) ); } else if( SHPCheckObjectContained(psObject, nDimension, adfBoundsMin2, adfBoundsMax2) ) { psTreeNode->nSubNodes = 2; psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, adfBoundsMax1 ); psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, adfBoundsMax2 ); return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[1], psObject, nMaxDepth - 1, nDimension ) ); } } #endif /* MAX_SUBNODE == 2 */ /* -------------------------------------------------------------------- */ /* If none of that worked, just add it to this nodes list. */ /* -------------------------------------------------------------------- */ psTreeNode->nShapeCount++; psTreeNode->panShapeIds = (int *) SfRealloc( psTreeNode->panShapeIds, sizeof(int) * psTreeNode->nShapeCount ); psTreeNode->panShapeIds[psTreeNode->nShapeCount-1] = psObject->nShapeId; if( psTreeNode->papsShapeObj != NULL ) { psTreeNode->papsShapeObj = (SHPObject **) SfRealloc( psTreeNode->papsShapeObj, sizeof(void *) * psTreeNode->nShapeCount ); psTreeNode->papsShapeObj[psTreeNode->nShapeCount-1] = NULL; } return TRUE; } /************************************************************************/ /* SHPTreeAddShapeId() */ /* */ /* Add a shape to the tree, but don't keep a pointer to the */ /* object data, just keep the shapeid. */ /************************************************************************/ int SHPAPI_CALL SHPTreeAddShapeId( SHPTree * psTree, SHPObject * psObject ) { psTree->nTotalCount++; return( SHPTreeNodeAddShapeId( psTree->psRoot, psObject, psTree->nMaxDepth, psTree->nDimension ) ); } /************************************************************************/ /* SHPTreeCollectShapesIds() */ /* */ /* Work function implementing SHPTreeFindLikelyShapes() on a */ /* tree node by tree node basis. */ /************************************************************************/ void SHPAPI_CALL SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, double * padfBoundsMin, double * padfBoundsMax, int * pnShapeCount, int * pnMaxShapes, int ** ppanShapeList ) { int i; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if( !SHPCheckBoundsOverlap( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, padfBoundsMin, padfBoundsMax, hTree->nDimension ) ) return; /* -------------------------------------------------------------------- */ /* Grow the list to hold the shapes on this node. */ /* -------------------------------------------------------------------- */ if( *pnShapeCount + psTreeNode->nShapeCount > *pnMaxShapes ) { *pnMaxShapes = (*pnShapeCount + psTreeNode->nShapeCount) * 2 + 20; *ppanShapeList = (int *) SfRealloc(*ppanShapeList,sizeof(int) * *pnMaxShapes); } /* -------------------------------------------------------------------- */ /* Add the local nodes shapeids to the list. */ /* -------------------------------------------------------------------- */ for( i = 0; i < psTreeNode->nShapeCount; i++ ) { (*ppanShapeList)[(*pnShapeCount)++] = psTreeNode->panShapeIds[i]; } /* -------------------------------------------------------------------- */ /* Recurse to subnodes if they exist. */ /* -------------------------------------------------------------------- */ for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( psTreeNode->apsSubNode[i] != NULL ) SHPTreeCollectShapeIds( hTree, psTreeNode->apsSubNode[i], padfBoundsMin, padfBoundsMax, pnShapeCount, pnMaxShapes, ppanShapeList ); } } /************************************************************************/ /* SHPTreeFindLikelyShapes() */ /* */ /* Find all shapes within tree nodes for which the tree node */ /* bounding box overlaps the search box. The return value is */ /* an array of shapeids terminated by a -1. The shapeids will */ /* be in order, as hopefully this will result in faster (more */ /* sequential) reading from the file. */ /************************************************************************/ /* helper for qsort */ static int compare_ints( const void * a, const void * b) { return (*(int*)a) - (*(int*)b); } int SHPAPI_CALL1(*) SHPTreeFindLikelyShapes( SHPTree * hTree, double * padfBoundsMin, double * padfBoundsMax, int * pnShapeCount ) { int *panShapeList=NULL, nMaxShapes = 0; /* -------------------------------------------------------------------- */ /* Perform the search by recursive descent. */ /* -------------------------------------------------------------------- */ *pnShapeCount = 0; SHPTreeCollectShapeIds( hTree, hTree->psRoot, padfBoundsMin, padfBoundsMax, pnShapeCount, &nMaxShapes, &panShapeList ); /* -------------------------------------------------------------------- */ /* Sort the id array */ /* -------------------------------------------------------------------- */ qsort(panShapeList, *pnShapeCount, sizeof(int), compare_ints); return panShapeList; } /************************************************************************/ /* SHPTreeNodeTrim() */ /* */ /* This is the recurve version of SHPTreeTrimExtraNodes() that */ /* walks the tree cleaning it up. */ /************************************************************************/ static int SHPTreeNodeTrim( SHPTreeNode * psTreeNode ) { int i; /* -------------------------------------------------------------------- */ /* Trim subtrees, and free subnodes that come back empty. */ /* -------------------------------------------------------------------- */ for( i = 0; i < psTreeNode->nSubNodes; i++ ) { if( SHPTreeNodeTrim( psTreeNode->apsSubNode[i] ) ) { SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); psTreeNode->apsSubNode[i] = psTreeNode->apsSubNode[psTreeNode->nSubNodes-1]; psTreeNode->nSubNodes--; i--; /* process the new occupant of this subnode entry */ } } /* -------------------------------------------------------------------- */ /* We should be trimmed if we have no subnodes, and no shapes. */ /* -------------------------------------------------------------------- */ return( psTreeNode->nSubNodes == 0 && psTreeNode->nShapeCount == 0 ); } /************************************************************************/ /* SHPTreeTrimExtraNodes() */ /* */ /* Trim empty nodes from the tree. Note that we never trim an */ /* empty root node. */ /************************************************************************/ void SHPAPI_CALL SHPTreeTrimExtraNodes( SHPTree * hTree ) { SHPTreeNodeTrim( hTree->psRoot ); } /************************************************************************/ /* SwapWord() */ /* */ /* Swap a 2, 4 or 8 byte word. */ /************************************************************************/ static void SwapWord( int length, void * wordP ) { int i; unsigned char temp; for( i=0; i < length/2; i++ ) { temp = ((unsigned char *) wordP)[i]; ((unsigned char *)wordP)[i] = ((unsigned char *) wordP)[length-i-1]; ((unsigned char *) wordP)[length-i-1] = temp; } } /************************************************************************/ /* SHPSearchDiskTreeNode() */ /************************************************************************/ static int SHPSearchDiskTreeNode( FILE *fp, double *padfBoundsMin, double *padfBoundsMax, int **ppanResultBuffer, int *pnBufferMax, int *pnResultCount, int bNeedSwap ) { int i; int offset; int numshapes, numsubnodes; double adfNodeBoundsMin[2], adfNodeBoundsMax[2]; /* -------------------------------------------------------------------- */ /* Read and unswap first part of node info. */ /* -------------------------------------------------------------------- */ fread( &offset, 4, 1, fp ); if ( bNeedSwap ) SwapWord ( 4, &offset ); fread( adfNodeBoundsMin, sizeof(double), 2, fp ); fread( adfNodeBoundsMax, sizeof(double), 2, fp ); if ( bNeedSwap ) { SwapWord( 8, adfNodeBoundsMin + 0 ); SwapWord( 8, adfNodeBoundsMin + 1 ); SwapWord( 8, adfNodeBoundsMax + 0 ); SwapWord( 8, adfNodeBoundsMax + 1 ); } fread( &numshapes, 4, 1, fp ); if ( bNeedSwap ) SwapWord ( 4, &numshapes ); /* -------------------------------------------------------------------- */ /* If we don't overlap this node at all, we can just fseek() */ /* pass this node info and all subnodes. */ /* -------------------------------------------------------------------- */ if( !SHPCheckBoundsOverlap( adfNodeBoundsMin, adfNodeBoundsMax, padfBoundsMin, padfBoundsMax, 2 ) ) { offset += numshapes*sizeof(int) + sizeof(int); fseek(fp, offset, SEEK_CUR); return TRUE; } /* -------------------------------------------------------------------- */ /* Add all the shapeids at this node to our list. */ /* -------------------------------------------------------------------- */ if(numshapes > 0) { if( *pnResultCount + numshapes > *pnBufferMax ) { *pnBufferMax = (int) ((*pnResultCount + numshapes + 100) * 1.25); *ppanResultBuffer = (int *) SfRealloc( *ppanResultBuffer, *pnBufferMax * sizeof(int) ); } fread( *ppanResultBuffer + *pnResultCount, sizeof(int), numshapes, fp ); if (bNeedSwap ) { for( i=0; inSubNodes; i++ ) { if(node->apsSubNode[i]) { offset += 4*sizeof(double) + (node->apsSubNode[i]->nShapeCount+3)*sizeof(int); offset += SHPGetSubNodeOffset(node->apsSubNode[i]); } } return(offset); } /************************************************************************/ /* SHPWriteTreeNode() */ /************************************************************************/ static void SHPWriteTreeNode( FILE *fp, SHPTreeNode *node) { int i,j; int offset; unsigned char *pabyRec = NULL; assert( NULL != node ); offset = SHPGetSubNodeOffset(node); pabyRec = (unsigned char *) malloc(sizeof(double) * 4 + (3 * sizeof(int)) + (node->nShapeCount * sizeof(int)) ); if( NULL == pabyRec ) { #ifdef USE_CPL CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); #endif assert( 0 ); } assert( NULL != pabyRec ); memcpy( pabyRec, &offset, 4); /* minx, miny, maxx, maxy */ memcpy( pabyRec+ 4, node->adfBoundsMin+0, sizeof(double) ); memcpy( pabyRec+12, node->adfBoundsMin+1, sizeof(double) ); memcpy( pabyRec+20, node->adfBoundsMax+0, sizeof(double) ); memcpy( pabyRec+28, node->adfBoundsMax+1, sizeof(double) ); memcpy( pabyRec+36, &node->nShapeCount, 4); j = node->nShapeCount * sizeof(int); memcpy( pabyRec+40, node->panShapeIds, j); memcpy( pabyRec+j+40, &node->nSubNodes, 4); fwrite( pabyRec, 44+j, 1, fp ); free (pabyRec); for(i=0; inSubNodes; i++ ) { if(node->apsSubNode[i]) SHPWriteTreeNode( fp, node->apsSubNode[i]); } } /************************************************************************/ /* SHPWriteTree() */ /************************************************************************/ int SHPWriteTree(SHPTree *tree, const char *filename ) { char signature[4] = "SQT"; int i; char abyBuf[32]; FILE *fp; /* -------------------------------------------------------------------- */ /* Open the output file. */ /* -------------------------------------------------------------------- */ fp = fopen(filename, "wb"); if( fp == NULL ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((unsigned char *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Write the header. */ /* -------------------------------------------------------------------- */ memcpy( abyBuf+0, signature, 3 ); if( bBigEndian ) abyBuf[3] = 2; /* New MSB */ else abyBuf[3] = 1; /* New LSB */ abyBuf[4] = 1; /* version */ abyBuf[5] = 0; /* next 3 reserved */ abyBuf[6] = 0; abyBuf[7] = 0; fwrite( abyBuf, 8, 1, fp ); fwrite( &(tree->nTotalCount), 4, 1, fp ); /* write maxdepth */ fwrite( &(tree->nMaxDepth), 4, 1, fp ); /* -------------------------------------------------------------------- */ /* Write all the nodes "in order". */ /* -------------------------------------------------------------------- */ SHPWriteTreeNode( fp, tree->psRoot ); fclose( fp ); return TRUE; } navit-0.5.0+dfsg.1/navit/track.c000066400000000000000000000753351264204753600163320ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "item.h" #include "attr.h" #include "track.h" #include "xmlconfig.h" #include "debug.h" #include "transform.h" #include "coord.h" #include "route.h" #include "projection.h" #include "map.h" #include "mapset.h" #include "plugin.h" #include "vehicleprofile.h" #include "vehicle.h" #include "roadprofile.h" #include "util.h" #include "config.h" #include "callback.h" struct object_func tracking_func; struct tracking_line { struct street_data *street; struct tracking_line *next; int angle[0]; }; /** * @brief Conatins a list of previous speeds * * This structure is used to hold a list of previously reported * speeds. This data is used by the CDF. */ struct cdf_speed { struct cdf_speed *next; int speed; time_t time; }; /** * @brief Contains data for the CDF * * This structure holds all data needed by the * cumulative displacement filter. */ struct cdf_data { int extrapolating; int available; int first_pos; int poscount; int hist_size; struct cdf_speed *speed_hist; struct pcoord *pos_hist; int *dir_hist; double last_dist; struct pcoord last_out; int last_dir; }; struct tracking { NAVIT_OBJECT struct callback_list *callback_list; struct mapset *ms; struct route *rt; struct map *map; struct vehicle *vehicle; struct vehicleprofile *vehicleprofile; struct coord last_updated; struct tracking_line *lines; struct tracking_line *curr_line; int pos; struct coord curr[2], curr_in, curr_out; int curr_angle; struct coord last[2], last_in, last_out; struct cdf_data cdf; struct attr *attr; int valid; int time; double direction, direction_matched; double speed; int coord_geo_valid; struct coord_geo coord_geo; enum projection pro; int street_direction; int no_gps; int tunnel; int angle_pref; int connected_pref; int nostop_pref; int offroad_limit_pref; int route_pref; int overspeed_pref; int overspeed_percent_pref; int tunnel_extrapolation; }; static void tracking_init_cdf(struct cdf_data *cdf, int hist_size) { cdf->extrapolating = 0; cdf->available = 0; cdf->poscount = 0; cdf->last_dist = 0; cdf->hist_size = hist_size; cdf->pos_hist = g_new0(struct pcoord, hist_size); cdf->dir_hist = g_new0(int, hist_size); } // Variables for finetuning the CDF // Minimum average speed #define CDF_MINAVG 1.f // Maximum average speed #define CDF_MAXAVG 6.f // only ~ 20 km/h // We need a low value here because otherwise we would extrapolate whenever we are not accelerating // Mininum distance (square of it..), below which we ignore gps updates #define CDF_MINDIST 49 // 7 meters, I guess this value has to be changed for pedestrians. #if 0 static void tracking_process_cdf(struct cdf_data *cdf, struct pcoord *pin, struct pcoord *pout, int dirin, int *dirout, int cur_speed, time_t fixtime) { struct cdf_speed *speed,*sc,*sl; double speed_avg; int speed_num,i; if (cdf->hist_size == 0) { dbg(lvl_warning,"No CDF.\n"); *pout = *pin; *dirout = dirin; return; } speed = g_new0(struct cdf_speed, 1); speed->speed = cur_speed; speed->time = fixtime; speed->next = cdf->speed_hist; cdf->speed_hist = speed; sc = speed; sl = NULL; speed_num = 0; speed_avg = 0; while (sc && ((fixtime - speed->time) < 4)) { // FIXME static maxtime speed_num++; speed_avg += sc->speed; sl = sc; sc = sc->next; } speed_avg /= (double)speed_num; if (sl) { sl->next = NULL; } while (sc) { sl = sc->next; g_free(sc); sc = sl; } if (speed_avg < CDF_MINAVG) { speed_avg = CDF_MINAVG; } else if (speed_avg > CDF_MAXAVG) { speed_avg = CDF_MAXAVG; } if (cur_speed >= speed_avg) { if (cdf->extrapolating) { cdf->poscount = 0; cdf->extrapolating = 0; } cdf->first_pos--; if (cdf->first_pos < 0) { cdf->first_pos = cdf->hist_size - 1; } if (cdf->poscount < cdf->hist_size) { cdf->poscount++; } cdf->pos_hist[cdf->first_pos] = *pin; cdf->dir_hist[cdf->first_pos] = dirin; *pout = *pin; *dirout = dirin; } else if (cdf->poscount > 0) { double mx,my; // Average position's x and y values double sx,sy; // Support vector double dx,dy; // Difference between average and current position double len; // Length of support vector double dist; mx = my = 0; sx = sy = 0; for (i = 0; i < cdf->poscount; i++) { mx += (double)cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].x / cdf->poscount; my += (double)cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].y / cdf->poscount; if (i != 0) { sx += cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].x - cdf->pos_hist[((cdf->first_pos + i - 1) % cdf->hist_size)].x; sy += cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].y - cdf->pos_hist[((cdf->first_pos + i - 1) % cdf->hist_size)].y; } } if (cdf->poscount > 1) { // Normalize the support vector len = sqrt(sx * sx + sy * sy); sx /= len; sy /= len; // Calculate the new direction *dirout = (int)rint(atan(sx / sy) / M_PI * 180 + 180); } else { // If we only have one position, we can't use differences of positions, but we have to use the reported // direction of that position sx = sin((double)cdf->dir_hist[cdf->first_pos] / 180 * M_PI); sy = cos((double)cdf->dir_hist[cdf->first_pos] / 180 * M_PI); *dirout = cdf->dir_hist[cdf->first_pos]; } dx = pin->x - mx; dy = pin->y - my; dist = dx * sx + dy * sy; if (cdf->extrapolating && (dist < cdf->last_dist)) { dist = cdf->last_dist; } cdf->last_dist = dist; cdf->extrapolating = 1; pout->x = (int)rint(mx + sx * dist); pout->y = (int)rint(my + sy * dist); pout->pro = pin->pro; } else { // We should extrapolate, but don't have an old position available *pout = *pin; *dirout = dirin; } if (cdf->available) { int dx,dy; dx = pout->x - cdf->last_out.x; dy = pout->y - cdf->last_out.y; if ((dx*dx + dy*dy) < CDF_MINDIST) { *pout = cdf->last_out; *dirout = cdf->last_dir; } } cdf->last_out = *pout; cdf->last_dir = *dirout; cdf->available = 1; } #endif int tracking_get_angle(struct tracking *tr) { return tr->curr_angle; } struct coord * tracking_get_pos(struct tracking *tr) { return &tr->curr_out; } int tracking_get_street_direction(struct tracking *tr) { return tr->street_direction; } int tracking_get_segment_pos(struct tracking *tr) { return tr->pos; } struct street_data * tracking_get_street_data(struct tracking *tr) { if (tr->curr_line) return tr->curr_line->street; return NULL; } int tracking_get_attr(struct tracking *_this, enum attr_type type, struct attr *attr, struct attr_iter *attr_iter) { struct item *item; struct map_rect *mr; struct tracking_line *tl; int result=0; dbg(lvl_debug,"enter %s\n",attr_to_name(type)); if (_this->attr) { attr_free(_this->attr); _this->attr=NULL; } attr->type=type; switch (type) { case attr_position_valid: attr->u.num=_this->valid; return 1; case attr_position_direction: attr->u.numd=&_this->direction; return 1; case attr_position_direction_matched: attr->u.numd=&_this->direction_matched; return 1; case attr_position_speed: attr->u.numd=&_this->speed; return 1; case attr_directed: attr->u.num=_this->street_direction; return 1; case attr_position_coord_geo: if (!_this->coord_geo_valid) { struct coord c; c.x=_this->curr_out.x; c.y=_this->curr_out.y; transform_to_geo(_this->pro, &c, &_this->coord_geo); _this->coord_geo_valid=1; } attr->u.coord_geo=&_this->coord_geo; return 1; case attr_current_item: if (! _this->curr_line || ! _this->curr_line->street) return 0; attr->u.item=&_this->curr_line->street->item; return 1; case attr_street_count: attr->u.num=0; tl=_this->lines; while (tl) { attr->u.num++; tl=tl->next; } return 1; default: if (! _this->curr_line || ! _this->curr_line->street) return 0; item=&_this->curr_line->street->item; mr=map_rect_new(item->map,NULL); item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); if (item_attr_get(item, type, attr)) { _this->attr=attr_dup(attr); *attr=*_this->attr; result=1; } map_rect_destroy(mr); return result; } } struct item * tracking_get_current_item(struct tracking *_this) { if (! _this->curr_line || ! _this->curr_line->street) return NULL; return &_this->curr_line->street->item; } int * tracking_get_current_flags(struct tracking *_this) { if (! _this->curr_line || ! _this->curr_line->street) return NULL; return &_this->curr_line->street->flags; } static void tracking_get_angles(struct tracking_line *tl) { int i; struct street_data *sd=tl->street; for (i = 0 ; i < sd->count-1 ; i++) tl->angle[i]=transform_get_angle_delta(&sd->c[i], &sd->c[i+1], 0); } static int street_data_within_selection(struct street_data *sd, struct map_selection *sel) { struct coord_rect r; struct map_selection *curr; int i; if (!sel) return 1; r.lu=sd->c[0]; r.rl=sd->c[0]; for (i = 1 ; i < sd->count ; i++) { if (r.lu.x > sd->c[i].x) r.lu.x=sd->c[i].x; if (r.rl.x < sd->c[i].x) r.rl.x=sd->c[i].x; if (r.rl.y > sd->c[i].y) r.rl.y=sd->c[i].y; if (r.lu.y < sd->c[i].y) r.lu.y=sd->c[i].y; } curr=sel; while (curr) { struct coord_rect *sr=&curr->u.c_rect; if (r.lu.x <= sr->rl.x && r.rl.x >= sr->lu.x && r.lu.y >= sr->rl.y && r.rl.y <= sr->lu.y) return 1; curr=curr->next; } return 0; } static void tracking_doupdate_lines(struct tracking *tr, struct coord *pc, enum projection pro) { int max_dist=1000; struct map_selection *sel; struct mapset_handle *h; struct map *m; struct map_rect *mr; struct item *item; struct street_data *street; struct tracking_line *tl; struct coord_geo g; struct coord cc; dbg(lvl_debug,"enter\n"); h=mapset_open(tr->ms); while ((m=mapset_next(h,2))) { cc.x = pc->x; cc.y = pc->y; if (map_projection(m) != pro) { transform_to_geo(pro, &cc, &g); transform_from_geo(map_projection(m), &g, &cc); } sel = route_rect(18, &cc, &cc, 0, max_dist); mr=map_rect_new(m, sel); if (!mr) continue; while ((item=map_rect_get_item(mr))) { if (item_get_default_flags(item->type)) { street=street_get_data(item); if (street_data_within_selection(street, sel)) { tl=g_malloc(sizeof(struct tracking_line)+(street->count-1)*sizeof(int)); tl->street=street; tracking_get_angles(tl); tl->next=tr->lines; tr->lines=tl; } else street_data_free(street); } } map_selection_destroy(sel); map_rect_destroy(mr); } mapset_close(h); dbg(lvl_debug, "exit\n"); } void tracking_flush(struct tracking *tr) { struct tracking_line *tl=tr->lines,*next; dbg(lvl_debug,"enter(tr=%p)\n", tr); while (tl) { next=tl->next; street_data_free(tl->street); g_free(tl); tl=next; } tr->lines=NULL; tr->curr_line = NULL; } static int tracking_angle_diff(int a1, int a2, int full) { int ret=(a1-a2)%full; if (ret > full/2) ret-=full; if (ret < -full/2) ret+=full; return ret; } static int tracking_angle_abs_diff(int a1, int a2, int full) { int ret=tracking_angle_diff(a1, a2, full); if (ret < 0) ret=-ret; return ret; } static int tracking_angle_delta(struct tracking *tr, int vehicle_angle, int street_angle, int flags) { int full=180,ret=360,fwd=0,rev=0; struct vehicleprofile *profile=tr->vehicleprofile; if (profile) { fwd=((flags & profile->flags_forward_mask) == profile->flags); rev=((flags & profile->flags_reverse_mask) == profile->flags); } if (fwd || rev) { if (!fwd || !rev) { full=360; if (rev) street_angle=(street_angle+180)%360; } ret=tracking_angle_abs_diff(vehicle_angle, street_angle, full); } return ret*ret; } static int tracking_is_connected(struct tracking *tr, struct coord *c1, struct coord *c2) { if (c1[0].x == c2[0].x && c1[0].y == c2[0].y) return 0; if (c1[0].x == c2[1].x && c1[0].y == c2[1].y) return 0; if (c1[1].x == c2[0].x && c1[1].y == c2[0].y) return 0; if (c1[1].x == c2[1].x && c1[1].y == c2[1].y) return 0; return tr->connected_pref; } static int tracking_is_no_stop(struct tracking *tr, struct coord *c1, struct coord *c2) { if (c1->x == c2->x && c1->y == c2->y) return tr->nostop_pref; return 0; } static int tracking_is_on_route(struct tracking *tr, struct route *rt, struct item *item) { #ifdef USE_ROUTING if (! rt) return 0; if (route_contains(rt, item)) return 0; return tr->route_pref; #else return 0; #endif } static int tracking_value(struct tracking *tr, struct tracking_line *t, int offset, struct coord *lpnt, int min, int flags) { int value=0; struct street_data *sd=t->street; dbg(lvl_info, "%d: (0x%x,0x%x)-(0x%x,0x%x)\n", offset, sd->c[offset].x, sd->c[offset].y, sd->c[offset+1].x, sd->c[offset+1].y); if (flags & 1) { struct coord c1, c2, cp; c1.x = sd->c[offset].x; c1.y = sd->c[offset].y; c2.x = sd->c[offset+1].x; c2.y = sd->c[offset+1].y; cp.x = tr->curr_in.x; cp.y = tr->curr_in.y; value+=transform_distance_line_sq(&c1, &c2, &cp, lpnt); } if (value >= min) return value; if (flags & 2) value += tracking_angle_delta(tr, tr->curr_angle, t->angle[offset], sd->flags)*tr->angle_pref>>4; if (value >= min) return value; if ((flags & 4) && tr->connected_pref) value += tracking_is_connected(tr, tr->last, &sd->c[offset]); if ((flags & 8) && tr->nostop_pref) value += tracking_is_no_stop(tr, lpnt, &tr->last_out); if (value >= min) return value; if ((flags & 16) && tr->route_pref) value += tracking_is_on_route(tr, tr->rt, &sd->item); if ((flags & 32) && tr->overspeed_percent_pref && tr->overspeed_pref ) { struct roadprofile *roadprofile=g_hash_table_lookup(tr->vehicleprofile->roadprofile_hash, (void *)t->street->item.type); if (roadprofile && tr->speed > roadprofile->speed * tr->overspeed_percent_pref/ 100) value += tr->overspeed_pref; } if ((flags & 64) && !!(sd->flags & AF_UNDERGROUND) != tr->no_gps) value+=200; return value; } /** * @brief Processes a position update. * * @param tr The {@code struct tracking} which will receive the position update * @param v The vehicle whose position has changed * @param vehicleprofile The vehicle profile to use * @param pro The projection to use for transformations */ void tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *vehicleprofile, enum projection pro) { struct tracking_line *t; int i,value,min,time; struct coord lpnt; struct coord cin; struct attr valid,speed_attr,direction_attr,coord_geo,lag,time_attr,static_speed,static_distance; double speed, direction; if (v) tr->vehicle=v; if (vehicleprofile) tr->vehicleprofile=vehicleprofile; if (! tr->vehicle) return; if (!vehicle_get_attr(tr->vehicle, attr_position_valid, &valid, NULL)) valid.u.num=attr_position_valid_valid; if (valid.u.num == attr_position_valid_invalid) { tr->valid=valid.u.num; return; } if (!vehicle_get_attr(tr->vehicle, attr_position_speed, &speed_attr, NULL) || !vehicle_get_attr(tr->vehicle, attr_position_direction, &direction_attr, NULL) || !vehicle_get_attr(tr->vehicle, attr_position_coord_geo, &coord_geo, NULL) || !vehicle_get_attr(tr->vehicle, attr_position_time_iso8601, &time_attr, NULL)) { dbg(lvl_error,"failed to get position data %d %d %d %d\n", vehicle_get_attr(tr->vehicle, attr_position_speed, &speed_attr, NULL), vehicle_get_attr(tr->vehicle, attr_position_direction, &direction_attr, NULL), vehicle_get_attr(tr->vehicle, attr_position_coord_geo, &coord_geo, NULL), vehicle_get_attr(tr->vehicle, attr_position_time_iso8601, &time_attr, NULL)); return; } if (tr->tunnel_extrapolation) { struct attr fix_type; if (!vehicle_get_attr(tr->vehicle, attr_position_fix_type, &fix_type, NULL)) fix_type.u.num=2; if (fix_type.u.num) { tr->no_gps=0; tr->tunnel=0; } else tr->no_gps=1; } if (!vehicleprofile_get_attr(vehicleprofile,attr_static_speed,&static_speed,NULL) || !vehicleprofile_get_attr(vehicleprofile,attr_static_distance,&static_distance,NULL)) { static_speed.u.num=3; static_distance.u.num=10; dbg(lvl_debug,"Using defaults for static position detection\n"); } dbg(lvl_info,"Static speed: %ld, static distance: %ld\n",static_speed.u.num, static_distance.u.num); time=iso8601_to_secs(time_attr.u.str); speed=*speed_attr.u.numd; direction=*direction_attr.u.numd; tr->valid=attr_position_valid_valid; transform_from_geo(pro, coord_geo.u.coord_geo, &tr->curr_in); if ((speed < static_speed.u.num && transform_distance(pro, &tr->last_in, &tr->curr_in) < static_distance.u.num )) { dbg(lvl_debug,"static speed %f coord 0x%x,0x%x vs 0x%x,0x%x\n",speed,tr->last_in.x,tr->last_in.y, tr->curr_in.x, tr->curr_in.y); tr->valid=attr_position_valid_static; tr->speed=0; return; } if (tr->tunnel) { tr->curr_in=tr->curr_out; dbg(lvl_debug,"tunnel extrapolation speed %f dir %f\n",tr->speed,tr->direction); dbg(lvl_debug,"old 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); speed=tr->speed; direction=tr->curr_line->angle[tr->pos]; transform_project(pro, &tr->curr_in, tr->speed*tr->tunnel_extrapolation/36, tr->direction, &tr->curr_in); dbg(lvl_debug,"new 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); } else if (vehicle_get_attr(tr->vehicle, attr_lag, &lag, NULL) && lag.u.num > 0) { double espeed; int edirection; if (time-tr->time == 1) { dbg(lvl_debug,"extrapolating speed from %f and %f (%f)\n",tr->speed, speed, speed-tr->speed); espeed=speed+(speed-tr->speed)*lag.u.num/10; dbg(lvl_debug,"extrapolating angle from %f and %f (%d)\n",tr->direction, direction, tracking_angle_diff(direction,tr->direction,360)); edirection=direction+tracking_angle_diff(direction,tr->direction,360)*lag.u.num/10; } else { dbg(lvl_debug,"no speed and direction extrapolation\n"); espeed=speed; edirection=direction; } dbg(lvl_debug,"lag %ld speed %f direction %d\n",lag.u.num,espeed,edirection); dbg(lvl_debug,"old 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); transform_project(pro, &tr->curr_in, espeed*lag.u.num/36, edirection, &tr->curr_in); dbg(lvl_debug,"new 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); } tr->time=time; tr->pro=pro; #if 0 tracking_process_cdf(&tr->cdf, pc, &pcf, angle, &anglef, speed, fixtime); #endif tr->curr_angle=tr->direction=direction; tr->speed=speed; tr->last_in=tr->curr_in; tr->last_out=tr->curr_out; tr->last[0]=tr->curr[0]; tr->last[1]=tr->curr[1]; if (!tr->lines || transform_distance(pro, &tr->last_updated, &tr->curr_in) > 500) { dbg(lvl_debug, "update\n"); tracking_flush(tr); tracking_doupdate_lines(tr, &tr->curr_in, pro); tr->last_updated=tr->curr_in; dbg(lvl_debug,"update end\n"); } tr->street_direction=0; t=tr->lines; tr->curr_line=NULL; min=INT_MAX/2; while (t) { struct street_data *sd=t->street; for (i = 0; i < sd->count-1 ; i++) { value=tracking_value(tr,t,i,&lpnt,min,-1); if (value < min) { struct coord lpnt_tmp; int angle_delta=tracking_angle_abs_diff(tr->curr_angle, t->angle[i], 360); tr->curr_line=t; tr->pos=i; tr->curr[0]=sd->c[i]; tr->curr[1]=sd->c[i+1]; tr->direction_matched=t->angle[i]; dbg(lvl_debug,"lpnt.x=0x%x,lpnt.y=0x%x pos=%d %d+%d+%d+%d=%d\n", lpnt.x, lpnt.y, i, transform_distance_line_sq(&sd->c[i], &sd->c[i+1], &cin, &lpnt_tmp), tracking_angle_delta(tr, tr->curr_angle, t->angle[i], 0)*tr->angle_pref, tracking_is_connected(tr, tr->last, &sd->c[i]) ? tr->connected_pref : 0, lpnt.x == tr->last_out.x && lpnt.y == tr->last_out.y ? tr->nostop_pref : 0, value ); tr->curr_out.x=lpnt.x; tr->curr_out.y=lpnt.y; tr->coord_geo_valid=0; if (angle_delta < 70) tr->street_direction=1; else if (angle_delta > 110) tr->street_direction=-1; else tr->street_direction=0; min=value; } } t=t->next; } dbg(lvl_debug,"tr->curr_line=%p min=%d\n", tr->curr_line, min); if (!tr->curr_line || min > tr->offroad_limit_pref) { tr->curr_out=tr->curr_in; tr->coord_geo_valid=0; tr->street_direction=0; } if (tr->curr_line && (tr->curr_line->street->flags & AF_UNDERGROUND)) { if (tr->no_gps) tr->tunnel=1; } else if (tr->tunnel) { tr->speed=0; } dbg(lvl_debug,"found 0x%x,0x%x\n", tr->curr_out.x, tr->curr_out.y); callback_list_call_attr_0(tr->callback_list, attr_position_coord_geo); } static int tracking_set_attr_do(struct tracking *tr, struct attr *attr, int initial) { switch (attr->type) { case attr_angle_pref: tr->angle_pref=attr->u.num; return 1; case attr_connected_pref: tr->connected_pref=attr->u.num; return 1; case attr_nostop_pref: tr->nostop_pref=attr->u.num; return 1; case attr_offroad_limit_pref: tr->offroad_limit_pref=attr->u.num; return 1; case attr_route_pref: tr->route_pref=attr->u.num; return 1; case attr_overspeed_pref: tr->overspeed_pref=attr->u.num; return 1; case attr_overspeed_percent_pref: tr->overspeed_percent_pref=attr->u.num; return 1; case attr_tunnel_extrapolation: tr->tunnel_extrapolation=attr->u.num; return 1; default: return 0; } } int tracking_set_attr(struct tracking *tr, struct attr *attr) { return tracking_set_attr_do(tr, attr, 0); } int tracking_add_attr(struct tracking *this_, struct attr *attr) { switch (attr->type) { case attr_callback: callback_list_add(this_->callback_list, attr->u.callback); return 1; default: return 0; } } int tracking_remove_attr(struct tracking *this_, struct attr *attr) { switch (attr->type) { case attr_callback: callback_list_remove(this_->callback_list, attr->u.callback); return 1; default: return 0; } } struct object_func tracking_func = { attr_trackingo, (object_func_new)tracking_new, (object_func_get_attr)tracking_get_attr, (object_func_iter_new)NULL, (object_func_iter_destroy)NULL, (object_func_set_attr)tracking_set_attr, (object_func_add_attr)tracking_add_attr, (object_func_remove_attr)tracking_remove_attr, (object_func_init)tracking_init, (object_func_destroy)tracking_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; struct tracking * tracking_new(struct attr *parent, struct attr **attrs) { struct tracking *this=g_new0(struct tracking, 1); struct attr hist_size; this->func=&tracking_func; navit_object_ref((struct navit_object *)this); this->angle_pref=10; this->connected_pref=10; this->nostop_pref=10; this->offroad_limit_pref=5000; this->route_pref=300; this->callback_list=callback_list_new(); if (! attr_generic_get_attr(attrs, NULL, attr_cdf_histsize, &hist_size, NULL)) { hist_size.u.num = 0; } if (attrs) { for (;*attrs; attrs++) tracking_set_attr_do(this, *attrs, 1); } tracking_init_cdf(&this->cdf, hist_size.u.num); return this; } void tracking_set_mapset(struct tracking *this, struct mapset *ms) { this->ms=ms; } void tracking_set_route(struct tracking *this, struct route *rt) { this->rt=rt; } void tracking_destroy(struct tracking *tr) { if (tr->attr) attr_free(tr->attr); tracking_flush(tr); callback_list_destroy(tr->callback_list); g_free(tr); } struct map * tracking_get_map(struct tracking *this_) { struct attr *attrs[5]; struct attr type,navigation,data,description; type.type=attr_type; type.u.str="tracking"; navigation.type=attr_trackingo; navigation.u.tracking=this_; data.type=attr_data; data.u.str=""; description.type=attr_description; description.u.str="Tracking"; attrs[0]=&type; attrs[1]=&navigation; attrs[2]=&data; attrs[3]=&description; attrs[4]=NULL; if (! this_->map) this_->map=map_new(NULL, attrs); return this_->map; } struct map_priv { struct tracking *tracking; }; struct map_rect_priv { struct tracking *tracking; struct item item; struct tracking_line *curr,*next; int coord; enum attr_type attr_next; int ccount; int debug_idx; char *str; }; static void tracking_map_item_coord_rewind(void *priv_data) { struct map_rect_priv *this=priv_data; this->ccount=0; } static int tracking_map_item_coord_get(void *priv_data, struct coord *c, int count) { struct map_rect_priv *this=priv_data; enum projection pro; int ret=0; dbg(lvl_debug,"enter\n"); while (this->ccount < 2 && count > 0) { pro = map_projection(this->curr->street->item.map); if (projection_mg != pro) { transform_from_to(&this->curr->street->c[this->ccount+this->coord], pro, c ,projection_mg); } else *c=this->curr->street->c[this->ccount+this->coord]; dbg(lvl_debug,"coord %d 0x%x,0x%x\n",this->ccount,c->x,c->y); this->ccount++; ret++; c++; count--; } return ret; } static void tracking_map_item_attr_rewind(void *priv_data) { struct map_rect_priv *this_=priv_data; this_->debug_idx=0; this_->attr_next=attr_debug; } static int tracking_map_item_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *this_=priv_data; struct coord lpnt,*c; struct tracking *tr=this_->tracking; int value; attr->type=attr_type; if (this_->str) { g_free(this_->str); this_->str=NULL; } switch(attr_type) { case attr_debug: switch(this_->debug_idx) { case 0: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("overall: %d (limit %d)",tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, -1), tr->offroad_limit_pref); return 1; case 1: this_->debug_idx++; c=&this_->curr->street->c[this_->coord]; value=tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 1); this_->str=attr->u.str=g_strdup_printf("distance: (0x%x,0x%x) from (0x%x,0x%x)-(0x%x,0x%x) at (0x%x,0x%x) %d", tr->curr_in.x, tr->curr_in.y, c[0].x, c[0].y, c[1].x, c[1].y, lpnt.x, lpnt.y, value); return 1; case 2: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("angle: %d to %d (flags %d) %d", tr->curr_angle, this_->curr->angle[this_->coord], this_->curr->street->flags & 3, tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 2)); return 1; case 3: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("connected: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 4)); return 1; case 4: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("no_stop: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 8)); return 1; case 5: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("route: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 16)); return 1; case 6: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("overspeed: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 32)); return 1; case 7: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("tunnel: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 64)); return 1; case 8: this_->debug_idx++; this_->str=attr->u.str=g_strdup_printf("line %p", this_->curr); return 1; default: this_->attr_next=attr_none; return 0; } case attr_any: while (this_->attr_next != attr_none) { if (tracking_map_item_attr_get(priv_data, this_->attr_next, attr)) return 1; } return 0; default: attr->type=attr_none; return 0; } } static struct item_methods tracking_map_item_methods = { tracking_map_item_coord_rewind, tracking_map_item_coord_get, tracking_map_item_attr_rewind, tracking_map_item_attr_get, }; static void tracking_map_destroy(struct map_priv *priv) { g_free(priv); } static void tracking_map_rect_init(struct map_rect_priv *priv) { priv->next=priv->tracking->lines; priv->curr=NULL; priv->coord=0; priv->item.id_lo=0; priv->item.id_hi=0; } static struct map_rect_priv * tracking_map_rect_new(struct map_priv *priv, struct map_selection *sel) { struct tracking *tracking=priv->tracking; struct map_rect_priv *ret=g_new0(struct map_rect_priv, 1); ret->tracking=tracking; tracking_map_rect_init(ret); ret->item.meth=&tracking_map_item_methods; ret->item.priv_data=ret; ret->item.type=type_tracking_100; return ret; } static void tracking_map_rect_destroy(struct map_rect_priv *priv) { g_free(priv); } static struct item * tracking_map_get_item(struct map_rect_priv *priv) { struct item *ret=&priv->item; int value; struct coord lpnt; if (!priv->next) return NULL; if (! priv->curr || priv->coord + 2 >= priv->curr->street->count) { priv->curr=priv->next; priv->next=priv->curr->next; priv->coord=0; priv->item.id_lo=0; priv->item.id_hi++; } else { priv->coord++; priv->item.id_lo++; } value=tracking_value(priv->tracking, priv->curr, priv->coord, &lpnt, INT_MAX/2, -1); if (value < 64) priv->item.type=type_tracking_100; else if (value < 128) priv->item.type=type_tracking_90; else if (value < 256) priv->item.type=type_tracking_80; else if (value < 512) priv->item.type=type_tracking_70; else if (value < 1024) priv->item.type=type_tracking_60; else if (value < 2048) priv->item.type=type_tracking_50; else if (value < 4096) priv->item.type=type_tracking_40; else if (value < 8192) priv->item.type=type_tracking_30; else if (value < 16384) priv->item.type=type_tracking_20; else if (value < 32768) priv->item.type=type_tracking_10; else priv->item.type=type_tracking_0; dbg(lvl_debug,"item %d %d points\n", priv->coord, priv->curr->street->count); tracking_map_item_coord_rewind(priv); tracking_map_item_attr_rewind(priv); return ret; } static struct item * tracking_map_get_item_byid(struct map_rect_priv *priv, int id_hi, int id_lo) { struct item *ret; tracking_map_rect_init(priv); while ((ret=tracking_map_get_item(priv))) { if (ret->id_hi == id_hi && ret->id_lo == id_lo) return ret; } return NULL; } static struct map_methods tracking_map_meth = { projection_mg, "utf-8", tracking_map_destroy, tracking_map_rect_new, tracking_map_rect_destroy, tracking_map_get_item, tracking_map_get_item_byid, NULL, NULL, NULL, }; static struct map_priv * tracking_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct map_priv *ret; struct attr *tracking_attr; tracking_attr=attr_search(attrs, NULL, attr_trackingo); if (! tracking_attr) return NULL; ret=g_new0(struct map_priv, 1); *meth=tracking_map_meth; ret->tracking=tracking_attr->u.tracking; return ret; } void tracking_init(void) { plugin_register_map_type("tracking", tracking_map_new); } navit-0.5.0+dfsg.1/navit/track.h000066400000000000000000000046341264204753600163310ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_TRACK_H #define NAVIT_TRACK_H #include #ifdef __cplusplus extern "C" { #endif /* prototypes */ enum attr_type; enum projection; struct attr; struct attr_iter; struct coord; struct item; struct map; struct mapset; struct route; struct street_data; struct tracking; struct vehicle; struct vehicleprofile; int tracking_get_angle(struct tracking *tr); struct coord *tracking_get_pos(struct tracking *tr); int tracking_get_street_direction(struct tracking *tr); int tracking_get_segment_pos(struct tracking *tr); struct street_data *tracking_get_street_data(struct tracking *tr); int tracking_get_attr(struct tracking *_this, enum attr_type type, struct attr *attr, struct attr_iter *attr_iter); struct item *tracking_get_current_item(struct tracking *_this); int *tracking_get_current_flags(struct tracking *_this); void tracking_flush(struct tracking *tr); void tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *vehicleprofile, enum projection pro); int tracking_set_attr(struct tracking *tr, struct attr *attr); struct tracking *tracking_new(struct attr *parent, struct attr **attrs); void tracking_set_mapset(struct tracking *this_, struct mapset *ms); void tracking_set_route(struct tracking *this_, struct route *rt); void tracking_destroy(struct tracking *tr); struct map *tracking_get_map(struct tracking *this_); int tracking_add_attr(struct tracking *this_, struct attr *attr); int tracking_remove_attr(struct tracking *this_, struct attr *attr); struct tracking *tracking_ref(struct tracking *this_); void tracking_unref(struct tracking *this_); void tracking_init(void); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/transform.c000066400000000000000000001142401264204753600172260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #define _USE_MATH_DEFINES 1 #include #include #include #include #include #include #include #include "config.h" #include "coord.h" #include "debug.h" #include "item.h" #include "map.h" #include "transform.h" #include "projection.h" #include "point.h" #define POST_SHIFT 8 /** * @brief The parameters needed to transform a map for display. */ struct transformation { int yaw; /* Rotation angle */ int pitch; int ddd; /* 3d mode/isometric view active? (0/1) */ int m00,m01,m02; /* 3d transformation matrix */ int m10,m11,m12; int m20,m21,m22; int xscale,yscale,wscale; int xscale3d,yscale3d,wscale3d; #ifdef ENABLE_ROLL int roll; int hog; #endif navit_float im00,im01,im02; /* inverse 3d transformation matrix */ navit_float im10,im11,im12; navit_float im20,im21,im22; struct map_selection *map_sel; struct map_selection *screen_sel; struct point screen_center; int screen_dist; int offx,offy,offz; int znear,zfar; struct coord map_center; /* Center of source rectangle */ enum projection pro; navit_float scale; /* Scale factor */ int scale_shift; int order; int order_base; }; #ifdef ENABLE_ROLL #define HOG(t) ((t).hog) #else #define HOG(t) 0 #endif static void transform_set_screen_dist(struct transformation *t, int dist) { t->screen_dist=dist; t->xscale3d=dist; t->yscale3d=dist; t->wscale3d=dist << POST_SHIFT; } static void transform_setup_matrix(struct transformation *t) { navit_float det; navit_float fac; navit_float yawc=navit_cos(-M_PI*t->yaw/180); navit_float yaws=navit_sin(-M_PI*t->yaw/180); navit_float pitchc=navit_cos(-M_PI*t->pitch/180); navit_float pitchs=navit_sin(-M_PI*t->pitch/180); #ifdef ENABLE_ROLL navit_float rollc=navit_cos(M_PI*t->roll/180); navit_float rolls=navit_sin(M_PI*t->roll/180); #else navit_float rollc=1; navit_float rolls=0; #endif int scale=t->scale; int order_dir=-1; dbg(lvl_debug,"yaw=%d pitch=%d center=0x%x,0x%x\n", t->yaw, t->pitch, t->map_center.x, t->map_center.y); t->znear=1 << POST_SHIFT; t->zfar=300*t->znear; t->scale_shift=0; t->order=t->order_base; if (t->scale >= 1) { scale=t->scale; } else { scale=1.0/t->scale; order_dir=1; } while (scale > 1) { if (order_dir < 0) t->scale_shift++; t->order+=order_dir; scale >>= 1; } fac=(1 << POST_SHIFT) * (1 << t->scale_shift) / t->scale; dbg(lvl_debug,"scale_shift=%d order=%d scale=%f fac=%f\n", t->scale_shift, t->order,t->scale,fac); t->m00=rollc*yawc*fac; t->m01=rollc*yaws*fac; t->m02=-rolls*fac; t->m10=(pitchs*rolls*yawc-pitchc*yaws)*(-fac); t->m11=(pitchs*rolls*yaws+pitchc*yawc)*(-fac); t->m12=pitchs*rollc*(-fac); t->m20=(pitchc*rolls*yawc+pitchs*yaws)*fac; t->m21=(pitchc*rolls*yaws-pitchs*yawc)*fac; t->m22=pitchc*rollc*fac; t->offx=t->screen_center.x; t->offy=t->screen_center.y; if (t->pitch) { t->ddd=1; t->offz=t->screen_dist; dbg(lvl_debug,"near %d far %d\n",t->znear,t->zfar); t->xscale=t->xscale3d; t->yscale=t->yscale3d; t->wscale=t->wscale3d; } else { t->ddd=0; t->offz=0; t->xscale=1; t->yscale=1; t->wscale=1; } det=(navit_float)t->m00*(navit_float)t->m11*(navit_float)t->m22+ (navit_float)t->m01*(navit_float)t->m12*(navit_float)t->m20+ (navit_float)t->m02*(navit_float)t->m10*(navit_float)t->m21- (navit_float)t->m02*(navit_float)t->m11*(navit_float)t->m20- (navit_float)t->m01*(navit_float)t->m10*(navit_float)t->m22- (navit_float)t->m00*(navit_float)t->m12*(navit_float)t->m21; t->im00=(t->m11*t->m22-t->m12*t->m21)/det; t->im01=(t->m02*t->m21-t->m01*t->m22)/det; t->im02=(t->m01*t->m12-t->m02*t->m11)/det; t->im10=(t->m12*t->m20-t->m10*t->m22)/det; t->im11=(t->m00*t->m22-t->m02*t->m20)/det; t->im12=(t->m02*t->m10-t->m00*t->m12)/det; t->im20=(t->m10*t->m21-t->m11*t->m20)/det; t->im21=(t->m01*t->m20-t->m00*t->m21)/det; t->im22=(t->m00*t->m11-t->m01*t->m10)/det; } struct transformation * transform_new(struct pcoord *center, int scale, int yaw) { struct transformation *this_; this_=g_new0(struct transformation, 1); transform_set_screen_dist(this_, 100); this_->order_base=14; this_->pro=center->pro; this_->map_center.x=center->x; this_->map_center.y=center->y; this_->scale=scale/16.0; transform_set_yaw(this_, yaw); return this_; } int transform_get_hog(struct transformation *this_) { return HOG(*this_); } void transform_set_hog(struct transformation *this_, int hog) { #ifdef ENABLE_ROLL this_->hog=hog; #else dbg(lvl_error,"not supported\n"); #endif } int transform_get_attr(struct transformation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { switch (type) { #ifdef ENABLE_ROLL case attr_hog: attr->u.num=this_->hog; break; #endif default: return 0; } attr->type=type; return 1; } int transform_set_attr(struct transformation *this_, struct attr *attr) { switch (attr->type) { #ifdef ENABLE_ROLL case attr_hog: this_->hog=attr->u.num; return 1; #endif default: return 0; } } int transformation_get_order_base(struct transformation *this_) { return this_->order_base; } void transform_set_order_base(struct transformation *this_, int order_base) { this_->order_base=order_base; } struct transformation * transform_dup(struct transformation *t) { struct transformation *ret=g_new0(struct transformation, 1); *ret=*t; ret->map_sel=map_selection_dup(t->map_sel); ret->screen_sel=map_selection_dup(t->screen_sel); return ret; } static const navit_float gar2geo_units = 360.0/(1<<24); static const navit_float geo2gar_units = 1/(360.0/(1<<24)); void transform_to_geo(enum projection pro, struct coord *c, struct coord_geo *g) { int x,y,northern,zone; switch (pro) { case projection_mg: g->lng=c->x/6371000.0/M_PI*180; g->lat=navit_atan(exp(c->y/6371000.0))/M_PI*360-90; break; case projection_garmin: g->lng=c->x*gar2geo_units; g->lat=c->y*gar2geo_units; break; case projection_utm: x=c->x; y=c->y; northern=y >= 0; if (!northern) { y+=10000000; } zone=(x/1000000); x=x%1000000; transform_utm_to_geo(x, y, zone, northern, g); break; default: break; } } void transform_from_geo(enum projection pro, struct coord_geo *g, struct coord *c) { switch (pro) { case projection_mg: c->x=g->lng*6371000.0*M_PI/180; c->y=log(navit_tan(M_PI_4+g->lat*M_PI/360))*6371000.0; break; case projection_garmin: c->x=g->lng*geo2gar_units; c->y=g->lat*geo2gar_units; break; default: break; } } void transform_from_to_count(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to, int count) { struct coord_geo g; int i; for (i = 0 ; i < count ; i++) { transform_to_geo(from, cfrom, &g); transform_from_geo(to, &g, cto); cfrom++; cto++; } } void transform_from_to(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to) { struct coord_geo g; transform_to_geo(from, cfrom, &g); transform_from_geo(to, &g, cto); } /** * @brief Transforms geodetic to Cartesian coordinates. * * This transforms geodetic coordinates (consisting of latitude and longitude) into ECEF Cartesian * coordinates. * * @param geo The WGS84 coordinates to convert * @param a Semi-minor axis of the ellipsoid * @param b Semi-minor axis of the ellipsoid * @param cart Points to a structure that will receive the Cartesian coordinates */ void transform_geo_to_cart(struct coord_geo *geo, navit_float a, navit_float b, struct coord_geo_cart *cart) { navit_float n,ee=1-b*b/(a*a); n = a/sqrtf(1-ee*navit_sin(geo->lat)*navit_sin(geo->lat)); cart->x=n*navit_cos(geo->lat)*navit_cos(geo->lng); cart->y=n*navit_cos(geo->lat)*navit_sin(geo->lng); cart->z=n*(1-ee)*navit_sin(geo->lat); } /** * @brief Transforms Cartesian to geodetic coordinates. * * This transforms ECEF Cartesian coordinates into geodetic coordinates, consisting of latitude and * longitude. * * @param cart The Cartesian coordinates * @param a Semi-minor axis of the ellipsoid * @param b Semi-minor axis of the ellipsoid * @param geo Points to a structure that will receive the geodetic coordinates */ void transform_cart_to_geo(struct coord_geo_cart *cart, navit_float a, navit_float b, struct coord_geo *geo) { navit_float lat,lati,n,ee=1-b*b/(a*a), lng = navit_tan(cart->y/cart->x); lat = navit_tan(cart->z / navit_sqrt((cart->x * cart->x) + (cart->y * cart->y))); do { lati = lat; n = a / navit_sqrt(1-ee*navit_sin(lat)*navit_sin(lat)); lat = navit_atan((cart->z + ee * n * navit_sin(lat)) / navit_sqrt(cart->x * cart->x + cart->y * cart->y)); } while (fabs(lat - lati) >= 0.000000000000001); geo->lng=lng/M_PI*180; geo->lat=lat/M_PI*180; } /** * @brief Converts UTM coords to lat/long. * * Equations from USGS Bulletin 1532. * * @author Chuck Gantz- chuck.gantz@globalstar.com */ void transform_utm_to_geo(const double UTMEasting, const double UTMNorthing, int ZoneNumber, int NorthernHemisphere, struct coord_geo *geo) { //East Longitudes are positive, West longitudes are negative. //North latitudes are positive, South latitudes are negative //Lat and Long are in decimal degrees. double Lat, Long; double k0 = 0.99960000000000004; double a = 6378137; double eccSquared = 0.0066943799999999998; double eccPrimeSquared; double e1 = (1-sqrt(1-eccSquared))/(1+sqrt(1-eccSquared)); double N1, T1, C1, R1, D, M; double LongOrigin; double mu, phi1Rad; double x, y; double rad2deg = 180/M_PI; x = UTMEasting - 500000.0; //remove 500,000 meter offset for longitude y = UTMNorthing; if (!NorthernHemisphere) { y -= 10000000.0;//remove 10,000,000 meter offset used for southern hemisphere } LongOrigin = (ZoneNumber - 1)*6 - 180 + 3; //+3 puts origin in middle of zone eccPrimeSquared = (eccSquared)/(1-eccSquared); M = y / k0; mu = M/(a*(1-eccSquared/4-3*eccSquared*eccSquared/64-5*eccSquared*eccSquared*eccSquared/256)); phi1Rad = mu + (3*e1/2-27*e1*e1*e1/32)*sin(2*mu) + (21*e1*e1/16-55*e1*e1*e1*e1/32)*sin(4*mu) +(151*e1*e1*e1/96)*sin(6*mu); N1 = a/sqrt(1-eccSquared*sin(phi1Rad)*sin(phi1Rad)); T1 = tan(phi1Rad)*tan(phi1Rad); C1 = eccPrimeSquared*cos(phi1Rad)*cos(phi1Rad); R1 = a*(1-eccSquared)/pow(1-eccSquared*sin(phi1Rad)*sin(phi1Rad), 1.5); D = x/(N1*k0); Lat = phi1Rad - (N1*tan(phi1Rad)/R1)*(D*D/2-(5+3*T1+10*C1-4*C1*C1-9*eccPrimeSquared)*D*D*D*D/24 +(61+90*T1+298*C1+45*T1*T1-252*eccPrimeSquared-3*C1*C1)*D*D*D*D*D*D/720); Lat = Lat * rad2deg; Long = (D-(1+2*T1+C1)*D*D*D/6+(5-2*C1+28*T1-3*C1*C1+8*eccPrimeSquared+24*T1*T1) *D*D*D*D*D/120)/cos(phi1Rad); Long = LongOrigin + Long * rad2deg; geo->lat=Lat; geo->lng=Long; } static struct coord transform_correct_projection(struct transformation *t, enum projection required_projection, struct coord c) { struct coord result; struct coord_geo g; if (required_projection == t->pro) { result=c; } else { transform_to_geo(required_projection, &c, &g); transform_from_geo(t->pro, &g, &result); } return result; } static struct coord transform_shift_by_center_and_scale(struct transformation *t, struct coord c) { struct coord result; result.x = c.x - t->map_center.x; result.y = c.y - t->map_center.y; result.x >>= t->scale_shift; result.y >>= t->scale_shift; return result; } struct coord_3d { int x; int y; int z; }; static struct coord_3d transform_rotate(struct transformation *t, struct coord c) { struct coord_3d result; result.x=c.x*t->m00+c.y*t->m01+HOG(*t)*t->m02; result.y=c.x*t->m10+c.y*t->m11+HOG(*t)*t->m12; result.z=(c.x*t->m20+c.y*t->m21+HOG(*t)*t->m22); result.z+=t->offz << POST_SHIFT; dbg(lvl_debug, "result: (%d,%d,%d)\n", result.x,result.y,result.z); return result; } static struct coord_3d transform_z_clip(struct coord_3d c, struct coord_3d c_old, int zlimit) { struct coord_3d result; float clip_factor = ((float)zlimit-c.z)/(c_old.z-c.z); dbg(lvl_debug,"in (%d,%d,%d) - (%d,%d,%d)\n", c.x,c.y,c.z, c_old.x,c_old.y,c_old.z); result.x=c.x+(c_old.x-c.x)*clip_factor; result.y=c.y+(c_old.y-c.y)*clip_factor; result.z=zlimit; dbg(lvl_debug,"clip result: (%d,%d,%d)\n", result.x, result.y, result.z); return result; } static struct point transform_project_onto_view_plane(struct transformation *t, struct coord_3d c) { struct point result; #if 0 dbg(lvl_debug,"z=%d\n",c.z); #endif result.x = (long long)c.x*t->xscale/c.z; result.y = (long long)c.y*t->yscale/c.z; return result; } static int transform_points_too_close(struct point screen_point, struct point screen_point_old, int mindist) { if (!mindist){ return 0; } // approximation of Euclidean distance return (abs(screen_point.x - screen_point_old.x) + abs(screen_point.y - screen_point_old.y)) < mindist; } struct z_clip_result{ struct coord_3d clipped_coord; int visible; int process_coord_again; int skip_coord; }; static struct z_clip_result transform_z_clip_if_necessary(struct coord_3d coord, int zlimit, struct z_clip_result clip_result_old) { int visibility_changed; struct z_clip_result clip_result={{0,0}, 0, 0, 0}; clip_result.visible=(coord.z < zlimit ? 0:1); visibility_changed=(clip_result_old.visible != -1)&&(clip_result.visible != clip_result_old.visible); if (visibility_changed) { clip_result.clipped_coord=transform_z_clip(coord, clip_result_old.clipped_coord, zlimit); } else { clip_result.clipped_coord=coord; } if (clip_result.visible && visibility_changed){ // line was clipped, but current point // is visible -> process it again clip_result.process_coord_again=1; }else if (!clip_result.visible && !visibility_changed){ clip_result.skip_coord=1; } return clip_result; } int transform(struct transformation *t, enum projection required_projection, struct coord *input, struct point *result, int count, int mindist, int width, int *width_result) { struct coord projected_coord, shifted_coord; struct coord_3d rotated_coord; struct point screen_point; int zlimit=t->znear; struct z_clip_result clip_result, clip_result_old={{0,0}, -1, 0, 0}; int i,result_idx = 0,result_idx_last=0; dbg(lvl_debug,"count=%d\n", count); for (i=0; i < count; i++) { dbg(lvl_debug, "input coord %d: (%d, %d)\n", i, input[i].x, input[i].y); #if 0 /* doesn't work as wanted */ if (i && input[i].x == input[0].x && input[i].y == input[0].y && result_idx && !width_result) { result[result_idx++]=result[0]; continue; } #endif projected_coord = transform_correct_projection(t, required_projection, input[i]); shifted_coord = transform_shift_by_center_and_scale(t, projected_coord); rotated_coord = transform_rotate(t, shifted_coord); if (t->ddd) { clip_result=transform_z_clip_if_necessary(rotated_coord, zlimit, clip_result_old); clip_result_old=clip_result; if(clip_result.process_coord_again){ i--; } else if (clip_result.skip_coord){ continue; } #if 0 clip_result.clipped_coord.z=2000000; #endif screen_point = transform_project_onto_view_plane(t, clip_result.clipped_coord); } else { screen_point.x = rotated_coord.x>>POST_SHIFT; screen_point.y = rotated_coord.y>>POST_SHIFT; } screen_point.x+=t->offx; screen_point.y+=t->offy; dbg(lvl_debug,"result: (%d, %d)\n", screen_point.x, screen_point.y); if (i != 0 && i != count-1 && (input[i+1].x != input[0].x || input[i+1].y != input[0].y)) { if (transform_points_too_close(screen_point, result[result_idx_last], mindist)){ continue; } } result[result_idx]=screen_point; if (width_result) { if (t->ddd) { dbg(lvl_debug,"width %d * %d / %d\n",width,t->wscale,clip_result.clipped_coord.z); width_result[result_idx]=width*t->wscale/clip_result.clipped_coord.z; } else width_result[result_idx]=width; } result_idx_last=result_idx; result_idx++; } return result_idx; } static void transform_apply_inverse_matrix(struct transformation *t, struct coord_geo_cart *in, struct coord_geo_cart *out) { out->x=in->x*t->im00+in->y*t->im01+in->z*t->im02; out->y=in->x*t->im10+in->y*t->im11+in->z*t->im12; out->z=in->x*t->im20+in->y*t->im21+in->z*t->im22; } static int transform_zplane_intersection(struct coord_geo_cart *p1, struct coord_geo_cart *p2, navit_float z, struct coord_geo_cart *result) { navit_float dividend=z-p1->z; navit_float divisor=p2->z-p1->z; navit_float q; if (!divisor) { if (dividend) return 0; /* no intersection */ else return 3; /* identical planes */ } q=dividend/divisor; result->x=p1->x+q*(p2->x-p1->x); result->y=p1->y+q*(p2->y-p1->y); result->z=z; if (q >= 0 && q <= 1) return 1; /* intersection within [p1,p2] */ return 2; /* intersection without [p1,p2] */ } static void transform_screen_to_3d(struct transformation *t, struct point *p, navit_float z, struct coord_geo_cart *cg) { double xc,yc; double offz=t->offz << POST_SHIFT; xc=p->x - t->offx; yc=p->y - t->offy; cg->x=xc*z/t->xscale; cg->y=yc*z/t->yscale; cg->z=z-offz; } static int transform_reverse_near_far(struct transformation *t, struct point *p, struct coord *c, int near, int far) { double xc,yc; dbg(lvl_debug,"%d,%d\n",p->x,p->y); if (t->ddd) { struct coord_geo_cart nearc,farc,nears,fars,intersection; transform_screen_to_3d(t, p, near, &nearc); transform_screen_to_3d(t, p, far, &farc); transform_apply_inverse_matrix(t, &nearc, &nears); transform_apply_inverse_matrix(t, &farc, &fars); if (transform_zplane_intersection(&nears, &fars, HOG(*t), &intersection) != 1) return 0; xc=intersection.x; yc=intersection.y; } else { double xcn,ycn; xcn=p->x - t->offx; ycn=p->y - t->offy; xc=(xcn*t->im00+ycn*t->im01)*(1 << POST_SHIFT); yc=(xcn*t->im10+ycn*t->im11)*(1 << POST_SHIFT); } c->x=xc*(1 << t->scale_shift)+t->map_center.x; c->y=yc*(1 << t->scale_shift)+t->map_center.y; return 1; } int transform_reverse(struct transformation *t, struct point *p, struct coord *c) { return transform_reverse_near_far(t, p, c, t->znear, t->zfar); } double transform_pixels_to_map_distance(struct transformation *transformation, int pixels) { struct point line_in_map_center[2]; struct coord c[2]; struct point screen_center=transformation->screen_center; // Generally, the scale will not be the same across the map // (for example with Mercator projection), so calculate the // conversion in the screen center for a reasonable average value. line_in_map_center[0].x=screen_center.x-pixels/2; line_in_map_center[1].x=screen_center.x+pixels/2; line_in_map_center[0].y=screen_center.y; line_in_map_center[1].y=screen_center.y; transform_reverse(transformation, &line_in_map_center[0], &c[0]); transform_reverse(transformation, &line_in_map_center[1], &c[1]); return transform_distance(transform_get_projection(transformation), &c[0], &c[1]); } enum projection transform_get_projection(struct transformation *this_) { return this_->pro; } void transform_set_projection(struct transformation *this_, enum projection pro) { this_->pro=pro; } static int min4(int v1,int v2, int v3, int v4) { int res=v1; if (v2 < res) res=v2; if (v3 < res) res=v3; if (v4 < res) res=v4; return res; } static int max4(int v1,int v2, int v3, int v4) { int res=v1; if (v2 > res) res=v2; if (v3 > res) res=v3; if (v4 > res) res=v4; return res; } struct map_selection * transform_get_selection(struct transformation *this_, enum projection pro, int order) { struct map_selection *ret,*curri,*curro; struct coord_geo g; ret=map_selection_dup(this_->map_sel); curri=this_->map_sel; curro=ret; while (curri) { if (this_->pro != pro) { transform_to_geo(this_->pro, &curri->u.c_rect.lu, &g); transform_from_geo(pro, &g, &curro->u.c_rect.lu); dbg(lvl_debug,"%f,%f", g.lat, g.lng); transform_to_geo(this_->pro, &curri->u.c_rect.rl, &g); transform_from_geo(pro, &g, &curro->u.c_rect.rl); dbg(lvl_debug,": - %f,%f\n", g.lat, g.lng); } dbg(lvl_debug,"transform rect for %d is %d,%d - %d,%d\n", pro, curro->u.c_rect.lu.x, curro->u.c_rect.lu.y, curro->u.c_rect.rl.x, curro->u.c_rect.rl.y); curro->order+=order; #if 0 curro->u.c_rect.lu.x-=500; curro->u.c_rect.lu.y+=500; curro->u.c_rect.rl.x+=500; curro->u.c_rect.rl.y-=500; #endif curro->range=item_range_all; curri=curri->next; curro=curro->next; } return ret; } struct coord * transform_center(struct transformation *this_) { return &this_->map_center; } struct coord * transform_get_center(struct transformation *this_) { return &this_->map_center; } void transform_set_center(struct transformation *this_, struct coord *c) { this_->map_center=*c; } void transform_set_yaw(struct transformation *t,int yaw) { t->yaw=yaw; transform_setup_matrix(t); } int transform_get_yaw(struct transformation *this_) { return this_->yaw; } void transform_set_pitch(struct transformation *this_,int pitch) { this_->pitch=pitch; transform_setup_matrix(this_); } int transform_get_pitch(struct transformation *this_) { return this_->pitch; } void transform_set_roll(struct transformation *this_,int roll) { #ifdef ENABLE_ROLL this_->roll=roll; transform_setup_matrix(this_); #else dbg(lvl_error,"not supported\n"); #endif } int transform_get_roll(struct transformation *this_) { #ifdef ENABLE_ROLL return this_->roll; #else return 0; #endif } void transform_set_distance(struct transformation *this_,int distance) { transform_set_screen_dist(this_, distance); transform_setup_matrix(this_); } int transform_get_distance(struct transformation *this_) { return this_->screen_dist; } void transform_set_scales(struct transformation *this_, int xscale, int yscale, int wscale) { this_->xscale3d=xscale; this_->yscale3d=yscale; this_->wscale3d=wscale; } void transform_set_screen_selection(struct transformation *t, struct map_selection *sel) { map_selection_destroy(t->screen_sel); t->screen_sel=map_selection_dup(sel); if (sel) { t->screen_center.x=(sel->u.p_rect.rl.x-sel->u.p_rect.lu.x)/2; t->screen_center.y=(sel->u.p_rect.rl.y-sel->u.p_rect.lu.y)/2; transform_setup_matrix(t); } } void transform_set_screen_center(struct transformation *t, struct point *p) { t->screen_center=*p; } void transform_get_size(struct transformation *t, int *width, int *height) { struct point_rect *r; if (t->screen_sel) { r=&t->screen_sel->u.p_rect; *width=r->rl.x-r->lu.x; *height=r->rl.y-r->lu.y; } } void transform_setup_source_rect(struct transformation *t) { int i; struct coord screen[4]; struct point screen_pnt[4]; struct point_rect *pr; struct map_selection *ms,*msm,*next,**msm_last; ms=t->map_sel; while (ms) { next=ms->next; g_free(ms); ms=next; } t->map_sel=NULL; msm_last=&t->map_sel; ms=t->screen_sel; while (ms) { msm=g_new0(struct map_selection, 1); *msm=*ms; pr=&ms->u.p_rect; screen_pnt[0].x=pr->lu.x; /* left upper */ screen_pnt[0].y=pr->lu.y; screen_pnt[1].x=pr->rl.x; /* right upper */ screen_pnt[1].y=pr->lu.y; screen_pnt[2].x=pr->rl.x; /* right lower */ screen_pnt[2].y=pr->rl.y; screen_pnt[3].x=pr->lu.x; /* left lower */ screen_pnt[3].y=pr->rl.y; if (t->ddd) { struct coord_geo_cart tmp,cg[8]; struct coord c; int valid=0; unsigned char edgenodes[]={ 0,1, 1,2, 2,3, 3,0, 4,5, 5,6, 6,7, 7,4, 0,4, 1,5, 2,6, 3,7}; for (i = 0 ; i < 8 ; i++) { transform_screen_to_3d(t, &screen_pnt[i%4], (i >= 4 ? t->zfar:t->znear), &tmp); transform_apply_inverse_matrix(t, &tmp, &cg[i]); } msm->u.c_rect.lu.x=0; msm->u.c_rect.lu.y=0; msm->u.c_rect.rl.x=0; msm->u.c_rect.rl.y=0; for (i = 0 ; i < 12 ; i++) { if (transform_zplane_intersection(&cg[edgenodes[i*2]], &cg[edgenodes[i*2+1]], HOG(*t), &tmp) == 1) { c.x=tmp.x*(1 << t->scale_shift)+t->map_center.x; c.y=tmp.y*(1 << t->scale_shift)+t->map_center.y; dbg(lvl_debug,"intersection with edge %d at 0x%x,0x%x\n",i,c.x,c.y); if (valid) coord_rect_extend(&msm->u.c_rect, &c); else { msm->u.c_rect.lu=c; msm->u.c_rect.rl=c; valid=1; } dbg(lvl_debug,"rect 0x%x,0x%x - 0x%x,0x%x\n",msm->u.c_rect.lu.x,msm->u.c_rect.lu.y,msm->u.c_rect.rl.x,msm->u.c_rect.rl.y); } } } else { for (i = 0 ; i < 4 ; i++) { transform_reverse(t, &screen_pnt[i], &screen[i]); dbg(lvl_debug,"map(%d) %d,%d=0x%x,0x%x\n", i,screen_pnt[i].x, screen_pnt[i].y, screen[i].x, screen[i].y); } msm->u.c_rect.lu.x=min4(screen[0].x,screen[1].x,screen[2].x,screen[3].x); msm->u.c_rect.rl.x=max4(screen[0].x,screen[1].x,screen[2].x,screen[3].x); msm->u.c_rect.rl.y=min4(screen[0].y,screen[1].y,screen[2].y,screen[3].y); msm->u.c_rect.lu.y=max4(screen[0].y,screen[1].y,screen[2].y,screen[3].y); } dbg(lvl_debug,"%dx%d\n", msm->u.c_rect.rl.x-msm->u.c_rect.lu.x, msm->u.c_rect.lu.y-msm->u.c_rect.rl.y); *msm_last=msm; msm_last=&msm->next; ms=ms->next; } } long transform_get_scale(struct transformation *t) { return (int)(t->scale*16); } void transform_set_scale(struct transformation *t, long scale) { t->scale=scale/16.0; transform_setup_matrix(t); } int transform_get_order(struct transformation *t) { dbg(lvl_debug,"order %d\n", t->order); return t->order; } #define TWOPI (M_PI*2) #define GC2RAD(c) ((c) * TWOPI/(1<<24)) #define minf(a,b) ((a) < (b) ? (a) : (b)) static double transform_distance_garmin(struct coord *c1, struct coord *c2) { #ifdef USE_HALVESINE static const int earth_radius = 6371*1000; //m change accordingly // static const int earth_radius = 3960; //miles //Point 1 cords navit_float lat1 = GC2RAD(c1->y); navit_float long1 = GC2RAD(c1->x); //Point 2 cords navit_float lat2 = GC2RAD(c2->y); navit_float long2 = GC2RAD(c2->x); //Haversine Formula navit_float dlong = long2-long1; navit_float dlat = lat2-lat1; navit_float sinlat = navit_sin(dlat/2); navit_float sinlong = navit_sin(dlong/2); navit_float a=(sinlat*sinlat)+navit_cos(lat1)*navit_cos(lat2)*(sinlong*sinlong); navit_float c=2*navit_asin(minf(1,navit_sqrt(a))); #ifdef AVOID_FLOAT return round(earth_radius*c); #else return earth_radius*c; #endif #else #define GMETER 2.3887499999999999 navit_float dx,dy; dx=c1->x-c2->x; dy=c1->y-c2->y; return navit_sqrt(dx*dx+dy*dy)*GMETER; #undef GMETER #endif } double transform_scale(int y) { struct coord c; struct coord_geo g; c.x=0; c.y=y; transform_to_geo(projection_mg, &c, &g); return 1/navit_cos(g.lat/180*M_PI); } #ifdef AVOID_FLOAT static int tab_sqrt[]={14142,13379,12806,12364,12018,11741,11517,11333,11180,11051,10943,10850,10770,10701,10640,10587,10540,10499,10462,10429,10400,10373,10349,10327,10307,10289,10273,10257,10243,10231,10219,10208}; static int tab_int_step = 0x20000; static int tab_int_scale[]={10000,10002,10008,10019,10033,10052,10076,10103,10135,10171,10212,10257,10306,10359,10417,10479,10546,10617,10693,10773,10858,10947,11041,11140,11243,11352,11465,11582,11705,11833,11965,12103,12246,12394,12547,12706,12870,13039,13214,13395,13581,13773,13971,14174,14384,14600,14822,15050,15285,15526,15774,16028,16289,16557,16832,17114,17404,17700,18005,18316,18636,18964,19299,19643,19995,20355,20724,21102,21489,21885,22290,22705,23129,23563,24007,24461,24926,25401,25886,26383,26891}; int transform_int_scale(int y) { int i,size = sizeof(tab_int_scale)/sizeof(int); if (y < 0) y=-y; i=y/tab_int_step; if (i < size-1) return tab_int_scale[i]+((tab_int_scale[i+1]-tab_int_scale[i])*(y-i*tab_int_step))/tab_int_step; return tab_int_scale[size-1]; } #endif double transform_distance(enum projection pro, struct coord *c1, struct coord *c2) { if (pro == projection_mg) { #ifndef AVOID_FLOAT double dx,dy,scale=transform_scale((c1->y+c2->y)/2); dx=c1->x-c2->x; dy=c1->y-c2->y; return sqrt(dx*dx+dy*dy)/scale; #else int dx,dy,f,scale=transform_int_scale((c1->y+c2->y)/2); dx=c1->x-c2->x; dy=c1->y-c2->y; if (dx < 0) dx=-dx; if (dy < 0) dy=-dy; while (dx > 20000 || dy > 20000) { dx/=10; dy/=10; scale/=10; } if (! dy) return dx*10000/scale; if (! dx) return dy*10000/scale; if (dx > dy) { f=dx*8/dy-8; if (f >= 32) return dx*10000/scale; return dx*tab_sqrt[f]/scale; } else { f=dy*8/dx-8; if (f >= 32) return dy*10000/scale; return dy*tab_sqrt[f]/scale; } #endif } else if (pro == projection_garmin) { return transform_distance_garmin(c1, c2); } else { dbg(lvl_error,"Unknown projection: %d\n", pro); return 0; } } void transform_project(enum projection pro, struct coord *c, int distance, int angle, struct coord *res) { double scale; switch (pro) { case projection_mg: scale=transform_scale(c->y); res->x=c->x+distance*sin(angle*M_PI/180)*scale; res->y=c->y+distance*cos(angle*M_PI/180)*scale; break; default: dbg(lvl_error,"Unsupported projection: %d\n", pro); return; } } double transform_polyline_length(enum projection pro, struct coord *c, int count) { double ret=0; int i; for (i = 0 ; i < count-1 ; i++) ret+=transform_distance(pro, &c[i], &c[i+1]); return ret; } static int transform_overflow_possible_if_squared(int count, ...) { va_list ap; int i, value, result = 0; va_start (ap, count); for (i = 0; i < count; i++) { value = va_arg (ap, int); if (abs(value)>32767) { result = 1; } } va_end (ap); return result; } int transform_distance_sq(struct coord *c1, struct coord *c2) { int dx=c1->x-c2->x; int dy=c1->y-c2->y; if (transform_overflow_possible_if_squared(2, dx, dy)) return INT_MAX; else return dx*dx+dy*dy; } navit_float transform_distance_sq_float(struct coord *c1, struct coord *c2) { int dx=c1->x-c2->x; int dy=c1->y-c2->y; return (navit_float)dx*dx+dy*dy; } int transform_distance_sq_pc(struct pcoord *c1, struct pcoord *c2) { struct coord p1,p2; p1.x = c1->x; p1.y = c1->y; p2.x = c2->x; p2.y = c2->y; return transform_distance_sq(&p1, &p2); } int transform_distance_line_sq(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt) { int vx,vy,wx,wy; int c1,c2; int climit=1000000; struct coord l; vx=l1->x-l0->x; vy=l1->y-l0->y; wx=ref->x-l0->x; wy=ref->y-l0->y; if (transform_overflow_possible_if_squared(4, vx, vy, wx, wy)) { return INT_MAX; } c1=vx*wx+vy*wy; if ( c1 <= 0 ) { if (lpnt) *lpnt=*l0; return transform_distance_sq(l0, ref); } c2=vx*vx+vy*vy; if ( c2 <= c1 ) { if (lpnt) *lpnt=*l1; return transform_distance_sq(l1, ref); } while (c1 > climit || c2 > climit) { c1/=256; c2/=256; } l.x=l0->x+vx*c1/c2; l.y=l0->y+vy*c1/c2; if (lpnt) *lpnt=l; return transform_distance_sq(&l, ref); } navit_float transform_distance_line_sq_float(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt) { navit_float vx,vy,wx,wy; navit_float c1,c2; struct coord l; vx=l1->x-l0->x; vy=l1->y-l0->y; wx=ref->x-l0->x; wy=ref->y-l0->y; c1=vx*wx+vy*wy; if ( c1 <= 0 ) { if (lpnt) *lpnt=*l0; return transform_distance_sq_float(l0, ref); } c2=vx*vx+vy*vy; if ( c2 <= c1 ) { if (lpnt) *lpnt=*l1; return transform_distance_sq_float(l1, ref); } l.x=l0->x+vx*c1/c2; l.y=l0->y+vy*c1/c2; if (lpnt) *lpnt=l; return transform_distance_sq_float(&l, ref); } int transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos) { int i,dist,distn; struct coord lp; if (count < 2) return INT_MAX; if (pos) *pos=0; dist=transform_distance_line_sq(&c[0], &c[1], ref, lpnt); for (i=2 ; i < count ; i++) { distn=transform_distance_line_sq(&c[i-1], &c[i], ref, &lp); if (distn < dist) { dist=distn; if (lpnt) *lpnt=lp; if (pos) *pos=i-1; } } return dist; } int transform_douglas_peucker(struct coord *in, int count, int dist_sq, struct coord *out) { int ret=0; int i,d,dmax=0, idx=0; for (i = 1; i < count-2 ; i++) { d=transform_distance_line_sq(&in[0], &in[count-1], &in[i], NULL); if (d > dmax) { idx=i; dmax=d; } } if (dmax > dist_sq) { ret=transform_douglas_peucker(in, idx, dist_sq, out)-1; ret+=transform_douglas_peucker(in+idx, count-idx, dist_sq, out+ret); } else { if (count > 0) out[ret++]=in[0]; if (count > 1) out[ret++]=in[count-1]; } return ret; } int transform_douglas_peucker_float(struct coord *in, int count, navit_float dist_sq, struct coord *out) { int ret=0; int i,idx=0; navit_float d,dmax=0; for (i = 1; i < count-2 ; i++) { d=transform_distance_line_sq_float(&in[0], &in[count-1], &in[i], NULL); if (d > dmax) { idx=i; dmax=d; } } if (dmax > dist_sq) { ret=transform_douglas_peucker_float(in, idx, dist_sq, out)-1; ret+=transform_douglas_peucker_float(in+idx, count-idx, dist_sq, out+ret); } else { if (count > 0) out[ret++]=in[0]; if (count > 1) out[ret++]=in[count-1]; } return ret; } void transform_print_deg(double deg) { printf("%2.0f:%2.0f:%2.4f", floor(deg), fmod(deg*60,60), fmod(deg*3600,60)); } #ifdef AVOID_FLOAT static int tab_atan[]={0,262,524,787,1051,1317,1584,1853,2126,2401,2679,2962,3249,3541,3839,4142,4452,4770,5095,5430,5774,6128,6494,6873,7265,7673,8098,8541,9004,9490,10000,10538}; static int atan2_int_lookup(int val) { int len=sizeof(tab_atan)/sizeof(int); int i=len/2; int p=i-1; for (;;) { i>>=1; if (val < tab_atan[p]) p-=i; else if (val < tab_atan[p+1]) return p+(p>>1); else p+=i; } } static int atan2_int(int dx, int dy) { int mul=1,add=0,ret; if (! dx) { return dy < 0 ? 180 : 0; } if (! dy) { return dx < 0 ? -90 : 90; } if (dx < 0) { dx=-dx; mul=-1; } if (dy < 0) { dy=-dy; add=180*mul; mul*=-1; } while (dx > 20000 || dy > 20000) { dx/=10; dy/=10; } if (dx > dy) { ret=90-atan2_int_lookup(dy*10000/dx); } else { ret=atan2_int_lookup(dx*10000/dy); } return ret*mul+add; } #endif /** * @brief Gets the bearing from one point to another * * @param c1 The first coordinate * @param c2 The second coordinate * @param dir The direction: if it is -1, the bearing from c2 to c1 is returned, else the bearing from c1 to c2 * * @return The bearing in degrees, {@code 0 <= result < 360}. */ int transform_get_angle_delta(struct coord *c1, struct coord *c2, int dir) { int dx=c2->x-c1->x; int dy=c2->y-c1->y; #ifndef AVOID_FLOAT double angle; angle=atan2(dx,dy); angle*=180/M_PI; #else int angle; angle=atan2_int(dx,dy); #endif if (dir == -1) angle=angle-180; if (angle < 0) angle+=360; return angle; } int transform_within_border(struct transformation *this_, struct point *p, int border) { struct map_selection *ms=this_->screen_sel; while (ms) { struct point_rect *r=&ms->u.p_rect; if (p->x >= r->lu.x+border && p->x <= r->rl.x-border && p->y >= r->lu.y+border && p->y <= r->rl.y-border) return 1; ms=ms->next; } return 0; } int transform_within_dist_point(struct coord *ref, struct coord *c, int dist) { if (c->x-dist > ref->x) return 0; if (c->x+dist < ref->x) return 0; if (c->y-dist > ref->y) return 0; if (c->y+dist < ref->y) return 0; if ((c->x-ref->x)*(c->x-ref->x) + (c->y-ref->y)*(c->y-ref->y) <= dist*dist) return 1; return 0; } int transform_within_dist_line(struct coord *ref, struct coord *c0, struct coord *c1, int dist) { int vx,vy,wx,wy; int n1,n2; struct coord lc; if (c0->x < c1->x) { if (c0->x-dist > ref->x) return 0; if (c1->x+dist < ref->x) return 0; } else { if (c1->x-dist > ref->x) return 0; if (c0->x+dist < ref->x) return 0; } if (c0->y < c1->y) { if (c0->y-dist > ref->y) return 0; if (c1->y+dist < ref->y) return 0; } else { if (c1->y-dist > ref->y) return 0; if (c0->y+dist < ref->y) return 0; } vx=c1->x-c0->x; vy=c1->y-c0->y; wx=ref->x-c0->x; wy=ref->y-c0->y; n1=vx*wx+vy*wy; if ( n1 <= 0 ) return transform_within_dist_point(ref, c0, dist); n2=vx*vx+vy*vy; if ( n2 <= n1 ) return transform_within_dist_point(ref, c1, dist); lc.x=c0->x+vx*n1/n2; lc.y=c0->y+vy*n1/n2; return transform_within_dist_point(ref, &lc, dist); } int transform_within_dist_polyline(struct coord *ref, struct coord *c, int count, int close, int dist) { int i; for (i = 0 ; i < count-1 ; i++) { if (transform_within_dist_line(ref,c+i,c+i+1,dist)) { return 1; } } if (close) return (transform_within_dist_line(ref,c,c+count-1,dist)); return 0; } int transform_within_dist_polygon(struct coord *ref, struct coord *c, int count, int dist) { int i, j, ci = 0; for (i = 0, j = count-1; i < count; j = i++) { if ((((c[i].y <= ref->y) && ( ref->y < c[j].y )) || ((c[j].y <= ref->y) && ( ref->y < c[i].y))) && (ref->x < (c[j].x - c[i].x) * (ref->y - c[i].y) / (c[j].y - c[i].y) + c[i].x)) ci = !ci; } if (! ci) { if (dist) return transform_within_dist_polyline(ref, c, count, dist, 1); else return 0; } return 1; } int transform_within_dist_item(struct coord *ref, enum item_type type, struct coord *c, int count, int dist) { if (type < type_line) return transform_within_dist_point(ref, c, dist); if (type < type_area) return transform_within_dist_polyline(ref, c, count, 0, dist); return transform_within_dist_polygon(ref, c, count, dist); } void transform_copy(struct transformation *src, struct transformation *dst) { memcpy(dst, src, sizeof(*src)); } void transform_destroy(struct transformation *t) { map_selection_destroy(t->map_sel); map_selection_destroy(t->screen_sel); g_free(t); } /* Note: there are many mathematically equivalent ways to express these formulas. As usual, not all of them are computationally equivalent. L = latitude in radians (positive north) Lo = longitude in radians (positive east) E = easting (meters) N = northing (meters) For the sphere E = r Lo N = r ln [ tan (pi/4 + L/2) ] where r = radius of the sphere (meters) ln() is the natural logarithm For the ellipsoid E = a Lo N = a * ln ( tan (pi/4 + L/2) * ( (1 - e * sin (L)) / (1 + e * sin (L))) ** (e/2) ) e - pi L 1 - e sin(L) 2 = a ln( tan( ---- + ---) (--------------) ) 4 2 1 + e sin(L) where a = the length of the semi-major axis of the ellipsoid (meters) e = the first eccentricity of the ellipsoid */ navit-0.5.0+dfsg.1/navit/transform.h000066400000000000000000000144471264204753600172430ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_TRANSFORM_H #define NAVIT_TRANSFORM_H #ifdef __cplusplus extern "C" { #endif #include "coord.h" /* prototypes */ enum attr_type; enum item_type; enum map_datum; enum projection; struct attr; struct attr_iter; struct coord; struct coord_geo; struct coord_geo_cart; struct map_selection; struct pcoord; struct point; struct transformation; struct transformation *transform_new(struct pcoord *center, int scale, int yaw); int transform_get_hog(struct transformation *this_); void transform_set_hog(struct transformation *this_, int hog); int transform_get_attr(struct transformation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int transform_set_attr(struct transformation *this_, struct attr *attr); int transformation_get_order_base(struct transformation *this_); void transform_set_order_base(struct transformation *this_, int order_base); struct transformation *transform_dup(struct transformation *t); void transform_to_geo(enum projection pro, struct coord *c, struct coord_geo *g); void transform_from_geo(enum projection pro, struct coord_geo *g, struct coord *c); void transform_from_to_count(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to, int count); void transform_from_to(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to); void transform_geo_to_cart(struct coord_geo *geo, navit_float a, navit_float b, struct coord_geo_cart *cart); void transform_cart_to_geo(struct coord_geo_cart *cart, navit_float a, navit_float b, struct coord_geo *geo); void transform_utm_to_geo(const double UTMEasting, const double UTMNorthing, int ZoneNumber, int NorthernHemisphere, struct coord_geo *geo); void transform_datum(struct coord_geo *from, enum map_datum from_datum, struct coord_geo *to, enum map_datum to_datum); int transform(struct transformation *t, enum projection pro, struct coord *c, struct point *p, int count, int mindist, int width, int *width_return); int transform_reverse(struct transformation *t, struct point *p, struct coord *c); double transform_pixels_to_map_distance(struct transformation *transformation, int pixels); enum projection transform_get_projection(struct transformation *this_); void transform_set_projection(struct transformation *this_, enum projection pro); struct map_selection *transform_get_selection(struct transformation *this_, enum projection pro, int order); struct coord *transform_center(struct transformation *this_); struct coord *transform_get_center(struct transformation *this_); void transform_set_center(struct transformation *this_, struct coord *c); void transform_set_yaw(struct transformation *t, int yaw); int transform_get_yaw(struct transformation *this_); void transform_set_pitch(struct transformation *this_, int pitch); int transform_get_pitch(struct transformation *this_); void transform_set_roll(struct transformation *this_, int roll); int transform_get_roll(struct transformation *this_); void transform_set_distance(struct transformation *this_, int distance); int transform_get_distance(struct transformation *this_); void transform_set_scales(struct transformation *this_, int xscale, int yscale, int wscale); void transform_set_screen_selection(struct transformation *t, struct map_selection *sel); void transform_set_screen_center(struct transformation *t, struct point *p); void transform_get_size(struct transformation *t, int *width, int *height); void transform_setup(struct transformation *t, struct pcoord *c, int scale, int yaw); void transform_setup_source_rect(struct transformation *t); long transform_get_scale(struct transformation *t); void transform_set_scale(struct transformation *t, long scale); int transform_get_order(struct transformation *t); double transform_scale(int y); double transform_distance(enum projection pro, struct coord *c1, struct coord *c2); void transform_project(enum projection pro, struct coord *c, int distance, int angle, struct coord *res); double transform_polyline_length(enum projection pro, struct coord *c, int count); int transform_distance_sq(struct coord *c1, struct coord *c2); navit_float transform_distance_sq_float(struct coord *c1, struct coord *c2); int transform_distance_sq_pc(struct pcoord *c1, struct pcoord *c2); int transform_distance_line_sq(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt); navit_float transform_distance_line_sq_float(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt); int transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos); int transform_douglas_peucker(struct coord *in, int count, int dist_sq, struct coord *out); int transform_douglas_peucker_float(struct coord *in, int count, navit_float dist_sq, struct coord *out); void transform_print_deg(double deg); int transform_get_angle_delta(struct coord *c1, struct coord *c2, int dir); int transform_within_border(struct transformation *this_, struct point *p, int border); int transform_within_dist_point(struct coord *ref, struct coord *c, int dist); int transform_within_dist_line(struct coord *ref, struct coord *c0, struct coord *c1, int dist); int transform_within_dist_polyline(struct coord *ref, struct coord *c, int count, int close, int dist); int transform_within_dist_polygon(struct coord *ref, struct coord *c, int count, int dist); int transform_within_dist_item(struct coord *ref, enum item_type type, struct coord *c, int count, int dist); void transform_copy(struct transformation *src, struct transformation *dst); void transform_destroy(struct transformation *t); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/types.h000066400000000000000000000021541264204753600163640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_TYPES_H #define NAVIT_TYPES_H #include typedef int8_t s8; typedef uint8_t u8; typedef int16_t s16; typedef uint16_t u16; typedef int32_t s32; typedef uint32_t u32; #ifdef HAVE_API_WIN32_BASE #define LONGLONG_FMT "%I64d" #define LONGLONG_HEX_FMT "%I64x" #else #define LONGLONG_FMT "%lld" #define LONGLONG_HEX_FMT "%llx" #endif #endif navit-0.5.0+dfsg.1/navit/util.c000066400000000000000000000375471264204753600162060ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #ifdef _POSIX_C_SOURCE #include #include #include #endif #ifdef _MSC_VER typedef int ssize_t ; #endif #include "util.h" #include "debug.h" #include "config.h" void strtoupper(char *dest, const char *src) { while (*src) *dest++=toupper(*src++); *dest='\0'; } void strtolower(char *dest, const char *src) { while (*src) *dest++=tolower(*src++); *dest='\0'; } int navit_utf8_strcasecmp(const char *s1, const char *s2) { char *s1_folded,*s2_folded; int cmpres; s1_folded=g_utf8_casefold(s1,-1); s2_folded=g_utf8_casefold(s2,-1); cmpres=strcmp(s1_folded,s2_folded); dbg(lvl_debug,"Compared %s with %s, got %d\n",s1_folded,s2_folded,cmpres); g_free(s1_folded); g_free(s2_folded); return cmpres; } static void hash_callback(gpointer key, gpointer value, gpointer user_data) { GList **l=user_data; *l=g_list_prepend(*l, value); } GList * g_hash_to_list(GHashTable *h) { GList *ret=NULL; g_hash_table_foreach(h, hash_callback, &ret); return ret; } static void hash_callback_key(gpointer key, gpointer value, gpointer user_data) { GList **l=user_data; *l=g_list_prepend(*l, key); } GList * g_hash_to_list_keys(GHashTable *h) { GList *ret=NULL; g_hash_table_foreach(h, hash_callback_key, &ret); return ret; } gchar * g_strconcat_printf(gchar *buffer, gchar *fmt, ...) { gchar *str,*ret; va_list ap; va_start(ap, fmt); str=g_strdup_vprintf(fmt, ap); va_end(ap); if (! buffer) return str; ret=g_strconcat(buffer, str, NULL); g_free(buffer); g_free(str); return ret; } #ifndef HAVE_GLIB int g_utf8_strlen_force_link(gchar *buffer, int max); int g_utf8_strlen_force_link(gchar *buffer, int max) { return g_utf8_strlen(buffer, max); } #endif #if defined(_WIN32) || defined(__CEGCC__) #include #include #endif #if defined(_WIN32) || defined(__CEGCC__) || defined (__APPLE__) || defined(HAVE_API_ANDROID) char *stristr(const char *String, const char *Pattern) { char *pptr, *sptr, *start; for (start = (char *)String; *start != (int)NULL; start++) { /* find start of pattern in string */ for ( ; ((*start!=(int)NULL) && (toupper(*start) != toupper(*Pattern))); start++) ; if ((int)NULL == *start) return NULL; pptr = (char *)Pattern; sptr = (char *)start; while (toupper(*sptr) == toupper(*pptr)) { sptr++; pptr++; /* if end of pattern then pattern was found */ if ((int)NULL == *pptr) return (start); } } return NULL; } #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) #endif #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) #endif #if !HAVE_FLOCKFILE # undef flockfile # define flockfile(x) ((void) 0) #endif #if !HAVE_FUNLOCKFILE # undef funlockfile # define funlockfile(x) ((void) 0) #endif /* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */ #ifndef EOVERFLOW # define EOVERFLOW E2BIG #endif #ifndef HAVE_GETDELIM /** * @brief Reads the part of a file up to a delimiter to a string. *

* Read up to (and including) a DELIMITER from FP into *LINEPTR (and NUL-terminate it). * * @param lineptr Pointer to a pointer returned from malloc (or NULL), pointing to a buffer. It is * realloc'ed as necessary and will receive the data read. * @param n Size of the buffer. * * @return Number of characters read (not including the null terminator), or -1 on error or EOF. */ ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) { int result; size_t cur_len = 0; if (lineptr == NULL || n == NULL || fp == NULL) { return -1; } flockfile (fp); if (*lineptr == NULL || *n == 0) { *n = 120; *lineptr = (char *) realloc (*lineptr, *n); if (*lineptr == NULL) { result = -1; goto unlock_return; } } for (;;) { int i; i = getc (fp); if (i == EOF) { result = -1; break; } /* Make enough space for len+1 (for final NUL) bytes. */ if (cur_len + 1 >= *n) { size_t needed_max=SIZE_MAX; size_t needed = 2 * *n + 1; /* Be generous. */ char *new_lineptr; if (needed_max < needed) needed = needed_max; if (cur_len + 1 >= needed) { result = -1; goto unlock_return; } new_lineptr = (char *) realloc (*lineptr, needed); if (new_lineptr == NULL) { result = -1; goto unlock_return; } *lineptr = new_lineptr; *n = needed; } (*lineptr)[cur_len] = i; cur_len++; if (i == delimiter) break; } (*lineptr)[cur_len] = '\0'; result = cur_len ? cur_len : result; unlock_return: funlockfile (fp); /* doesn't set errno */ return result; } #endif #ifndef HAVE_GETLINE ssize_t getline (char **lineptr, size_t *n, FILE *stream) { return getdelim (lineptr, n, '\n', stream); } #endif #if defined(_UNICODE) wchar_t* newSysString(const char *toconvert) { int newstrlen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toconvert, -1, 0, 0); wchar_t *newstring = g_new(wchar_t,newstrlen); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toconvert, -1, newstring, newstrlen) ; return newstring; } #else char * newSysString(const char *toconvert) { return g_strdup(toconvert); } #endif #endif #if defined(_MSC_VER) || (!defined(HAVE_GETTIMEOFDAY) && defined(HAVE_API_WIN32_BASE)) /** * Impements a simple incomplete version of gettimeofday. Only usefull for messuring * time spans, not the real time of day. */ int gettimeofday(struct timeval *time, void *local) { int milliseconds = GetTickCount(); time->tv_sec = milliseconds/1000; time->tv_usec = (milliseconds - (time->tv_sec * 1000)) * 1000; return 0; } #endif /** * @brief Converts an ISO 8601-style time string into epoch time. * * @param iso8601 Time in ISO 8601 format. * * @return The number of seconds elapsed since January 1, 1970, 00:00:00 UTC. */ unsigned int iso8601_to_secs(char *iso8601) { int a,b,d,val[6],i=0; char *start=iso8601,*pos=iso8601; while (*pos && i < 6) { if (*pos < '0' || *pos > '9') { val[i++]=atoi(start); pos++; start=pos; } if(*pos) pos++; } a=val[0]/100; b=2-a+a/4; if (val[1] < 2) { val[0]--; val[1]+=12; } d=1461*(val[0]+4716)/4+306001*(val[1]+1)/10000+val[2]+b-2442112; return ((d*24+val[3])*60+val[4])*60+val[5]; } /** * @brief Outputs local system time in ISO 8601 format. * * @return Time in ISO 8601 format */ char * current_to_iso8601(void) { char *timep=NULL; #ifdef HAVE_API_WIN32_BASE SYSTEMTIME ST; GetSystemTime(&ST); timep=g_strdup_printf("%d-%02d-%02dT%02d:%02d:%02dZ",ST.wYear,ST.wMonth,ST.wDay,ST.wHour,ST.wMinute,ST.wSecond); #else char buffer[32]; time_t tnow; struct tm *tm; tnow = time(0); tm = gmtime(&tnow); if (tm) { strftime(buffer, sizeof(buffer), "%Y-%m-%dT%TZ", tm); timep=g_strdup(buffer); } #endif return timep; } struct spawn_process_info { #ifdef HAVE_API_WIN32_BASE PROCESS_INFORMATION pr; #else pid_t pid; // = -1 if non-blocking spawn isn't supported int status; // exit status if non-blocking spawn isn't supported #endif }; /** * Escape and quote string for shell * * @param in arg string to escape * @returns escaped string */ char * shell_escape(char *arg) { char *r; int arglen=strlen(arg); int i,j,rlen; #ifdef HAVE_API_WIN32_BASE { int bscount=0; rlen=arglen+3; r=g_new(char,rlen); r[0]='"'; for(i=0,j=1;i0) { rlen+=bscount; r=g_realloc(r,rlen); memset(r+j,'\\',bscount); j+=bscount; bscount=0; } r[j++]=arg[i]; if(i==(arglen-1)) { r[j++]='"'; } } } r[j++]=0; } #else { // Will use hard quoting for the whole string // and replace each singular quote found with a '\'' sequence. rlen=arglen+3; r=g_new(char,rlen); r[0]='\''; for(i=0,j=1;i0 - return code, -1 - error */ struct spawn_process_info* spawn_process(char **argv) { struct spawn_process_info*r=g_new(struct spawn_process_info,1); #ifdef _POSIX_C_SOURCE { pid_t pid; sigset_t set, old; dbg(lvl_debug,"spawning process for '%s'\n", argv[0]); sigemptyset(&set); sigaddset(&set,SIGCHLD); spawn_process_sigmask(SIG_BLOCK,&set,&old); pid=fork(); if(pid==0) { execvp(argv[0], argv); /*Shouldn't reach here*/ exit(1); } else if(pid>0) { r->status=-1; r->pid=pid; spawn_process_children=g_list_prepend(spawn_process_children,r); } else { dbg(lvl_error,"fork() returned error."); g_free(r); r=NULL; } spawn_process_sigmask(SIG_SETMASK,&old,NULL); return r; } #else #ifdef HAVE_API_WIN32_BASE { char *cmdline; DWORD dwRet; // For [desktop] Windows it's adviceable not to use // first CreateProcess parameter because PATH is not used // if it is defined. // // On WinCE 6.0 I was unable to launch anything // without first CreateProcess parameter, also it seems that // no WinCE program has support for quoted strings in arguments. // So... #ifdef HAVE_API_WIN32_CE LPWSTR cmd,args; cmdline=g_strjoinv(" ",argv+1); args=newSysString(cmdline); cmd = newSysString(argv[0]); dwRet=CreateProcess(cmd, args, NULL, NULL, 0, 0, NULL, NULL, NULL, &(r->pr)); dbg(lvl_debug, "CreateProcess(%s,%s), PID=%i\n",argv[0],cmdline,r->pr.dwProcessId); g_free(cmd); #else TCHAR* args; STARTUPINFO startupInfo; memset(&startupInfo, 0, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); cmdline=spawn_process_compose_cmdline(argv); args=newSysString(cmdline); dwRet=CreateProcess(NULL, args, NULL, NULL, 0, 0, NULL, NULL, &startupInfo, &(r->pr)); dbg(lvl_debug, "CreateProcess(%s), PID=%i\n",cmdline,r->pr.dwProcessId); #endif g_free(cmdline); g_free(args); return r; } #else { char *cmdline=spawn_process_compose_cmdline(argv); int status; dbg(lvl_error,"Unblocked spawn_process isn't availiable on this platform.\n"); status=system(cmdline); g_free(cmdline); r->status=status; r->pid=0; return r; } #endif #endif } /** * Check external program status * * @param in *pi pointer to spawn_process_info structure * @param in block =0 do not block =1 block until child terminated * @returns -1 - still running, >=0 program exited, * =255 trminated abnormally or wasn't run at all. * */ int spawn_process_check_status(struct spawn_process_info *pi, int block) { if(pi==NULL) { dbg(lvl_error,"Trying to get process status of NULL, assuming process is terminated.\n"); return 255; } #ifdef HAVE_API_WIN32_BASE {int failcount=0; while(1){ DWORD dw; if(GetExitCodeProcess(pi->pr.hProcess,&dw)) { if(dw!=STILL_ACTIVE) { return dw; break; } } else { dbg(lvl_error,"GetExitCodeProcess failed. Assuming the process is terminated."); return 255; } if(!block) return -1; dw=WaitForSingleObject(pi->pr.hProcess,INFINITE); if(dw==WAIT_FAILED && failcount++==1) { dbg(lvl_error,"WaitForSingleObject failed twice. Assuming the process is terminated."); return 0; break; } } } #else #ifdef _POSIX_C_SOURCE if(pi->status!=-1) { return pi->status; } while(1) { int status; pid_t w=waitpid(pi->pid,&status,block?0:WNOHANG); if(w>0) { if(WIFEXITED(status)) pi->status=WEXITSTATUS(status); return pi->status; if(WIFSTOPPED(status)) { dbg(lvl_debug,"child is stopped by %i signal\n",WSTOPSIG(status)); } else if (WIFSIGNALED(status)) { dbg(lvl_debug,"child terminated by signal %i\n",WEXITSTATUS(status)); pi->status=255; return 255; } if(!block) return -1; } else if(w==0) { if(!block) return -1; } else { if(pi->status!=-1) // Signal handler has changed pi->status while in this function return pi->status; dbg(lvl_error,"waitpid() indicated error, reporting process termination.\n"); return 255; } } #else dbg(lvl_error, "Non-blocking spawn_process isn't availiable for this platform, repoting process exit status.\n"); return pi->status; #endif #endif } void spawn_process_info_free(struct spawn_process_info *pi) { if(pi==NULL) return; #ifdef HAVE_API_WIN32_BASE CloseHandle(pi->pr.hProcess); CloseHandle(pi->pr.hThread); #endif #ifdef _POSIX_C_SOURCE { sigset_t set, old; sigemptyset(&set); sigaddset(&set,SIGCHLD); spawn_process_sigmask(SIG_BLOCK,&set,&old); spawn_process_children=g_list_remove(spawn_process_children,pi); spawn_process_sigmask(SIG_SETMASK,&old,NULL); } #endif g_free(pi); } #ifdef _POSIX_C_SOURCE static void spawn_process_sigchld(int sig) { int status; pid_t pid; while ((pid=waitpid(-1, &status, WNOHANG)) > 0) { GList *el=g_list_first(spawn_process_children); while(el) { struct spawn_process_info *p=el->data; if(p->pid==pid) { p->status=status; } el=g_list_next(el); } } } #endif void spawn_process_init() { #ifdef _POSIX_C_SOURCE struct sigaction act; act.sa_handler=spawn_process_sigchld; act.sa_flags=0; sigemptyset(&act.sa_mask); sigaction(SIGCHLD, &act, NULL); #endif return; } /** Get printable compass direction from an angle. */ void get_compass_direction(char *buffer, int angle, int mode) { angle=angle%360; switch (mode) { case 0: sprintf(buffer,"%d",angle); break; case 1: if (angle < 69 || angle > 291) *buffer++='N'; if (angle > 111 && angle < 249) *buffer++='S'; if (angle > 22 && angle < 158) *buffer++='E'; if (angle > 202 && angle < 338) *buffer++='W'; *buffer++='\0'; break; case 2: angle=(angle+15)/30; if (! angle) angle=12; sprintf(buffer,"%d H", angle); break; } } navit-0.5.0+dfsg.1/navit/util.h000066400000000000000000000040101264204753600161660ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_types_H #define NAVIT_types_H #include #include "config.h" #define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a,b) ((a) < (b) ? (a) : (b)) void strtoupper(char *dest, const char *src); void strtolower(char *dest, const char *src); int navit_utf8_strcasecmp(const char *s1, const char *s2); GList * g_hash_to_list(GHashTable *h); GList * g_hash_to_list_keys(GHashTable *h); gchar * g_strconcat_printf(gchar *buffer, gchar *fmt, ...); #if defined(_WIN32) || defined(__CEGCC__) || defined (__APPLE__) || defined(HAVE_API_ANDROID) #if defined(_UNICODE) wchar_t* newSysString(const char *toconvert); #else char * newSysString(const char *toconvert); #endif #endif unsigned int iso8601_to_secs(char *iso8601); char * current_to_iso8601(void); #if defined(_MSC_VER) || (!defined(HAVE_GETTIMEOFDAY) && defined(HAVE_API_WIN32_BASE)) #include int gettimeofday(struct timeval *time, void *); #endif struct spawn_process_info; char * shell_escape(char *arg); struct spawn_process_info* spawn_process(char **argv); int spawn_process_check_status(struct spawn_process_info *pi,int block); void spawn_process_info_free(struct spawn_process_info *pi); void spawn_process_init(void); #endif void get_compass_direction(char *buffer, int angle, int mode); navit-0.5.0+dfsg.1/navit/vehicle.c000066400000000000000000000550041264204753600166340ustar00rootroot00000000000000/* * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** @file vehicle.c * @brief Generic components of the vehicle object. * * This file implements the generic vehicle interface, i.e. everything which is * not specific to a single data source. * * @author Navit Team * @date 2005-2014 */ #include #include #include #include #include "config.h" #include "debug.h" #include "coord.h" #include "item.h" #include "xmlconfig.h" #include "log.h" #include "plugin.h" #include "transform.h" #include "util.h" #include "event.h" #include "coord.h" #include "transform.h" #include "projection.h" #include "point.h" #include "graphics.h" #include "callback.h" #include "color.h" #include "layout.h" #include "vehicle.h" #include "navit_nls.h" struct vehicle { NAVIT_OBJECT struct vehicle_methods meth; struct vehicle_priv *priv; struct callback_list *cbl; struct log *nmea_log, *gpx_log; char *gpx_desc; // cursor struct cursor *cursor; int cursor_fixed; struct callback *animate_callback; struct event_timeout *animate_timer; struct point cursor_pnt; struct graphics *gra; struct graphics_gc *bg; struct transformation *trans; int angle; int speed; int sequence; GHashTable *log_to_cb; }; struct object_func vehicle_func; static void vehicle_set_default_name(struct vehicle *this); static void vehicle_draw_do(struct vehicle *this_); static void vehicle_log_nmea(struct vehicle *this_, struct log *log); static void vehicle_log_gpx(struct vehicle *this_, struct log *log); static void vehicle_log_textfile(struct vehicle *this_, struct log *log); static void vehicle_log_binfile(struct vehicle *this_, struct log *log); static int vehicle_add_log(struct vehicle *this_, struct log *log); /** * @brief Creates a new vehicle * * @param parent * @param attrs Points to a null-terminated array of pointers to the attributes * for the new vehicle type. * * @return The newly created vehicle object */ struct vehicle * vehicle_new(struct attr *parent, struct attr **attrs) { struct vehicle *this_; struct attr *source; struct vehicle_priv *(*vehicletype_new) (struct vehicle_methods * meth, struct callback_list * cbl, struct attr ** attrs); char *type, *colon; struct pcoord center; dbg(lvl_debug, "enter\n"); source = attr_search(attrs, NULL, attr_source); if (!source) { dbg(lvl_error, "incomplete vehicle definition: missing attribute 'source'\n"); return NULL; } type = g_strdup(source->u.str); colon = strchr(type, ':'); if (colon) *colon = '\0'; dbg(lvl_debug, "source='%s' type='%s'\n", source->u.str, type); vehicletype_new = plugin_get_vehicle_type(type); if (!vehicletype_new) { dbg(lvl_error, "invalid source '%s': unknown type '%s'\n", source->u.str, type); g_free(type); return NULL; } g_free(type); this_ = g_new0(struct vehicle, 1); this_->func=&vehicle_func; navit_object_ref((struct navit_object *)this_); this_->cbl = callback_list_new(); this_->priv = vehicletype_new(&this_->meth, this_->cbl, attrs); if (!this_->priv) { dbg(lvl_error, "vehicletype_new failed\n"); callback_list_destroy(this_->cbl); g_free(this_); return NULL; } this_->attrs=attr_list_dup(attrs); center.pro=projection_screen; center.x=0; center.y=0; this_->trans=transform_new(¢er, 16, 0); vehicle_set_default_name(this_); dbg(lvl_debug, "leave\n"); this_->log_to_cb=g_hash_table_new(NULL,NULL); return this_; } /** * @brief Destroys a vehicle * * @param this_ The vehicle to destroy */ void vehicle_destroy(struct vehicle *this_) { dbg(lvl_debug,"enter\n"); if (this_->animate_callback) { callback_destroy(this_->animate_callback); event_remove_timeout(this_->animate_timer); } transform_destroy(this_->trans); this_->meth.destroy(this_->priv); callback_list_destroy(this_->cbl); attr_list_free(this_->attrs); if (this_->bg) graphics_gc_destroy(this_->bg); if (this_->gra) graphics_free(this_->gra); g_free(this_); } /** * Creates an attribute iterator to be used with vehicles */ struct attr_iter * vehicle_attr_iter_new(void) { return (struct attr_iter *)g_new0(void *,1); } /** * Destroys a vehicle attribute iterator * * @param iter a vehicle attr_iter */ void vehicle_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } /** * Generic get function * * @param this_ Pointer to a vehicle structure * @param type The attribute type to look for * @param attr Pointer to a {@code struct attr} to store the attribute * @param iter A vehicle attr_iter. This is only used for generic attributes; for attributes specific to the vehicle object it is ignored. * @return True for success, false for failure */ int vehicle_get_attr(struct vehicle *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { int ret; if (type == attr_log_gpx_desc) { attr->u.str = this_->gpx_desc; return 1; } if (this_->meth.position_attr_get) { ret=this_->meth.position_attr_get(this_->priv, type, attr); if (ret) return ret; } return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } /** * Generic set function * * @param this_ A vehicle * @param attr The attribute to set * @return False on success, true on failure */ int vehicle_set_attr(struct vehicle *this_, struct attr *attr) { int ret=1; if (attr->type == attr_log_gpx_desc) { g_free(this_->gpx_desc); this_->gpx_desc = g_strdup(attr->u.str); } else if (this_->meth.set_attr) ret=this_->meth.set_attr(this_->priv, attr); /* attr_profilename probably is never used by vehicle itself but it's used to control the routing engine. So any vehicle should allow to set and read it. */ if(attr->type == attr_profilename) ret=1; if (ret == 1 && attr->type != attr_navit && attr->type != attr_pdl_gps_update) this_->attrs=attr_generic_set_attr(this_->attrs, attr); return ret != 0; } /** * Generic add function * * @param this_ A vehicle * @param attr The attribute to add * * @return true if the attribute was added, false if not. */ int vehicle_add_attr(struct vehicle *this_, struct attr *attr) { int ret=1; switch (attr->type) { case attr_callback: callback_list_add(this_->cbl, attr->u.callback); break; case attr_log: ret=vehicle_add_log(this_, attr->u.log); break; // currently supporting oldstyle cursor config. case attr_cursor: this_->cursor_fixed=1; vehicle_set_cursor(this_, attr->u.cursor, 1); break; default: break; } if (ret) this_->attrs=attr_generic_add_attr(this_->attrs, attr); return ret; } /** * @brief Generic remove function. * * Used to remove a callback from the vehicle. * @param this_ A vehicle * @param attr */ int vehicle_remove_attr(struct vehicle *this_, struct attr *attr) { struct callback *cb; switch (attr->type) { case attr_callback: callback_list_remove(this_->cbl, attr->u.callback); break; case attr_log: cb=g_hash_table_lookup(this_->log_to_cb, attr->u.log); if (!cb) return 0; g_hash_table_remove(this_->log_to_cb, attr->u.log); callback_list_remove(this_->cbl, cb); break; default: this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 0; } return 1; } /** * Sets the cursor of a vehicle. * * @param this_ A vehicle * @param cursor A cursor * @author Ralph Sennhauser (10/2009) */ void vehicle_set_cursor(struct vehicle *this_, struct cursor *cursor, int overwrite) { struct point sc; if (this_->cursor_fixed && !overwrite) return; if (this_->animate_callback) { event_remove_timeout(this_->animate_timer); this_->animate_timer=NULL; // dangling pointer! prevent double freeing. callback_destroy(this_->animate_callback); this_->animate_callback=NULL; // dangling pointer! prevent double freeing. } if (cursor && cursor->interval) { this_->animate_callback=callback_new_2(callback_cast(vehicle_draw_do), this_, 0); this_->animate_timer=event_add_timeout(cursor->interval, 1, this_->animate_callback); } if (cursor && this_->gra && this_->cursor) { this_->cursor_pnt.x+=(this_->cursor->w - cursor->w)/2; this_->cursor_pnt.y+=(this_->cursor->h - cursor->h)/2; graphics_overlay_resize(this_->gra, &this_->cursor_pnt, cursor->w, cursor->h, 0); } if (cursor) { sc.x=cursor->w/2; sc.y=cursor->h/2; if (!this_->cursor && this_->gra) graphics_overlay_disable(this_->gra, 0); } else { sc.x=sc.y=0; if (this_->cursor && this_->gra) graphics_overlay_disable(this_->gra, 1); } transform_set_screen_center(this_->trans, &sc); this_->cursor=cursor; } /** * Draws a vehicle on top of a graphics. * * @param this_ The vehicle * @param gra The graphics * @param pnt Screen coordinates of the vehicle. * @param angle The angle relative to the map. * @param speed The speed of the vehicle. */ void vehicle_draw(struct vehicle *this_, struct graphics *gra, struct point *pnt, int angle, int speed) { if (angle < 0) angle+=360; dbg(lvl_debug,"enter this=%p gra=%p pnt=%p dir=%d speed=%d\n", this_, gra, pnt, angle, speed); dbg(lvl_debug,"point %d,%d\n", pnt->x, pnt->y); this_->cursor_pnt=*pnt; this_->angle=angle; this_->speed=speed; if (!this_->cursor) return; this_->cursor_pnt.x-=this_->cursor->w/2; this_->cursor_pnt.y-=this_->cursor->h/2; if (!this_->gra) { struct color c; this_->gra=graphics_overlay_new(gra, &this_->cursor_pnt, this_->cursor->w, this_->cursor->h, 0); if (this_->gra) { graphics_init(this_->gra); this_->bg=graphics_gc_new(this_->gra); c.r=0; c.g=0; c.b=0; c.a=0; graphics_gc_set_foreground(this_->bg, &c); graphics_background_gc(this_->gra, this_->bg); } } vehicle_draw_do(this_); } int vehicle_get_cursor_data(struct vehicle *this, struct point *pnt, int *angle, int *speed) { *pnt=this->cursor_pnt; *angle=this->angle; *speed=this->speed; return 1; } static void vehicle_set_default_name(struct vehicle *this_) { struct attr default_name; if (!attr_search(this_->attrs, NULL, attr_name)) { default_name.type=attr_name; // Safe cast: attr_generic_set_attr does not modify its parameter. default_name.u.str=(char*)_("Unnamed vehicle"); this_->attrs=attr_generic_set_attr(this_->attrs, &default_name); dbg(lvl_error, "Incomplete vehicle definition: missing attribute 'name'. Default name set.\n"); } } static void vehicle_draw_do(struct vehicle *this_) { struct point p; struct cursor *cursor=this_->cursor; int speed=this_->speed; int angle=this_->angle; int sequence=this_->sequence; struct attr **attr; char *label=NULL; int match=0; if (!this_->cursor || !this_->cursor->attrs || !this_->gra) return; attr=this_->attrs; while (attr && *attr) { if ((*attr)->type == attr_name) label=(*attr)->u.str; attr++; } transform_set_yaw(this_->trans, -this_->angle); graphics_draw_mode(this_->gra, draw_mode_begin); p.x=0; p.y=0; graphics_draw_rectangle(this_->gra, this_->bg, &p, cursor->w, cursor->h); attr=cursor->attrs; while (*attr) { if ((*attr)->type == attr_itemgra) { struct itemgra *itm=(*attr)->u.itemgra; dbg(lvl_debug,"speed %d-%d %d\n", itm->speed_range.min, itm->speed_range.max, speed); if (speed >= itm->speed_range.min && speed <= itm->speed_range.max && angle >= itm->angle_range.min && angle <= itm->angle_range.max && sequence >= itm->sequence_range.min && sequence <= itm->sequence_range.max) { graphics_draw_itemgra(this_->gra, itm, this_->trans, label); } if (sequence < itm->sequence_range.max) match=1; } ++attr; } graphics_draw_drag(this_->gra, &this_->cursor_pnt); graphics_draw_mode(this_->gra, draw_mode_end); if (this_->animate_callback) { ++this_->sequence; if (cursor->sequence_range && cursor->sequence_range->max < this_->sequence) this_->sequence=cursor->sequence_range->min; if (! match && ! cursor->sequence_range) this_->sequence=0; } } /** * @brief Writes to an NMEA log. * * @param this_ The vehicle supplying data * @param log The log to write to */ static void vehicle_log_nmea(struct vehicle *this_, struct log *log) { struct attr pos_attr; if (!this_->meth.position_attr_get) return; if (!this_->meth.position_attr_get(this_->priv, attr_position_nmea, &pos_attr)) return; log_write(log, pos_attr.u.str, strlen(pos_attr.u.str), 0); } /** * Add a tag to the extensions section of a GPX trackpoint. * * @param tag The tag to add * @param logstr Pointer to a pointer to a string to be inserted into the log. * When calling this function, {@code *logstr} must point to the substring into which the new tag is * to be inserted. If {@code *logstr} is NULL, a new string will be created for the extensions section. * Upon returning, {@code *logstr} will point to the new string with the additional tag inserted. */ void vehicle_log_gpx_add_tag(char *tag, char **logstr) { char *ext_start="\t\n"; char *ext_end="\t\n"; char *trkpt_end=""; char *start=NULL,*end=NULL; if (!*logstr) { start=g_strdup(ext_start); end=g_strdup(ext_end); } else { char *str=strstr(*logstr, ext_start); int len; if (str) { len=str-*logstr+strlen(ext_start); start=g_strdup(*logstr); start[len]='\0'; end=g_strdup(str+strlen(ext_start)); } else { str=strstr(*logstr, trkpt_end); len=str-*logstr; end=g_strdup_printf("%s%s",ext_end,str); str=g_strdup(*logstr); str[len]='\0'; start=g_strdup_printf("%s%s",str,ext_start); g_free(str); } } *logstr=g_strdup_printf("%s%s%s",start,tag,end); g_free(start); g_free(end); } /** * @brief Writes a trackpoint to a GPX log. * * @param this_ The vehicle supplying data * @param log The log to write to */ static void vehicle_log_gpx(struct vehicle *this_, struct log *log) { struct attr attr,*attrp, fix_attr; enum attr_type *attr_types; char *logstr; char *extensions="\t\n"; if (!this_->meth.position_attr_get) return; if (log_get_attr(log, attr_attr_types, &attr, NULL)) attr_types=attr.u.attr_types; else attr_types=NULL; if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { if ( fix_attr.u.num == 0 ) return; } if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &attr)) return; logstr=g_strdup_printf("\n",attr.u.coord_geo->lat,attr.u.coord_geo->lng); if (attr_types && attr_types_contains_default(attr_types, attr_position_time_iso8601, 0)) { if (this_->meth.position_attr_get(this_->priv, attr_position_time_iso8601, &attr)) { logstr=g_strconcat_printf(logstr,"\t\n",attr.u.str); } else { char *timep = current_to_iso8601(); logstr=g_strconcat_printf(logstr,"\t\n",timep); g_free(timep); } } if (this_->gpx_desc) { logstr=g_strconcat_printf(logstr,"\t%s\n",this_->gpx_desc); g_free(this_->gpx_desc); this_->gpx_desc = NULL; } if (attr_types_contains_default(attr_types, attr_position_height,0) && this_->meth.position_attr_get(this_->priv, attr_position_height, &attr)) logstr=g_strconcat_printf(logstr,"\t%.6f\n",*attr.u.numd); // magnetic variation in degrees; we might use position_magnetic_direction and position_direction to figure it out // Height (in meters) of geoid (mean sea level) above WGS84 earth ellipsoid. As defined in NMEA GGA message (field 11, which vehicle_wince.c ignores) // GPS name (arbitrary) // comment // Source of data // Link to additional information (URL) // Text of GPS symbol name // Type (classification) // Type of GPS fix {'none'|'2d'|'3d'|'dgps'|'pps'}, leave out if unknown. Similar to position_fix_type but more detailed. if (attr_types_contains_default(attr_types, attr_position_sats_used,0) && this_->meth.position_attr_get(this_->priv, attr_position_sats_used, &attr)) logstr=g_strconcat_printf(logstr,"\t%d\n",attr.u.num); if (attr_types_contains_default(attr_types, attr_position_hdop,0) && this_->meth.position_attr_get(this_->priv, attr_position_hdop, &attr)) logstr=g_strconcat_printf(logstr,"\t%.6f\n",*attr.u.numd); // , Vertical and position dilution of precision, no corresponding attribute if (attr_types_contains_default(attr_types, attr_position_direction,0) && this_->meth.position_attr_get(this_->priv, attr_position_direction, &attr)) logstr=g_strconcat_printf(logstr,"\t%.1f\n",*attr.u.numd); if (attr_types_contains_default(attr_types, attr_position_speed, 0) && this_->meth.position_attr_get(this_->priv, attr_position_speed, &attr)) logstr=g_strconcat_printf(logstr,"\t%.2f\n",(*attr.u.numd / 3.6)); if (attr_types_contains_default(attr_types, attr_profilename, 0) && (attrp=attr_search(this_->attrs, NULL, attr_profilename))) { logstr=g_strconcat_printf(logstr,"%s\t\t%s\n",extensions,attrp->u.str); extensions=""; } if (attr_types_contains_default(attr_types, attr_position_radius, 0) && this_->meth.position_attr_get(this_->priv, attr_position_radius, &attr)) { logstr=g_strconcat_printf(logstr,"%s\t\t%.2f\n",extensions,*attr.u.numd); extensions=""; } if (!strcmp(extensions,"")) { logstr=g_strconcat_printf(logstr,"\t\n"); } logstr=g_strconcat_printf(logstr,"\n"); callback_list_call_attr_1(this_->cbl, attr_log_gpx, &logstr); log_write(log, logstr, strlen(logstr), 0); g_free(logstr); } /** * @brief Writes to a text log. * * @param this_ The vehicle supplying data * @param log The log to write to */ static void vehicle_log_textfile(struct vehicle *this_, struct log *log) { struct attr pos_attr,fix_attr; char *logstr; if (!this_->meth.position_attr_get) return; if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { if (fix_attr.u.num == 0) return; } if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr)) return; logstr=g_strdup_printf("%f %f type=trackpoint\n", pos_attr.u.coord_geo->lng, pos_attr.u.coord_geo->lat); callback_list_call_attr_1(this_->cbl, attr_log_textfile, &logstr); log_write(log, logstr, strlen(logstr), 0); } /** * @brief Writes to a binary log. * * @param this_ The vehicle supplying data * @param log The log to write to */ static void vehicle_log_binfile(struct vehicle *this_, struct log *log) { struct attr pos_attr, fix_attr; int *buffer; int *buffer_new; int len,limit=1024,done=0,radius=25; struct coord c; enum log_flags flags; if (!this_->meth.position_attr_get) return; if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { if (fix_attr.u.num == 0) return; } if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr)) return; transform_from_geo(projection_mg, pos_attr.u.coord_geo, &c); if (!c.x || !c.y) return; while (!done) { buffer=log_get_buffer(log, &len); if (! buffer || !len) { buffer_new=g_malloc(5*sizeof(int)); buffer_new[0]=2; buffer_new[1]=type_track; buffer_new[2]=0; } else { buffer_new=g_malloc((buffer[0]+3)*sizeof(int)); memcpy(buffer_new, buffer, (buffer[0]+1)*sizeof(int)); } dbg(lvl_debug,"c=0x%x,0x%x\n",c.x,c.y); buffer_new[buffer_new[0]+1]=c.x; buffer_new[buffer_new[0]+2]=c.y; buffer_new[0]+=2; buffer_new[2]+=2; if (buffer_new[2] > limit) { int count=buffer_new[2]/2; struct coord *out=g_alloca(sizeof(struct coord)*(count)); struct coord *in=(struct coord *)(buffer_new+3); int count_out=transform_douglas_peucker(in, count, radius, out); memcpy(in, out, count_out*2*sizeof(int)); buffer_new[0]+=(count_out-count)*2; buffer_new[2]+=(count_out-count)*2; flags=log_flag_replace_buffer|log_flag_force_flush|log_flag_truncate; } else { flags=log_flag_replace_buffer|log_flag_keep_pointer|log_flag_keep_buffer|log_flag_force_flush; done=1; } log_write(log, (char *)buffer_new, (buffer_new[0]+1)*sizeof(int), flags); } } /** * @brief Registers a new log to receive data. * * @param this_ The vehicle supplying data * @param log The log to write to * * @return False if the log is of an unknown type, true otherwise (including when {@code attr_type} is missing). */ static int vehicle_add_log(struct vehicle *this_, struct log *log) { struct callback *cb; struct attr type_attr; if (!log_get_attr(log, attr_type, &type_attr, NULL)) return 1; if (!strcmp(type_attr.u.str, "nmea")) { cb=callback_new_attr_2(callback_cast(vehicle_log_nmea), attr_position_coord_geo, this_, log); } else if (!strcmp(type_attr.u.str, "gpx")) { char *header = "\n" "\n" "\n" "\n"; char *trailer = "\n\n\n"; log_set_header(log, header, strlen(header)); log_set_trailer(log, trailer, strlen(trailer)); cb=callback_new_attr_2(callback_cast(vehicle_log_gpx), attr_position_coord_geo, this_, log); } else if (!strcmp(type_attr.u.str, "textfile")) { char *header = "type=track\n"; log_set_header(log, header, strlen(header)); cb=callback_new_attr_2(callback_cast(vehicle_log_textfile), attr_position_coord_geo, this_, log); } else if (!strcmp(type_attr.u.str, "binfile")) { cb=callback_new_attr_2(callback_cast(vehicle_log_binfile), attr_position_coord_geo, this_, log); } else return 0; g_hash_table_insert(this_->log_to_cb, log, cb); callback_list_add(this_->cbl, cb); return 1; } struct object_func vehicle_func = { attr_vehicle, (object_func_new)vehicle_new, (object_func_get_attr)vehicle_get_attr, (object_func_iter_new)vehicle_attr_iter_new, (object_func_iter_destroy)vehicle_attr_iter_destroy, (object_func_set_attr)vehicle_set_attr, (object_func_add_attr)vehicle_add_attr, (object_func_remove_attr)vehicle_remove_attr, (object_func_init)NULL, (object_func_destroy)vehicle_destroy, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/vehicle.h000066400000000000000000000043441264204753600166420ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_VEHICLE_H #define NAVIT_VEHICLE_H #ifdef __cplusplus extern "C" { #endif struct point; struct vehicle_priv; struct vehicle_methods { void (*destroy)(struct vehicle_priv *priv); int (*position_attr_get)(struct vehicle_priv *priv, enum attr_type type, struct attr *attr); int (*set_attr)(struct vehicle_priv *priv, struct attr *attr); }; /* prototypes */ enum attr_type; struct attr; struct attr_iter; struct cursor; struct graphics; struct point; struct vehicle; struct vehicle *vehicle_new(struct attr *parent, struct attr **attrs); void vehicle_destroy(struct vehicle *this_); struct attr_iter *vehicle_attr_iter_new(void); void vehicle_attr_iter_destroy(struct attr_iter *iter); int vehicle_get_attr(struct vehicle *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int vehicle_set_attr(struct vehicle *this_, struct attr *attr); int vehicle_add_attr(struct vehicle *this_, struct attr *attr); int vehicle_remove_attr(struct vehicle *this_, struct attr *attr); void vehicle_set_cursor(struct vehicle *this_, struct cursor *cursor, int overwrite); void vehicle_draw(struct vehicle *this_, struct graphics *gra, struct point *pnt, int angle, int speed); int vehicle_get_cursor_data(struct vehicle *this_, struct point *pnt, int *angle, int *speed); void vehicle_log_gpx_add_tag(char *tag, char **logstr); struct vehicle * vehicle_ref(struct vehicle *this_); void vehicle_unref(struct vehicle *this_); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/vehicle/000077500000000000000000000000001264204753600164645ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/Makefile.am000066400000000000000000000007351264204753600205250ustar00rootroot00000000000000SUBDIRS= if VEHICLE_MAEMO SUBDIRS += maemo endif if VEHICLE_ANDROID SUBDIRS += android endif if VEHICLE_IPHONE SUBDIRS += iphone endif if VEHICLE_DEMO SUBDIRS += demo endif if VEHICLE_FILE SUBDIRS += file endif if VEHICLE_GPSD SUBDIRS += gpsd endif if VEHICLE_GPSD_DBUS SUBDIRS += gpsd_dbus endif if VEHICLE_GYPSY SUBDIRS += gypsy endif if VEHICLE_NULL SUBDIRS += null endif if VEHICLE_WINCE SUBDIRS += wince endif if VEHICLE_WEBOS SUBDIRS += webos endif navit-0.5.0+dfsg.1/navit/vehicle/android/000077500000000000000000000000001264204753600201045ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/android/CMakeLists.txt000066400000000000000000000000661264204753600226460ustar00rootroot00000000000000module_add_library(vehicle_android vehicle_android.c) navit-0.5.0+dfsg.1/navit/vehicle/android/Makefile.am000066400000000000000000000004411264204753600221370ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_android modulevehicle_LTLIBRARIES = libvehicle_android.la libvehicle_android_la_SOURCES = vehicle_android.c libvehicle_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/vehicle/android/vehicle_android.c000066400000000000000000000244271264204753600234000ustar00rootroot00000000000000/** @file vehicle_android.c * @brief android uses dbus signals * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * @Author Tim Niemeyer * @date 2008-2009 */ #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "android.h" #include "vehicle.h" struct vehicle_priv { struct callback_list *cbl; struct coord_geo geo; /**< The last known position of the vehicle **/ double speed; /**< Speed in km/h **/ double direction; /**< Bearing in degrees **/ double height; /**< Elevation in meters **/ double radius; /**< Position accuracy in meters **/ int fix_type; /**< Type of last fix (1 = valid, 0 = invalid) **/ time_t fix_time; /**< Timestamp of last fix (not used) **/ char fixiso8601[128]; /**< Timestamp of last fix in ISO 8601 format **/ int sats; /**< Number of satellites in view **/ int sats_used; /**< Number of satellites used in fix **/ int valid; /**< Whether the vehicle coordinates in {@code geo} are valid **/ struct attr ** attrs; struct callback *pcb; /**< The callback function for position updates **/ struct callback *scb; /**< The callback function for status updates **/ struct callback *fcb; /**< The callback function for fix status updates **/ jclass NavitVehicleClass; /**< The {@code NavitVehicle} class **/ jobject NavitVehicle; /**< An instance of {@code NavitVehicle} **/ jclass LocationClass; /**< Android's {@code Location} class **/ jmethodID Location_getLatitude, Location_getLongitude, Location_getSpeed, Location_getBearing, Location_getAltitude, Location_getTime, Location_getAccuracy; }; /** * @brief Free the android_vehicle * * @param priv vehicle_priv structure for the vehicle * @returns nothing */ static void vehicle_android_destroy(struct vehicle_priv *priv) { dbg(lvl_debug,"enter\n"); g_free(priv); } /** * @brief Retrieves a vehicle attribute. * * @param priv vehicle_priv structure for the vehicle * @param type The attribute type to retrieve * @param attr Points to an attr structure that will receive the attribute data * @returns True for success, false for failure */ static int vehicle_android_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { dbg(lvl_debug,"enter %s\n",attr_to_name(type)); switch (type) { case attr_position_fix_type: attr->u.num = priv->fix_type; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_radius: attr->u.numd = &priv->radius; break; case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; if (priv->valid == attr_position_valid_invalid) return 0; break; case attr_position_time_iso8601: attr->u.str=priv->fixiso8601; break; case attr_position_valid: attr->u.num = priv->valid; break; default: return 0; } dbg(lvl_debug,"ok\n"); attr->type = type; return 1; } struct vehicle_methods vehicle_android_methods = { vehicle_android_destroy, vehicle_android_position_attr_get, }; /** * @brief Called when a new position has been reported * * This function is called by {@code NavitLocationListener} upon receiving a new {@code Location}. * * @param v The {@code struct_vehicle_priv} for the vehicle * @param location A {@code Location} object describing the new position */ static void vehicle_android_position_callback(struct vehicle_priv *v, jobject location) { time_t tnow; struct tm *tm; dbg(lvl_debug,"enter\n"); v->geo.lat = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLatitude); v->geo.lng = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLongitude); v->speed = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getSpeed)*3.6; v->direction = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getBearing); v->height = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getAltitude); v->radius = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getAccuracy); tnow=(*jnienv)->CallLongMethod(jnienv, location, v->Location_getTime)/1000; tm = gmtime(&tnow); strftime(v->fixiso8601, sizeof(v->fixiso8601), "%Y-%m-%dT%TZ", tm); dbg(lvl_debug,"lat %f lon %f time %s\n",v->geo.lat,v->geo.lng,v->fixiso8601); if (v->valid != attr_position_valid_valid) { v->valid = attr_position_valid_valid; callback_list_call_attr_0(v->cbl, attr_position_valid); } callback_list_call_attr_0(v->cbl, attr_position_coord_geo); } /** * @brief Called when a new GPS status has been reported * * This function is called by {@code NavitLocationListener} upon receiving a new {@code GpsStatus}. * * Note that {@code sats_used} should not be used to determine whether the vehicle's position is valid: * some devices report non-zero numbers even when they do not have a fix. Position validity should be * determined in {@code vehicle_android_fix_callback} (an invalid fix type means we have lost the fix) * and {@code vehicle_android_position_callback} (receiving a position means we have a fix). * * @param v The {@code struct_vehicle_priv} for the vehicle * @param sats_in_view The number of satellites in view * @param sats_used The number of satellites currently used to determine the position */ static void vehicle_android_status_callback(struct vehicle_priv *v, int sats_in_view, int sats_used) { if (v->sats != sats_in_view) { v->sats = sats_in_view; callback_list_call_attr_0(v->cbl, attr_position_qual); } if (v->sats_used != sats_used) { v->sats_used = sats_used; callback_list_call_attr_0(v->cbl, attr_position_sats_used); } } /** * @brief Called when a change in GPS fix status has been reported * * This function is called by {@code NavitLocationListener} upon receiving a new {@code android.location.GPS_FIX_CHANGE} broadcast. * * @param v The {@code struct_vehicle_priv} for the vehicle * @param fix_type The fix type (1 = valid, 0 = invalid) */ static void vehicle_android_fix_callback(struct vehicle_priv *v, int fix_type) { if (v->fix_type != fix_type) { v->fix_type = fix_type; callback_list_call_attr_0(v->cbl, attr_position_fix_type); if (!fix_type && (v->valid == attr_position_valid_valid)) { v->valid = attr_position_valid_extrapolated_time; callback_list_call_attr_0(v->cbl, attr_position_valid); } } } /** * @brief Initializes an Android vehicle * * @return True on success, false on failure */ static int vehicle_android_init(struct vehicle_priv *ret) { jmethodID cid; if (!android_find_class_global("android/location/Location", &ret->LocationClass)) return 0; if (!android_find_method(ret->LocationClass, "getLatitude", "()D", &ret->Location_getLatitude)) return 0; if (!android_find_method(ret->LocationClass, "getLongitude", "()D", &ret->Location_getLongitude)) return 0; if (!android_find_method(ret->LocationClass, "getSpeed", "()F", &ret->Location_getSpeed)) return 0; if (!android_find_method(ret->LocationClass, "getBearing", "()F", &ret->Location_getBearing)) return 0; if (!android_find_method(ret->LocationClass, "getAltitude", "()D", &ret->Location_getAltitude)) return 0; if (!android_find_method(ret->LocationClass, "getTime", "()J", &ret->Location_getTime)) return 0; if (!android_find_method(ret->LocationClass, "getAccuracy", "()F", &ret->Location_getAccuracy)) return 0; if (!android_find_class_global("org/navitproject/navit/NavitVehicle", &ret->NavitVehicleClass)) return 0; dbg(lvl_debug,"at 3\n"); cid = (*jnienv)->GetMethodID(jnienv, ret->NavitVehicleClass, "", "(Landroid/content/Context;III)V"); if (cid == NULL) { dbg(lvl_error,"no method found\n"); return 0; /* exception thrown */ } dbg(lvl_debug, "at 4 android_activity=%p\n", android_activity); ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_activity, (int) ret->pcb, (int) ret->scb, (int) ret->fcb); dbg(lvl_debug,"result=%p\n",ret->NavitVehicle); if (!ret->NavitVehicle) return 0; if (ret->NavitVehicle) ret->NavitVehicle = (*jnienv)->NewGlobalRef(jnienv, ret->NavitVehicle); return 1; } /** * @brief Create android_vehicle * * @param meth * @param cbl * @param attrs * @returns vehicle_priv */ static struct vehicle_priv * vehicle_android_new_android(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; dbg(lvl_debug, "enter\n"); ret = g_new0(struct vehicle_priv, 1); ret->cbl = cbl; ret->pcb = callback_new_1(callback_cast(vehicle_android_position_callback), ret); ret->scb = callback_new_1(callback_cast(vehicle_android_status_callback), ret); ret->fcb = callback_new_1(callback_cast(vehicle_android_fix_callback), ret); ret->valid = attr_position_valid_invalid; ret->sats = 0; ret->sats_used = 0; *meth = vehicle_android_methods; vehicle_android_init(ret); dbg(lvl_debug, "return\n"); return ret; } /** * @brief register vehicle_android * * @returns nothing */ void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("android", vehicle_android_new_android); } navit-0.5.0+dfsg.1/navit/vehicle/demo/000077500000000000000000000000001264204753600174105ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/demo/CMakeLists.txt000066400000000000000000000000601264204753600221440ustar00rootroot00000000000000module_add_library(vehicle_demo vehicle_demo.c) navit-0.5.0+dfsg.1/navit/vehicle/demo/Makefile.am000066400000000000000000000005201264204753600214410ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_demo if PLUGINS modulevehicle_LTLIBRARIES = libvehicle_demo.la else noinst_LTLIBRARIES = libvehicle_demo.la endif libvehicle_demo_la_SOURCES = vehicle_demo.c libvehicle_demo_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/vehicle/demo/vehicle_demo.c000066400000000000000000000175731264204753600222140ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "config.h" #include "debug.h" #include "coord.h" #include "item.h" #include "navit.h" #include "map.h" #include "route.h" #include "callback.h" #include "transform.h" #include "plugin.h" #include "vehicle.h" #include "event.h" #include "util.h" struct vehicle_priv { int interval; int position_set; struct callback_list *cbl; struct navit *navit; struct route *route; struct coord_geo geo; struct coord last; double config_speed; double speed; double direction; struct callback *timer_callback; struct event_timeout *timer; char *timep; char *nmea; enum attr_position_valid valid; /**< Whether the vehicle has valid position data **/ }; static void vehicle_demo_destroy(struct vehicle_priv *priv) { if (priv->timer) event_remove_timeout(priv->timer); callback_destroy(priv->timer_callback); g_free(priv->timep); g_free(priv); } static void nmea_chksum(char *nmea) { int i; if (nmea && strlen(nmea) > 3) { unsigned char csum=0; for (i = 1 ; i < strlen(nmea)-4 ; i++) csum^=(unsigned char)(nmea[i]); sprintf(nmea+strlen(nmea)-3,"%02X\n",csum); } } static int vehicle_demo_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { char ns='N',ew='E',*timep,*rmc,*gga; int hr,min,sec,year,mon,day; double lat,lng; switch (type) { case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_time_iso8601: g_free(priv->timep); priv->timep=current_to_iso8601(); attr->u.str=priv->timep; break; case attr_position_fix_type: attr->u.num = 2; break; case attr_position_sats_used: attr->u.num = 9; break; case attr_position_nmea: lat=priv->geo.lat; if (lat < 0) { lat=-lat; ns='S'; } lng=priv->geo.lng; if (lng < 0) { lng=-lng; ew='W'; } timep=current_to_iso8601(); sscanf(timep,"%d-%d-%dT%d:%d:%d",&year,&mon,&day,&hr,&min,&sec); g_free(timep); gga=g_strdup_printf("$GPGGA,%02d%02d%02d,%02.0f%07.4f,%c,%03.0f%07.4f,%c,1,08,2.5,0,M,,,,0000* \n",hr,min,sec,floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew); nmea_chksum(gga); rmc=g_strdup_printf("$GPRMC,%02d%02d%02d,A,%02.0f%07.4f,%c,%03.0f%07.4f,%c,%3.1f,%3.1f,%02d%02d%02d,,* \n",hr,min,sec,floor(lat),(lat-floor(lat))*60.0,ns,floor(lng),(lng-floor(lng))*60,ew,priv->speed/1.852,(double)priv->direction,day,mon,year%100); nmea_chksum(rmc); g_free(priv->nmea); priv->nmea=g_strdup_printf("%s%s",gga,rmc); g_free(gga); g_free(rmc); attr->u.str=priv->nmea; break; case attr_position_valid: attr->u.num=priv->valid; break; default: return 0; } attr->type = type; return 1; } static int vehicle_demo_set_attr_do(struct vehicle_priv *priv, struct attr *attr) { switch(attr->type) { case attr_navit: priv->navit = attr->u.navit; break; case attr_route: priv->route = attr->u.route; break; case attr_speed: priv->config_speed=attr->u.num; break; case attr_interval: priv->interval=attr->u.num; if (priv->timer) event_remove_timeout(priv->timer); priv->timer=event_add_timeout(priv->interval, 1, priv->timer_callback); break; case attr_position_coord_geo: priv->geo=*(attr->u.coord_geo); if (priv->valid != attr_position_valid_valid) { priv->valid = attr_position_valid_valid; callback_list_call_attr_0(priv->cbl, attr_position_valid); } priv->position_set=1; dbg(lvl_debug,"position_set %f %f\n", priv->geo.lat, priv->geo.lng); break; case attr_profilename: case attr_source: case attr_name: // Ignore; used by Navit's infrastructure, but not relevant for this vehicle. break; default: dbg(lvl_error,"unsupported attribute %s\n",attr_to_name(attr->type)); return 0; } return 1; } static int vehicle_demo_set_attr(struct vehicle_priv *priv, struct attr *attr) { return vehicle_demo_set_attr_do(priv, attr); } struct vehicle_methods vehicle_demo_methods = { vehicle_demo_destroy, vehicle_demo_position_attr_get, vehicle_demo_set_attr, }; static void vehicle_demo_timer(struct vehicle_priv *priv) { struct coord c, c2, pos, ci; int slen, len, dx, dy; struct route *route=NULL; struct map *route_map=NULL; struct map_rect *mr=NULL; struct item *item=NULL; len = (priv->config_speed * priv->interval / 1000)/ 3.6; dbg(lvl_debug, "###### Entering simulation loop\n"); if (!priv->config_speed) return; if (priv->route) route=priv->route; else if (priv->navit) route=navit_get_route(priv->navit); if (route) route_map=route_get_map(route); if (route_map) mr=map_rect_new(route_map, NULL); if (mr) item=map_rect_get_item(mr); if (item && item->type == type_route_start) item=map_rect_get_item(mr); while(item && item->type!=type_street_route) item=map_rect_get_item(mr); if (item && item_coord_get(item, &pos, 1)) { priv->position_set=0; dbg(lvl_debug, "current pos=0x%x,0x%x\n", pos.x, pos.y); dbg(lvl_debug, "last pos=0x%x,0x%x\n", priv->last.x, priv->last.y); if (priv->last.x == pos.x && priv->last.y == pos.y) { dbg(lvl_warning, "endless loop\n"); } priv->last = pos; while (item && priv->config_speed) { if (!item_coord_get(item, &c, 1)) { item=map_rect_get_item(mr); continue; } dbg(lvl_debug, "next pos=0x%x,0x%x\n", c.x, c.y); slen = transform_distance(projection_mg, &pos, &c); dbg(lvl_debug, "len=%d slen=%d\n", len, slen); if (slen < len) { len -= slen; pos = c; } else { if (item_coord_get(item, &c2, 1) || map_rect_get_item(mr)) { dx = c.x - pos.x; dy = c.y - pos.y; ci.x = pos.x + dx * len / slen; ci.y = pos.y + dy * len / slen; priv->direction = transform_get_angle_delta(&pos, &c, 0); priv->speed=priv->config_speed; } else { ci.x = pos.x; ci.y = pos.y; priv->speed=0; dbg(lvl_debug,"destination reached\n"); } dbg(lvl_debug, "ci=0x%x,0x%x\n", ci.x, ci.y); transform_to_geo(projection_mg, &ci, &priv->geo); if (priv->valid != attr_position_valid_valid) { priv->valid = attr_position_valid_valid; callback_list_call_attr_0(priv->cbl, attr_position_valid); } callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); break; } } } else { if (priv->position_set) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } if (mr) map_rect_destroy(mr); } static struct vehicle_priv * vehicle_demo_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; dbg(lvl_debug, "enter\n"); ret = g_new0(struct vehicle_priv, 1); ret->cbl = cbl; ret->interval=1000; ret->config_speed=40; ret->timer_callback=callback_new_1(callback_cast(vehicle_demo_timer), ret); ret->valid = attr_position_valid_invalid; *meth = vehicle_demo_methods; while (attrs && *attrs) vehicle_demo_set_attr_do(ret, *attrs++); if (!ret->timer) ret->timer=event_add_timeout(ret->interval, 1, ret->timer_callback); return ret; } void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("demo", vehicle_demo_new); } navit-0.5.0+dfsg.1/navit/vehicle/file/000077500000000000000000000000001264204753600174035ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/file/CMakeLists.txt000066400000000000000000000005231264204753600221430ustar00rootroot00000000000000module_add_library(vehicle_file vehicle_file.c) set (vehicle_pipe_TYPE ${vehicle_file_TYPE}) set (vehicle_serial_TYPE ${vehicle_file_TYPE}) set (vehicle_socket_TYPE ${vehicle_file_TYPE}) module_add_library(vehicle_pipe vehicle_pipe.c) module_add_library(vehicle_serial vehicle_serial.c) module_add_library(vehicle_socket vehicle_socket.c) navit-0.5.0+dfsg.1/navit/vehicle/file/Makefile.am000066400000000000000000000016111264204753600214360ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit modulevehicle_LTLIBRARIES = libvehicle_file.la libvehicle_pipe.la libvehicle_socket.la libvehicle_serial.la libvehicle_file_la_CFLAGS=-DMODULE=vehicle_file libvehicle_file_la_SOURCES = vehicle_file.c libvehicle_file_la_LDFLAGS = -module -avoid-version @NAVIT_SOCKET_LDFLAGS@ @NAVIT_MODULE_LDFLAGS@ libvehicle_pipe_la_CFLAGS=-DMODULE=vehicle_pipe libvehicle_pipe_la_SOURCES = vehicle_pipe.c libvehicle_pipe_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ libvehicle_socket_la_CFLAGS=-DMODULE=vehicle_socket libvehicle_socket_la_SOURCES = vehicle_socket.c libvehicle_socket_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ libvehicle_serial_la_CFLAGS=-DMODULE=vehicle_serial libvehicle_serial_la_SOURCES = vehicle_serial.c libvehicle_serial_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/vehicle/file/vehicle_file.c000066400000000000000000000763171264204753600222030ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #include #include #include #include #include #include #ifdef _WIN32 #include #else #include #endif #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "event.h" #include "vehicle.h" #include "file.h" #ifdef HAVE_SOCKET #include #include #include #include #endif #ifdef HAVE_WINSOCK #include int inet_aton(const char *cp, struct in_addr *inp); int inet_aton(const char *cp, struct in_addr *inp) { unsigned long addr = inet_addr(cp); inp->S_un.S_addr = addr; return addr!=-1; } #endif static void vehicle_file_disable_watch(struct vehicle_priv *priv); static void vehicle_file_enable_watch(struct vehicle_priv *priv); static int vehicle_file_parse(struct vehicle_priv *priv, char *buffer); static int vehicle_file_open(struct vehicle_priv *priv); static void vehicle_file_close(struct vehicle_priv *priv); enum file_type { file_type_pipe = 1, file_type_device, file_type_file, file_type_socket, file_type_serial }; static int buffer_size = 1024; struct gps_sat { int prn; int elevation; int azimuth; int snr; }; struct vehicle_priv { char *source; struct callback_list *cbl; int fd; struct callback *cb,*cbt; char *buffer; int buffer_pos; char *nmea_data; char *nmea_data_buf; struct coord_geo geo; double speed; double direction; double height; double hdop; double vdop; char fixtime[20]; int fixyear; int fixmonth; int fixday; int status; int sats_used; int sats_visible; int sats_signal; int time; int on_eof; #ifdef _WIN32 int no_data_count; struct event_timeout * timeout; struct callback *timeout_callback; #endif enum file_type file_type; FILE *file; struct event_watch *watch; speed_t baudrate; struct attr ** attrs; char fixiso8601[128]; int checksum_ignore; int magnetic_direction; int current_count; struct gps_sat current[24]; int next_count; struct gps_sat next[24]; struct item sat_item; int valid; char *statefile; int process_statefile; }; //*************************************************************************** /** @fn static int vehicle_win32_serial_track(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Callback of the plugin ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @return always 1 ***************************************************************************** **/ #ifdef _WIN32 static int vehicle_win32_serial_track(struct vehicle_priv *priv) { static char buffer[2048] = {0,}; static int current_index = 0; const int chunk_size = 1024; int rc = 0; int dwBytes; dbg(lvl_debug, "enter, *priv='%x', priv->source='%s'\n", priv, priv->source); if ( priv->no_data_count > 5 ) { vehicle_file_close( priv ); priv->no_data_count = 0; vehicle_file_open( priv ); vehicle_file_enable_watch(priv); } //if ( priv->fd <= 0 ) //{ // vehicle_file_open( priv ); //} if ( current_index >= ( sizeof( buffer ) - chunk_size ) ) { // discard current_index = 0; memset( buffer, 0 , sizeof( buffer ) ); } dwBytes = serial_io_read( priv->fd, &buffer[ current_index ], chunk_size ); if ( dwBytes > 0 ) { char* return_pos = NULL; current_index += dwBytes; while ( ( return_pos = strchr( buffer, '\n' ) ) != NULL ) { char return_buffer[1024]; int bytes_to_copy = return_pos - buffer + 1; memcpy( return_buffer, buffer, bytes_to_copy ); return_buffer[ bytes_to_copy + 1 ] = '\0'; return_buffer[ bytes_to_copy ] = '\0'; // printf( "received %d : '%s' bytes to copy\n", bytes_to_copy, return_buffer ); rc += vehicle_file_parse( priv, return_buffer ); current_index -= bytes_to_copy; memmove( buffer, &buffer[ bytes_to_copy ] , sizeof( buffer ) - bytes_to_copy ); } if (rc) { priv->no_data_count = 0; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); if (rc > 1) dbg(lvl_error, "Can not keep with gps data delay is %d seconds\n", rc - 1); } } else { priv->no_data_count++; } dbg(lvl_info, "leave, return '1', priv->no_data_count='%d'\n", priv->no_data_count); return 1; } #endif //*************************************************************************** /** @fn static int vehicle_file_open(struct vehicle_priv *priv) ***************************************************************************** * @b Description: open dialogue with the GPS ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @return 1 if ok * 0 if error ***************************************************************************** **/ static int vehicle_file_open(struct vehicle_priv *priv) { char *name; #ifndef _WIN32 struct termios tio; #else #define O_NDELAY 0 #endif name = priv->source + 5; if (!strncmp(priv->source, "file:", 5)) { priv->fd = open(name, O_RDONLY | O_NDELAY); if (priv->fd < 0) return 0; if (file_is_reg(name)) { priv->file_type = file_type_file; } #ifndef _WIN32 else { tcgetattr(priv->fd, &tio); cfmakeraw(&tio); cfsetispeed(&tio, priv->baudrate); cfsetospeed(&tio, priv->baudrate); tio.c_cc[VMIN] = 0; tio.c_cc[VTIME] = 200; tcsetattr(priv->fd, TCSANOW, &tio); priv->file_type = file_type_device; } } else if (!strncmp(priv->source,"pipe:", 5)) { priv->file = popen(name, "r"); if (!priv->file) return 0; priv->fd = fileno(priv->file); priv->file_type = file_type_pipe; #endif //!_WIN32 #if defined(HAVE_SOCKET) || defined(HAVE_WINSOCK) } else if (!strncmp(priv->source,"socket:", 7)) { #ifdef _WIN32 WSADATA wsi; WSAStartup(0x00020002,&wsi); #endif char *p,*s=g_strdup(priv->source+7); struct sockaddr_in sin; p=strchr(s,':'); if (!p) { dbg(lvl_error,"port number missing in %s\n",s); g_free(s); return 0; } *p++='\0'; sin.sin_family=AF_INET; sin.sin_port=ntohs(atoi(p)); if (!inet_aton(s, &sin.sin_addr)) { dbg(lvl_error,"failed to parse %s\n",s); g_free(s); return 0; } priv->fd = socket(PF_INET, SOCK_STREAM, 0); if (priv->fd != -1) { if (connect(priv->fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) { dbg(lvl_error,"failed to connect to %s:%s\n",s,p); g_free(s); return 0; } } p=strchr(p,':'); if (p) { p++; write(priv->fd, p, strlen(p)); } priv->file_type = file_type_socket; #endif //HAVE_SOCKET } else if (!strncmp(priv->source,"serial:",7)) { #ifdef _WIN32 char* raw_setting_str = g_strdup( priv->source ); char* strport = strchr(raw_setting_str, ':' ); char* strsettings = strchr(raw_setting_str, ' ' ); if ( strport && strsettings ) { strport++; *strsettings = '\0'; strsettings++; priv->fd=serial_io_init( strport, strsettings ); } g_free( raw_setting_str ); priv->file_type = file_type_serial; // Add the callback dbg(lvl_info, "Add the callback ...\n", priv->source); priv->timeout_callback=callback_new_1(callback_cast(vehicle_win32_serial_track), priv); #else //TODO - add linux serial #endif //!_WIN32 } return(priv->fd != -1); } //*************************************************************************** /** @fn static void vehicle_file_close(struct vehicle_priv *priv) ***************************************************************************** * @b Description: close dialogue with the GPS ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** **/ static void vehicle_file_close(struct vehicle_priv *priv) { dbg(lvl_debug, "enter, priv->fd='%d'\n", priv->fd); vehicle_file_disable_watch(priv); #ifdef _WIN32 if(priv->file_type == file_type_serial) { if (priv->timeout_callback) { callback_destroy(priv->timeout_callback); priv->timeout_callback=NULL; // dangling pointer! prevent double freeing. } serial_io_shutdown( priv->fd ); } else #endif { if (priv->file) { #ifndef _MSC_VER pclose(priv->file); #endif /* _MSC_VER */ } else if (priv->fd >= 0) { close(priv->fd); } priv->file = NULL; priv->fd = -1; } } //*************************************************************************** /** @fn static int vehicle_file_enable_watch_timer(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Enable watch timer to get GPS data ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @return always 0 ***************************************************************************** **/ static int vehicle_file_enable_watch_timer(struct vehicle_priv *priv) { dbg(lvl_debug, "enter\n"); vehicle_file_enable_watch(priv); return FALSE; } //*************************************************************************** /** @fn static int vehicle_file_parse( struct vehicle_priv *priv, * char *buffer) ***************************************************************************** * @b Description: Parse the buffer ***************************************************************************** * @param priv : pointer on the private data of the plugin * @param buffer : data buffer (null terminated) ***************************************************************************** * @return 1 if The GPRMC Sentence is found * 0 if not found ***************************************************************************** **/ static int vehicle_file_parse(struct vehicle_priv *priv, char *buffer) { char *nmea_data_buf, *p, *item[32]; double lat, lng; int i, j, bcsum; int len = strlen(buffer); unsigned char csum = 0; int valid=0; int ret = 0; dbg(lvl_info, "enter: buffer='%s'\n", buffer); for (;;) { if (len < 4) { dbg(lvl_error, "'%s' too short\n", buffer); return ret; } if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { buffer[--len] = '\0'; if (buffer[len - 1] == '\r') buffer[--len] = '\0'; } else break; } if (buffer[0] != '$') { dbg(lvl_error, "no leading $ in '%s'\n", buffer); return ret; } if (buffer[len - 3] != '*') { dbg(lvl_error, "no *XX in '%s'\n", buffer); return ret; } for (i = 1; i < len - 3; i++) { csum ^= (unsigned char) (buffer[i]); } if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) { dbg(lvl_error, "no checksum in '%s'\n", buffer); return ret; } if (bcsum != csum && priv->checksum_ignore == 0) { dbg(lvl_error, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum); return ret; } if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(lvl_error, "nmea buffer overflow (len %zu), discarding '%s'\n", priv->nmea_data_buf?strlen(priv->nmea_data_buf):-1,buffer); } i = 0; p = buffer; while (i < 31) { item[i++] = p; while (*p && *p != ',') p++; if (!*p) break; *p++ = '\0'; } if (!strncmp(buffer, "$GPGGA", 6)) { /* 1 1111 0 1 2 3 4 5 6 7 8 9 0 1234 $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] */ if (*item[2] && *item[3] && *item[4] && *item[5]) { lat = g_ascii_strtod(item[2], NULL); priv->geo.lat = floor(lat / 100); lat -= priv->geo.lat * 100; priv->geo.lat += lat / 60; if (!g_ascii_strcasecmp(item[3],"S")) priv->geo.lat=-priv->geo.lat; lng = g_ascii_strtod(item[4], NULL); priv->geo.lng = floor(lng / 100); lng -= priv->geo.lng * 100; priv->geo.lng += lng / 60; if (!g_ascii_strcasecmp(item[5],"W")) priv->geo.lng=-priv->geo.lng; priv->valid=attr_position_valid_valid; dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); } else priv->valid=attr_position_valid_invalid; if (*item[6]) sscanf(item[6], "%d", &priv->status); if (*item[7]) sscanf(item[7], "%d", &priv->sats_used); if (*item[8]) sscanf(item[8], "%lf", &priv->hdop); if (*item[1]) strncpy(priv->fixtime, item[1], sizeof(priv->fixtime)); if (*item[9]) sscanf(item[9], "%lf", &priv->height); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; if (priv->file_type == file_type_file) { if (priv->watch) { vehicle_file_disable_watch(priv); event_add_timeout(priv->time, 0, priv->cbt); } } } if (!strncmp(buffer, "$GPVTG", 6)) { /* 0 1 2 34 5 6 7 8 $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] */ if (item[1] && item[7]) valid = 1; if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[1], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); dbg(lvl_info,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed); } } if (!strncmp(buffer, "$GPRMC", 6)) { /* 1 1 0 1 2 3 4 5 6 7 8 9 0 1 $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], magnetic variation[10],magnetic variation direction[11] */ if (*item[2] == 'A') valid = 1; if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[8], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); priv->speed *= 1.852; sscanf(item[9], "%02d%02d%02d", &priv->fixday, &priv->fixmonth, &priv->fixyear); priv->fixyear += 2000; } ret = 1; } if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { /* 0 GSV Satellites in view 1 2 Number of sentences for full data 2 1 sentence 1 of 2 3 08 Number of satellites in view 4 01 Satellite PRN number 5 40 Elevation, degrees 6 083 Azimuth, degrees 7 46 SNR - higher is better for up to 4 satellites per sentence *75 the checksum data, always begins with * */ if (item[3]) { sscanf(item[3], "%d", &priv->sats_visible); } j=4; while (j+4 <= i && priv->current_count < 24) { struct gps_sat *sat=&priv->next[priv->next_count++]; sat->prn=atoi(item[j]); sat->elevation=atoi(item[j+1]); sat->azimuth=atoi(item[j+2]); sat->snr=atoi(item[j+3]); j+=4; } if (!strcmp(item[1], item[2])) { priv->sats_signal=0; for (i = 0 ; i < priv->next_count ; i++) { priv->current[i]=priv->next[i]; if (priv->current[i].snr) priv->sats_signal++; } priv->current_count=priv->next_count; priv->next_count=0; } } if (!strncmp(buffer, "$GPZDA", 6)) { /* 0 1 2 3 4 5 6 $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC hhmmss HrMinSec(UTC) dd,mm,yyy Day,Month,Year xx local zone hours -13..13 yy local zone minutes 0..59 */ if (item[1] && item[2] && item[3] && item[4]) { strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); priv->fixday = atoi(item[2]); priv->fixmonth = atoi(item[3]); priv->fixyear = atoi(item[4]); } } if (!strncmp(buffer, "$IISMD", 6)) { /* 0 1 2 3 4 $IISMD,dir,press,height,temp*CC" dir Direction (0-359) press Pressure (hpa, i.e. 1032) height Barometric height above ground (meter) temp Temperature (Degree Celsius) */ if (item[1]) { priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); dbg(lvl_debug,"magnetic %d\n", priv->magnetic_direction); } } return ret; } //*************************************************************************** /** @fn static void vehicle_file_io(struct vehicle_priv *priv) ***************************************************************************** * @b Description: function to get data from GPS ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @remarks ***************************************************************************** **/ static void vehicle_file_io(struct vehicle_priv *priv) { int size, rc = 0; char *str, *tok; dbg(lvl_debug, "vehicle_file_io : enter\n"); if (priv->process_statefile) { unsigned char *data; priv->process_statefile=0; if (file_get_contents(priv->statefile, &data, &size)) { if (size > buffer_size) size=buffer_size; memcpy(priv->buffer, data, size); priv->buffer_pos=0; g_free(data); } else return; } else { size = read(priv->fd, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); } if (size <= 0) { switch (priv->on_eof) { case 0: vehicle_file_close(priv); vehicle_file_open(priv); break; case 1: vehicle_file_disable_watch(priv); break; case 2: exit(0); break; } return; } priv->buffer_pos += size; priv->buffer[priv->buffer_pos] = '\0'; dbg(lvl_debug, "size=%d pos=%d buffer='%s'\n", size, priv->buffer_pos, priv->buffer); str = priv->buffer; while ((tok = strchr(str, '\n'))) { *tok++ = '\0'; dbg(lvl_debug, "line='%s'\n", str); rc +=vehicle_file_parse(priv, str); str = tok; if (priv->file_type == file_type_file && rc) break; } if (str != priv->buffer) { size = priv->buffer + priv->buffer_pos - str; memmove(priv->buffer, str, size + 1); priv->buffer_pos = size; dbg(lvl_debug, "now pos=%d buffer='%s'\n", priv->buffer_pos, priv->buffer); } else if (priv->buffer_pos == buffer_size - 1) { dbg(lvl_debug, "Overflow. Most likely wrong baud rate or no nmea protocol\n"); priv->buffer_pos = 0; } if (rc) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } //*************************************************************************** /** @fn static void vehicle_file_enable_watch(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Enable watch ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** **/ static void vehicle_file_enable_watch(struct vehicle_priv *priv) { dbg(lvl_debug, "enter\n"); #ifdef _WIN32 // add an event : don't use glib timers and g_timeout_add if (priv->file_type == file_type_serial) { if (priv->timeout_callback != NULL) priv->timeout = event_add_timeout(500, 1, priv->timeout_callback); else dbg(lvl_warning, "error : watch not enabled : priv->timeout_callback is null\n"); } else #endif { if (! priv->watch) priv->watch = event_add_watch(priv->fd, event_watch_cond_read, priv->cb); } } //*************************************************************************** /** @fn static void vehicle_file_disable_watch(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Disable watch ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** **/ static void vehicle_file_disable_watch(struct vehicle_priv *priv) { dbg(lvl_debug, "vehicle_file_disable_watch : enter\n"); #ifdef _WIN32 if(priv->file_type == file_type_serial) { if (priv->timeout) { event_remove_timeout(priv->timeout); priv->timeout=NULL; // dangling pointer! prevent double freeing. } } else #endif //!_WIN32 { if (priv->watch) event_remove_watch(priv->watch); priv->watch = NULL; } } //*************************************************************************** /** @fn static void vehicle_priv vehicle_file_destroy(struct vehicle_priv *priv) ***************************************************************************** * @b Description: Function called to uninitialize the plugin ***************************************************************************** * @param priv : pointer on the private data of the plugin ***************************************************************************** * @remarks private data is freed by this function (g_free) ***************************************************************************** **/ static void vehicle_file_destroy(struct vehicle_priv *priv) { if (priv->statefile && priv->nmea_data) { struct attr readwrite={attr_readwrite}; struct attr create={attr_create}; struct attr *attrs[]={&readwrite,&create,NULL}; struct file *f; readwrite.u.num=1; create.u.num=1; f=file_create(priv->statefile, attrs); if (f) { file_data_write(f, 0, strlen(priv->nmea_data), priv->nmea_data); file_fsync(f); file_destroy(f); } } vehicle_file_close(priv); callback_destroy(priv->cb); callback_destroy(priv->cbt); if (priv->statefile) g_free(priv->statefile); if (priv->source) g_free(priv->source); if (priv->buffer) g_free(priv->buffer); g_free(priv); } //*************************************************************************** /** @fn static int vehicle_file_position_attr_get(struct vehicle_priv *priv, * enum attr_type type, * struct attr *attr) ***************************************************************************** * @b Description: Function called to get attribute ***************************************************************************** * @param priv : pointer on the private data of the plugin * @param type : attribute type called * @param attr : structure to return the attribute value ***************************************************************************** * @return 1 if ok * 0 for unkown or invalid attribute ***************************************************************************** **/ static int vehicle_file_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_fix_type: attr->u.num = priv->status; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_magnetic_direction: attr->u.num = priv->magnetic_direction; break; case attr_position_hdop: attr->u.numd = &priv->hdop; break; case attr_position_qual: attr->u.num = priv->sats_visible; break; case attr_position_sats_signal: attr->u.num = priv->sats_signal; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_nmea: attr->u.str=priv->nmea_data; if (! attr->u.str) return 0; break; case attr_position_time_iso8601: if (!priv->fixyear || !priv->fixtime[0]) return 0; sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ", priv->fixyear, priv->fixmonth, priv->fixday, priv->fixtime, (priv->fixtime+2), (priv->fixtime+4)); attr->u.str=priv->fixiso8601; break; case attr_position_sat_item: dbg(lvl_debug,"at here\n"); priv->sat_item.id_lo++; if (priv->sat_item.id_lo > priv->current_count) { priv->sat_item.id_lo=0; return 0; } attr->u.item=&priv->sat_item; break; case attr_position_valid: attr->u.num=priv->valid; break; default: return 0; } if (type != attr_position_sat_item) priv->sat_item.id_lo=0; attr->type = type; return 1; } //*************************************************************************** /** @fn static int vehicle_file_sat_attr_get(struct vehicle_priv *priv, * enum attr_type type, * struct attr *attr) ***************************************************************************** * @b Description: Function called to get satellite attribute ***************************************************************************** * @param priv : pointer on the private data of the plugin * @param type : attribute type called * @param attr : structure to return the attribute value ***************************************************************************** * @return 1 if ok * 0 for unkown attribute ***************************************************************************** **/ static int vehicle_file_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) { struct gps_sat *sat; struct vehicle_priv *priv=priv_data; if (priv->sat_item.id_lo < 1) return 0; if (priv->sat_item.id_lo > priv->current_count) return 0; sat=&priv->current[priv->sat_item.id_lo-1]; switch (type) { case attr_sat_prn: attr->u.num=sat->prn; break; case attr_sat_elevation: attr->u.num=sat->elevation; break; case attr_sat_azimuth: attr->u.num=sat->azimuth; break; case attr_sat_snr: attr->u.num=sat->snr; break; default: return 0; } attr->type = type; return 1; } static struct item_methods vehicle_file_sat_methods = { NULL, NULL, NULL, vehicle_file_sat_attr_get, }; static struct vehicle_methods vehicle_file_methods = { vehicle_file_destroy, vehicle_file_position_attr_get, }; //*************************************************************************** /** @fn static struct vehicle_priv * vehicle_file_new_file( * struct vehicle_methods *meth, * struct callback_list *cbl, * struct attr **attrs) ***************************************************************************** * @b Description: Function called to initialize the plugin ***************************************************************************** * @param meth : ? * @param cbl : ? * @param attrs : ? ***************************************************************************** * @return pointer on the private data of the plugin ***************************************************************************** * @remarks private data is allocated by this function (g_new0) ***************************************************************************** **/ static struct vehicle_priv * vehicle_file_new_file(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source; struct attr *time; struct attr *on_eof; struct attr *baudrate; struct attr *checksum_ignore; struct attr *state_file; dbg(lvl_debug, "enter\n"); source = attr_search(attrs, NULL, attr_source); if(source == NULL){ dbg(lvl_error,"Missing source attribute"); return NULL; } ret = g_new0(struct vehicle_priv, 1); // allocate and initialize to 0 ret->fd = -1; ret->cbl = cbl; ret->source = g_strdup(source->u.str); ret->buffer = g_malloc(buffer_size); ret->time=1000; ret->baudrate=B4800; state_file=attr_search(attrs, NULL, attr_state_file); if (state_file) ret->statefile=g_strdup(state_file->u.str); time = attr_search(attrs, NULL, attr_time); if (time) ret->time=time->u.num; baudrate = attr_search(attrs, NULL, attr_baudrate); if (baudrate) { switch (baudrate->u.num) { case 4800: ret->baudrate=B4800; break; case 9600: ret->baudrate=B9600; break; case 19200: ret->baudrate=B19200; break; #ifdef B38400 case 38400: ret->baudrate=B38400; break; #endif #ifdef B57600 case 57600: ret->baudrate=B57600; break; #endif #ifdef B115200 case 115200: ret->baudrate=B115200; break; #endif } } checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore); if (checksum_ignore) ret->checksum_ignore=checksum_ignore->u.num; ret->attrs = attrs; on_eof = attr_search(attrs, NULL, attr_on_eof); if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "stop")) ret->on_eof=1; if (on_eof && !g_ascii_strcasecmp(on_eof->u.str, "exit")) ret->on_eof=2; dbg(lvl_debug,"on_eof=%d\n", ret->on_eof); *meth = vehicle_file_methods; ret->cb=callback_new_1(callback_cast(vehicle_file_io), ret); ret->cbt=callback_new_1(callback_cast(vehicle_file_enable_watch_timer), ret); if (ret->statefile && file_exists(ret->statefile)) { ret->process_statefile=1; event_add_timeout(1000, 0, ret->cb); } ret->sat_item.type=type_position_sat; ret->sat_item.id_hi=ret->sat_item.id_lo=0; ret->sat_item.priv_data=ret; ret->sat_item.meth=&vehicle_file_sat_methods; #ifdef _WIN32 ret->no_data_count = 0; #endif dbg(lvl_debug, "vehicle_file_new_file:open\n"); if (!vehicle_file_open(ret)) { dbg(lvl_error, "Failed to open '%s'\n", ret->source); } vehicle_file_enable_watch(ret); // vehicle_file_destroy(ret); // return NULL; dbg(lvl_debug, "leave\n"); return ret; } //*************************************************************************** /** @fn void plugin_init(void) ***************************************************************************** * @b Description: Initialisation of vehicle_file plugin ***************************************************************************** **/ void plugin_init(void) { dbg(lvl_debug, "vehicle_file:plugin_init:enter\n"); plugin_register_vehicle_type("file", vehicle_file_new_file); plugin_register_vehicle_type("pipe", vehicle_file_new_file); plugin_register_vehicle_type("socket", vehicle_file_new_file); plugin_register_vehicle_type("serial", vehicle_file_new_file); } navit-0.5.0+dfsg.1/navit/vehicle/file/vehicle_pipe.c000066400000000000000000000015201264204753600222010ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "plugin.h" void plugin_init(void) { plugin_get_vehicle_type("file"); } navit-0.5.0+dfsg.1/navit/vehicle/file/vehicle_serial.c000066400000000000000000000015201264204753600225230ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "plugin.h" void plugin_init(void) { plugin_get_vehicle_type("file"); } navit-0.5.0+dfsg.1/navit/vehicle/file/vehicle_socket.c000066400000000000000000000015201264204753600225340ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "plugin.h" void plugin_init(void) { plugin_get_vehicle_type("file"); } navit-0.5.0+dfsg.1/navit/vehicle/gpsd/000077500000000000000000000000001264204753600174215ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/gpsd/CMakeLists.txt000066400000000000000000000003061264204753600221600ustar00rootroot00000000000000module_add_library(vehicle_gpsd vehicle_gpsd.c) if (LIBGPS19_FOUND) set_property( TARGET vehicle_gpsd APPEND PROPERTY COMPILE_DEFINITIONS HAVE_LIBGPS19=1 ) endif (LIBGPS19_FOUND) navit-0.5.0+dfsg.1/navit/vehicle/gpsd/Makefile.am000066400000000000000000000004771264204753600214650ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @GPSBT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd modulevehicle_LTLIBRARIES = libvehicle_gpsd.la libvehicle_gpsd_la_SOURCES = vehicle_gpsd.c libvehicle_gpsd_la_LIBADD = @GPSD_LIBS@ @GPSBT_LIBS@ libvehicle_gpsd_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/vehicle/gpsd/vehicle_gpsd.c000066400000000000000000000306631264204753600222310ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #ifdef HAVE_GPSBT #include #include #endif #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" #include "types.h" static struct vehicle_priv { char *source; char *gpsd_query; struct callback_list *cbl; struct callback *cb, *cbt; struct event_watch *evwatch; guint retry_interval; struct gps_data_t *gps; struct coord_geo geo; double speed; double direction; double height; double hdop; int status; int fix_type; time_t fix_time; int sats; int sats_signal; int sats_used; char *nmea_data; char *nmea_data_buf; struct event_timeout *retry_timer2; struct attr ** attrs; char fixiso8601[128]; #ifdef HAVE_GPSBT gpsbt_t context; #endif } *vehicle_last; #define DEFAULT_RETRY_INTERVAL 10 // seconds #define MIN_RETRY_INTERVAL 1 // seconds static void vehicle_gpsd_io(struct vehicle_priv *priv); static void #ifdef HAVE_LIBGPS19 vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len) #else vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len, int level) #endif { char *pos,*nmea_data_buf; int i=0,sats_signal=0; struct vehicle_priv *priv = vehicle_last; if( len > 0 && buf[0] == '$' ) { char buffer[len+2]; buffer[len+1]='\0'; memcpy(buffer, buf, len); pos=strchr(buffer,'\n'); if(!pos) { pos=strchr(buffer,'\r'); } if (pos) { *pos ='\n'; *++pos='\0'; if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(lvl_error, "nmea buffer overflow, discarding '%s'\n", buffer); } } } dbg(lvl_debug,"data->set="LONGLONG_HEX_FMT"\n", (unsigned long long)data->set); if (data->set & SPEED_SET) { priv->speed = data->fix.speed * 3.6; if(!isnan(data->fix.speed)) callback_list_call_attr_0(priv->cbl, attr_position_speed); data->set &= ~SPEED_SET; } if (data->set & TRACK_SET) { priv->direction = data->fix.track; data->set &= ~TRACK_SET; } if (data->set & ALTITUDE_SET) { priv->height = data->fix.altitude; data->set &= ~ALTITUDE_SET; } if (data->set & SATELLITE_SET) { // We cannot rely on GPSD_API_MAJOR_VERSION here because it was not // incremented for this change :-(. #ifdef HAVE_LIBGPS19 if(data->satellites_visible > 0) { #else if(data->satellites > 0) { #endif sats_signal=0; #ifdef HAVE_LIBGPS19 for( i=0;isatellites_visible;i++) { #else for( i=0;isatellites;i++) { #endif #if GPSD_API_MAJOR_VERSION >= 6 if (data->skyview[i].ss > 0) #else if (data->ss[i] > 0) #endif sats_signal++; } } #ifdef HAVE_LIBGPS19 if (priv->sats_used != data->satellites_used || priv->sats != data->satellites_visible || priv->sats_signal != sats_signal ) { #else if (priv->sats_used != data->satellites_used || priv->sats != data->satellites || priv->sats_signal != sats_signal ) { #endif priv->sats_used = data->satellites_used; #ifdef HAVE_LIBGPS19 priv->sats = data->satellites_visible; #else priv->sats = data->satellites; #endif priv->sats_signal = sats_signal; callback_list_call_attr_0(priv->cbl, attr_position_sats); } data->set &= ~SATELLITE_SET; } if (data->set & STATUS_SET) { priv->status = data->status; data->set &= ~STATUS_SET; } if (data->set & MODE_SET) { priv->fix_type = data->fix.mode - 1; data->set &= ~MODE_SET; } if (data->set & TIME_SET) { priv->fix_time = data->fix.time; data->set &= ~TIME_SET; } #ifdef HAVE_LIBGPS19 if (data->set & DOP_SET) { dbg(lvl_debug, "pdop : %g\n", data->dop.pdop); priv->hdop = data->dop.pdop; data->set &= ~DOP_SET; #else if (data->set & PDOP_SET) { dbg(lvl_debug, "pdop : %g\n", data->pdop); priv->hdop = data->hdop; data->set &= ~PDOP_SET; #endif } if (data->set & LATLON_SET) { priv->geo.lat = data->fix.latitude; priv->geo.lng = data->fix.longitude; dbg(lvl_debug,"lat=%f lng=%f\n", priv->geo.lat, priv->geo.lng); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; data->set &= ~LATLON_SET; } // If data->fix.speed is NAN, then the drawing gets jumpy. if (! isnan(data->fix.speed) && priv->fix_type > 0) { callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } dbg(lvl_info,"speed ok\n"); } /** * Attempt to open the gps device. * Return FALSE if retry not required * Return TRUE to try again */ static int vehicle_gpsd_try_open(struct vehicle_priv *priv) { char *source = g_strdup(priv->source); char *colon = index(source + 7, ':'); char *port=NULL; if (colon) { *colon = '\0'; port=colon+1; } dbg(lvl_debug,"Trying to connect to %s:%s\n",source+7,port?port:"default"); #if GPSD_API_MAJOR_VERSION >= 5 /* gps_open returns 0 on success */ if (gps_open(source + 7, port, priv->gps)) { #else priv->gps = gps_open(source + 7, port); if(!priv->gps) { #endif dbg(lvl_error,"gps_open failed for '%s'. Retrying in %d seconds. Have you started gpsd?\n", priv->source, priv->retry_interval); g_free(source); return TRUE; } g_free(source); #ifdef HAVE_LIBGPS19 if (strchr(priv->gpsd_query,'r')) gps_stream(priv->gps, WATCH_ENABLE|WATCH_NMEA|WATCH_JSON, NULL); else gps_stream(priv->gps, WATCH_ENABLE|WATCH_JSON, NULL); #else gps_query(priv->gps, priv->gpsd_query); #endif #if GPSD_API_MAJOR_VERSION < 5 gps_set_raw_hook(priv->gps, vehicle_gpsd_callback); #endif priv->cb = callback_new_1(callback_cast(vehicle_gpsd_io), priv); priv->cbt = callback_new_1(callback_cast(vehicle_gpsd_try_open), priv); priv->evwatch = event_add_watch(priv->gps->gps_fd, event_watch_cond_read, priv->cb); if (!priv->gps->gps_fd) { dbg(lvl_error,"Warning: gps_fd is 0, most likely you have used a gps.h incompatible to libgps"); } dbg(lvl_debug,"Connected to gpsd fd=%d evwatch=%p\n", priv->gps->gps_fd, priv->evwatch); event_remove_timeout(priv->retry_timer2); priv->retry_timer2=NULL; return FALSE; } /** * Open a connection to gpsd. Will re-try the connection if it fails */ static void vehicle_gpsd_open(struct vehicle_priv *priv) { #ifdef HAVE_GPSBT char errstr[256] = ""; /* We need to start gpsd (via gpsbt) first. */ errno = 0; memset(&priv->context, 0, sizeof(gpsbt_t)); if(gpsbt_start(NULL, 0, 0, 0, errstr, sizeof(errstr), 0, &priv->context) < 0) { dbg(lvl_error,"Error connecting to GPS with gpsbt: (%d) %s (%s)\n", errno, strerror(errno), errstr); } sleep(1); /* give gpsd time to start */ dbg(lvl_debug,"gpsbt_start: completed\n"); #endif priv->retry_timer2=NULL; if (vehicle_gpsd_try_open(priv)) priv->retry_timer2=event_add_timeout(priv->retry_interval*1000, 1, priv->cbt); } static void vehicle_gpsd_close(struct vehicle_priv *priv) { #ifdef HAVE_GPSBT int err; #endif if (priv->retry_timer2) { event_remove_timeout(priv->retry_timer2); priv->retry_timer2=NULL; } if (priv->evwatch) { event_remove_watch(priv->evwatch); priv->evwatch = NULL; } if (priv->cb) { callback_destroy(priv->cb); priv->cb = NULL; } if (priv->cbt) { callback_destroy(priv->cbt); priv->cbt = NULL; } if (priv->gps) { gps_close(priv->gps); #if GPSD_API_MAJOR_VERSION >= 5 g_free(priv->gps); #endif priv->gps = NULL; } #ifdef HAVE_GPSBT err = gpsbt_stop(&priv->context); if (err < 0) { dbg(lvl_error,"Error %d while gpsbt_stop", err); } dbg(lvl_debug,"gpsbt_stop: completed, (%d)",err); #endif } static void vehicle_gpsd_io(struct vehicle_priv *priv) { dbg(lvl_debug, "enter\n"); if (priv->gps) { vehicle_last = priv; #if GPSD_API_MAJOR_VERSION >= 5 int read_result; /* Read until EOF, in case we are lagging behind. * No point in processing old GPS reports. */ while((read_result=gps_read(priv->gps))>0); if(read_result==-1) { dbg(lvl_error,"gps_poll failed\n"); vehicle_gpsd_close(priv); vehicle_gpsd_open(priv); } else { const char *buf; buf = gps_data(priv->gps); vehicle_gpsd_callback(priv->gps,buf,strlen(buf)); } #else if (gps_poll(priv->gps)) { dbg(lvl_error,"gps_poll failed\n"); vehicle_gpsd_close(priv); vehicle_gpsd_open(priv); } #endif } } static void vehicle_gpsd_destroy(struct vehicle_priv *priv) { vehicle_gpsd_close(priv); if (priv->source) g_free(priv->source); if (priv->gpsd_query) g_free(priv->gpsd_query); #if GPSD_API_MAJOR_VERSION >= 5 g_free(priv->gps); #endif g_free(priv); } static int vehicle_gpsd_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { struct attr * active=NULL; switch (type) { case attr_position_fix_type: attr->u.num = priv->fix_type; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_hdop: attr->u.numd = &priv->hdop; break; case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_signal: attr->u.num = priv->sats_signal; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_nmea: attr->u.str=priv->nmea_data; if (! attr->u.str) return 0; break; case attr_position_time_iso8601: { struct tm tm; if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } break; case attr_active: active = attr_search(priv->attrs,NULL,attr_active); if(active != NULL) { attr->u.num=active->u.num; return 1; } else return 0; break; default: return 0; } attr->type = type; return 1; } static struct vehicle_methods vehicle_gpsd_methods = { vehicle_gpsd_destroy, vehicle_gpsd_position_attr_get, }; static struct vehicle_priv * vehicle_gpsd_new_gpsd(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source, *query, *retry_int; dbg(lvl_debug, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); #if GPSD_API_MAJOR_VERSION >= 5 ret->gps = g_new0(struct gps_data_t, 1); #endif ret->source = g_strdup(source->u.str); query = attr_search(attrs, NULL, attr_gpsd_query); if (query) { ret->gpsd_query = g_strconcat(query->u.str, "\n", NULL); } else { ret->gpsd_query = g_strdup("w+x\n"); } dbg(lvl_debug,"Format string for gpsd_query: %s\n",ret->gpsd_query); retry_int = attr_search(attrs, NULL, attr_retry_interval); if (retry_int) { ret->retry_interval = retry_int->u.num; if (ret->retry_interval < MIN_RETRY_INTERVAL) { dbg(lvl_error, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL); ret->retry_interval = MIN_RETRY_INTERVAL; } } else { dbg(lvl_debug, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL); ret->retry_interval = DEFAULT_RETRY_INTERVAL; } ret->cbl = cbl; *meth = vehicle_gpsd_methods; ret->attrs = attrs; vehicle_gpsd_open(ret); return ret; } void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("gpsd", vehicle_gpsd_new_gpsd); } navit-0.5.0+dfsg.1/navit/vehicle/gpsd_dbus/000077500000000000000000000000001264204753600204365ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/gpsd_dbus/CMakeLists.txt000066400000000000000000000000741264204753600231770ustar00rootroot00000000000000module_add_library(vehicle_gpsd_dbus vehicle_gpsd_dbus.c) navit-0.5.0+dfsg.1/navit/vehicle/gpsd_dbus/Makefile.am000066400000000000000000000005171264204753600224750ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd_dbus modulevehicle_LTLIBRARIES = libvehicle_gpsd_dbus.la libvehicle_gpsd_dbus_la_SOURCES = vehicle_gpsd_dbus.c libvehicle_gpsd_dbus_la_LIBADD = @DBUS_LIBS@ libvehicle_gpsd_dbus_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c000066400000000000000000000142301264204753600242530ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #define DBUS_API_SUBJECT_TO_CHANGE #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" static char *vehicle_gpsd_dbus_prefix="gpsd_dbus:"; struct vehicle_priv { char *source; char *address; int flags; struct callback_list *cbl; DBusConnection *connection; double time, track, speed, altitude; time_t fix_time; struct coord_geo geo; struct attr ** attrs; char fixiso8601[128]; }; static void vehicle_gpsd_dbus_close(struct vehicle_priv *priv) { if (priv->connection) dbus_connection_unref(priv->connection); priv->connection=NULL; } static DBusHandlerResult vehicle_gpsd_dbus_filter(DBusConnection *connection, DBusMessage *message, void *user_data) { struct vehicle_priv *priv=user_data; double time,ept,latitude,longitude,eph,altitude,epv,track,epd,speed,eps,climb,epc; int mode; char *devname; if (dbus_message_is_signal(message, "org.gpsd","fix")) { dbus_message_get_args (message, NULL, DBUS_TYPE_DOUBLE, &time, DBUS_TYPE_INT32, &mode, DBUS_TYPE_DOUBLE, &ept, DBUS_TYPE_DOUBLE, &latitude, DBUS_TYPE_DOUBLE, &longitude, DBUS_TYPE_DOUBLE, &eph, DBUS_TYPE_DOUBLE, &altitude, DBUS_TYPE_DOUBLE, &epv, DBUS_TYPE_DOUBLE, &track, DBUS_TYPE_DOUBLE, &epd, DBUS_TYPE_DOUBLE, &speed, DBUS_TYPE_DOUBLE, &eps, DBUS_TYPE_DOUBLE, &climb, DBUS_TYPE_DOUBLE, &epc, DBUS_TYPE_STRING, &devname, DBUS_TYPE_INVALID); if (!isnan(latitude) && !isnan(longitude)) { priv->geo.lat=latitude; priv->geo.lng=longitude; } if (!isnan(track)) priv->track=track; if (!isnan(speed)) priv->speed=speed; if (!isnan(altitude)) priv->altitude=altitude; if (time != priv->time || (priv->flags & 1)) { priv->time=time; priv->fix_time=time; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static int vehicle_gpsd_dbus_open(struct vehicle_priv *priv) { DBusError error; dbus_error_init(&error); if (priv->address) { priv->connection = dbus_connection_open(priv->address, &error); } else { priv->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); } if (!priv->connection) { dbg(lvl_error,"Failed to open connection to %s message bus: %s\n", priv->address?priv->address:"session",error.message); dbus_error_free(&error); return 0; } dbus_connection_setup_with_g_main(priv->connection, NULL); dbus_bus_add_match(priv->connection,"type='signal',interface='org.gpsd'",&error); dbus_connection_flush(priv->connection); if (dbus_error_is_set(&error)) { dbg(lvl_error,"Failed to add match to connection: %s\n", error.message); vehicle_gpsd_dbus_close(priv); return 0; } if (!dbus_connection_add_filter(priv->connection, vehicle_gpsd_dbus_filter, priv, NULL)) { dbg(lvl_error,"Failed to add filter to connection\n"); vehicle_gpsd_dbus_close(priv); return 0; } return 1; } static void vehicle_gpsd_dbus_destroy(struct vehicle_priv *priv) { vehicle_gpsd_dbus_close(priv); if (priv->source) g_free(priv->source); g_free(priv); } static int vehicle_gpsd_dbus_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_height: attr->u.numd = &priv->altitude; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->track; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_time_iso8601: { struct tm tm; if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } break; default: return 0; } attr->type = type; return 1; } static int vehicle_gpsd_dbus_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) { switch (attr->type) { case attr_source: if (strncmp(vehicle_gpsd_dbus_prefix,attr->u.str,strlen(vehicle_gpsd_dbus_prefix))) { dbg(lvl_error,"source must start with '%s'\n", vehicle_gpsd_dbus_prefix); return 0; } g_free(priv->source); priv->source=g_strdup(attr->u.str); priv->address=priv->source+strlen(vehicle_gpsd_dbus_prefix); if (!priv->address[0]) priv->address=NULL; if (!init) { vehicle_gpsd_dbus_close(priv); vehicle_gpsd_dbus_open(priv); } return 1; case attr_flags: priv->flags=attr->u.num; return 1; default: return 0; } } static int vehicle_gpsd_dbus_set_attr(struct vehicle_priv *priv, struct attr *attr) { return vehicle_gpsd_dbus_set_attr_do(priv, attr, 0); } static struct vehicle_methods vehicle_gpsd_methods = { vehicle_gpsd_dbus_destroy, vehicle_gpsd_dbus_position_attr_get, vehicle_gpsd_dbus_set_attr, }; static struct vehicle_priv * vehicle_gpsd_dbus_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; ret = g_new0(struct vehicle_priv, 1); ret->attrs = attrs; ret->cbl = cbl; *meth = vehicle_gpsd_methods; while (*attrs) { vehicle_gpsd_dbus_set_attr_do(ret, *attrs, 1); attrs++; } vehicle_gpsd_dbus_open(ret); return ret; } void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("gpsd_dbus", vehicle_gpsd_dbus_new); } navit-0.5.0+dfsg.1/navit/vehicle/gypsy/000077500000000000000000000000001264204753600176375ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/gypsy/CMakeLists.txt000066400000000000000000000000631264204753600223760ustar00rootroot00000000000000module_add_library(vehicle_gypsy vehicle_gypsy.c) navit-0.5.0+dfsg.1/navit/vehicle/gypsy/Makefile.am000066400000000000000000000004701264204753600216740ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gypsy modulevehicle_LTLIBRARIES = libvehicle_gypsy.la libvehicle_gypsy_la_SOURCES = vehicle_gypsy.c libvehicle_gypsy_la_LIBADD = @GYPSY_LIBS@ libvehicle_gypsy_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/vehicle/gypsy/vehicle_gypsy.c000066400000000000000000000277001264204753600226630ustar00rootroot00000000000000/** @file vehicle_gypsy.c * @brief gypsy uses dbus signals * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * @Author Tim Niemeyer * @date 2008-2009 */ #include #include #include #include #include #include #ifdef USE_BINDING_DBUS #include #include #include #endif #ifdef HAVE_UNISTD_H #include #include #endif #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" static struct vehicle_priv { char *source; GypsyControl *control; GypsyPosition *position; GypsyDevice *device; GypsyCourse *course; GypsySatellite *satellite; char *path; struct callback_list *cbl; guint retry_interval; struct coord_geo geo; double speed; double direction; double height; int fix_type; time_t fix_time; char fixiso8601[128]; int sats; int sats_used; guint retry_timer; struct attr ** attrs; int have_cords; } *vehicle_last; #define DEFAULT_RETRY_INTERVAL 10 // seconds #define MIN_RETRY_INTERVAL 1 // seconds /** * @brief When the fixstatus has changed, this function get called * * fixstatus can be one of this: * GYPSY_DEVICE_FIX_STATUS_INVALID = 0 * GYPSY_DEVICE_FIX_STATUS_NONE = 1 * GYPSY_DEVICE_FIX_STATUS_2D = 2 * GYPSY_DEVICE_FIX_STATUS_3D = 3 * * Anytime this functions get called, we have to call the global * callback. * * @param device The GypsyDevice * @param fixstatus The fisstatus 0, 1, 2 or 3 * @param userdata * @returns nothing */ static void vehicle_gypsy_fixstatus_changed(GypsyDevice *device, gint fixstatus, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; if (fixstatus==GYPSY_DEVICE_FIX_STATUS_3D) priv->fix_type = 3; else if (fixstatus==GYPSY_DEVICE_FIX_STATUS_2D) priv->fix_type = 1; else priv->fix_type = 0; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } /** * @brief When the position has changed, this function get called * * The fields_set can hold: * GYPSY_POSITION_FIELDS_NONE = 1 << 0, * GYPSY_POSITION_FIELDS_LATITUDE = 1 << 1, * GYPSY_POSITION_FIELDS_LONGITUDE = 1 << 2, * GYPSY_POSITION_FIELDS_ALTITUDE = 1 << 3 * * If we get any new information, we have to call the global * callback. * * @param position The GypsyPosition * @param fields_set Bitmask indicating what field was set * @param timestamp the time since Unix Epoch * @param latitude * @param longitude * @param altitude * @param userdata * @returns nothing */ static void vehicle_gypsy_position_changed(GypsyPosition *position, GypsyPositionFields fields_set, int timestamp, double latitude, double longitude, double altitude, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; int cb = FALSE; if (timestamp > 0) priv->fix_time = timestamp; if (fields_set & GYPSY_POSITION_FIELDS_LATITUDE) { cb = TRUE; priv->geo.lat = latitude; } if (fields_set & GYPSY_POSITION_FIELDS_LONGITUDE) { cb = TRUE; priv->geo.lng = longitude; } if (fields_set & GYPSY_POSITION_FIELDS_ALTITUDE) { cb = TRUE; priv->height = altitude; } if (cb) { priv->have_cords = 1; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } } /** * @brief Everytime any Sat-Details are changed, this function get called * * Going through all Sats, counting those wich are in use. * * Anytime this functions get called, we have to call the global * callback. * * @param satellite The GypsySatellite * @param satellites An GPtrArray wich hold information of all sats * @param userdata * @returns nothing */ static void vehicle_gypsy_satellite_changed(GypsySatellite *satellite, GPtrArray *satellites, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; int i, sats, used=0; sats = satellites->len; for (i = 0; i < sats; i++) { GypsySatelliteDetails *details = satellites->pdata[i]; if (details->in_use) used++; } priv->sats_used = used; priv->sats = sats; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } /** * @brief When the course or speed has changed, this function get called * * Only speed and direction are used! * * If we get any new information, we have to call the global * callback. * * @param course The GypsyCourse * @param fields Bitmask indicating what field was set * @param timestamp the time since Unix Epoch * @param speed * @param direction * @param climb * @param userdata * @returns nothing */ static void vehicle_gypsy_course_changed (GypsyCourse *course, GypsyCourseFields fields, int timestamp, double speed, double direction, double climb, gpointer userdata) { struct vehicle_priv *priv = vehicle_last; int cb = FALSE; if (fields & GYPSY_COURSE_FIELDS_SPEED) { priv->speed = speed*3.6; cb = TRUE; } if (fields & GYPSY_COURSE_FIELDS_DIRECTION) { priv->direction = direction; cb = TRUE; } if (cb) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } /** * @brief Attempt to open the gypsy device. * * Tells gypsy wich functions to call when anything occours. * * @param data * @returns TRUE to try again; FALSE if retry not required */ static gboolean vehicle_gypsy_try_open(gpointer *data) { struct vehicle_priv *priv = (struct vehicle_priv *)data; char *source = g_strdup(priv->source); GError *error = NULL; g_type_init(); priv->control = gypsy_control_get_default(); priv->path = gypsy_control_create(priv->control, source+8, &error); if (priv->path == NULL) { g_warning ("Error creating gypsy conrtol path for %s: %s", source+8, error->message); return TRUE; } priv->position = gypsy_position_new(priv->path); g_signal_connect(priv->position, "position-changed", G_CALLBACK (vehicle_gypsy_position_changed), NULL); priv->satellite = gypsy_satellite_new(priv->path); g_signal_connect(priv->satellite, "satellites-changed", G_CALLBACK (vehicle_gypsy_satellite_changed), NULL); priv->course = gypsy_course_new(priv->path); g_signal_connect(priv->course, "course-changed", G_CALLBACK (vehicle_gypsy_course_changed), NULL); priv->device = gypsy_device_new(priv->path); g_signal_connect(priv->device, "fix-status-changed", G_CALLBACK (vehicle_gypsy_fixstatus_changed), NULL); gypsy_device_start(priv->device, &error); if (error != NULL) { g_warning ("Error starting gypsy for %s: %s", source+8, error->message); return TRUE; } vehicle_last = priv; dbg(lvl_debug,"gypsy connected to %d\n", source+8); g_free(source); return FALSE; } /** * @brief Open a connection to gypsy. Will re-try the connection if it fails * * @param priv * @returns nothing */ static void vehicle_gypsy_open(struct vehicle_priv *priv) { priv->retry_timer=0; if (vehicle_gypsy_try_open((gpointer *)priv)) { priv->retry_timer = g_timeout_add(priv->retry_interval*1000, (GSourceFunc)vehicle_gypsy_try_open, (gpointer *)priv); } } /** * @brief Stop retry timer; Free alloced memory * * @param priv * @returns nothing */ static void vehicle_gypsy_close(struct vehicle_priv *priv) { if (priv->retry_timer) { g_source_remove(priv->retry_timer); priv->retry_timer=0; } if (priv->path) g_free(priv->path); if (priv->position) g_free(priv->position); if (priv->satellite) g_free(priv->satellite); if (priv->course) g_free(priv->course); if (priv->device) g_free(priv->device); if (priv->control) g_object_unref(G_OBJECT (priv->control)); } /** * @brief Free the gypsy_vehicle * * @param priv * @returns nothing */ static void vehicle_gypsy_destroy(struct vehicle_priv *priv) { vehicle_gypsy_close(priv); if (priv->source) g_free(priv->source); g_free(priv); } /** * @brief Provide the outside with information * * @param priv * @param type TODO: What can this be? * @param attr * @returns true/false */ static int vehicle_gypsy_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { struct attr * active=NULL; switch (type) { case attr_position_fix_type: attr->u.num = priv->fix_type; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; if (!priv->have_cords) return 0; break; case attr_position_time_iso8601: { struct tm tm; if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } case attr_active: active = attr_search(priv->attrs,NULL,attr_active); if(active != NULL && active->u.num == 1) return 1; else return 0; break; default: return 0; } attr->type = type; return 1; } struct vehicle_methods vehicle_gypsy_methods = { vehicle_gypsy_destroy, vehicle_gypsy_position_attr_get, }; /** * @brief Create gypsy_vehicle * * @param meth * @param cbl * @param attrs * @returns vehicle_priv */ static struct vehicle_priv * vehicle_gypsy_new_gypsy(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source, *retry_int; #if defined(USE_BINDING_DBUS) && defined(HAVE_UNISTD_H) DBusConnection *conn; DBusMessage *message; dbus_uint32_t serial,pid=getpid(); struct attr *destination,*path,*interface,*method; destination=attr_search(attrs, NULL, attr_dbus_destination); path=attr_search(attrs, NULL, attr_dbus_path); interface=attr_search(attrs, NULL, attr_dbus_interface); method=attr_search(attrs, NULL, attr_dbus_method); if (destination && path && interface && method) { conn=dbus_bus_get(DBUS_BUS_SESSION, NULL); if (conn) { message=dbus_message_new_method_call(destination->u.str,path->u.str,interface->u.str,method->u.str); dbus_message_append_args(message, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID); dbus_connection_send(conn, message, &serial); dbus_message_unref(message); dbus_connection_unref(conn); } else { dbg(lvl_error,"failed to connect to session bus\n"); } } #endif dbg(lvl_debug, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); ret->have_cords = 0; ret->source = g_strdup(source->u.str); ret->attrs = attrs; retry_int = attr_search(attrs, NULL, attr_retry_interval); if (retry_int) { ret->retry_interval = retry_int->u.num; if (ret->retry_interval < MIN_RETRY_INTERVAL) { dbg(lvl_error, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL); ret->retry_interval = MIN_RETRY_INTERVAL; } } else { dbg(lvl_error, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL); ret->retry_interval = DEFAULT_RETRY_INTERVAL; } ret->cbl = cbl; *meth = vehicle_gypsy_methods; vehicle_gypsy_open(ret); return ret; } /** * @brief register vehicle_gypsy * * @returns nothing */ void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("gypsy", vehicle_gypsy_new_gypsy); } navit-0.5.0+dfsg.1/navit/vehicle/maemo/000077500000000000000000000000001264204753600175625ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/maemo/CMakeLists.txt000066400000000000000000000000641264204753600223220ustar00rootroot00000000000000module_add_library(vehicle_maemo vehicle_maemo.c) navit-0.5.0+dfsg.1/navit/vehicle/maemo/Makefile.am000066400000000000000000000005051264204753600216160ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBLOCATION_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_maemo modulevehicle_LTLIBRARIES = libvehicle_maemo.la libvehicle_maemo_la_SOURCES = vehicle_maemo.c libvehicle_maemo_la_LIBADD = @LIBLOCATION_LIBS@ libvehicle_maemo_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/vehicle/maemo/vehicle_maemo.c000066400000000000000000000234211264204753600225250ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* Plugin for new Maemo's liblocation API. source cound be on of "any","cwp","acwp","gnss","agnss" retry_interval could be one of "1","2","5","10","20","30","60","120" measured in seconds */ #include #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" static struct vehicle_priv { LocationGPSDControl *control; LocationGPSDevice *device; char *source; guint retry_interval; struct callback_list *cbl; struct attr ** attrs; int sats; // satellites_in_view int sats_used; //satellites_in_user int fix_type; //mode struct coord_geo geo; //lattigute&longittude double speed; //speed:) double direction; //track double height; //altitude double hdop; //eph time_t fix_time; //time char fixiso8601[128]; }; static void vehicle_maemo_callback(LocationGPSDevice *device, gpointer user_data) { struct vehicle_priv *priv=(struct vehicle_priv*)user_data; priv->sats=device->satellites_in_view; priv->sats_used=device->satellites_in_use; callback_list_call_attr_0(priv->cbl, attr_position_sats); dbg(lvl_debug,"Got update with %u/%u satellites\n",priv->sats_used,priv->sats); if (device->fix) { switch(device->fix->mode) { case LOCATION_GPS_DEVICE_MODE_NOT_SEEN: case LOCATION_GPS_DEVICE_MODE_NO_FIX: priv->fix_type=0; break; case LOCATION_GPS_DEVICE_MODE_2D: case LOCATION_GPS_DEVICE_MODE_3D: priv->fix_type=1; break; } if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { priv->geo.lat=device->fix->latitude; priv->geo.lng=device->fix->longitude; priv->hdop=device->fix->eph/100; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); dbg(lvl_debug,"Position: %f %f with error %f meters\n",priv->geo.lat,priv->geo.lng,priv->hdop); } if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) { priv->speed=device->fix->speed; callback_list_call_attr_0(priv->cbl, attr_position_speed); dbg(lvl_debug,"Speed: %f\n ",priv->speed); } if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) { priv->direction=device->fix->track; dbg(lvl_debug,"Direction: %f\n",priv->direction); } if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) { priv->fix_time=device->fix->time; dbg(lvl_debug,"Time: %f\n",priv->fix_time); } if (device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET) { priv->height=device->fix->altitude; dbg(lvl_debug,"Elevation: %f\n",priv->height); } } return; } static void vehicle_maemo_error(LocationGPSDControl *control, LocationGPSDControlError error, gpointer user_data) { switch (error) { case LOCATION_ERROR_USER_REJECTED_DIALOG: dbg(lvl_error,"User didn't enable requested methods\n"); break; case LOCATION_ERROR_USER_REJECTED_SETTINGS: dbg(lvl_error,"User changed settings, which disabled location\n"); break; case LOCATION_ERROR_BT_GPS_NOT_AVAILABLE: dbg(lvl_error,"Problems with BT GPS\n"); break; case LOCATION_ERROR_METHOD_NOT_ALLOWED_IN_OFFLINE_MODE: dbg(lvl_error,"Requested method is not allowed in offline mode\n"); break; case LOCATION_ERROR_SYSTEM: dbg(lvl_error,"System error\n"); break; } } /** * Instantiate liblocation objects */ static void vehicle_maemo_open(struct vehicle_priv *priv) { priv->control = location_gpsd_control_get_default(); priv->device = g_object_new(LOCATION_TYPE_GPS_DEVICE, NULL); if (!strcasecmp(priv->source+8,"cwp")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_CWP, NULL); dbg(lvl_debug,"Method set: CWP\n"); } else if (!strcasecmp(priv->source+8,"acwp")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_ACWP, NULL); dbg(lvl_debug,"Method set: ACWP\n"); } else if (!strcasecmp(priv->source+8,"gnss")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_GNSS, NULL); dbg(lvl_debug,"Method set: GNSS\n"); } else if (!strcasecmp(priv->source+8,"agnss")) { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_AGNSS, NULL); dbg(lvl_debug,"Method set: AGNSS\n"); } else { g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_USER_SELECTED, NULL); dbg(lvl_debug,"Method set: ANY\n"); } switch (priv->retry_interval) { case 2: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_2S, NULL); dbg(lvl_debug,"Interval set: 2s\n"); break; case 5: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_5S, NULL); dbg(lvl_debug,"Interval set: 5s\n"); break; case 10: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_10S, NULL); dbg(lvl_debug,"Interval set: 10s\n"); break; case 20: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_20S, NULL); dbg(lvl_debug,"Interval set: 20s\n"); break; case 30: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_30S, NULL); dbg(lvl_debug,"Interval set: 30s\n"); break; case 60: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_60S, NULL); dbg(lvl_debug,"Interval set: 60s\n"); break; case 120: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_120S, NULL); dbg(lvl_debug,"Interval set: 120s\n"); break; case 1: default: g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_1S, NULL); dbg(lvl_debug,"Interval set: 1s\n"); break; } g_signal_connect(priv->device, "changed", G_CALLBACK(vehicle_maemo_callback), priv); g_signal_connect(priv->control, "error-verbose", G_CALLBACK(vehicle_maemo_error), priv); location_gpsd_control_start(priv->control); return; } static void vehicle_maemo_destroy(struct vehicle_priv *priv) { location_gpsd_control_stop(priv->control); g_object_unref(priv->device); g_object_unref(priv->control); return; } static int vehicle_maemo_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { struct attr * active=NULL; switch (type) { case attr_position_fix_type: dbg(lvl_debug,"Attr requested: position_fix_type\n"); attr->u.num = priv->fix_type; break; case attr_position_height: dbg(lvl_debug,"Attr requested: position_height\n"); attr->u.numd = &priv->height; break; case attr_position_speed: dbg(lvl_debug,"Attr requested: position_speed\n"); attr->u.numd = &priv->speed; break; case attr_position_direction: dbg(lvl_debug,"Attr requested: position_direction\n"); attr->u.numd = &priv->direction; break; case attr_position_hdop: dbg(lvl_debug,"Attr requested: position_hdop\n"); attr->u.numd = &priv->hdop; break; case attr_position_sats: dbg(lvl_debug,"Attr requested: position_sats\n"); attr->u.num = priv->sats; break; case attr_position_sats_used: dbg(lvl_debug,"Attr requested: position_sats_used\n"); attr->u.num = priv->sats_used; break; case attr_position_coord_geo: dbg(lvl_debug,"Attr requested: position_coord_geo\n"); attr->u.coord_geo = &priv->geo; break; case attr_position_time_iso8601: { struct tm tm; dbg(lvl_debug,"Attr requested: position_time_iso8601\n"); if (!priv->fix_time) return 0; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else return 0; } break; case attr_active: dbg(lvl_debug,"Attr requested: position_active\n"); active = attr_search(priv->attrs,NULL,attr_active); if(active != NULL) { attr->u.num=active->u.num; return 1; } else return 0; break; default: return 0; } attr->type = type; return 1; } struct vehicle_methods vehicle_maemo_methods = { vehicle_maemo_destroy, vehicle_maemo_position_attr_get, }; static struct vehicle_priv * vehicle_maemo_new_maemo(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source, *retry_int; dbg(lvl_debug, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); ret->source = g_strdup(source->u.str); retry_int = attr_search(attrs, NULL, attr_retry_interval); if (retry_int) { ret->retry_interval = retry_int->u.num; if (ret->retry_interval !=1 && ret->retry_interval !=2 && ret->retry_interval !=5 && ret->retry_interval !=10 && ret->retry_interval !=20 && ret->retry_interval !=30 && ret->retry_interval !=60 && ret->retry_interval !=120 ) { dbg(lvl_error, "Retry interval %d invalid, setting to 1\n", ret->retry_interval,1); ret->retry_interval = 1; } } else { ret->retry_interval = 1; } dbg(lvl_debug,"source: %s, interval: %u\n",ret->source,ret->retry_interval); ret->cbl = cbl; *meth = vehicle_maemo_methods; ret->attrs = attrs; vehicle_maemo_open(ret); return ret; } void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("maemo", vehicle_maemo_new_maemo); } navit-0.5.0+dfsg.1/navit/vehicle/null/000077500000000000000000000000001264204753600174365ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/null/CMakeLists.txt000066400000000000000000000000601264204753600221720ustar00rootroot00000000000000module_add_library(vehicle_null vehicle_null.c) navit-0.5.0+dfsg.1/navit/vehicle/null/Makefile.am000066400000000000000000000005241264204753600214730ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_null if PLUGINS modulevehicle_LTLIBRARIES = libvehicle_null.la else noinst_LTLIBRARIES = libvehicle_null.la endif libvehicle_null_la_SOURCES = vehicle_null.c libvehicle_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ navit-0.5.0+dfsg.1/navit/vehicle/null/vehicle_null.c000066400000000000000000000074141264204753600222610ustar00rootroot00000000000000/** @file vehicle_null.c * @brief null uses dbus signals * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * @Author Tim Niemeyer * @date 2008-2009 */ #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" struct vehicle_priv { struct callback_list *cbl; struct coord_geo geo; double speed; double direction; double height; double radius; int fix_type; time_t fix_time; char fixiso8601[128]; int sats; int sats_used; int have_coords; struct attr ** attrs; }; /** * @brief Free the null_vehicle * * @param priv * @returns nothing */ static void vehicle_null_destroy(struct vehicle_priv *priv) { dbg(lvl_debug,"enter\n"); g_free(priv); } /** * @brief Provide the outside with information * * @param priv * @param type TODO: What can this be? * @param attr * @returns true/false */ static int vehicle_null_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { dbg(lvl_debug,"enter %s\n",attr_to_name(type)); switch (type) { #if 0 case attr_position_fix_type: attr->u.num = priv->fix_type; break; #endif case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_radius: attr->u.numd = &priv->radius; break; #if 0 case attr_position_qual: attr->u.num = priv->sats; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; #endif case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; if (!priv->have_coords) return 0; break; case attr_position_time_iso8601: attr->u.str=priv->fixiso8601; break; default: return 0; } dbg(lvl_debug,"ok\n"); attr->type = type; return 1; } static int vehicle_null_set_attr(struct vehicle_priv *priv, struct attr *attr) { switch (attr->type) { case attr_position_speed: priv->speed=*attr->u.numd; break; case attr_position_direction: priv->direction=*attr->u.numd; break; case attr_position_coord_geo: priv->geo=*attr->u.coord_geo; priv->have_coords=1; break; default: break; } callback_list_call_attr_0(priv->cbl, attr->type); return 1; } struct vehicle_methods vehicle_null_methods = { vehicle_null_destroy, vehicle_null_position_attr_get, vehicle_null_set_attr, }; /** * @brief Create null_vehicle * * @param meth * @param cbl * @param attrs * @returns vehicle_priv */ static struct vehicle_priv * vehicle_null_new_null(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; dbg(lvl_debug, "enter\n"); ret = g_new0(struct vehicle_priv, 1); ret->cbl = cbl; *meth = vehicle_null_methods; dbg(lvl_debug, "return\n"); return ret; } /** * @brief register vehicle_null * * @returns nothing */ void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("null", vehicle_null_new_null); } navit-0.5.0+dfsg.1/navit/vehicle/webos/000077500000000000000000000000001264204753600176035ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/webos/CMakeLists.txt000066400000000000000000000000621264204753600223410ustar00rootroot00000000000000module_add_library(vehicle_webos vehicle_webos.c) navit-0.5.0+dfsg.1/navit/vehicle/webos/Makefile.am000066400000000000000000000005121264204753600216350ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_webos modulevehicle_LTLIBRARIES = libvehicle_webos.la libvehicle_webos_la_SOURCES = vehicle_webos.c bluetooth.c cJSON.c libvehicle_webos_la_LDFLAGS = @SDL_LIBS@ @LIBPDL_LIBS@ -module -avoid-version navit-0.5.0+dfsg.1/navit/vehicle/webos/bluetooth.c000066400000000000000000000455161264204753600217670ustar00rootroot00000000000000/* vim: sw=3 ts=3 * */ #include #include #include #include #include #include #include #include #include "debug.h" #include "callback.h" #include "event.h" #include "cJSON.h" #include "vehicle_webos.h" #include "bluetooth.h" static int buffer_size = 128; static void vehicle_webos_spp_init_read(struct vehicle_priv *priv, unsigned int length); /********************************************************************/ static void mlPDL_ServiceCall_callback(struct callback_list *cbl, char *service, char *parameters/*, struct callback *fail_cb*/) { PDL_Err err; dbg(lvl_debug,"PDL_ServiceCall(%s) parameters(%s)\n",service,parameters); err = PDL_ServiceCall(service, parameters); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCall to (%s) with (%s) failed with (%d): (%s)\n", service, parameters, err, PDL_GetError()); } callback_list_destroy(cbl); g_free(service); g_free(parameters); } static void mlPDL_ServiceCall(const char *service, const char *parameters/*, struct callback *fail_cb = NULL*/) { struct callback *cb = NULL; struct callback_list *cbl = NULL; char *service2 = g_strdup(service); char *parameters2 = g_strdup(parameters); cbl = callback_list_new(); cb = callback_new_3(callback_cast(mlPDL_ServiceCall_callback),cbl,service2,parameters2); callback_list_add(cbl, cb); dbg(lvl_debug,"event_call_callback(%p)\n",cbl); event_call_callback(cbl); } /********************************************************************/ static void mlPDL_ServiceCallWithCallback_callback(struct callback_list *cbl, char *service, char *parameters, PDL_ServiceCallbackFunc callback, void *user, PDL_bool removeAfterResponse) { PDL_Err err; dbg(lvl_debug,"PDL_ServiceCallWithCallback(%s) parameters(%s)\n",service,parameters); err = PDL_ServiceCallWithCallback(service, parameters, callback, user, removeAfterResponse); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCallWithCallback to (%s) with (%s) failed with (%d): (%s)\n", service, parameters, err, PDL_GetError()); } callback_list_destroy(cbl); g_free(service); g_free(parameters); } static void mlPDL_ServiceCallWithCallback(const char *service, const char *parameters, PDL_ServiceCallbackFunc callback, void *user, PDL_bool removeAfterResponse) { struct callback *cb = NULL; struct callback_list *cbl = NULL; char *service2 = g_strdup(service); char *parameters2 = g_strdup(parameters); cbl = callback_list_new(); cb = callback_new_args(callback_cast(mlPDL_ServiceCallWithCallback_callback),6,cbl,service2,parameters2,callback,user,removeAfterResponse); callback_list_add(cbl, cb); dbg(lvl_debug,"event_call_callback(%p)\n",cbl); event_call_callback(cbl); } /********************************************************************/ static void vehicle_webos_init_pdl_locationtracking_callback(struct vehicle_priv *priv, struct callback_list *cbl, int param) { PDL_Err err; priv->gps_type = param ? GPS_TYPE_INT: GPS_TYPE_NONE; dbg(lvl_debug,"Calling PDL_EnableLocationTracking(%i)\n",param); err = PDL_EnableLocationTracking(param); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError()); // vehicle_webos_close(priv); // return 0; } callback_list_destroy(cbl); } static void vehicle_webos_init_pdl_locationtracking(struct vehicle_priv *priv, int param) { struct callback *cb = NULL; struct callback_list *cbl = NULL; cbl = callback_list_new(); cb = callback_new_3(callback_cast(vehicle_webos_init_pdl_locationtracking_callback),priv,cbl,param); callback_list_add(cbl, cb); event_call_callback(cbl); } /********************************************************************/ static int vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer) { char *nmea_data_buf, *p, *item[32]; double lat, lng; int i, bcsum; int len = strlen(buffer); unsigned char csum = 0; int valid=0; int ret = 0; dbg(lvl_info, "enter: buffer='%s'\n", buffer); for (;;) { if (len < 4) { dbg(lvl_error, "'%s' too short\n", buffer); return ret; } if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { buffer[--len] = '\0'; if (buffer[len - 1] == '\r') buffer[--len] = '\0'; } else break; } if (buffer[0] != '$') { dbg(lvl_error, "no leading $ in '%s'\n", buffer); return ret; } if (buffer[len - 3] != '*') { dbg(lvl_error, "no *XX in '%s'\n", buffer); return ret; } for (i = 1; i < len - 3; i++) { csum ^= (unsigned char) (buffer[i]); } if (!sscanf(buffer + len - 2, "%x", &bcsum) /*&& priv->checksum_ignore != 2*/) { dbg(lvl_error, "no checksum in '%s'\n", buffer); return ret; } if (bcsum != csum /*&& priv->checksum_ignore == 0*/) { dbg(lvl_error, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum); return ret; } if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(lvl_error, "nmea buffer overflow, discarding '%s'\n", buffer); } i = 0; p = buffer; while (i < 31) { item[i++] = p; while (*p && *p != ',') p++; if (!*p) break; *p++ = '\0'; } // if (buffer[0] == '$') { // struct timeval tv; // gettimeofday(&tv,NULL); priv->delta = 0; // (unsigned int)difftime(tv.tv_sec, priv->fix_time); // priv->fix_time = tv.tv_sec; // dbg(lvl_info,"delta(%i)\n",priv->delta); // } if (!strncmp(buffer, "$GPGGA", 6)) { /* 1 1111 0 1 2 3 4 5 6 7 8 9 0 1234 $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] */ if (*item[2] && *item[3] && *item[4] && *item[5]) { lat = g_ascii_strtod(item[2], NULL); priv->geo.lat = floor(lat / 100); lat -= priv->geo.lat * 100; priv->geo.lat += lat / 60; if (!g_strcasecmp(item[3],"S")) priv->geo.lat=-priv->geo.lat; lng = g_ascii_strtod(item[4], NULL); priv->geo.lng = floor(lng / 100); lng -= priv->geo.lng * 100; priv->geo.lng += lng / 60; if (!g_strcasecmp(item[5],"W")) priv->geo.lng=-priv->geo.lng; priv->valid=attr_position_valid_valid; dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); } else priv->valid=attr_position_valid_invalid; if (*item[6]) sscanf(item[6], "%d", &priv->status); if (*item[7]) sscanf(item[7], "%d", &priv->sats_used); if (*item[8]) sscanf(item[8], "%lf", &priv->hdop); if (*item[1]) { struct tm tm; strptime(item[1],"%H%M%S",&tm); priv->fix_time = mktime(&tm); } if (*item[9]) sscanf(item[9], "%lf", &priv->altitude); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; #if 0 if (priv->file_type == file_type_file) { if (priv->watch) { vehicle_file_disable_watch(priv); event_add_timeout(priv->time, 0, priv->cbt); } } #endif ret = 1; } if (!strncmp(buffer, "$GPVTG", 6)) { /* 0 1 2 34 5 6 7 8 $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] */ if (item[1] && item[7]) valid = 1; if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) valid = 1; if (valid) { priv->track = g_ascii_strtod( item[1], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); dbg(lvl_info,"direction %lf, speed %2.1lf\n", priv->track, priv->speed); } } if (!strncmp(buffer, "$GPRMC", 6)) { /* 1 1 0 1 2 3 4 5 6 7 8 9 0 1 $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], magnetic variation[10],magnetic variation direction[11] */ if (*item[2] == 'A') valid = 1; if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) valid = 1; if (valid) { priv->track = g_ascii_strtod( item[8], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); priv->speed *= 1.852; struct tm tm; char time[13]; sprintf(time,"%s%s",item[1],item[9]); strptime(time,"%H%M%S%d%m%y",&tm); priv->fix_time = mktime(&tm); #if 0 sscanf(item[9], "%02d%02d%02d", &priv->fixday, &priv->fixmonth, &priv->fixyear); priv->fixyear += 2000; #endif } ret = 1; } if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { /* 0 GSV Satellites in view 1 2 Number of sentences for full data 2 1 sentence 1 of 2 3 08 Number of satellites in view 4 01 Satellite PRN number 5 40 Elevation, degrees 6 083 Azimuth, degrees 7 46 SNR - higher is better for up to 4 satellites per sentence *75 the checksum data, always begins with * */ if (item[3]) { sscanf(item[3], "%d", &priv->sats_visible); } #if 0 j=4; while (j+4 <= i && priv->current_count < 24) { struct gps_sat *sat=&priv->next[priv->next_count++]; sat->prn=atoi(item[j]); sat->elevation=atoi(item[j+1]); sat->azimuth=atoi(item[j+2]); sat->snr=atoi(item[j+3]); j+=4; } if (!strcmp(item[1], item[2])) { priv->sats_signal=0; for (i = 0 ; i < priv->next_count ; i++) { priv->current[i]=priv->next[i]; if (priv->current[i].snr) priv->sats_signal++; } priv->current_count=priv->next_count; priv->next_count=0; } #endif } #if 0 if (!strncmp(buffer, "$GPZDA", 6)) { /* 0 1 2 3 4 5 6 $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC hhmmss HrMinSec(UTC) dd,mm,yyy Day,Month,Year xx local zone hours -13..13 yy local zone minutes 0..59 */ if (item[1] && item[2] && item[3] && item[4]) { strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); priv->fixday = atoi(item[2]); priv->fixmonth = atoi(item[3]); priv->fixyear = atoi(item[4]); } } #endif if (!strncmp(buffer, "$IISMD", 6)) { /* 0 1 2 3 4 $IISMD,dir,press,height,temp*CC" dir Direction (0-359) press Pressure (hpa, i.e. 1032) height Barometric height above ground (meter) temp Temperature (Degree Celsius) */ if (item[1]) { priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); dbg(lvl_debug,"magnetic %d\n", priv->magnetic_direction); } } return ret; } static void vehicle_webos_spp_handle_read(PDL_ServiceParameters *params, void *user) { struct vehicle_priv *priv = user; int size, rc = 0; char *str, *tok; //PDL_Err err; size = PDL_GetParamInt(params, "dataLength"); if (size > buffer_size) { dbg(lvl_error, "read returned too much data\n"); return; } char buffer[buffer_size]; PDL_GetParamString(params,"data",buffer,buffer_size); dbg(lvl_debug,"data(%s) dataLength(%i)\n",buffer,size); memmove(priv->buffer + priv->buffer_pos, buffer, size); priv->buffer_pos += size; priv->buffer[priv->buffer_pos] = '\0'; dbg(lvl_debug, "size=%d pos=%d buffer='%s'\n", size, priv->buffer_pos, priv->buffer); str = priv->buffer; while ((tok = strchr(str, '\n'))) { *tok++ = '\0'; dbg(lvl_debug, "line='%s'\n", str); rc += vehicle_webos_parse_nmea(priv, str); str = tok; // if (priv->file_type == file_type_file && rc) // break; } if (str != priv->buffer) { size = priv->buffer + priv->buffer_pos - str; memmove(priv->buffer, str, size + 1); priv->buffer_pos = size; dbg(lvl_debug,"now pos=%d buffer='%s'\n", priv->buffer_pos, priv->buffer); } else if (priv->buffer_pos == buffer_size - 1) { dbg(lvl_error,"Overflow. Most likely wrong baud rate or no nmea protocol\n"); priv->buffer_pos = 0; } if (rc) { SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = PDL_GPS_UPDATE; userevent.data1 = NULL; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } vehicle_webos_spp_init_read(priv, buffer_size - priv->buffer_pos - 1); } static void vehicle_webos_spp_init_read(struct vehicle_priv *priv, unsigned int length) { //PDL_Err err; char parameters[128]; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"dataLength\":%i}", priv->spp_instance_id, length); mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/read", parameters, (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_read, priv, PDL_FALSE ); #if 0 if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCall failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return; } #endif } static void vehicle_webos_spp_handle_open(PDL_ServiceParameters *params, void *user) { struct vehicle_priv *priv = (struct vehicle_priv *)user; if (!priv->buffer) priv->buffer = g_malloc(buffer_size); dbg(lvl_debug,"instanceId(%i)\n",priv->spp_instance_id); priv->gps_type = GPS_TYPE_BT; vehicle_webos_spp_init_read(priv, buffer_size-1); } static void vehicle_webos_spp_notify(PDL_ServiceParameters *params, void *user) { struct vehicle_priv *priv = user; char notification[128]; char parameters[128]; const char *params_json = PDL_GetParamJson(params); dbg(lvl_info,"params_json(%s)\n", params_json); if (PDL_ParamExists(params, "errorText")) { PDL_GetParamString(params, "errorText", notification, sizeof(notification)); dbg(lvl_error,"errorText(%s)\n",notification); return; } PDL_GetParamString(params, "notification", notification, sizeof(notification)); notification[sizeof(notification)-1] = '\0'; dbg(lvl_warning,"notification(%s) %i\n",notification,PDL_ParamExists(params, "notification")); if(strcmp(notification,"notifnservicenames") == 0) { int instance_id = PDL_GetParamInt(params, "instanceId"); dbg(lvl_debug,"instanceId(%i)\n", instance_id); cJSON *root = cJSON_Parse(params_json); if (!root) { dbg(lvl_error,"parsing json failed\n"); return; } cJSON *services = cJSON_GetObjectItem(root, "services"); char *service_name = cJSON_GetArrayItem(services, 0)->valuestring; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i, \"servicename\":\"%s\"}",instance_id, service_name); mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/selectservice", parameters); cJSON_Delete(root); } else if(strcmp(notification,"notifnconnected") == 0) { if (PDL_GetParamInt(params,"error") == 0) { vehicle_webos_init_pdl_locationtracking(priv, 0); int instance_id = PDL_GetParamInt(params, "instanceId"); priv->spp_instance_id = instance_id; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", instance_id); mlPDL_ServiceCallWithCallback("palm://com.palm.service.bluetooth.spp/open", parameters, (PDL_ServiceCallbackFunc)vehicle_webos_spp_handle_open, priv, PDL_TRUE); } else { dbg(lvl_error,"notifnconnected error(%i)\n",PDL_GetParamInt(params,"error")); } } else if(strcmp(notification,"notifndisconnected") == 0) { priv->gps_type = GPS_TYPE_NONE; snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}",priv->spp_instance_id); mlPDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters); priv->spp_instance_id = 0; vehicle_webos_init_pdl_locationtracking(priv, 1); } } static void vehicle_webos_init_bt_gps(struct vehicle_priv *priv, char *addr) { char parameters[128]; dbg(lvl_debug,"subscribeNotifications\n"); mlPDL_ServiceCallWithCallback("palm://com.palm.bluetooth/spp/subscribenotifications", "{\"subscribe\":true}", (PDL_ServiceCallbackFunc)vehicle_webos_spp_notify, priv, PDL_FALSE); #if 0 if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return; } #endif snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", addr); mlPDL_ServiceCall("palm://com.palm.bluetooth/spp/connect", parameters); #if 0 if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCall failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return; } #endif priv->spp_address = addr; } static void vehicle_webos_bt_gap_callback(PDL_ServiceParameters *params, void *param) { const char *params_json; struct vehicle_priv *priv = (struct vehicle_priv *)param; char *device_addr = NULL; cJSON *root; dbg(lvl_debug,"enter\n"); PDL_Err err; err = PDL_GetParamInt(params, "errorCode"); if (err != PDL_NOERROR) { dbg(lvl_error,"BT GAP Callback errorCode %d\n", err); return /*PDL_EOTHER*/; } params_json = PDL_GetParamJson(params); dbg(lvl_info,"params_json(%s)\n",params_json); root = cJSON_Parse(params_json); if (!root) { dbg(lvl_error,"parsing json failed\n"); return; } cJSON *trusted_devices = cJSON_GetObjectItem(root, "trusteddevices"); unsigned int i,c = cJSON_GetArraySize(trusted_devices); dbg(lvl_debug, "trusted_devices(%i)\n",c); for(i=0; i < c && !device_addr; i++) { cJSON *device = cJSON_GetArrayItem(trusted_devices,i); char *name = cJSON_GetObjectItem(device, "name")->valuestring; char *address = cJSON_GetObjectItem(device, "address")->valuestring; char *status = cJSON_GetObjectItem(device, "status")->valuestring; dbg(lvl_debug,"i(%i) name(%s) address(%s) status(%s)\n",i,name,address,status); if (/*strncmp(status, "connected",9) == 0 && */strstr(name, "GPS") != NULL) { dbg(lvl_debug,"choose name(%s) address(%s)\n",name,address); device_addr = g_strdup(address); break; } } cJSON_Delete(root); if (device_addr) { vehicle_webos_init_bt_gps(priv, device_addr); } g_free(device_addr); } int vehicle_webos_bt_open(struct vehicle_priv *priv) { // Try to connect to BT GPS, or use PDL method dbg(lvl_debug,"enter\n"); PDL_Err err; err = PDL_ServiceCallWithCallback("palm://com.palm.bluetooth/gap/gettrusteddevices", "{}", (PDL_ServiceCallbackFunc)vehicle_webos_bt_gap_callback, priv, PDL_TRUE); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return 0; } return 1; } void vehicle_webos_bt_close(struct vehicle_priv *priv) { dbg(lvl_debug,"XXX\n"); char parameters[128]; if (priv->spp_instance_id) { snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}", priv->spp_instance_id); PDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters); } if (priv->spp_address) { snprintf(parameters, sizeof(parameters), "{\"address\":\"%s\"}", priv->spp_address); PDL_ServiceCall("palm://com.palm.bluetooth.spp/disconnect", parameters); g_free(priv->spp_address); priv->spp_address = NULL; } //g_free(priv->buffer); //priv->buffer = NULL; // g_free(priv->nmea_data); // priv->nmea_data = NULL; // g_free(priv->nmea_data_buf); // priv->nmea_data_buf = NULL; } navit-0.5.0+dfsg.1/navit/vehicle/webos/bluetooth.h000066400000000000000000000002041264204753600217550ustar00rootroot00000000000000 #include "cJSON.h" int vehicle_webos_bt_open(struct vehicle_priv *priv); void vehicle_webos_bt_close(struct vehicle_priv *priv); navit-0.5.0+dfsg.1/navit/vehicle/webos/cJSON.c000066400000000000000000000461121264204753600206670ustar00rootroot00000000000000/* Copyright (c) 2009 Dave Gamble Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* cJSON */ /* JSON parser in C. */ #include #include #include #include #include #include #include #include "cJSON.h" static const char *ep; const char *cJSON_GetErrorPtr() {return ep;} static int cJSON_strcasecmp(const char *s1,const char *s2) { if (!s1) return (s1==s2)?0:1;if (!s2) return 1; for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) if(*s1 == 0) return 0; return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2); } static void *(*cJSON_malloc)(size_t sz) = malloc; static void (*cJSON_free)(void *ptr) = free; static char* cJSON_strdup(const char* str) { size_t len; char* copy; len = strlen(str) + 1; if (!(copy = (char*)cJSON_malloc(len))) return 0; memcpy(copy,str,len); return copy; } void cJSON_InitHooks(cJSON_Hooks* hooks) { if (!hooks) { /* Reset hooks */ cJSON_malloc = malloc; cJSON_free = free; return; } cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; cJSON_free = (hooks->free_fn)?hooks->free_fn:free; } /* Internal constructor. */ static cJSON *cJSON_New_Item(void) { cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); if (node) memset(node,0,sizeof(cJSON)); return node; } /* Delete a cJSON structure. */ void cJSON_Delete(cJSON *c) { cJSON *next; while (c) { next=c->next; if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child); if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring); if (c->string) cJSON_free(c->string); cJSON_free(c); c=next; } } /* Parse the input text to generate a number, and populate the result into item. */ static const char *parse_number(cJSON *item,const char *num) { double n=0,sign=1,scale=0;int subscale=0,signsubscale=1; /* Could use sscanf for this? */ if (*num=='-') sign=-1,num++; /* Has sign? */ if (*num=='0') num++; /* is zero */ if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* Number? */ if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* Fractional part? */ if (*num=='e' || *num=='E') /* Exponent? */ { num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* With sign? */ while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */ } n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ item->valuedouble=n; item->valueint=(int)n; item->type=cJSON_Number; return num; } /* Render the number nicely from the given item into a string. */ static char *print_number(cJSON *item) { char *str; double d=item->valuedouble; if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN) { str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */ if (str) sprintf(str,"%d",item->valueint); } else { str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ if (str) { if (fabs(floor(d)-d)<=DBL_EPSILON) sprintf(str,"%.0f",d); else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); else sprintf(str,"%f",d); } } return str; } /* Parse the input text into an unescaped cstring, and populate item. */ static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; static const char *parse_string(cJSON *item,const char *str) { const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2; if (*str!='\"') {ep=str;return 0;} /* not a string! */ while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */ out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */ if (!out) return 0; ptr=str+1;ptr2=out; while (*ptr!='\"' && *ptr) { if (*ptr!='\\') *ptr2++=*ptr++; else { ptr++; switch (*ptr) { case 'b': *ptr2++='\b'; break; case 'f': *ptr2++='\f'; break; case 'n': *ptr2++='\n'; break; case 'r': *ptr2++='\r'; break; case 't': *ptr2++='\t'; break; case 'u': /* transcode utf16 to utf8. */ sscanf(ptr+1,"%4x",&uc);ptr+=4; /* get the unicode char. */ if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; // check for invalid. if (uc>=0xD800 && uc<=0xDBFF) // UTF16 surrogate pairs. { if (ptr[1]!='\\' || ptr[2]!='u') break; // missing second-half of surrogate. sscanf(ptr+3,"%4x",&uc2);ptr+=6; if (uc2<0xDC00 || uc2>0xDFFF) break; // invalid second-half of surrogate. uc=0x10000 | ((uc&0x3FF)<<10) | (uc2&0x3FF); } len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; switch (len) { case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 1: *--ptr2 =(uc | firstByteMark[len]); } ptr2+=len; break; default: *ptr2++=*ptr; break; } ptr++; } } *ptr2=0; if (*ptr=='\"') ptr++; item->valuestring=out; item->type=cJSON_String; return ptr; } /* Render the cstring provided to an escaped version that can be printed. */ static char *print_string_ptr(const char *str) { const char *ptr;char *ptr2,*out;int len=0;unsigned char token; if (!str) return cJSON_strdup(""); ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} out=(char*)cJSON_malloc(len+3); if (!out) return 0; ptr2=out;ptr=str; *ptr2++='\"'; while (*ptr) { if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++; else { *ptr2++='\\'; switch (token=*ptr++) { case '\\': *ptr2++='\\'; break; case '\"': *ptr2++='\"'; break; case '\b': *ptr2++='b'; break; case '\f': *ptr2++='f'; break; case '\n': *ptr2++='n'; break; case '\r': *ptr2++='r'; break; case '\t': *ptr2++='t'; break; default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */ } } } *ptr2++='\"';*ptr2++=0; return out; } /* Invote print_string_ptr (which is useful) on an item. */ static char *print_string(cJSON *item) {return print_string_ptr(item->valuestring);} /* Predeclare these prototypes. */ static const char *parse_value(cJSON *item,const char *value); static char *print_value(cJSON *item,int depth,int fmt); static const char *parse_array(cJSON *item,const char *value); static char *print_array(cJSON *item,int depth,int fmt); static const char *parse_object(cJSON *item,const char *value); static char *print_object(cJSON *item,int depth,int fmt); /* Utility to jump whitespace and cr/lf */ static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;} /* Parse an object - create a new root, and populate. */ cJSON *cJSON_Parse(const char *value) { cJSON *c=cJSON_New_Item(); ep=0; if (!c) return 0; /* memory fail */ if (!parse_value(c,skip(value))) {cJSON_Delete(c);return 0;} return c; } /* Render a cJSON item/entity/structure to text. */ char *cJSON_Print(cJSON *item) {return print_value(item,0,1);} char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0);} /* Parser core - when encountering text, process appropriately. */ static const char *parse_value(cJSON *item,const char *value) { if (!value) return 0; /* Fail on null. */ if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; } if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; } if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; } if (*value=='\"') { return parse_string(item,value); } if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); } if (*value=='[') { return parse_array(item,value); } if (*value=='{') { return parse_object(item,value); } ep=value;return 0; /* failure. */ } /* Render a value to text. */ static char *print_value(cJSON *item,int depth,int fmt) { char *out=0; if (!item) return 0; switch ((item->type)&255) { case cJSON_NULL: out=cJSON_strdup("null"); break; case cJSON_False: out=cJSON_strdup("false");break; case cJSON_True: out=cJSON_strdup("true"); break; case cJSON_Number: out=print_number(item);break; case cJSON_String: out=print_string(item);break; case cJSON_Array: out=print_array(item,depth,fmt);break; case cJSON_Object: out=print_object(item,depth,fmt);break; } return out; } /* Build an array from input text. */ static const char *parse_array(cJSON *item,const char *value) { cJSON *child; if (*value!='[') {ep=value;return 0;} /* not an array! */ item->type=cJSON_Array; value=skip(value+1); if (*value==']') return value+1; /* empty array. */ item->child=child=cJSON_New_Item(); if (!item->child) return 0; /* memory fail */ value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */ if (!value) return 0; while (*value==',') { cJSON *new_item; if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ child->next=new_item;new_item->prev=child;child=new_item; value=skip(parse_value(child,skip(value+1))); if (!value) return 0; /* memory fail */ } if (*value==']') return value+1; /* end of array */ ep=value;return 0; /* malformed. */ } /* Render an array to text */ static char *print_array(cJSON *item,int depth,int fmt) { char **entries; char *out=0,*ptr,*ret;int len=5; cJSON *child=item->child; int numentries=0,i=0,fail=0; /* How many entries in the array? */ while (child) numentries++,child=child->next; /* Allocate an array to hold the values for each */ entries=(char**)cJSON_malloc(numentries*sizeof(char*)); if (!entries) return 0; memset(entries,0,numentries*sizeof(char*)); /* Retrieve all the results: */ child=item->child; while (child && !fail) { ret=print_value(child,depth+1,fmt); entries[i++]=ret; if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; child=child->next; } /* If we didn't fail, try to malloc the output string */ if (!fail) out=(char*)cJSON_malloc(len); /* If that fails, we fail. */ if (!out) fail=1; /* Handle failure. */ if (fail) { for (i=0;itype=cJSON_Object; value=skip(value+1); if (*value=='}') return value+1; /* empty array. */ item->child=child=cJSON_New_Item(); if (!item->child) return 0; value=skip(parse_string(child,skip(value))); if (!value) return 0; child->string=child->valuestring;child->valuestring=0; if (*value!=':') {ep=value;return 0;} /* fail! */ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; while (*value==',') { cJSON *new_item; if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ child->next=new_item;new_item->prev=child;child=new_item; value=skip(parse_string(child,skip(value+1))); if (!value) return 0; child->string=child->valuestring;child->valuestring=0; if (*value!=':') {ep=value;return 0;} /* fail! */ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; } if (*value=='}') return value+1; /* end of array */ ep=value;return 0; /* malformed. */ } /* Render an object to text. */ static char *print_object(cJSON *item,int depth,int fmt) { char **entries=0,**names=0; char *out=0,*ptr,*ret,*str;int len=7,i=0,j; cJSON *child=item->child; int numentries=0,fail=0; /* Count the number of entries. */ while (child) numentries++,child=child->next; /* Allocate space for the names and the objects */ entries=(char**)cJSON_malloc(numentries*sizeof(char*)); if (!entries) return 0; names=(char**)cJSON_malloc(numentries*sizeof(char*)); if (!names) {cJSON_free(entries);return 0;} memset(entries,0,sizeof(char*)*numentries); memset(names,0,sizeof(char*)*numentries); /* Collect all the results into our arrays: */ child=item->child;depth++;if (fmt) len+=depth; while (child) { names[i]=str=print_string_ptr(child->string); entries[i++]=ret=print_value(child,depth,fmt); if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; child=child->next; } /* Try to allocate the output string */ if (!fail) out=(char*)cJSON_malloc(len); if (!out) fail=1; /* Handle failure */ if (fail) { for (i=0;ichild;int i=0;while(c)i++,c=c->next;return i;} cJSON *cJSON_GetArrayItem(cJSON *array,int item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} /* Utility for array list handling. */ static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;} /* Utility for handling references. */ static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;} /* Add item to array/object. */ void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}} void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);} void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));} cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return 0; if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;} void cJSON_DeleteItemFromArray(cJSON *array,int which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));} /* Replace array/object items with new ones. */ void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return; newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem; if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);} void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}} /* Create basic types: */ cJSON *cJSON_CreateNull() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;} cJSON *cJSON_CreateTrue() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;} cJSON *cJSON_CreateFalse() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;} cJSON *cJSON_CreateBool(int b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int)num;}return item;} cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} cJSON *cJSON_CreateArray() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} cJSON *cJSON_CreateObject() {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;} /* Create Arrays: */ cJSON *cJSON_CreateIntArray(int *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateFloatArray(float *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateDoubleArray(double *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} navit-0.5.0+dfsg.1/navit/vehicle/webos/cJSON.h000066400000000000000000000132521264204753600206730ustar00rootroot00000000000000/* Copyright (c) 2009 Dave Gamble Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef cJSON__h #define cJSON__h #ifdef __cplusplus extern "C" { #endif /* cJSON Types: */ #define cJSON_False 0 #define cJSON_True 1 #define cJSON_NULL 2 #define cJSON_Number 3 #define cJSON_String 4 #define cJSON_Array 5 #define cJSON_Object 6 #define cJSON_IsReference 256 /* The cJSON structure: */ typedef struct cJSON { struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ int type; /* The type of the item, as above. */ char *valuestring; /* The item's string, if type==cJSON_String */ int valueint; /* The item's number, if type==cJSON_Number */ double valuedouble; /* The item's number, if type==cJSON_Number */ char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ } cJSON; typedef struct cJSON_Hooks { void *(*malloc_fn)(size_t sz); void (*free_fn)(void *ptr); } cJSON_Hooks; /* Supply malloc, realloc and free functions to cJSON */ extern void cJSON_InitHooks(cJSON_Hooks* hooks); /* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ extern cJSON *cJSON_Parse(const char *value); /* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ extern char *cJSON_Print(cJSON *item); /* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ extern char *cJSON_PrintUnformatted(cJSON *item); /* Delete a cJSON entity and all subentities. */ extern void cJSON_Delete(cJSON *c); /* Returns the number of items in an array (or object). */ extern int cJSON_GetArraySize(cJSON *array); /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ extern cJSON *cJSON_GetArrayItem(cJSON *array,int item); /* Get item "string" from object. Case insensitive. */ extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ extern const char *cJSON_GetErrorPtr(void); /* These calls create a cJSON item of the appropriate type. */ extern cJSON *cJSON_CreateNull(void); extern cJSON *cJSON_CreateTrue(void); extern cJSON *cJSON_CreateFalse(void); extern cJSON *cJSON_CreateBool(int b); extern cJSON *cJSON_CreateNumber(double num); extern cJSON *cJSON_CreateString(const char *string); extern cJSON *cJSON_CreateArray(void); extern cJSON *cJSON_CreateObject(void); /* These utilities create an Array of count items. */ extern cJSON *cJSON_CreateIntArray(int *numbers,int count); extern cJSON *cJSON_CreateFloatArray(float *numbers,int count); extern cJSON *cJSON_CreateDoubleArray(double *numbers,int count); extern cJSON *cJSON_CreateStringArray(const char **strings,int count); /* Append item to the specified array/object. */ extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item); /* Remove/Detatch items from Arrays/Objects. */ extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which); extern void cJSON_DeleteItemFromArray(cJSON *array,int which); extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string); /* Update array items. */ extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem); extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); #define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) #define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) #define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/vehicle/webos/vehicle_webos.c000066400000000000000000000226711264204753600225750ustar00rootroot00000000000000/** * vim: sw=3 ts=3 * * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "vehicle.h" #include "event.h" #include "vehicle_webos.h" #include "bluetooth.h" static char *vehicle_webos_prefix="webos:"; /*******************************************************************/ static void vehicle_webos_callback(PDL_ServiceParameters *params, void *priv) { PDL_Location *location; SDL_Event event; SDL_UserEvent userevent; int err; err = PDL_GetParamInt(params, "errorCode"); if (err != 0) { dbg(lvl_error,"Location Callback errorCode %d\n", err); return /*PDL_EOTHER*/; } location = g_new0 (PDL_Location, 1); location->altitude = PDL_GetParamDouble(params, "altitude"); location->velocity = PDL_GetParamDouble(params, "velocity"); location->heading = PDL_GetParamDouble(params, "heading"); location->horizontalAccuracy = PDL_GetParamDouble(params, "horizAccuracy"); location->latitude = PDL_GetParamDouble(params, "latitude"); location->longitude = PDL_GetParamDouble(params, "longitude"); userevent.type = SDL_USEREVENT; userevent.code = PDL_GPS_UPDATE; userevent.data1 = location; userevent.data2 = NULL; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); return /*PDL_NOERROR*/; } static void vehicle_webos_gps_update(struct vehicle_priv *priv, PDL_Location *location) { if(location) { // location may be NULL if called by bluetooth-code. priv is already prefilled there struct timeval tv; gettimeofday(&tv,NULL); priv->delta = (int)difftime(tv.tv_sec, priv->fix_time); dbg(lvl_info,"delta(%i)\n",priv->delta); priv->fix_time = tv.tv_sec; priv->geo.lat = location->latitude; /* workaround for webOS GPS bug following */ priv->geo.lng = (priv->pdk_version >= 200 && location->longitude >= -1 && location->longitude <= 1) ? -location->longitude : location->longitude; dbg(lvl_info,"Location: %f %f %f %.12g %.12g +-%fm\n", location->altitude, location->velocity, location->heading, priv->geo.lat, priv->geo.lng, location->horizontalAccuracy); if (location->altitude != -1) priv->altitude = location->altitude; if (location->velocity != -1) priv->speed = location->velocity * 3.6; if (location->heading != -1) priv->track = location->heading; if (location->horizontalAccuracy != -1) priv->radius = location->horizontalAccuracy; if (priv->pdk_version <= 100) g_free(location); } callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } static void vehicle_webos_timeout_callback(struct vehicle_priv *priv) { struct timeval tv; gettimeofday(&tv,NULL); if (priv->fix_time && priv->delta) { int delta = (int)difftime(tv.tv_sec, priv->fix_time); if (delta >= priv->delta*2) { dbg(lvl_warning, "GPS timeout triggered cb(%p) delta(%d)\n", priv->timeout_cb, delta); priv->delta = -1; callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } } } void vehicle_webos_close(struct vehicle_priv *priv) { event_remove_timeout(priv->ev_timeout); priv->ev_timeout = NULL; callback_destroy(priv->timeout_cb); if (priv->pdk_version <= 100) PDL_UnregisterServiceCallback((PDL_ServiceCallbackFunc)vehicle_webos_callback); else { PDL_EnableLocationTracking(PDL_FALSE); vehicle_webos_bt_close(priv); } } static int vehicle_webos_open(struct vehicle_priv *priv) { PDL_Err err; priv->pdk_version = PDL_GetPDKVersion(); dbg(lvl_debug,"pdk_version(%d)\n", priv->pdk_version); if (priv->pdk_version <= 100) { // Use Location Service via callback interface err = PDL_ServiceCallWithCallback("palm://com.palm.location/startTracking", "{subscribe:true}", (PDL_ServiceCallbackFunc)vehicle_webos_callback, priv, PDL_FALSE); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return 0; } } else { PDL_Err err; err = PDL_EnableLocationTracking(PDL_TRUE); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError()); // vehicle_webos_close(priv); // return 0; } priv->gps_type = GPS_TYPE_INT; if(!vehicle_webos_bt_open(priv)) return 0; } priv->ev_timeout = event_add_timeout(1000, 1, priv->timeout_cb); return 1; } static void vehicle_webos_destroy(struct vehicle_priv *priv) { vehicle_webos_close(priv); if (priv->source) g_free(priv->source); g_free(priv); } static int vehicle_webos_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_height: dbg(lvl_info,"Altitude: %f\n", priv->altitude); attr->u.numd = &priv->altitude; break; case attr_position_speed: dbg(lvl_info,"Speed: %f\n", priv->speed); attr->u.numd = &priv->speed; break; case attr_position_direction: dbg(lvl_info,"Direction: %f\n", priv->track); attr->u.numd = &priv->track; break; case attr_position_magnetic_direction: switch (priv->gps_type) { case GPS_TYPE_BT: attr->u.num = priv->magnetic_direction; break; default: return 0; break; } break; case attr_position_hdop: switch (priv->gps_type) { case GPS_TYPE_BT: attr->u.numd = &priv->hdop; break; default: return 0; break; } break; case attr_position_coord_geo: dbg(lvl_info,"Coord: %.12g %.12g\n", priv->geo.lat, priv->geo.lng); attr->u.coord_geo = &priv->geo; break; case attr_position_radius: dbg(lvl_info,"Radius: %f\n", priv->radius); attr->u.numd = &priv->radius; break; case attr_position_time_iso8601: if (priv->fix_time) { struct tm tm; if (gmtime_r(&priv->fix_time, &tm)) { strftime(priv->fixiso8601, sizeof(priv->fixiso8601), "%Y-%m-%dT%TZ", &tm); attr->u.str=priv->fixiso8601; } else { priv->fix_time = 0; return 0; } dbg(lvl_info,"Fix Time: %d %s\n", priv->fix_time, priv->fixiso8601); } else { dbg(lvl_info,"Fix Time: %d\n", priv->fix_time); return 0; } break; case attr_position_fix_type: switch (priv->gps_type) { case GPS_TYPE_INT: if (priv->delta <= 0 || priv->radius == 0.0) attr->u.num = 0; // strength = 1 else if (priv->radius > 20.0) attr->u.num = 1; // strength >= 2 else attr->u.num = 2; // strength >= 2 break; case GPS_TYPE_BT: attr->u.num = priv->status; break; default: return 0; break; } break; case attr_position_sats_used: switch (priv->gps_type) { case GPS_TYPE_INT: if (priv->delta <= 0) attr->u.num = 0; else if (priv->radius <= 6.0 ) attr->u.num = 6; // strength = 5 else if (priv->radius <= 10.0 ) attr->u.num = 5; // strength = 4 else if (priv->radius <= 15.0 ) attr->u.num = 4; // strength = 3 else return 0; break; case GPS_TYPE_BT: attr->u.num = priv->sats_used; break; default: return 0; break; } break; default: return 0; } attr->type = type; return 1; } static int vehicle_webos_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) { switch (attr->type) { case attr_source: if (strncmp(vehicle_webos_prefix,attr->u.str,strlen(vehicle_webos_prefix))) { dbg(lvl_warning,"source must start with '%s'\n", vehicle_webos_prefix); return 0; } g_free(priv->source); priv->source=g_strdup(attr->u.str); priv->address=priv->source+strlen(vehicle_webos_prefix); if (!priv->address[0]) priv->address=NULL; if (!init) { vehicle_webos_close(priv); vehicle_webos_open(priv); } return 1; case attr_profilename: return 1; case attr_pdl_gps_update: vehicle_webos_gps_update(priv, (PDL_Location *)attr->u.data); return 1; default: return 0; } } static int vehicle_webos_set_attr(struct vehicle_priv *priv, struct attr *attr) { return vehicle_webos_set_attr_do(priv, attr, 0); } struct vehicle_methods vehicle_webos_methods = { vehicle_webos_destroy, vehicle_webos_position_attr_get, vehicle_webos_set_attr, }; static struct vehicle_priv * vehicle_webos_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *priv; priv = g_new0(struct vehicle_priv, 1); priv->attrs = attrs; priv->cbl = cbl; priv->timeout_cb = callback_new_1(callback_cast(vehicle_webos_timeout_callback), priv); *meth = vehicle_webos_methods; while (*attrs) { vehicle_webos_set_attr_do(priv, *attrs, 1); attrs++; } vehicle_webos_open(priv); return priv; } void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("webos", vehicle_webos_new); } navit-0.5.0+dfsg.1/navit/vehicle/webos/vehicle_webos.h000066400000000000000000000013151264204753600225720ustar00rootroot00000000000000#include "coord.h" #define GPS_TYPE_NONE 0 #define GPS_TYPE_INT 1 #define GPS_TYPE_BT 2 struct vehicle_priv { char *address; char *source; char *spp_address; char *buffer; char *nmea_data_buf; char *nmea_data; char fixiso8601[128]; double track, speed, altitude, radius; double hdop; int gps_type; int pdk_version; int spp_instance_id; int buffer_pos; int delta; int sats_used; int sats_visible; int magnetic_direction; int status; int valid; time_t fix_time; struct attr ** attrs; struct callback *event_cb; struct callback *timeout_cb; struct callback_list *cbl; struct coord_geo geo; struct event_timeout *ev_timeout; }; extern void vehicle_webos_close(struct vehicle_priv *priv); navit-0.5.0+dfsg.1/navit/vehicle/wince/000077500000000000000000000000001264204753600175715ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/vehicle/wince/CMakeLists.txt000066400000000000000000000000621264204753600223270ustar00rootroot00000000000000module_add_library(vehicle_wince vehicle_wince.c) navit-0.5.0+dfsg.1/navit/vehicle/wince/Makefile.am000066400000000000000000000004771264204753600216350ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_wince if PLUGINS modulevehicle_LTLIBRARIES = libvehicle_wince.la else noinst_LTLIBRARIES = libvehicle_wince.la endif libvehicle_wince_la_SOURCES = vehicle_wince.c libvehicle_wince_la_LDFLAGS = -module -avoid-version navit-0.5.0+dfsg.1/navit/vehicle/wince/vehicle_wince.c000066400000000000000000000573701264204753600225550ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include "config.h" #include "debug.h" #include "callback.h" #include "plugin.h" #include "coord.h" #include "item.h" #include "event.h" #include "vehicle.h" #include #include #include #include #include #include #include "support/win32/ConvertUTF.h" #define SwitchToThread() Sleep(0) typedef int (WINAPI *PFN_BthSetMode)(DWORD pBthMode); typedef int (WINAPI *PFN_BthGetMode)(DWORD* pBthMode); char *_convert = NULL; wchar_t *_wconvert = NULL; #define W2A(lpw) (\ ((LPCSTR)lpw == NULL) ? NULL : (\ _convert = alloca(wcslen(lpw)+1), wcstombs(_convert, lpw, wcslen(lpw) + 1), _convert) ) #define A2W(lpa) (\ ((LPCSTR)lpa == NULL) ? NULL : (\ _wconvert = alloca(strlen(lpa)*2+1), mbstowcs(_wconvert, lpa, strlen(lpa) * 2 + 1), _wconvert) ) static void vehicle_wince_disable_watch(struct vehicle_priv *priv); static void vehicle_wince_enable_watch(struct vehicle_priv *priv); static int vehicle_wince_parse(struct vehicle_priv *priv, char *buffer); static int vehicle_wince_open(struct vehicle_priv *priv); static void vehicle_wince_close(struct vehicle_priv *priv); enum file_type { file_type_pipe = 1, file_type_device, file_type_file, file_type_socket }; static int buffer_size = 1024; struct gps_sat { int prn; int elevation; int azimuth; int snr; }; struct vehicle_priv { char *source; struct callback_list *cbl; struct callback_list *priv_cbl; int is_running; int thread_up; int fd; HANDLE m_hGPSDevice; // Handle to the device HANDLE m_hGPSThread; // Handle to the thread DWORD m_dwGPSThread; // Thread id char *buffer; int buffer_pos; char *read_buffer; int read_buffer_pos; char *nmea_data; char *nmea_data_buf; struct coord_geo geo; double speed; double direction; double height; double hdop; double vdop; char fixtime[20]; int fixyear; int fixmonth; int fixday; int status; int sats_used; int sats_visible; int sats_signal; int time; int on_eof; int baudrate; enum file_type file_type; struct attr ** attrs; char fixiso8601[128]; int checksum_ignore; HMODULE hBthDll; PFN_BthSetMode BthSetMode; int magnetic_direction; int current_count; struct gps_sat current[24]; int next_count; struct gps_sat next[24]; struct item sat_item; int valid; int has_data; GMutex lock; }; static void initBth(struct vehicle_priv *priv) { BOOL succeeded = FALSE; priv->hBthDll = LoadLibrary(TEXT("bthutil.dll")); if ( priv->hBthDll ) { DWORD bthMode; PFN_BthGetMode BthGetMode = (PFN_BthGetMode)GetProcAddress(priv->hBthDll, TEXT("BthGetMode") ); if ( BthGetMode && BthGetMode(&bthMode) == ERROR_SUCCESS && bthMode == 0 ) { priv->BthSetMode = (PFN_BthSetMode)GetProcAddress(priv->hBthDll, TEXT("BthSetMode") ); if( priv->BthSetMode && priv->BthSetMode(1) == ERROR_SUCCESS ) { dbg(lvl_debug, "bluetooth activated\n"); succeeded = TRUE; } } } else { dbg(lvl_error, "Bluetooth library notfound\n"); } if ( !succeeded ) { dbg(lvl_warning, "Bluetooth already enabled or failed to enable it.\n"); priv->BthSetMode = NULL; if ( priv->hBthDll ) { FreeLibrary(priv->hBthDll); } } } static int initDevice(struct vehicle_priv *priv) { COMMTIMEOUTS commTiming; HANDLE hGPS; if ( priv->m_hGPSDevice ) CloseHandle(priv->m_hGPSDevice); if ( priv->file_type == file_type_device ) { dbg(lvl_debug, "Init Device\n"); /* GPD0 is the control port for the GPS driver */ hGPS = CreateFile(L"GPD0:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hGPS != INVALID_HANDLE_VALUE) { #ifndef IOCTL_SERVICE_REFRESH #define IOCTL_SERVICE_REFRESH 0x4100000C #endif DeviceIoControl(hGPS,IOCTL_SERVICE_REFRESH,0,0,0,0,0,0); #ifndef IOCTL_SERVICE_START #define IOCTL_SERVICE_START 0x41000004 #endif DeviceIoControl(hGPS,IOCTL_SERVICE_START,0,0,0,0,0,0); CloseHandle(hGPS); } while (priv->is_running && (priv->m_hGPSDevice = CreateFile(A2W(priv->source), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) { Sleep(1000); dbg(lvl_debug, "Waiting to connect to %s\n", priv->source); } GetCommTimeouts (priv->m_hGPSDevice, &commTiming); commTiming.ReadIntervalTimeout = 20; commTiming.ReadTotalTimeoutMultiplier = 0; commTiming.ReadTotalTimeoutConstant = 200; commTiming.WriteTotalTimeoutMultiplier=5; commTiming.WriteTotalTimeoutConstant=5; SetCommTimeouts (priv->m_hGPSDevice, &commTiming); if (priv->baudrate) { DCB portState; if (!GetCommState(priv->m_hGPSDevice, &portState)) { MessageBox (NULL, TEXT ("GetCommState Error"), TEXT (""), MB_APPLMODAL|MB_OK); priv->thread_up = 0; return 0; } portState.BaudRate = priv->baudrate; if (!SetCommState(priv->m_hGPSDevice, &portState)) { MessageBox (NULL, TEXT ("SetCommState Error"), TEXT (""), MB_APPLMODAL|MB_OK); priv->thread_up = 0; return 0; } } } else { dbg(lvl_debug, "Open File\n"); priv->m_hGPSDevice = CreateFileW( A2W(priv->source), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); if ( priv->m_hGPSDevice == INVALID_HANDLE_VALUE) { dbg(lvl_error, "Could not open %s\n", priv->source); return 0; } } return 1; } static int read_win32(struct vehicle_priv *priv, char *buffer, size_t size) { int ret_size; g_mutex_lock(&priv->lock); ret_size = MIN(size,priv->read_buffer_pos); priv->has_data = 0; memcpy(buffer, priv->read_buffer, ret_size); memmove(priv->read_buffer, priv->read_buffer + ret_size, buffer_size - ret_size); priv->read_buffer_pos -= ret_size; g_mutex_unlock(&priv->lock); return ret_size; } static DWORD WINAPI wince_reader_thread (LPVOID lParam) { struct vehicle_priv *priv = lParam; char chunk_buffer[3*82]; BOOL status; DWORD bytes_read; int waitcounter; dbg(lvl_debug, "GPS Port:[%s]\n", priv->source); priv->thread_up = 1; if ( !initDevice(priv) ) { return -1; } while (priv->is_running) { dbg(lvl_debug,"readfile\n"); waitcounter = 0; status = ReadFile(priv->m_hGPSDevice, chunk_buffer, sizeof(chunk_buffer), &bytes_read, NULL); if ( !status ) { dbg(lvl_error,"Error reading file/device. Try again.\n"); initDevice(priv); continue; } while ( priv->read_buffer_pos + bytes_read > buffer_size ) { /* TODO (rikky#1#): should use blocking */ if ( priv->file_type != file_type_file ) { dbg(lvl_debug, "GPS data comes too fast. Have to wait here\n"); } Sleep(50); waitcounter++; if ( waitcounter % 8 == 0 ) { dbg(lvl_debug, "Remind them of the data\n"); event_call_callback(priv->priv_cbl); } if(waitcounter % 200 == 0) { dbg(lvl_error,"Will main thread ever be ready for the GPS data? Already %d intervals gone.\n",waitcounter); } } if(waitcounter>2) dbg(lvl_debug,"Sent GPS data to the main thread after %d intervals delay.\n",waitcounter); g_mutex_lock(&priv->lock); memcpy(priv->read_buffer + priv->read_buffer_pos , chunk_buffer, bytes_read ); priv->read_buffer_pos += bytes_read; if ( !priv->has_data ) { event_call_callback(priv->priv_cbl); priv->has_data = 1; } g_mutex_unlock(&priv->lock); } return TRUE; } static int vehicle_wince_available_ports(void) { HKEY hkResult; HKEY hkSubResult; wchar_t keyname[20]; wchar_t devicename[100]; wchar_t devicetype[100]; int index = 0; DWORD regkey_length = sizeof(keyname); DWORD regdevtype_length = sizeof(devicetype); RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Drivers\\Active"), 0, 0, &hkResult); while (RegEnumKeyEx( hkResult, index++, keyname, ®key_length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS ) { if (RegOpenKeyEx( hkResult, keyname, 0, 0, &hkSubResult) == ERROR_SUCCESS ) { regkey_length = sizeof(keyname); if ( RegQueryValueEx( hkSubResult, L"Name", NULL, NULL, (LPBYTE)devicename, ®key_length) == ERROR_SUCCESS ) { regdevtype_length = sizeof(devicetype); if ( RegQueryValueEx( hkSubResult, L"Key", NULL, NULL, (LPBYTE)devicetype, ®devtype_length) == ERROR_SUCCESS ) { dbg(lvl_debug, "Found device '%s' (%s)\n", W2A(devicename), W2A(devicetype)); } else { dbg(lvl_debug, "Found device '%s'\n", W2A(devicename)); } } RegCloseKey(hkSubResult); } regkey_length = sizeof(keyname); } RegCloseKey(hkResult); return 0; } static int vehicle_wince_open(struct vehicle_priv *priv) { char* raw_setting_str; char* strport; char* strsettings; dbg(lvl_debug, "enter vehicle_wince_open, priv->source='%s'\n", priv->source); if (priv->source ) { if ( strcmp(priv->source, "list") == 0 ) { vehicle_wince_available_ports(); return 0; } raw_setting_str = g_strdup( priv->source ); strport = strchr(raw_setting_str, ':' ); strsettings = strchr(raw_setting_str, ' ' ); if (raw_setting_str && strport&&strsettings ) { strport++; *strsettings = '\0'; strsettings++; dbg(lvl_debug, "serial('%s', '%s')\n", strport, strsettings ); } if (raw_setting_str) g_free( raw_setting_str ); } return 1; } static void vehicle_wince_close(struct vehicle_priv *priv) { dbg(lvl_debug,"enter"); } static int vehicle_wince_parse(struct vehicle_priv *priv, char *buffer) { char *nmea_data_buf, *p, *item[32]; double lat, lng; int i, j, bcsum; int len = strlen(buffer); unsigned char csum = 0; int valid=0; int ret = 0; dbg(lvl_info, "enter: buffer='%s'\n", buffer); for (;;) { if (len < 4) { dbg(lvl_error, "'%s' too short\n", buffer); return ret; } if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { buffer[--len] = '\0'; if (buffer[len - 1] == '\r') buffer[--len] = '\0'; } else break; } if (buffer[0] != '$') { dbg(lvl_error, "no leading $ in '%s'\n", buffer); return ret; } if (buffer[len - 3] != '*') { dbg(lvl_error, "no *XX in '%s'\n", buffer); return ret; } for (i = 1; i < len - 3; i++) { csum ^= (unsigned char) (buffer[i]); } if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) { dbg(lvl_error, "no checksum in '%s'\n", buffer); return ret; } if (bcsum != csum && priv->checksum_ignore == 0) { dbg(lvl_error, "wrong checksum in '%s'\n", buffer); return ret; } if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); g_free(priv->nmea_data_buf); priv->nmea_data_buf=nmea_data_buf; } else { dbg(lvl_error, "nmea buffer overflow, discarding '%s'\n", buffer); } i = 0; p = buffer; while (i < 31) { item[i++] = p; while (*p && *p != ',') p++; if (!*p) break; *p++ = '\0'; } if (!strncmp(buffer, "$GPGGA", 6)) { /* 1 1111 0 1 2 3 4 5 6 7 8 9 0 1234 $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] */ if (*item[2] && *item[3] && *item[4] && *item[5]) { lat = g_ascii_strtod(item[2], NULL); priv->geo.lat = floor(lat / 100); lat -= priv->geo.lat * 100; priv->geo.lat += lat / 60; if (!g_strcasecmp(item[3],"S")) priv->geo.lat=-priv->geo.lat; lng = g_ascii_strtod(item[4], NULL); priv->geo.lng = floor(lng / 100); lng -= priv->geo.lng * 100; priv->geo.lng += lng / 60; if (!g_strcasecmp(item[5],"W")) priv->geo.lng=-priv->geo.lng; priv->valid=attr_position_valid_valid; dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); } else priv->valid=attr_position_valid_invalid; if (*item[6]) sscanf(item[6], "%d", &priv->status); if (*item[7]) sscanf(item[7], "%d", &priv->sats_used); if (*item[8]) sscanf(item[8], "%lf", &priv->hdop); if (*item[1]) strncpy(priv->fixtime, item[1], sizeof(priv->fixtime)); if (*item[9]) sscanf(item[9], "%lf", &priv->height); g_free(priv->nmea_data); priv->nmea_data=priv->nmea_data_buf; priv->nmea_data_buf=NULL; } if (!strncmp(buffer, "$GPVTG", 6)) { /* 0 1 2 34 5 6 7 8 $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] */ if (item[1] && item[7]) valid = 1; if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[1], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); dbg(lvl_info,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed); } } if (!strncmp(buffer, "$GPRMC", 6)) { /* 1 1 0 1 2 3 4 5 6 7 8 9 0 1 $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], magnetic variation[10],magnetic variation direction[11] */ if (*item[2] == 'A') valid = 1; if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) valid = 1; if (valid) { priv->direction = g_ascii_strtod( item[8], NULL ); priv->speed = g_ascii_strtod( item[7], NULL ); priv->speed *= 1.852; sscanf(item[9], "%02d%02d%02d", &priv->fixday, &priv->fixmonth, &priv->fixyear); priv->fixyear += 2000; } ret = 1; } if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { /* 0 GSV Satellites in view 1 2 Number of sentences for full data 2 1 sentence 1 of 2 3 08 Number of satellites in view 4 01 Satellite PRN number 5 40 Elevation, degrees 6 083 Azimuth, degrees 7 46 SNR - higher is better for up to 4 satellites per sentence *75 the checksum data, always begins with * */ if (item[3]) { sscanf(item[3], "%d", &priv->sats_visible); } j=4; while (j+4 <= i && priv->current_count < 24) { struct gps_sat *sat=&priv->next[priv->next_count++]; sat->prn=atoi(item[j]); sat->elevation=atoi(item[j+1]); sat->azimuth=atoi(item[j+2]); sat->snr=atoi(item[j+3]); j+=4; } if (!strcmp(item[1], item[2])) { priv->sats_signal=0; for (i = 0 ; i < priv->next_count ; i++) { priv->current[i]=priv->next[i]; if (priv->current[i].snr) priv->sats_signal++; } priv->current_count=priv->next_count; priv->next_count=0; } } if (!strncmp(buffer, "$GPZDA", 6)) { /* 0 1 2 3 4 5 6 $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC hhmmss HrMinSec(UTC) dd,mm,yyy Day,Month,Year xx local zone hours -13..13 yy local zone minutes 0..59 */ if (item[1] && item[2] && item[3] && item[4]) { strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); priv->fixday = atoi(item[2]); priv->fixmonth = atoi(item[3]); priv->fixyear = atoi(item[4]); } } if (!strncmp(buffer, "$IISMD", 6)) { /* 0 1 2 3 4 $IISMD,dir,press,height,temp*CC" dir Direction (0-359) press Pressure (hpa, i.e. 1032) height Barometric height above ground (meter) temp Temperature (Degree Celsius) */ if (item[1]) { priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); dbg(lvl_debug,"magnetic %d\n", priv->magnetic_direction); } } return ret; } static void vehicle_wince_io(struct vehicle_priv *priv) { int size, rc = 0; char *str, *tok; dbg(lvl_debug, "vehicle_file_io : enter\n"); size = read_win32(priv, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); if (size <= 0) { switch (priv->on_eof) { case 0: vehicle_wince_close(priv); vehicle_wince_open(priv); break; case 1: vehicle_wince_disable_watch(priv); break; case 2: exit(0); break; } return; } priv->buffer_pos += size; priv->buffer[priv->buffer_pos] = '\0'; dbg(lvl_debug, "size=%d pos=%d buffer='%s'\n", size, priv->buffer_pos, priv->buffer); str = priv->buffer; while ((tok = strchr(str, '\n'))) { *tok++ = '\0'; dbg(lvl_debug, "line='%s'\n", str); rc +=vehicle_wince_parse(priv, str); str = tok; if (priv->file_type == file_type_file && rc) break; } if (str != priv->buffer) { size = priv->buffer + priv->buffer_pos - str; memmove(priv->buffer, str, size + 1); priv->buffer_pos = size; dbg(lvl_info, "now pos=%d buffer='%s'\n", priv->buffer_pos, priv->buffer); } else if (priv->buffer_pos == buffer_size - 1) { dbg(lvl_error, "Overflow. Most likely wrong baud rate or no nmea protocol\n"); priv->buffer_pos = 0; } if (rc) callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); } static void vehicle_wince_enable_watch(struct vehicle_priv *priv) { dbg(lvl_debug, "enter"); vehicle_wince_disable_watch(priv); priv->is_running = 1; InitializeCriticalSection(&priv->lock); priv->m_hGPSThread = CreateThread(NULL, 0, wince_reader_thread, priv, 0, &priv->m_dwGPSThread); if (!priv->m_hGPSThread) { priv->is_running = 0; // error creating thread MessageBox (NULL, TEXT ("Can not create GPS reader thread"), TEXT (""), MB_APPLMODAL|MB_OK); } } static void vehicle_wince_disable_watch(struct vehicle_priv *priv) { int wait = 5000; dbg(lvl_debug, "enter"); priv->is_running = 0; while (wait-- > 0 && priv->thread_up) { SwitchToThread(); } if (priv->m_hGPSThread) { // Terminate reader, sorry TerminateThread(priv->m_hGPSThread, -1); } } /** * @brief Frees the wince_vehicle * * @param priv vehicle_priv structure for the vehicle */ static void vehicle_wince_destroy(struct vehicle_priv *priv) { vehicle_wince_disable_watch(priv); vehicle_wince_close(priv); if (priv->BthSetMode) { (void)priv->BthSetMode(0); FreeLibrary(priv->hBthDll); } if (priv->source) g_free(priv->source); if (priv->buffer) g_free(priv->buffer); if (priv->read_buffer) g_free(priv->read_buffer); g_free(priv); } /** * @brief Retrieves a vehicle attribute. * * @param priv vehicle_priv structure for the vehicle * @param type The attribute type to retrieve * @param attr Points to an attr structure that will receive the attribute data * @returns True for success, false for failure */ static int vehicle_wince_position_attr_get(struct vehicle_priv *priv, enum attr_type type, struct attr *attr) { switch (type) { case attr_position_fix_type: attr->u.num = priv->status; break; case attr_position_height: attr->u.numd = &priv->height; break; case attr_position_speed: attr->u.numd = &priv->speed; break; case attr_position_direction: attr->u.numd = &priv->direction; break; case attr_position_magnetic_direction: attr->u.num = priv->magnetic_direction; break; case attr_position_hdop: attr->u.numd = &priv->hdop; break; case attr_position_qual: attr->u.num = priv->sats_visible; break; case attr_position_sats_signal: attr->u.num = priv->sats_signal; break; case attr_position_sats_used: attr->u.num = priv->sats_used; break; case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; case attr_position_nmea: attr->u.str=priv->nmea_data; if (! attr->u.str) return 0; break; case attr_position_time_iso8601: if (!priv->fixyear || !priv->fixtime[0]) return 0; sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ", priv->fixyear, priv->fixmonth, priv->fixday, priv->fixtime, (priv->fixtime+2), (priv->fixtime+4)); attr->u.str=priv->fixiso8601; break; case attr_position_sat_item: dbg(lvl_debug,"at here\n"); priv->sat_item.id_lo++; if (priv->sat_item.id_lo > priv->current_count) { priv->sat_item.id_lo=0; return 0; } attr->u.item=&priv->sat_item; break; case attr_position_valid: attr->u.num=priv->valid; break; default: return 0; } if (type != attr_position_sat_item) priv->sat_item.id_lo=0; attr->type = type; return 1; } static int vehicle_wince_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) { struct vehicle_priv *priv=priv_data; struct gps_sat *sat; if (priv->sat_item.id_lo < 1) return 0; if (priv->sat_item.id_lo > priv->current_count) return 0; sat=&priv->current[priv->sat_item.id_lo-1]; switch (type) { case attr_sat_prn: attr->u.num=sat->prn; break; case attr_sat_elevation: attr->u.num=sat->elevation; break; case attr_sat_azimuth: attr->u.num=sat->azimuth; break; case attr_sat_snr: attr->u.num=sat->snr; break; default: return 0; } attr->type = type; return 1; } static struct item_methods vehicle_wince_sat_methods = { NULL, NULL, NULL, vehicle_wince_sat_attr_get, NULL, NULL, NULL, NULL, }; struct vehicle_methods vehicle_wince_methods = { vehicle_wince_destroy, vehicle_wince_position_attr_get, NULL, }; /** * @brief Creates a new wince_vehicle * * @param meth * @param cbl * @param attrs * @returns vehicle_priv */ static struct vehicle_priv * vehicle_wince_new(struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs) { struct vehicle_priv *ret; struct attr *source; struct attr *time; struct attr *on_eof; struct attr *baudrate; struct attr *checksum_ignore; struct attr *handle_bluetooth; char *cp; dbg(lvl_debug, "enter\n"); source = attr_search(attrs, NULL, attr_source); ret = g_new0(struct vehicle_priv, 1); ret->fd = -1; ret->cbl = cbl; ret->file_type = file_type_device; cp = strchr(source->u.str,':'); if (cp) { if ( strncmp(source->u.str, "file", 4) == 0 ) ret->file_type = file_type_file; cp++; } else cp = source->u.str; ret->source = g_strdup(cp); ret->buffer = g_malloc(buffer_size); ret->time=1000; ret->baudrate=0; // do not change the rate if not configured time = attr_search(attrs, NULL, attr_time); if (time) ret->time=time->u.num; baudrate = attr_search(attrs, NULL, attr_baudrate); if (baudrate) { ret->baudrate = baudrate->u.num; } checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore); if (checksum_ignore) ret->checksum_ignore=checksum_ignore->u.num; ret->attrs = attrs; on_eof = attr_search(attrs, NULL, attr_on_eof); if (on_eof && !g_strcasecmp(on_eof->u.str, "stop")) ret->on_eof=1; if (on_eof && !g_strcasecmp(on_eof->u.str, "exit")) ret->on_eof=2; dbg(lvl_debug,"on_eof=%d\n", ret->on_eof); *meth = vehicle_wince_methods; ret->priv_cbl = callback_list_new(); callback_list_add(ret->priv_cbl, callback_new_1(callback_cast(vehicle_wince_io), ret)); ret->sat_item.type=type_position_sat; ret->sat_item.id_hi=ret->sat_item.id_lo=0; ret->sat_item.priv_data=ret; ret->sat_item.meth=&vehicle_wince_sat_methods; ret->read_buffer = g_malloc(buffer_size); handle_bluetooth = attr_search(attrs, NULL, attr_bluetooth); if ( handle_bluetooth && handle_bluetooth->u.num == 1 ) initBth(ret); if (vehicle_wince_open(ret)) { vehicle_wince_enable_watch(ret); return ret; } dbg(lvl_error, "Failed to open '%s'\n", ret->source); vehicle_wince_destroy(ret); return NULL; } /** * @brief Registers the vehicle_wince plugin */ void plugin_init(void) { dbg(lvl_debug, "enter\n"); plugin_register_vehicle_type("wince", vehicle_wince_new); plugin_register_vehicle_type("file", vehicle_wince_new); } navit-0.5.0+dfsg.1/navit/vehicleprofile.c000066400000000000000000000235261264204753600202210ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include "debug.h" #include "item.h" #include "xmlconfig.h" #include "roadprofile.h" #include "vehicleprofile.h" #include "callback.h" static void vehicleprofile_set_attr_do(struct vehicleprofile *this_, struct attr *attr) { dbg(lvl_debug,"%s:%ld\n", attr_to_name(attr->type), attr->u.num); switch (attr->type) { case attr_flags: this_->flags=attr->u.num; break; case attr_flags_forward_mask: this_->flags_forward_mask=attr->u.num; break; case attr_flags_reverse_mask: this_->flags_reverse_mask=attr->u.num; break; case attr_maxspeed_handling: this_->maxspeed_handling=attr->u.num; break; case attr_route_mode: this_->mode=attr->u.num; break; case attr_name: if(this_->name) g_free(this_->name); /* previously used strdupn not available on win32 */ this_->name = g_strdup(attr->u.str); break; case attr_route_depth: if(this_->route_depth) g_free(this_->route_depth); this_->route_depth = g_strdup(attr->u.str); break; case attr_vehicle_axle_weight: this_->axle_weight=attr->u.num; break; case attr_vehicle_dangerous_goods: this_->dangerous_goods=attr->u.num; break; case attr_vehicle_height: this_->height=attr->u.num; break; case attr_vehicle_length: this_->length=attr->u.num; break; case attr_vehicle_weight: this_->weight=attr->u.num; break; case attr_vehicle_width: this_->width=attr->u.num; break; case attr_static_speed: this_->static_speed=attr->u.num; break; case attr_static_distance: this_->static_distance=attr->u.num; break; case attr_through_traffic_penalty: this_->through_traffic_penalty=attr->u.num; break; case attr_turn_around_penalty: this_->turn_around_penalty=attr->u.num; break; case attr_turn_around_penalty2: this_->turn_around_penalty2=attr->u.num; break; default: break; } } static void vehicleprofile_free_hash_item(gpointer key, gpointer value, gpointer user_data) { struct navit_object *obj=value; obj->func->unref(obj); } static void vehicleprofile_free_hash(struct vehicleprofile *this_) { if (this_->roadprofile_hash) { g_hash_table_foreach(this_->roadprofile_hash, vehicleprofile_free_hash_item, NULL); g_hash_table_destroy(this_->roadprofile_hash); } } static void vehicleprofile_clear(struct vehicleprofile *this_) { this_->mode=0; this_->flags_forward_mask=0; this_->flags_reverse_mask=0; this_->flags=0; this_->maxspeed_handling = maxspeed_enforce; this_->static_speed=0; this_->static_distance=0; g_free(this_->name); this_->name=NULL; g_free(this_->route_depth); this_->route_depth=NULL; this_->dangerous_goods=0; this_->length=-1; this_->width=-1; this_->height=-1; this_->weight=-1; this_->axle_weight=-1; this_->through_traffic_penalty=9000; vehicleprofile_free_hash(this_); this_->roadprofile_hash=g_hash_table_new(NULL, NULL); } static void vehicleprofile_apply_roadprofile(struct vehicleprofile *this_, struct navit_object *rp, int is_option) { struct attr item_types_attr; if (rp->func->get_attr(rp, attr_item_types, &item_types_attr, NULL)) { enum item_type *types=item_types_attr.u.item_types; while (*types != type_none) { struct navit_object *oldrp; /* Maptool won't place any access flags for roads which don't have default access flags set. Warn user. */ if(!item_get_default_flags(*types)) dbg(lvl_error,"On '%s' roads used in '%s' vehicleprofile access restrictions are ignored. You might even be directed to drive in wrong direction on a one-way road. " "Please define default access flags for above road type to item.c and rebuild the map.\n", item_to_name(*types), this_->name); oldrp=g_hash_table_lookup(this_->roadprofile_hash, (void *)(long)(*types)); if (is_option && oldrp) { struct navit_object *newrp; struct attr_iter *iter=rp->func->iter_new(NULL); struct attr attr; dbg(lvl_debug,"patching roadprofile\n"); newrp=oldrp->func->dup(oldrp); while (rp->func->get_attr(rp, attr_any, &attr, iter)) newrp->func->set_attr(newrp, &attr); oldrp->func->iter_destroy(iter); oldrp->func->unref(oldrp); g_hash_table_insert(this_->roadprofile_hash, (void *)(long)(*types), newrp); } else { if (oldrp) oldrp->func->unref(oldrp); g_hash_table_insert(this_->roadprofile_hash, (void *)(long)(*types), rp->func->ref(rp)); } types++; } } } static void vehicleprofile_apply_attrs(struct vehicleprofile *this_, struct navit_object *obj, int is_option) { struct attr attr; struct attr_iter *iter=obj->func->iter_new(NULL); while (obj->func->get_attr(obj, attr_any, &attr, iter)) { dbg(lvl_debug,"%s\n",attr_to_name(attr.type)); if (attr.type == attr_roadprofile) vehicleprofile_apply_roadprofile(this_, attr.u.navit_object, is_option); else if (attr.type != attr_profile_option) vehicleprofile_set_attr_do(this_, &attr); } obj->func->iter_destroy(iter); } static void vehicleprofile_debug_roadprofile(gpointer key, gpointer value, gpointer user_data) { struct roadprofile *rp=value; dbg(lvl_debug,"type %s avg %d weight %d max %d\n",item_to_name((int)(long)key),rp->speed,rp->route_weight,rp->maxspeed); } static void vehicleprofile_update(struct vehicleprofile *this_) { struct attr_iter *iter=vehicleprofile_attr_iter_new(); struct attr profile_option; dbg(lvl_debug,"enter\n"); vehicleprofile_clear(this_); vehicleprofile_apply_attrs(this_, (struct navit_object *)this_, 0); while (vehicleprofile_get_attr(this_, attr_profile_option, &profile_option, iter)) { struct attr active, name; if (!profile_option.u.navit_object->func->get_attr(profile_option.u.navit_object, attr_active, &active, NULL)) active.u.num=0; if (profile_option.u.navit_object->func->get_attr(profile_option.u.navit_object, attr_name, &name, NULL)) dbg(lvl_debug,"%p %s %ld\n",profile_option.u.navit_object,name.u.str,active.u.num); if (active.u.num) vehicleprofile_apply_attrs(this_, profile_option.u.navit_object, 1); } vehicleprofile_attr_iter_destroy(iter); dbg(lvl_debug,"result l %d w %d h %d wg %d awg %d pen %d\n",this_->length,this_->width,this_->height,this_->weight,this_->axle_weight,this_->through_traffic_penalty); dbg(lvl_debug,"m %d fwd 0x%x rev 0x%x flags 0x%x max %d stsp %d stdst %d dg %d\n",this_->mode,this_->flags_forward_mask,this_->flags_reverse_mask, this_->flags, this_->maxspeed_handling, this_->static_speed, this_->static_distance, this_->dangerous_goods); g_hash_table_foreach(this_->roadprofile_hash, vehicleprofile_debug_roadprofile, NULL); } struct vehicleprofile * vehicleprofile_new(struct attr *parent, struct attr **attrs) { struct vehicleprofile *this_; struct attr **attr, *type_attr; if (! (type_attr=attr_search(attrs, NULL, attr_name))) { return NULL; } this_=g_new0(struct vehicleprofile, 1); this_->func=&vehicleprofile_func; navit_object_ref((struct navit_object *)this_); this_->attrs=attr_list_dup(attrs); this_->active_callback.type=attr_callback; this_->active_callback.u.callback=callback_new_attr_1(callback_cast(vehicleprofile_update), attr_active, this_); vehicleprofile_clear(this_); for (attr=attrs;*attr; attr++) vehicleprofile_set_attr_do(this_, *attr); return this_; } struct attr_iter * vehicleprofile_attr_iter_new(void) { return (struct attr_iter *)g_new0(void *,1); } void vehicleprofile_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } int vehicleprofile_get_attr(struct vehicleprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); } int vehicleprofile_set_attr(struct vehicleprofile *this_, struct attr *attr) { vehicleprofile_set_attr_do(this_, attr); this_->attrs=attr_generic_set_attr(this_->attrs, attr); return 1; } int vehicleprofile_add_attr(struct vehicleprofile *this_, struct attr *attr) { this_->attrs=attr_generic_add_attr(this_->attrs, attr); switch (attr->type) { case attr_roadprofile: vehicleprofile_apply_roadprofile(this_, attr->u.navit_object, 0); break; case attr_profile_option: attr->u.navit_object->func->add_attr(attr->u.navit_object, &this_->active_callback); break; default: break; } return 1; } int vehicleprofile_remove_attr(struct vehicleprofile *this_, struct attr *attr) { this_->attrs=attr_generic_remove_attr(this_->attrs, attr); return 1; } struct roadprofile * vehicleprofile_get_roadprofile(struct vehicleprofile *this_, enum item_type type) { return g_hash_table_lookup(this_->roadprofile_hash, (void *)(long)type); } char * vehicleprofile_get_name(struct vehicleprofile *this_) { return this_->name; } static void vehicleprofile_init(struct vehicleprofile *this_) { vehicleprofile_update(this_); } struct object_func vehicleprofile_func = { attr_vehicleprofile, (object_func_new)vehicleprofile_new, (object_func_get_attr)vehicleprofile_get_attr, (object_func_iter_new)vehicleprofile_attr_iter_new, (object_func_iter_destroy)vehicleprofile_attr_iter_destroy, (object_func_set_attr)vehicleprofile_set_attr, (object_func_add_attr)vehicleprofile_add_attr, (object_func_remove_attr)vehicleprofile_remove_attr, (object_func_init)vehicleprofile_init, (object_func_destroy)NULL, (object_func_dup)NULL, (object_func_ref)navit_object_ref, (object_func_unref)navit_object_unref, }; navit-0.5.0+dfsg.1/navit/vehicleprofile.h000066400000000000000000000062471264204753600202270ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef __cplusplus extern "C" { #endif enum maxspeed_handling { maxspeed_enforce = 0, /*!< Always enforce maxspeed of segment */ maxspeed_restrict = 1, /*!< Enforce maxspeed of segment only if it restricts the speed */ maxspeed_ignore = 2, /*!< Ignore maxspeed of segment, always use {@code route_weight} of road profile */ }; struct vehicleprofile { NAVIT_OBJECT int mode; /**< 0 = Auto, 1 = On-Road, 2 = Off-Road */ int flags_forward_mask; /**< Flags mask for moving in positive direction */ int flags_reverse_mask; /**< Flags mask for moving in reverse direction */ int flags; /**< Required flags to move through a segment */ int maxspeed_handling; /**< How to handle maxspeed of segment, see {@code enum maxspeed_handling} */ int static_speed; /**< Maximum speed of vehicle to consider it stationary */ int static_distance; /**< Maximum distance of previous position of vehicle to consider it stationary */ char *name; /**< the vehicle profile name */ char *route_depth; /**< the route depth attribute */ int width; /**< Width of the vehicle in cm */ int height; /**< Height of the vehicle in cm */ int length; /**< Length of the vehicle in cm */ int weight; /**< Weight of the vehicle in kg */ int axle_weight; /**< Axle Weight of the vehicle in kg */ int dangerous_goods; /**< Flags of dangerous goods present */ int through_traffic_penalty; /**< Penalty when driving on a through traffic limited road */ GHashTable *roadprofile_hash; struct attr active_callback; int turn_around_penalty; /**< Penalty when turning around */ int turn_around_penalty2; /**< Penalty when turning around, for planned turn arounds */ }; struct vehicleprofile * vehicleprofile_new(struct attr *parent, struct attr **attrs); struct attr_iter *vehicleprofile_attr_iter_new(void); void vehicleprofile_attr_iter_destroy(struct attr_iter *iter); int vehicleprofile_get_attr(struct vehicleprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); int vehicleprofile_set_attr(struct vehicleprofile *this_, struct attr *attr); int vehicleprofile_add_attr(struct vehicleprofile *this_, struct attr *attr); int vehicleprofile_remove_attr(struct vehicleprofile *this_, struct attr *attr); struct roadprofile * vehicleprofile_get_roadprofile(struct vehicleprofile *this_, enum item_type type); //! Returns the vehicle profile's name. char * vehicleprofile_get_name(struct vehicleprofile *this_); #ifdef __cplusplus } #endif navit-0.5.0+dfsg.1/navit/version.h.in000066400000000000000000000001261264204753600173070ustar00rootroot00000000000000#cmakedefine GIT_VERSION "@GIT_VERSION@" #cmakedefine NAVIT_VARIANT "@NAVIT_VARIANT@" navit-0.5.0+dfsg.1/navit/window.h000066400000000000000000000015501264204753600165260ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ struct window { void *priv; int (*fullscreen)(struct window *win, int on); void (*disable_suspend)(struct window *win); }; navit-0.5.0+dfsg.1/navit/xmlconfig.c000066400000000000000000001075761264204753600172170ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2009 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* see http://library.gnome.org/devel/glib/stable/glib-Simple-XML-Subset-Parser.html * for details on how the xml file parser works. */ #include #include #include #include #include #include "debug.h" #include "file.h" #include "coord.h" #include "item.h" #include "xmlconfig.h" #include "layout.h" #include "mapset.h" #include "projection.h" #include "map.h" #include "navigation.h" #include "navit.h" #include "plugin.h" #include "route.h" #include "speech.h" #include "track.h" #include "vehicle.h" #include "point.h" #include "graphics.h" #include "gui.h" #include "osd.h" #include "log.h" #include "announcement.h" #include "vehicleprofile.h" #include "callback.h" #include "config_.h" #if (defined __MINGW32__) || (defined _MSC_VER) /* This only works if a is a string constant, i.e. "name" */ #define unsetenv(a) putenv(a "=") #endif struct xistate { struct xistate *parent; struct xistate *child; const gchar *element; const gchar **attribute_names; const gchar **attribute_values; }; struct xmldocument { const gchar *href; const gchar *xpointer; gpointer user_data; struct xistate *first; struct xistate *last; int active; int level; }; struct xmlstate { const gchar **attribute_names; const gchar **attribute_values; struct xmlstate *parent; struct attr element_attr; const gchar *element; xmlerror **error; struct element_func *func; struct object_func *object_func; struct xmldocument *document; }; struct attr_fixme { char *element; char **attr_fixme; }; static struct attr ** convert_to_attrs(struct xmlstate *state, struct attr_fixme *fixme) { const gchar **attribute_name=state->attribute_names; const gchar **attribute_value=state->attribute_values; const gchar *name; int count=0; struct attr **ret; static int fixme_count; while (*attribute_name) { count++; attribute_name++; } ret=g_new(struct attr *, count+1); attribute_name=state->attribute_names; count=0; while (*attribute_name) { name=*attribute_name; if (fixme) { char **attr_fixme=fixme->attr_fixme; while (attr_fixme[0]) { if (! strcmp(name, attr_fixme[0])) { name=attr_fixme[1]; if (fixme_count++ < 10) dbg(lvl_error,"Please change attribute '%s' to '%s' in <%s />\n", attr_fixme[0], attr_fixme[1], fixme->element); break; } attr_fixme+=2; } } ret[count]=attr_new_from_text(name,*attribute_value); if (ret[count]) count++; else if (strcmp(*attribute_name,"enabled") && strcmp(*attribute_name,"xmlns:xi")) dbg(lvl_error,"failed to create attribute '%s' with value '%s'\n", *attribute_name,*attribute_value); attribute_name++; attribute_value++; } ret[count]=NULL; dbg(lvl_debug,"ret=%p\n", ret); return ret; } static const char * find_attribute(struct xmlstate *state, const char *attribute, int required) { const gchar **attribute_name=state->attribute_names; const gchar **attribute_value=state->attribute_values; while(*attribute_name) { if(! g_ascii_strcasecmp(attribute,*attribute_name)) return *attribute_value; attribute_name++; attribute_value++; } if (required) g_set_error(state->error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "element '%s' is missing attribute '%s'", state->element, attribute); return NULL; } static int find_boolean(struct xmlstate *state, const char *attribute, int deflt, int required) { const char *value; value=find_attribute(state, attribute, required); if (! value) return deflt; if (g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false")) return 1; return 0; } /** * * Convert a string number to int * * * * @param val the string value to convert * * @returns int value of converted string * */ static int convert_number(const char *val) { if (val) return g_ascii_strtoull(val,NULL,0); else return 0; } static int xmlconfig_announce(struct xmlstate *state) { const char *type,*value; char key[32]; int level[3]; int i; enum item_type itype; char *tok, *type_str, *str; type=find_attribute(state, "type", 1); if (! type) return 0; for (i = 0 ; i < 3 ; i++) { sprintf(key,"level%d", i); value=find_attribute(state, key, 0); if (value) level[i]=convert_number(value); else level[i]=-1; } type_str=g_strdup(type); str=type_str; while ((tok=strtok(str, ","))) { itype=item_from_name(tok); if (itype!=type_none) { navigation_set_announce(state->parent->element_attr.u.data, itype, level); } else { dbg(lvl_error, "Invalid type for announcement: %s\n",tok); } str=NULL; } g_free(type_str); return 1; } /** * * Define the elements in our config * * * */ #define NEW(x) (void *(*)(struct attr *, struct attr **))(x) #define GET(x) (int (*)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter))(x) #define ITERN(x) (struct attr_iter * (*)(void *))(x) #define ITERD(x) (void (*)(struct attr_iter *iter))(x) #define SET(x) (int (*)(void *, struct attr *attr))(x) #define ADD(x) (int (*)(void *, struct attr *attr))(x) #define REMOVE(x) (int (*)(void *, struct attr *attr))(x) #define INIT(x) (int (*)(void *))(x) #define DESTROY(x) (void (*)(void *))(x) static struct object_func object_funcs[] = { { attr_announcement,NEW(announcement_new), GET(announcement_get_attr), NULL, NULL, SET(announcement_set_attr), ADD(announcement_add_attr) }, { attr_arrows, NEW(arrows_new)}, { attr_circle, NEW(circle_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_coord, NEW(coord_new_from_attrs)}, { attr_cursor, NEW(cursor_new), NULL, NULL, NULL, NULL, ADD(cursor_add_attr)}, { attr_debug, NEW(debug_new)}, { attr_graphics, NEW(graphics_new), GET(graphics_get_attr)}, { attr_gui, NEW(gui_new), GET(gui_get_attr), NULL, NULL, SET(gui_set_attr), ADD(gui_add_attr)}, { attr_icon, NEW(icon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_image, NEW(image_new)}, { attr_itemgra, NEW(itemgra_new), NULL, NULL, NULL, NULL, ADD(itemgra_add_attr)}, { attr_plugins, NEW(plugins_new), NULL, NULL, NULL, NULL, NULL, NULL, INIT(plugins_init)}, { attr_plugin, NEW(plugin_new)}, { attr_polygon, NEW(polygon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_polyline, NEW(polyline_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, { attr_text, NEW(text_new)}, }; struct object_func * object_func_lookup(enum attr_type type) { int i; switch (type) { case attr_config: return &config_func; case attr_layer: return &layer_func; case attr_layout: return &layout_func; case attr_log: return &log_func; case attr_map: return &map_func; case attr_maps: return &maps_func; case attr_mapset: return &mapset_func; case attr_navigation: return &navigation_func; case attr_navit: return &navit_func; case attr_profile_option: return &profile_option_func; case attr_roadprofile: return &roadprofile_func; case attr_route: return &route_func; case attr_script: return &script_func; case attr_osd: return &osd_func; case attr_trackingo: return &tracking_func; case attr_speech: return &speech_func; case attr_vehicle: return &vehicle_func; case attr_vehicleprofile: return &vehicleprofile_func; default: for (i = 0 ; i < sizeof(object_funcs)/sizeof(struct object_func); i++) { if (object_funcs[i].type == type) return &object_funcs[i]; } return NULL; } } struct element_func { char *name; char *parent; int (*func)(struct xmlstate *state); enum attr_type type; }; struct element_func *elements; static char *attr_fixme_itemgra[]={ "type","item_types", NULL,NULL, }; static char *attr_fixme_text[]={ "label_size","text_size", NULL,NULL, }; static char *attr_fixme_circle[]={ "label_size","text_size", NULL,NULL, }; static struct attr_fixme attr_fixmes[]={ {"item",attr_fixme_itemgra}, {"itemgra",attr_fixme_itemgra}, {"text",attr_fixme_text}, {"label",attr_fixme_text}, {"circle",attr_fixme_circle}, {NULL,NULL}, }; static char *element_fixmes[]={ "item","itemgra", "label","text", NULL,NULL, }; static void initStatic(void) { elements=g_new0(struct element_func,44); //43 is a number of elements + ending NULL element elements[0].name="config"; elements[0].parent=NULL; elements[0].func=NULL; elements[0].type=attr_config; elements[1].name="announce"; elements[1].parent="navigation"; elements[1].func=xmlconfig_announce; elements[2].name="speech"; elements[2].parent="navit"; elements[2].func=NULL; elements[2].type=attr_speech; elements[3].name="tracking"; elements[3].parent="navit"; elements[3].func=NULL; elements[3].type=attr_trackingo; elements[4].name="route"; elements[4].parent="navit"; elements[4].func=NULL; elements[4].type=attr_route; elements[5].name="mapset"; elements[5].parent="navit"; elements[5].func=NULL; elements[5].type=attr_mapset; elements[6].name="map"; elements[6].parent="mapset"; elements[6].func=NULL; elements[6].type=attr_map; elements[7].name="debug"; elements[7].parent="config"; elements[7].func=NULL; elements[7].type=attr_debug; elements[8].name="osd"; elements[8].parent="navit"; elements[8].func=NULL; elements[8].type=attr_osd; elements[9].name="navigation"; elements[9].parent="navit"; elements[9].func=NULL; elements[9].type=attr_navigation; elements[10].name="navit"; elements[10].parent="config"; elements[10].func=NULL; elements[10].type=attr_navit; elements[11].name="graphics"; elements[11].parent="navit"; elements[11].func=NULL; elements[11].type=attr_graphics; elements[12].name="gui"; elements[12].parent="navit"; elements[12].func=NULL; elements[12].type=attr_gui; elements[13].name="layout"; elements[13].parent="navit"; elements[13].func=NULL; elements[13].type=attr_layout; elements[14].name="cursor"; elements[14].parent="layout"; elements[14].func=NULL; elements[14].type=attr_cursor; elements[15].name="layer"; elements[15].parent="layout"; elements[15].func=NULL; elements[15].type=attr_layer; elements[16].name="itemgra"; elements[16].parent="layer"; elements[16].func=NULL; elements[16].type=attr_itemgra; elements[17].name="circle"; elements[17].parent="itemgra"; elements[17].func=NULL; elements[17].type=attr_circle; elements[18].name="coord"; elements[18].parent="circle"; elements[18].func=NULL; elements[18].type=attr_coord; elements[19].name="icon"; elements[19].parent="itemgra"; elements[19].func=NULL; elements[19].type=attr_icon; elements[20].name="coord"; elements[20].parent="icon"; elements[20].func=NULL; elements[20].type=attr_coord; elements[21].name="image"; elements[21].parent="itemgra"; elements[21].func=NULL; elements[21].type=attr_image; elements[22].name="text"; elements[22].parent="itemgra"; elements[22].func=NULL; elements[22].type=attr_text; elements[23].name="polygon"; elements[23].parent="itemgra"; elements[23].func=NULL; elements[23].type=attr_polygon; elements[24].name="coord"; elements[24].parent="polygon"; elements[24].func=NULL; elements[24].type=attr_coord; elements[25].name="polyline"; elements[25].parent="itemgra"; elements[25].func=NULL; elements[25].type=attr_polyline; elements[26].name="coord"; elements[26].parent="polyline"; elements[26].func=NULL; elements[26].type=attr_coord; elements[27].name="arrows"; elements[27].parent="itemgra"; elements[27].func=NULL; elements[27].type=attr_arrows; elements[28].name="vehicle"; elements[28].parent="navit"; elements[28].func=NULL; elements[28].type=attr_vehicle; elements[29].name="vehicleprofile"; elements[29].parent="navit"; elements[29].func=NULL; elements[29].type=attr_vehicleprofile; elements[30].name="roadprofile"; elements[30].parent="vehicleprofile"; elements[30].func=NULL; elements[30].type=attr_roadprofile; elements[31].name="announcement"; elements[31].parent="roadprofile"; elements[31].func=NULL; elements[31].type=attr_announcement; elements[32].name="cursor"; elements[32].parent="vehicle"; elements[32].func=NULL; elements[32].type=attr_cursor; elements[33].name="itemgra"; elements[33].parent="cursor"; elements[33].func=NULL; elements[33].type=attr_itemgra; elements[34].name="log"; elements[34].parent="vehicle"; elements[34].func=NULL; elements[34].type=attr_log; elements[35].name="log"; elements[35].parent="navit"; elements[35].func=NULL; elements[35].type=attr_log; elements[36].name="plugins"; elements[36].parent="config"; elements[36].func=NULL; elements[36].type=attr_plugins; elements[37].name="plugin"; elements[37].parent="plugins"; elements[37].func=NULL; elements[37].type=attr_plugin; elements[38].name="maps"; elements[38].parent="mapset"; elements[38].func=NULL; elements[38].type=attr_maps; elements[39].name="layer"; elements[39].parent="navit"; elements[39].func=NULL; elements[39].type=attr_layer; elements[40].name="profile_option"; elements[40].parent="vehicleprofile"; elements[40].func=NULL; elements[40].type=attr_profile_option; elements[41].name="roadprofile"; elements[41].parent="profile_option"; elements[41].func=NULL; elements[41].type=attr_roadprofile; elements[42].name="script"; elements[42].parent="navit"; elements[42].func=NULL; elements[42].type=attr_script; } /** * * Parse the opening tag of a config element * * * * @param context document parse context * * @param element_name the current tag name * * @param attribute_names ptr to return the set of attribute names * * @param attribute_values ptr return the set of attribute values * * @param user_data ptr to xmlstate structure * * @param error ptr return error context * * @returns nothing * */ static void start_element(xml_context *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, xmlerror **error) { struct xmlstate *new=NULL, **parent = user_data; struct element_func *e=elements,*func=NULL; struct attr_fixme *attr_fixme=attr_fixmes; char **element_fixme=element_fixmes; int found=0; static int fixme_count; const char *parent_name=NULL; char *s,*sep="",*possible_parents; struct attr *parent_attr; dbg(lvl_info,"name='%s' parent='%s'\n", element_name, *parent ? (*parent)->element:NULL); if (!strcmp(element_name,"xml")) return; /* determine if we have to fix any attributes */ while (attr_fixme[0].element) { if (!strcmp(element_name,attr_fixme[0].element)) break; attr_fixme++; } if (!attr_fixme[0].element) attr_fixme=NULL; /* tell user to fix deprecated element names */ while (element_fixme[0]) { if (!strcmp(element_name,element_fixme[0])) { element_name=element_fixme[1]; if (fixme_count++ < 10) dbg(lvl_error,"Please change <%s /> to <%s /> in config file\n", element_fixme[0], element_fixme[1]); } element_fixme+=2; } /* validate that this element is valid * and that the element has a valid parent */ possible_parents=g_strdup(""); if (*parent) parent_name=(*parent)->element; while (e->name) { if (!g_ascii_strcasecmp(element_name, e->name)) { found=1; s=g_strconcat(possible_parents,sep,e->parent,NULL); g_free(possible_parents); possible_parents=s; sep=","; if ((parent_name && e->parent && !g_ascii_strcasecmp(parent_name, e->parent)) || (!parent_name && !e->parent)) func=e; } e++; } if (! found) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_UNKNOWN_ELEMENT, "Unknown element '%s'", element_name); g_free(possible_parents); return; } if (! func) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "Element '%s' within unexpected context '%s'. Expected '%s'%s", element_name, parent_name, possible_parents, ! strcmp(possible_parents, "config") ? "\nPlease add tags at the beginning/end of your navit.xml": ""); g_free(possible_parents); return; } g_free(possible_parents); new=g_new(struct xmlstate, 1); new->attribute_names=attribute_names; new->attribute_values=attribute_values; new->parent=*parent; new->element_attr.u.data=NULL; new->element=element_name; new->error=error; new->func=func; new->object_func=NULL; *parent=new; if (!find_boolean(new, "enabled", 1, 0)) return; if (new->parent && !new->parent->element_attr.u.data) return; if (func->func) { if (!func->func(new)) { return; } } else { struct attr **attrs; new->object_func=object_func_lookup(func->type); if (! new->object_func) return; attrs=convert_to_attrs(new,attr_fixme); new->element_attr.type=attr_none; if (!new->parent || new->parent->element_attr.type == attr_none) parent_attr=NULL; else parent_attr=&new->parent->element_attr; new->element_attr.u.data = new->object_func->create(parent_attr, attrs); if (! new->element_attr.u.data) return; new->element_attr.type=attr_from_name(element_name); if (new->element_attr.type == attr_none) dbg(lvl_error,"failed to create object of type '%s'\n", element_name); if (new->element_attr.type == attr_tracking) new->element_attr.type=attr_trackingo; if (new->parent && new->parent->object_func && new->parent->object_func->add_attr) new->parent->object_func->add_attr(new->parent->element_attr.u.data, &new->element_attr); } return; } /* Called for close tags */ static void end_element (xml_context *context, const gchar *element_name, gpointer user_data, xmlerror **error) { struct xmlstate *curr, **state = user_data; if (!strcmp(element_name,"xml")) return; dbg(lvl_info,"name='%s'\n", element_name); curr=*state; if (curr->object_func && curr->object_func->init) curr->object_func->init(curr->element_attr.u.data); if (curr->object_func && curr->object_func->unref) curr->object_func->unref(curr->element_attr.u.data); *state=curr->parent; g_free(curr); } static gboolean parse_file(struct xmldocument *document, xmlerror **error); static void xinclude(xml_context *context, const gchar **attribute_names, const gchar **attribute_values, struct xmldocument *doc_old, xmlerror **error) { struct xmldocument doc_new; struct file_wordexp *we; int i,count; const char *href=NULL; char **we_files; if (doc_old->level >= 16) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include recursion too deep"); return; } memset(&doc_new, 0, sizeof(doc_new)); i=0; while (attribute_names[i]) { if(!g_ascii_strcasecmp("href", attribute_names[i])) { if (!href) href=attribute_values[i]; else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one href"); return; } } else if(!g_ascii_strcasecmp("xpointer", attribute_names[i])) { if (!doc_new.xpointer) doc_new.xpointer=attribute_values[i]; else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one xpointer"); return; } } else { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has invalid attributes"); return; } i++; } if (!doc_new.xpointer && !href) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has neither href nor xpointer"); return; } doc_new.level=doc_old->level+1; doc_new.user_data=doc_old->user_data; if (! href) { dbg(lvl_debug,"no href, using '%s'\n", doc_old->href); doc_new.href=doc_old->href; if (file_exists(doc_new.href)) { parse_file(&doc_new, error); } else { dbg(lvl_error,"Unable to include %s\n",doc_new.href); } } else { dbg(lvl_debug,"expanding '%s'\n", href); we=file_wordexp_new(href); we_files=file_wordexp_get_array(we); count=file_wordexp_get_count(we); dbg(lvl_debug,"%d results\n", count); if (file_exists(we_files[0])) { for (i = 0 ; i < count ; i++) { dbg(lvl_debug,"result[%d]='%s'\n", i, we_files[i]); doc_new.href=we_files[i]; parse_file(&doc_new, error); } } else { dbg(lvl_error,"Unable to include %s\n",we_files[0]); } file_wordexp_destroy(we); } } static int strncmp_len(const char *s1, int s1len, const char *s2) { int ret; #if 0 char c[s1len+1]; strncpy(c, s1, s1len); c[s1len]='\0'; dbg(lvl_debug,"'%s' vs '%s'\n", c, s2); #endif ret=strncmp(s1, s2, s1len); if (ret) return ret; return strlen(s2)-s1len; } static int xpointer_value(const char *test, int len, struct xistate *elem, const char **out, int out_len) { int i,ret=0; if (len <= 0 || out_len <= 0) { return 0; } if (!(strncmp_len(test,len,"name(.)"))) { out[0]=elem->element; return 1; } if (test[0] == '@') { i=0; while (elem->attribute_names[i] && out_len > 0) { if (!strncmp_len(test+1,len-1,elem->attribute_names[i])) { out[ret++]=elem->attribute_values[i]; out_len--; } i++; } return ret; } return 0; } static int xpointer_test(const char *test, int len, struct xistate *elem) { int eq,i,count,vlen,cond_req=1,cond=0; char c; const char *tmp[16]; #if 0 char test2[len+1]; strncpy(test2, test, len); test2[len]='\0'; dbg(lvl_debug,"%s\n", test2); #endif if (!len) return 0; c=test[len-1]; if (c != '\'' && c != '"') return 0; eq=strcspn(test, "="); if (eq >= len || test[eq+1] != c) return 0; vlen=eq; if (eq > 0 && test[eq-1] == '!') { cond_req=0; vlen--; } count=xpointer_value(test,vlen,elem,tmp,16); for (i = 0 ; i < count ; i++) { if (!strncmp_len(test+eq+2,len-eq-3, tmp[i])) cond=1; } if (cond == cond_req) return 1; return 0; } static int xpointer_element_match(const char *xpointer, int len, struct xistate *elem) { int start,tlen; start=strcspn(xpointer, "["); if (start > len) start=len; if (strncmp_len(xpointer, start, elem->element) && (start != 1 || xpointer[0] != '*')) return 0; if (start == len) return 1; if (xpointer[len-1] != ']') return 0; for (;;) { start++; tlen=strcspn(xpointer+start,"]"); if (start + tlen > len) return 1; if (!xpointer_test(xpointer+start, tlen, elem)) return 0; start+=tlen+1; } } static int xpointer_xpointer_match(const char *xpointer, int len, struct xistate *first) { const char *c; int s; dbg(lvl_info,"%s\n", xpointer); if (xpointer[0] != '/') return 0; c=xpointer+1; len--; do { s=strcspn(c, "/"); if (s > len) s=len; if (! xpointer_element_match(c, s, first)) return 0; first=first->child; c+=s+1; len-=s+1; } while (len > 0 && first); if (len > 0) return 0; return 1; } static int xpointer_match(const char *xpointer, struct xistate *first) { char *prefix="xpointer("; int len; if (! xpointer) return 1; len=strlen(xpointer); if (strncmp(xpointer,prefix,strlen(prefix))) return 0; if (xpointer[len-1] != ')') return 0; return xpointer_xpointer_match(xpointer+strlen(prefix), len-strlen(prefix)-1, first); } static void xi_start_element(xml_context *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, xmlerror **error) { struct xmldocument *doc=user_data; struct xistate *xistate; int i,count=0; while (attribute_names[count++*XML_ATTR_DISTANCE]); xistate=g_new0(struct xistate, 1); xistate->element=element_name; xistate->attribute_names=g_new0(const char *, count); xistate->attribute_values=g_new0(const char *, count); for (i = 0 ; i < count ; i++) { if (attribute_names[i*XML_ATTR_DISTANCE] && attribute_values[i*XML_ATTR_DISTANCE]) { xistate->attribute_names[i]=g_strdup(attribute_names[i*XML_ATTR_DISTANCE]); xistate->attribute_values[i]=g_strdup(attribute_values[i*XML_ATTR_DISTANCE]); } } xistate->parent=doc->last; if (doc->last) { doc->last->child=xistate; } else doc->first=xistate; doc->last=xistate; if (doc->active > 0 || xpointer_match(doc->xpointer, doc->first)) { if(!g_ascii_strcasecmp("xi:include", element_name)) { xinclude(context, xistate->attribute_names, xistate->attribute_values, doc, error); return; } start_element(context, element_name, xistate->attribute_names, xistate->attribute_values, doc->user_data, error); doc->active++; } } /** * * Reached closing tag of a config element * * * * @param context * * @param element name * * @param user_data ptr to xmldocument * * @param error ptr to struct for error information * * @returns nothing * */ static void xi_end_element (xml_context *context, const gchar *element_name, gpointer user_data, xmlerror **error) { struct xmldocument *doc=user_data; struct xistate *xistate=doc->last; int i=0; doc->last=doc->last->parent; if (! doc->last) doc->first=NULL; else doc->last->child=NULL; if (doc->active > 0) { if(!g_ascii_strcasecmp("xi:include", element_name)) { return; } end_element(context, element_name, doc->user_data, error); doc->active--; } while (xistate->attribute_names[i]) { g_free((char *)(xistate->attribute_names[i])); g_free((char *)(xistate->attribute_values[i])); i++; } g_free(xistate->attribute_names); g_free(xistate->attribute_values); g_free(xistate); } /* Called for character data */ /* text is not nul-terminated */ static void xi_text (xml_context *context, const gchar *text, gsize text_len, gpointer user_data, xmlerror **error) { struct xmldocument *doc=user_data; int i; if (doc->active) { for (i = 0 ; i < text_len ; i++) { if (!isspace(text[i])) { struct xmldocument *doc=user_data; struct xmlstate *curr, **state = doc->user_data; struct attr attr; char *text_dup = malloc(text_len+1); curr=*state; strncpy(text_dup, text, text_len); text_dup[text_len]='\0'; attr.type=attr_xml_text; attr.u.str=text_dup; if (curr->object_func && curr->object_func->add_attr && curr->element_attr.u.data) curr->object_func->add_attr(curr->element_attr.u.data, &attr); free(text_dup); return; } } } } #if USE_EZXML static void parse_node_text(ezxml_t node, void *data, void (*start)(void *, const char *, const char **, const char **, void *, void *), void (*end)(void *, const char *, void *, void *), void (*text)(void *, const char *, int, void *, void *)) { while (node) { if (start) start(NULL, node->name, (const char **)node->attr, (const char **)(node->attr+1), data, NULL); if (text && node->txt) text(NULL, node->txt, strlen(node->txt), data, NULL); if (node->child) parse_node_text(node->child, data, start, end, text); if (end) end(NULL, node->name, data, NULL); node=node->ordered; } } #endif void xml_parse_text(const char *document, void *data, void (*start)(xml_context *, const char *, const char **, const char **, void *, GError **), void (*end)(xml_context *, const char *, void *, GError **), void (*text)(xml_context *, const char *, gsize, void *, GError **)) { #if !USE_EZXML GMarkupParser parser = { start, end, text, NULL, NULL}; xml_context *context; gboolean result; context = g_markup_parse_context_new (&parser, 0, data, NULL); if (!document){ dbg(lvl_error, "FATAL: No XML data supplied (looks like incorrect configuration for internal GUI).\n"); exit(1); } result = g_markup_parse_context_parse (context, document, strlen(document), NULL); if (!result){ dbg(lvl_error, "FATAL: Cannot parse data as XML: '%s'\n", document); exit(1); } g_markup_parse_context_free (context); #else char *str=g_strdup(document); ezxml_t root = ezxml_parse_str(str, strlen(str)); if (!root) return; parse_node_text(root, data, start, end, text); ezxml_free(root); g_free(str); #endif } #if !USE_EZXML static const GMarkupParser parser = { xi_start_element, xi_end_element, xi_text, NULL, NULL }; /** * * Parse the contents of the configuration file * * * * @param document struct holding info about the config file * * @param error info on any errors detected * * @returns boolean TRUE or FALSE * */ static gboolean parse_file(struct xmldocument *document, xmlerror **error) { xml_context *context; gchar *contents, *message; gsize len; gint line, chr; gboolean result; char *xmldir,*newxmldir,*xmlfile,*newxmlfile,*sep; dbg(lvl_debug,"enter filename='%s'\n", document->href); #if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 12 #define G_MARKUP_TREAT_CDATA_AS_TEXT 0 #endif context = g_markup_parse_context_new (&parser, G_MARKUP_TREAT_CDATA_AS_TEXT, document, NULL); if (!g_file_get_contents (document->href, &contents, &len, error)) { g_markup_parse_context_free (context); return FALSE; } xmldir=getenv("XMLDIR"); xmlfile=getenv("XMLFILE"); newxmlfile=g_strdup(document->href); newxmldir=g_strdup(document->href); if ((sep=strrchr(newxmldir,'/'))) *sep='\0'; else { g_free(newxmldir); newxmldir=g_strdup("."); } setenv("XMLDIR",newxmldir,1); setenv("XMLFILE",newxmlfile,1); document->active=document->xpointer ? 0:1; document->first=NULL; document->last=NULL; result = g_markup_parse_context_parse (context, contents, len, error); if (!result && error && *error) { g_markup_parse_context_get_position(context, &line, &chr); message=g_strdup_printf("%s at line %d, char %d\n", (*error)->message, line, chr); g_free((*error)->message); (*error)->message=message; } g_markup_parse_context_free (context); g_free (contents); if (xmldir) setenv("XMLDIR",xmldir,1); else unsetenv("XMLDIR"); if (xmlfile) setenv("XMLFILE",xmlfile,1); else unsetenv("XMLFILE"); g_free(newxmldir); g_free(newxmlfile); dbg(lvl_debug,"return %d\n", result); return result; } #else static void parse_node(struct xmldocument *document, ezxml_t node) { while (node) { xi_start_element(NULL,node->name, node->attr, node->attr+1, document, NULL); if (node->txt) xi_text(NULL,node->txt,strlen(node->txt),document,NULL); if (node->child) parse_node(document, node->child); xi_end_element (NULL,node->name,document,NULL); node=node->ordered; } } static gboolean parse_file(struct xmldocument *document, xmlerror **error) { FILE *f; ezxml_t root; f=fopen(document->href,"rb"); if (!f) return FALSE; root = ezxml_parse_fp(f); fclose(f); if (!root) return FALSE; document->active=document->xpointer ? 0:1; document->first=NULL; document->last=NULL; parse_node(document, root); return TRUE; } #endif /** * * Load and parse the master config file * * * * @param filename FQFN of the file * * @param error ptr to error details, if any * * @returns boolean TRUE or FALSE (if error detected) * */ gboolean config_load(const char *filename, xmlerror **error) { struct xmldocument document; struct xmlstate *curr=NULL; gboolean result; attr_create_hash(); item_create_hash(); initStatic(); dbg(lvl_debug,"enter filename='%s'\n", filename); memset(&document, 0, sizeof(document)); document.href=filename; document.user_data=&curr; result=parse_file(&document, error); if (result && curr) { g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_PARSE, "element '%s' not closed", curr->element); result=FALSE; } attr_destroy_hash(); item_destroy_hash(); dbg(lvl_debug,"return %d\n", result); return result; } int navit_object_set_methods(void *in, int in_size, void *out, int out_size) { int ret,size=out_size; if (out_size > in_size) { ret=-1; size=in_size; memset((char *)out+in_size, 0, out_size-in_size); } else if (in_size == out_size) ret=0; else ret=1; memcpy(out, in, size); return ret; } struct navit_object * navit_object_new(struct attr **attrs, struct object_func *func, int size) { struct navit_object *ret=g_malloc0(size); ret->func=func; ret->attrs=attr_list_dup(attrs); navit_object_ref(ret); return ret; } struct navit_object * navit_object_ref(struct navit_object *obj) { obj->refcount++; dbg(lvl_debug,"refcount %s %p %d\n",attr_to_name(obj->func->type),obj,obj->refcount); return obj; } void navit_object_unref(struct navit_object *obj) { if (obj) { obj->refcount--; dbg(lvl_debug,"refcount %s %p %d\n",attr_to_name(obj->func->type),obj,obj->refcount); if (obj->refcount <= 0 && obj->func && obj->func->destroy) obj->func->destroy(obj); } } struct attr_iter { void *last; }; struct attr_iter * navit_object_attr_iter_new(void) { return g_new0(struct attr_iter, 1); } void navit_object_attr_iter_destroy(struct attr_iter *iter) { g_free(iter); } /** * @brief Generic get function * * This function searches an attribute list for an attribute of a given type and stores it in the {@code attr} * parameter. Internally it calls * {@link attr_generic_get_attr(struct attr **, struct attr **, enum attr_type, struct attr *, struct attr_iter *)} * to retrieve the attribute; see its documentation for details. *

* Searching for attr_any or attr_any_xml is supported. *

* An iterator can be specified to get multiple attributes of the same type: * The first call will return the first match; each subsequent call * with the same iterator will return the next match. If no more matching * attributes are found in either of them, false is returned. * * @param obj The object to return an attribute for. This can be any Navit object type, but the parameter should * be cast to {@code struct navit_object *} to avoid compiler warnings. * @param type The attribute type to search for. Searching for {@code attr_any} or {@code attr_any_xml} is * possible. * @param attr Points to a {@code struct attr} which will receive the attribute * @param iter An iterator to receive multiple attributes of the same type with subsequent calls. If {@code NULL}, * the first matching attribute will be retrieved. * * @return True if a matching attribute was found, false if not. */ int navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter) { return attr_generic_get_attr(obj->attrs, NULL, type, attr, iter); } void navit_object_callbacks(struct navit_object *obj, struct attr *attr) { if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 0); } int navit_object_set_attr(struct navit_object *obj, struct attr *attr) { dbg(lvl_debug, "enter, obj=%p, attr=%p (%s)\n", obj, attr, attr_to_name(attr->type)); obj->attrs=attr_generic_set_attr(obj->attrs, attr); navit_object_callbacks(obj, attr); return 1; } int navit_object_add_attr(struct navit_object *obj, struct attr *attr) { dbg(lvl_debug, "enter, obj=%p, attr=%p (%s)\n", obj, attr, attr_to_name(attr->type)); if (attr->type == attr_callback) { struct callback_list *cbl; if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) cbl=obj->attrs[0]->u.callback_list; else { struct attr attr; cbl=callback_list_new(); attr.type=attr_callback_list; attr.u.callback_list=cbl; obj->attrs=attr_generic_prepend_attr(obj->attrs, &attr); } callback_list_add(cbl, attr->u.callback); return 1; } obj->attrs=attr_generic_add_attr(obj->attrs, attr); if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 1); return 1; } int navit_object_remove_attr(struct navit_object *obj, struct attr *attr) { if (attr->type == attr_callback) { if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) { callback_list_remove(obj->attrs[0]->u.callback_list, attr->u.callback); return 1; } else return 0; } obj->attrs=attr_generic_remove_attr(obj->attrs, attr); if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, -1); return 1; } void navit_object_destroy(struct navit_object *obj) { attr_list_free(obj->attrs); g_free(obj); } navit-0.5.0+dfsg.1/navit/xmlconfig.h000066400000000000000000000117031264204753600172060ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef NAVIT_XMLCONFIG_H #define NAVIT_XMLCONFIG_H #ifdef __cplusplus extern "C" { #endif #include "config.h" #ifndef USE_EZXML #ifdef HAVE_GLIB #define USE_EZXML 0 #else #define USE_EZXML 1 #endif #endif #if !USE_EZXML #define XML_ATTR_DISTANCE 1 typedef GMarkupParseContext xml_context; #else #include "ezxml.h" #define XML_ATTR_DISTANCE 2 #undef G_MARKUP_ERROR #undef G_MARKUP_ERROR_INVALID_CONTENT #undef G_MARKUP_ERROR_PARSE #undef G_MARKUP_ERROR_UNKNOWN_ELEMENT #define G_MARKUP_ERROR 0 #define G_MARKUP_ERROR_INVALID_CONTENT 0 #define G_MARKUP_ERROR_PARSE 0 #define G_MARKUP_ERROR_UNKNOWN_ELEMENT 0 typedef void * xml_context; #endif typedef void *(*object_func_new)(struct attr *parent, struct attr **attrs); typedef int (*object_func_get_attr)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter); typedef struct attr_iter *(*object_func_iter_new)(void *); typedef void (*object_func_iter_destroy)(struct attr_iter *); typedef int (*object_func_set_attr)(void *, struct attr *attr); typedef int (*object_func_add_attr)(void *, struct attr *attr); typedef int (*object_func_remove_attr)(void *, struct attr *attr); typedef int (*object_func_init)(void *); typedef void (*object_func_destroy)(void *); typedef void *(*object_func_dup)(void *); typedef void *(*object_func_ref)(void *); typedef void *(*object_func_unref)(void *); struct object_func { enum attr_type type; void *(*create)(struct attr *parent, struct attr **attrs); int (*get_attr)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct attr_iter *(*iter_new)(void *); void (*iter_destroy)(struct attr_iter *); int (*set_attr)(void *, struct attr *attr); int (*add_attr)(void *, struct attr *attr); int (*remove_attr)(void *, struct attr *attr); int (*init)(void *); void (*destroy)(void *); void *(*dup)(void *); void *(*ref)(void *); void *(*unref)(void *); }; extern struct object_func map_func, mapset_func, navit_func, osd_func, tracking_func, vehicle_func, maps_func, layout_func, roadprofile_func, vehicleprofile_func, layer_func, config_func, profile_option_func, script_func, log_func, speech_func, navigation_func, route_func; #define HAS_OBJECT_FUNC(x) ((x) == attr_map || (x) == attr_mapset || (x) == attr_navit || (x) == attr_osd || (x) == attr_trackingo || (x) == attr_vehicle || (x) == attr_maps || (x) == attr_layout || (x) == attr_roadprofile || (x) == attr_vehicleprofile || (x) == attr_layer || (x) == attr_config || (x) == attr_profile_option || (x) == attr_script || (x) == attr_log || (x) == attr_speech || (x) == attr_navigation || (x) == attr_route) #define NAVIT_OBJECT struct object_func *func; int refcount; struct attr **attrs; struct navit_object { NAVIT_OBJECT }; int navit_object_set_methods(void *in, int in_size, void *out, int out_size); struct navit_object *navit_object_new(struct attr **attrs, struct object_func *func, int size); struct navit_object *navit_object_ref(struct navit_object *obj); void navit_object_unref(struct navit_object *obj); struct attr_iter * navit_object_attr_iter_new(void); void navit_object_attr_iter_destroy(struct attr_iter *iter); int navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter); void navit_object_callbacks(struct navit_object *obj, struct attr *attr); int navit_object_set_attr(struct navit_object *obj, struct attr *attr); int navit_object_add_attr(struct navit_object *obj, struct attr *attr); int navit_object_remove_attr(struct navit_object *obj, struct attr *attr); void navit_object_destroy(struct navit_object *obj); typedef GError xmlerror; /* prototypes */ enum attr_type; struct object_func *object_func_lookup(enum attr_type type); void xml_parse_text(const char *document, void *data, void (*start)(xml_context *, const char *, const char **, const char **, void *, GError **), void (*end)(xml_context *, const char *, void *, GError **), void (*text)(xml_context*, const char *, gsize, void *, GError **)); gboolean config_load(const char *filename, xmlerror **error); //static void xinclude(GMarkupParseContext *context, const gchar **attribute_names, const gchar **attribute_values, struct xmldocument *doc_old, xmlerror **error); /* end of prototypes */ #ifdef __cplusplus } #endif #endif navit-0.5.0+dfsg.1/navit/xpm/000077500000000000000000000000001264204753600156515ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/xpm/CMakeLists.txt000066400000000000000000000124311264204753600204120ustar00rootroot00000000000000macro(convert_to_png IMAGE_INPUT IMAGE_OUTPUT SCALE) get_filename_component(FILE_EXT ${IMAGE_INPUT} EXT) string(TOUPPER ${FILE_EXT} FILE_TYPE) string(REGEX REPLACE "^\\." "" FILE_TYPE ${FILE_TYPE}) if(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "rsvg-convert") if (${SCALE} GREATER 0) set(SCALE_ARGS --width=${SCALE} --height=${SCALE}) else() set(SCALE_ARGS) endif() set(COMMAND_ARGS ${SCALE_ARGS} --output ${IMAGE_OUTPUT} ${IMAGE_INPUT}) elseif(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "convert") if (${SCALE} GREATER 0) set(SCALE_ARGS -resize ${SCALE}x${SCALE}) else() set(SCALE_ARGS) endif() set(COMMAND_ARGS -background none ${IMAGE_INPUT} ${SCALE_ARGS} ${IMAGE_OUTPUT}) elseif(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "ksvgtopng") set (NEW_SCALE ${SCALE}) if (${SCALE} EQUAL 0) file(STRINGS ${IMAGE_INPUT} NEW_SCALE_LINE REGEX "[^-]width=\"[0-9pxt.]*\"") string(REGEX REPLACE ".*width=\"([0-9]*).*" "\\1" NEW_SCALE ${NEW_SCALE_LINE}) endif() set(COMMAND_ARGS ${NEW_SCALE} ${NEW_SCALE} ${IMAGE_INPUT} ${IMAGE_OUTPUT}) elseif(${IMAGE_CONVERTER_${FILE_TYPE}} MATCHES "inkscape") if (${SCALE} GREATER 0) set(SCALE_ARGS --export-width=${SCALE} --export-height=${SCALE}) else() set(SCALE_ARGS) endif() set(COMMAND_ARGS --without-gui --export-background-opacity=0 --export-png ${IMAGE_OUTPUT} ${SCALE_ARGS} ${IMAGE_INPUT}) else() message(FATAL_ERROR "no svg2png converter defined here.") endif() add_custom_command ( OUTPUT ${IMAGE_OUTPUT} DEPENDS ${IMAGE_INPUT} COMMAND ${IMAGE_CONVERTER_${FILE_TYPE}} ${COMMAND_ARGS} ) endmacro() macro(add_scale_targets IMAGE_SRC IMAGE_NAME) string(REPLACE "," ";" SCALES "${ARGN}") set(add_scale_targets_is_first_scale 1) foreach (CURRENT_SCALE ${SCALES}) if(add_scale_targets_is_first_scale EQUAL 1) set (IMAGE_DST ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_NAME}.png) set(add_scale_targets_is_first_scale 0) elseif (${CURRENT_SCALE} EQUAL 0) set (IMAGE_DST ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_NAME}.png) message_error( "Image size value of 0 to leave image unscaled can only be given as the first value in row, e.g. -D svg2png_scaling=0,16,32 " ) else() set (IMAGE_DST ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_NAME}_${CURRENT_SCALE}_${CURRENT_SCALE}.png) endif() if(NOT CURRENT_SCALE EQUAL -1) convert_to_png( ${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_SRC} ${IMAGE_DST} ${CURRENT_SCALE} ) list(APPEND IMAGE_TARGETS ${IMAGE_DST}) endif() endforeach() endmacro() install(FILES desktop_icons/navit.desktop DESTINATION share/applications) install(FILES desktop_icons/22x22/navit.png DESTINATION share/icons/hicolor/22x22/apps) install(FILES desktop_icons/128x128/navit.png DESTINATION share/icons/hicolor/128x128/apps) #install(FILES bench.xpm DESTINATION ) if (USE_SVG OR SVG2PNG) FILE(GLOB SVG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.svg" "*.svgz") if(USE_SVG) list(APPEND IMAGES_TO_COPY ${SVG_FILES}) endif(USE_SVG) if(SVG2PNG) list(APPEND FILES_TO_PNG ${SVG_FILES}) endif(SVG2PNG) endif() FILE(GLOB XPM_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.xpm") if(XPM2PNG) foreach (IMAGE_SRC ${SVG_FILES}) string(REGEX REPLACE ".[a-z]*\$" "" IMAGE ${IMAGE_SRC}) list(APPEND SVG_FILES_BASENAMES ${IMAGE}) endforeach() foreach (IMAGE_SRC ${XPM_FILES}) string(REGEX REPLACE ".[a-z]*\$" "" IMAGE ${IMAGE_SRC}) list(FIND SVG_FILES_BASENAMES ${IMAGE} DUP_IMG) if ( ${DUP_IMG} LESS 0 ) list(APPEND FILES_TO_PNG ${IMAGE_SRC}) else() message(STATUS "image '${IMAGE}': XPM version skipped in favor of SVG") endif() endforeach() else() list(APPEND IMAGES_TO_COPY ${XPM_FILES}) endif(XPM2PNG) foreach (IMAGE_SRC ${FILES_TO_PNG}) string(REGEX REPLACE ".[a-z]*\$" "" IMAGE ${IMAGE_SRC}) if ( IMAGE_SRC MATCHES ".*svgz*" ) if ( DEFINED svg2png_scaling_nav AND ${IMAGE} MATCHES "^nav_") add_scale_targets(${IMAGE_SRC} ${IMAGE} ${svg2png_scaling_nav}) elseif( DEFINED svg2png_scaling_flag AND ${IMAGE} MATCHES "^country_") add_scale_targets(${IMAGE_SRC} ${IMAGE} ${svg2png_scaling_flag}) elseif( DEFINED svg2png_scaling) add_scale_targets(${IMAGE_SRC} ${IMAGE} ${svg2png_scaling}) endif() else() add_scale_targets(${IMAGE_SRC} ${IMAGE} 0) endif() endforeach() foreach (IMAGE_FILE ${IMAGES_TO_COPY}) add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_FILE}" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_FILE}" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_FILE}" ) list(APPEND IMAGE_TARGETS "${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_FILE}") endforeach() add_custom_target(images ALL DEPENDS ${IMAGE_TARGETS}) add_custom_target(images_resource COMMAND mkdir -p ../resources/share/navit/xpm COMMAND cp ${IMAGE_TARGETS} ../resources/share/navit/xpm) add_dependencies(images_resource images) install( FILES ${IMAGE_TARGETS} DESTINATION ${IMAGE_DIR} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) navit-0.5.0+dfsg.1/navit/xpm/Makefile.am000066400000000000000000000325001264204753600177050ustar00rootroot00000000000000include $(top_srcdir)/Makefile.inc image_DATA = cemetery.xpm image_DATA += dumping_station.xpm image_DATA += highway_exit.xpm image_DATA += hunting_stand.xpm image_DATA += level_crossing.xpm image_DATA += tower.xpm image_DATA += trailerpark.xpm image_DATA += public_office.xpm ## Obsolete. Should be removed eventually... image_DATA += biergarten.xpm image_DATA += bus_halt.xpm image_DATA += car_dealer.xpm image_DATA += castle.xpm image_DATA += library.xpm image_DATA += memorial.xpm image_DATA += picnic.xpm image_DATA += potable_water.xpm image_DATA += restroom.xpm image_DATA += sport.xpm image_DATA += menu.xpm image_DATA += toggle_fullscreen.xpm ## Obsolete end image_DATA += flag_bk_tr.xpm image_DATA += flag_bk_wh.xpm image_DATA += flag_bl_wh.xpm image_DATA += flag_wh_bk.xpm image_DATA += gc_tradi.xpm image_DATA += gc_multi.xpm image_DATA += gc_mystery.xpm image_DATA += gc_event.xpm image_DATA += gc_reference.xpm image_DATA += gc_webcam.xpm image_DATA += gc_question.xpm image_DATA += gc_stages.xpm image_DATA += nav_left_1.xpm image_DATA += nav_left_2.xpm image_DATA += nav_right_1.xpm image_DATA += nav_right_2.xpm image_DATA += nav_straight.xpm image_DATA += nav_straight_32.xpm image_DATA += nav_left_1_32.xpm image_DATA += nav_left_2_32.xpm image_DATA += nav_right_1_32.xpm image_DATA += nav_right_2_32.xpm svgs = gui_about.svg svgs += gui_actions.svg svgs += gui_active.svg svgs += gui_bookmark.svg svgs += gui_formerdests.svg svgs += gui_display.svg svgs += gui_help.svg svgs += gui_home.svg svgs += gui_inactive.svg svgs += gui_map.svg svgs += gui_maps.svg svgs += gui_rules.svg svgs += gui_settings.svg svgs += gui_sound.svg svgs += gui_sound_off.svg svgs += gui_tools.svg svgs += gui_fullscreen.svg svgs += gui_leave_fullscreen.svg svgs += gui_quit.svg svgs += gui_stop.svg svgs += gui_town.svg svgs += gui_vehicle.svg svgs += gui_vehicle_pedestrian.svg svgs += gui_zoom_in.svg svgs += gui_zoom_out.svg svgs += zoom_in.svg svgs += zoom_out.svg svgs += gui_select_street.svg svgs += gui_select_town.svg svgs += gui_select_country.svg svgs += gui_arrow_left.svg svgs += gui_arrow_right.svg svgs += gui_arrow_up.svg svgs += gui_arrow_down.svg svgs += gui_menu.svg svgs += gui_strength_0.svg svgs += gui_strength_1.svg svgs += gui_strength_2.svg svgs += gui_strength_3.svg svgs += gui_strength_4.svg svgs += gui_strength_5.svg svgs += gui_minus.svg svgs += gui_plus.svg svgs += gui_log.svg svgs += gui_search.svg svgs += menu.svg svgs += toggle_fullscreen.svg svgs += airport.svg svgs += atm.svg svgs += attraction.svg svgs += bahai.svg svgs += bank.svg svgs += bar.svg svgs += beer.svg svgs += bench.svg svgs += bicycle_parking.svg svgs += bicycle_rental.svg svgs += bicycle_shop.svg svgs += biergarten.svg svgs += boat_ramp.svg svgs += boundary_stone.svg svgs += buddhist.svg svgs += bus.svg svgs += bus_stop.svg svgs += cafe.svg svgs += camping.svg svgs += car_dealer.svg svgs += car_rent.svg svgs += car_sharing.svg svgs += casino.svg svgs += castle.svg svgs += church.svg svgs += cinema.svg svgs += cursor.svg svgs += cursor225.svg svgs += cursor450.svg svgs += cursor675.svg svgs += cursor_still.svg svgs += dam.svg svgs += danger.svg svgs += daymark.svg svgs += drinking_water.svg svgs += emergency.svg svgs += exit.svg svgs += fastfood.svg svgs += firebrigade.svg svgs += fountain.svg svgs += fuel.svg svgs += golf.svg svgs += heliport.svg svgs += hindu.svg svgs += hospital.svg svgs += hotel.svg svgs += information.svg svgs += islamic.svg svgs += jain.svg svgs += jewish.svg svgs += justice.svg svgs += library.svg svgs += mark.svg svgs += memorial.svg svgs += menu.svg svgs += military.svg svgs += mini_roundabout.svg svgs += museum.svg svgs += pagan.svg svgs += parking.svg svgs += pastafarian.svg svgs += peak.svg svgs += pharmacy.svg svgs += picnic.svg svgs += police.svg svgs += post.svg svgs += rail_station.svg svgs += repair_service.svg svgs += resort.svg svgs += restaurant.svg svgs += ruins.svg svgs += school.svg svgs += shelter.svg svgs += shinto.svg svgs += shop_apparel.svg svgs += shop_computer.svg svgs += shop_department.svg svgs += shop_grocery.svg svgs += shopping.svg svgs += sikh.svg svgs += skiing.svg svgs += sport.svg svgs += stadium.svg svgs += status_calculating_bk.svg svgs += status_calculating_wh.svg svgs += status_no_destination_bk.svg svgs += status_no_destination_wh.svg svgs += status_no_route_bk.svg svgs += status_no_route_wh.svg svgs += status_position_wait_bk.svg svgs += status_position_wait_wh.svg svgs += status_recalculating_bk.svg svgs += status_recalculating_wh.svg svgs += status_routing_bk.svg svgs += status_routing_wh.svg svgs += swimming.svg svgs += taoist.svg svgs += taxi.svg svgs += tec_common.svg svgs += telephone.svg svgs += theater.svg svgs += toggle_fullscreen.svg svgs += toilets.svg svgs += townhall.svg svgs += traffic_signals.svg svgs += unknown.svg svgs += viewpoint.svg svgs += wifi.svg svgs += worship.svg svgs += zoo.svg svgs += zoom_in.svg svgs += zoom_out.svg nav_svgs = nav_left_1_bk.svg nav_left_1_wh.svg nav_left_2_bk.svg nav_left_2_wh.svg nav_left_3_bk.svg nav_left_3_wh.svg nav_svgs += nav_right_1_bk.svg nav_right_1_wh.svg nav_right_2_bk.svg nav_right_2_wh.svg nav_right_3_bk.svg nav_right_3_wh.svg nav_svgs += nav_roundabout_l1_bk.svg nav_roundabout_l1_wh.svg nav_roundabout_l2_bk.svg nav_roundabout_l2_wh.svg nav_svgs += nav_roundabout_l3_bk.svg nav_roundabout_l3_wh.svg nav_roundabout_l4_bk.svg nav_roundabout_l4_wh.svg nav_svgs += nav_roundabout_l5_bk.svg nav_roundabout_l5_wh.svg nav_roundabout_l6_bk.svg nav_roundabout_l6_wh.svg nav_svgs += nav_roundabout_l7_bk.svg nav_roundabout_l7_wh.svg nav_roundabout_l8_bk.svg nav_roundabout_l8_wh.svg nav_svgs += nav_roundabout_r1_bk.svg nav_roundabout_r1_wh.svg nav_roundabout_r2_bk.svg nav_roundabout_r2_wh.svg nav_svgs += nav_roundabout_r3_bk.svg nav_roundabout_r3_wh.svg nav_roundabout_r4_bk.svg nav_roundabout_r4_wh.svg nav_svgs += nav_roundabout_r5_bk.svg nav_roundabout_r5_wh.svg nav_roundabout_r6_bk.svg nav_roundabout_r6_wh.svg nav_svgs += nav_roundabout_r7_bk.svg nav_roundabout_r7_wh.svg nav_roundabout_r8_bk.svg nav_roundabout_r8_wh.svg nav_svgs += nav_straight_bk.svg nav_straight_wh.svg nav_turnaround_left_bk.svg nav_turnaround_left_wh.svg nav_svgs += nav_turnaround_right_bk.svg nav_turnaround_right_wh.svg nav_destination_bk.svg nav_destination_wh.svg flag_svgs = country_.svgz country_AD.svgz country_AE.svgz country_AF.svgz country_AG.svgz country_AI.svgz country_AL.svgz country_AM.svgz flag_svgs += country_AN.svgz country_AO.svgz country_AQ.svgz country_AR.svgz country_AS.svgz country_AT.svgz country_AU.svgz country_AW.svgz flag_svgs += country_AX.svgz country_AZ.svgz country_BA.svgz country_BB.svgz country_BD.svgz country_BE.svgz country_BF.svgz flag_svgs += country_BG.svgz country_BH.svgz country_BI.svgz country_BJ.svgz country_BL.svgz country_BM.svgz country_BN.svgz flag_svgs += country_BO.svgz country_BR.svgz country_BS.svgz country_BT.svgz country_BV.svgz country_BW.svgz country_BY.svgz flag_svgs += country_BZ.svgz country_CA.svgz country_CC.svgz country_CD.svgz country_CF.svgz country_CG.svgz country_CH.svgz flag_svgs += country_CI.svgz country_CK.svgz country_CL.svgz country_CM.svgz country_CN.svgz country_CO.svgz country_CR.svgz flag_svgs += country_CU.svgz country_CV.svgz country_CX.svgz country_CY.svgz country_CZ.svgz country_DE.svgz country_DJ.svgz flag_svgs += country_DK.svgz country_DM.svgz country_DO.svgz country_DZ.svgz country_EC.svgz country_EE.svgz country_EG.svgz flag_svgs += country_EH.svgz country_ER.svgz country_ES.svgz country_ET.svgz country_FI.svgz country_FJ.svgz country_FK.svgz flag_svgs += country_FM.svgz country_FO.svgz country_FR.svgz country_GA.svgz country_GB.svgz country_GD.svgz country_GE.svgz flag_svgs += country_GF.svgz country_GG.svgz country_GH.svgz country_GI.svgz country_GL.svgz country_GM.svgz country_GN.svgz flag_svgs += country_GP.svgz country_GQ.svgz country_GR.svgz country_GS.svgz country_GT.svgz country_GU.svgz country_GW.svgz flag_svgs += country_GY.svgz country_HK.svgz country_HM.svgz country_HN.svgz country_HR.svgz country_HT.svgz country_HU.svgz flag_svgs += country_ID.svgz country_IE.svgz country_IL.svgz country_IM.svgz country_IN.svgz country_IO.svgz country_IQ.svgz flag_svgs += country_IR.svgz country_IS.svgz country_IT.svgz country_JE.svgz country_JM.svgz country_JO.svgz country_JP.svgz flag_svgs += country_KE.svgz country_KG.svgz country_KH.svgz country_KI.svgz country_KM.svgz country_KN.svgz country_KP.svgz flag_svgs += country_KR.svgz country_KW.svgz country_KY.svgz country_KZ.svgz country_LA.svgz country_LB.svgz country_LC.svgz flag_svgs += country_LI.svgz country_LK.svgz country_LR.svgz country_LS.svgz country_LT.svgz country_LU.svgz country_LV.svgz flag_svgs += country_LY.svgz country_MA.svgz country_MC.svgz country_MD.svgz country_ME.svgz country_MF.svgz country_MG.svgz flag_svgs += country_MH.svgz country_MK.svgz country_ML.svgz country_MM.svgz country_MN.svgz country_MO.svgz country_MP.svgz flag_svgs += country_MQ.svgz country_MR.svgz country_MS.svgz country_MT.svgz country_MU.svgz country_MV.svgz country_MW.svgz flag_svgs += country_MX.svgz country_MY.svgz country_MZ.svgz country_NA.svgz country_NC.svgz country_NE.svgz country_NF.svgz flag_svgs += country_NG.svgz country_NI.svgz country_NL.svgz country_NO.svgz country_NP.svgz country_NR.svgz country_NU.svgz flag_svgs += country_NZ.svgz country_OM.svgz country_PA.svgz country_PE.svgz country_PF.svgz country_PG.svgz country_PH.svgz flag_svgs += country_PK.svgz country_PL.svgz country_PM.svgz country_PN.svgz country_PR.svgz country_PS.svgz country_PT.svgz flag_svgs += country_PW.svgz country_PY.svgz country_QA.svgz country_RE.svgz country_RO.svgz country_RS.svgz country_RU.svgz flag_svgs += country_RW.svgz country_SA.svgz country_SB.svgz country_SC.svgz country_SD.svgz country_SE.svgz country_SG.svgz flag_svgs += country_SH.svgz country_SI.svgz country_SJ.svgz country_SK.svgz country_SL.svgz country_SM.svgz country_SN.svgz flag_svgs += country_SO.svgz country_SR.svgz country_ST.svgz country_SV.svgz country_SY.svgz country_SZ.svgz country_TC.svgz flag_svgs += country_TD.svgz country_TF.svgz country_TG.svgz country_TH.svgz country_TJ.svgz country_TK.svgz country_TL.svgz flag_svgs += country_TM.svgz country_TN.svgz country_TO.svgz country_TR.svgz country_TT.svgz country_TV.svgz country_TW.svgz flag_svgs += country_TZ.svgz country_UA.svgz country_UG.svgz country_UM.svgz country_US.svgz country_UY.svgz country_UZ.svgz flag_svgs += country_VA.svgz country_VC.svgz country_VE.svgz country_VG.svgz country_VI.svgz country_VN.svgz country_VU.svgz flag_svgs += country_WF.svgz country_WS.svgz country_YE.svgz country_YT.svgz country_ZA.svgz country_ZM.svgz country_ZW.svgz if USE_SVG image_DATA += $(svgs) $(nav_svgs) $(flag_svgs) endif if USE_SVG2PNG # Implicit rules for generating the PNG files. This only generates the # standard size; for additional sizes see below. %.png: $(srcdir)/%.svg SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" %.png: $(srcdir)/%.svgz SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" pngs = $(addsuffix .png,$(basename $(svgs))) xsize = $(word 1,$(subst x, ,$(scale))) ysize = $(word $(words $(scale)),$(subst x, ,$(scale))) comma =, # template to generate scaling rules for the various PNG sizes define scaling_rule_template %_$(1)_$(1).png: $(srcdir)/%.$(2) SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$$@" endef # template to generate scaling rules for the default PNG size define scaling_rule_template_def $(basename $(1)).png: $(srcdir)/$(1) SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$$@" "$(2)" "$(2)" endef # png images of the user interface and other, sizes e.g. "8,16,32,48,96" if USE_SVG2PNG_SCALES pngs += $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(svgs)))) # create rules from template $(foreach extension,svg svgz, $(foreach size, $(subst $(comma), ,@SVG2PNG_SCALES@),$(eval $(call scaling_rule_template,$(size),$(extension))))) endif # png state flags if USE_SVG2PNG_SCALES_FLAG svg2png_scales_flag = $(subst $(comma), ,@SVG2PNG_SCALES_FLAG@) pngs += $(addsuffix .png,$(basename $(flag_svgs))) pngs += $(foreach scale, $(wordlist 2,100,$(svg2png_scales_flag)), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(flag_svgs)))) # create rules from templates $(foreach extension,svg svgz, $(foreach size, $(wordlist 2,100,$(svg2png_scales_flag)),$(eval $(call scaling_rule_template,$(size),$(extension))))) $(foreach img,$(flag_svgs), $(foreach size, $(firstword $(svg2png_scales_flag)),$(eval $(call scaling_rule_template_def,$(img),$(size))))) endif # png symbols for navigation if USE_SVG2PNG_SCALES_NAV pngs += $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES_NAV@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(nav_svgs)))) # create rules from template $(foreach extension,svg svgz, $(foreach size, $(subst $(comma), ,@SVG2PNG_SCALES_NAV@),$(eval $(call scaling_rule_template,$(size),$(extension))))) endif image_DATA += $(pngs) endif if !SUPPORT_WIN32 DESKTOPFILEdir=$(datadir)/applications DESKTOPFILE_DATA = desktop_icons/navit.desktop ICON128dir=$(datadir)/icons/hicolor/128x128/apps ICON128_DATA = desktop_icons/128x128/navit.png ICON22dir=$(datadir)/icons/hicolor/22x22/apps ICON22_DATA = desktop_icons/22x22/navit.png endif EXTRA_DIST = $(image_DATA) $(DESKTOPFILE_DATA) $(ICON128_DATA) $(ICON22_DATA) navit_svg2png if USE_SVG2PNG clean: rm -f $(pngs) endif navit-0.5.0+dfsg.1/navit/xpm/airport.svg000066400000000000000000000121311264204753600200500ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/atm.svg000066400000000000000000000216261264204753600171620ustar00rootroot00000000000000 image/svg+xml $ navit-0.5.0+dfsg.1/navit/xpm/attraction.svg000066400000000000000000000073361264204753600205530ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/bahai.svg000066400000000000000000000317231264204753600174440ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/bank.svg000066400000000000000000000216261264204753600173140ustar00rootroot00000000000000 image/svg+xml $ navit-0.5.0+dfsg.1/navit/xpm/bar.svg000066400000000000000000000147701264204753600171470ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/beer.svg000066400000000000000000000147701264204753600173200ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/bench.svg000066400000000000000000000606071264204753600174620ustar00rootroot00000000000000 image/svg+xmlbench g.aoi bench g.aoi navit-0.5.0+dfsg.1/navit/xpm/bicycle_parking.svg000066400000000000000000000152541264204753600215260ustar00rootroot00000000000000 image/svg+xml P navit-0.5.0+dfsg.1/navit/xpm/bicycle_rental.svg000066400000000000000000000166071264204753600213630ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/bicycle_shop.svg000066400000000000000000000152141264204753600210400ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/biergarten.svg000066400000000000000000000153211264204753600205160ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/biergarten.xpm000066400000000000000000000040551264204753600205250ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 92 2", "Qt c None", "#p c #745f2b", "#q c #775713", "#h c #776741", "#i c #785309", "#a c #7d653c", "#o c #7f795f", "#b c #804d02", "#r c #805f10", ".3 c #806238", "#j c #815401", ".V c #846031", ".U c #868884", "#s c #876d1c", ".4 c #884e02", ".N c #885f2a", "#t c #897a3c", "#c c #8a5400", "#k c #8a5f01", "#z c #8f876b", ".F c #916825", ".W c #925101", ".M c #92928d", ".5 c #935600", "#l c #947207", "#d c #956300", "#m c #957b18", ".# c #95948f", ".w c #967327", "#w c #998a6d", ".E c #999790", ".O c #9a5700", "#y c #9b8d6b", ".u c #9c9b93", "#x c #9d8d69", ".X c #9e5c00", ".6 c #9f6701", "#e c #9f7406", "#g c #9f8d52", "#v c #9f9a8a", "#u c #9f9b7e", "#n c #a19663", ".2 c #a2a3a0", ".n c #a3915f", "#f c #a47f15", ".v c #a5a5a1", ".P c #a66200", ".G c #a66400", ".g c #a6a49b", ".D c #a8a6a0", ".Y c #a96d00", ".7 c #aa7604", ".9 c #ab975c", ".x c #af7404", ".8 c #b08515", ".Q c #b26f00", "#. c #b3b3ac", ".H c #b46f00", ".Z c #b57d07", ".1 c #b7a062", ".y c #ba7e05", ".T c #baa059", ".f c #babab6", ".0 c #bb8916", ".R c #bf8205", ".L c #bfa457", "## c #bfc0be", ".I c #c07b00", ".a c #c0beba", ".S c #c18c0f", ".C c #c1aa60", ".t c #c1b382", ".m c #c2c1b8", ".o c #c5a660", ".e c #c5c4c0", ".z c #c68a08", ".J c #c98c08", ".K c #c9930d", ".c c #cdcbc7", ".d c #ceccc9", ".b c #cfcdca", ".p c #d0b067", ".A c #d39e22", ".B c #d4a72f", ".q c #d6b86c", ".r c #dec077", ".s c #dec37a", ".h c #e1dcd4", ".j c #e8e2d8", ".i c #e9e4db", ".l c #ece7df", ".k c #ede7df", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQt.#.a.b.c.d.e.fQtQtQtQtQt", "QtQtQtQt.g.h.i.j.k.l.mQtQtQtQtQt", "QtQtQtQt.n.o.p.q.r.s.t.u.vQtQtQt", "QtQtQtQt.w.x.y.z.A.B.CQt.D.EQtQt", "QtQtQtQt.F.G.H.I.J.K.LQtQt.MQtQt", "QtQtQtQt.N.O.P.Q.R.S.TQtQt.UQtQt", "QtQtQtQt.V.W.X.Y.Z.0.1QtQt.2QtQt", "QtQtQtQt.3.4.5.6.7.8.9#.##QtQtQt", "QtQtQtQt#a#b#c#d#e#f#gQtQtQtQtQt", "QtQtQtQt#h#i#j#k#l#m#nQtQtQtQtQt", "QtQtQtQt#o#p#q#r#s#t#uQtQtQtQtQt", "QtQtQtQtQt#v#w#x#y#zQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; navit-0.5.0+dfsg.1/navit/xpm/boat_ramp.svg000066400000000000000000000077271264204753600203530ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/boundary_stone.svg000066400000000000000000000344661264204753600214420ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/buddhist.svg000066400000000000000000000277351264204753600202160ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/bus.svg000066400000000000000000000234451264204753600171730ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/bus_halt.xpm000066400000000000000000000015151264204753600202020ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 32 1", ". c None", "f c #009933", "e c #019933", "h c #149d33", "i c #1a9e33", "k c #1b9e33", "r c #1c9e33", "A c #2ca133", "v c #2fa233", "y c #40a533", "D c #49a733", "j c #4ea833", "d c #53a933", "z c #57aa33", "B c #68ad33", "b c #7cb133", "u c #83b333", "C c #8fb533", "m c #9bb833", "a c #9cb833", "q c #a0b933", "g c #b4bd33", "x c #b7bd33", "t c #bbbe33", "# c #c7c033", "l c #d3c333", "c c #d4c333", "s c #e4c633", "w c #ecc833", "p c #f1c933", "n c #f7ca33", "o c #ffcc33", ".....#abba#.....", "...cdeffffedc...", "..ghffijjkffhg..", ".lhfkmnoopqkfhl.", ".dfrsftoouvwrfd.", "#efxnftoouvoxfe#", "afionftoouvooifa", "bfjonfyzzAvoojfb", "bfjonfBCCDvoojfb", "afionftoouvooifa", "#efxnftoouvoxfe#", ".dfrsftoouvwrfd.", ".lhfkmnoopqkfhl.", "..ghffijjkffhg..", "...cdeffffedc...", ".....#abba#....."}; navit-0.5.0+dfsg.1/navit/xpm/bus_stop.svg000066400000000000000000000150111264204753600202260ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/cafe.svg000066400000000000000000000104461264204753600172750ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/camping.svg000066400000000000000000000100261264204753600200070ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/car_dealer.svg000066400000000000000000000133121264204753600204530ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/car_dealer.xpm000066400000000000000000000006501264204753600204610ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 4 1", ". c None", "a c #000000", "# c #7f7f7f", "b c #bfbfbf", "................", "................", "................", "......#aa#......", "....baaaaaab....", ".......aa.......", "....baaaaaab....", "......#aa#......", ".......aa.......", ".......aa.......", ".......aa.......", ".......aa.......", ".......aa.......", "................", "................", "................"}; navit-0.5.0+dfsg.1/navit/xpm/car_rent.svg000066400000000000000000000145561264204753600202020ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/car_sharing.svg000066400000000000000000000151721264204753600206600ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/casino.svg000066400000000000000000000147101264204753600176510ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/castle.svg000066400000000000000000000404521264204753600176520ustar00rootroot00000000000000 image/svg+xml en style="overflow:visible"> navit-0.5.0+dfsg.1/navit/xpm/castle.xpm000066400000000000000000000006311264204753600176520ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 3 1", "# c None", ". c #000000", "a c #010101", ".#.#.######.#.#.", ".....######.....", ".....######.....", "#...########...#", "#...#.a..a.#...#", "#..............#", "#..............#", "#..#........#..#", "#.###......###.#", "#.###......###.#", "#......##......#", "#.....a##a.....#", "#.....####.....#", "#.....####.....#", "#.....####.....#", "################"}; navit-0.5.0+dfsg.1/navit/xpm/cemetery.xpm000066400000000000000000000007161264204753600202200ustar00rootroot00000000000000/* XPM */ static char * cemetery_xpm[] = { "14 16 8 1", " c None", ". c #8E8E8E", "+ c #8D8D8D", "@ c #404040", "# c #8E8D8E", "$ c #8C8C8C", "% c #8F8F8F", "& c #898989", " ", " ", " ", " .++. ", " .++++++ ", " +.++++++. ", " ++++++++. ", " .+@@+++++ ", " .+++@@+++ ", " #+@@++++. ", " #.++@@+++ ", " .+++++++ ", " $%.... ", " $%.& ", " ", " "}; navit-0.5.0+dfsg.1/navit/xpm/church.svg000066400000000000000000000134271264204753600176550ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/cinema.svg000066400000000000000000000115151264204753600176310ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/country_.svgz000066400000000000000000000041671264204753600204360ustar00rootroot00000000000000VKIcountry_.svgYmo__bT\ %ɇ"(KЏ\Il(R )Kʯemnsťq`rfvfv晙]zq[XaERY^ڟ?섶U7qyY]Owor}%F!k6/ŗ:wziu:"*{k9o,E=OU؊]kkD=D]U$d(xr`JDQbRꀄS&>:E}c,R <-yCuFqM?, V Tt0JPG~dw"ފz'v{ZfpwT7Aҥ ;db0Phdy>"ui56K췬&{7}86h*\6;PHŪM7Uq)\{a/oaI,ǟM;#580`BaFpxȃ{g$g3Q,w?KX3shyݡ ,~, w=.]_7U%2D 3?yPNƙ<'D=SQr&obޢp~ (Jq#I!* Q8xlLjMe>1,zhcKt(b"UŠ뜛Q/:'i8ι^ZL!sTwbQvqd8HWZ3֮(-Ԅ>ZN`QO;S;am"!6cFd̶ԯBCj e*ŏmQHm'Ya#]'~![e묈s|mڢaTT!Of($ I` 18 ٝխxgvUt3G:qk|9srtwGo- -n]/ԯzg3VT>'navit-0.5.0+dfsg.1/navit/xpm/country_AD.svgz000066400000000000000000000402361264204753600206400ustar00rootroot00000000000000'zHcountry_AD.svg[o[WvSKRG~Xt(PvȢ@ұOREcӃ ueu_uɯzq{qw2^.o_߿?m'zv{5Y/Nn'OOV>d2afX,]]o/ՙnnOrZ\^mճWW g!2tv={}zfo*>658xqWg̛wW{\u og/櫻|ux$ ?/N뫋of'gZ,3oq;_ 1S6?JyoϻZ\ q~ܬ>l)?يOnqa0M6_Xnne{ #=֦oYɋzv5[ϴH-$m /<͟ӀOrqr=9~1[{b|.1'xl7wݢ[Tm._\k77MN&gxmlOζV;/_7k=gxyfaӭX:ር 3F].tN+ANi/.77migdwrý[,^\!_ahC`Rr.q0߽|\77nx_ljǰcpv(\ woܳ~r7/X^ߍBy/ ; ߅ij4Oν7ū~J!4s? r~9uRbrM~\Jh)ONJCli }%-'t577,!܁T!Lr,C5ij,| Ҁ` 1 XZq]Ī7\7d|]MsCj-!CM!IV٣> ^mk19|6 E,bɠs̓]wO{LzmR/WS-c-ejg.Go-> .{C;[cwXfs5S52MO=LRCFXV4q$ \;#r̢b}2͓"RZR!Hzę=8x.*Ĩ@)%MbUOYu^ 1;Cr/NL ,i6PBFH{!E⃐E(R[Ͷw C w: 5`z3ߔ\PEf#V, nVR] ezq6K( YKCQ%I[dr韆9Ko~sj]YTmÆ !f6^hMC"y7&pV"& %wloPˎ`-/shAOudP~R+⍎(po6,fu5;Hcb.6"`0>` CۜfcvDY>d؛dxѱyfwiENP\rjE1#sZ)MZ֓ơ.#}!l`UkM6q"9 M>g]8lGiJqdADSX8-c\s^sCXB+ .duJh!"7aT'{05c@l$$ia|I 豗nbaC !lI" =#^2ѡmGzhJe$ -(el؉^<b] a!T$98 V0~ v77)\4F±BI\43txo{7G|'ég-vNwz_r F ጷ-t[ή_"`p0`kquw<tu܇&@}$L\{XX/!..N^ȥ_éBn2U@\1RW*x%+SsBGy4yGyPO%N9JI| G<$^bG?Dj:2DzXC?}Daė?.]Ш $Z# Q70ft5o`VK6QZ#/9vO\-M ͰR6hL@RnʋԢ'gڸs~[QQ[kaTPkcխi*'I`9w @9)QY  ~,`M1dq4'5EQjD4Nƾ<6Mx洍 ]` S #k!g%6%hyka=2dUߐ,"BbRqslN4ۆ/U-=,$ #%bbka^!=d?¸7~qqsEl\-?(eb4̜π0sCoSJT]7;DwwJ|EN Z&-&).G@=-vӦ;?;ܸգ;<ܹ6l9ί9uOVoG.`i;i{ܴiL2vhTF?lT':8MEU24j^(ASU`Z5˵)ڈ*v)*BLll&V]O2J@Y@O 'b` aT5S #Gٚ#T٠ֱl]JjK ,TU^1mfYt%Rf. өz(IANAc$(և(5JTW ۚ~UR*NU3D?U gv`een,0֫je؁v+X=V ?N!StN6*#ˑ,'рIN*IpwSWw#-: 0 gDF:,buӝ洯%}U4L"SW\g8#BRM?T1HW$lr29Kz{@3S20cXjq %;:s z G&VQM K//DeUB堚fS J'~hUw8+$ ,PZ8VLV~ ם*[B3!'K.ܹ$ΎՋ^{MCVZK`y?eE_7a.AJ@oT⌵({VG4V\Hٵ7~lVBP8ƛQ^h7YZЪfҥX` g31/0YhĨzZh'FU;!Ial0&zQLِUBƃ%]H6WP5X02tKM #CB#[7t-&6vaFfzjlvȺt@A]eբQ'r8 6M1>æ?5:x1f ۾uE;(tGn1 FM)!!s_%5wg/\Hr-alE !ZcbCd,jwٺVQQ<01Nͦ X[kjdP!WAG5@ԋcEMƵ*ǸfKQ֢2ͥhdס@ex `JrF59ˀk72̺ ;НUiX3moNAw82IرeWXgiڨثOĚjmI8H54]kWNI mk]&6ޞ-qNzΫ/qM݉NX\+ٚ :FjF{Du5]*Y#\w>쐗OY 3`75uJ[@O ߺAR%!{ v >+W(+&F[#1E/z.m>S(F]V = Z+AvoVp%>Ţ:`}bt=c;IYSzﰰ#՝^qDZ{pJ{( *J(`=2;*SZpa{@tabzP]?- RsQMigVշEVƩDnm|{"SKG(ŋC1!Qh|]/}sYYEЖZ_QBK!'4RT ֎f|fqp v1_u72 cbKpS{SS~>LPâT[-oM]hcX?t|׿̺uڱni4&ZWҦ4 4j~wZLGұQY|gZZkqNKsG+ģ{wϧ'cs8w PE+/h. ΥHI)-ȱe;7:=p!iSu*323.o"ΪV;ઓ@>oOYSWMb!WSj)T"Mh8HȂrlJ7Ʒ?>SI|.\>hgi(Т>,6IלjεדJk柩.Wx:9 .ԼbT)khcgG+2N$ Z6|u ~%ml6?8pA-Р<ٝUI`G$K<-KvɕӐ\lbԿcЪ'P%4E`_M-hA1&膎/,KPXX`uBq9b )6d)̨SVc3i2Е0ڌD)O`?7LIok!o*JlGJ#S! THxKUVGyIM١PB&c[T6[56vƣM!7V35jxΘIQn.RdžLjZEm/xh/ t&o5 e kn:oShW@12 eы"3YԶF2:5?H~cbNѣ{%#xcb>*%@!Y e ۠eݥ`%y膴 ΢L.ܵTL('rЭU4Hm\፺4^B5J֢aofߪJJʘiAR (noqct=ʊy!M镛A u2RqW1k墲LZ<{V9j +PSQZ|RG@^5+S:2r|9|;0I ;$)lNHA"Xg714J 6y&~6J;7RY:#V B_Q0?Qgufo]<`Fj@BWvw\Y|zC}/J_(ceQ Sts׽iE*TOGY|gd**~bxPY^Փ#Io;UO5?qif^;Ko a Pc:'i/F[=i iPɜ^F)J:Oұ "`jITOWLJ^͘7~pia#)#G{ )7.Ծ^|Diu`vQ0h֬< +d" ep]tbɎR'11*;+-s!%ö,#2&O4}a Z٘zOmW5:3% b&կƩrт0"c09jLkS?Az]mQ.;JWLeXTIqSvoKo-5a/nNӺOgd%=4BOŪEBVU鶝8\d̜Y,¥uJE*F̵yGkWt4]z&IeKdGr]YƮ֝ >.91*t"tU'" mqNA`^E*.janFg:B3 _|tE") Ҫf8I_HcK9Y;CAsʤf5t95l*TMϱPû;ωUywoں1t.}[u:C 3o=R+mP&w?]t" "JU)LGReDhGh>~U$e@CH#UfM@1m^!vؾ׽s*z ((ltEI#sn^JB ʀoH]i+RxS3nLlNx-@[UIZ TYd&=a]kB~e%vf:ζE®(1 _}|PM#WfcP[&=N&EWkCdţ6⼳D2;դpXg߶oIn@c^jZlQ2/p{4б@knl+yo&fL :.! άeM{`\9:%AȀ6jw)ܽf"E69(rZ s;؃qHEv8Caw!L%ZF7D`2A5-|̠͑+x$H HdSK\UZVO7YܦWIg>0Q2Pyu EjQLRy;*^.$ W4BQͨ3H䓸۾  M9;ȟv,)9N]jXp_2Eے[)"]A Wݏ*ao7n.XT= SyF:3j2Zgm5b*T̢uD<ܵLYGW.43:j[> |OӶwb5|Ia8r3[qe/+NC g(vR\6EfY"-_檺9fߞzsaMd*.`dg'jGrb=] IQ#6B+lw7:R63g$ȡ7%tj-SlNbXB3)h6aSdɱ{_:nuTkɇ˪*'xҵ1r:M`9fꨢ Tj9t%;}k3$Y_a:|<߳6 &%ll3tQtL%:p)ܽ {W\Tz4Z1G5A>H!@pCd੃acA[N ~y[**adB&s%5GXBVXH:([rj+BއHocݣd#rDH+lHFtTg 5|3W4(#H1uG jZE 0dfslCf_$ l' e۴\9VU]R'*GMAs)3i${V\`3SZ<-z#/O{ĺ51Zyu߭,'ёі(e^Ogg҄#oݕ,qP)h5éqC×A+"Qߑ6aAeI Fs ئ]2 DyN͟`TnG>͠qJȬ@YN1G rr)W޲ǒ}-nyYH3*2fDͧX-GgZݽٓsSq9WRbj;_i"3g3Lg7`. SbA=!rRV$ӴM.Q& փg]ҮQ9-;i*\/QC={OBf2cXV/㰷ܠؚ,3OXA\r> A;wR-{CX?d2ꚶ<BTA(9KbC%4+4lNw@wѝ/-yVB`Y+o0?;rn紈(ʬ\Beʈm\.JmtpAF0ri8i^9@#sL2/rj\ghձ4Mv̸o~TW1l~~-[|I{mhC([+!4"I&zSz 1S>J9h[e(Aۆ6XމuL?ڡ{.M@Xj 4zG[mZ 3Ys Dɕ{wcŪF:e"mUlJSS3zUBv~O7+͚IvJNܹ/s{E_~lPBbƑPߑpbq^%3eޒf+}\w?O_z]j\͌X"1t r,q0LLUIikHc}4g$iM4/L٥'cZ;q}\Ӝ/nӼ>Gf·f&]m~xLwjf#~tutmʝc'Wl7y|y6RpgTiTj&WBtuP+8xVFıN4YlN.9 ~P߼T 8R0hT`[XIC yhBAcon_ =D$(W% P:tQlo.j <ȄDuŵol$]!* Mޢi@I*Y$3lBClCJmGD.%3xۮ|\钜LŒD8C+dEPSMWr54zz%#޲u*Y ݹ .yf[*jVaIDw?(8̮݋$;x8rUT nkvPcA鶕)]3+*iuSe^AfI5O)-e⩧ '}EuN8-ǖ}qL` MirAXKsy8edOq@A bC`UݞS64R~ݤ'w4S5石pP-S n>S ݷ-U@{ݼ |@bz]༘sR(mQచX\iVvEfm<9] 7twZ\JB0 M. YY>Yݠ蓪yLv2b?v7V6HT.eHd//Ug حWӜ5ɗs|PZ:n L ƵoW&c7u"j r,T+VAWRU YPJaR܀{cf=ٶ^,4bY-A!vՕ*&.r`)h,aݓeς_[QIvEP(f;S ak@n}\ TYH1E)O?Л24n}EZ)L" y3:㒝K/öɬf-׻1tP5Q|'4 "%X^LF0K/2}94tFMG)-Wz6|sDxLC!MTCt]Qܜxk4tAxț=8r0vt;i0=JOm6,Y 5*RUȑ'ݝsQkbb'ou\v>gA+>D8r<`}I fv}-)^ xjb"_ F4t:2Rh"c. b㰓(BؖGqNW4> wWMgyq6/;K/ғRG̑R3hĢ1Ng\/5 mk!!U 6Y2U@:1,˪ι2cխ=xi~ʕ1>1>v3BmՃT=l!4y{ϗö%{Q^}@[fISϵA8)-OO;7ԲT .CyT*O#gn]5Tuy 8$-V 7]N~ETӄ㚑[ m𔪨"6h!2XhW 18:}fd*?^Kr;YbgYvTIV,F ܃q;D)# gjG e#ɹgT,1# !43vOJ)?8t;L9_Y{G33Ե%navit-0.5.0+dfsg.1/navit/xpm/country_AF.svgz000066400000000000000000001320201264204753600206330ustar00rootroot00000000000000'zHcountry_AF.svg\]o[7}U_Z>&7xsS}o$;q,CR긿y$GIۓb0>!? y^ݛ/|qy2daVlr/?ux =zO|zw }7~^_]__wMoߏꗳoF&t:MOWobyv4/oՑx|m~=-tݦݖT6##G"hq\O^ 1϶->٦yWzr>? M7[v^35UrfLdmb2*|v2ƲBNsx0\LߪFP5kfߓ݌6mϧoWӽr'^L8_N^O.ϩMfΉ>>_:~-GOOW|RW_!}|dvef'κAzq5 Tv7;b^[Nа;_ƣ*7uzzzP/n/S6^a6X|qDY_SIfϯ>oވ}zq}59^Ofbѯśw9m$y<}b{oN%w9 K6Sw37%xx1/o0=́d=~Wi/[X*ar.0c+W~8=PNǎۋb6&.W6۫uLڴ51΅XV>d:+;礔:* >z$RʧZvuz&׵7@N$e41V!KlRq4I&*-Ǣ$6](Yhê?m2);b @T{"Nƒ&t)(v[mLҤNJNpƒ툒 lEOWY; WrvdɅ4fr9՛|=_^D (cl$x`"QLg::c h&\cT:zBaz5θrHN-8>~~ٶPⷀe.9`Ulu8/$RM+JIQ9{S%&KPVJQy XA`wjo]j!YU;Ռ@Ơ E-xTqBP}WBc.$`ik:p:E,xafت5&~{. +=0xSnhi_Ȳ?yMT  ?s}4h-ϩ\ T,cK;h4 3W-ꄍ:mJ:E)(VJH䖤I:#&aը 6Z6")2 ЊG8B((QU BC[k)p $B`D́:/C ˔ ^_bw`#ͼj(戔qh&bͭE7dn43-/O/~DppN0rqV4 #Alg 0q)~XT W# #DhS4%-4C$`}g¿Sñ@)tl&AG4xq3m*-0Hi-c@\tKFVV *AuIW)`Uy\[׉=hp6X";g8 PiHcĜQ{.y6tFU {>|DڋrcoBmaJDv!9{^uRtvjzs7>WUo53KRE,64n/Mn~"`;-xjY ؂Ҷ -o9;FD/Qб1 DŽ~^:kV7lGZׂ||vF; %xA6bʈ'i myZб1-(jAV ؂-8e҆;zbƑTA͹2ZծU)jНvƪr`DU7s4:8i й4f?3?Ȍ4U{ tlXh )jSf&3J#6c„ܫ/ԭmRS5j9*= tzTAiTAgZg-16*8$`Ho:؈ 8( >2H YDAyi49ZF[# 3gsa)Zxnc;r zK8fXT2½&Y{ JM<6o#忄 3cCAA'7,phм|7<{1l)m-'B\Fy/a0YWa":x`ڏ^N.W囓zy;[ @'AW.Ta8F`-ؑ_u?8o_ n.%uGUjR r[ ,;F`[-ŗ #`wIIj Q1OvFĤ<X-4yDCZ(K*pcL:Rk8 բF)r1kr}N5n]ʱuO[ekx P٫ɛ30H5|%Sܕmx TP %HWt\ozkx h*Ih(eSjXmx- 77 -i!R f(B6 /^@٤}Uo4mGaj@bx6(^5}(TI!p @ }eY UDjebZp+O׉,5AGԻ [-;NpGzvѐ^LKyf1!R3FXmOj)O}&2ۏ|ǻwbC-|]GbS`>R+nb&@>N=@Dtp/5~ /B+ ˄^SgKv#ĔQGm-5=$klHO y|vw~@J:c`9RRBn~xVw\Ys/Y=_7hZx0R_{ T0X~0w=I ޿Sؠ~JnMl,7MyXl5Ǫ _*uB k]=mw-WL@peN6Y`"u+"9ۉv$ފ3(FV1r}GcׁPƜC]k7HT{',c].s*Gp:TdDc5*|6xqWKmaG 煅7-0 f$oSc.R2. ۈ)f]iC2sgCofIo,wӥ6#zVٔjcn;`lIN9 uiit45Ü構+c] `-OBDȊ0h$2{__i$Jxy>' 箲ӾL벖W\7׍;(b?b.KfwF+.J0oBΗ.XVO7*EȺz$AhkbW90YcP0rW;$ U7oSĚ lms$0)=Dd&7|cT j>)H;dPNﺚ1:lnM;mw9R~Ke3a[5^kH~^Vo$O;j!nДA*1@v"Rl{o>2tC OȿZ:5!\WT p$JK'҅$=<@41? M&[,=pyܗQ`&.(q-VwPIeZiwB(g&S79@04disqFVl7Kc(쓩Vҭff6^рI@/U\P^d_(;-)a\:`Ж0}F4mMӔGi,ƕK: ?ba\2iSTbp_JHҼ (C5O/NRQFF!1~IjzX猂u,9xԹ-/MKue2MEcBS 2 ÞèE{|Rżu6AiRH;k=b=Y^>,bN~;FTc-e BOe*栂gDp:yj]~a:uv5FG18v߽PDA{0 ;>传}(8'o ]r4Y}blOm7JD('o{apN$f E֩$N [ vŜTtUdB̈́ nmt1Ɣްm'JA7 Gzs/"!X2hJj^ q\+Wka T.;,Ζ-HBl ] /dTj>%+, 779؜{NzX#e[WUQcGg.f{$@,tF\9lgE_2f^.gFkbsʞ.;lT۬W1T\]sYJ3&1t,ϲ;ܚaRDJ(C*;+z0*n ے@q; c's'0RI7!M8|yډ_>%uySn)O:3~̨{%3 f]o|j-Xr.rb̬'c&`X u[M Ē׭"$&Mk徉!S73O)\>#amv%/ 6-K$3ՒjI>nT=P[K&ژoݳ ޶ yGsJJT3:,QcA5<#^^)¨Pf?MڤM'-#<[^L'WIOw\Nwn1p]Oi_c}ocLx.'vV|z?|PrO>ζJV脘{v'>bjlaZ[J;foeCؖ3g bn>>íp \[qŮKśf poXϱ?Vm}N~ 2Vs3K|և&fpj`YL's;|yZN~ذ(װH :'uJB-үj7)X: ؃X=p,/\k(YdYƃ[9ՠ퉅k7ps7+F=U}uionKH%xjyV+6YU^Wj=tڋDsmNu tZNU:AMK4|{ϺSGx DRj郛|<_EqcSGXj˟ WνGFCe}).:ʻR[qs8԰Gέ Yuv+|g$> (tYßnM>Bpve¶]==c-P=o繘L|Wh-wd 7 vg;L@eb I.A2zݏ*^C-pVSXpggg6?*w懟z~X8)1v=̅4 GgY@n3AZĩ\m|!KV/|8zkMqE"ȝ=( *&Q#h8vNc@:lw ONYhy<Œ>u>ɅOnr+O rٻ49}Ton8Dь%vD: F+`hZ3zkjޖr,Z=Fu<\=]qlIJFmJCkCB,rnF iBAq.1苚&wiKk$m1gGŰ p돿yؑ磔*B}(\B TXM7oSſr6uH!{BI Z6 kO=4܄j'WP͇j>T|Q5?*?~Ay)1>aR} Ҵ^>llFTߢ۟Jփf̪ȓ:׌\leRP˪QbnbAиДh}ИkTx|"_Γo+K-o|Ʃk3AbtY}ͤJyL ڃAsHH>FF==}S`s|1\@=V.j}[nWNm[@%(l[0n DŽ( NM,,y1-FQ|1c#XbqWFa!mG )a71Iȵƚn®7+ϏFU5$m0xq^,Qsbz^PZwE̾mzhW[ wfV+@kMy}ENސP1v?A:@nqb]zA=O{/Ws_ƴ-D@ZZC .~y4)bTF8\,ny4.A>o2;V;M{ Db HJ=V׺NcڤpE`6lƂΏ3oċʤVZY =Zl&<Z7ۦ4PC{-8K@i2~w|=`t پ+8*JB۾m6[u`g3C3Q&v]G{–3x8K|2Qj~vq_!st!Itcj"F3h uX :Ũ#so|gx}N|WHW~!ϵGqӯSoԻ n(D>G6}Ի0}PbH#xh>#:1_Iprp@k 6D>]֌ZvF9ZvF=vD;(ZvFc7m|mz@R)mmnfk]<E邍gK"Y3gIp]1>/'.f@"ܬ!q.2VY}Krj$;\vq1.1AJdLOB5d,>wy]@ͮAq1.-{kqsa sֺbx Sbx%cx%8}5{8}-&#awOto&͎.%m^ YU 6J~lM}!/8pX.X f-mலGͮ*Dt{$R̚|aЮ<ʼM:gإ܁)G-P֗#h&QKPS(EN[cXWp%Ⱥ>(/KO.(gR93[n@F沕s&o[C"P)wzpZ9vwj÷7H-~+,YEc \mF5i9sp PVX(a-Hg2uh#~kQ0)7<,+ IUW)3+er1.0]Y.t/~ڞ\Yt|G=GZX@fCKqk|"K~ݜb]@r$Kl:*6bp:7,v`pGsv_^}wjXQ5ܠib=GrVN̗c~.,Ԑsֵitg!Ϻů{lpLUS/ Ue}YW_r7{iK)XuBEXV]F2-  $d3Gm3 m#`_fwTYvgRрD,տhca)facV u &; %#F?|jO~ZlI 2e-7ޑU$Yr՜WX`3>`ikC,bȮ?c)θG8%ufnQRn7Uˁt ]eIwh^gIwg^mܩwg^iiwg^k܉wg^e)wg^o<]kܩw*{C{u 2szW\K˹}\g兟pUj  thXm! ML?I"CԎ;F] z wo ap1<*&8v7Xon rv3~7Ln $fKX)ߠx'_bcxһ!a(e3=oVP};{48ۥY/dw#HZ`.:2GR<12g͙IQpÆn~F*39f.h G{p5窣w_̳@Aܡ\Qux@oi@Esi ho1aK's#Rh]ex3v zeIG& p7WNC['m 8p&!j-R ^M4;JL*~wݡ PRlh% 3h,&LEA&j>apG%Ҩs~VWvE VD=(4 ؆Kq$\8&(4sb]+>ٻ/-2s3i^DE2 ~Wp_r<XZ1X0ouL,(ωңQ2H-}!3@@F@um `?3;~%أ%VV\Yk%oq$/ Co/"Zz_M[?5:j"/QRN:Ow6` IhJۉˆ4`<6ni3FnR@ x4.)v`jӱwt:yw&kL~g<\u0#JNK#M>:W_{MH&@e-1Ou\^> .{={/&OO^)vIwt_:j/uƉtV9RW]29it+IKQIOnhd N Zͽ>ә PU޴[SJȢ%Ho Y[!8ayv((_P0vTʸ}2_c8d )q,]k;7qIK1kNxG҇'% jWߎNd⿛,1p'$䐏,?wWJEso t|Uֻ{%bQqѕ!~0/ zKDrUWݧC\N%Z'FӅ"ТZPЄ7  Md 4Ge5.lE,;4> 'O! 2~fuH G Sa..XjgYP&3Hc=>*nZ~U d́R/ۿYE(fJ2ga"G3@*6lDMNn3셀EӂpE"@芢Hi_DLsCѹFbq[JEv܆h1E@ at ry!B~VMj$gt'֩&y(P)ĶŖO9%ݑi@ҡUjw0{tAhd13֊mW0az5#`:]k+ fVt} 7tn-;>pVღb]iMp ^iHGƎsb'X:ӱ#BłCi/َG8i@9(cNȤ vbKuIrqlH#a= 2փ/w苛h?֦<RNUQVtHh^! #[>Wx':ǹ|?C7Zl<Qfv0aDFq;ldGJt>t#Wu핺=/X+s$ҲʘsQyjeNJ Vؐ/ T]%AshQѹKkՙY'?c,-_UM$l! O锏x ٖt#1+v~%] EѨwCSPhVJ݋X= ୔l*; lp'B>ȯjЦ.)퍝"vΈmc)7'ZYR5;"eͤG1. #&񃞘6D\ ۇm:dCs2ZUUe,)9@&řt{QCytHpe92ŧ 4mcUxkpԃu(W:vW:ubzGmzN8J}|)VO-}]Iwx.Pֺs DB<gdevY<'K /|o2@sIŏ/]ï6䔵֋yO{V)`|x^HZSmy!2ڮ>>~K`J~p+G cƒ,XіI]M1\"mHsߧi hYeg>[ c[gԾp3nlyNJ[yGg2)s*Ƙq)L M=pb|ª+VwϱK;秮/nqRG s7^!Tĭӻh;sΤ^uH6S,>ɭEQ)k=zMKZ̤m`㶕q%cW[qٗg ր.y};J$]Mkۦ\)-΢֭X/أ-秭Kˮ MCO!pV_ܴ#-%̲e+2_{JVlj‚IQЩҤnMv%/Ҏz1.ig&mY@"'W\-Ot߸yhv>hw_\߭2ʷ՜g:ONe4B3ߢߘĭL~LA-_Lwse],VuNp++7E WL}-qG;:둸90 m}%m k)o[=y/+~x O;_A̟7;y_rQ{6]y+@7&y'+?ziMNyz':N_;6'r{z{:.ZЅC"Q7UVZR̈j˭.'ti]q>S> &%+N*`:c*8YU؏geEjfޤBBf61Fk|]/%0#Jޟ5fFw9V¸ yd3Rƕ`]]u1.}A7*n~9lZ\שHkZ*n^w4#gKgy_J6i #d1rYpKf@CaL׷c(J~jb&+[sQR[P=5ʻ3̓KiuԜtj|OݿSԽ吚SᘚxՠSw^o3^o8Ws7X~/>PTb7Q}1fa ށE=p{"tLQm|o"Qf\_ # XаyfKGi՜ Zºje -'D8XڄZ@l`o^o2 hr?dKIA[n#B@ Pե Dι9|[%;XY݃#;U U0Ϗ"˲|G=78h;`~û v`~u3#ȯ7|5}^c T#`ԊN*Wrb}wuAݗQ9(){Zzjb,iݚehI荘i$ͤu3h}C0?/jjy'=Kۀ+6\J$S¶BEs=P]XV E `ǯ 7wq 7,t]5y`̩eŒEKRБRl5u_mw0ͤءy1~%V=QKjq[8n9q=慗!~ $Idv°V[dENIL>Zӈo|T}Op02Kt PFzi@ߨAN|ב#)> I9嚥ܯ?xRzN)[hYGLv_)| bT;A|8bEY| 0bEq| (b"i!5:5 }Nsfz48}zqVĿa3k8:! | ]ZCBu)+Dhq>mkAw<נj 55ٓ5w'TeNVdSI`1/'oI Fh @ Qu/ٷ?oPeL8M5ߍH].z"^gB][PX*EښeѺr?Fl㝍x~q_U۵KW5WV<^_VSAHpyFtW^'j|{vSO)1TPٱ9O~\XR:,W^b3#ȲT7h-WV" "vh|n^5yp .`K!i k"'a$y .ށcp:w}}?Iϙ Ga5]1?,E\+qOe/Ts:D꺕Wa< _HuZ9#C^ڬ~])8&@;36TFc4G]O2K-W "5xsf3l+^8"g{YM;Pf+RWU:Ft:i"p7XVJ*C5}) l_Jv $TeD}03P] j;i`7cZsp9}1y?:NO-};/MG-K"*kSG/[eb}򾂓a(?&$1?{VV߸7WEJ W." ׶-#9' ϋ[򾔼-|EϩAB!:B@B6]/TJi/ܾn[y{co*: []3IxMiߚV>g45XΟOOpr \5p1f#:;iʜq%!ۧ1la 2UɄ*ԥSR߹:Mqz>>A8ϻT;IbNl&}mNaG &HN8$C=Ǵ,/%pbzOVNmg|˙?x^Cxn5xj=|w#nf~5ߧEͪ oV}o9xӦhY-' aZ *ʀXTL&1+.> :@b6{ ȯ YK˴9p6q7t9{YG2ZQ޲`8S9R 4Vy_J^f|R}J)&%+9L&dA\'6֫g Lw7u1.yqR!׽]ue+uyKdNT +P=vɻ򾘼h:Zu zA"&TfHT.ol cg8y)%qR[5x %lgB/GPr(5CetK +D犜Ea1;b+Da㳦gl_IߜxP py:| &V?Ki_\ett[buc\U17[/Bgִ,8iL`'7tNی.H>,z&]wkrldi)$g}{c8a7)#ȍ Kq A&LLu6-[S:tnhݞ'uF?JМ1N2Ek"%ÄذO;@bMD$/:́-!3'GtjBZY"m +vy ~= eR\B-f u.W[JQm'a 4h)"8F͵\yzoIU6x7 nt5IRYؙ{b=j 3Y|,]b93Ie$3lה l^@^ u 5,4j9OxOeё?՜~#<t{$=oL2;nPґ@x\ m?P ?w2v٫9b_]ّ'mٕb_AԾ?KvveҋORX꾐u tė7<[ק.&B2꺘`'*BοSs( Bds6ITbjͻՖp!U2\B:OK ;he0Tv\V WlI&_E3` j3C#!iKbsS]zd5D"~CͲG'θ긘bxvhiAī1ضmYSSBq2v1.-žʵ][LRkvUN~3Nq5NyPXNu㕘N {cطOnֻx])Nf%})t4Wyoe6o~IZ\k?훠(Y#ʷEE5+&)/ڗt`m^LKvP3wxG7PύF6EX]MZ%l'+x/@i-۲NoYZ b]vf+ysXn@h5tF AMvrE#3b 7T+mY^NiTm5UhW;p,Rs:2昢 ExQ?1/إ<[o8՗nzYGKqp'he(j@yO[FStؼax~25]j}%JopSjv#K\2 ˕vJN~ZՆd2[2褳tt]mɗ]k ЩW]kЩwDZ^'XV4Vg@ >0B ̊@w}|jCmaEqKx:iݹO=Ex~@GHǼXp&ZWqP@>8JWFz#CfL_!5߄-\ZBS_䛏CU Lٽ.H0֊]{ ں&NvN'6u!:i4\N~dX>UuiumU3eaݹd@9N0tNN]ʹ6._?X czXwPr:w屟+S%~Hٷﱳg> I֝d={nNd\3;a##c~G؀=5ߛ:@jEhbqJ WE~c~żkLY35 V a6 ƕ(>((M9seE3U++tw 4w'[X۸c#+%_r]N?ѿcb%0V:Û4vW{iѮ&r/1Wf0 q:A|Y0ϖ%XPc(S{~3"(JKMO`攚E._; l;wFV-ŕ.3s) tru񼚌rC nx'͆?'Zɦ]H8qf\r"^;OF(;dj'Mг (4gӊ ?qW@aN*iWxi=E]H*[w :L<|^W2hR|=`7-0${X ]Ϻ>7W|bp#Hx`uHG;?_{.5z4Mtu ^r1;3H7/{>=ɘaAN lzD. p&1KMh 4-~#)&_/=$bD$|N9dh(C8ERs}@ r wB f Fb$9[ֹjA ~[E [ L u =_Ԯ$ w0#ݵڧ1#29|8E {z >vH֫dwo(bb1d (M.,k i_jDo+H)HNXFc~'&C܍HY/ic#`r''nqIʻ]Vҩ J߷vHF3aM.3ǚ5ֳK1ӧ$ZDrGJԵ?;vy!NkI1S+ Rj)yrޖpW+KCu>t1f$uQ9Z麶s49g'7,Czڜ 8(Yb\&K~wuF_ d[ᨹ{5뾒Rpŝ86Z ׹G+i}S]b WdK2K]Me3Z[D)-[< P i+ցDs%{GzcE]bYCty>:pcf oRYE['3'0N9v U,,B ZP'Ѡ 5ivN-(XYX>\\pEluՅ,)Vuʧn$llXTg{}ጿ3nTrQCsLZAln[$>( ,T_/Fgst%jsQ6*oF:3q:8{iMr[ԐCm(צOESֈǧc??yK#cJD8hZQ?%qvWL+~nq-~Op#'RWC{S:3n\f'D~qlN#zcC; Jb?Mߕ!|~ ~Hk9îx _*jؚnd#KZԆ-|»g.~h 1_.raeCQѫw_h0ueNsiiJ-fѶܙ<KSهCV,b}NE Esħj+F3l~Ud_ s_{8)цxn5Ԅ(~dJnDIБ/b# 56s5c\Ch+N. ,=Gy-h]a;ɸsl5IF`ru%^5VcA$ ^y- !åH^+2lnpx3~a$/L D4k9ݣ&$JQ|$ 26ы;د/KMDT+RvsI"1ឞƜe2fėbg]oNp7Ι[ۭ̑ywr-Y !m(+YRZJ'dwA2p:܂pZt Q֜a'C |3nJvtHQDŮuO"ҝT?'YafӁ8'M8999k6BJD@^|!GohBTwD8WaX$/9gO.1&QV:;2:7Y9)sX/_g(rC#ܼ_ MA'^B=0$$l~ ӿʗVFKw Y0u'<*id̺z (+jiC5"!#^w0ŕd+u^ '?bJ6=wDlgXs{|Vj+QFx_5`ahɳY?%ޚ+UQW{!g zO{oLc%VIMk?:,RSt$yKZzi΢r66NY%5W싼E{|D!/HʫN a !?{J\[ȝn-@+W*?m<5տ`Ơm=eA|vM"I9EWK*Az>QTςMUjd"ExE*WumlE 쨤9nȩ}7ۭϭβpbdFGU{^r^hc9/~]WWw2NydFwZ^},وxn]T  2(əC^aB`A ܙA{<~tNhsN`T.:HĦZFQ/f2i¾uR㊢H}o;]㩛zo4\(tho4 X$$<j88AMU\ttrsvf, ;=ByB ލa]ܠl\\Erb"{TG0:T0 &3ڷRg W6gO؇-ufw\?W?Pk˫;xu_gt:.ơ.>d ibpCFevh¦OUz Fv3G]Ql2 。652@s4Ncbh>Ҭ+%ԟpc`ږ-BB+T .(|gOH(5T5âP8V3U} ˊ˯)c~IKveX'AEIn,DM~H*dCee&^:#}BZ͌[;1NZKhP;{DhOE]gd]|mj]O/ToMzجQh =Aik Z`rզK16VA-Ǹ* tBf^%>)N%,Fk,˭'ƒ@`YGQzu(Gri5H0#( }M (T7 *IQ\T<XͨUpn8Y+1WL#^m\aϓ΍ypS{KJQKڱ&^0O ͛b#!8s ͹uh̓3 Y>F-7ssu2Ynh>6*<)Pkя%d VK,ڥ-ʱ>kE|lwgo>Z͘P}i8wgZPuWriA.Xߚ\…vPi(_CnmH]$h Ur 77Hd<95-Tڏ%LQ67dk]juo#(!޾YirqNލcX%]:2"`]q;|/Ȅuzp~Og#Eۧ7j1ԁnOָY<@QYiMͰ ]Xq:9FBDcde#,΄Iur('5;ǭiZц lR{^ v]YcW3# C9AQ*Lf^S@T$3x" }1zft#+ K ,r ajUq|=,rܟHРHlD33,9+!@Zy;HuofE[Iqc173ʭL\-Љt ˙wY{n~{]i u`duljQFªnLQ"cHb/*)]-AvCHcq]LBZfέ{5MFr3h(pv#&;ܣvK+3ګ9F3齹{r+Րaʴ0~6AvSv0.Moȍ}ߝ{o -w-{v5bt +.cm*4ڔb6vr۵7<tFⱹuYK 1^ɽy;G~|0mQkOӐfli^1{i~{+^|?=#d,W 97@/NPWGૉv!!c=*AI (dLr kbY{1:M}FG[2'WGo&18jv9ngL</@]tcɶg֒ ʾ6B%>%fz I_ xo9BVC #~4+IAup._hթ=RSD ?Ic P-d8AFSPx4~evBOGZH Y10o-{p]M}]fQ6-"$QKM} <}6fZ80']Idꚁ[m`8O(a j2_q琍)p=ZE;r] Ԇ@| >r;ӂVZZPtYO-i>GcۭK; Sc Tlj3-*'QgБegAϛGSz86~шgVԍ| [j)eR|AD ~qngs[g`]mCY2t[vM9 ]!O+7FL#=bI E^+5٩}X8ØSplxpPܐp`!Kqʾh&u=Ms&+2A2$z' vNH3[Q< 2vL6zM!FC#Q 7 љh *nh Oؘ4T {CkNx*4y JfhYz efqLV m vSnTx)*sa1l;g=[%E1F/1j88# Dz#\GƌOj曷pVSdAL\#ЀJ30wnو@Bvh-n$(1 5(44Vٕ+Zz^ǙWhb֊?pp!f6"A_նd5OK8an k8+IG]#6zH+QhG Xn;6I뽊o{%~g^: 󺄉 w`%)Jq 5>]Kh#)w=;Uo@tRx#=UY2\Q*E]{g$~M!hG/YhMA4O-c9@i rJ*_GVD.\Ws8+7$rtX3M3gb⪦r휲P:Rh3$U=ΰ7j@AcWVX #'5ǜ5j ΩDCs4>gtF-$[3o1" 3C/2al$'(IkޚhH#~eMyoin[h:R[c2,rr] A]q'[b`Tt9vg Y=D# u #e$:8ǠS4p̅DQSNXE`eڭ ~ƚQ׳\drCRpI]Dt(A(NA 1ZG=y\H4枛vCH.-֑%f{ ̛SxAp 끉E.߂T׌z5T#C06梮E !|6 D9!]Rݩ|PԳ3]d9U#isw}(ocd Y$u%w~e} mѤ3%P}qcT[+Z׊E3sRQp2E}[;,p*}xtP>aW*GJKY.{87CFev#x@b2K®q2 Zyplбo= 5uɏ#a]?ք1Xr~%ðʨgxμæ̷H*5k]|@ lqcxkhcCA_ƼK=no:v'( jZ(fC$8i!4] m,tXj, 2J8lY٧2EIoZe+}ؚ\C:R]1O8gk+bc\'5gx4ߥ]`]9>2 EjT2ܯ d2ʂ@},CwQؐdR=6)s[T04RU*5-1JсRsg:צm`!Ʌ, rbQh^(/`;=6{#<,'378\Iϕ9!g@h'Ʋ8`1>tMd5q2܃x_+W'hU^mC tusXǾdȡ5pEC`:|(b5FWt(ƣzmqFc kh3z ^ 'qx:|fҊ?J|1:(0rn6*;/SАqʹ 7}Cqѱ3y֥h/aɹRQM,P2mנvssr];wn͙Wvͨ(8e`"N[Ys}ު|G°p_G1j[N]@[naqFlD |4ns*IG%)&Lox1x[Q8,Cf <Y;`b!Yq.SKdj vʲ25DF/tf<ʙ ))\l,\T5()kPn'z|sBJ]OoIO.e4r( ݥƹPZTuR,h; 4wIGQwjJ>f$s| dIkCUP)"qpk vJhZs:E[CT\9R@`Nmw{K}@x`lQ<;8jLIpFɽL:wOm47j䖮UԇI83˛6JUeVJLa"_(WK=PM3Ŕ2?N cHPyGW)$Mn;QSФBOhU;0%Fe6Qӓhv, [,RZ,N i#WNP?P1T ]e#ieK5-5QRU]h2ct0 $O,$auܠdNRFW &|jp֕NaV`ShiU؈`ag7_}ݜ!$F2E"ƙUV_-&" 1/Н(3=p͔Q9Bt+L0J;}0nH;+14NjnmwEM8R[÷W ;/StlD39XAbyG҇ñ4yd9{QʎyQ^a{{͒72lbpwB-)N@OLZQ0 gp(;rg42!T.0Φ@Sȴ5ֳ 1 miF@&E'((("Q4аERdw!^:Kea} ; 5RP6iMwk5, &&y,D2zΆs#qjQ^9t`>A9wH:HQaL1.^PSβ!ox45$r5XRܒ0CD[.`a' 7c<7h32Qu'npau%42kK^Aw׌YH%|+VC ^B6` X! ja$qzGgrFwEl)!$=2ltw!-[Sdrv y.Z<-X|._ hw@RT3{ a̹I ENo ~q~z" '"} $*glS{w63toNu=ΡGLG Lɽڍ s !hDM⁏T"cʥnQ;ΡҺ9V~y J WIG#؊ōbP9mԓ|Z?7Hx{9b<%Є9US X%'7pΆI=o7 N]ްڴǵq`lP,'hRˮ*I"RÍ 5;-vC4ÄAnB61et@iD-6$n~TyîMSv+ M0r 3 ʌ?Ouͪr vowP;>#۩C\lVN { L:~ȘNR"wIV|*Chq+>td"8!)kWdĥ}>4}r#Nޭ -7b yp,$q[{ӗzm;m+@Do%ij8ȸJ=SGqe1#=j'؝SmYp ,U(*۫P@-8GjNڡvC@!^آ Pu@zg" At1LX68bem4lG!Y[!^?BWwh K5:y#wM<Q*yTby/ZLO>0ω1"))qn7 )I%OJ̫yG0`sH~cSMrأ&ak^ a?bkoR^Gy-|%0z@;S&}2z`zsPvss$X@N="N]!.Gqw B1F2t܊a!BQZ_WT3avy|0G߬'fV8rUz,AϜն결ye TQ"EU1iC Vƺf7nq/]g#ZFعf# U}td>YyYXQQדv6< ge4/{㭶;ln6sSn6<}&m.iUax~DS*.KF䝊PI8@ȢWӶmBfmP,ziM=MTPR7p1)Fh5>3C<7%ZnYKX;XЅ@S`[sE]go R+i9a:jtƐ֖na9n-/;zCxev@ 7p>+C7+TfaDWI 世)k  =[P)TTƊ`T9ts,y8[EڢCk^?2~Fr@.or( ;̱3ǜ̱-Gdn)q+F~uө)bΈWDJ漅aYW:E:(.qh{v z,5FePܷɱ:26)?)8HySc!` d$\֬&iE{MH=3t%3N Rb22:Nq2DUJ-Bd:G ٺ 3܀R*Svo,.a\"Zؘ‚;zP}ޜOt+p\m(Wr̆ȹE]]ub9W8`búr.F:q[ ʊΧfY}fflyS7|<FuTqE/ vr]96Jԙ1.93\~轈mz:k:o2M:~c]ǝ;Gu:~=]ǝw:~t]ucʀmuŝo9Sf,]ǟ:Zst;o[;]*>>}y[oh_tj(=$#x4wUjK!_'Cb ![MVoq濮I`^7Y=rIqطx] ˧ZHX9@hsQ5HG7BJX>5@F G_ZvW sۙV('nU IJR v.&Cs!ȄSʎ 8`SjJs0Ҡ SK! `,^1n^_N 2!}l_h ɏ΂$JC,$7O1xܨvXTK Ea8PMHN%HN! gIhV% ;(GTIJيlRү&E!\nL+v;vEF%DbJ=|{yw3G9*CB.ۙGJY >4:;Q%tD ɀL]B88,76()um&TeWwص3a 4VV@:Tt|ږK3 ڑK(%7[ `rW"Wp#7T$/s8ɃhZ2Oė/#! Yʹj]~`O GR3o"'2;gFeᕾO6'd{4Z`OP[0\5mŻSWJ$dlsMwT"WYܽ5'zq@wE To,톄b<)17Y6@P45i`%1k$RIVN, mHk3vSߥ= -l 7|ɘ3TAb~ z8OZ '$\bLW*3b2ߺŝ]grGi^@g65g/Pi_'_yzPD$_ ?/)}}7olqOyK/_ۤ_o?4|_o~9>/O/Mn~/Joz>?|ǟ?o~۟/ϧ;?~uo'|߅7}[#y~+4`H??w?=xw?`sF_~?˿__޳ɏg6WyK<۟旿x< pK~w}7_~?<. ˣ黟 ~WCӃ7on_W0ɷ,lo~? y.1~;{富'w?rV?~_-d7~?}Gw?}?\ﰲ?=9$BelJ2e]ѿ͏??pnDmϘڈwZ-=;8Ll]i+^ۅ`-?#'P[~C9Z>nߏ~u-M!Syrj)M9ZYM^xs7Mԣcn#1wWҭrt8Ujb3ENp_17ꢹ5IO#ê0.qvvF7?}͏<t_~o},7?pv~Ϳϟ?}˟._wEn؎? 3훿}+Ç?'tpJ `ਝ'MFNɩf=ӽ} U"|Ed47o(&G`K@4hNp0:Ljf(GX@E~4kv磀q 9Ph1"a NS(Z/DdϩQX'gz6ipԿخ`rAJ9P6KTXEKIX!A-LpDħ"МOU( 9P3#>a8q8$rs# fÀ'1GU63ZwhNeCC%·_(˅CN)"<ޒC2"ځ u1B61k(ѯc/dBį^5v32HX:yu! $l CEfLZ, *by Ghk%)SvHW8+9QR'e\9a^%g\5ȡ!S %P.}0"a?R(͠Ol1 P#!N-=\cИ%""&Jk0 |tp clwߏΡh]՗^Dd M2U&& [MU,M$X]pıim ,-G P1!;%lrqؔZ/ס1 ķ0lq![dxsAr!F,ڙt<2o,O [,wAm?hez!olP^-khk} a+֭7BUX3[h@#0bZMq%fZ眏9 0sEC`KN@blw~L aŽ>;>hi١-^h\ '$؀@~R XܞA1;E; dF s8ҁYkuXWT=vPkQp`YJڨFonlgcUҩUt*%(ށtt ] =b[TMk0s-7CY$Z4`5hX}N'Ͱ3'B# M4Ė:M-_ Pep)j H_,d|Hک QJ]q?NS 嘇`h=he%0H/ʙ*kOLƻ mԿUJ"uRaYfOdC.r\bKykKߋ R0.V7"@tA?D|QHѿ#W~\JQ#(+01a8w8B_$C'$c9J_N&4G#4='(ietS5s4!KcŭoALm! hLeRʾ>3!ep*#-,++2bXyFVIv]#.yZpKe,Dԓ>,!Ϟ@l;9ڍ6 491+'̌`WlhϺ0u&IUAMO lFk~bNN];߈,Ņc\m^"am6v+]fA* ſV/Bj $|gG )vj^Zj}5֪,7^D@bX$i胋3цzĎEhCUW`+`?Ld&,l`r,ސ ]ZnחBLHmcJqt_M, )@F z.JrxālHD3Ye@чk(!42l3[#N6|~чZf!r4:; dڵV+*V_t@tŘ{bSo]dp!\ \.h¾$&#p+YUa0k+ۤ$2% W)`"3?ZdPXih׺M M0mRC4X.ۦ5߆nm-f e6u CcsTnN8XHx%ȕ551t]Km/×DS SZK4(L鬼vf+G[uw90ZRP}1Y穤GZ5Jod`D1fV$e ;;.n&)ǵEц.ȅ[6"^O6BjB..UUQC'Ni# EC^&F-,%pQ>gJCGL_VagE˨ \Ȧ5Qb69j5ı!M*P ]0_ڟKj#  )Q,QGZ؂ 2Iei]tbuEa_.m82p[_jÑS,!*4npZnTC65qh"UBxh` 7SMڽԢgI+$){: t$>憶͠a9X^x.ܲV}_f# {a6md"SG 9][֍.z>"줞jq3_c.{x,8`4Fvl mH& qRr3c=kcw[͞=c])1+;z^XR8YZ  ѣFBYNS5ef9IP?NꭄYq@wMq&n|`7!afШV+I/ f[FO8#p{^/1xFyERÙ 'YZ\|FնoRWD Sjib-7|ΉT-7,$>|A|{Ȇni2t`lrQuPnO?/JcRNc޶"܉]bH5$kҰ(ѿa=ؑbxn{XwŞ2}? 2C'+; KavبK*M nRe)P<rg3|ȹRaEG;;,$Elہ,.YVrdOZ5c%lCq){k!ۮe5hUL׻+'_[ HӺm@NA*7)Ho j1'ęy}!8Q{]I.[-y =}:nwۺ]<1X1l:yhɭDչѯqai64iSEmWP,CPYLQүbe"o<-iOPF|l`bK,S iJb'B99pbQ8z`tẇLSW&'Qк?iۿK>?+Z5c\ u><7儢;nq &/z穘EnhZ$6̼[sʪr)J-Yd_$ $E6}E.Dݙ#L-a»i{2EOCgۤ+9m_Nk\hé;Έ%3̽/( <`pY[5P=: C$1TchbNz"&.,fleZs: ʵGs:0|3"HX:fhrSA4f3a 98Ty_.ЍEoٝ5k;ⵢyɝFC= -XMWևB8+)g%.tFuܯ4BR(]a.4"%wUE NrĥEftHc S:29,`O g @#0!t%Qp8:u@[.y/U~ӈ/QwP* ,` C!d /e_hPJSU/f\l]"voaغ!bL:qc@Z?/u uޞ q{xXd(JckM0NQ*hLZqs~PӉl,N{,ہ6dn~H>ȚwC]"FI؃vlZ 6q3g":߬W>Z&NO`՘T&^8C!-n)+H 4w!7 bJ?do,h;"K?j{;}&W %1navit-0.5.0+dfsg.1/navit/xpm/country_AG.svgz000066400000000000000000000011451264204753600206370ustar00rootroot00000000000000'zHcountry_AG.svgmo0_7RU% Jդ= nːĪO?; :u;w;%ov,/x&D](LwnͿΖ?wPX+WJ4@>' PTᎳr FN.|ŕ`{&T<نaơK,R96}r=4>(1Ak\)W 1m%l[GZ!C/ uAK5o,V9e"X@'>Ef'a돽Q5"7ib+ҺhѪFXEI5̶:)Ճ<:˟TEXz](PNtcf6bX{Q&T3&$E4Kvb 6κgz` W~l<8S9ԦzF90Mss.sZuzn6yF?9֥tfxnavit-0.5.0+dfsg.1/navit/xpm/country_AI.svgz000066400000000000000000000036401264204753600206430ustar00rootroot00000000000000'zHcountry_AI.svgWo7 a]qv4]/)!p[*b{]Hy͐zfWͲڴͰro7f؝/ze_5kMÛz;4_.M(UMޝ5/'x{ڴj՟.޿Gm^/[}vwx;Z6.0f8\//85fωZ?f a[Xkf|3w;nyq^m~n-,|,J)"na~ቲYm>oW+`Naqz;'[iL= OA}:ml.fmn~X׻a?n" M=?`7j^5J:y v|u6C)u !hS#WN)w9ig Fh.{SK( b'6%XMͼcs8F̦9u?kHw[.Țo:Gvx}mt2Y8pG=v:;s J h~r9֩`U6m>^yDrJԬաDeM^bu7]HAxu6Y!kqPrF 3R3 V9uS]Tr?&A +0.OŏxZ0IG>É1ٟ9IiƉC%ҕu)=N-܁\d!Y5ni9ٻ2*p`3=WNDy2.( ΌJP,Q.ê'l:s#+ktvN)DQ:@AGId7c,* 6]ʚ҂*C,UO3&1fc .9isd\@wɒ⒒0ή(qDbd?Q|I{AdJ]@*b Ќt5 Io"x䬀˘HmB 4aXσhhNP0 DRdzYCDUCDʒj% L<ʫ&"b!Es@ !O`PLb@St/'#l *pt0\_s` s]weJԁA-ʩl PS54jw;re"1Էw+"7IpLoW0~dk˺ߺ(1p`D  EoH BeGڥ!.$[ bUM\+##:19d FL<_ 5 H_ .k7Ӈ c/o9ff3>?)O7?=>|/}w͗O=~:m޽T_秧iplWϾ<|ymnW^=s>tL5ikc_}x||~S;iw6w__=՗'M/ǭ(X%Xbi([d1#6>4 |Calu\")YيɆ//e6_z^!I.-ԑAiTz\%̐ l&-jz$YƥY5gK &}\rKC,,duZZ[|pYjmti}uΛJl>|2g]/:oj åfmisñ髤 VScP "2mنJ9n?K?κвJXݥ) ν7]jvQ9..-Ϲn6{FnZ16~^vmx)2L6qehlmq&oN}-5z^B?gsG<3F,zj,՛m?VBV[)GjKZZck2ce56et8*Ҹ Pj?M&c-n^8'(y!' Nh3#kZc 5Ҕs1(3J! g}pf3JsE3ͦl #-Z8%%wbM-S)qle3)8poCVL,< !@ Scw6( #¤xR],q@KJa(),6<9N}ehq-"4T|rK9W@O#E4|v@.&3:Bfk" u,jا6`d1![2ZT6L ]m94ӒcWN.})>/&gKTSXk0#ٍ!.jͮڌu!o(N?jMK؍ĨM;Äq`悗2*R*x"B-o}R ڧȕl6+2 M81 pl!{,ݵMJr'δ)AICv̛(L{c .c,dd]6'8 ̸†s'qrHMxA&]3W #CYډn2͖uO q%{A, NiJ_X:Pgz/(JXzMT" mmiAv*v&g`?|&0QaK M4F`H"DFnf3ZN`ⰭdSlݶb*"8ݸM^Kƹi!-2de@ʤ&$Z'TQ+f# %4bҤ"YM{164]ZUD,Ⱦ$^e$%a^U0̟\WòKÕEnbۂz`>&|RC_:;ĘcDe=I^&t&q f3Y-f_cI6[5b3p Y5%7gPDjCA4gs@{1ng䫐T뢜EGB^`YF!v9њ{G'AwonM6YR`4k_e0B3T$a&TЬL. ma( 5 O4py?%N@y4UY ݂ ֞j6)A4Hg!(;(K8Ću9mG1 9Qx4eP;,gW_#a|ʉ)ճÖ2e6v0d|VH&b8o^Ak[kq޵|xO@T˵"ƈWbpq^]]ߩdV+!Zl[I.VӹpV=65Qd-[:cW/q~qrnj}Ԋ{egu{II}|`烕4uŪ#vۦEI7,SS$%`hݯkYƏ EW+e4JEJgEhLT*KHJ^}RY8IHX<%?4ԗuoL*3sY ٚlGhtv#y>i+عȽ׌]_Qn(kkKo\qE j.t#tju8m&,ow8?=JZb6PϕS䀸ZfvOJ uQ%*VN-WDGRVVkhS qYd[^+bܟ]s $T su`#:a > Iz|]4B=]uE,*lNt(c6s;U#dJI^բI:%q܏Vt㹓FjEExVk~EF2\ @4zV6eoao(d\/BeRcY4YB\7O&(B4uAִYâemOjg,H`RwaL\'n/uhJ*ΰn ?4VLCWZħ0b'ԧdM`ʫwlSdpVNb(NbZDyU1"*IB[ԨNqI5G~4uòxƆ|:n`KF۰nYrE=p ͦ iÌwK g9]yW"}Cm6kZ+ b+jLuW;%&GX#uc3yCsYkWlI R+!]qVV:ii{N,O CB~Q=j7 JjڇʚN59,{4Ro:g8Nb4%M,~SI{X麲8}1勆,gTFe~i $L(ܯ]`mG$\[˕P+f0ԐN6QO 됼 *`cazIwd*~C6]XzżDeQ]u=Eϓ*Gi1<%ɪt7V: zU9BHB}HFU+ˈj+ UB1dԜTnloo Z:LuiF>ʖ !_iTw2nJO|)(ac]x)ZQX%_%  (haEz 8q^%X*6^4/yl7vk*uAX j2΀tadVS0#]>K~ǢL"M2e% +|my?#HQW:|XsmT2Yǡh"Ozݒu4XSxswICo.] ɶ"Y:Y`y=*wC- JI vyeY; XUω~I#!F\I:iɐ̀1d=( fZWMuDĈP$+҂uْX1HjPܓH;fݏk5U)R34P+oP]Xj73.){1qyu+oe}`֏*l/YY-yE)p3i74Yg>ԴwdZ W MZm gOԞá&Q~uI4ڿ\O{qʹ),US[f~[%%#ŨiQUKU/d@(҈-TDWznyurzDMmQJwMk(b V^ty*f/yE 0#+,5"#) kM NGkiWȸ0 Z]C7d3{/߸!1&_ c:*BҶ]Fk};%lw9{Fo+2% r:^+E9?FrgMޱ+O~4|Tvv'fè8R}qꌦV?d*yUei-5/ܯqܺ gssRLx{ wLYC(ϓn69i>hDfvu6,[QNdџFCKkq+CSPT`K|eڙ i<="]YrݘKJ(qϫ7z^Tb= Srfzڹ!eˉ@o-fHS%i; 86(̌ɂ=xԍfw5aNO8%%3^sCi& JӲJ!"\E쇱S9o9^TEEt~EhLr)_+s'F5$DЇ~N+hQ-T{eM끆) vUSڨćI|g#Nb2ߘtFb~wjx.t/;navit-0.5.0+dfsg.1/navit/xpm/country_AN.svgz000066400000000000000000000007561264204753600206550ustar00rootroot00000000000000"(zHcountry_AN.svgn0'f0Dm,E<`&^4>XQMG&ׅj}}ctw?Aw,ϱWRPTIUV&E98*ٿקafjU}ےpJ)TkY$dEZثNQ_)#-bEdGM.W,bHW eՁ]%"EZ,ĴYuhw g{Nu#E|SaӴ*kZ5^>u)P'\uf䆺9jsX\۪{[2s|EJyIw/x1$^9>&e E(&X$18ܧIdFaZ]t{lvto(2Uvnavit-0.5.0+dfsg.1/navit/xpm/country_AO.svgz000066400000000000000000000043301264204753600206460ustar00rootroot00000000000000'zHcountry_AO.svgY]s[ }e^r]b%n'3RIvF&=Եe{I]ROc5K. O{y3[]ϗn|qq4y\wgr1;-}Ov_?im2yѣe׽:Lnnn.W?N9xc xi7Vqsuis3.?_5_{)܌X 5 G{lNmf}s2Q1[~4rLnWp3vG ؄ew4n(OFiLg/UZˏ ]ʯVuVm6Zl 6'M=]!N$­Ly#Vgˣ˳n55{0&b,7*wW@ڋW3"{wHkVp\\wsXRbru eY/lڏ99 ;6mA0cr`"6?h`L ̫r=NvuBY"|B^BiN2 inSEH aV)l) \2h`n1Cs QM]j)-܀ z9L#-}>=#DE`i1#jc14& %ߦ"P&mBik5R$r/d:r>0OKޒZ-Auևfq-v*-#z zA@R`=gCCDeCq  zSl=U*֧Ir,1BTeNyZ&κ!x+}Vl69'> *%섯^wRM3$>Mz?G.y'.LmM'N.*VaNXS0. Hٴ: hE}Bǃrd\xbv(G0()*97d_ꑻv/$;DI G[s[2iʫN#s3E4"c WSy'ICa'0)/x8.RQ>Xޫ:gQ@VDȝt{`hE%,) $h?dMe%RShRInq'^ۘy:;u.7 ά_f!':CD`ȩLz9:zv8OJi%P6߲#|C^|q)y JXC@vlO9{}&?艢X7z*ثF_BjߎڥB[PޖZPIz%^ PmEapζTˠ+-oZC(XPBhk+q W8KBzC[P}lDȵsTBٗ{[p+v}EH%>vmxZՐR# t_,hŸ>OA)Jⅲh(ǑqZx#$+ۀWꃁ0u\L:qQA3Y\]><7Pv-be&Gy>>R7Gg_ Q{~pg,"4Eg6+B8۵O@G>|%:ˣ@Tէ#ߏzorٹ'ŴEgL x*+PAسc]([ˆ%KW?IXkgMi[ބ+Z 9"v%*n_`d93=|tڹ|60Z '?(o. ':rl-7f쀳|h;D?FH/â[kFmO%͎@Wj*X^-V۽`ܪk"]{ !MDpjockCT@C.7lmtxY_U@8:d$JqIkA9O?A#^kxHÒy?q -خ⩸~,78= liNW2navit-0.5.0+dfsg.1/navit/xpm/country_AR.svgz000066400000000000000000000022221264204753600206470ustar00rootroot00000000000000'zHcountry_AR.svgV]oF|N~ŖE GrIZmiѧ(C $e>GR+xǽٹ٥=|/>oڢj^/j5~ OWn}yAgaxu{E7}"9aumpMvzR7Smż #BI9Yt )dvz"\ !]ʢvQiUvŢ[OFyZwSz_ R)(0֐JW]ѕ2[QfW]Qea.M>XLr{,r,[܁)ţq2_F>-8ۭn7YFSt`m|ukw /KN I |M @kF0/C\;}WU~ɪvY7ߧ^SwY=&7If @), ),&7H_FSp_Ɛƀ«d*fA7) J ޸h5L5G= Bc缮z 5h#q+dD*,=1ˠγnң9ڮR뢬 d;bUֻ#Z}cC%ў^Az`~{4/ AVA/6#VG}@|%&B_H*ѽ6dw^!fKGܵ,7\1?gӂ Fsaa|7"($G 'K DM GC~5 ~w sQm$Hkn׮%1ÿDv.:2 F 1>?orQ}wγ2_}scC?&FL navit-0.5.0+dfsg.1/navit/xpm/country_AS.svgz000066400000000000000000000201131264204753600206470ustar00rootroot00000000000000'zHcountry_AS.svg]Ǒbn%y~?dɁ3N9s}2]jx\e寿߯g8<ntUW׫k^LJm_]酺jf{O:]5j{zmׯ|~om?vۯo?;5n@VMX.%@ 34`>ȿ{ý61_5j{{?z\6g/>9YM#iIFG>ig`aF\7`][xɋp%N=Iqyň;\\i FtƯU-E0v;)B%+J荼C-\[[$Fh3Y1,Y gZ&xO#᭦xYPzpCBG7I7BJJf?$b)yU&p|uFbm<^#Ur 7IalαmKl+%ăTxwRcb  3#"f1E)p)4A-fqXp5KA>h؈9DL9Љ'>#llm5>CtTX.xG;ƍ 1ɸ$2懶H,t3𕠘ƔDy"DČ3aD6Rin=N/h[,$19$Q*B"~<.ܷ E<&@B)a։:3=4$oRY3H5e !o@p`-:oHq̴ίOh {^`IIc>91 UinAudܼlZ Iw@``z2rPƞbT bPQI*'υ ),`YiXUQ9YFɋS"-kDaFD, "j;t.OpGw L vDv+&qfhԲ.iN + ͬQ(ɩ$ZOnIjTZ xVNZj+jy@e1p^r+1L{2@&<ç=,"+XA1G"Al`IFK x-4Gl2ڬO/^?n̓Y96;./~n{7ޮ^~wYv߯>ڭc)`")oM qha:NC#A\ Ef|1nC]1~gYdebepmB`iA"Ze5lY+gKH0qIod~@6,LH'j k(HkCR!'j$kB nTTWާ\3" ]1isM&rb2UNC䚴oD*j "&m92o"REhEGf0=:'k;n= ,WCBw㛴yZDZu4սzA6DI1p;YyzTOͭ~9@OǙ9<Z7#=9"#$YasrCFE#t3GsǧLQmoT@o W]1/mJ؁ -B%V&4l[YgOHu;Hp`{R|f/]gu*ǓS}ٯM$>h=xW)S\Mtby' 6$PRN{$Ŋ:H`pEEډ4ĊK)qOБ$ӡóa bv&;܁ 2tt8K4[# ѵTbpK|#ʙ\Av Ȟ;:PVT0%0 PfW%Uw*g~ngxYN6}= /-.2 ItjdO:{| -/{޹_N l{%$eWt٪"9LX`ea(?R&xkg%S"\]VNK&p#9#*Ma,Q2Q<~@q{HӬ>%\Ņ3$vc_x6a 2Vs@~FIgL`ъKM04n49F8R`آ0$)J!F/7P0keG`Yv r%}-DT?F1o3CNBhF-%[ \<k|G)J2ɒPe 3,&?\%krH0m76_,RUf@υ{MɫNdQ>KG1'$=N||n 0d$Tqjh捨 cQ.W LF:cw.7=#ZxװNVEOPX}VzE뒯rvDt V{Wer銨%Vž]bBie;1Suk( ` vAba%,cCIJgQr%EY=zɍ`eRb*.wiH78T ؜P@>+9yk*1dmDCLU=F4* c' BywX: dN ;q2>cdIA;۟ %/Ҍ/Eِof.dHOIT&0ֽP!\A%gݘUd$_<˝{$qZ| y_DHf=%yDK^% O=QΒs5V; a pe}\/Wr.}9ӎɆLrְSSo[p%𴻭@Cw6|"e%.auzoXM*.q׍dnwRe΋ڒX! 0IN\sg]u;bJz1VN!As tzڏ o_=sh繕TP !}zW@f=ZvsjHTK !,udou/7B1'պSՋ2RKS Xnp3B"Ҋ 2RUr YHģ =k-ɑOWjKvQ],PT\S ,Bd1RJ_>J!e'umr$Ke0(C"YW။6㾕#,LHJ/Uoa_-N7OXgd-F)@i%(g!A?^;g/AO(!쫞B>,~roۏ𽀝$X>3p'> fv$ޙ妜/gsVR<ĺcVGT|y嚓r64бBu]PlcDl[rx7S{^mtL0ίXB8KdH)лC)J rRdMUVf/}wpg x]N1w!?I}Sx,zt23a89YɤY{4?秚g'rO FF?53NAmm ԎRT'Z0y{nym<:&Z)U7+x b>K=I{4=ᢧG橃 j}Gl'+_ EZJxњ>z%ߚZ(_o'BDQw3IBh&9?HowN8uD6.?C!Cğqqi=5XD I s*ܙ@IbB҆Yjgf>s/ߗWo;L'簳 vy~BSV(<%alXtTR;df;.r7h%꺛FI.r0XgzH9NdO h.|ȮCR=U!P-8{j@|j8W6Y}BdRZ#l/ ݼ"0Ċd$L|\c䛗TbYH'K-kfČ^B M ]TFE2^.q}\ݭJݛ_LJ-x|z\_^ׇݻz/ooWϋ۾ӻ\]֏/O|~Jws^*4=Տ/ʨ0?7Un_7LJ_>նf[\F}ևm>C뿬o'`%oWCX>lݮW \v47w7߽b;WyXL~=߭x׻yǯ>>lׇ.3O^?lo g}:aCWSfuhs9Eq>3$>v^a>>hf3ÿz(ӷʚĿFX lub_/?;dt "S߉g-z.9BOܲgj{#bv'˖f}f0 @_> 1zݽo~W( 4?$VkRpz͐E@MEvRa/__ҩ#navit-0.5.0+dfsg.1/navit/xpm/country_AT.svgz000066400000000000000000000004021264204753600206470ustar00rootroot00000000000000'zHcountry_AT.svg}AK@a:*t[0"H-5Xd!Jt߻+< {f|A[#0KA4]2ECgh,.gQWu é!Lv x~GTu{Ij 3ڔyI<S8NbOfkZ3?J7xDiZw 9_!пQ5 UhQXnavit-0.5.0+dfsg.1/navit/xpm/country_AU.svgz000066400000000000000000000026511264204753600206600ustar00rootroot00000000000000'zHcountry_AU.svgW]oX}^$?f܋EREոDKJ=:ҖRTiΙ9gdi|]3R.(Mv>G闺K}ˤ]/yv6O-B9h؄D@װb:&\/,Zp}pDΰ2N3^޲qX)X f BpD&g:Ɗlg%Z٠ґ#$8 M@A2ኊ9X \|dP۠'>bMu*_K &D<3+X;D ,HlY`N^ئ=&DMnmo5󭞤|{E -o+CFRdtAYvNWpփȠ] 0=PI@\ dYst+AXxZBCԑaprU ٠n@F~)Bvŀ^!(.8 Aeq^s ˕JYxbvb(&ˤP{s o|K(7-\gu4m;J@wc+OEOKOl6N|}0tӦjX>dIM nfmo~z:z&Lf|y:J˶'1kCOj'gOGAɋv1q݁ F!v8s/NO*0k!}1C~^Cx `4,orqCмy4T^Q`H#͘CqfUqqBCګSJAE2oQg0,7}4`[[FM!hWd,BBjYBzq yp*X&,TI"PҀ~CʼA 0P}u5LRiFphw=7yI^bQJ7 sm]Y7bM"aF QhLUG0mFuukj}֫⍛BG.u>20 T'(`!.ʵHtI#)k*@+Tc.E脩`&f&Ȱ=DF/;6C)85x@*JpH5b ֍+ KV(Ѫ)d|8\hfϏvYW ^L+Py* >LDjm8&Cڴ] Ua[[%:GUu5qy7~AQA"eJIU$b&z&0p]({䗯Zy"Uv MTGh7<m=LD|FH9R&b㓱.ZHPJBLG(0Yߌ)@ !VEVDhI8}_ġ=xonRNr#E2ŊKcR)J ᳔^= .dP)Pdр ݄ŌvEVDje(bnvCoif2n/* ߯<Znavit-0.5.0+dfsg.1/navit/xpm/country_AX.svgz000066400000000000000000000004771264204753600206670ustar00rootroot00000000000000'zHcountry_AX.svgJ0x^OҮ8dq!/KӦ6|2_dgC~p})aՍ@0̤F \-gBc#2@Sdx6/Sh6 ۛ1`)Mxx8 kחDmmTy 6D.@ZᣋL ĮY-\ˈ˷aq2|.get;(uZuY qt}VٮCJ^]_% y׆$o]9/~Z.a` ./Hv{FAۺ[a5R%|=G֣"0TE_b.C-K)'D"96",%V"lNxd9ڐSsK!wT5^M,fUX z{ڇ!O/m(c q-`6Ij]89hsmJdp v\# 90gaiՈ*Ҩ̭GŤUʂ{Zod0x  ɴw\APHP3He"PQ fN0'Q8N)gbsa\AHo!2p < )VBEKzHWsnƴRIk ַYm&7n9~48'B0BBN{^8=7a3m< =+navit-0.5.0+dfsg.1/navit/xpm/country_BA.svgz000066400000000000000000000013041264204753600206270ustar00rootroot00000000000000'zHcountry_BA.svg՗n0wJ16? I&uw2ㆦOc0eJ|avpW23B1RռuL񷯟fUuR\lG2rj[m3V ֮m[wJRyl3l[5 )LhySJ`ý^)8Es[N\(,lN^k~RLEb;S 2&"@3բqI1vo[mQsM "6йxza3)nvegR%j:/k[TPBJ (߫J])(XLx2[uy1`>>lGqbYeػ$wN9l_,9~p{kY\,#FgFEqDML 4Z,'"$2R)!I$ zvг&EmR Kx=A'O?q"Ρ b'AH 8)8ޝj_QfLq@( ɚT􅕀B iDulӕ:M6;x Fvu\7.R_znavit-0.5.0+dfsg.1/navit/xpm/country_BB.svgz000066400000000000000000000033201264204753600206300ustar00rootroot00000000000000'zHcountry_BB.svgX[۶~_*/-ENJ]o"@iq^,dȒ u~Ғ,_6gۦǹ|3rFySxOia3eZey.оvI%EU_Vw7wߘ3˻Tj}믻pۡGQZmB;/@}Zx6PoU*fcʮ "O;@imS&[ΧTv (BLCJ}%AپkcQuRs^$v ݦIm!%hT.|!.N2٘NRӎ.u7ngsRrcU"i}J<(:(CgLVt?>;SKW$j6iIV=K#F.ϺWgۇ2m Yv](m>-)7 ?,u[5IUl!9@Cϗ*L)$cV"k\Uԛ)PaJ (\/6m]^f.O@ 0V/Hy`%m@E7IG3BF^XT~%Y%s͙r%RnĿ<;`SH"F6K. s7Tm8B'R;mZ=;n&`mb=ZwKQ_]I&_,LR~YWhxlEU|4mCWy,1ig5vDEkӜXqvzzȓ{y4}c3yߛI讕e9=c~n\A "jc'w]7b4Mdel74Ug8ܜ0L&W,V)Eu0EvA?IM'YnxvW-p3}\L47} ߟrQ^OZMjT&~1uSeԾ%)+gs Soߓm']O6[5'mtl߬c[VW _Bo@Q[T}Lf[<ʲ!-'s bRw~F8%#')(D*EhL_#sVG+:CkyA ;~)8g=#q2caӳ(lói,G {0/ϘS{LRDHE\͘Jdr2c *4Sm,81!2VZ!s@H d;f}*fTp$1#£G|FD2H(ap'@J#,THCD)j)MtJI#$TQKCR0"( G3P MRR1 (YeqR: ʔvVJB"5pAF3eR ($E YdyE`OfTȹgr{Y$wXĤ} 4HG9|ѓұ& 9EֈkyHS\02 kqrx$H+nɵ u! R{ xB =pF atJp퉺5ÙOW_nCKEe>9Ǎ>x[;l7Xۀ0!3ҟC&& n5x,?[ vU#navit-0.5.0+dfsg.1/navit/xpm/country_BD.svgz000066400000000000000000000004461264204753600206400ustar00rootroot00000000000000'zHcountry_BD.svgmPAN0WV3Dq*T`َc1M{ =y=;;3a|pV71̶A9qInS C^YW]ϰ"dIN)%?jƝn,]`d?.@"0r )xN[.Ua3D6شLk6y52F%sP%{q:@aL 7m"CɱOwn 0̧w{QEn|i#anavit-0.5.0+dfsg.1/navit/xpm/country_BE.svgz000066400000000000000000000004601264204753600206350ustar00rootroot00000000000000'zHcountry_BE.svgm_K0G;\MZ!DnOR dacw=$? Tjg!([:m%p Z_XYg@p>ޞئ5(El2>Hifj|; P9affeY:季!n%؍,vRS}*9 FSr]2JjGkQ"dxӋ=s>cN~ŔL"aq1H+>4F˟T"T-XEZ)ehX6CM |k -'U(M-:FRʾJ;7>I's=~_WP'navit-0.5.0+dfsg.1/navit/xpm/country_BG.svgz000066400000000000000000000005251264204753600206410ustar00rootroot00000000000000'zHcountry_BG.svgQO0IcӑE“1Q_|!um#]e-d)Xe9@:2 /cBgBU8 v+9<3$,eH[Cei.2]qt #JiF+W0&#=mE(-pciMtn2\JA&evÍ̖{l{.I 2x azb(ŬI.y[}ɑA{imJiɵ7rN`(?>h|20DN0 #t~!;Y?“gnavit-0.5.0+dfsg.1/navit/xpm/country_BH.svgz000066400000000000000000000005321264204753600206400ustar00rootroot00000000000000'zHcountry_BH.svg_O0I+  $&FIDu2+>؇nO=Sd,2㕒yRbnϫnͩaxGpEz-yBҘzJH۶A; .ViC8}DcAf2t3M#R%s%M&߽{`O+2SچC(sQ&؁xK^j.dK穁oӜ0\t'OV2C ΦVOũ-j%pjD Bl9<a9 u">W7j%/navit-0.5.0+dfsg.1/navit/xpm/country_BI.svgz000066400000000000000000000011701264204753600206400ustar00rootroot00000000000000'zHcountry_BI.svgUMo@Wnɖť-HjH` Z6ɯ,`FJ.|0oogzVE]"r$RE! v}Cwnoܦ֧?db9d(̄󜜭[ #<>x>Srd̘uViSW, ζ{㜻D\iXmd2IV:Z#;$m^clƳ}k5eݨDԈTWFFh*\̇*yw c۷c xC1]k'Zm,=m㠪 ZTYCn 9kd10Gh;Ok_JUMOJD(_M/S:kf!ZJ.tܝ#?=N[y&8v^j]G):fynavit-0.5.0+dfsg.1/navit/xpm/country_BL.svgz000066400000000000000000000004211264204753600206410ustar00rootroot00000000000000,(zHcountry_BL.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_BM.svgz000066400000000000000000001105321264204753600206470ustar00rootroot00000000000000'zHcountry_BM.svgk]בF 6v0F`d0l&$_?k}^tj^D jկ?ן~7?^}շן7㗿o_}x?+~ٿw>_Ozޥ/^/>w?>3<_y/_yow_/>/__+|ͯ򧬋󋐾H闸݇WOw?M!/wU_Q.߆~o͇7ۼꇷ.ݫ߿}ëo޾>‹$~ןMc=7߿{<}_.?~5|֯?O߾xmi9Ŧӻ7~/3J{{?|ob a|Mop_Wo^}xśو-I ?OO ^}G}o|~&9]?/_?Bo2~7w_w%a|_,|w}N1yJ~w0o8N=Na|4ݷ~x//MW߾?"zoޑ}M_iT7>LGu5CՇ߼߾ {ywu)o^oo>};{N}Ӿ}o'w0vG-mn^}?@Ӽ~^S= ??o mW-Gn^_XJ^fTPvn+?𻵝YE+"ǚ_/2-lNE+u?^0.|g u,_vqx|?/Kd5ǁ^{3SՃ/HbﹾxoxB ^3u{_~4kV'||RyQzrwX25 [Tm!~u 8Eoyn f65O_}ۋF[Z6BQ?Y߾ÿ,K߽W>=d{yԳJHiEMֲpdXa-"}F'}3I::/}fSJƗqa4\?5"Z UE=g.Gȹ}4-zF,xJ{[EES1xi/p=eOT%ibְ[|w'Ϊ+5èC>Fp0+ ,ܻ[ecyE=8an"\0.5N{wmTx육+*)+#u_]l Y~F8Pp'´>#t<k=󭚾#͙t)&U}k3f.4a;]j㡇۵'ET]Zk2hMz/0\i.)ߗ~CĐi*R,nZ{z%?`KSI4b x_X_7N,6 a3⯛}.?Hb1r*H'%P9jehScF[lh XjΛ 3JrqS=WQ;a|0$ㄋ&CwsRt|h795eX8 `ScsiaW`I0) 8_8i7G<}"92A#)ITrQ4-``Sq2ᜂAȏq^_u>ʺ->-Cl18R:4<k n0Ik\3E)0ZkaE0YK&,Q"W']s'*7rf񾓧~ ޯfM>8pc<-58=`*fH/!GƆ2,t!!^6C+`QXH(@w2uH1F#RFl a\d*\5ÇgX@+ mђBefC"jrMtB؀}xl\{Wkc:.RYm~*Xdp׎ƒ&(Z38X˳)IW2TNg6#;>(b]9C1MF 0'znR`Lffd;C f609 3Fp*)'0}C@si۹IA-_54Drg&ǰ9N#i8bkDe^\ZkТٿMN&.+T776#VռH66iХiµ-NRbXRx'͌y_KGڇEZr:i'"~̔}enHF`^5e JZlEpsTIag,t \k .Y!s\M:EAuLdfGQum;^ƛAd:oH+ ml V<䆬ܙmV\a-؎U: &L] s#Rv"8 &Ov:]a^cC,^YudJaLGt_c G_Uac0;m?%yFq44c:{ΕN6 Mgn`cVG抆Aϓ9%f"iNBl/Բ)o* 9}>D4lJFI[5/wF3\iuX]:¿Zn-M. }Ȁ8V4wbZ u&0zdditaӱ&¤L,`K ET!&nWl"8A%8r`̬ L~J%- A;jA mJx^jR<Lw8*4S2sWXeFq'&;0D)νPSn*XLҾmҎ 0Ttfh;n'j'Ga@Ao* ^ye~'#céHο .S+Qvʂ$),fM/Í&abd,8|H1pL Ϟ8n[&@:? c8|ZcGJMwWءt|񆱑}>Y;%J7%8n@xDC38Hc$RrF.Wnݴ <0ȍ>_ A)V]a5ђ8Z"%0()"+uāvo<;[_>6 ugŸAEm G6CL.5Xܠ0,t AQɗ N]Reo>㙹1~mmmp}t%cn\0Ic?HǴ!)|/h^0X]3N521qf,LB%o)ֳVCU__A 5 u[LcN+P XH[9ӵx^'\3$}X_Ӛ qN"줃h&`gxeI4NؗDlPkhU`g)M<,݆7%zWjnG)eC%OW(X3jf2Fߓ+s. 6i] WwbbA ~d=0ӊ2ђKD(BdP.XDcfͥ~X8`u&!BvIURH8WUolp+fDC2zASDsX5;$+HYϛ0Pba/% ?bMHRRGW'3Sd>O T6VHMcT| ɏ#<7>ܹMLK~_jWckOuMl&q&:l ௛$ H{@ +ɴo+\'ƆXDInzfX#NRgê;XKc˰Pg)<3" 4ȮRjbp4*{qŲY\ tA^՛UY(HiŨW4g(٢s:- - P2ǿ1Vw4%r)+ 뷌d'ԙC nA]neHd7ݙAP$cb]]ͪ:K;6+ -QݦMSXCVXOs-xĐh8\j"T++Iˬ T (vj86VfΒ8VnX:;0StJ8_ɴ }C)U!)GxWl/33+?YV|WGhP0Qnǔa7Z > k1|ilҗ҃iȗNhx4OA9h;c9 v1\A8?|>V.L6 _)툮RJf=3(qy0g#i%&va&ZL haΖYlt[g)76I |fh\VLVq=b¨AIG%tI ,NU\%,uUauV-t XĒ@2]oѰ-\]u+=:`$~5X8J3{B#obyU Fjͳ,=U9Y24ͪ1V`'x&DCuvC nab'۱Lҋ0M:teG^ cC Ul}H$[^#^47Y/RHX+Tx<*ÕD "3`~I⚸H<$vwN7{;kZf! wj`іe>QA ܨEoyOPU.S CXJ 6՘aֽe-]6˶<]L*xvVJ(ZvꏈCQKLbʢō>qKE<,Tj0ʤr֤b6E*d G}^ ۑ.Xp:4=Ҭzt*׳N:O[&Zrc9?}zTJAVHS_؛Lf̏9xN 9MhF+k,˨}UmkVL)i A8$N|9K\ey]`QPǐ Vr9*pbL' Up2leUAIke CE]C`db<bhR.excKl_> G(8 3,4BnQ!}ara#J"J5cQe,6 EUX%4/6=]' Ust 6"X+3sX8gQK:zpiʮIUV;aeUw s|cxwh++iU<˚bL\i7G91ݒr(@ntvܒw`cN2J+$avYPː} W7|DczijFt"aC&m4 -đYJmwct ]R枴9.TIv%ET&^7$&cZ;8! ;lX9kG"Fq}f 3c0andM‘ӆkUMAW+j$[r?  6ѴC"sMb>(}/yl{#a r{&^f'rc'ۛ->/\YGN.ued'*, ߔ,](˄k ђ$Lұ:$dE%ZPcDN`٣lKcmN0MV|LYQtXUBLpWFC>KU-8X%tZ*.*^yf. ,7kyv5hU:IIxaLM:Ss)ȣtA[DEa839EfcӉښ%$[/R-'+O -cU! тwWsUMBHYєqfNŔ8?TVaS ==ֳaV?fMaО d9 xQIFr93: V50l1#aYq (${LcXrPn(\c6bdELo+'B ϙK6X%OLK\JH38,Z4E|EH0UF>됃 NȗW ϳNif]IH<KmNa?0CVe+.°tS=i}?b3+`SP(6r2 .MYðmděTk+=4/O(o51F ;1j$\`ت+mۜ<߀4{VF\-̻yJ(byX[; rP8j1aZӂI-[![*D:8[Nڭ>hҮT҆" w!%9"C d?1y$b!'aBL*2Br-;Ajt$q->H0qi&QO#\؝ڏZR7: (78مKm~94F")qU$g1ВI fZR8}ьHAo]_KI}heYY,ĽZ 2fYwM[/߁|ɍ%05˒`\ތpޜ8 <ժ!#z9jdXKPN)CR$G%^CۼN7Vn@biYqdd ]ņcǁQ;7iQDcu4i&BͤW_7cՆ"ljcjY櫝d$Nc9_MYa3β V4g0I-"+}k> ^]DJ3LSpmuҭ;N,::P>5#դ%޵Ğ 6zWF%*<N>T0V۫鵊f;V/^)~QL9 UT]bv 6{p^gq'=2{i_ !N%1MA]?˦-'_.S}cʞu6KNSlt&#&g!iMULCkZK 8I)㪷7i,{>͐'rI>!u o5A Lk4t߈4ԦB(u&G}Tpɬm]1Yf?i7֟uرiX>EQr6SɎ~UTyHN֧ţ';{l5i{',&g?Em ^I=9%-/R]}Y|8U<ǵ^]#v1x0a^ӎJE׳v~"{h"!{>*3$%;OJLM.*q"=<7`18ZV0㇇dJ@ĩ4aE`N GTFgsXu.%/(u0oY5R? UgvR!<-0;!'/!CXJ1㮩R=Τ[(ֹzyRO`m6[ WD)ca9Q/%;VlM&Alܔ=9ڑl5  t! #eŖ*I+ɡlOl`r)ummabl*>ikYZ9GKTKrVăzvZ<:.T& {\M 6Ҽ wbp"9LE2<ϙgM_#r=$WR NlnG M BCy:;&sZde%/ޣ2Adx"zRf?LwqI`i_SNqJSueLDrL[-/_Ԋ/ܖ6YgUċedP:`aggZ WNGYϣLٵ#(mv1}&rK*P$v[4"i`1my{)zV[[8@]IWv9_+@"ET0Q19 95o ]%U)ٔ`WxV=lKE:iV887S,A ǓI)s9,e ,JY;e Gi5SVL-,{Hkf Ah5-=ޫ6s3:7scH]|k> ]\By:Yk?{w{1o):朆Sb=Ue<٥Ϥ;JADq]ALE 3H";c7Ym;Ow)LZt6a%mun˔wc6|2vJrSɡ$AʹaS:4 j$#4㤷?$e .Mh! =#j4s$w?2i 'k6N.Ă>Ɂ؞ut~X.C'%9H`]!c mЉ/UW Rj^; oVM:e`9.ҫ Ή:LO9 ʧ܀M?,Ee$N\"6+Rmъ^9̍bqX\F׃=) pN9jOu١` 9^H X/j2S6RlxƖGEg!y2q D)#RU/[4F% ՉQ#cXw)Bϴce4^a}ȱx<Kt~8[G,Qŋ)s$_B\&`n=*D mrMgeeAHjOJ{j$rTK9SϗbyQlP|W+A`;?;\?fZNkR?NVJ˹[s|ic8=^,o60Hm~@;ɬ;, )Ik{ga? ۧSZ,pwHef? y7~7+>J,OIw.:uR(ϝC3͇ؐ͏JK\oh:sms`/g$迣g'qA[ x1vtjw_$ݎHq^=-v0'O̧f?v-o [o~Dtǰ.jj\X(&i])cb$ Rk]L'|JG,șd +P e8ȟrmP,$/n T JL2z%(SM]o,cOdhY˜ݢe9p5{0Iq|N[RDIsfl.$ƀPܑ41*RLLIQ !1`0 =Xhg,YfP#26;aHdNz/1&򝇞Z!Bǀ,XsiUmM)č3t0C];l 5B*{ In! TfZӆ"O*V!Tk՚̔J_\@Ő!{)/Ǫ8GixSw+F"QGYoR sr3OQe7.ng8 o Y3i>6 Ř2F1amd4oi{DN ml[cb+,3𺃧wxSJ36QS]䭨"RU K Y,zIؘb-[u`WmEݪ:"%)*ſn4dWZ a$vI[.6\,M b`5 n4uW:'f5k5zz[)1pkI5e]NR[ =ht)˽[`9}um`ڀ?0,(,(Hi4{C,\o]f F893Y˺;%מ$ NӾ[ VFVp]QCTh@ s~d/qVLZv<4gZ`sF}hUߡґJyTtP_Czi-"U+TσN=L4>et@T]&Y`I^iÂ]yӴp66~'%%<dgfp7E"~Vfib,+ÂAj$uXsOpZH˹ +|4Pk ɤi:cB7(U58)h1&)r"3b`9se 1qRN.3I+ܠ~gBNeu/yN}ntGNA|͙ۤa73f?:С錧2ΰpgE'X|$ZG*KO$"+X3S\R~?\7*2n7Jd)xŦX O۵1@_ e8 ԋľЄUJR* R'y\_cPNTɊȣ^y͂.ՋN Ea69yxBGbw#1 Ȣc)F; ~6%\ jDRϋ]ॏ fگegXk{xB1US{QJh}T_b!4(Qmښaf񃱜+vƔO-VdJJrxFs!/eei!id׀2qȌϰ{a .}kTT7Y w6QE<݀M ߓ@'[ RN^zPͽ$\"֋xFfm^@}l<3ى`.S8v¤c-O˪0^M/^6'AfF/-1z+C oGYD %/}ll!Y.Ǝdr:g?4u4ggp޺Urf`/YOBPxHK$qu1%W+\Eqy,jⶉS{RW[F/}}o^.< c>m^,4NjչJz w`0 d jRƗEʞ60lLdcXMN,%Fe 2mɃ9õCc2'43BZ7cVyݱHeb&&10{Nfn"V/![ݜZ2+M29HU&9YTK}eY֝QshN/6yeb E#F :EwF;C^^A rX=zpu[w l cUMwY^2m&`ÈPNB5WR\`P3t<' + j6/RfSY Ul FM j``62U?CUڃ=5EJ+&,S=ms㠜]hƉT* .ېkX-o Ҹ2]\z=GL+8;pT-r0i7n%KpNS"w8qEBVdvx_U؈mA4KO|xsDbih fheCC4U"_8DBR d(8‰n.*J^`b7\l+܂@ -n 3'<Ec0c%4Rd4S5H5D f|'I _3-9;JI2mYlZ&jqk)h&{-#8M룩# zu98N{ H;^w/ϺRZ }f4I-Zd{孔U3\UYt_ZglvuyG7VZ$ީp_^C^uh. O I$_JtpIVfqRz?8%HVRO-nߘ#aeNi{S<_Oƚ$%ʖ-jD-&qˉU@x.j`1[f $|eza|:EW*Run#o[:aX{ Bs56dR+%4 %m4 [)q$wd+d%GHJE@eOxP9EL`0ov>츅x#ߌ5HaCq]tQո(@(x5&$#xUbhH.^ܴcN" [ &R)e%nҏ ^HaL4"]'J`a{tՙ)qXgjK94,;ĕ+uaB㲤0ꚛf:,!` )ɬڧzuw2Ӷzc^#l\?3Oң{0ռ -Ӷ>68IbN`X" [UtVdU}'&{)ieJNo%Y"Nf83VTŊ#Ȃ z#Q Y.H$$f֓9[k`)/a.MP29 C81ļ`>T/J,:X-gIWUx$r$j $5jW5>3L5"&+檩8*iEjY'ocN!vo$eVpK̋B3$t]guAޟvV d܊=`'pUN,1P&- 2؎WXm: &VިsOyTC>E>Ga+#i{ajL\maeDwhBi0Nѿȸ˖%VOۮFIfd[7RRi 1Q(cOdE'),@J,Ue#8l+b(i]3OR_[mKYJ]o:>f ^7|OmȜ7C g^6Q'Q&8ECJEc! - ssLUl(r4:3\ɳ%ؚX*s:xhj+b3$ =ޓ5_Xmban0;nes<7!|!3)h ՉfL*teLpTTd:Z L85})iV34f4'#saz 3e&)el0Nyc*9 AEAL~g]+ ְ{aU܈HX"R<+&WRi PN^_rw,I{Yd@l5B_Gf<վU]K1S!2FaAZ C~GR"<_racmVTCfg8%8%%r7`od_wIR kU6 K 3 0.k Q, n҅o4VVE\CDy4]( t awS"Xcmas('l^: ;T;.Ȳ83UO;5H#@)J/ὶUOF^,(دZ^f=˪Ƅ #rݣC \+/CxE3®Vڪsi ZW :6B*̼{7gFq 7b j!؝N5de2w*ʈvj#t\y{kp=B,7nqnb)tu- {\E/TW̰QwNbt1q+4' rwLQS;xJ[KeJ2a*T7+ |LXV^gKZKN z'}u2_J$Fy_B:v^]U"&mbKjiDZ|So>\K#dvAX)}&FR@[Y-mGݵi"93l|+FYgLxIS9.ˇimiH#{.Xjf]ZeoN, (_ğոa6;:czK:Ŧ4;؉1k("<×6\zsG>ӫjANL_wX>fYExͰMпyON@QأP~BGlۏ^e s$ 1_n&ͶpzQ8M,qkVRhdң-K' oֲdcS3:l*pOb7qXoE1%ԛ9MER'{_IJЗ]/9 >2O?xٟ%ٜ7WD Zdc71l8-vN*s*A`l䭘Ts]N^v307ޟtַхaͫ'Hi`G g\*U X[pFNKdUSl 7ՒdKvx/GǠ]f>nՄ'=cYo7~Ĩ޾m?ip,*ӭdE$ i(J86OUUz\ITAq.n;/\A"Y#ϵ6o4A09>n4UK6yκI#տƒN䭶cfMɜYh kMv86.a)@)|ΑJaw%̾:T[>꒕-,(@x{|";qJq)a^.*%Sn 0| }~3t|Vʚ| p;`I֛6㈭0[9]Va VS\׷VZn(2VD>5yߪʫa5xcSQXyH͑1Nj +:4Y^BT}i3X~|Fx^.UIjҫy1Jj6b1E5 T<jbJA mUȀr'neni)XAW`/rʓ[MQW;8 ~':ؼ肉'hBW۶/M1AE(P)*ٽǣJ9Z}j)a-VOxqbBtFYuB!'*YL)Mg],#/>,E66D5ؒLifG"lǭK6a{z~$1>HarI1ђ!7#1CWo_LEuN,Jު{&[ld4۲fxLJOtx|UAp 4(L‡ $]7?>>_"D;j4#ͳ3ygFQs}sљç8:%qC=BaQn4ۅᠪ5͚~vO^80-~|`'90=d̻lQ&'R5',f %cV|sRn&~kWHT!ApMX8,d 4ڧ"<*mD'°o=6Gq#lu*HH; ):񅻈j^ըvh"zpZtOe 0~2YZ;:ì-3G7#Î#i"y]82 Ip_1,|j2BokӅF髴 'Ji#Crn֒7U#EtUEi 0b56}QaVY bSjFXg >` =,i͊ ykr4c1>IbJ%Pue4< ڝ%U8yn.X`Z5BRghΫ3oiR뉱PV5/%saQd9Ff:|y1ELjF Wyn;Y%=P Yj]Y6\kdZV5JǺhC )NVL1D ϊ軪ԴHg;IjΥ䏐LLĚ1u*qd-ݫ;TxDžITaDmћ_W$L\3y* ?k0l(Qkխ^gkV؍pP܋úvk@b gTgIvx0N sg0|"_ڒ [4mJ#&,(HI+d xv6䲆9dSz2H:;J*)[PՕ,m8Ǣ5e/[xS*l٣T}ՓJҺa=js> H_:Uv 7e80[f>'I7 G#wJ|zfU!9d5"A yŪx 䤱]DYp)euP6eS۠U >\K)cmo>d>'ohht2yfS&%es( rNrjY[k؜JbRc\BzJs68W np2T/GR6t6;D?'زe$ٚ V #V [ZHzݚ7rhy'8h\;tC&,ᙩ#+,=gq5E1N~{~mCl~B3z/N.ށCo>~7pMjЃit&3NN@߇%kv3noI5\ZMushj$bhtc^fM~Me)BtSG֖}ծ{a1,K.5%KSPxGLW5qBGu[Y-TY*\ nœ[1Ͼ @f?HUZG363[t{fvZȦw? `&ًª|(z)a3:V$q䬇Kc|{\ Y$'h 0a^y6fZ%-ٲ@UUU|3|2P?зΜaHaI!hw>&P ŧj&D˵f] 8:[f/}6K 1r@7ZdvMoZH"jF9/m7Mrb_7x>X %RO t/K_M*Kη|Go'EHݦjê٥ѱ-S9Rr -kqI6T;?Yy1Fh/K#I4dF}H)Bؤ}lWc֞u1FΓ ,-e"ݢtX%`P[7c3u= qMկa ;[s8JX-HjXm~(\6+׉ZyPlJ\Ia_Hb8;4ŶIWVhyR cBAJ|/O v-psכ1{Z}#]aŤ>^]m^bٶS4hlތٳ Z1P|ߤO2$={DMtE2X#bj.eg"iT~zߛQK:j$i\i-x+$p7cVu̘YS1{J!g_[IZRҷ%q#]{3jIGmu/jS6TEr1ֻ&?]|76uԊ }ոP;A.lג.X.RJo8jYreܻ٥-(=H)Pz7Ā uNP bQT\ڑ<XS7ؤ7VtШp/х-HI);]o=됉ۭ_?S1h=Ԥ0E]X*s76u6ݸ(Bl8=z7p㐕CF>LotVyvN>'Ke$S oYπ߮g'a(ֻh 7C'\p0 %W1%k|cVin0ڵ4XVw7g@'@m6qL'Nc yE+YrQ/ #6 &$Zt7X+x/tWfèԟÖ-q ,ö`%Ւڈ Q82I$/T&^BnYeȫ)$U(XjMN*GyFVT+f,ejq,O}R79_>@֠0~c) ϯ0IhͤMʆ6?TzxۛA{ay&RI8TZ]l<`ƱajvEwy{%{ӌ^^ MXe84fckoƲ=3-yYjg);Ƈm8 o{3hJ?qXj䨛i{,:;>GK?ACfyA[L?ofҳfko[Σ͋-Hmo<렱'Ni ؤӹ.b7Ǝ:{${cNͥi7cٞwƩ:VtKhO6cT~jEJaRDԱ'Hr1ؼبX+ x:SCw1gÜf2edgM`׾j&JF,+sKIjO/Z)} Ih/zۗ>9Uvf5y #/l9ݖnj|DH)df՚;_=X;fX+JVPz~x?M ϻC!Cg:#-6~3-(jûs`gZV) /%0lT>,fUXoe,&TGJs,;{%{yʧ+AvOϻ3 I+G:R.gO4ux 1V Uu]=dG)t!;/jM[{dB2:[3l@Os}kp;H v}v3yWZ;t#- +āsɳa gKEqތ;)6j1vgaoV-խ8`ŜK/}7vْL| eek ^ e^R C8Ɋb \5ͤCAӈ[7#Į:ej6|9'y|YfuPFުi7cYw`#~=l`j"Es=Gk݌d{Uɞ 0Jqx/ٷ"|Y7C9wQz+a3fV#^ +;{R vAO{XIհ kl8=l}ĴK7Kg3ٗگ$#^%w3- "?KӅLlVrΉ7pfYEڗScӋdںH'>e̴#\KĶ Qyc#d(T걠h16u9^5[雷n8|HIt5fIs4ENdJgb j\mkOOˏX2\I4ӨՋg>a0ocmŘw[wβ}m 9+s# L0hB}]D Ǚ?18$l9w JwKC/)'(Jg!k\miقo6绑#T<ݓAU5F='izp$475HhVfoze뿺q2ܫ4ra $5L)EH)}v.ZtղF6O+JM zyö69`,X݄ 2LxYoo1q3b7i[cCߜٟx:8;#5Öb)QU_J)99cN뙣t)]V^\BfoT͍28Mwp?٭WA:d4ִf*=xW1ca`+Sd5"~-ku:]KnogoRm*38icHǐ)n$KN0ښ܋P3^Ud'iĄq9"FqA qr7fT MWnk% ahv>@\MWy#XCr䬍 SF2֛7g $Ej0Ega3Uk.%Kt5&':G7[{#z& k$(. i'6 .Fc^"k܄력 #Ĩںo{@ʁ-pXPxU6ss}I3FP8+[;ln2="r䥤pZWj)9$#%m7ir2hHن.Z&ev|u73GHŒcG՝}.ZQl˗ͥYgnFjdU::* |d|Y`HAz> Y3^f(YSD'2d_ +mn >qi:vܺPW3x뻇'=bϻ㱴 +H0xu6׶-5PΨ7V:by] rH7;MVeZ%#%E Xf ,d֐=6aj"kLByEhK _GMm)8H@vߛQkϻtI$|Wb=蟥a}l;lCbk_o{3hO|0PVX갇i@Z)n9w}U.7}w<$BThWFg`!]eۯO܄9LN'ʾ}ϛYxڣj 9x/uUG)̧rq3>J"6c~juߛ|'u.J`Ya@U0_]JDv#l` P3=b>~H8I]Ź#o(J]SD_~BVvAhffc- )*Oqk,:H3QYjKjZrU`aYlHf8 Thhm_v\2SLyߧa>ZnfnHyFd8o#@g3Y̤}L?7~45[/2{e{ EE~C|h7Pfp߼Ky?}_g f_C (_}cJ6^٥LTa߸Hle>Xd${/75ƫ~:+ؚ0z;L1@Z5z/E}b0ͺ~`%VJ64p8j^RR%藀lHI#^X%8o2_:u;2;p*ņN i/ 'ffA~6D򄌔e#DZ?ؖ_} 1ql#u;0,yrqY/X&ty5cKo20Oױ_ljv?f\ӕ$١/ =E I`+Bv[IsOL8~>__2-kCaMsccCP4558!pEaʘ^M7C[ԓ(b{P'ukPIFx8&xXֲO'ׯx=navit-0.5.0+dfsg.1/navit/xpm/country_BN.svgz000066400000000000000000000304171264204753600206530ustar00rootroot00000000000000'zHcountry_BN.svg[ksu__ 8J)W9ש|٪-Ei}ιw0WQ[b>On'M\^ƜM|X_߿/|rfζn&v9]͖|׉Lifշ|vN~v_^\<>>6˾Yo/t_L&.W [_]vgOOwͦ?,^e^w9FwWهU Tg?neaQ0mVM.1ճ^~6o]_f&6Ҽi7Wgi/@q YJ qG˯߮" 5n뷳nϛ }UϛH/og߬bj=zOP7I/L ak|xyngvAʁ] 9[a~-\oٻyz~_nevy`O.?uηO=a_̮׳n9{y7NxX-߬f$殽{n#;80=QwnV8| /=MY.g-lD y|?bٯOtv~L<\7hCw~s1af˻uKϰw@P>޷/F޹d1[rW_]u?)Rhv|ݮDChQ-_Ԝrxv&t?|k7Ü&qdnY{n7͐3//vN@Z{ZЕ5?㯏bxޓSfFXr8"a8}l7AzC]n\W[J>kX쩛aPUO\a34vlyDx 8rklm{Zk7?BJW]&]Z0fi7Ksv}Yw3lf(c G=nA~=+gۛVo@o߷b=ǿ0><,vRx1qi~_x%oՇA%daena}.ͿR]'{V]0b,XMOoK4V{AK2&\M.ġbm/0|8EO5ӃFAyߘcqڭcF[~^ZX^eW8|z*伩 ;T+QS%ipI{:}?`(<{۸\<&Rov@8=E7-)y7O7?8=HǚT zBS&کqLcM`^6 Әh!NcMrCfu (puLjLX7ٲm!fdp: p&`e=F3?  +8R*lL:n6XWQZ9e1khsؐ ecDZ}c=DXTObJж~!5ocoEtT,1lSc Xb +h-#X}(Ygɀ~1*"\Ex"7%et R!!sJB1F=Dc! d1 @dXiDf& [z0Z~]O"M,9$`a̍&+%ր=bTj(*hݏ"wDKXE[ "MCs/LJ'"ĊQ [%qq0H#DHj ~7bbMŃ- F9L-kkUa{,;-$bN :z 暟F > `(kO$F8$e {gta8%\ &6RFb{F\܉A0a(p^pe>CmրDc˞b;s4I;*,rnGgpІ/QlnyNCl"T]rMF8 IV\;D$TJ!z\4?ݕ+:$K5oÎh%1)j)M`M8À6)aXמL‰#M )\1 d ̀ޤ|[zNډ#c\8l +{p ?HbXir%Q-)a ,rJc ,wrIԱcP`]ރ`{DI6Q@?(q`զ㣣B$Eq>-߶ zl(!±PvDG+đgni|!IЊpeX B-ܾ4@ 4Ơ!F 1a-A!"C4ry'?G@(1B$gk2ŠeaM1Iӄh1,0|ɊGrZ ƒP0H=,+ G40f)ܔ6s:Ū6-L$MCX(, Xeց4qCeH$]wB$P$tAgA}eA=!Er{!:k.fP FT&Ty*pAXk-n A~t2&PfNqtL ER7J˲+$#O)DtV2 HE9p N,dfX*sJӀ=d{0mx`"4NvDFH۹oc # AgK41JPh"] ?IkNb`x+; ІgbRBL TqGU#!O(պ5*9*8FCS0(@iQaѓ ?(6 .\?1&MFaI~hjF6H1=!Wr{JNMLRXFZG !iƧ\$ B89Qz0( ,V8JiBHQ!7,Wr6X:-ILf͊FTj ? Qa!3b˾j;.> 휥ΪIÒ ۑ,,xȌĪf fjRG b, 2=R# ̚ p}V(!'b`QZVc=% ɲ$Z;(>;*oYȖHy#j1pI4kD)wEU vF&FĢAa)yڬ HC]kⒼL0=OZGA菴_*qGz(Rk)I9.JR8B^$ 𺄅QBH$"B3 Ud +"zb2Od#"yZ@] Tl +^aG̈jEiU+oת*@,U$D+˒.!U2{έu\,ҮRҦZ y&Xz&B+s,'Т3gYjhN֫.j3dFj{j9N? %3 m1 rMݴ8-c 32FGaȐX22z1꣺Th/ 3p4yCU o|h`n-i!@nd&fr+s{$+2;$:*f <|\bv@Г;b΋G%~G^zo?'G|a;K,ä=Eʥ Y RN] F.>U%c7#W"$/W0d_fyL^dG ZȄsF7Nh4RST VUqS`:0}FH% g@܍mR9bqɘ2)SQ Ē53\e6Za꜓\[*xGթ;ԱBbB-we+Df|5mGG[Vѝ6VT.`Fo9R@kUl5JqxjٸR12 JgV•"dWffgۋ 6*yg%dj_3VC-粜Z׻7\=7X 7i om;$vJ>U:pA#Ԭ t ړ=&P-S|&,˨8AmxB]Unxb"8Ƚ@_t+4d6ȂQ׊L&FI/9B^`19{DBA\K#!@dv0(VG'BUk7uIbYrwr-)6FWEmgJe F{`iUU٩| F3 . B9WIi䅓n!Ò֫/cFڴJ$F+c\|VIkaIy#o<Pi`9" N|oŐ+ܸ M=-F 0J颗=bbvD J5~BsnAھDž># Rea,ӝ S-b[HrhVDQUzܗȣ${?%z`q+-ji+ L\(&)h2}8TK%]-Ƈ g]IFUqLicyb^L&Bqzu)<򹔦&j%`W ėn)yqǙ1{p&SEêen}-AibGkK.ka0sq#DRf}ħ%vPWCVF a(d?RZūCls5GK!&>ĒrV"z| B˓#y)%?Pw3ī\ZrW3hPV%eyq(/R9r>C =*\̸NtỨ4q, H_$!Fyl"н<gX %%l]WK.&Ru"v/bgPc_ $y_O 3s0y]qj 2ď[HU 88Bz%^|dpw=@bS[Kˬ|z9b<E~RQ?HPՀ I!(u[V6s ͒$n~YzKMo mYUҌtu=SjmFd )~a+}lyϵǂ%?ߘ[p Z*]?i5:MxBmroc=bi}<Wn5?_/GRh8\3 QJ|R%!M e )!#8ڎu(e 1ӂ\UAIa2q- 鼃K.+l*%,dRŭ](/TSVJ&]RLPG 9)e?\)S۩K\CkyGrm:@?CzSfZ^R2.mK6aRɓF&(v܄nԇΕ.i ]J C޴O b:ѐݦ5&Ş;̡w?(N\~z`[;@XtŕՂ_9GL 5-^aw~V$^^|db$ z.cEأvc'5͚ܴ xž-.}db|~$cBbHP|q+8q67Ue*)?qtV<`I F_ qbL@Bȟ*=u&G1 77y'5G[yS,.l="@T|S+0xqIgBvA૧J&H-s[ם}uRܐWxU'4 p_m⾊V<*_XȄb*qa/CJ1c#/8Y.w`guc~=DizjPzLWDGehw  2P5?]Hel aZ[Zًy|v@ZO܌ +-XB"]bVA)XFv+4U%XD1!V90iSH(2@ACqf 4" D.Ү_P1EBJseDg*MDtsjZjGfήgMalcNUDbMY# {DPa}~rܝ>(565{ ҿ9 ܔ97kЧ%t}2ĦEM6%+T+|wZ \U2|ǰ,cEri.@tyd 6I1|~ !(cٗcbiYKD>AY0c<*> 8n[a*ח.WV ,@laƌٲڬr XEW r PXw'Q p ˕:b @s)3 UWo CGO+`0DFQHMrUD[Ih$nw/9[@gyvskLn`:1II!8eLkKZ`8. -d3 ۄU=P](az@r(aURC4"'RMCj{8Dj=D3 rɘqT1Pv%09u+?6 s^:Ά~Mq{]IXl(*~ +dn'X#4麛14jsr?ߊhC3_Lw鮿)uϾswh @ɢ}A>h67q:< 9qW E@JWG zPKt:2Z﬛PtLziH/]My֟H]l5\VZ`8A6@hY̫Z q?-.$ x 9A+|'+J9=`xF%Y}I{)JiL m=JWe/wƅ)̍Bq{ _)S6|g03A#Ih+JuGׅaT[J6JZoLA܀}R"G4%O^>tk0 K^*J)|*ӭw508 9NwZc]LJ$mQ|KBENղs =?&->\@^EaYj B=z], R^G8kB21'  lj\USJB*[YEM$rj#^ShƬs;Ě ?:QSf}(5+D9f[͎a|u@*rJ^ m%,tsRE2^:UX0AFc)3(œE+Oh{$L90ό D] .Puo 1^\ GhDE Q[?G8?)Hyp*3]UjV]#M|g)Sk*wq[DŽ}4ƚW&d)2iՎ=yNh)Xj}I8تr_kS` *-vgQ#<2t ӈ0 J!gӵRǎW aM)nmޅV /*6*Ez3R8:1FbPN^S01߆ c0]) !!mq61_A M黋-X?i8(+`!kCWv;j ruC;sC:ʼ^p*f;&!Ρ2Oppv5_P 䃀jpW^e#Axk%izQ_@CQӢf?w(Qv];է,BԄSQQ]*>ڕ[e+hm$NKE8)vQxO ؑ.y41ʢӝ}",f B:#K,0$83 -ԺM] EnwK1?iZ&"i Z%:2b*NBỴRp^(av"~>F[Mq^E~wJ%*,fz!eȄm*<گ*x1ę JR!~ubh4["!a/uT`]1u6oʡ,~k4yky(@t`EKEpJw!%sr;Hu"j:zHeaJx,HgJ 0E˝Ѽs!S8mAԮ~ fջR@(F[T'mpȅewxrS=h-uo.8}A[*`%߳E1[[$b7Dky%A>}LCmοrJDJdCx H_\,GyvJ*冐 ŊV`(m2圥QJu `"R%Gٸ)IaCL 9>zF}I{1gi%!ZJS"o\$Z} P&qz(R(vtR)V"X#?g(v)B;u-SETN*zRD Y_Q6-LնQk> *؆SMj@ZPCV0!;f˕J^p\~)8⸝hHATpKͯ&-w5ˣ<]T`۔[J:ƅ;AXe(x (E86vÐGR|.0O%,/-Z5lU<ȠXFo' <nkTq0 W8yp\DE;Z?[?yS.p".i?P䠭(㙼N}nji6t;CKNmLt0t &g™DnՇzۧd<R*[+*vkX&S5cK\)msLٌ(h]x܉bEJͭ7e嫌])Y濇 mےLng|V?>uP?>ם>*gs>[C)=6p﫝~Յ22gO鬈nB7vq~$3@7Mi0~1[.Av/\Qf*LPr0C7t狎ߧmQ^;'ò4 \ cLnۍv`#o5 5w}<żY*`? Ay\\.i-Un 3*ֿڐKY7@mS$*g%X5*h!'$Xϗ*xD_9K6RѰKT‹~+vD@PGhPW1F0Eٶh(8K5u Rn%m"$O;I8뇳SX35 %ޔgԂo }! UBѓ*EݤDJ0㯭ģ#\qvV^|mDP$SrOgY)h8r(Bh\HGb* 7,H. 5vsj;:=| 'J^ t]HHFkБYbdɄ(bxdkPۚdP)y I{M] }(776MBg-E@2wʢ *+,Vs#uKCu:aC.\ ^v'FFɪ}mU#I޺ $(?y@嘤Fr7p3 w3Dlf,sZ9-4w?ƣi" E9쮴X%wAP>fseu2%e& 8Fi_ 37ƇT-\J[z7[{SmJ=:cA5k xj'VBNufNP} V}}Оes|}પɹs$J)\q1U2r2bj wJgu$ D$X;;>G2#?Gc8oKȖgu)s9óYM?=g~x߾/o=navit-0.5.0+dfsg.1/navit/xpm/country_BO.svgz000066400000000000000000000015201264204753600206450ustar00rootroot00000000000000'zHcountry_BO.svgT]6} WXlN2q0B:Qǖ'{xa9HoEBeV)xRRGx2%XDiyؙeV"uˆm[4}d,{󕹛bsqcHJ ha$T/e܊`J?n0Vq>gaWSg9Sx2DͅYBDޠZG@pŖZN-&r#(;TY(HV|uF=&NgfpR X©Zwٕg@8<_Y:h|Z_mӻ: /̬̄)1`h>!s=kQf /2T8ɳO`&$FS J:J ֪g#"^'li #:IJ>TcRPj0jT"Q fARU⼊˺ ȓ zUq> ͊4୨ʞ %]ʢ6u% |g@S&mEjHWkmuq^D8VB9< :N]rNmOt|;em$Fi e#Koe'1YR$rL夘X[Q8`tpq*z[ha%zAZ24$>pK r!&NBS*%K_ G@W4c0R]ͼ@;Z"<`Hja~|,]o⺟Uqo&p~[+\u~yxt}32mhT/u> PrvfPV)iݡ[GVzNչE[=88sۺ"ގ(WZ-P'DE.{:{dI|ۏt~{E5/,ӭ}QKek zLp{7{T/2cpm˰>Y&Rn_vހ=Ӭ_1ek:NFi(z\ rP{6<Ƞ^ 3"|)6#qo%K\ߊW<{<sbsm@o-^gsr簌U)w]pZ1™lY_.L[.;u+xqY ˔qVwE#LM`FַDMFg@L_Sol1Nt)}z摧?2?AOg_9Lsm 4t 8K s+e闽1navit-0.5.0+dfsg.1/navit/xpm/country_BS.svgz000066400000000000000000000006241264204753600206550ustar00rootroot00000000000000'zHcountry_BS.svg]O0z ۺ( MLLN@2e+ $zӜ=}6g8l3cQ %#⻔X%B#Je3%1"Rż7qx*kL:)c#ܥZrEkX{8f_`eɌŅjPRiϩQD i#STGdQ"B)27j઴n[^nz-gLqWsIHAwGK P7S[:*G7epR%ɴԅ fک2??tF&$b˝֗ާmƢsOp6 7{_navit-0.5.0+dfsg.1/navit/xpm/country_BT.svgz000066400000000000000000000603021264204753600206550ustar00rootroot00000000000000'zHcountry_BT.svg[][Ǒ}ϯ ],ukqH1v< !5HJ{/9$.b"BWUWW.ݏ'zu3Nau3_yQnZ׫t߼~d2zqw3}}qح7Wr^_M?/tvqsaww=7?wu+'W"/n๡✻·}_z |cۻevjzWC[ :NŵWr;.a??,vn9#-n7SXu}<~8#T$r|h=L]vP?-ܽ{~m?-//w|7RS.So懞vY_/w8K\^^?l\jӨQ<ŧ^ t3Rjo+e{z bŠ`Q3=z1wMCP0f܌чzs3*ٟ>?ӽP39SXy~l/?-7=kr|ݯIJ-}? Ͽl֟ZLFM<7~,~F7Nc]=`¶w<ߵCңO7X?ya{`?'n&,/7rOcPp[nrB&& ?+!pNDI%^CÖvjK9m~RznoߔrO$rp\$dqB~N_LLJ7OCI?e^ ]lOk/*e +.C"`@kW5ϴt.;GgZc2hEE:wN߫hV}"3?_&Dc$r^T6Kt)hFRXAj)^>]L)_ۄ!sē5/- 'LuBjG\\fzuqF3{ɩd`t&e=Y⒐(]~7YB'ВQ#D,PFa@$+D!w'K^\(`k⥎tu%pY $h.% %]='.dKUm.ѷ#+%Gkb8 Wy Bj!^3YrN3) H`v0E2KKbd$RMFG\hpط'k^\-pap36WRM,*` Y`nQ  iߟ6pJԌ,;M97f+ Zmk$βtqyfrFz>^]ԅQΒF;*lM +jQ*(ݣF*VK$ ]({͇;;K% JْaYCluX3F)MuqisZ}J,~CȻ6N 5rZ6ТDx*6 ͭdS 56s.00T|O Z<ɞ..)}=PF:\߾Ň(55 2^ӠUx ͂.=Yx#pfʢvpC^+PPk9ؔ 6ol)7YCQsfMq3@H צ0*B 1 f ; [GsDnO({N+`nS/^ Kl 7tdw#D:,xe,EJO_ͪ8Wh8v#>1(hĠ6 _ruX"Wm|ÃjߞsX[v 18+@"5qʤDդkq.CS_X9GPUpQ!XUEBǫ^\gyS@hIVI%.j>8q!1Ș]ŒٙrzɢY[^ዃ7[gSd)*3'nL 7 l[* 6h | 6>#r57TKZ 3;lG>s1WYgQ-c΄V {kGhx /fRYhH7h2:W3Mho 2dK vp9&"59jLf`HnA_El/׼$cos$Zkc9?)٠b~gp7vMzG,ʒ!,_/.80{l`I ]<)nV4X4!'0 RM o F.YË]\Q\gAq_qqTߌ`h k1 !Y ; dAICuut0KI9%XQ4Ǜ\:fA|U`2s8r&@G Џd_D$_#'k\|Z;9MCd*SkI"DqufVeEd(OF U1B "{ɜ;6:T;PtyƼX=9'T- ~ϟȌXmWL'R@labJ#8cth*:P `%fup ph`86GZz .2Iq$͌33frfNH8 pPJ(&l ҷ-!p5vrY' 'AX<#sVZ-6g_ڒpGa CKX&j _5PSeG')O9P|pQb 4z0c8%u52Cg fR{|[|C Z@Br-Je F$[n3wk+Kkc8R.)B90N2jVφlJ("ᦫLE-j=3Q^(lfR`+®εDu)@$I_C7DF g~.VҖ % Ķ4L@f,t߅k2v",^ eavnG j0AMx̅AMtaț8hWy|uVO" Q\$%$J/]z@'7H/0ǜߞzqY|-b'ɢ( #V6 M1JUZ`3nfd4!-pۓU/.@{Y쑙 ,4x߰qx?fh1\DJB6&N3_,1)49LϤzdђD9ְrj@- NFjL&5D!A5ƘIJ:8Ѕ*%njߞ,zqQQRg=j" S)xDsIBf>v-iSfhS7@{g4"4T%Xn5=Cw Ke.L?Lh!,4,z 6:romXYh|peMOkmMyOvtq9g2@ve0P:MJRBdnl:j)Wөk"pqGƔH4(ɗ$Kb|D dr5X ]&`B"-CEZ\m?>9HVPaS`B0>e&n~HSH!}`Mcam 4'ZQtO]jz^-)1 lk/`E뀘T+l3y[90,{q%d-={(:[WHh M$>(0 eDhwXQQ-VDK#y+*+X co{i"HS[+=ܥaM?WV2 qP)JAZa gJn2)ĄGe &,8b1o||sQ4' 걔K+鲷 FSrF{$UӁ#i_\3H's k/٠aeJHZZTA:@Ⱦ}V#Gdh)!>1F'$^؟-ɵ-xO2*uJZ B6OShr9վ{W|FQ5Ps_30cL. }.3 XiRyA P ,6C:q(dh J倄`h1 P@s@g2l@ k%Z^" {k '#SK=YL1O2cg|ɪFGVG0 V4(5NʤhK1 8@[M3<ҦW? @b~K; B y_ͪ|sZz skchBaHW*aZB,rd-W* %'Sg~[2h P#1}AU;&5KGC")ofa,1 (jⲨjWHZW L+GmW,M,6Q gI; &2jϔkt_¯jFs:clHd3UwJ؛M*i`b{[h@󁤝TIc_Z_igگ0434 P VMăXQi|l12c6K|8|QNLY lѵ#ګ 2٤v=_O.I/|!6XDرȠN4z W7kJA\qܙb`EocƗ~״?~@jil'BQ6;)!2y|ϕF((M~ -ؽdkiHY%U`sWפVm" !"|kc]xL m֨cwu@9p>9^@`@\2vHt9{ň#TPYYڦZW]|ERxR:B(@N90!Jjf6 uߑT&WXUJT!"VH[~z.)"#\\mZ&vCȢ%0 \UP҇[ݩА.ܸX93\ϊHs1Bd?1/C*d3fM "٘c = . 94OU#Y3eLCM6Kq:a'7w{X?k6IZSLg_}ѱԂz?ki{7˵`\k C֯LbZCVBIM}R?'OgQ&ȵ\=5 (HZpMժ̵ؔOiFg1IPn}B l aY+sOҘھf/M_ԇ*]vuae5% w#hfgneL6CS<(d]˝Gq6$A\ (RSϓft+Z8*^9cx 55EG >ߟUŐGlh̫EwDZN9E?җGZ$~ߑKf?3VzTeΒo:OA~{S,1 k׵Y.O`F0 7^ol(q?OP2?"EfZ0wa{G#KJySj!үe Vڍ8(R՝ uίD2\W`lzhIZDҏ6xqE>Z" ZS4({d9m _aF.dBx*XhPUAD²;!tlT +EJuxx^RcRʄn uJA[Dm^C2)R`k>&#|d;CDarA8&b<J<Ok`.PU!,5B5K0IA+ͤ%Vma ^ @,됳f#VrYXYd7ڴ^H _\+G @%M%W>u>sZxKGf~İogw\H\ ϨfJ2BwR-h2P϶f؈~VN/<ɶloY 'ʦ*+Y_08VJ߈PzH:H]9XY8\otRKKvNqв @ +(-N\m[Zv':ʹrhТz((X|(^&"Χ.L3;l❓0Ǫ2Tfq `xp̨v4HKq!ϯc5H "Z:"aU:㯬ؓVRjV|HTOfa!~"jθC{;(y`IE{D_檑 ZT6f:N^FT@F'?b'oqu>G}Wl8JܹZ[مj$1=ZʯLMn??wlgj_ܦUT#OT7 睊NЕxaduũfإI/3 .H )BA% |t6$Ak oqOPST063!@[}XAT@<9X$b X_(5Z/AgXd` ~բf]);.^ OucR0gQLtn\2 1sSwH5)\j )0+sRfWgtm/61Tun `TqRB.fw?Q&|jIJ@9U<*qL[>`<BaNX ТQܷ>79oQr=' gg#jhg2JnԿ @em$<#yeX 'lӨEd\hfG{Lj Ûbc0O3R=yipZ9uQDjTMbng<.D{Vr0JomU/*z޺&o8y>QߘmjY;g .3L7'~ d9/):eeuE~)n78w`Zv4da%ȦR|T&RtE3>C0NRULQD__? 8=zݨ ҊvR;"8nf55)Iuk\Ww9PTbS+e7!:DM4E_v?ܥe1᠌TKNNl&Im [A3.jJr? * FAWrofqz{JCBx.v֣uuJ|ZաCb=Wu>T6EmUPPvzYx+~ҡWjވΛ=jIj|N: &Ⱥ3BFnJ9~6}X:'@F 9l9Óh(XkSHQ>-} P@UmhKԤX\߿rb"jcXdwuOԥYyDz0Kagb6b}oHFj وc<ۇb=}$,E)u}聘-逢}`jp mC⤪n/Պ/.Z[fuH!IVRfYH %DK5;rrʡf\8XIPWMc|j> N+|}Sw,3`"JBiί2%"@]Z5+JN[,e dLs bc?>*NWE8P` G2\U`sLv, $mo{ZD0Ğ:PP1U-v{"4w* VH++Rj|1g|͵MO%c|Gp6ԍCh/VQ)v_[w|<"58WOs;VU`,l=7_#T4pkb/|89hUIB_wGvTwDpG#!~3C{%!jY )H1^=s {08PU B!~`MFO<;EQM;cxSmN!;d곟^1WE'U[غ64ۨ<4%訹H WE8s5W}ˤNv: ru>]in;N3MRNj+WE8ʍcӧ+D"k8v'dd[jl cKj cjNW(:0{;+ ] b$)SllΔV#JRK⯪gH)ěo%vRD3e9ͨ"ӅhG3 V{x +WuQH'E0]Z^9n޻lЫxu+^p.pcbu2Gq[V{Df.cdE]Qj}vSNnY{c|EpW[e~t=Ze;xt[, j9nKPib̟Xru2*8uv^U 5^o_5J BvU Orn$~I͸a:dF 0? iWLĠ0f}9{+3Q nUM<4L" qJ$Jqr|讫w%x>ɰȘ;h J-D";] 1Y4žQKWgxXX^IXϫ"N2LLy^FïoPnֱԫA9Ci'O)$腚kZ[Jp8Ȱy$N8ufW C"Y WAӂZxkB) B? 7CSJwU5[8>O섔74+I~Sڀi|jOV[:u_tlw=`+Ѐ!oe oR;a76 $a&qj+T`W3k+>Ç0_ȮniՃ4"腭"8{WOsFIҞT)~#Jki6MN@yND_wZݐAɷ0WE';DP\IUrDKWd~X: *Y}6NPr lrlal퀶p+ztqfnc~ H|Ւ:IX pζsEeWgl F Sx \|# O:DW0`t?,D4+fxLHq{JW K<ʩ,j)xXa{ggQw*KΞW%h'C+'`xsq~36otnM NFw;g44}7yNW=*QjM( blE 6LX{럃V|xTWHzXt6yy]D3wCv)U n"r; A^t)WU4U Ƶ$-a`D{n9ʪE"$Bҕ)-G"Ykt]Ǎu0vY{b& dAY/ݜ{<ާΩ7jRBZtU#?* L!XtZޯl8.D9-8Ya^nh :$5ԫS1;̜O0b\{k*A8&J\rnЀ,hRŇSO|٢8qE;$ |e <3c^P^tK{ ]S<Pc?DXMJ.i(Wh2R[ 8HunW63ӕ]r;:$;ڻB۽w[gC\dKZ';ëae$H)5lXE2_ȍguŝ">xT)dOw|pJ]"Eis(B|SaF)A*WtPP3.8t^xeiZ]|UvR=}4uSa2/mRt=xṢl;da&BA&d}*|xjVuBԿx10j+:UV[Q'Y^s'yrNM}0jtue_iJO Zy(f*vBw=H;JTy`qϊ{RtUW_> w d"źlf1YUD:Bpjr^+񈲏BAhz:f?כHZ~j"AM:'q8Ma=S6-cm\MS7d +$ k^yy+!*@; m%p ۚ'WzgIڒD @jc,E!&70y8\_VUG:@ƌHtV4tk'<.yGTmLW sFpx.5 smqݵg3Zon*]r୪?Iآ~J>ƮV")v$6uњC2>:Μfř8O}G 7ڻ~tFrq&b$L!7EٜW R]!Z o밦_mT ۢS)j?Ou!]IW( :YI r&Y~-k]Qٓ܌ h~!诒bC6(Mos>4l`C^r*)vb٪ c 5q,F>Xz^.p\S{%m\p؏!ks\ŵp:Z 9Ш1DqG6 _5]v@P$ڱ NfU}ʚp:MpMW"[[LsҰ1[3(hV*CaRVE)CkˉX0?cPA 1(3+, Tż9l,92l`Vk7`,+dٮ63\ S6kmߨPLQ[p1;Q>5^Cy:u%ơg8"y${3+.Nj^$`j/>cD(HQd2#iV ^Ozv!?Ϛ\Y}8T`d)jO~Qn5]6M^nS댎(P z5՝hz0M75fho"۶.;Ǔ uil&[qw)R Ue?FbWDfz; RNE$1īu{v%}ձ9[ .vʓ.U i.'Zᬤ'·D1eV[cf ]s[}Zeӥ,{zWt8h]R-4/0HDExv&8ݸ3V=\ ]fsPIt T+A"Uײ]]+b@+GwQ0e߯34_`. òđKwZ^ZpN )@WooߡCYi񨠋54=__?ӇT]ډ ࠉ˞s ÷7Y7^^Cȕ4e(3'*$֩VD#=U?YUibS,<9G%ҧ}fNluL]'B%_jf_Z欄Ғa)Uү.L[awj6"D4&?_Qq>TjGb)QID[OZ7ArUd?ϑ^<ɦ>X؋r\3J _?p)NedxD/&@6=xnU(W@~܄oHD!9UKoԫrҒ:F"X'Rɱo#Y5Y= }MͨIƄoP X[(t"Jnhjcv4(Ui-oVn5ۛ,1${'CT&Ld6T¨m+Q}Vku}'h%]43~(U 2  hDFݼOW]rmPgjUX5[߳O^63MNoJXiU|MQEIzF5 YN.RJIn8FŮcX bkJȺL鈃_,o=` ,iA& OܵLJrR9"l>3;,V#EH5s)q` ]}xW%xb<_`w9aMB66aRf$(scI2WPf7ϳz…"-;}K+C7#R߻HU!S2Ґ׍ԝR\nw3J`F.Ԭ cCn 2-v*]/l Dk)#¾b nvG(y ֝Vb27%Mz.1 +tUay| ,k9=\~Ԭ_ͳ &n„ TX`Q>b&}\v*dZd7ً֏>1dV>*@=GLy_t9 q_wΑm# j>窺DSeneTTK0W-s!Rvx| F@S(!N7r&]VyAɦ%TW_"5E0_Vr4LHδ`l9ޢQ3']t ZGɢDjbGrW%-Wl&[%NðAXi] fom{6@*Cc5 GkkB񽦫cK1FPEPi12K>]-^T+uȢdʡs(=gƘ٦C}v_i/({9Mw6mk=:9a]mWE8678 5!';`;|TV_P"5<g9;X0S#L>`O߀J.I^dyb "P {he C{5^Y-<"cj8leM"xDIy6nB*Koo"CL- Ti*PDq#v9]eвk"YQ**kr<%PiBӾabf4u`{2>>E8}icHnQ^AvQػ:ei|@UzlWcՅ_5Z5Yt&Hԛ,(S~5Atϊ)P Ngwc2 iuFfNŖ1z(:4 {:bJfx)RucCuS75]%U6Wi wY.*zvb{W%|eWf/7 '׾sWWQ<^̺w`7sNβ}$ۯJ~$s\!E&)|H *kW= 0%AQ'+4TοW,VZNtnPΌ#p$ASJI7`RiF9.=7moᭇk8F?ߣ7P"CcH0k%^ڦ] MUɴyc6-ݺhƩ8]W%8Y ै+n. 㴙-|3"bֻ!C9,o1V}zǝW@BzM;˒`b,aQIo 9d>rմ;t1 -qzCt$-lJPNf٧yKXĽn9WP5y''S"|ѧFCܫL̬8c=G$s UySCOOmBHЊUcl G__^x_-ꩇN:E>ѡVG.o7`gC{0Gnmksy{?05 pHo0?-ZŻpeWx<#m>YdҗQl5÷4<1zeՒ%F)"d.Y:Bfudj&BJTQbΛMHk69i^i+VX+ab dO".n.\gvcceʜ= =Ī2VCouàf|}>!v:3Ynb,7ucu`G!RU`j"õ]ayӥi5!Ѡ7a4[K*BGXf9kMU WE8].k(C]4_ sF Ƕ*^RC#V@` ]..ڔvOft/\ 75g5à+ۈi" V+duH@l깦FKҖG(]媍7l]AHzӸA; 6bWNӵM>xQ.g*7wZV[+5L827{c'MB0+8F@x{ļ뿽=_|o-M'YL#mM_rÄ]az|(=vW V: Aq@eWvo$_O.İ&Zaf;`a  2,8ds1.-3=DW n~0/.|!ЍZ5Q!%Tߙ[_Bȩ U;L}2hiYAS}} OP?Tgء܅0RI& &-;z]#O/404;DB!j N]}P{.tB̨/b\.;n UB gծeMe"O!.jn. 2U )ckݟp3>cP "٫rtc9ȥJՓIR럸/x: X9~1Uo24ı婵|9[qߠ_tzΰZ(LLoл/\vH>B3\;Y@] Wf]ؠ>"$zArO*9"S[7奭1+qMpDq"#3[.CE߳MĔb8OvUGp)6Zv?BȞ*ufA퉌]Sr2t3 1TfW/^L(NwUF{ |x+6h@BeQ ٚAMMR̲&r{r:6Mi@r4q\+NWM~ 1Mf~pGQ#thoF{Wu\n\X+?G Qkyz0 [76^+n*DN[@BO$ @ IxMM@z)6)*^r\㹩 sp-jx8&LcM%B)HQcM\`r("{ݬTZBkTeN;rCz~ݯ m! $CTKF)V5f 85GXMC1b9CUHcMC2F2/&<>%*m`Ƌ2E NPv6j@w$U|؍*m"a$cи03j9{ok1h2H YZ78Ng^ |У~p֫Fi)oJIwdAUs{@\?9 hUk مܐ<mTtf(ɛ1*DUoI-5"~7?V| ,_3_ -xTK/&Nҏ"jAE!:"#Mvx3|LJCCf"\~EEA9cyl({NPOvxR; bPUYQV.%DWPrI?L%kj_Z 0lV ꍗV̅os4nurKEx1Y+|Zn66'4osyO!8#a,4p&y҆H~#SV.oPA h_s<:oۉ$Q }5'4't^.2s#pj4O<'|`h7qiV=JцI=Қ4)?_z] Y&Z">}Psxi6s%qâ $8q_`*8 l~SЦ~-% ҺvoD! 5$~G{rZIgYrN%%+ɠ=ϵ=X7Ohφ$ ؼ :4R9_iv%r^G/0$-ub cr0;r'dY%*jSg%zKT4o0˪e,NSYF "WsyjY>~8)Ŋ;7RehEzU\dU? \Ht df#9XCzi: UR=&Yͪ,*b~v}N {.0|Ĝ^֧p~uR$b;aķg8PuiU) ߊ rphDBYzv)lFA.ƀ͙1ݲgv[_<Y7;=P0F`|]01$|ׯ,ʠCfA m|pC #.8-Sr/*8s}_e*u2r4`w8Tk~jPHeYrUe ov0xH>N0^p( :Uguꪓ{]Q=EwTLOS}//+)Y B`8kO{nԪwg]-M4t 6ߦR SV& 뤐}Beo昼@?Zϫ]h&R&Ea 1mSEa%kJR KܨK-.^rIp2uqz+>)$dٺSN6ږLN#ԐeE)U=bμM[}^Lb"ʶѤY¶5"xDfhI U\[6mZ+ܴWZҏhEKu 7g  Y_C)8I==F*Ss|B9*O). Iy천g^"N*rц9 )w-Vf{hGtzjntQ|϶dg Rg@0%- l"{cou_Jީmx1*Ƿ\޲n2v׿AF(\8@izN$NJp$f`rvUE(ܛE㲲\=FLǣrTſܺ * uʺT-k yiF׋RG?h k$w|, J͔ Vл9C~Jek)yu\ɫ6N-J\^ʿk5,&wJ_N͎7[ 'Sho5uZٮܷ(G\~q芠2gevEկf`afs ['ۂ=&\VL`f`=( h[sZ%PxY$FoX FS&߫xoEQMUFRKFNoBoe]& *aAx jUĭAH`$X܈f~NXܷ~CvrZl\n,5+-Z^UUT+Rbxb{mTsA@S<9\ՕC |h6?D,Y]ºɍ~}z6D~m XY^l;t'#T~ߤ>?_3wkC navit-0.5.0+dfsg.1/navit/xpm/country_BV.svgz000066400000000000000000000004321264204753600206550ustar00rootroot00000000000000'zHcountry_BV.svgJ0xE)t`; :p*^&i5M\7dU;I:߽d+{;Á4U'9;5KXWQ< ҳ>_nkz XiIXw@qns8 C8a׸M+>cC cX>G13 3%u8$~r'm\5?q@)ٱ6)8PFe}&t,3t*navit-0.5.0+dfsg.1/navit/xpm/country_BW.svgz000066400000000000000000000004651264204753600206640ustar00rootroot00000000000000'zHcountry_BW.svgMK@ q<'*mA`UϼL4JdӪ} T Kho9GΉ6Xh 2&&U ddӎ$kӖ3bU+1!BօTy)ifu/p i/FT&0)g&aRmg $*V7NzZPZ4:2NwGS0"ꔢnavit-0.5.0+dfsg.1/navit/xpm/country_BY.svgz000066400000000000000000000042471264204753600206700ustar00rootroot00000000000000'zHcountry_BY.svgY[o6~ހMѼdÚ^\4 vv~$)eP\>2~kt.SFh4fww~8o,K^7>wwMfpmt5y?wݶy'{=5 j7z961]Y3VO#^3pˡ953`y)V)Z|9c>t1$L:bgذY6l ELTPq>TT%z{VB3)xeT'&fbɨ]InX4lcZ"62 yh9J«ºL& Z'U-#`[J()+#})3Y \-Y捎lddkS'R2WFR`Q\ Ek fB=olSރY 6 fCEYyf G]U$IxcQc2ra8l%xɺ0?Ɠ6)2W+ww2b;NȾ֋'zK,x@3'0Yi\?)O"G1fDTXr)4sZN@+6⫔i}JZm::pulOY5pZ%AyU1!-DBϬbGϙ:C̫ٱ^S.켷9\JB);c{Ϛ*5d)Y(bkP~&>WSk^PB)dɅ#ۼv`}Y64IaO!uD*D,!㶥Uƭ{QY?@C1d5# j宧q25QM}avGĈK8&UU|IcsvZ;F,dX7@9YLD PurET)-+[f^m!,ոoڮpc*R֊RHUH<תję$yj |\Mġ=5ZESt1bL9xF3 w0riepAwgdB<3$/ J6%MF㙩I'H7@VgʊO{X }1C 1JZBwgD7]Gi RUp_-!cvRMNd$INlrSg (|4"gއ-d!B҂G"\).E$+t9~ P5J@UW᨝_C(\XT;qZxT;\"ԈjLλ(SIk*'Rgh[ mrL=tI]/nYIߑƘ[1\tuJo(r.,m(HެG |)sq.d9T6+ ҝI&w_ \6gѸjx(#)+@N;3 O@-$C}UpNxTXqf *}ZJKD;,:=+cV+jVDH_|twz}պK+:̽azN6:⑃7|v< e倿1Ϳ*A'q GCQ h;}@>V(jdcis#WpzDh`gA*ʶ%ԜU<Dݡ}`Ѻ@%Y㹊E?oBKFB*cVf! n3mmttxﱐD,y~* :_?;7jnavit-0.5.0+dfsg.1/navit/xpm/country_BZ.svgz000066400000000000000000002010731264204753600206650ustar00rootroot00000000000000'zHcountry_BZ.svg]ksƒ_Ԃ(b^r>]Yױ ! uT%eП.^ԪJq{+u0O{xJfU^ "+:B"˳?>[l֚Yj[5ŽObqEE]=#D/z!/=g\z6 K`*b-~}(&bەt-13'ջd .XȴEϙKF b;ʘnB+E><1XYy b9]ˏl2PHAs]oSg6- H_hQT/9{~odYިYs_(%)F #L?-KE*rLa=٩d2Ӗ'22uj'NEʟ_m xV UL$ڈg^z^j/@?{`nʡC&{n#Xaß oau'y *A}/oI rl8G %öKK.8 cqw QM>\⢗-gU[e[PEghb9V2A _7mb=d!'"oCL|mn4SdmA M"y࿸H>%5w-ph"2 m:|ܶxJR<+<-v2qMgn| nQr_NtLw/ㇿ|$Sd\$e!Je@B~۫c&]r @LjreGeRz9_K1v#Zo3[ &$5QXz));j-;gy3ky.S _n[vk W)yٱ[d/R6[vZvmR?EY.vjuöl˜R.P)۝ֲlL86ܗg<#O26>Y\L u.gJEf2A*ܨNeHrsM|&4fx:)}@5a'H #X-Py,%ڛbe㚢BXO?^Xo0;p^E_ΗxU.@kB̰X % Kykqs qUNƯFjluZd/wx?]t1~]>[|y?i6sw&/[ξ#]y3Gt|Yl|j|_7Fӯ?laۺ <܌x2wOƃb|m&2x=ӆ[{9I>oi{uM&_ l(g[-b/Iφwƒ_1k}}(XFX-aZVjŮ *.w^rA.\.}mQ!)SE_MP#xwO!#hcJmX^FT))Cчf3`\5XL?nB[Fm-) !aҘ;MS2^]3o/[bT-8*6_vmU &ZzT@WOKZm1ip"JcS-U0$Q&$OeWi_9k$DAa}^2iz"Ru>nc{&lYP`\\Q +hZJJI+l\&$\F>57V ԩqJ&GjMu} 3L("`a_&PP*X`|!pڠG-+P[k>,4ުoYO!*?C !:`$q v:QhKgW>*}ڋL@N4)- [Ҙeh, 5&k,2Z(s$>pm:^Yup}P eXZs^(Iȹ{$4صhO-u}RxDC?_ ,k#E/ AT ^>)VDV׭>zE@iT[pXUTp 0 7 %tK"'ݒaȗDxh蔗1Fm8nM=HA@v =%rZeu)BibT޺rID;AI:4e@/1?k-a[>1x薰Kǽh@Zڈ dC|/~7C@\;خCO !B؇ QWZ M &*J ރ V.d_m;Dtێvt¸2&ŗmG @zm)ݶci.Vwێ'VwێvJo8ѥ\`C`+ʜ'MǕPxZAݦa7VR"\nkJxUjL.[nqm.ݮCxX8]GrNHg 4Iqӑ -mJ}s\Kxb9>8j*oː+ ULK3B};nq<,}tJ/8q;H+t|mƪLhˇ@l9v?Um9@t[rtP^&1VJj3M0}s\Lw!KGV..aKIYAε|Έd|i}t'ݦaO>OyS~(gtynH&SVa?JXm;Btێ'9&o<χ}&fF{()J>{᪕t{'ݞaPJG6 W>"܁?A\T g;]ns<,}RP[v:*kQa60h6Wӝzbѝz`8U!sbk+BH*GކLx\> l9vVm9QNfP hOgZF2bZolXmg>H5pܵG<$ $.4SirBUW|D h.FZ,Hy7 M$oQY(#3 7Nb Etk)ÈnjI4+Ku{n%juahŰ&yA>7)Q7!.3-?!=9 (ǽH=ihW^0 "ȃvђ(Kz( O8-tTACRP{x+0CmTR;/BXFyX?T"Mf2 ~񒍗lh]$ 笎Z $Ov{W6@&2R:JRHv1. _.)əڻ!a$rJ%dOekh = +#Rr2&ͬ2r&9!Ђ ^ P&@ṼK2lLkPn(<v6dY{J2KYC@G]RFm?UmSRX{CՈV2 d@g CހS蔘i0ƏTFIBeϒMg @,&De*ր@PYUrF2`֑;ؠxަ m? RnbX`. f4x1:JVfQGWAOoP 9?ў5\b/ɖ^ަuWbДY T]F屈Sڨ%(GPk4+oQ 粁b})/hMiЃDUÚZiV'&bZbl^R ܰ*Õ(҉-KK: TzF+%gNU3%-}JdT%oBNk/U˫kaB7uCJw ϜD4mcf}}^ô[Q}R#G ž vШ\KKXRȮrl[ao5yeTifmPX"`J5ӢC&bOQe p A.%-'*$=ꪃɘ  :>ռ|*ӓqпDW4uE=cת'@!$+iZPH'O4m KpġN=CglZEEء%҂T-`bpʪHcւ {,k αN'sA.b!L3X\Աɋuܻ^ۀpGg'&MG1qEo&sآxɑM%#so~Ôy;D!$JO7Sԗu?'G!*;'=_ ?2iCtGghV_ aAyH:? Hofu=Tj(\5tF!ܣms4E(O8G]) ; Hxs&zV 稧]Q:G#sIQ^;*jQ;wGEkrnQ) *NkGhR9u݄SƯQtvpM^J|GWTݣ940tGckNO &:\Gu8ԬkA?b;6%\ٍ>KTBҳ"ZjrlQzFŖ^3S, k#E^ᖣos~#+5QTRQцk;Q=C_.V{޺Oz<}-/}1۠t֒K Qdy;:<JFyRΨZXoخo4S7Bo4to4{j )^JkWT.߫ỹZuS4uOE(R{3D!]QzHEf Mec3Ѷ:V."N?k tڇ?!)Syx}:0F'zzHWTwXszfQNC .N͘GK33{4sz\{4A[V0-;n fJ Q_آUGs ѤSo9lhnbNüU(1g ћ޼A9-tVmۈ}:GWT,lZ ՓZk漶owTOsj;zC;usTWpFh}OnP8GE\2/~:G9a-mpcz:G xFEդA9zC9Z8HV99NTx1*zG黁{˂6g -vi hy`t|%o_R= #Fua`]Qu4{T~3VD+OKCdYlwԲwT$"w+|15W t. ](=Q_MbZ yQlPWרXM]M=yb *ӧ-e}Þʓqk [\5}hoO;xy2+bwaw}?zFqSa7Ued:K5 طnraX7ap9s2(V9K졚sԅ3fZŠNZ8HeMK!m9/4;T=C*}aOT=FzCqiސPHtVŽ;TOJ'| oz3]B6URh;-/P T8~4P[zC-qRJ[Rw u^CYRP4f-[*_n+]*VZ\vr.-i]N+آ/S7*bMձE2=U>ˌۡp^û Lcԡ?0Uqq?`$N>vHE?R oӷm*0W!$_&ݧS;<ykjaBoUWrε5@"9yu.1ӿIA|M6\ADXɿ\a8ݙ<5 H&H|Ø=+m<֭G&x1b˿ rX 31s%3mMKw|V.@1Ѫa TW,!Dz]#?` vlEܺpu>-&nX5鲰˺7-F>L_#̻hI hWrӉ@&L;xƈb}rVW&;-k6OKL4UT꣟'GdmfaǛp7Eo- BqoZf^/ٟKXw,,K,-)uoZy $"ܫU*Y""3a@E|bǾe'j_ S奃_'vi)R xh!ݡ[ËҠ*X6(BeA' )u9 p_} xoPOj?Q$* "1g3W+gꔿ{r̢YU5xjo:*3 cШr REyԛ^KE\MAi.Oe5ZA˳8 \&n\Հ'm+C)=AiXcA]ҁ͵>Lן+&Mf[SV8B2c>Į3&v^ьMkEE|D mi uV9avjlP0s1aC Z4:a ;\'qEڎݟߔg8`6K8~@0(p%_DQM]+U+BEJIEz+n]bY,. Lp\Fz7kB!LV{7Au N+.**~Zzu?a/Q_r?*FWqk]]m^)[&R0O+^4elPe"U{=~!"$家.;IϢƸJJڭ[J*hWy<F%]Eᳫa޻zBzOjqn;B?8NWqjL / "S9v"OoN mO`_|:\O w& ]/J3!T9nEN%mEcUR40(W]"oXnEoiˏ?iOT?)OJeE4ۯn~( i:Y-{j\dwlίOoPX1ണH ~imZ==P\i#iuVS۠p!OãאYa<.)oxEuCȏv^Q`7p=Ke;Ċ>_3#tJV U\N:=A#SJjDO0ljAln'$MKt뵁]oZc9;: zcsO7/zU]#Ώ'8M$$p21ruEbjZOƴΧ]D t 0OPeͳOTڜ;^N;$]Uݾgl[ΡCKTZYꛡ]YEyu^qr~i,$=d~(gCl7`/!g}4&:6DNxɈw}b +-KQ`te3@vhX$N_~\'>騼SՔzDxm9)/b鎑O{,X.ELE)io]j]/n̔ܡGw]Q]GΏy>K}cfOt'x^LaO0tiVĜ˓OVMMldk%NNFagt.3Aq&c<kպ=˼Y:m#t{6j%]Vk^q D5 >* DZE!kφn27hxƹ4z$-I!x/ :|_]Nآȟz9Ƴ}Ӻnltu]k>+~t1+;'9HBKv"wݠsݵJi u}xrC3b3ئ.X,˸_(@t yD>V~`ՈO1u~BFBga4'[݉eR}m?QI vPap!8-\7Ӂ kuk_CWgX*E(A"3*ZaROط#Mq8Z ceHU'gI:K{oﻼe3db E?2_;޴|3jgG-Q+pk?G~_9_* ຌ=WE|_jlPHͦd}Ȓx)s>GǿGzvÖB|އ?6fVTQx e!a[:uz<ػ\TVQd!p5  ˦E3^Lܐcߒy,dKAj53^rcղC6ȱk9S41It+Np/>M’2ܦ/veA![ʗRyU7x*X#S _R״ʐ$#lŎ7-[Ę6j休z3RBi viykmoVZK0%@ 1I<3b ԐkEU,4GZ ?UA 3Rp5wg0VnC25delw 3 s&rMkl gctSW6Mibkabsc L9> ȃ0˺Vu+⺕V51p>Q njMTDY+W JOГjqFŸAIL$w &ooF)(u17#b~`W65dx& (+-kU zE^=_X! ~ u,e Ɨ(۠$w@&bd{Tn]~#L ؤ6jQM,!!%.ޠtBnizAؑ1Ss[yr[_;.wl催,rS4& Kwj*p Άx}Q.lXEq =rvȪ(MɆ%T/AYbL@n ;DU uE-Qa"J}Iug[MQsۦ1l)BwSZfVTHcցxyaNvj^.8-Z9h4w ]pr݄3c&Quӫ%@\P"BIZD'Cw Y>`~rej(lE7(F-d,&<ɘ)?~0g|يsY?>9vղG)'9z:kg%5D9k}xgmEu2L۬Pֱ܌#&lm|9>(sg7"Z;Fc ?JtiO[2S}B4K>E9*b`ͨU% PW(D!@ol8_Q}2 WƊ -X>Ev?xf6GF}{z .ʧG~I@M w;ODhv,O5U¹B-<o(@ {$EQ-Tj((m"vzBUŎ7-Œ 1YP}˳Ѯ~@0i@\-#ը7-+ 7j[4+6/ B-viX`S@EzPoC)0@Rv`ǾY'1ߪ@$^|4hrocC@ޕ{Jyz=;޴\]> agܓwՠtE"BUUZAC,y}t48Ŏ7->dbp K@t-Nլph} ;PՇL _óV2xrba<,jŎ7-4ZrH6AjQ ~]-W;޴\\E8~?PӄVP|[xrP?-bԇVrbǾM`C(ZjAyoZ6Vl@P]K=l4}z c;޴Z_jr?^3~;g( Q] (.aPܫµG5%wK^ +;.BOؿu_Q b"6؛ '=i\rۏ,.5I59:Q@ lB8/GދdzD5#`r1;`5y+aNN8shNPWƆA!iع2& IGltyy2žk87NJsjK SkǍNjW&$ P#=Af}ᮚ9SsjXdW߉>+<0Pe>pTIYG=ic&yoM#x! G30-u= 4,)Ift0?EHv$TvaX3Xa5D\[X1>G֣2rЉus{<ܬ̯En7#kȥm䨘act9֑6ȥّ#fx~^G&hN,_X3"(tF4 (5K/GE$MNDVU+A==4`V p:*#vX FYOCL,䰨3f$V&N0Q {8J@sCZ$ B1TCġob_.*Ѱ;;Zޅ[Tcmn( "C^jGo.`mno}+ ҵNJA4ue;ӆ{LX ͷw*ˏe;Zve².b۪CP"m.b+A19]߉l)7t:<\BFZCH ٷz;\ĵQ,W0 r"Q_t.>/fe=uQy "t+Euwk*|S#4/Ohѝ_rx7=>#~7X-@ UgM> .|H"L@WM?nMN_<8=7ˑWi2fEkəUksL^c䪌#_[ Cw;QH!hO;:"Ubs\_俿7$gIu|^3 Ck +cɠpfƔ6BOTS`2h"}zEy-)0=7Ȕ+\" bf6.U◴6_j޾p#}r))Np̣\#h<bD0Ƀ KW01\ p9>gvM‹.$($"R4\02!~97%̝E.JT4_aOKK*~}wk"xQ궰>!4 Nw [=m48{K>t~H;M=*Qs f*q%׼"ه5s? !pƛe|\E9/Gvf,RAU64Ցb^b"9"W/b=߃-!PޜP}/ &ʥ^#@QmnHu-I%R .\(XLaHƄlېG`];h@gq_yU)i* GzL%YNIh^OpwTSEBInO]^6ד'$X=1u#II` ,IWxLUhA Q"›P-m0O;xӲ@=w1ZrdǰX>!ў.)c2FGH*j¢}_] 'lBg.@l#LbTkbYEр Hg Y:1+|}Ȑ0˧Jtl[OEl4Z[Բve+k,ކKfz&W8I:+=L뤀AqXYw(,QdfzUk=[Tp]âeOuϼ>if7VG,F[Tŋɔ]jYThR 2PGVÎ N˪'H:ea=#e9+`=?SelXfTƼf씍~Ȉ玪*)a&(bgA ү-@+xJ^'as WV$1.;(ZE̱ÂNc?U9DdZ +x^ Tv5jU]TKIesѮ/Xfi> :gSNE>`fhWgW vus7!vumjzhXsnf-Ѱ~e=5uэ&x-dbö^5'7=j#¯=lk:Դx͐ZlhFu2T9# ú,"$ҰI|( 몛L 8`ðFuOZ,~AciW4%K>:`$'hT+њL6?L~ZݞD28#v@Mƒ!oaQ\EZRw d[#+4KfQMyQ7lX-3 EZԵ&ZIaR8uAр fFug,lt^`Wm[e)w3mŬz>]a.jzx:Ŭ\#vu,FFF[1) `vu֫ .g_t\ur@ӗfcus٫aݩMV*ܭΥI6֢K-G@òΔ8A~Dڨ`^Z֙q#?QwVAd nX'$^QEJVmh}@ U]xE7sUdY/3Z6O ¦Bd6WZ2 aRwBǤiFt&uâZMFͤtpMjdMjTMjҤw3 ûIMumJ-75/?4':]+}SQ}7APA}Ե'i+͠%t7Q)l~:2dŐKGâFEW/E-:JR.VtRb,\iQ{uN`dbO;{~?5ψ=E& ,B Թ[lfT$3]w"NeH;"oASg3* JSP*q++x5v AcyQ2,sK,'jՠC8PMovRF32J)bUK]eT'/ X]E+hr<'@@Ou "]~w$kfI/*^j:̎yQB' qܦWwNzF+'pt>kf>/ Q d]~IE.BUK'b.;zn+ʉLJfp'sD0d%}ṿvcoWs,^nu,E :,_ڠWoGEr+),S[4*:,%(uoz]&}G#41:Ha/6q zT6ܽ1ы\Jl=eNm2=ƒ-͸Z6G]w6lI<Q8e'κ^]Q/ZIv_"w(чp/|IP[$.k(6Al@Jy-)pL }9:V Ac8-W>vVeAˢr_@<߻,x%. ,R2-"ѽMAKXtNXp5ej*g%C ܀W+ͺrOcuvO ooqC2s<*ۡGĥd#|׮G^8glslы-ѾԤP`ntJ'{dOu(VSealFzmyw|IuU035a;}7m2H 'hjU܃9, v$m0 #FVԤߝ ]^'zlQ`b 4# #bsT5Q=b }e~S<Lo`*=SCpզ3=RFL ?}72˲5.$ѩa@f}-Wm=d΁65ݶ}&UP堹5f "ՏȷU<h`^o_jYHo1N S1.|!*Wb11HEjOSWQW3W>E]9D@zyY rN֐֘CY>آ) 2صvhIUBҧOu4-_<uȠ%.s a<0"ϖf!?Kz4hm+}2PlmrRb vi0_@CĎ-ʧEyn5VЌ uLTx7=D"F1|IaoZP{g#UWd !IJFܼlMK$vtHp(АS`6/;ؐ: DdƩUo3;kv"T=+9JKwLTRМ '7!Ÿ` @ )Dc~I9f`baȨ@vk*doPh1V%@I5D5H)ܹ{9z)f3'6K5us-ge+pVp*NKLgWQacB5k!!:/>CCSrT1tkWI{ȹm '54^ d _Q' Wd\XI~l1lb:VMN.!`rvv}MvM]7(TÜj] K>&65ܠU0TU0.9So6 NP#6eRdpIv,'yO6:JY 2%-v[$Ţ!WhM2~B?'y(VNK> Պ$v[biIb8} @=;޴ CPְ[q`]miO#I>`ln~P0C@ج~D 1?0NEDl wLj.m=vi)=O)d1EУy.dyჂ-m1%N^GCd>Ď7-G-[` R8è}DW^ REض NQFՖ@3p!f;viA#iFV((N%ވєrD rSk.UeFPD?GC`Ǜgi̘,}EZ*s5j%͕RJtR6en+QrA/5Hd'D P<ԟvVN 6N7?:??˿O7T*%';y7:ƈZFx\D- TL(=k ժT[c'YVZvu8Y}V K^BխAU["cg=Ԭ5 V.PHzx0\رEU$^* []Wf, x%gLd4<AƘ*p54r؝1uՁH;jk3~s`j5#.OLc3!h9EIݠ: d+ZiH'bbğ(!Z^VA`x iRa{Fwpw~DUJft}GB p --u`/YZ+u<0,k;tqrz?E5LQVs<4;&#>|cg!Entrb0͵'Cy:-<[cM:~v`k+=NٴBjtH׽?ŝGCey ґhϷ482{q-^/#ky `bxYF|xG#BĄ˓'ْƾx"B*miw@OطCC;3AԁNwi]!oT'tk'֝鈕D6D_LO0Y߭\ |[@ c %pP<@*1L0Yz.94עVzhpEXb*{?p*Y^4az -Y?/Gʦ|/b8DrU;Yf/C*-5@ϥw@?2g2 y Ah+SD1Y5Tilb$xTEPnxwaj`By2‘KLVĉ-uh N[x$dAsuGSwDAɶlt egEf]odΧ\-, nĆq}Otd^.hՎ*u!%^ x1iˊAZŅʨ2u/T8eR=Qd`!Zlf;$xcK%>ZK3<-_ּ],^% r4Q /T! J,2ޠH zw #Tvk2}-mK۠[jv4' Qў~<>/(Z9D9hK77h=A g%D bHN9{n*lvϧkʪmY8 Vʇ0Jl(T`FZN^,lPOu`,W7PHzeJiGa2ji{Fņmmw, vx[-w;޴q"kU'M'a;YA $ [4b\z myn 0h`KO4jK"W `1((sG DJrڝAT4:7d75 9@ʙ:rR Y>%iƁ0 Gvn'*y/F?Q<]U=#?y;B3ٶA#ܳ \q"j症?.B, Wطt[ u5~2>M!<"N/@Otq)3u p*NaNB2e(|{mc`/f zHl$ۿAr3C \KTP6 5Z㜱ihDGO Oq,tnuRH [2zĒekE s(ֵ|WzpV雩0v@;aCO'шRtBvМ>[ )ҘHYtd4l@fʣ,9}:dž-1OƝbAn~qjqoPLGEL_>"RWL UJM/ T/5e@0cy65_ ZAÓ,Geu' 1^İT<ȱ*#q_,I`Pl09FB&o0]!5֊ UZ2Ao68ІP)EEYN҈) iْ$^jf"z$t_-µ^j:^&l|Gr㏂`/EPK, `Ǿ ~!q ~㔰ߙ oDh898W Wf!*_ !.3RR>17'i 1OC9nNko_KW6N*LHQ_\ ݑ EܑZ "|XS2rT%Km viyAloppUf!{(<oa/{TD]GÅ3DJ4gaLjzUGRgS cjGs:MS1LtѫrwB5.ObYv32,(H@Ek#p*#yˋjzU#*ŕŕ \"^]6VjU_f,q;*A_F#I= *4S~wМMl$rZv ǎi|F63WiEF?%D|D(mm,ho CFr=3{T`3%ȋQ+UJ*K+aƘQ_ډ t1Nwf. zT.(nޘjյ6Ռ9S&bpngSAr}IxmEf:t0w8'K'IaR-0 o_ahNe͟,/;S,bqlQPnɟia]r䧖%?Ď7-_$*_ȴS<:?vܳ%vLT0*gb=-Cp0\\k/:CPYZZbZ^;׌E):MR (xKRFtb-7 \aꩬΘH"gC b"=AгVY0O};5T;LyW܇mDmUw$B=Q ,5ԤMXp6\«݌@:I=fbJɔ"94n4{SE7XE%7z2ZucʊB,u`L)`woRl6ETKc)J  x=]gc* }x8SPdO 5[2k#DK&9LexЊnvzݏx]ojgC!QX@vtgJY,ids~\=)2[dge@D:g˄۠< Ccġk Es0.v+`"kv 1_f@V; Is8;6*"g@3Jw/(*>wOxR̴>W}i^/ '$_)35gEUOor1iƍsiiya/>MKBrFE6|QѻY]YC ;yy S;*L& (= 5p eUMK&jq:cA-4epXji:Fq_3 vi X&m,$GY>Eu}P.B`ؑϚὋC Q ʼnbDl!gEaTK8ij.eUhiNsڔ2P̡ʃRᝨRw"Ւ:&"^-CK05"W1JC!I4&&..yX:X /NIr&8b*& kR/#KUiY0N;1B{4׿oz1W{ʵGC+\Qf299yY7W@o;&:g2 hfzBbg̉=wT#3zlQe{C8k}&(w a|i kA^Yp|F{&[ZG1jT/by ugc'vFMzDrAJ  &VVz5 TҼgVҀPXW|Og8NPb,}hXp={9%_w'T+Aq![vq~4W6JPB5^JP)ӈ7c)'#R8vD[e޳97)f%CZ?=w]DheDl){R81Rf1YGsT2, u2l|U{`[,{ד<(/,-i5[Ɂ;2Cjvu^3PO%w~lE v3u}/RT^7E>3ԱN-~\\k3 ^]8Qԃrz& +6GC/ȑݽ]A/ۿ_Gd77S/r_/vCJ׃\ J>Q+Jjz]gU eHcfeAHV~\ŮhuBCkLCǻv[ dTPpuPP->!lB"I>|/Vhi ~ v^ tYo!It{S{PDUBtJm'y@Xt &fNs|\eW( V'p shҠv9ڑi RJQuC%/sSʛ.})i|+QDw#&3m zգOKP6y~>@*-븨[[:"Giҋ܀(& s;ضc$ (5ʥ@J+{&ث//mlnQP gmz?4H5FDB%UZ={]a=-#bz AG-[jM/t@9̑qCQ c.`*QuS'x.27lST P*t?SaCiM;0BB;A1(:RQAx(+e1O|P=O$0lQl[SA+\;}QC/G8#,Z\1 v4$бo,$d5g!!'t"縴Cc˶}j.d:FKz62-kz="0qX:{ SeV\@;MyV#,n ~Ә')QM$yLjHd lb޸Jӛ[D\8^P*9rx)`gzO^snՇ([62 Ly*Kt{jhrWGM`!8<dUl7Ύ z:侀|+yu}Eڨ34lL.7>t9-u<Ӝin[f$uWNYΠq>A-Q!IqDq_8$%:~}s(9v YIQlfqH~XHay2(rLQCanȳ|vug)RE}7oKW>m\eTDZ06 B^e~6`5toiD)˶^Qucd̽([ıbue Ef.Q %b`_ JA]L0b߀ƥ6-b$rN~ xvB8V]KT<36tqeIڒD]a(P$G^+cK~p>vZpUO_ & ]º '+hѻ-D&i܀4!Ϻ"ycu [+j(54jɍ|'Fn.6ՂzE9"X}x23]B*<& Y?sfYbjҝ=xy^:g7~z!:353 HܖWu9r@O4k#72\ \U@_w0˞1rQ{\84~;3 mx2Κ#$a#{0 ^Xb12/$ɇh+BpyOk9Y(ҙ{48xuA7;#"/>rl@l|uC-$#ףCQ) ɖyOHBT0Q؏h9<{O#` qs'҄<HPj*'WP?V茖%}Sj <[{KU[f F\;\`W{Jm9y yɜr@Q%vh3t"7P_rQC*_.?ؕ%!L*7c.XVUV%CW"ٰ6%G5O:ہp>Z:ܡS8ގ* };rx%"ϔ# nv G-: )"BoJʨ;\eu6 Q_9n>Kչ39+%DYQ'B6j5rA1'L4)=8ǡpeF6_Фv%}.`^TGۋ=j_PyCVʼnqp \g{%h]mB1`ܝpe۞ RƄ!gSsYYkjwUFGz 빺sAg7G~t GNx?qd0K`ӏqyyA Y:7Q5ϟ\>|}+ѝn㙾{ˀ9U7 ?@3,Wg,۪hb{vWD9GM &5W}n@yB!y4|g%b|G~uorT}qvie2mb$w#wHcF:&9Fvz4=~JVLf5&.eHx.4NcuT~3 c&ѲLH&l7 b|i#=9jI"бo_[H3y6&?ّ#*1g *-R_PGI[ΔȃKؐNj|&g2wΨX~s/-kfK,;'RZlLq^FO&?QfHNJ/Sli=U/WQ u1QT5#K#XHAձl@[͠a jiIP3JB dQ*BTi(OȹiϳhSynX_?e=6b#Dvo7T7`a*D4ZK 8R ?2,C1C =zxQY3y|P@|azGc-PDZiVYH>Z14&,720 h1hEVE凒B33 .c:"4=_^hBGbqƊمO_ KD4;طXT▿GɎCkU(qNUҀ;zHylQ<2"{)e7Dָ&;L P1/1PٶlAiKMVik[/ָjG"fqu+P6Pm@5D. ;zʾ=_Fʆ-^)cQ.cU249SƢ*]ڱAQ "U"e,&Lel)ceUEaEڇ24owؐ(*j dl' eM)B6!bǸ!бoȴuWQSfn|u|EirJ,sd0h6SРcN䫫\+ ՅlʠlJu6 lʞ{&l|ftX:\<9R3 ])F/i#h#?36`տ l,cC'1qg΂YZXݪ/T7}Yݾiu=*#C[,GoVw4yW6#|ӟz;LNT#|~Z/z`1&(,M6T#8dw85Ms.Z"*`3t6V=slK Ȼ0Mo]L;[ PoOǪ n2oU5Zn,bkäNIevDdl,EmvrhNlIQ}/<>ʏ&䢵7 :T:л!ti@/)jm׻63?Na;m}1 ɶE1/7k FAl-TR0]KeN (^v-NH*FܨWt0)D7|HZvMnH}TKMjfWD>IDVLX@΅r |ķZMۏ |e ~AV>[ =`+Kt5ܸ/(B:W gN)~Gm,#3{2~, X%k]T猢*pDCL .b@t(P>8\AС\??QlWNk>/ ^Yb]> . ÛBx?xPF^p(S㻂:ܷED<L{ᡭ!~CtԛKnT@皈|i@?]$TPӉb8{i!gz! 5pw~um4J^*ue/>ݯi.\ !/UۓDqȼ?ݯ,?/ކkL7"QV{\x<9HCJhMN0Npr!g%Xhur2&${%wxG:9ПةН2woef iqQ-E+[ MGJ _Rӗf"f>;}V6;s{ gfǼ#:;-TYv$?.St}wÂ5.Ïv~ 2%itZehm`xN%HRθs?F tb+k4\C45‡)/Jbsau\_^SgXP0= &%R[~-6w-S%取േf 7,Aa3@ƖV`W`Yos p-n~oN".bpɱ,fƹL59wߒɦ>8YY8%LD-3iY| .`26 gLWMNcK}lɱgyȔt\=6X}+owkm^O:}dߍj֟~*ΚPqE4ݘ+)73%M~7>w-9X`䲧\3w7 ]γx,Y"tNM&Mlnv߷v"7<djeNmPоN1 *1_hX zH~N]xy,;WVM)5;ξ0y,ufB/ }yۏWEI`QcG)Ds^=qC11 j+ rx+9͂XQ].eA>/;LwfN6rwn_ܠuҾʎZ_]Y0it*,{D5՜DUVg%':,w#U^7a'w==d{@CmdyNڢ3Z;!E6SR47HVqNKjrlM t{ӘOhpA@`m34Nv,R=d_(:saK#@,2;i"{ӐQ(nYEUoM:;y .NXqDf~MgAZ Vkd b _zs4Vt@T~S!L ; 7 A+={?M~QǬu]x>x;13{n.q1˭ +Q{dyR#51 >+rL:rѶ* R>2:t|kI?7_5Dr[%e eSS'Әk.($RFnoUmͻrfEPٝ) >]:s5/GK]>iu50P42=@2_?&kޏt$Y}m]C|+Tj_aN)Ē{E]vz~Z/21]:KȊ_ć\'o+3ebw4 ӓ!Sױ3`]\tF{*x)&Q#"/,ݤ|Ez#&^CNK1h@i.+5=:i^(RyA Kϑ!:+t1Fc쐍}fKa[>= Lm7>+{ IPj#fh?/l#,PC3)0SnypA@b^*r#[vf ?m%9Z.&"ޖNt!1 XTN6܁8Й֛lX"j8w]?AՄ/gz19b2)J2cn=p0D.oAaE9{'î'1m[őQPL> r*D2=bh-9~-*Wn91X!%Iq~}Jh榿)e~9bwڭ%uSN G}2-BYxȤs#9P!Y@Tr]"{D`ɣjZcUkЖķnar}Gҿlw,q /2nky7Bhg}|mőRGr6*\@Dpxxb)cirU!7劲1Lq=BFV-j (l:slЁQEu 9?OQԨDP]o`pbF}Y,=)%Iُ [˩4\bwId@?Vu!UAY"X]fh$`b{(x[+]T:y [$wT]Y$IGF'O=|R DchTFVxLU#g{eQB'H ~R3 HQ Lq (`'b^ /9ӃZ/6qm(bCe`WJLmeNYQw(tisIk%OjXq>jnH%? }:.5ۼ1R(Ө J]SEʡ""yTzԟyѩ Z{zv=@~S>yTp-1P-Z <5ș0)j%O3+Hde6ÿD4} TUrW8ŚkXd xЖ&6VvgQ,ź)-`8T&`QGr$n伱G ~L]1YQu:DDp<^GXEȦaPO뤳@+7 ۔C)C&k8iЎr>B)'bAjՖӉ|w]"90 9e?Db>LÖp% ܐHe(bJ΋ pMXq0p\8js&GQbSx2=rL 4"]d%[$0̃+^H׆9b=1KRJZTՊjjW$X(R\(o׈QTJv<)úbSQ'ٟPY/c#gi׺CC3R_0UFR\-ӣQljNj˃hUEMZTA\-zC$pu,w݆sS4;|݂LzeP2ow=OS 6[`zAn:9A_{65@,4SEıϠ8ͮS3g$q\ ɥ44W^)j},۟DJZAv%JXo[Rcr^6ORچc:fxF]@L3Ac WEx=Z5ѩ3'rjh@a& bQ[-S[Vgq`#/O_ 9%]16EԿl(M k$xKzI m+bxP>X{f́͛OH.coRctzN1[&f<-3z˗-(zevw9X-Fa!!/KC#ξ+bbrT.exNٿ .u/xd5񺁚9I*}Գ)]K 're CuQEp <*ŠZ*m@^K+NOѓMj }=_Q<'OnD 4 B zFjv0ɷwYi 6de^D[f#߆ldއ9Zdg <.{dwnFa8_V ?@fU➶q/vQ./ sat!-|F*N*zb[zM$j /SDvܕ<]ܼwwf?fd֓by~.BkX˃`vZt_HK!S& PD(0N.Za4V;e.,hu& 6ae_]Aʰ1A$z89i_vi)@@\U ҾHQ8^⓺y<ƨ%EKJ$kbEȥSkd̀S+K282>g7<\$:Sa2Yq%?i;8i1t49TKf=ɋ\$=kNN@FfWQYm}^ S޳Tvv/-G sb D㗃gźXEqVs<0-&C"5 NHWY'MMHqCļS]o)i\wYYtTxYŪl0ml.T9[ZG8ʏatV(!M>Y슞Ir]%ol19#ܓ{prYsHeuī2+=Y$'‰鍨-o,:\dEd0ZYQ~s6c/QĜid'KK6VM=yzFߤG5&1'By} ԆSEqsB8j പeSi=“U"̺e{!gv]' k}6C%[mtA% uBbFSH5郠BLѤUpVK}fD.Y!_KBH,@_ ^[JBPϦJ&X^UX,/vKjlBO_}sNTUXInnpcdc&/ sׂ!h<WN6dnj$p'юf "{KKOg] \L2 ={U &DjH*3X)> TѨ~82*EL/*b^Ɉд:漱c]=-(w%ճ}ce換`Ӄ7ax=33εqC\&ZoIFe4L@E͵_ IVҷ9Yߴpol=xdhL:] IVIMSaQp$O=In-C@X[!Dq-4亘]p%IGwe@(>0T|ua(ą[4 ೢd XP@"{@m!avGv,F AvK2D?V$]3n<¤%tkymA\ݻ+KWV'}e!@PW?XYq+ T{_Z-ڂ.UCz.W "Vitu5ޟt.RD95n%Az7Kr7eMD䷳UmЫVcU Z tm_:7M}T򘲆ޏ]]Q|cw=8l6]6HWO_)ӽ |"~`0" LFХz78R!XOdi+ Er 2A4v:+~7p~qbS0q{)ӞF;uuD_퐞G=ߓq׃$b"z%M.YR|!J7:e9g]|:"8*xM*ۉV2UZ!79uk,*3DBl۽t QL"1 *#ai[`@U57 n@Wu} ????/Zo?q/^m;Ak{<{<Hlq,(8H[<}lqQ+[W-A-^8O->yśV}H0~{/\={<@)=ˆf{㴲!UljY/ +HL.[/ps_n}WEbiX > 4vV#JL3+<LpJMׂ(Cbb.Q"^%&CMP n@65qj->J@pld Yevj~cur h.5+6|5.9L:uZ1Ҟz(C"ҏ!^+XL o1Kl{7mr$pVg;Ҷ8ZPp)F+ SO'  Y2Şd8p߲hoMKಉMNi˲Ae_5JҒ7[YWi /yb[GDbhֽhs*IDiV dGOᑻ'K['TpmoIWB~臻۷|)׽v?ݬomķƱ#N [;On\vOk3<63ܷv̭帵=}k[Nek߰M˳6g+8AM[;soR9;[w~egGcFL}gע&޴߷4oŖfb{i:-۝hTDܜh~~)ra9B<2G4eEebi]ԔЕ}aloؠspUepx|^Tm||W}/.{gX6͘b%2}\.(/bfKm5/ȯQW{BhbQ8Xڅ`hCF-M}IWCg$ ofbM;{+.I_k4Pٲ_ m_`GmoZ&r vMd`5]iá%!XF_Oʝ*"Pt/@%y&#_' kUt[ٸx΅ ?tLXahÝ'{Bod% A  pbN|ZyBFu/ js@4|N- n`ʜs`[edF@ooA ,0)X+H[t8rLvϘ+F ЀںQKn?ipxbSO7Y xg _Dh#\#_ ȧ{Y # 3QV>h=X,"PU+ H6 u%\X&P] 5pn:Ddn"ʏbp#!ce/&&f|6` PbPUc\h\_ *B2]\$bbA ri]d,fU! L ȇL꫒Z9Аd}l4;x9L@VI%}lgEU:rd粐fZDx;p?˔zd%-QnE^U(6S&ViVQp1f=vÊh7P{JC(TE#WTmVX){zHv =}G`ElR\S˳ oZFǹebC=9ĉsbf m+ndېV5`2hSE4`94{zTYx%9t4j^v*tRxUZXdZ~-k@sAd\fHկ_\'ɥ J kAF|` d^tx{:"xE:^ D5yԽm|:h[!?N1P*:=aPϕh^LW lZ2rqEAQuEeAlDg; eW= w\4?pє~x_@/"Y6f EB߽?LH2ܪAuk6 ŀ{n@lP|(7K&MˡɨD  H0Aa>DC{/ӂ}ܵZM 7PEY :^^v>-y&z6}P4m4%JW ;-=vtA'$d 7򦄦D|E[P4 )МNs9ѬxrU V0'2*u H 8ќͧQWcN9wE6aPD}lQBp A!0(: A {)I v"r>%'5VuH]ӲԢ@o(DE2(T1)0pژv {5(z-fP _KaKpk.(͠@> 4(p6 o5(Buh&,A!f CbUntȈgmggUQT;&c.-DG:EĤE!x7;sfHMK P}0,BBmՐ6Z,jDR”ƄЊbLfLpQP-9`ҜJGsTI&G\JZs!QB6XQ !+3$:'0Dp1!͌(m~ O]S˧tAu dFD[Վwˋ7ŇcfEYV4#fij@ʴzKiDj8MF`է 3!3Nf"75 J6Av׈L㒝f> ]r$w4pzhi0/z,0^8FZZH'Q롚0N b:v(("޵hF:SD B>W9-ΧaC6w7[FKԆH Q5hɓ=EFg9UEv0UoUjAT.ݹDw,0i; Rog*r*e, 7ۮu?#nN8i^ UDVN`jㇻ#*\MN eZ }"|ȆD Ch{zoGwAUG8D~Zh? ̹z!&Л3P0t bO X.pF[#M/# >~$aLO B9D 'Xƕ1\ǽ R\H4c瓮/٥ kfi2evmnS FrӦyv5nZ;L%t"އ'V\#hjŲH1L8{mK];Kf^ O_*L&բ0@EG Bc,3d]8X)(X>~GɸR [p,ވJp{=c? 42 u̟'f3k SR54PwjDR5FM襖u4}Ar3|zL%l3vB^qwOa#1¾O}[NpIDq8֖۫=صc_7Z2= E)kgDϤ?(<9T)I:I$ @Aj`8BvluzJ =g(8P/0ũOYu9Q`(БZ= ί'a >i=? ƒ"0v7/vn/t"B ˂c%3zMbf:_wNI ai9߻/&%'.Vm:ŽS13$TNr(J2m^$fLΠ & Gc!2j&-Y\T+:bPTrO-Q%_d<4Y%zs䌫|vY/0\81s~zՖb%U52%50Si.q9 q:%aCo^mr>S4]i9$t8q)Ovu=1 qRX+Sr$cMOl]+ l?2?DQa5K^d(0c򹢺i0KIҚKL.u.B^pԇ|㻿IJ7#WXޏN(#I'F h2ˀ2xZ#H") K$Qdw62-y5Xjx fҞ^4sܡre)QӍ;?rQw:Y@r |PVU OZc8aߢX#:"ui9rXɜcԘ`Co]3KDx {5:x oO&{N?A~zpx䷝rȈ!E\eI?ڍ_<(0qaf%iYݑs bAz/b&SgآEǢi zhI/*m}T"ۺ?Z\Rֹ|Y^jȹ_X;%krdNd]IXg߶re}+nec/X2vLc+GJu+ʖͿHm'ol䬣\nCnd<}nY4رEu#kI$mdr##O7s]ycgIO'%(_|FEADž-ޖgr^!Z6{`r:ixb]ʨ# M);ޅ_Q%:h/a? ,xʮO !HdDjũp[֡;0g6F2r%?U%- Q58eEm,Eb Ƶ U!|Q?ĤzhlP*4xL0XbrvBNkMW`Be~ēֳoL@sxQ&>ӫw%ӼH”+DX^O@ s9fKbEΊq 2D: 1AT@Z(5c)~rT:鍷ZuNN;\ ƘK1tF8Gp~ i5h@],~J{, 4[ڙ갢W P 3Mo!KuރaЌ_2 NePjQ`/:JAyHٮW݂R*;6Rё)N8;d+3 qHG>Ta1,+UApxbbI'`g.f-nbQd%P Ns@T@ o(mmK9,_8/4dG%3E԰MP9pSP˘ˏEފĎ<ѫ47H!Iq\Z; "#󤌉w%c!=JEHIDĘ& SNr:X1 N !$KEz($ϠqC~7*fpF2 Qt;lm,Fjfdr;%uZ7r U$dYVS`x&4j"vإVBL>0{:S}–Y?}9 eTϚ u\ۜ+MOzZw2jIۀR)ՋzwtRV[L2-fQ&UОP#9pLS;u:og͜`w]bǛ>"_5q.' !RLkKgrLΖ8~;~ǒBrBҥ2ͿI9Ya?^["Ë7,2u!rIUF*S}!BʒyeY*Yd+:in׺Yd`}/J϶ȢT"qXdĹfߖ>N|,j ~u󄼘*oJ^`m}Kx>MN9TqfJ'xɘ=kь2-k53_A$:о'|֩mE}@7TLqnP2uugO hqPZB!(8:J/J\R3 AqaAKd˹ #xW Z=xlRYnb%墾 )rK6w(2Anu ;ԬIVӠr.6FaEQ XFRtS#ԤA MKTq䭿(["DiP"J4"VpcǛڑ^ދK=oQٳ悰[b5wTs)vA*rB6="E[SB@CRR͌?5nq_(SQwضO`ޠuB.5sLl %}HSNitb)@f;2UqH$/MYySòe]dzfp<|,RD 5xA#kw8ii}2Oﰃhc0U1adI$G9KR2s($Id_xMew=T|wb!L0J-Bba: mxXB PߘD,LCݎ82.ETYk]FAY8{ 𨖅CP cFb6#"X3rD(W KƒޟZϿ'+yW6<{Z߻{ ub{V{z ݃i{=@'[v}'JC[wtwwPD.&=꿲uT4vb:tz[O@v>m임d&9{pw*AXnQXj`-%'p[+; D(x>ݯ'ٯx)Tg%Kl%5u(=IWtM.,`VC7\IHF덌zp9%B)EdK"p7 n@u Gx4ɩxJBYE:$Ȗ/e˜ٴol" kȖceJ1!ϲ8yY  `j%/+KO/ьJ<3G EsɠD 'C'jnt0U9&f(6.I=  BJk ʧT"F_O7OKb8*+  sfJ,t *rp1U90,16092Z$JH u1ܩ)J[ee7=ɲ>p'%\k(=)xP o`#xN$Ɂ$TBskЇp4ܻ`:={a5ۼ Y\BC>wlT.Øa)K/r"zxfi"aǛ$@i[sQ| RV10}Z5pv~+ahH/]*NFMB;qh(I')!^ ,뾇܉/fõp" j0XJZgBYo=ޕlMU윂SLvtJ|Wߡ)}G!Ʃ6@!xRu( &jUٔHuآKUNTd&|L9I^2+9uPkv vi D sՖ4Q cpd|2B-%=/@@@/[ m{Խf|L2A`⤙sǂR""PBM1#c@YGfʙ[ ;Y2odJ~)/,Ϲ3䑓U.XAר']XqeUdV4@֕j!n1)[00kV, 5c-:i; jQl4!FE| x Jr1h{n6$d #%:a$ÌPd!RFhQc:co%16;1zV!&v#Adϵxh/Bc)#J1?%"}Aycpˁ!TVPyZo6@rA Z@-K ;hʍa:2I! 1`(yyt +jCC1K\@1QpF#76;޴t JԎUQU'; 㰋~}ե5y !l 9p! /cc o5^UEL1P7 Z$dYWO-6("]PkV swz(K-½@z 0rDkIK=}G9*t}PҐ,qy³| .?Ǝ#,9d riى"Aň:N3:ގuG]lb '#R=&F>M`A?+2Sd/bED1(ِ?(Fuϴ\)(,YpF4\L/ 4ʲisnIj:sM@S-GAKVPZR(~fuP⻢:'{S #Sc(՞(o`@1ęCYYI\H,;jV4f6'j&rׇO:;'?F1z| 슆p*j3 vuPZF-:e~D5ie\SM (4-?M8UaXղ27Bp[[jY8k15,sͰl~hYDe۔쫆E.i4O"% u㚮a /5,<kO"G vEE~*+^C,iW>*rTL:) 72 HjӮȠɾ[  viɅ;nWT*G " "U#^X4w)6SզPfQ P-Df[(s쒏(+~Xp-`A711t(PK,H=5Y] [h9XxY`f@ÞQ8Cr%?aP:wQWo` SK,9{=̘0:Ӂz3%ƐX 'WCBY4#PCfDpь]nJ3#N͌v3#. ~M((?+7̈^Χ̈Ќ5x73I}3_͈}e5#|Q7͌h4G/NcA]AQ^"Lf3"jWlVe3=ݸc~vaDdyш]w2?Oq^rFc:${yBٱZPPun:9yQpeֲb<%>:kTEEYz¹ELe\(~:*^z=)j3I8'QK[WT"J儈nQ PŤAȖ)FΘd`3FrT *Nn tMç~Ϋ6! ^xq%18[ (N@`>,Kǔ\@"j R4 M`: ENZGA ci{OI\Z }%xt`|4CՂ߅$*qK Τ@ 0KgpiJdb ݞ9LB]I.]zQ uםOlaz'((积RB;4X,тxV:}R?=vwC{+(jjhǾ{4 rBBۚ^CG})U/bq:hk:8DDJ^{tqZW #;CuM Z&f;׸>=[w)5c1p˪+j'_9,bbӃp^1Oq{Y;5YToIBPE3v9&e/s/Hx4Mg:Ĥ5 ؇;΅>:2g۽N[Ӄr5pˁk^U8/& hB!O?=8 QQ,5:B#beZf}?yÂG8oP*&u)B/OqsYAHnK5+>S4u"tROu*a8˓EBh0fz-z"ty9?ohI=v'$'PS %MݔO{1r`'qkUsdKj1vjoP+nq.ԊWމ&4o sZKy3[L3Q/;uʽxFW8t,Gx{. <4iljtO1#7 u\嶇:oXA&yݜ>xv]#K#׻vA<%$a4 4JmTuUO:تR5QnO;]js:`⮰{Dh wR,dB0 ׏o{)5mq(>iG>W:Ch7PJ?$<~cvbnؑ5✾-\xpL01 j@-atd]37swײ.lCwxuI"1na{\GX+#5 LŒ5 &J%&jS6ybbnBoΐ`qj/yf2L6,?X2;.+_C WtҬ5T$1UNGkz5yKN1Џa"@cV>ӐbůAh@VPA$mK^Q)?LOC&j0y5{RtFGqCu|Lp<]xRk$ W7y>>e=Uˌmx*ˏc_e@b)ꌦ̴?"tURE x2={ʡ=[\k7Čf/(3탿½\džVwׇmFۃt /O5 j)Ml]D)Ҭtס0 LG>󭥨]Ы/N_omzG|yWFqh7FfSMИS/ЪbtΦ|/xA>ෘ7:8SULL2Kf7fvIDw]ƴk~<ZSuXy t\ؤo.l,ReZ6Ya|KKBzk=Va3یp1'D}wzFq W9x1a yOiE$TO(u<( ngP༳oA+T .H"s@ ?ӝY>/`Ǜƅ2h1dHbel LjewH? @_2Wdž§8ppnKͅ^W+R {Vl@ㄡu[j`טcV1$Vw*Pn։EAJp1ȲT2O4~DZYĸ0y4赪y^0T?:K. UoR7B@_PP~|p";M*ڜ_޽7-!b* i0/ڃ@YZHX{t^^ZX4".ybqEߊEkb7`+we;{>O!ڑ{_ '7sBI1DÀsg!R, g鮭NX"\f!>)bbEXĢv∪X,qlNFS*VJTTt5R16cF!%"(˓ -x4)h?bE|nT, bQtyTxq|U٢U=kven2h3*4$Т*(*FMe^lf9+2h|xqEv)洵_u|E/hW/`9lʣ/'o}/@0((H؛ +EY|u~^F<Z d+,#t<[WrD7ړBmHDM % N_0!UR88ںfjiм-?=&pܩW#C[ioÍ A6@U -6'*H65>YFfI<"^Oկn \'rcgXKkgQ{>ڦ#:{Tˠ#^gO 6kVӌvi,FD˔:zETdYTZM"}7Ni_`cy|WXрU:2Z@fu0`TP|hdn+ڥs:Oҫss$т14*[^6{oJf4A%3p|!m/-R{?!8TZ-^(uUb¼Z^"0bĔf0ho5&P~=pehgZe+= M:*cPwJ*&05N ޣ 3~TtiGƟe}-f^ ׉5F޷6-14&?/q&x&dK,V-e.+5mݬʲNkX\cR2ɟ5|\Ώ/ ,b1ם,;i "ƧE\ m'Id]`7 /%|/б o}[|NQ^nJchW>M@ЬO>Aаٻ啁yEEh6L%_aX'j.a76kI'h_as'?A\-u;F޳L@E*ic)`ח . ;=KMܓp7x]<ɕ/ PK4*Fz6j o2I :b:܏.kY8sv*[LY:HsAklԷ+2|EvER8&" J e0PO]:HJq\dլ7QS!P>}x???|甁]Rп^ȿePI0{;tV"Le n = ~:b2(΂ud[lQH?3.V)5 NBa+}+m@-T:]$ԫ޷i=gvF3Vt2,;CeVKjQk# zۆr }lQ%|-zwB`4jz굋o]dF]7tg]"EY놘 hJycQ .ˢﳺ|E5<` -7ylћLʌ~<\[ArA6i/ř<@m3={cvբtDQ[Q)2/9Ǐ(GR~cgO,q4R _=!Z0-/~ B]yMT'96a_kƔ.;QۼQ,h;=6,h e fAk)hOqɮIЪe> Z>Jښ`N;ڢm)jSڨ{E*jsMƐ7vDw/j y/jpz/j-kcrg7'O FԎp|<`nPGakK}ƍu!.6[wG7[_l~܏rҗBrԩgOk ztףbEx cjSY@Zb֪Ջ,l؛pD!SzE ..,#UR|_qLeہy&anÄ0\qŎRg=sFMmqڽ tlǡ-U ˮ9ꆑ]n#m® :Қo_#_:efʆ-vøё/ džF_xdZGb". ײ$|NWxAbR2 f(-F+'5lq\OtX<^QOc3pA(+E475U;:@C{?h6ewtsz`g|.`bH\\9N#Fb;;7èRyxSE r<Q/`0+a׬.~ 3FnC;F"JOU(}NHIPk\ur :;xp vGvׅבQF}3yQ a(Soi睙YCoӎi9ArF1IxvcpՃwDU/U-Nf η*Pk uZ)lbD}5Ai{3_N]dQ) kH2"sر)Vẅ, ϳ޻V~+ر vRb7\FB'HQp#NOip87tOZJݖ5gv#:7q)jxs3eU՘8O%D6p$٭?>·쎶A?f>M*&b[ ʡɛm-07jl 4I!;z{#憑Svq<W؏*Qt-'ro51iPw)<ޮvGPQ-hrd~\Dz+v"C782yz𜉩ݧE]!/ 9痿_~?N>?> Ǐ6,Q ͣEo3D*nNm?AArCǭUxD䦊bfX^ ,[.gÐ-v|0 gǛ&\d2al;㝍[\_,oWzz,}}D{.\pΈ(xjjp]0uƘ5ۿ~{}fhݬ'>1r0^[͛}}y:﷋34ε6rn]QI=Yf~5_]]3N͆8[b˻?=^}\֌+Wgo&ד͛z|k}5~}뙜 _,ZfTrm=/oc0Y^VWg_WqߓG+Hޞ?\ltvC?|lG Zrl>=o v_xfo$15^~\#̾֗m@_r~yZ,^oW?-/)%#>J/QջXK|I-L;bN<>?=Bd{-vquܣ iTPIפ fj_k?_<7oܡu6>;iׯ,߇uC=Bgˉش̇NurbB~!/{˿2|>Mo[(}ckYs5#˓R6)',uWRhb69jr^E&4!ق J:S]\v٩!Vϡ I|lp[fI"&yP? [2q(8̨GB=X;[ nw'K[zSi됎3@N-Ȉ`,KZҎy_NS]y?|#K l7pX2ÔlAJ6R 눳bArp @5l$6bRZ @2qʴktBe˯KAUc$͸%EAMQ"dt< #U&)E9H[)Z%HR,ȚRo5)CTtyϠL&7JЊrEiߊ#pD5X`" T`2z]>eAP<,Yt910dEHL"E3S][1L^t \E#80ę>H36 1h?4(mrf!dNrLMv[P-II61dTB FD&DʳwP#lr0TYxӉVi Qm?UyqJRP : [Xgߺ# XV0 u[7j  0քF[GpT C 2LA'v)U/YB2Z,gs~L2`\NRGQRΥ8&,h f4$Ҙ+*B01%FF5mk"ۥ,iś+uZUȤ3dW!F o>- ػOlY\4tM;(YU*AiɣAASLRLYSpQV3Ǩw ȜEf^)f!H|-9SM.Le9O&Y!)Bc]GܥdS>0sA2@-G[TUTuq-kkEb:Im5iEE艝^Hoo %$1s&c<@/Mޡƒoo p&-np,m_efFEF C99!0[@c%3%BƑ>޵ٲ(ƍJx#GHm;(PjTsػI #BauT2$|eE8(%"u[z7=$7HݛM:d@rR!׊.3U%)5[ݡn!K՜E#Ѩ EsC"QU뺯Ru4EnvG#A!uUېz^w B g|4>Ck܍H/r! S&[-l~MM/w[S0IGMI q$nyclrE!2ˊ3oc0NQmh)֙*TNTػDU_ۚ|k$Rg@$in愐 !16KΈkTbP0(k6r2Hؒ!5%@n{Fk/og 6CXO;I-3 $Ȧ(i > Fz 3hOѻGƺE[w&+usFiE[x FIA;PHOӊ v 9)ZDf6TcSu'42&Op 1Nq NThz>f|owwZ:S*I?!.K4Iz&6V9 ٠S3&N>h'|U8Ed:Խϓٜ0Kݵm"TFr}SCtX?ҵtN߼}:DD~=b,o ƴ,)['qߡ Oȵѓ폍N\[#_go_2navit-0.5.0+dfsg.1/navit/xpm/country_CD.svgz000066400000000000000000000012471264204753600206410ustar00rootroot00000000000000'zHcountry_CD.svgTMs0W%%:әδH#3mN`jzo-xz6^δJiUƮϯLVMku6}z[|ӵ*9InYtr~Wf[<;.IPveUz@T !߬H*pm_|FUi˨L^("?DXŬ_tzwuCUz oaT2 2R?6a+4gkԩ!)lA0 i (-@#V HD >G&l1Qefb zJ( 3S`F\1CfXy.Pi]@5K F7  O\f$r>Y"pp A(dH`H (ު ,p7႞{M(X(sKȊI? yWnպmnk= Q`E)&,I(E(#"Ü}P^,KK׶Ujy>҆+hXBNDcM.?x=k7 q.7'֨ VM*R 8Uwڹ8ɌlZuڗĽܛ6M}2ݮ "mVM{8rǻ>RTnavit-0.5.0+dfsg.1/navit/xpm/country_CF.svgz000066400000000000000000000011411264204753600206340ustar00rootroot00000000000000'zHcountry_CF.svgk04ؾ;.q K2[aM liu-d=tNg/+P]Թ(E,U.oofoߌMLn~\_a%o?|82ɲjeӛJ`YvY YmtҦ]eW|.]ƎYt䠌a_ʘ#YN'Rlef#ź(W> f!mE"weUPIr˟կOrS\E0"l߳WmQԇlr="{WTU=n_O A=-=[xVMSVM=`~Jѷk\j'!MTtyU8"埻n`R@J },v -pٍ3>xg `H@VN4i4:d0[@c k2f&'JGWVC,&sgT*}^{mJ+kQz7dXiZ Yo!1XB2eBѨ0aMȯB.؀CHr\Eq˙oXP/navit-0.5.0+dfsg.1/navit/xpm/country_CG.svgz000066400000000000000000000004731264204753600206440ustar00rootroot00000000000000'zHcountry_CG.svgmJ07;kʲmSvWRj;Ld2ċN2>*nUSsdE)T]r\gNƃ,}L ڮzKD !iX= 4f{C6Q,tjW$ d)pS>>= #9^Rc|v8RAWk1 ~˵G"xNE!67rjv]a醂۾~i:o((Nȑ0L33RQ`3dm~6ɣA"\ 64U6U =*(Ved %xhiNs63MIkpF.A o!Se%sZBg luzP6|/g~8wNOxj2p'Gjذ?pgf^S,?2-ޟ,|DUD0$G|Gu z1zpe~15aGngǘ`N&mӆhy)zn=+~_?Nclv?7BkWV{navit-0.5.0+dfsg.1/navit/xpm/country_CM.svgz000066400000000000000000000007241264204753600206510ustar00rootroot00000000000000'zHcountry_CM.svg]o0rHml#knҀIt .I,RrLSq>(U<؉Vh,R'&U:*'t*J%Gmjy~^Xm<@ pHf ? !7 v BqhlN*WF) SbI銟GFdq(zJ9iW)CU  q4^8R06O*dy[L+٫A#k*Ko(S@C';HFѯ\O.KRz.A֝ʌrl_Kd:Db4G4}l+Y%t^r~xG N`5tUk[Vf>Mj,H~$7OgL^HXRb6뉮Lnavit-0.5.0+dfsg.1/navit/xpm/country_CN.svgz000066400000000000000000000021711264204753600206500ustar00rootroot00000000000000'zHcountry_CN.svgV[o8~﯈܇m炀vJ#HYK*8b{r-0Zm'Ri|n9yT1CȑPiVf9$E䪐3T(a~3/q ГTژ2wUR\ndaG\.\t{pKծJY.tw "q{z!bIBRKc쁯oQC?6Sy谁[k{u -?1vS@Q-6 H6Ro!ثމʐ3$Yos|fW6r8!s]YyrODRn"jQK4tmZGM2dԅ_ho4jmUIg~Y` [# ~l <1evn n/c[6XM3T}@՗d]J25z#ݘޠ١ 9h{վ`WU*y>RC8ZuWT'zKzZ>j˷G`hԧ|ٮ.gSpr;5WCs Sܻl8Rwvz^M%ICnC^s7{[vkګrl1,gSⓐ0 {#0L0e'ab`QpU9x>'܅+~ŔF0aJ 9v][l#Qn紣bc1NI=s7cZ navit-0.5.0+dfsg.1/navit/xpm/country_CO.svgz000066400000000000000000000003221264204753600206450ustar00rootroot00000000000000'zHcountry_CO.svgA 0Ebk&*bQ'h 5`7RnJ`㤌CB6ҝz&[iz[<3 ]c1O~#8^`J>KV`b)$ f|U )߬OQF<4և 0U40navit-0.5.0+dfsg.1/navit/xpm/country_CR.svgz000066400000000000000000000004501264204753600206520ustar00rootroot00000000000000'zHcountry_CR.svg_K0볽I'vAt̩5ihdU؃o9{dj`/;&E1FmdMxeaxu{=O2|xĉw*vD}G$j]SHy$p'}Ʀ?cXq`kᔯAI]+44Zxm ? ֺ,%H:Y_6&SE5M4"|߰^i'ԡ7+bGJy<hk@%f navit-0.5.0+dfsg.1/navit/xpm/country_CU.svgz000066400000000000000000000011771264204753600206640ustar00rootroot00000000000000'zHcountry_CU.svgT]o0}^;%ۄ4$ MJk7rV F 鿟m ml9\`~]L ^r),Aw~Nn\@ _3o+k]0n&hFTREZcӈmaCFiKdg胑S|Hmm Q>kmnR QEEm9 )I Q0X&⩆+4.Dm0O!jK`(xe:iLJ>5u3#0ЯAno?$^䂞2;鶦X|+](|h53|65o@+V+ֆEj`DΥ( #ځ8kr^蜛K3Q S 26B?ۣ-W.+Y;RL0Zf'<&Cn;wtw,0ɘ4iO|@񰳱%MeۄHϙ,]e6߆ۘأM<sƽ6W,W|eVSGY$aDvksY Ɵnavit-0.5.0+dfsg.1/navit/xpm/country_CV.svgz000066400000000000000000000016201264204753600206560ustar00rootroot00000000000000'zHcountry_CV.svg]o6+8&,kt(mEnإj1E2$&Gȶ@sxx=~sw[[YY$@iVPvI&yY8(`o>v>| (&Qtvq~gE ;ErKe5.>F}<6l SJpҠ hR-37Gz,,:sm+~w3@ :~b>&ib;]=eK1QZX;<&Vey[qn}5KY>B^֍֛(jfzl;*;u]` ]\h eU3MA2w,8N\ݝqm7nSQv.k=iY~$M#,4sݮZnr;*⋭׵ʫi7aUVQUwulgcw7}&ˣJSJ$VVY`M+s^weX=2QL鷬x "+H|k ~A6L*=p/A8B 1Qګ~ȁ ͤdCLp*1h֭h xl(ro@4X1*@>}A* H מiJ3ر(A=siy! ̀ yABDS _=!/GN| eB`n{BpAОcTTI:@ y9B~swH.\6tIO1ICOQv=!'gOBRJ3 U*4y}AUjb=fq756nnavit-0.5.0+dfsg.1/navit/xpm/country_CX.svgz000066400000000000000000000075171264204753600206730ustar00rootroot00000000000000'zHcountry_CX.svg[koّ_| d`V,~h-ح_s)uv&1vgݪS^x*~rRz=̗$jYWf717ۺjyl1ݵtT6}k9OG 6?-E|v5Lxxܮv1Ϧm3եϞ?mlZf#۫}U 92Sc&1i>dno*<7({u.+iyuۿuNT9o{,?6>uh}ConNϛ=U Qc:}J 4:t52.jw\7O.|_yX}v LVէz{5Z8(8XslmngjˏsT6 LFE) hFq_M)9: @fo20 D ݉U}QT7v}<)]`gvYkӳT9]‡JؘRzv =fͼn?= ;8u®m)469xi)]9!;XiѥiE1|h덉%nb}ӳPƟBX+ǟ藉_ڡGauq9tsΌenKѢC-eqlcC1 ZsFTkhyL+gY )r*Zli.Ve4^f8 o|2TaqVVSҟP0 -tNe][4ىh e IVDn|TєY&zC {d/CjHw㓌!5i[h_e3fheF.ua\x*PZC%gJ1s<RNI NΖNk@y-3dE}=262BG-n'H P6́3, *{jXX .Ɍsy5}~0\t9QnlM(4:eq7PmLeQ6eL4~΀rIĚJ0%PcvDX9鷩C4 k"(>pyDLrLFD8u#{@o-jdhp"sF(G!dFn(m Hz/Y ,uv, YH 2cw <nb7 nÆĻ -~OtB僕"k0]'#e"3XȄϳNpde 3Įʉ GHMtAQ#> B^x<Ӆ|.kìmyD)3X|[ [C裕ߌ6O@me| EF*­lXDDl%Œܘt$eԁU,=s,BbA8RPΗAD('Pn3qluBLb]n&$ld`č;U"绂$y(QC”SRW$N"QXsB\>|Bosq=vURz?Q9|Bզ|ЅCk>xC"iiυ7 ?E{qW#H\HM.χ'K\U8 nwkk$ॶxG=]Q}>ZB)>Dr!y!6" >`H} > C ?~}q|Cv:L3`s9I.F-GcVh+,_J .m*ϡ⛘P)4#0)XVDH>{RS( Њ*^먖V1˕he,oP@[}y^HHriv`ϯ y*@Ŋ?%PԨ_bm>BT| QKd] G0#<:{<Xp{̚őr9ך7V3s`'. 5?f@U4n &l۫z|9]vU64\]n]ㇿճ?~[ߺZ^ofu^V^>;h1|6aȇ8 (.w\$AdTU\!g{|tq~zx_޾{w_ap?鏷;nO79?|Or<_^>|s:}Ƿ'.Ħy޽Ap|}u\%|~~z/-Ow/ x<|zcwJv|xxx9cQ[ϱڜrԦL]tm6kq89 v&_ھ)`ٷ|2sa嶏aѻre"ƁXqmp3 pߦ:m0Tæ\U/sCϩr%@>\H'X |c;À]/&m9l!iy;FF@P \_̟I6ާTGD91{;|}N-@:i(Ey#O_;Xjq7kpJ+5H&/ ~/Vh=haTU؆,pnI[Ŝװ3 F|K$"3Ggpͣi8Q+\9a!1yCHš7Z+ pVʵB@UA'&i4v l(pM;!Dch勣lDQwm3켾FQCY"ƚ~od7=;PIPNN%CAَTiUщVPE$ %2XbτHXrRJp(jG}1\ Ra||)\(^Ypi?M܅r#Ө'9T3PXjRf1  %(yQH#ԎI&-/M5g$'ʃEwl|PM+ߨ"k*s|*:$ԋj6*@&{Yq2c;F_YmU%O ]凉6{EBc$ '_|1'*M Վ.F˓[j(ՄV'p'ny0C"j֑@jhiՠD?WLwY}'Kb/zjn$v:Jo;"q mFyR3|_>/jNP"qi@^`yqaWluQ,j[GߩW+N_Ňk{蔵ƮJ4[wm3% vuM48ޜB먴n󪳱+u53 u[u[u;ed --%^ڝR uPZ(3eMٍ\ )Zhb(aZK^6&aڝɊxz3hNnavit-0.5.0+dfsg.1/navit/xpm/country_CZ.svgz000066400000000000000000000006461264204753600206710ustar00rootroot00000000000000(zHcountry_CZ.svgmQO0ɯ8x/qS6%E%4chM{4-q˦ul|;W.Ξv Fƶ%aiFZaim/mUIZKΖQqRm\`kܝo>U voW`)⚀h纏NӔNyj^F izaIa/Ye!N3HK!{hejJѨ>$Cp$Jۇu,V^Шl+b`¡'HMv'\lczgDǸU$rlx p^t; #K2i?} zq&a1Nr<$g'F9P/aM^UXF?͵COnavit-0.5.0+dfsg.1/navit/xpm/country_DE.svgz000066400000000000000000000005051264204753600206370ustar00rootroot00000000000000 (zHcountry_DE.svg}_k0glXc4 Vc Ӎ=mXL V26/ ?;O;Q7h4. dYg[hPN*]&C >%@JVi6h%YEC\)񥮍8Ҁ[~݂a0rۻB%dYY7q#BC^ESL2`.קtQEaAr*/>[˽2!pέT߂j/0gL)9Y̿?Yjnavit-0.5.0+dfsg.1/navit/xpm/country_DJ.svgz000066400000000000000000000022271264204753600206470ustar00rootroot00000000000000(zHcountry_DJ.svgUn6}W/]bv]+m>4Ki[,$m{)Тkf g9Ϳo+tJb׹Y mXY%k;tՆji rcl#ߡ2 -n [ -. I~ۉS{esvͶBX!c&w"q#NɇR﹃F$DUWjH^O v{*vjݴuE4v HgTӪxF;߃8]N⯕?:Ey0a?1 ڀXQ($WXd_²z]{X4}TX[B߄C}[{dώM6 hfɎ҈uֱ,#AԒP|Y 9ٽL3[^eYgI] 9"|/?l+cBصč"Là 6}HlQ{C }Mԃ-srZw*X^6Pgj5Jɂ^l&,e[6 =}nKU E\)iMHjGviej N31ȿaY}@+V]o4%ucPbܖScC仄X&~L8ϕ4ĘCIߺqQĠO4J&JΑ!iL~~+RNXzo c navit-0.5.0+dfsg.1/navit/xpm/country_DK.svgz000066400000000000000000000004641264204753600206510ustar00rootroot00000000000000(zHcountry_DK.svgQK0+׵7Yl`;EP7f8k:M }<$Ϗ :մem!(ei &"vg䮪hj\̃"[z mWz{}D/qJ<=8fD}G}MAƌŴYKsz8x90瑴sN8]M;sB6-<&L퍾V UYh+p 1|}rS;9:{]ZpFoO@navit-0.5.0+dfsg.1/navit/xpm/country_DM.svgz000066400000000000000000000155761264204753600206650ustar00rootroot00000000000000(zHcountry_DM.svg]koȒ~We'..X 0P$1Ʊ I$&)rӑĖ=D<&OW?\,Vو*5*׳leFz3O׋r?bZL7yrfQz9=9y]uـruqsߊkק٨Ivug'śf}Bvg/b|Տͺ)WW(;QD )כNV0R'KyX5y[K bs_/7ǪoǴ콵'f:[OZ<w9߼nQtzqyzs6rl"Gf"nBUs(YQAtON}M-`T? Lm/W__,ֿo7rKF\M/~[lZkvsvfq]H)ݖl[l3|x+HnK"ŘqxK+՗7Ӌly\~x/brwk ]n>$ש+Q"X.M)+T 7 2Q1seZCBWYlO|)}"06IS\iC.ya >vzUŭjK0埋S?Entz9M<]o]h0O1Xä)eJMИ-ćH9lihǘj9{E[ bهCt&ix0@ylO kAB( KGj )&tuñl(V7&LcžrS t;g՜1hr7i+ON JRf8y}C'$:c+Y cö%Mn ي{sJAyl2;/T+J,Yl2/K,z Cb|J'Ө`z)Jm`V&AAW}OYۘnޞbHzFUxxJ'ct'$B =-Qmr. &d %(Ŗq4̦F'A*0!&.p0'4I F^B;uaJܕyVu& #+*QIE5!VU[.Mt^=x.$u[y)Jk k c&)A|2B̃c2M( AKH;ft,&YԂ+c i(;h@_S*@yV%W}9C_-^htO5d(X8Ew&mI2l\m:67 /Ex b|JTZsW$[q^j_ cc$i"lcBZlP4BvC5%Az'm4^NCj/-XIs9L|Cߦ$~=ɢ!`="+PmK$B+Fc$/Tпˌ+W*2-'jAs$ xUdxKl R'e@KEOb`穋#z=i|<Ŷ23 3='WEF6@](1,&!!ܓ, ?=',mzhV¨plpI>MRqaQ_>at֔fIs$|h9 &tL〙?[lP^J4(MS &|ժ'llԸ2Z[MiN{AFkAgCd"Ew3Or : C'myzh4Z $NT 5\"ZQa 2 ݙ*T`]dQ'hz:O{6IhK)bT&7S<?=('@h&ūYBS@TtT=ְ]Iu0bmzhDaZ)ylO!ܢL.)hP #Spga1Eb|J caTk]#~BR{[ E,2jyVyvꁙww\V$zSQ(*D ށVfsk.eUJh Y^vpJ`AKYZU+aicL]}J7G% *Y~ZD}Ö S쪑YaM?ӳj2C/ D?)KRkAjŸJoʴ.|j A晌7MaqPYF{}iK᎕S$=[Z9kEkh+dΛg۵λ7 ɰjY|LZ]k/ w-ZFN8Xu)XЌ1Fml=vquuy-.Nfst=Ӳz޽-mUpw`ϼO?:cy46DG{x9ӑ0rle -ƺF [e_`P0Jvͳ4HqHC/rJuڃ#j8=Z:Gv./HWԽMcOHDZLd'ww7aCÝW"^i׏tZL2zR|2dݴ-cu"p?UQB$eģLuUGk]hҕL&D4EAt3ᑍ3NwB[oB-bqBa ?\Fbx)(8& @,V$gӼY#f)jkmRBVhzV sIEܓl'xtuZYi> >ܷI`ct)s4wg}c`ALP#!$,rdb,Fp!|_ܼ1lNgJcIʕXK3K#6m Rf/Y^dFJZ?}8w$ڴi~uk՝`j ОL LI\ֺ%2xIP=l9QUP+WrOʽP+V5QOʽ@kR\~vx@dcC`9d)11 B>/mT 5`qhH m8Xk %CZg̏es9FLơR}l pZ(PY[hEwY^^=nd3Pv:tFFQ8x#V:?&{7tY $;(+]?pۘ"?F oĥ)wm9cY-QJerϛe.e!^R9b-ǫe-ؠ=7v20qH|ZuE鱂 ~|?ߏUF}Q(r Ul TE88+sN&(lò*-_z{zr;Oeyv2ƒ6qbSB<qV%~7~ 8/kY .XjPABNc0kj&>x_e#=u<8Y+IQ^lS3HȂBF8ۧ8+<ǧt9>8)ձ >FOQFM|)(T+]SLaĄ2Oe$)*-|)إ ӗ{U&C0g=m =B@9vf #3&"G;5#tG,#g.Wx+AV=mgSu^~{{ZA~4hP FV=Rjܽئk943X|k9e:!:Y妆v[ @h0ݫ>iZ,<:ĩh9HxeMZE N?a ;}[W߮Zg|Z7R+5)MjIj%XnXhU6Iph]aq=Z ,[(]وk9<^-*-cԦ鈵wC3x^D;d)?S0ܺ! >1}?*nE(Isʑ#Vy]2H5Yh91kY?Vo-R*WEuLvi9V#غ! ˭IyH[S~eV[C\|:#Y.O?9wrT9 ˲]&mEv}YɄ⃧?,w99 SsƖfb//'Ul Fvk#GPuZֆ=*7drTj6x{ IjWV=db-ہ 0%f)3%wȂ Lz(+;?{J(B #o R\f@=uyؑ)#= % _GpL[zVp21E9 ;YڕS:m`6~EL9jD9LjkA\cY?~w.6sGFمO e$X9A jú>e,OQ7r|ٓZOFNg[z-UH4 ,nHĆfLdY 5=nz\l';J>@/"w{Wܸ C(* 9 :=VYqv'He G+Ņ*3 v1(Lbci=֣n3Kѣe&еAX$BT:Z2M7{zt#t&#.b;`2-9vg{B2)zK&[(T;)iЋ=+Ht^Z{h]1JَyoLLTjV'a X=TF<າ9 2ppg4n n8&CJ}=Tg3y/78a2HaBTS_p&9blGV:s )G'i:#S (UKSǓ3l:Fq$#1Bi{؇FzOUDSaKF&,(dk:`wIpnxarEf//oW##T )og 1]2U2 V ݌/a:;r45 I9x?MK@d?9SSNin`Bx`toPoËra(>A=nt6%aZ2Sq"Y%|R5w=`[LlɝG3mQp1?XbԜT{c:0l<LJW0~ɛvi<'@(<  Qs7d03Pg#Ԥ`(ȷ EJcka(/,x}i{+g ź> Ba$$cbJbwf%fU#qkK ;D}z}'-yGz12B[g^wr헻S1#u*76933Մõֻ`}`%dlD냻KK棨{>֥).֞L*ώ(:3fbn)Pەg` E|fr%v#_*&2.3n/ͤYL;u[(kHgNgG+ʍ$y9H+*dU\zdh+Ib\:=3Fo)VoXaIتat341f7 >Zpl(&Pf\U&/F \xoq66"XOآ 4Ti:ǣ?_豎Vw`ƨk.fqÕAld}R$Xn9lrnCϹ5;w>~V-w'g;  P =9gV3vO5;??navit-0.5.0+dfsg.1/navit/xpm/country_DO.svgz000066400000000000000000000633431264204753600206620ustar00rootroot00000000000000(zHcountry_DO.svg\ko[u>e$(uugr5`y @1A3)eϯZKeqk{*.~gxw;mWrq9d9-/3֛b:/pwlbՎ7t0 q=ߵl6wͬw3\n0`b:vWs7]l綱Ujդ.?\M<IsΝ;ÈflTTg9w#?m¼?=ӿY}4tg^{ x1mwI>qήo6~M/8b2N?ٮ){Aa6#Wt94xخe_wOUݟ7]NxMvMƋnIK{wx/.~xܫ) `ƒ {-W/ݦ]A;֯>϶ӷ,0[Lg6Jwv}3ƨˡ;ʜm2ﯖi~a,7It_q7 Crykh_O`/Ѥ'[á|M))>SMW+l>~߮r|^&};nx:ތ#ޖ:(D?|U?dr#p Vr9>Ϧl3oo x{zm`_N6`w_b:߁/fcn~}^gݷ'LƫU;^|||`[~|8Gg'7uUGTv4o0}wշfwȉxavy{5rjOi=83r S?!v+ 7S?8tq_#u}{~w:팓&ýp\䇟_OO{Dl1<|ǎۅh1ƠOsŽ kWt?Drz?aT9/YlA #ZE|R띵UܝxpYB?M7OɄ>ìLY.JҞDZ!BڼokOuw~&z%ip֥ [?E],C~J1.NRl='s) `? o$;;8pc>}KRpaZ/G78x,_^]R9mYIe}}.ğUƚ) dr8Fkr66/Ҙȁ#w;{^c-[ƠFw-Eƺ])&~EMMwnPL.SImz`>[ {?B{f݃<5}O}#1MI1.QIɈe׸=FϷ({B:60"-BF,j2J'K nrM(H㏑o_:tb92m(҉0#3S|(2 9Qwȷ/B:o$䲥tr{xD'.AMzajR#߾t &)e$)M b('\Ivh>DS |>F}cbnd>0)­ADM)zx!9Ii ;O&K_ xPS."oBebxo(xStlQ(g qٵu 5FN Ei%O?bLJ@F8<\F 9z2FJ! DezQ5 0b "-gT&(]9K:!ٟÜXnK~='S>w ЁҀ ";J* z4^ RilLbG0"6j6Gi3HHV dZf@*#F/&'PCˡ\()#P { 7ZTb8XrK.%$гdj `c3Z+n!,4FzKahCosFH>|0@PV5B[\d~wur,ak=RyDNI-G ܕ(irS"2y XF+ X,waW<9R } .R(,U};9cdOg[FePQh6[jɆ "~APj HDW#DX" uu^x:@rv8Gbz\R"{!SdJ9(UOR`P~A(~҈r%Q@`XkeTwIQFk2"+:A8Z2mUi=/: j4 >"FjtH۵6>6,yTSqO݊ '<5+>,^GZ%#S)b2OFjTO}'}"M+`ԥxR|! ʛ*ǣjv+Ć%*SfJļ]ԗG&eidgj)r(8ȋXD!0IIO ME-7 PΈXXI[/NAc,ZE@# B N ̼c͂zrCL'$2νϻ_7z?̣3_ܴf6;g  ΙDmA(\1Pؔb]7砎Xi6 PxnQ@uѶ_ܑI،Hk!;uǫA≁Uz!z_ kbXw+dj.HF('6$?a.@Ctu[\C(ynHE:xcvsZMaQZJ$ଉDwXEs8b5 ;vlp MJNEEH0."3N$p#@N(QMsj :!7T(Ek!SW!"rct|l3K JtXpu\@ $V"):K!wiC"I +?:7*-M]ʂxE`!Sz(n%Mhn#"II)뼌) CHˁerlf3D , 9U+@^QWm jA;gK)b==Gi @5pPQ3$֏4ӠA:{bD w9E(;}8wV[mzѥ<^p>KwD!bB?)&I*-dy>!^ƠPH?iTͥ_4 VoHVokK,.98*UR O#{("LDR 5EkQtvWCU 4:~dE* f Ltj.^=%s*P5p=OA]T> uA #RKAFGZfC!s$4Ǫ?tޥ8c)d/Vz/! Iq\r ?%.-^7FET6f;R Qo<\  pβp;C1+CUݹB#@W 2(O]aܦΐ!9Q!ڠ]Ⱦ(n2mKhRVlx8Jeq;fMь77]V`$FH"X+!#P0] Q!M"l) CVa TAdxݼ콚.u"*Qk$%jWQwF( xș*rW ቯX0At6@6̴l+uUGA]:8D[%&#4t!j8`TwM'UŊo |@4T^\]H%(j*eD%4'&%V.t 꾫zJ٪!jxRKhVB:J2Z#i%4׭H87b>>Rɪg}^2ӄ<(b8#)@^s"eMqYC BbHE?QzWP&"HLJCe?2fIp6FEroE(mJ   a"`E@\NS;&!Yr%{ku;p9)<|P^LԌm43/Q,g#ώ8qAlF%`Z1%<A_H i~ήƖvuHd@fi&ip}K(xpVDaG iS*K| c: 䫁$ f7`QHd-$cHi͋(fİZHb`5PП7vCVE! .$@)TGtI&5:_:/bXkLEI0BDP,}P|Ll"rjHpr#E=G &,zߓ,IZa&:wNKGU!0Eӽ31(j+Z~b</%D vD>ԧrpB[5OJ+ki8(nic/ NaIð *]uÝ:G939Շf,Xudx"*ڭ" ,;;>}Ҟ,,773nSu(p}dYpUqvlzO,!1 cc'ymӨƅn>ӃB&hըah\U蟫Oj,(Hk LT+Q˕幔{( ;Jw' S4,Uw!/iu1jUz/ʼn%AʢFb|BT(YEdْH)BЛ*B٫`5 ]"(Rj>yO 3 D55ՖD&9/'t@LŒ B:Ł=toꇁ(jMdZثe}-@ʎLR8QQŨ`εvgM8\?FOݦѠ-ոw{_%?΋uCh%X@Ё-lbҝZ3ތo#;B&b,!;~r2\0yjT!Q̘] ١ kA|D0}&ETu$GDuidsÙ)&ڱ~ oջöf\Yٰ\įy|tAy67jڅeB4\*Ԏ dMNo5HşQ0QN/N#5WI2_M mqPyorpR8>")\Dٿ(m0:+:`0u"Kmћ3>vΈ0J3;ʙehBSȍ5PLv|fj RI >ɍeEF!mE@V_̲H^_-UB~'O;ʜVF{^f#NMHI#Q`+5(yZ];|RD -޶.xp vތE&sR&]2`0_mm+D#DhZf c3)k^*ނlpmy5q04q+SqCXt4lFjypbk;V&"ѱ~~.q0c#B/6}.ޕ?T1Bb[`eD˹k-_&<(y&?&:{ZeGiт* bb곱)(&GӤ0=DS[FL4X5쨱01$Z>My;PІ4q5YNVthi]JPgcؠLS!brK6 <Mc 'Zᯅ4lM@J0nRQ^cdzB8`}~tWWX>AD@芩 $ ʭLIC!/|쮖H#(VZDyC9 f2urc*BDz&.<$|-|єS AE5N{A vLB=Nz͖LC6<@D!n**m11GW+%ֽȘC3wVR@VLǔ%uЎOu, \Vo LtZbSܶ&a4mIf3 ~),wnd : mfALdfv]&S  lرzVt3CP L>eS"'i6Euy׊C^T S09124D=W;[uzjM0ζMccr$6;ÉS$2K) 7vPۄk! x^D&rivy˽%j%X/r ¹ZVy! w3CSiB:Hc ߛ>E$4fxXDNW+ ,ĸrG-)_F{x1RlRv M6n\E!.q`SinӎN>?Ew (H&Iv!ˎKX}OUYRAB"LP6Fnfѕm +  _n+X@\SFYu}kv2쇣"eK:{ZNc4z)Cϧ%1qW1׵1?(,f%Cmb"U6ypy>ȀG dLh IѠG`K.N Ϭ0k8]GWÛd*aIVbN S&%+aaSy̾ Pg6P˚H@v,rat4KpW(IdE^;zlXT> Q=jH(؄4Uvb%.O%zt$Nʅp:ZGFcI6"ӓB.۲5 ]&9i)w ˒Tzhim=/ ISK&CR1zqe9Qy`NljϦ}W6kk=>,7ڨ݉FDTI?3k%:z SQWx&yp䬒e#˙m=ˎWYx)&j ^JLiLTdvs3ہJlƯkz]翪_`ߜbyD(iX/Uk ?yD=g=*vZ`Jqbbɱ("w`1 ix'WORSnK웢y8-(n6܂ֵZY<]++ߴ eivD]\_Y__wQַү:vd>/r+W[L+ZnۦbXfOaN<[Fvyo/lgUCy CE责O)؆R/<է0TWz;1Nv[DFjbΟ+8s̟\i~.>~^~rh3G!^^=P5Ȍ"%Ы\|?~bZi_ڻ}qKqΟIb  \yNV?l'Yݩ;;rT>*dc~&jNO:W!hk@Vd<^w:-ɾɸyRO*nI|Wz)BFk/x'!Kk!!BHBB[S9€[Ǒ? qa!)-=BSn,^a!( qB7sa!6~cZ{ ./-=Y{?,ִsa!GX2凅[Y{?,Ŀ qj!6E$!Z[& mU*DՂ̻Pz)#XEsWrUp-xoXՕOF1*['a8Ư)'KӫGɈP"a=Z%Uߣ\ W[HF8{h3ެbkvl43AL, mO(am^Q;cUpy>Bq45-AVl˪*Rz|1>HB >^kWD#[zowroIڣ7ޕMY`TTyY o@ism,Jk-B8HAYOOJ_SmKZ-#jVj㣫XEIwo(Bl3FH'"Q S'v:bR.k@6lbX'(5S_EE{7-FаE8(\F_WT[v=#oufnUW CzKAue4uulP6!#P6ul"KՓ&{ Jbݡyx9)TMmd TuJ':P3;^`fz<,ZLN!.kA\TѻY^rިx!JT~S5x:"#rMI:Rʺ #ΝQژn\.Őh*}y"&X%,O_`4P0IQ~R)Cĉ13GfjwCI| h]7wM~hQ}ߍT.MZ`.j,ϼ_֦či\;T1u K%p_z+i8( 6I4 zRRBNKB=)6nr׭_SsRJ[lb34EyHثT%ʿjN׃z}mzIK=nH2b$wS h8ֿII;"u~p>\4Jѥ4ZIh]~-g||t  \]Lsz,rv5)-/]cf.!wyqlHuiDi:%/0CZudj!a~5ߢ\$)A1siNQd2 GJN3{?I?I7椣J|$~]OeG} {BDFe~QYS ۧ/ jFO BRb{49؈ M%?p o'Lݝ ZUƠuP@+>GL:_~w`vv2my/QʹWqTa|&:{Ͽc<56N^>EEM/m#jQ8=3[y>דZ~BچA!QK0YIDž&hLb` ogl̎+Fnއ3 (R Kcʓt53#mNZLO~cM )6$zO{$}Ѹ=R脅(I] P"l,:C$151"VZ9DW,Hƚ@m76GPSIceLͨ}jNhg &8a b']v4 N  46+5ZqjAOR!_ebjRтP졘LvL+-?]LɞddFb0CSd>=8&@ )ҧq1fu;v%\,c_)HC8b0$/(%e`$֩zB]Svщ$36A Af^*S2tp+{ /p[)wBNTvz z<[βg^1_Dm!{C|K.%Dqw!2᢬MxT г;>{Jj<Mϼ|>*c=9laX?I0cfA8ItTod+O:g)WwEOukp#?3Q:<;EmOknNt$IxĎ-Fqr)[LSI{{;MN[M13L3wXP'oVZg_3;:rbC="YoJ4MYN8Ըk]FcrSU4g5^SXjs1 gb*PY=ZaS՚NsƐ r"yl;hݧ zTo~^jc 9ՀCKK0:_CH !xOD_f)wzOlmkvؗ^sVEYxZ\>3G4YBϋgFR|N_Jc7˱cf^"zx<_UNK^ 1!T2) D=m$^ FrCTVa] n֯ܫf:džT,(5і$'rhW~4> zscA}(DgR=MK 7)圙84 XDw+=FG Q K7|w-G>v=\!'=V ʷ%2̺UHw6ݫx`DcB~?|e-!)pE 5cRrBHL)jCbkľNTtF4Q~#HN$KF8i$)d|]F$Nڼ"<뽋;c2oS _=.&Sd;YĞ^ ,Neg!6|5՘=;4/O]Xcc#, UMRMl#]U$DH0YWk\Q)ZJpssL6q^UeFznfl| C\\g*ao-yBc$+nCJ-nPnxEMI|Dn)+pjfMDbㆰ H{PXYVaO|ԋ_ aKrrTamvd7fbL3m+ʉ7yeC|;<2GէSsˮʃoy]7u, i+ab(P:|A>x"W)Bb(ί@N_"؍F46 qɣht#,!x"7F5=JeyͰ╣bbIuuGEοG>x"Nu>V&R&9S+w"vn7$LO ӟ&" QUqOlfG>x"7ftѲ{GMlQ(ٛh#KW'rcQ}.Kuol+cV w՘N$^ވ‘ rvʲy4dJI(PЍNdy-?SmEfqjWdQhD9=OcB 4nira.VxER2?g6M% $%՚7˔&MU 91K$GJ*za2Ǟġ$8 N1{Nz!$CM(7) Rh{)/1^S="zHƂius 1͆#bU=0eI(_r0=pAwOE{1>DT@sKY]!ve[6))I1eVyґf6yBp#ypaVzq)QrE7BU/J!px#AMUiJ^xK%qEFZ y[F{CC=p4b3fjbDT'҉"hI/l|hS")x xZ9CkGljE:mۆ)D~XMZ{Ŋju lg?<}k$:wi=oS@An Ә8mO?: d_3,鄐ħsG̷ɬq v9Oz9#E-VO$ 7!OmOG>d~AwO9 qw݄DehcE,$DC-2h|QX-iR  럲”lALVVnL }Zp8?R꼰 &c3z!&I5% dLWQ# l_n̬\Xwq:wSJ%I/``"ovo8U6~2[T1N±^=-W\晝WM?|b[כ񔼗:m6SC3r`D"Zsb\w)$tL"/gD^++2 vXHMגQIqQ$<ڄIwȣx+ÐG5 6Kx{Uc/P, `+^l,!-]C&nh ʂUTӿVOtQ혊:(}GwOQiR#>ZU)v gmvOQ}]Ҋ, #IՁsuϦn[YZn5FRlբU!(RRi'601\ry۫gLU_S~$=t"*~U;z7'ƱUy0< \)#w\nOF Q9 &b9'H[/N äر] M 1eeMSѓ1O#*# ɸ0o+fF$c'}R]E3Mv9)';fr џ)cLXVO&mOΆL`QvڭP}<9(} ~KĖ.ߺb)U+prI yf[IfVd_-AA`H-{WqnD^IrqV ^ #Gi* .A [U/WDqS CkQ~Ƈ%<` ' 嬺l2y=%.N_T[I qų H y`%='恭e}QJ_A8x|ܾx: 0UUUDo=4g?#^Hv6 ;Dq1\3![}LINۘ'.qJی}m%7b!HNy/}͘`!MkىUWIlS!ةBÇ`S3fʄT!v@mو/dW.oSNLF̴6֕`2n >DO$}겝URK!O ;d`Bx%H}<U'TuIk.u8_u =_razniy`NDxa5jIG'B$V$tpEgo-.yPjx~1;C6bd'"? f&݈h)w8(uY6JAk'`O-1ұ^X'z=EqO9!Sm?UYqw`H{ϞfG85xF86 Ówh9Vo~)eL#V'SIcUlR3)򦍪웒 Ub;/JQ?{caYSkF[z)_ZD[嬒zrM-+lOCN홳et| W튽|%Pal}#7f6m#E45y\M|`V )5| ~I.ֱUgM( -_z!?[%iz'}c!%0 jn#D\MV [Zn8=97k Pˢ8]7gvN`bwn1Tb?5M?L1_D^?KPI[7c =3iy.l.vmw/vH9惘q(YLqY^횝Y5DQvI]$>]{Gl!,y." s{j04R6f ]kH!~jhP8`z܀S&P baX[VS"5Z Rlo0ey/G.$sGV!E5QQzOَeS*Ŝp#pp 93e<\Q bPCod{~/)΍W< ڮѼ-8EUGٗmt9N{h뼅a[y\D#o{`GL5\8S|~E68gr"$j^Wl^sRbԞA;Gz~nWzOٝw18,q{5N;бy.")b+lģ˧cv2(vyA^&Yg:*QӷrE^?}iI/PX"(%^?vr@ W? #gqml1+rN-{ٻX1l#E$淜ô#~۷vn;b?3==]OEp9X9eώi$~nXI mfZ| Z{:# DS5ґ*آ=E&}kiE㽧\BME l+¼cBOAi[K6Ĩ Զ/ء>|F*rA^IkM,id׏m]O䏬o?O۸E^/E@;.0,yRӍG~nWm׿ZP?.4H?s@F4miKl*3򜀡 7-܂Dò'l'z2l,àjDZq _Kt3h#Ӗng[ǞC%c^O,]%%6v߄~:6 Y򖭛 x7ѧ_%R9PĈ=3OxccFi'ٜx3_??.?%:7H?(g2F~U)L]?vjPߙnʋ65oˀchO={Jсg|=W]Ǯ~]Mh{؎*[TkMnmjpSS7GJ~ѮUŚǟc lcǏ=o`I1>6K}p_8OO](k ~6?z\=eڍT*܁0&սv5I r:܋9u!>+tv,ɨ,fZ0f%RyAɗ/L>.M~ ڦD3D SC-R?i<仞{'>ӇtWTh1B'߾0F9*"gh*j)frA/L~?IMsA0CxAɏ/L~? FT_!0O? q셈e@+]O~~aMHD6*"+e(yO Ud$6p)cSψzɤSy7]J?bLy)hTB%59H|O.|]!=q贋KK&U:{VLz{mE}!ь +N=&a)Qvxk&`}GnrFL@5ne+UxT=Ƙ4LH aednKA+P?E-I73KDĆ~OJO鎞yD 1׮A=FG,rጏjZ #ddUVMI^dפ2BLզʔt>U!MnUD S2N8#QQJ'L U.Pi|F y AdOmKh.5e2#nc([;47,%l_}h3-DY Z5=ˤᔕzuS?:<ΒNWf"~ PRs{}XJi |yzP:~<-=-M2׻oT3hihcn:҆{ pܤ qFwoM5Aj+ΠI3IT^j5mPA/%tZM({{51=eMkd})jYgXz(SVbeIA{`.I0(T}8ixѼ|MNUU3O>nT@@3Ytj?ѴȆmFU%ޖ LeMإc֛NGarYWRoj4ZӢguEoθH)4S*գkنe0д-ZHچlc4_2O> g6~j<ԣi}}**ho7tsׯ51t-3{8]InI;7,u]a/]q-8i}O̘M`ﰛW7襓v$&L2nco5/.ϫԍ1Ⱦ&uy-HSاg:&:lb?^#,JE8RTͱ#0_W>i*mkj˻gZtQG6!N{љR)g\L,e5OڬcXY)}#@qyk,VSr77tz~XI 3_ŒyAI@}*$'_6IUXI頩6* #jQH뵵uus +Xb;?Eu !<*Ek"@ZM1pSdžΠD&N5;0ژ'q qwLXDuQdT=ЉC%GFWP9 ݕ.Pm/ Y Oٶ%S)>L"*TF[gPl7KfEC>u5m߄Eg 9S2 S˨dRhZD!gRF/S儤101Y󸚪cy6)烆owK}~./&nvX[ [ {)M\k~]EQۋM52:-cxkhRѥZ݄7ke@LHB]5(8)tZ.;zMޮL(Zt! +, 5ӧpC)U ϑ70k@8*%BeNtvvr/uM1$d:${jm -SA;$_1pc귂eiUE|.e!$얺8)Omgkݻ>}H 6z~ѹD9jCψaZ\}S h Jqmz ږiJt"͐sm;c4&fȴ ؑANH̋zvei!-ds|fv0bJӲeE.*7 V䪝{CE78Rɛ-2yјbX֡CPvYV5x^ ǰ?[ J=[BAZhLjA#_d_Y)c4%ݙ2jBUi =@\rH\$^w "M4e]T⊪mb*g򪑜5!g\n/j4"^*`iӴqvbB=Wo7jtd(S.Y `,g˻J!o6aG 1M@w٥v뒌 I7J{-ݥ 3G٨=zjΡQEUpև0ݧ16yKwϓ]|ĤnG(8?BbsLMϦ4&*¼#N.-5c/lp_K)R)ۗZW`wQz6݅{uItW;>%Ur!kND0$V+%+h[6 %Aj~9$ z]_6M8FE%L飌m$kK#8=Ll~d~Pgh]v]W2vבԎ'ڭ?qEN$#&e*TL=,Y4ץ,旗0i+|T'DNXs3 `7D1Pl{ɮ&~!ռ:t)5I]Mj^+/Zrp1d$2=' dIƛ@'GgsSK/Mmc`ns;TMx&#d7RW.Ƹl.e$3ijl E&P={\7.eP}Q)zpjerQX4S7pݼi})ѹQiLTW+*{v5(+e%VĽ'>)eA_zpM fqjQ$3*h4iX@9 ~#H !*ɑ͔5 j7ܖ)~(Đ2yx&՟}q> ,N`#Wuf>ԶGj]ZT+; 8%ه^lסP0)Dl)^2}.7}]~\1BjmKP!n¶ޛmu?.z) /𸤙=ºM-,.ٖ"慫;̶L/һ`|iEB(Ү qyϹ8}&߭D]d9*$n~t9K BAsl*spd0YpĤuaƺUܨRSghaBC_f|iX<אh~dR ֡:c6,$4rt2m1uwgQ2{a۰mΌK߆$?mD_l>>P YFqmĊ067BG`j[ ~DIGsv|IcޙX,DlsnW^Kck2k3as32KXj~Hx+ KS$ <[[=_1f_ڟ6ˡ˷۷/[;&Sbg[ HBڜM]L"<|>ǐ$"sbzE}NbLe_b',ex: ѷ;g+,Yaq.S_2`GvDتϛn8W4z\T('[')DUR>/ZmcLhjVT~@R$+n={܃]SH[QAHMk<&qdnHBJ|X@jΦ^o0gLr.v#PކS!nVD PnfQOZEq092%@R ˙sa$W5:Ȩ/epYQӍ͆UYYݰcV\ڹάCLp(x:ϔqM9 BΝ^VE/8rpf!3%76zj5űz:D4my寷kyϭ1\͚քZ 9Jw:a#ά˅st=XMzeUf[A8q[>m@bR66LR6ӵk7{c(Wr~E%Ohthm;$oCАE=SBcgTG. k¾Xy2kS|}WLUK[Nph>Fj^.+Q&cp,Nj䱹BY1X55qCM[iJ2jWfQ Aʒdd@b@+?(5D#zAea6^z?WPNMf Y](88mluaN͖klS:PZLRgۂGh?6;kqʘwqd.jfے|kߨ+nb4Cbm~%v3Я\Q tl ?CSE]09=:vxLتu䤄Z6 %APR7&`/]@](ZUWs^(B>)}tEOkNwSHUܞGH,Y U*{{M,=dܮzP{LCBrSnuJHXDEPVyN|*LDyv%ڵcH[Γ܈HbMiZ%Bu%dy,eB n77]zlºչ>P{/\N2"UKI!Gݾ}|'w>u2تSdg=,A$iV~aA#,xi#ϲ,QF* _M?Yܙm G9 iiԫ31d/3Tv&w8#7AdApoK_ú`_@JaHRh%UD bęP\ r"8.8_pE@q z <9^~voir+~ǂ13BZSz3Pc\ed*c1&!\ǚgh'dߒkEk+׎lV @&\Iasc=?sy70ޓeݙ iЕcN?n"o4v5I+ ^̥|俻?ytx'.0navit-0.5.0+dfsg.1/navit/xpm/country_EC.svgz000066400000000000000000001673001264204753600206450ustar00rootroot00000000000000(zHcountry_EC.svg[ێG}Wذ:I]j@ٝEZdd%~؞"E^iәYy8q"3OVnY?ԍhb}z*]^bڬۧ埞}߮.&vo~s} 7wח_]\]zw?:?lWf{{_]w׺חcUmwnyrxʣF:|̵1Whq_wbc]R;yn]84_ٿFY{~ݵRbzzݵټ>ߴ7^)yxz)ژ7l|{tx?1lvW o,}_]~jua=ϓi}5}yb}% l~tvqKXÿY* ~TeiјKh^>D[[C6v fsGNg2=M4yN~)Yr6_>.׋a9ƝiѝeTL \c?l8ӫCYahaɎ^ڼ/]wǽlR/l1ώ :jh yOy>f?`jݸ|v,7~>+aM~y{xC;2XAWg~~ #.'m ߿MK݇WEԣ<t{n?O->DzɧttVݛv}ӵIT$GL[-g=`Vfmnj&}v09Ұs _8NAnHv܆`D<$lly7m)~_ }` Xݒ:]_V\fٯvqǔ̟ofuoG{}Z]s{֮y퇟zK֬b8/S-kډaNltş2n]zށ=ߵjlA 事k&,Zwa :?7ܿkX^Zja޴f#6eeqǨKQV%Pfl'Y)9;esFsZϰ欍|{l{ ~;[ f_"2:Ǹ\d&W,^v9\lԀ B|\Pb7h֙lFcٹh<9Z32Bۇ&`840c< st6Ad;ZÝ wfz !^o>EWNIfdsb&ϫvXW꾣՞1{0w{ǤvKJ[\lxD|V|ca␔fLi!f 0Og\%yFPp:3`}ma?ZPxill?Ma2:Ә1ku(1gX)̄ABoS6ځl`FS1lrÀd \"`-f]Y )sg|GX V+އlr%pKhB˲|#8Q :)HkQ)2']yzy 'SRLx";N6-Q`r*揩D96Gnzq`1Z[fzpl(?xu&U:ϟ9 k-;ڤkbuN*Q%cm- Tca6Fq"\㲣M?)/1c1$SEYǘFN/O2&s 8@+Z.i3p7-r )I[SoGi0vȂXWu!aAnFq<&BbԇVrHO5a+3d+< c# 91ꑵNhwa2>jO000U+#LL3BP2
KohjJF` h&W"28Ql22SAfKŌ)B%9:`P2$I$0%L3 Qi}[0:[Wp QiE*3{~pigף20UOxiK퇩#kX6a *I&gZ",h1! ,Bm霌"mOB'U)T$he'%XDO;N/2Z'\{I@'}15H[3W`hF1Ո#{ ]aRy(h `"$HzΖ$}>I8!hƮ5lCdE@H[Yu")jKs`mh961V98|WE (Tez1}zMδ: =EU#RZR$)fkl%񑧘\ãR*CZOȇ_g k ?KnEdx8O Bx{ɠʔ nD,KEky&\Tʮl;Xa1&'LgnyT_X2t4 Y/9DeO}F1QdHeuʿMEOY?)2L CEM_9BɱVt/mIO /zzlMꤿ|(pCHzez,9ևs+_驱.W0vo|T8d ̏L[BVXt|WHX=Q|P&V+$eo C:»{N)tLYzSdnz<;X"%,K)§XBSufoGNA IWFوH&rg_p:E',9;fYU5'(U4ȷUhNn|Tbւ),:R[*:0u1iΎ+T׆(HED. *X=qo:=sNeg$5HuۜE+B*VQU8Ei0"S-zt^1< C9xyVe1 %0EI6_Jʖ{چHVf3eJޙJMF[&(%dZ%OS90vM&Sc"%ARIɆ()sȗYTV Uo,ӧp,!ODRR_ߒעtRT(씅W@vllWAor`: n1Ej%H,h퐒`"?~Uoxby(VIT-݌v9jVP"8Io%*3ʑs9|hx+eL1JΈOItk2*(Mee ᒂ*(8zA3;z36_eFXP)!H4ݳ`:BJoTTGsWr/TQ /,?ZV^b)$rҚXm#` Fpa!5:NjT>$5ʺL,/8C=ɑm5?g2)W 9+˸<',G|zIdϽI)f);VH${0tX/)']vݓ.?=KzVz;R\ەK""rIO&ؘ5֕׽wc'¯zO(W- QGWՒAoΑñW-9zTJeإTK"(Gi0eJIKޖZ"?S%=Y0iUm>k Wk=q M^"tlO-&gZ9Tb+)+HbRUFcd%QR%azI MPW9Jއ1L&n3Wc8OAFZ{(s2:Ͻ9>69^b)]qS)nϢC<{g/O3*׉"h_W@rUF++fi^:V,u2཯LshA^ث]'Fu~gy坫j׉IWV?=ó``Lx\uJT.qSV* jD݊)$tܭxvt{NjT!nRE6ػ} 88s|^ ѭq^ {[H2zݪ'P5yҍYw>jB:ץCw$h/:L7x˩ ?+ڋlbl[r%aY׭vkaChq9^3RP팱ծWen.jJP-[+ڕJM/Pnl1SV`Q.,Լ-_^^2I|V.S&^%2Ē"z'C,ʌU_^^iu+YeKed]j4 l-T.SխbSź 1T.C̜zX 3\!-X *e O:*eru:ӯh ;P'&Y)mgmau\I5+a#+}Xn[ViavG#lhI~2¦Wc>Ӆ#7#l=Жn"plG+WVd;<`lMlŴ`es쭚Vf=Ж fe#Z%bw6XLj?`h=Ж 6?`#Ql0"K1h @sS&)Uzl*Wm%?'쁶l3d`wQ.,vfɲjcʕ ]O땳u`v/XZYV.lNtB?>ZagҲÌU'; [U~Ee-O{Qf񤞊铣XjTVéZ]!`iVrҒju{E&Ե{:YiQqK }ʻ JKBݪյp^y(eR*?g*.$[:ۻ{Keu&\K5o|dn)S-%[:U_Q/Q%QiqT'SWT3>0f*eJu~ĩSUy([ ^R_Qj}T-U?aW:V|o9S?"{rp~v<-w+Uu>*VAm[ݓV{mbW:h›+B'k,!Fs]TՔ '[1Jc֢eSV9QJc,g {(8[ RV.z$S0v /Z_O5:woyI3T(UL ykҡ!+dI 2֊-6U1f%_B7 ܝ2Ψ.Y(6 t3w]^C#Yu;e-`0T"SƳ蔰`[{b!K0;%͙#1G$&{6pí,0U>t=3Ug\!_P{@϶g37rAm%ܭAM<yr<{WIN6NP]e @[{ aډ7V،_UM: *FeJ}pn`'7f'QpO3y *Wp*d`0QȞN  $~ҖP%dL?mRݼȹ^ ʺI. f-0nG*3a~]mV*3a2'湲6x`Y4[y</@e,Q4~1{ ۳Zh:zF%mhSĪȖDҸ#U/$xS謯VV/H}9Q&;R%UUc)U6tfX"rJK-=Ru 0s i=D:ލk>S;E;y.2侠nGkyTnule+Wk柇H.K|z89H+M"fTn?|A{yʩ>ٸ9n*5s4n+fTJeMdž Gau݀Ҭ'Y^PlqR]N DK1r|IxH hwo6D^N bI9滷(a=WoCKKT(ZAWTm+n0KDܧ^.k yuڢuҾDJ 1-S˯ZR7rzIF{iz 0[S TLgP/H;9=Ϩ&N'7"Je̍f!-|M39FYŒjҵ6UܚbLAHI_2AÌ2He?q< hFf6sgyTYаqw{%2f?($5U&SeSp.6G& {i9 !gff,`V[ԵyX3`EsI:Y>/w8C̷ٝsO *6B}Mf%2~ %wkBᖖN܂c}$WܡŖT^Rf酦ml WB1S*0#irS ?~,"o\$2ϋg1E 4V+CUy~ǯ|߉n]OK=.J%Y[t'}dөK0N{g,5JUx"T$+S9&A(}Nj*]k]KHU:lʓvD?^mZ%gV C]'v;EDC~fùqV?N+X|VW Lߧl)/2Rs49/U9ά`-pVJ˹VM:^U'"/7v~wv4Roy%[O+mfBivʃjoM|hް{I}n4_& IM߆$g6>&%-d"pMJkuߣɔ1ԙUs7xWAxWv w&%܂9 i/sc7lq7!97nfԏmMCOM I$:e9?=`5i/7B>Cah~ooR ꩼ .GOHiMﱭwN.{T^C}ϴa+ oe1Gl;rLK>{E>9m牭D$6qL4퐶֋$ͺ<ƕŸq#U`|A>_ 4h}!+"m&Tܽ3.+Sbt/:R{齖jo/nT6pXƱL P>[Ilk53d~V;}r4MgЬ֧y?}X[p0;9Gԇ' Bzs&8OQϧOܧcf2Q):3eau^PNa=4y}A=? e;Nu[{=*ҿ\Rchu6^ }E}8n4Ӭ;5/* Q%u.Al}c f!gPdp/i,j})ȱKNsB-wD'pڔ炪3u: %UGWΠvSWkj^> [+UMnSTݲ~= c#'joUp[7Ar[e+{v\,H݌AaL4́yJyx g)n !% a&S$ dG+;6U3@TLၰwyjf'b- i)h·FߡeWlJe;*2 yf䩩!++5Ȭ+iyΫvQeGbб0&R Q? _Lyl63bY &!1&jh^^/?}mc2#uE}[rIT~ sRqSS~i-NQu2՞j~n>BՏ_NԸsU΢Ձ""qᒩq\ogA,ߗ_@qq'2;0F&8j7Em@q *+V{_#[zeLjLĮ>Wo-PwaWKJL~\PwZ10'i DSTW:@;#PFdRraiô{*+]FV^"7Sb;̓|ROY(H=[.oظ*3a;{f"i09J[!G +xD<艜 炪Ԅ]D"zJ?r9rIHfPf"9n42F"iqA`T-dѭ;v֐1ȣ3nTÜ+9nt.y҉{]kM /T'$E>纐t߶!EKanzKB6%%h-7%Um"7aWN :FZx{wz㞰*gT%rg+Q[}Kڎ~xT2gXwjxq.}E|]yu!2Aլ ,8ʦ-wӦy~Gє|zLև]kmsQr!iq^@anG*a $6,ԫYPx>wn]1BR`#Qaff`,T@Aje^AF!گt䱞Uh> vR5n@ [O} Mhc1~g·?|m4^6OwϿoozo~㵞"?+* ioB.@{}WW04+|7NU*~̿\_~@t/Ħ5vGZrjǯɃ3_+b~~Mj1{~.9~_9cLQ,?ǿ}&TAR7$}bz%w;DBBCʼDm'sz34 R]5-|N%& ܟx#z,4;@r> jr_h&j=?c|/'7c9f-kKH+zZZ2g]kigr'HanilJIi(~DEo#R[b _w{wE ;>˦Ob%s ƀt UaܕҘ\Vn8G^CsDt-fk` eJteaoB/bL?A(ESk!sTfę Fs\Li4wosꉅ&\#HsӪHyJ.uw9?Y.}υ#>H TjNU a4$ٞ5߼nhJ4{S}?\|OG0]5fW~aCQpf tЅX߃D7W;ӹxgDxX;gs`Pk!S9xSʷ-Ar;|z:0w׸ 9#($ {#lD-!f(pY|9W6~v_|?  EPu6G;cUg78Ne1O07[s\ۏoh- `봯{{<'#&׳'d7{OUο{dEb8v{o`-Φ|RP6sol3 *-12&^q1ܻFfR.(2U4f2Yh,A*JWVxT4ieT7qaPL(7F4ǀZLG2kN-H2Ԡ5.3'YЩ${+Vh0XmW'V132}zbP&0!Nȡi3pOp?qhX Ik=^R~J;O̿3sb=VeKs c5΄RSsGE70ZU$P"ߧ# ыz| ar'T1rAZiA v44eI[d6x!&#b4"($OObY5Ɇ.;8`'I-7Ǖ%pfZzQF3Z(9;Nڭ_ "339,dz M(n0BA9L*N8NhQI+^%QM`׈@~w[od0- >Nn\Q Vys#0/ y3e.F@aGa7 8Tm! f /S̀1 ţF̀S)x -= 3"oe9[9^bPoϚfҐ5"Dg&35=-Szfu 3y| !2JOEtfG\>i+*UV@ږTw+V!dfHˏ< (}$ `` ^ [/I RZص p@?vo f}Q2?>mE@@#!5"1a}j{ڵƀi1f{P&}(#TNyUzdLmo{iQIt ;oWjÿ_q1$r׫budM̻^ak&._v61R1NI+u_~4("lʋwgWBivv3ZV* JZsԟ fɭ^ARasFz+~@2q`3vYA\`%Yŕ~PϧŝkCw>l. ~ zV8 hleQB_0 MX|ޛݖdF ugmEI޸xA;io Nm/ZrQ_g" 'YG^}q5p+.;L$;zd"*4Iu]MmǥoЌkAxޚ[i;윝#o(YIUJv}Zȯ%'^e,u->[Evko[Qޟ'!i54A:Z(F16Q$5^n! LwL]:i&3g#0lӺV#ib N/1{Ⱦ)^~H`q_ !7t #c@d)`1">}w9̷20۹ξ5u܃A{y`Or>Gʕ^P@E8GL,Y3SP0 @4xƔ~if P0#O\P52~锋*0~b"戭N&{dfl`p %+f{|AN# .Ji@|L$qfoLDyfڎE M:hooPhϾboϐdCd8%?$V3IYfi҄D+ [5J6aI͋ɱm]@[T,2:'u"=_|/@jX_ aZIB՛悊2ՉJER1l1_!ě&u& Қ郐LXr%ަGddv꺘ݻԠDC 5MՀBMK9j3 RSl#+;8n/S2ja sfWkB}Y4%1'73Q3i|&\_ꄍk!id Tr9T {u&,W,0%P9 7΁)@9|&xؿ0_:#ii<3e}:j &FvJsira1 W(zc@>ζvqKK9:hlK;[D@ȣgRUH!%o4ӗ=tP1 ĵP#|2Ѻ4/9Y;LՍaóȋFH )2,ܠl %i&r涷G,ٳI=mzRnu}iINfߕO*jb,\̎'9}<~rh.g&Q<8˙}}<;Y(>Y\YrQΪld?KZlQ@"v&j]~YԂmU ,?o]BǕ6J|hyTq֮|\3w5Ӳ:L 0"AiYP-j f`k&5v|4'I( @\iI{.\zWmTͥv [cR5$4j8.Mhh-G'Z|Iyy*e^Ys@}%h$U6bʼn|GdC,Rra躼e{A{y K MdL}>U($UFA$瑪.أ+ K;r.lՑbOS^;Y@gƑH 9oM1aپ3aq=P!TvfS.߮;gQwS!C'7H=vYK(o.0Df8sJHGg"& SMQak:O/՛}r'z*w_I& C^AT9>'1xQkz'J42,:kozk+ݍ o3o_iGZhK i YǡܙK~oRuA9XDX$F^{_Ϗu[^d6~̢CcD]YTQo Ie|e| \_w7ߋq)e%`=@b*HQS 2'14q%_R(NfeaY;$6[XcaP];idžjگNO:ݕfPP(8R^>F;y`;6-%Nz<@@IT;Sl#ϴ뎏KfTbG ?I g>4hX'M95gfۤ-w>^CG95R= KIG>i5LB~X\]bF~UiLbm2E؜zI{>@~hWrbi]L;5Ik4$SŌ sA-oc6oc1;,5Ӛ}_L_W+Eww`>a MOh7{$`TXɴhASjYlDC Hl~sU(TlhQPy " Hڷۥ Ju4  _y8=mf|C qPO\f7hY8,QZǍ ۟k4D/vjZAPJ0%)d6L&8Q̋>.LMS%hA,F=B`S–PيT3(ǮB DX l}-"sҦ6^#ԯp]vښ FCDVqVН@)ت^ukI7krEu=5jq-q7--gb6hP_88Xg_fXY7k^MH|{VQYz[3]&h6f'Ruhs#gRRW2O#jGg ILiq~1l~{(V<.Z@ v3mrVۍ)zYv51P<8$lڑ楎&Bfdơ"2BHtNu9ѿ%igжIlt;cc$ZxfKʭOlB(qMI#tţΚ=O'[bbbQRKTZ>Ly`#ۉZ ԴkHpSMطF1'IP4"ӑiSdVXLQ?|U\oTǷ$&\dMDJb[f$_>a3feEL J)Ñ0CN.@X#6G;brIUg;"LS18M;GRݢNj,+ePs36M¶M>A<:Ƨwn< 9]|/WhwOf̆ƛR8Q(* xf/Xߜ0&y@}Ə+Ƨ5;x1ZՐ\ :/_}ըi{5_9.eoN3Zv$ eb|w(FL@⻉qpLɐ!~"{,Db8A/ k5\qT&e?RÌv' ,Z@Ik F&v?C:8uq= H;VN5§Jy⻝ l.S_a$K+TκхQ~i}I1aj,U}HdЛW7w1~/ e; s)o~A-ܝ;xjȾ+l^7CTصq%.i=*WBO˞Qj|_:Rii&a0̑#*&ǔb+gs]VF΂oAB!chn5+9?>,.@/~~p: z '+7JCUxpC,-J s͒ƹJl,{AB`)!Zti:9=3.)̬1]㠵IY ~gi>TAvpq>+zp`+x>휯e]Py*͹gs϶:FXV.P}2^-xgH67 Ҵ K{M6ڽRW/1!hu9Nz2M)ɟه> U,0,FРHeP2NSRՎ\NH=&Wi&>>nnEwט p<)i 5o\i'ga&G̙v[Kb6 kfoXF3WѸ1%$U\7{ ]d6pۆ'dgF5*…-5`bl)N+{^3P2\6ޛ)o'I%}J[^vji!z&,OJc(@jwUن&RWRZ0;h٫rO.A[>θo&{y0ǣGn1m`a Ayb~jjDaz (W72~+QR'=rs yda5B7WR锻njls47? mV %> 1bYO'lM;P iʹΰ}dw,!F$IeeyoVnۮ|E{O}}֕شHմP*iIbTN̤}GJmé$HR:;`TŊM(e/oe/PM) ?$!ih:5ƺoQ28}pe?ǪmƓ| MȻop;BvڷK#o,]Hxֶ-.j#>\q;" ~QE-6-2m na` QHSe* q T[$y`{.v3w G:4?/L1Fs^ x_?񴿰vr) ` ͕w7#9cs؂2VPN=lH1XBY=siKsnfV; 4.7Xط^]yo}ۢRL;NmÉFIP&HB:ffl<xW2Iho'q+Χ15 e^PA :[0aq -Ԙ䛝 :W[3ݥ[ wC^ы@b;oѽ$0^Ȅ ˊC AAAmIS(\amY[-G$hvnv Wm\on{=Tm|WT+F%Z7lv&oveTNluˍd"qt87Ŏq˅}m=X~$Aʇ)ާ?cu`V3inޜB+ڛxov]AS*WaTM_5,zϨuz;,3yec}V`wѤ @h^1u 8-}} B{iϮMwՋ`>odM-c[d"^ ђG)2퍼sCֶG@s9Lz[eTv:b;1_%Ug{=̯ *6eMwF,;";5D{V@Hh6YQu-!XX =1 p`0?1烀4osNl㡁=Wn\-^P +{Ù[Hݝxߩ~'ao;ehڈmkBcRBO+C<ͤ {+ax F.2nԉBn5y;Mf&B+ڛX?kGb}s)ϰN>P&[qö́&|3+.}mf-GJrac{ 4{I}Wdչ^C%W˷%85i ;9 \U%CYuo'ͼqef_ÙgNBmϺgYiQX^-Cy3 & vXNcM}ICX7M{*U붯_TNԐRGy\m)NZ"22&LWɫ^Eߨ)&wJAa=ˋ+˝gyO|wRg%iG{YA=zigr n .̄~8gFɧT-Bc&Nx쥛T<WQ s= SZv_|U4 PO^zoq YyJܧ#3ñgSTH-({ܫ"av$4ݵZJ6yo}CN=rr@:'!vl{3M>0Mi e6n^" ϺR}9fʂuy;} ݺ Agu,۸Oo)Iفwsnu6*wsޝ vj3T' ^*];lCz#'#%RK'H"_ޗ<Χo2ӹ/sv_ O=J0u 9d+O鼟"[Չ]Ӟgx+dBOo;|d^,@R4Faim+&~jkde!~k|@7K sXSgOhU%|}nn>J]- PStNU[Vk4Mi?xh0y<g>_& h?cGVlvo('i4U(RPG M$4o\r :zI{@UQftDO(~%UR_Ux 2Lckif1RKim#΁ H@uE}zG `5O6u]  QԸLiMrQM ǰ?@'v%ԄKW-r)H }G{wJ@2:L96":&+])Q;{t~)K6@-Ck*3C0gxJo|I%n. ؙVN0/w1牦[rQ)9IXIs`jVa rH]%Bh=hF.QDa=|UP M5p52,n,nC)7%y=}T U-8`*7ٛ -xu.α~;T9<`L{yBwwߥ;[~Ft1qBC 47QE{6-.mvgiY̺o.mUUH[%u(l\i+IںJ8,m̨}E{6%ega#,lBgasm@{yJ A27a;`e&<)#p+yve-c܌9 5lPօ8|M0IDhz&)ݚV{ ieՑxcPs; 24i;t匂߼(=%)A+ BAǙ$cviF|GUKP8p۪dWOTs/W\8qcM'\G,\}j Y³pNpS$\~Y։ ]9(]g8o;-hg$@6 ;z&^3>Wڃ,DOZ<]>a~L?hg pA]PjUwL6]D{)JwnrphF>ߤ^rYS)FkAǎEt2%ϼQgݮ{w}ԝS54i_Dzvo PQH0dg]%9L驡+XX|6XD@5#ȭL?XN 3 L\ڞ%ێJ:Wp &+Mײo}R.i/\Y(ZMI o3e{;Zcz5I ]5\g$᧾ ds8t૧J;vZyU jhE.Ub`g69%Lh^"v;1~P1]lǒ?,v "Ƽ,?Z׉wE}/1<95*@࢚׾G7\ 1QCl:OfWPdbѼZAҬ>R4n' JKf޻467iʕw̒TCC~~[MPWF""ۅ"5#-wɤ}@r)-o?hCKE3MUkwJ?U_U|);0f#tc{R'q2ks/v|'~}V=h?D[]KOqmE;uD{-.ڦebDE{&E3bBBQ]mN$tKVFAREePwfk=pZ5(՟6~?|˟_W@LRB__}i~mYTYsSܿ~?돿;*߉skwxh?Z|8?}ݷϿi?k& g A\RO8>o [\ aMMf4iK6!S2xMH^Key6et}B5#O<e{F^@\^h&JR3X*|@O=k!TVRU֚暌Zxk"mbhU BEɱf?oT#쟷Œ2"*Q>$ͦǡ4'f.[ fnH[ I#.Q!`]Y<+`"&ͅ, -SgOBkU[>}*?OԜ}({J@ؾrKTkgh)84 L&E/b=C9{YjV³4sbFKOc2AN}vE#Y"/ =РXQm2,1Ь{B^Civ&݊ 0 ~&Z cz4TICW*f!&._Li sq%+o(5x-Fz kfT{"vڍZ:vdhTFdmL k)(.Y+jSD2oeM-m^ce*%k%kOlϲ}5m(>H[lI ++Wĭ -|6*BM?E\lGEJ2z_rzoNCwx7bߍv"%Ys\^%$䲙F>Zm.TG"`!e__|d +3jeQ u]Ɨ  J"4y47o0 + Js3'>]b>'DԪa z[?sL7mio|CcJ{3a^|6__gƖ0 _E< ԙ;~㯯sƁM;M^$7׮u{W//\5]HW1/"~ӱfȏHB^EӬk!Qhb ҴY$j7iŷk7k7k7i/) UnLy52_ڽp}IB,$B4%ӓ_ !>59f_ה奛Q//Xz0B^!jd6mu(p?m~k>8Y'_vWJwG^? ͜&]r " TT3WϽɩz/!som/?Rȓ ^>>666yʶy߽{l/hQiq+fm{+} !]d +Ҁnz%AJnu"9H/&CݳaȓHL =&AMA#G{3*nb=CL(UU4 } GDM­֛ϟ}aE+_dշH8tyB8(Jɚ5xDG$Od\U^KV'5G ]!UuBv.ZJҮAizjTK.-Gt>s\w73%28|i6q^ט0qu(Db`2:O `~:|ITA˧OZxV "m KA {¾T=h")oJ ,N]YJR.:Auv=ʱĮWY]۫QE 2M} M>&l:ɩTוu?T/Mb youe>qr׆qaȋڣu:Lv-*ies?d"ݎظSY4ZEV5Ƕ\I_YI,Yafwo?(G|˳O|—LϤ~?mK}3y|3Ɨ\{"#6E*іupD-AZy a;Grpߤ/C5N,t ?vjEؑ>ֵ+3 0!Q+Fk' {ׅꀉ1Y,2g~*3HN;M<@k_/1e0?Wz:O4$lY{x Jehdg&PTE 0R贞1+<%..@GE5ŦSfOWr ŤS}P{IEɟa䏗#}ƃuzd|pۼd`hP5.P@S"6&vI KX-݇ssl/үZQt!$'RV"XRj4A*:~<  /tڳ%`V:Hg)z/H՞\|%o_^){$f,?'r"鷗VpC`+Ӈc߁7o؏ިA?jc}z#:E\݈"cCcCwC4bIxL^^_;}핏'G޼?7>yTҮ7Ņ_v(t(С@1)_' !Q?[-iʍr\ύ(_ğ7[6!9/QdWI"xj7y*H q F=yu2 stU&g8|D&QG??פ(@D 5˟1y2ga՜˜|Barut3@i>A: ' `1q-7ՂUNٱ.K˫W%ZgGǣaigQp o  fAZԴ܂2zx]X=ճݨwq`(fJ~ZNNwsUZ yKh` "E\`W'LUeWd_ j-SrԈs}:/f[J*0 xtGXrywlg]m=K3߉A ÕUjv3c/] bLM^u{Pґ}߷N Bdzk'%'fWDmk~["H*N5Nb:]9%;V㠭P0q]ogzw3G0~ƫ W>m+E(MոZ|TUMe$b}@z%U,=t>V{h-njG a>\Sd A?R% AA-ٚw /`wh&.5^#_G|ys#YlQgt?f޵,&Fͪ>9&}1NRSUSB0B.ە|ݜ\h9Z(wT`Z7ݮ,GohTxefsfh} лFeVLǹoHRy{T\@7fT?T[5O嘱(N*sVOgqο~׿_J1!dҐB/?|_y`l9yʾf ԏlmedGg{O~}J 24qI=A`!qc-J%4V'B{fhNp`Fzuy +0YlFIFQ7+P8+(\f0 8! .bj2"'=o[yifŎi̺}uȘ%)nK7,r3},^u $Fw̋F(e(13t342nZUH(/Oyk._Qԁ%EB(̹PӈB/Ĩh;QspHyp\#e;Wd!M{-,TC2m6-5J2ŵbS'6ɃK*N05Cb*r N*a4Cok!ʮ(3qvޱsDLzwlTd2$=*W$P>/^ ' {ã:)87.U'ZhR1yO\!1mW6ۛ?lJޚ&p/j`f[3`yO͑n-D ( )c @ "i4i1 ZJmy Q#?U5ƨ`K2x5NؑO$l; Hnx  $5ك񐓍9m/, G%I9BhAm0Z-ϲ`,,OσbZYOβ0rz^΢:(x8:-TqM5-|L|J4]#͉l^Pe斖kzjN14݌&h02 lfr 5) ˱as:OSl"dz76c l-J8*t 1˙Z1@v 6ֳYFH{r0+Nzү9 Ds BdK. ,i^Vu\*Z~vئI"#(jyR|Y#֘X^]>c喙Wv6*y}?;9SF.8~U+1c0[9 |YYW#zςx|p"b3ZQњ(8RU17{&ۡ-@@bGޑjSr#3C<!)t=k8H\My r+ڛ?>3\1;_*.xqAŧJը3~?H$OH' dtvGRn&6ZxɫOܦf-2΋6q>3..P -0)DmXo38A>nvMH^ vfn@A{}֧+okвTa&_Q%.&=4lT}ǶoljC1cd@1v{RoZv"QoC&ݑD;IqR:ȥhQi lh}}`4_:?囬.1B^nhbpl%lfʬ/J[1Rp nUD`Ӷv6mN9IC{MYZ);t3v+h{@4IL&c^H!q@}8a]q_sik,S5UqV,=J]ѝW71w1~Ff ] y7t7ۧ1c.w$y&AժBw{v:Q[kڣɝNdP۪\s6mP3HM =PtihܮmWf3S"8dEJ]#FSk#g*@ Rp؈@*l3F 3bātCG[eL\6#߉~2-y.<좖Ҳ.0$n尌][s;QјOyGd&2Qd2_*ߴ 5l8o03:9#I! \}1*1thۣ8oaAT{"hOv;c`84p5c^^{jw]ߧ}MU:G(θg"pX}RzO\w.Lt*G2t挏8̉nȡupDm:JSP&6bP,]Y>'Q%{@$7vggFg_ՙ=OGnBP ??)/ wg"o4򕚳E \z={4fOoF czNa@P{hz,Y EH-aعG֯7sv2 oz'ܮyf m<)8?8ϖZl >g7{>0O5z9} ׃nQk`UX6hM@K2_LCa{'cr>qơ݋7X@PfL ̉.fO>^W6Ig0 lzw>!퍼>^xA'"o;|w ֹM !r}GI84 uT}[Lqj >r2#H '&RV쎼B{TGRӂ1iIRn]cQ~ T(|ǽNﶂ*_^i}LWq}?3b#U!Sgp}Ͳčc{{E2[Ov/*">qmCOP>p{t%mѽ$'Z@4TA:]?ؖ5qY"[ySyaBUN֔v >Z-\4ޗ+޷Ԃ{Aw|I|@LYu[ՍY'Өg:zZznG y6ɟѣc9 ՔoznBHXv6g Hbmy4(tEq>% 5iLG0i:Y'7An2=>vY|wGAl#77ژl7Meϙm~<4$ZHub"[.(Ԯ#IdfM sQ\I(÷]ox?>>YCm72F]f[0xP_2~ٯhod?Ų/T h5nv,v7Չ|y"ivchzuH.>d,^=n7b9 ޳ݱ#{)7>r9={Ubijw$>ţcEP~ VdHI6MⷶW I;|vwߌH-focBʭfSVxӐnGc͚"\uQbȬG 1kw*""dw(֛W5HkG&U|۷)اxR]4D(tյ㬷dhW7ӎlъi^K*Id-%啳;x?Ԏ=ISclipO[% @7#A>=2h͢ϧUVc C k:>(k^_A] JCnWq~|9;ވx[jRw̄ goI߱ÉˈVUVBߙ݌[1O)g$&>ST58y9_{ ;ϻge9tx/pxAu^o?-Gf\[x|ʶ`igw7 b͝ Ska_d`rloymʹX^8?z".;i 1ΣΛw0~PgG:VNyITsV?uTuuUo"'3|yZ-@{緟͗o'2Tx/X7]ݭ8g4I]Sw^Wz[P!NO±psnem48d͢$_{fw]e+棭Wql:/2{Ϻ} :6ģ yTʦ7m yum'߇e?6/LjY@XJ+Mt?i6}FE7Vv" &C uW! 63"ĝ[냦ޓ> !آ+i}nWW;l/-'Z;NbЖ <6)%P,x_T;t?URg'wJ"} jGV(hx#e |;Jp+,R-T }a !'\p)ZI.( HP^Z>]1&=rJbezV>㞾Cs{bܫjsʐq>7=臧FI/&g:pUydY?Z{~u7'Z6j$3'm;>McylHNx/[kνW?y3 쮾1?պHyB:Lojp|N=E1'Rho?/-].[t_;8R(}ύɯ71_;oD5@M}=N >N}lubŤ$xI7\J|lG'שKT8 %Sc깑r{nh# @0BxjJ4<#DF70?ādmziVAupd)䚔nK wʱdD^,{,,AlgFȳ=(97* s?Xh`ΰeNmI!SnrkhBysHtaY˫O!g@Whd^V(8-'"[bjVw sq Ԝ xy/α~~L-xz%Xx+Hh~uaŀ/)ms9ĭ!nGܖ A qch.`֏~ гEjBWȹ`t= }f&BOOSTF;~9Ѹ 4A.E{ 49y_ I18YݽK)yXZS+yzQv<۰"DdoT q,f(>naGu /^봾|Jӯ i_( ߝ6F#:zI^: G#u{-RM.,8ůjoPRsǙd_@A ĴHoWS4!Y|szy puS*щW]wzO:9Vva,ѝ~ ,uI 5qR߼ >PXxDö\EߏDo$|M^unj׸2|*(w( m5Lu"Ԋ@mGhtҩB[Ou#RiTfe&:yj옢UpSZuvQD)iOS^>+kMn+gE[6ou{yM4o+IL XAhkP%`Ϟ]`(dXR(;sݨb@}<ꩲO͂`2ɰ2TB˺.AhG}/2rG y~ir7&Zi;oLh@43C Kox}]yl4›m~%3'_ݘRki৏$zmvua{?mA'2h\1A4~H1äUq(>$0=ƵMRb}V=-z)&iDXdb.>' fK t>e3Ko1<%ZC 5% "aR?>?zyM{<5=3[WY %'^-J4(G77=G2jbcCxV˖503$,zR׏U/ U H2jM~DXJ9P!tԠ,&aYIh 4vM" ڟߝvP` Ǩ)% J#r{AaN(Tʝm o[6FPf R܄Zt\ퟦ~nX1* N#UN/%':79ϐ|R}HEkKoMS}-.ETzp)өOV1L[Y ISgB̻=]zPUȂ' #E2Qthٕ-MK QSE3[ ehcn`1H &@xd:uj\X;L{#}B6$ijjZlɫ9sS ]򙨳&v59D'Ywt^>hԕDZ]+HՔ RD5TJoZ9(7^Uo=۳9н;O@M-P\T\UpS(nJ.FE ÔJewciIK֬5&F]z#SuBӟ@B5W@VzjRځjtbdDƋvYz|hn+vU84 [E]2ٴ=5l-ᨡnQٛ(iBBzqjH+yLUUMN^$lM IosVvql8ɼ CiKM-#$qfUzN"uE<hu XUm ->:DUyXV+q`t)A 8VWW4&s(f,glA5:1vED>4=M(T9݄Gets⡯w&K)E ˪IFmuƬGFdh4PʍpڋL_FYêg'in4*Q4l)XG}M]w7l\g{t13C`X 7^L}wWc65A%3o]6eϪo+`vLгjF7T!UGδT\fRkv>6,o#  &HD&HI>MDa< Q1esl!QіBl)l&FH s!f” ͐%(35'bZ׭pJ0B8R# f A07H2Bj 8Q_VD' Y 7+1ARnrR] CY6T 6H2w{6ٱSFH6eT:6HY =Tar"]N)]As#ӯ4)*SP+񪏪p43-K DHpgyDMˡ0 )S&EˤV&meM6gSM[(MfŒ& i0^_l¬qiy!¬0*%y:{I\%۟ݨ <)*!fSVu."+@ v:sX6tIjDnS 5NNEqLm*nU$Spfseu %`N?J$Yae0 3 i24G"[mBR5\ eeX8r`̰ARmk1,b_EI Bì3nvV%>tȆH0vEh;]q*ZeVĒ#tb.L/cQ`7; Nç {TݮYB*e}jdyzn@ɏN_ͼ9Jcv35(i"4,4s#kG@亐A{OQfYb+".ƙd8NuW](9{)IlӔ|<93RݙI%trڿwCElY'g:2n=gtmڱG\gggqyd?;0'I.-y]N:a厛eexi|"sVƶήӜOK+'g2@'gϾ5,:8XgT],33 +uAn(,Hg!i 掗/d-/w\epqczc3tl.ڗ;6z1plͦ7=6_!=C>w_(oo*!x" <҂0/Fv*t\酰M0m=}]agaƶŰ=vdSYe\5plL%Rmˌ;MdrJ_aJ< Engt|WY] %)ԥtn(ɮU JADUЭO 8Բ<&9ٴEMl;pUkŜ.Sv3-׀WjY)#< +y7cjnSi%VV\PLGH+djIn)" ݣ=x, E3 N?L}~_> #>/s?u\[k3i stH5Fҋ5l *JڠgԒ3,͎Jra'hW)9jǚŠdT%TdYޝ|D][#jz?|41t=} ;vpB БkJsgcRUإƙf X"#Fٿ'?͔d5I4TV?Xf?C=ю=,N`xIQQY&³ΕE%+<[5.,:wwTDHZj"\cP&UGS<}D1 8;A8"`ԊJ@ACOK^'GL&9IrPw *.~ӻ{=LCEcۥ{mR w+K0 d]i*d6)fsm|`=yI9BƢW%L)z!<L5_n\0SӂѴo3DTúv+n2$JR?H.&ŝL5g nqYm:,jH򸋒xcA6--&#%ϻtsvK|ofE(ڡwMuǤ KTms,@?Rjo03=@3ܠvuŋm%KC8.4J)@ю;-dL'fnK2s`[q 4p"yMjRǶaI[[ϩRcICVYjɟ&tkWG:MD!6`m\#RsTe*׌0Hăv?֮,uK4ZyQ yz.)W:$Pě~J5+X;c^V 1ƶj|{\aY@C^IJ[a$JHCnY]uMftmI=:‘fRgվ VZD8F*w;Iaݭ#ΟPi̫go/7 &ӕ4(=]JM0V] qC#':T*٥"YunThŶ\ }M;ka w>z1]b?;ǑZr;T7zl=פ;쫂29>L'r3H_i=TwLIN;I~AZR"C}%p*saK(:KὁFZ=hz2_e^v_в|so>i @w@TdȄ(^xS( ͎nEyTM]}壙.X C,TN"ʮ;49=3#9* {UB {z9 >Y'>k֋=Lc ?!hOpF1DzN^^vqѵFѹi2*1/ QoZ DQR.*  I_yԧqЙ ۽39=օ۽@W~-þ46FVit|m?CnG0]i5/@ɪ.I]9WT֡ʚ?Se63OPIuce76o,0VgMFO⚗p05*mQmǍ榫-VqcZlZef%;2[-4A;侫7=᫰a7rgVCV' L۲nEXS~d~wnPߟymǶm<(Zu SbIJ65Mcy M,v#sQn7ƣ@ eI3fX-mdš0}!ϴW&{GpъƹB Heaب/7j}$Akf?lf}cS0CF=d&vФ1mpDj]<}[i>V 0:\O{[9r&/`t(:TMۭï2Qb. %DAc.MnR& \ߨЌI#?/ ?g$ *Szf9;!^&4|VԼPvF-pYtύ*$3h{@V`>uv1L}h8ͬUS-q~Cn?Tr?0@d\֐W_FPG0fj5o+ʄ^Dif4b+ fg竝Õi;U_& \\.S{5-PuQ(>xjV)^QVSG=vDreJYfTQ2K ,UmLh٩ekX雇m=>{()HVs9&ˮtI{ral3mݍG:4^QCJ<8H> ˳DGCb ꭣ0($LURRxT %"Z':*zIp&Q8\Š@D)'CZ{QHj+uמּ ^+KU; =6e_BsfTWѷ)PUFݯC2j"6w[in6BIG4iܸ$ mW>m2O$f,%1FB3U?Gأ>GvrzEIpCMF& 頮,!޸5Msˌw~V )D@2ŵL:\$ NN+y8?Mse8 X!ɐUP{6nxW/[ *JX1P|fb}ʒYi]tZKPWIg#g&wϐ31=J`q^D^;us[cvF=LN;>Cw-ѳIVR SĊ$:U]SZ-+K'cq9t1q-!sʹKNvh[Y b#~r1ZV=h"$YBv C{I\7ZyѴ4[A2Hc6{Wt)8j{!OZ[W;+M4S/T UQXF#1Fh^dYy?S%Q Q2KM'DdC=c&;rU85U=LJqk$Wejr ^zB)t*dC| =gk.'ww2%qDAOZ{* e&O0%T~;yL`#ާ'sTÛ˗f6.bYo z*%qƹQ<vaQk:؅|0I68|Y; e' O!BCy,^UPdK){Qqϋ)K}.i4<|($y}\/fϊc5\eF6#NNGgEX-* Y~[kfjU++e~+j $-?V,/ v 3Ӽ-]=#eG+ehôX{bN{cW$]L`Lhvxӕ%8h/\Ix0NɨY[ەd14Wr?v؉*GHwBeG UJ׶ɣy1k~az,;*PHt*z0!D oF[ ,+U! \vU2,NިRv"AymL".6x'Z87͞it%y OmOQ!ri |U![c^vAK߫Jm"QWL(QϤ(v*>~<çgq.h#{wi#!TR8ַ y3M_.L4d LN.)mfC.1Fe7x>t8FfȌͲMQWf|K*o^U-+ q ?Y\'B[5[C 672YWB}#N,2 UI\Z㷟iBUm@!򊪖uQ`3ˋ ҼHVT&Iq6b#ł9ιf!MLe|VtqzT~0]䒏$VS'q'35P2Dx܇mɪb(A1,.hΤ␬\L1֛1IUu7{LQ7>7=Tٮ^d*rJiـ:߇uG L}Q50]VG[iwQ=wUM5obBBش6ߋ%YoTaC3N}Oz` (O$`w^s;E3w5iB@zGK(3ocj~)8OMGw*(}(0Z-h;& Hwֆ,!5UCi i;nrﮨ?z!`nFH{ɝ$*Pf5 м:QyIcj,NIS|e7MOdTMGz|51ONh  /wrIePUb;m̩I+\W4ח!zOi:4X2Fd}1 "u IFyFjֶ+_6Ky[m#wQ$t1wo;sAgbmB'+? Y9\f>HۗZZiffS*2҂kT' Ug⑪ |3-f:GƱѽV5Od >]M;|Q>W>%^@oY3ygk:wwLr8%?p hC}\/5SwTaWTԱh0DaWTiv 6-Ԣ[lܺ#޹uGٹuGrsSiw_ӗY~E{6ygvf0jg-ahP[[z:Qjڟ>? yZGUjѓR (xxYabiG}ϣ%>icf/x*sEv}e{橨gOmf ncp >UJqTdӸFEƒ?95xd:|׳@#7>=4bPg-ovWi'6]QI'pG3JJ5(wƨoy|ޭP> W\+m+| Q ,gg քf ]}J5wO28@e˗}:`KOpNw0CpXRx`Ҫ<"C^)?cٖh|uKeft1G剙GLQ*+5C:̜F2]YzL,}x^@ Vʨ]އ•J2Ic5bѳ%UwHB 5~pO`t3i.+ PӚt4w_PKQ{^xmq#mFFYxSp-]Bc 25~&jTc7VJ7fQM-&;I}ꠏ:5aC|D+Ln00P?y.N~3gp=xfȟ&ћήgs84Tp5f<7#%/ |3AjG? xixf:d. IYJd'Yr}$|(LgZ&᠌BHhJkH/'F8.ehgS)AX|Dӿ`*unOOxݡ.A+^pj=> ~R^aŌ.|[kTLE\?3 5O/ʽB/h6Ivּۺ ^v|z5roXex1z?SqbPW@ͯ_M=Y^K_}`KLj^ϻ}^Ң=CZ_}s zrMzߟpM=s3}*up^?/3.P[m>3 ^%Ϧϳ ~&4;Nk6۞pM=^*s.a{MnG%~0_S|nϤ9\O_rן~Ӱ=47{ʛj`/Âo!^fi j\iA.QSL yu?) o)?_\QoY 3"/;7|s[lj^}=r/{~_ _LdZ6Rvm=^{W=;3ˎq~s Kx^[%*sz}ZbF>ۚ^_㲌iY̗Or~+яEflkxf]@ tU(x\B;JJz~AZL⾌.#%>OvQNji5mDX +*@Kf𿝬zOFT"` ך\5t+wܺm9S,#~}zϪGOlxLOxO>~?|˟_WT~:} x%j~ul_7/ оd21W Sva3x:j [ v;@\忛&ݾu|~k2v~~M۬7fu~Jcuѯ`2E%Aa3OiO?18cOo쪃g\Os`xm(ςL[ܜ)ƫn<ϢlW='殽m3m~=_hx:lfL_%[av tv:2+[lq SATHRu"|_HEO<"!Q> ̓lӴb _3,_7 =|O_Qܫi!@%Pqq\r-&7pdf˘-(f6/B3m4"k^Segښ"^<=٫ 삑\ PWJ8T#JW2gwSm݃N/Rw \qΟż6Vٗ)m>ʎW9z[h:j|uH5c]__7a!0WdL(҇#P?׿껿?~gS * T÷(ѱfxkdž蚬hE^D9}v@c>`_܂.g{P0 &K8rdI">6TWr%NR[qh)y4n{̨,r +q{47fޛ7ѯ&ۙư7Lɬtni2&7WM.5iZ2MICJ0DK %ܫZ#ى)&v6&U^P[1fٲq1<$a{'μ+§+ hgHA'g@< Ete&?R'O 1:}{f$BFG½BdЮ4a!J=s= ` /r}*PBj?ۉQ@D2cꔽm_?A?8t5ٚrq FtFBϿb:z"Z g>0FvE[;aP]ۘ|H(wI?'k&G;jYkݒ SorwaVAj#%OFfku^g`kQmy-H$5Q^`J#J38$'x9&f F\|** ^q x%c5\bN_pKMddmNlz{f(߿o~'{Ȱp{\G.1*=w,NfUůиeR_n??pw&:ϑ 3毞/"Jx}mOa&%po?{_$_ok ^b+W+!BENn11]Brj .0b'\SoOxe",}Qqr؎þcMJEcwF,@?00$rӂe)T L~/;,D!L~vcBQجw\z5 $IdfO[n&XV朘 pF%c#̚ʆEkۖ>8<+h*8O/<{:gRc`)$B4)BUƵv8ߙP1YB/~$TP9 UG2b: @y*$T>,T]cBD,T@MO}`k AͦI xEmx,yX ϑĉB㹯|Q }G} d',fk'3AB̭W 8FXTfoF~o洫aa=AIQF6Y_Q(t4TO7j wc>Q.C?֠oWGgSH(8ቌ6~?#;X>e+7nu}5zޑ=Qwj i]?c~~}&OSCu'MOG;ڒ?{L> %BrTftaTgcAw fіtc޷b*cR<lVrnm+-i+=v<@̀fa31/=l&J_i38m&J67SWb`ԙ5/jT"kvQeys@Mh+Y]8!bL[q3> ڌ'أ>J#1Aց$Ȁ3m?L/B>S'gɧMaSnT162@2lێ=yS?riޭ3sO/8BI唜`xp-i>55CA=P%d3|$Efnas0.5iti_ 7INI D!ꐔǺqH[žsQ~?%-.tط4܅h ('=6HUfy,@Za^yWK^?;&=|w>?^ D\' /yRɴcX;=z<5鋱T,Y+'wG:u^ejbL=:>kQ>WOx/LNOF=@z^߫wb]?7gA7:W{kvK_,WK|GtHyJoC,%]]'fM暊2~Orf}{8b}D75mOhY h^AaKʒ+|Pyz/N'?wx2t1?qR͈fO>?Jlx^2oEfKk?sLN]R}̏?7݌wÿɬ#?$:;0LәO:֝Yպ5׽;aƛWh֙ߺkMN]?F|~&NZ޼}>W0R9Лf%_M]7 8>`%̝ {A~#__p_m oD5AJSi#Yةcab;4 X[A;Ϥ9M|TF4DELnTlBp$D qV~RG׬LJx/)h D4?*bvMM_t[tIgA+ ,)׀0E@6r`\= I4Vs u3 6%=Pމ`_3ijveb𙖶k}}U7kO2XvDu Ѽa@z`OόfJ>vg1&VȐ[&"LBۯèm(2>r}wڳJ2`Dki'HY,c"ЌR频΍HF ef77h$s0B<߭V4_>wt^&L5Ɵw H6T*1Rh,F;mօyh7sϽK\NNԘ ,%UMI]JД/,CSl]4I*賚l0[TQ ŷ$RD߼l"ɷף"3,$g&rlf˱4uU0{k&=׉R|bGAr"HNnJQ03k8yLOiѫV!PF1GJ-&{[9Du* I*^(Eirj/+ut';g^dۿE[+6‡?J<G5 QiO@..:В%$Q픶EM+[-z\U؇y;EG3M͎$B1D1N5 I[ oDwjBlz쯋_ʂ<3F-BZ3X,Q=8~:LX;)h)Q,=pFj>qPYs-o1?P{Pe1?(kԯo+mI~Z. (z9@ތ%QI_D8;Y=J(Js|V4ݚeǦkd-K'P,} ##ճ3J; šOT E lnc״@-=NNkW ' krA eNr6>W]z3T[ZCԿY|?Qr7vXZվT۽ (1ABE]oH :Ac AX  :5&tvu^9pmwQ Aa麗" -> iS|PyS}LcE]5upUi]Lc R[Yf=@B&"?9v.g)Wr6尽& rdZ /vFN3#S/P*ʰV2%wG Ș~t5<,jM:TNN攖;H M ?*"2Q[MWjSvvVޏ`_G6kW6 v6m|e3h^*]itvLE+╟zX{R sOp幺$4V0d 6ڰ6RHͺ*s/G>ZxV́묔ƹAқ-X-a͐y7"v[ {e~jBτP/n>9OM@4&\IvtBne{P sUIՃ Ƅ|ec]KLX? C?o~+;"wnavit-0.5.0+dfsg.1/navit/xpm/country_EE.svgz000066400000000000000000000003171264204753600206410ustar00rootroot00000000000000(zHcountry_EE.svguK0&ޡia X m@r{+!1!Q/N5A@Tfp96ȳՒv}|t #ιA8"`Ti%4.&mH )gQf'݂~("ल֏a&Q7T/1navit-0.5.0+dfsg.1/navit/xpm/country_EG.svgz000066400000000000000000000127171264204753600206520ustar00rootroot00000000000000(zHcountry_EG.svg=iƕ ,6ɮPHq Y"X,=5ݣѯwidˤxG}ԫ㿼[nOֺQv\O֯/W_nGϯn^lW_u{zҶQVݗg^ޯ^__W =y R/^ﺫv٥?VuMc|3fv{unr3gB}>Oc<˃klZ@w?dݿ<y])LcT?"?{%;kB|~e韂nWj{aTƚ\LkMk i|6U2 P&\i]$נ ҈p]zIWYi-~l*-L΁tF M[$7އ7&cinL|#Ch hm\.7Ը- T2ruFO~ Jܶb-*5 `^cP*4WUG|O33 ~a෧OQ7Ө1}0 &_DL!<4c5Qg@ V-eZ_@412 "d>:)x R+ځ Do΃ZdpQ4)2ShOBKCЩ%uSnuI.T=jN>5,F2K!M"zM*OC |qHe`bdD %ݫA@Y갧pZ>(JLQ-E,Kſouc{:E)S(#0ȹ lYb:= p> ]ߐNa3΀Mm6 FDl ڊ# @A*6zd$'\sdĚ'>fY91tžѿnŽB/>[B;YI!#5HΉL?v," 2FHg yl~ vee mq0f(,=QsXS4C㰿S!l66wTj|Iѝ!`6..k GH2hP|V(*YDab/ q̵,~;Fòv' `W$/8 na\s)}aqq w(3*;  zq1Ia\ UDo 8\XR Z'!r4# 92Ԋ-?Os/z9Gzav10\/j~U[d$'TjRv&'-gWcR5Ri^qZsATt(GMŃI7Dov:9gᑫxaԃYy}G:J7xt2<R6R1W-*턕60 C.B `z&;ϼk2 #SKCGO! ɚXldȏP]p)B QYXWJQF^&D$Ԅ<, !v21XpXtYj*p\A0#x XG@aJ"kUiu.iaeFI9de aÂ8^P4c-)>bu=3DeqS0y9y 8كOBf-rIB(|12z): n61ydblR++L{c8ʼ3G4EЁ~$70x;f]dzg?8s! IA|Hy$]ݯǎ,:Ķ }ËodŦdLi=8Ǧ$/9uhV'&}fP$!="SыN BCs'/*ѴH@+UGOl໠ih&B:Y9(1! ;F!1ރ;1U''4F@e0 ʝ[d?Av!t(IL/9Ԁ,4=} b7c6!Ύ+X'# NEԸZwR+ME>EIJwQ AIK{2C̝sBc$$S nP}:8 `s9,uEEnEqX[C~qP` tQ`GO<XB* D{ {oDMĢ,ChF1z]XG&#R')G%EpmZQ8} !*j`7 $x @nx1ahgi=Qq:"Kq\,j3YѬ1,kO9~ fBDPVDɌ蘒9P2 ܠ=X0w>W8@ql*9a9J2k:7Ѝ-V`P:cmBϏV [9,-Z=YGeMtq:v _i^TyPh sh=LO!aR^ej#6v >),̐tq᥶h4W::(Y=wsi7ڲ!bV{:ᕅwx@;ĦMkv]ɓFlplb;T*-}9+qsǥQq Y38+^+!pP2:2> @;Yx U3KxV '7X")cS$klQs,zP AOE\%1F0_?^ ":c]zBt@voHm[đ#1l(m-HBX" wK/ H{e%1Epzljه'HjX#@ ~~a MF9ml/S2qlLe$p}ځ-vQ _ԄR kq|qR0[Ep!ҐYjR 6sT*B<7I$"bE J.׀G 1s)XG;=@Yb_R#FL!53wSuMjF+kiD)^%[V Z#"`G5-%3fss4I&@I/\&)6elWڲPjfnp p{}g$7I1/^\l;y' Io*g V*x=@ҤS}a|Q[BcCj/Am%-Pr:)P0J0:kLi/8b$XiÞ*-k@b:xֽ;nF(5~规rr`,)+'hrh_4qgNhA\:PHi &m?G6? L<8o`"*!?y }1nE ??j|pEqOrMI`X4Vr/-=I0 {$.Gσsp2(D^R9 ~,.GC<=m*<&'۲R3$-MC1~4N,HX  5? DR'gր'TTY+;"bt'$M4 xp5 έChnxOh| =*@p (uӈi+5:U؇~]rD5rM-ʂU.D^ @B{l:q5׺& OqѲŐ~/# ^quYqliC-`ox#9c9-rxU@?d ٖ:AM3Im -@75[n `))ղOP5L ;̤{M(23͇yV-Aa)dnavit-0.5.0+dfsg.1/navit/xpm/country_EH.svgz000066400000000000000000000011561264204753600206460ustar00rootroot00000000000000G(zHcountry_EH.svgTMo0 WhڥE$e}dq{0`v~8li'Nz)&_G${߱-8YVݪi7r6] vja6ce__CUkv~h&Ptf~fpsx\1m;,SgRQJ91f_OYms9gmu+9&5 Z~^#q6Oj۩ʹ. "B;?u->t5hwcE.KnS":No`}gRH[Je olzdBY]@eF^ 3RY"e+KȢP IwծUh):>]_jTDߓΥl4U~άۗU x&zT *G7zo-݄g/l.%L(BlVp)lh!I۸!pirnD.۔"`F@4$QMd2(*Vh bJE0VGЀp`N(ӘRPRM ϗ^}e6pW:B navit-0.5.0+dfsg.1/navit/xpm/country_ER.svgz000066400000000000000000000116121264204753600206560ustar00rootroot00000000000000(zHcountry_ER.svg͚koq`7-*Q~Qlin"I74ͬD $e!eI7i@&\gyog~ݼ-;dzǏt\b}7 %6izݽ\-/f~/>/_~^qz3Mn9ٶˇj}/] ONjWs[s>V],r|a\N[Mt|חn:stfq3oi?߽?<3T,ٟVŞ ^_>,Z/X^}{x߭a1G׫{Ν9jpiѣ}tX>8I|5L^/^.p-XaWa}^ͦGV~[PnvݛNgQY{(;J?۬I7 ]fy3^\?}v[+ow6ϭG0|`Yz~=:?iއx[0z}gOnV9IOTFKmWkj-N O F7Pu8Z,MBsGY_-ot_u# z6}s?b9{7#a廧<Kﻝva?zvud|a_r[?ά?Lfy~_\ZMok*O{q_TVKUΎ OjNw!=l˳˼\~zy}z~8UWVu/++P"}O}ŧiw_cS0,K+Gr~t폿~K^jZqW~fZX0 S\8I5]),D7vKKn|Fc sJFY+9Mˈ<Y(8{_Mb]':wGω}^Cd~J,q3GiZZOs 8P,2otS%%& r4 2fM:vhF\Pb;@jP-T)DYCݳ-y̓2~EՄ"pRTPYV3A2>eAo&eG^*5vBgA[*# {J80XR8e@'B= ő@9 NSbbT+C;蝒>Һ`W32%' gNu|Jt$# űdN> =wgPPy_f2N `'eRq@)(e`Q#tVnj#2+`8b-D*L9UO]I,*ʦNh~jH9yD<8!+X\@m[8 FV(%((;@[vH(QU,G&bu_+;VHV+ɐlNMmnle0+# Rz)Vt"Ɂp9[ZT'r I\f2*6 ṕ'p!WçI<޸w<TQCCAԧ#r{HF0`H3RZApB'x񆜻2(m`Nl ^ xe3!A09݋Pۤf4(XGr(0%Tذ"+fms,@U> RWNH ]1KMXh 5sT6\b 8جS,( %^t9C,F 2 ǫ),`>^xuԻ(D|X1ň@1)D=6ixÓ,xuVt NḘ&:KfֹlL:Fxvm'@KVE DUJ$S'RP_@~.8Cv2sSz/ɜp*+Xiv7@МEvJp@ɰ`; |:`-usjT$4v!4(V\xtǛCR{%-xQIeSnthpU d*)eKFXJ#DygeV`7(nx 2'&\')AJURmCiHm]2:F=A+Z*2K13Uj bJ h.=C\S)Ԗz՜]hsP4+}5Q 1 bM%Zo8Bmܺ0M\yvDW^[@\[2ȓj@N'ŎQPAfP7kr?Hl l%_zf2J){ )WHEԏ6 scn欠ε*k9)?ˈ(`{$ENQy#ƖBLvFUv3S%@,uEP.fFs)P6zGf9|L&]*x&zNM1r8N؆)S0I|VƓp 2'ay ^gƟ&C樦јduzvS^񇕱ыv#;`ϸXAZ^r7n,&Cd-l';G> lu,dPJ_e*R7%&ВGJk̦?^LDjN . ֨Ex c9FQ ̛46cHC$6qfX8%1\K;D].]%F-!CZ"'Vlt{PƨLwz5a&`1<zh3PKڀf"ʣNJbgeSƂJF#!KtSøKFt1Kmuw] J[)!; {2속AYl6Xq5KBOHDxo4%t3N,zd8J#u5&,|=]DpOZ4Q1M:d|V_`ݏdVԨk]lC`>[Gw&i*6$̑j-LAZ= j!MjԂRJ 6 F. 'Uc1B,6egSA ˠ1G ճrofZRv+c/vcUbQ F$cdecثi4a-݀F*QQB`YOJd1ŕĨF\1;4Ŋa*9UMJOM$㛜8,94#)y F5fb5LSh#lWD͍YW<]=Vi&8|-sFv4-HJ[큪)xE ō" -FMJ `"T.M 3 f =芠) %L7O:fg1$ZsM2 fo}ZT! lcIjHEWa/ȏ*hnHO֖i"n̵ar`B6UN'e[Fm`J^F8:bdfZ}b97zRt;+ߔ O:`/2=*V_|VO_]MM_-ǿ_e_/wӟ'o.k(¼c3}IpL՛#_0N}1 upгdܧÜS9I]:YU_=gv.Vl}/NLsoိʿcP~B>,V^[/+navit-0.5.0+dfsg.1/navit/xpm/country_ES.svgz000066400000000000000000001457461264204753600206770ustar00rootroot000000000000005(zHcountry_ES.svg][cq~`9hGFBEKd ݉fOUWCiGؒwߎ~\77XbT !.]-yX _g`޿r_boM5]t\f<}3C owcoX ]r1hEmsGWnaonoG77!ӱ-zr^>$!p[l cb7ќKbI6L|N+#fDyS(u_CO<]u L_C+W~9]8ny?}@Ig`+tRyVYퟰ;øl24= @{H&r/'U%{wS(u=V^@aDPCJRFM:mMEM TJI !7xz˽3Ƥb!4$ 3$LBQy-2ޓneА!!ڻPL <@U[;~L[?d2欻ϺϺݝ׎AWn_jO߽.7nWՇ&&ѩi(BiMHȬ" Ќ·eP&Z2д!7(}S i[b`-c:Рk٬[2Fy& i5„ceAiن Q/kk@RxZ@{%&MoJRK?=D@keu Ip`9l~&" 4 U ojѠT_IӗR+Gt}T0A[@$C͇ J_ ZA "lfQ.XAt4g}v",Psq '4P.XjkMq =33)PFM 6?YuTNzLa'8YJV`i/ʐp!OhdbYI'5ŒQP„:zHu.ЎjAQ BreJ"㇘Wr"9Zq W):&S! iSHX:۾1Q10#U71BN"wȤz`+J ; 4DHĐhҶO[J 34m= ^z"|0|8a\ĝ`GO6j@;Gߴmϑk]p2~H2$O6MCLP$>- ~幐@t*GJd\Jg^ѡ-Di?Rc7iNe٧B(CM{π.N`0YLbr }s ZѻlH-&Hĭ=`+E@'$D8,u9EF ǒb"Q(@&acЃMeVf).ee喐B7AS1B+fei]G<4qLq"pt˂Mǫ%ϒ%\;k$ۣꅢK\] %-zR3@Y ">` }iJ8eɠ:N4qD}e,%+BV4\ yjH!i7Ber0WFS֢9#'D7UaIRpT<["pj@ؐ7R yJS.,X}e|@Y 44U(Fϓ=%01z2PY$4eU" r\JiKLIQ$-W#߸O9eB5kb7f9Cj]C(d(Nvc3xD&ٌvc҆'.PZ$'t3Z*X"Qi܉CcUӺ-5 h 2+)6&QC ڹ C-DZ["bQ"lEeݒmF)R&|C$$֑({l] gzo /[Ui}s}JFkU (4ݖt,I^zb,M*>Q?~TJR!fϐJW es Lݖ:kRR`Ók -%`-c:p^vvџT{Q~9a;@5WtO>t9߶C\R-)sI*Dδg J(WSvВxOSߊZ̍_MY^|@b0,+) T|1[A+E*jorƺ 0wlce"RD(=A:gt\H֠??R,0ۏA@z< a-sĞ99rt_ il:v~4DZɴtMHO.Beh-ђϋWyoʘA1R-T. z 2[tksrP[R){Sjƞy0q='S%PʁgDdYpO`2g 9ŷ!~dvd )G~K6$a]ʖr}'F)oOuCJ$MA#2!Kd|MsKsw#n"/?pn[v.l^IMv"xa7N§Ct錳9t|]s·hLKg,.t=Dw}Kh?,ZR]4tOݐN 7Oħ׃blmBPNFֆ΂a^p`I 8;7tiLX*΄a5& kL΀ 4|"a 0\Ts&n|ӴioRvRu-@3䑼 buӽ$Q2S Xw7..#*A\RN,x!ж'y@kZ*pdC-CO\WC93䑼~|KJۨz1 W8*zȐKASܫ- H^0T|Jq !9^uNO9LE "HP(j,; 6x,xG1x +7u NbwSU>X: Aǯ-$,`|bȦ ^ x&OJ+}:si{kӻmIӑR&wTxA:gM' xuW:: /asKqpilq4[=O K H^&``v(ҝ˅'E|.$TϕJٚix^+LydJ\(w>].,brOG<㑜~<AQrwq/oDy\xGNg+2BズOǵ X Gx]c̄HXnw|y)=B *.vnM)S˵c:^>L}HsPs|pL~mn<:g/6:2PPvs%K/TO>w}-u9{o,YndJ[?IfMk#Hݢ&_,;+udEYJlcOHb E& C="ʂ*Z~G5^I XEp G) 5&ZB R܋da=hg+AUtmwhВfʁhk7oUo%f.r8Ƿ}E`."VTf,(Ip~9s.SJ-%w J?'M)A9JBmjW(\P%|>'lW7 \ 1fb66ch"Q>6ޛc-ImãЎ]5,i @RA1@>m|Ѩk0|lbKl Ͽ C`}+ W}hzly&@m"DWyF6dXY/~ͬWbx4$^ͰÈ>F*r\*/"8>v2Dz嬕gH?|t?J+3UImL3Gt%6fāJH*l YaV8G!F*"W.9x98Fwx$8hL(ZF$ Mj,)h"lЀЩ_ͰدK6+4kg M -qI&-1-mifm?e;@7CNga{J-=@TpAC81h +ƻ@QϵeEsKW;""H] ej-`sA.TSx&'ӹz mOH7k~h_D['\H2oe*),騥TQ+w.~$RXoָ?sf$)(fQtqR7)"P%\ i5 l cGWo mDW술\IȢц4y&t&/.낢НBx(G/Th}&lӉZB1Ӊ ^[]63"]UF?REh'ի%jL{t:K):ܩ\/[B4>bc_O[_.x{ww{ww( 0S,`4ދ99qbS\], NtrAKGrL&]Oc㴃[bvq/eKwqgưv VXaTv:#, jxY\5.>"',`s  Jʳ%; @WeYei=ww}~ϻ?xPNӤg<ǥ9-HD$t5;s_[M/_BOhUaaceܶ&1DRg )toߛ?^ѺcMR@f."G0ۿ#Svmk:jO]WY#3 !UD?* kr,қ۹3ֈed{uI;#m+xvW_7P,Q9'˿ґǥ}2G-A379%_pg?p1{EԸ@ȇ2.LPN3^B6b'.鸫z'.KKӖU{>qB~4lL xe ^@97 ~pΑ: {/{)x_׿b/3Ǩ~D Ealq MǾD"az@*8|Fx!T1 ;|BhJNx#ۀ1fk\T9O x%Ѩaj3+CGGDMm.?WOM2NPE~"HAwig JԈc^OjIbRdWu4]|zREBRoxBŐyfP "j@z@zJtzmzME=C娂E^SQ:Jn$"t`|L3ɺm@5큏1*/B@K5HŎaжU wk4C3ȒFpd5p{% *iq5@T1SP +adqE4d/j!hhNfZ1É8D[G#ݍC Mj$|e.`0, 0<]A;637dpy'vUJܒ  у<*sp*@ZBa C%R& g@O'=ʸ0䛌<7nq㝳dh&&Aß!rCW;MF Lʗ <¯P@ ;cJ y8sV2gc(r ;ˌɭҪ𽊶AR320OK 뱽+(,\MRMmLs`9UdbQt,71x DzntZ;= f"n`PJko"9oTaYZ!D;&:ܙ]p:O`J#p*,fpXqnIi[ 92Xh˓%5/E xBpꀛ߹9晰Oa>'z\}r}ύg)͗!w7w%6{.$&:hDV+`02)kU[! ,֒7ӛYF;+4& .ljV(əyb dAk3 GUa/if- *{2Y>'k}OHgm|Ӌ;]dWB7/'@qt"7Bk2U'JgH% [Z:B|Hn.vf.0KHi[ "AIIA~}QYϕ* w3C˃) vnTJ9UzZ˻ߴ򛢕q^pFV˼iBPwl _Y-8נ<Ɗ:^R6,1111Jl:>9v],B6n -ʊ"SYfES 4= <e ̸A*xЙ@ \oK/L~SH/GYk)@PXwyM+ٖTd%ժ|~kI)=ħ+\ } =J O"H*+q7i>(0[Rhpep$fZcR;ZS*P˗.@JRSHa<;dg8V- -)4kԒ`k[fz3hg-1@3z,LKd\|$2$w2*Z0[ZP"vyizchØxb "X 3r5^ufK ׭-1퍔YZcz{]Z”'7TN$Z>!pȇ2g}є!g9|8<maѢ̇I>(g~G7YPc~( ߙ}"(ezda"=%rM `#ISI E1▕"smDfXbQdE7|24:(3D_M-?оYa<̞"4kAVehpOf2(0[ZP֩Z mI,cu>c5,[A㺠N[瓲tB >e*w҂(nժe>ؖ2kRaL>| E'3܌rڔѬEӒB,u2rhْfZ1‘XX@8豈nTW,P+zV];މMKSʥXƉhĺ2͏LI(lRnWecd&KIGﺵ92d[jW播ёh=iLb;[-Z-1Np]!7)̘H^%bnPCd?lNQ"q(AӪ2i[mVl5ICE KBȻ)[[׳[5I(/{ab1' K=MX lqwֲ҂X9kQIli KgoLԲ"9 ݌W͛$x!,,p'c[E)Rf3 x֢diggOf b H bb(ܪ-~6(WjTlI!ZT<[ZٛYF;k9:nuĐy aL2%lFښmZfK b1Eɳ%l1emLŀ6gf\y Hŗȉ gхlU{[}K,Zw°v7)ފ^k[07y%0emkdYa >OH͉u*}Z.g1Y(59G Goxmƍ]sL&BF{м]  6R%5ꘫTކ4uSR&p4u3[1dnxNC?۲oף/ / //*d/ ja/f,.{l$(`Aѝ@Q =e|]<-p$Mތ@^WQ~]hEVDS/%Zm A$voD,XC,Qt3y29DH'Qo)EW#<;.y(3E(j"xoKǶVbm@BmԪ"[0WC='뮯t_--0{3ς|`_nJKWz` ~e?WW m/HLi-}\<=dpWC%6cɛj<< = NNz4PYo'xVV SJҢR]3&9o D! 8:Y {dČ&/K- Y4 +IH7Ke6ALUf_X>T$ďiArGɼh%Jeb]W,`6 Zһ,J}BOk."x!Dzݎ(2j0^8Ty;usZ9 Pc= */= : 6n$} 4@p!94EBO|"_BU YY!UL SUT_X>T!yȏѤ^ U:9 t>s{dS!ezqtA-N,hwCz:̈́؏i!?i)ED֪:1yL9PH8E^Jhٱڭ&!%|X:z [Pc. 媖)%X!}XB})36i(G2!C5xbj 7\-"M$;u*kV@NmRQ5[|S#Ƶ(J;Sli|GTU9nS %3$O4uXSM4D;ӎE;Pz3bؐ&:d`L}aw2#/6sx,4$ SasmӠ4h]f?'Z$F勓W Vu[9f形 #qk2zj kA~p F&K E{:f'mA2 -k]P˄lOX ck}? &\*UzCB! [r ΂ ueyڃ-~|KN~ވCH'K,BQ]\_P?T5cqd->aw2u(ܪOD75%6ިQl(CReR'$l/n[fz3pogv4"@}2yJ[o[ +m-rGзmCO}+-Q]+4 :Znw-̂ZHTW-ʜٷ֡'t>nd,zѢ`uhIE /L/Z' yh ~|C:M[HX!oxO,$M_e!D.YW>_C$e[ZٛYF;ki|C|ki9bv ;="Q2{J0 -'g%y>Ͼ2kR>'#ޢ?I#ƅW*e):}HYJKȹv ܐ1(Bd N>-OË/ϴ8L Lի/kzbezжki7>WOrDc2QT'k_ZɆ]˜+Hnk.%RRߣfy1iD,fdE&pio!ZI'렇"L_hWDCWw#jdή FeDF&w2jEx5\k|ڌ~@c,x/H^,VSy&Q$RO͜sҴd鍄`&MB.gC*Rxgt7}}_EPz\ ƙ jX%"m|,FX>6"1+@Ħ"ƍEYU&rz`qccGhy >l " W̢L+UߋU?BTb0 G1|wV'*.C񢄸:*50Kgfxjf/u}tO9"$漤IM/>:%F*6s C0$BI(%-@ p5Su~dD' $oՏ"E.j_i,K{=n;Tܵ gDKxР$P@51fI]؂ҶnDŽ#޻դ$=NΖ“cL[` @PKө O1MMoj}:{<&Gg:9@hzc(:(\ B9FKX&j>CʆL'}d S=>N@f):Oh6B @|Z ldj1|kcm_ PV$# @vp֢C8 _ߓd^C<6^v0ZHt EnȾEn#8.ۋD]{m%scR;eHH_$FkP !-aNuNYB+ܗ98bJ;lKe—ֹL BM[Ҵ`PW7LM2ݍp]NIbHY-.BA.KE!zqC\l:my§M w Ъ6"1m:"}v3@32s-ys9beIs֐&g23Jj9A +ϕ3*)2J˳wЗn9vrڣ/-z{~ocѽf+C9bBΓv֋b(Lct6a/(DGsaSO{yPɝ_ZpyP"fVR̜Qn%v0\5dR-}dʚ/9hg'MJeG-'gfҗWמd}2@k+ZE2Uν2~]N,;hƳ8v,"`~e٥qe-оͱ37,[ l"TFo(]{k8{99?0;0{oQ @98Ĝ"wXf^f^>aoh'7|ꋽ*) "PGpbcez,оν3,;KN?݅n]٩ ˳W5*_='d9X:r3-cywG~zPM{l[ @q8Bhgc( `9f՝,jqۇ|/ˏ9p8~)츦PZہ%'rQ@h񰀯4=pj|{M $#va#(G{21 PSх+{~N;&'PcѿkfIbF @Ђ$"x.}}&s&T` !:7W>j|t*zJ|b %?i}3M; p~_pތ^\%*|J8~R!wp_1i6ƻI \x<0y@y(2Ŀ .H=731|h^Ô K7sJZlQF^SC!sD8XF1Zxf^}=; m IAD 40xMA$ upFQ{o-p*0˚Yi0Sꗄ)G u{Yr7ěr~Ksy˴:iy$U 䐥fq2^u\F8DƘ\,2Eo3F6o$w%)UhG?yaPc,mZZAg:zIZ[UdM]*N5=8EPl"UA<9LS@wBua2I3]~0{HU5q +]?]\,Kn:[%wg7.R2H憀ĩGCM.JܸhG7'L/%—*D!~ι9ܶJAR#ljkxTْc 6^N2Џrf.SD jGI$QhmLNȥP )AyM VSk[=z2S1g2Lz/3ACJ< *sUP M-:*3V'^z(+?ij:.V(!3^hx:xW&bM ^d<(\¥46!;˜$'@Q (HO+M ] d&ff `^]aSs57$Ƥ^fvWڪsZ@Ql_xcZ9G" LZ8~+2p!)CpRe!O6*gC"  Y >P]@f]f1qN!h] bjێe7s:P@eN!6)+8&qh|(ymA $|Š815DMo#CNNŒ+9 9Mrđ-`7-E9J37"榲o\j~|ʼn3#1WЛ&sy] }-Ŏdĺ#28G4 J)n7qk@.e9(V{h,k+NQN2;Izw_FFxư¸Xȉj94m?[B"BX%ajH D. (CAU"1k~F" (gӐHܸ[1(5EA.mA CU"뤷f`V Cf]Ī*.#ҥE!`3}TNC[FSfV4 zb ;q R‰ZLEwqAf[Tᢐ| AXR]%}'7K=!S 01}KA0Gu`MDC᱙T2comvƔZCzr9FB<y wm{l۠ fB8PӫݷaHBm4O`Yԇ:^ p3:B?Z$*4NTڎx# + csC$w Rxy@:p s0DfJn7W A"!FHn;`}^5*C><Ĕ"Igid2`⒙E22'&>ߕ pݔԪ"3ZaHЃ>_fjrbCGpy=So}ᑳ߉>}ǝ+^(#i~'p._7~DQmOݽzNݭ=7{wEYZ`.4HS%ƝC'BB# Ѹ=od֋n!d["߅'0=`N} ^eƋyc+nb[j$e7N8\ɥ]/:ШD=D=Sq.ɔ9BCfaz}%Pyd Gݝ(|=ZtyP]/\&P⩷ zDOȮ$ߺ]^|['Cw u@.>?9 :=T~ Nܙ {d́;Dʁ HsPYnwؑ޲˅B˒6F8s=\vn}Zk*@UǑp+ZRt77X]qI~>u&…s0[Co$Y8 n.Yrr\8A`<~vk  C^T7/̤wwNN.{ux$/]3_A~D[5,K!')@0/>^ *R"3\'%#oS.I[ /<! ^$$_p#x k )aSU#Ak,.$@LN[-fHE=*otQLv3nLABb[LZ>'@dP)J@wȺ#=4U巙y,oXB=)DRV8d!ZbYϬ6!0-54N2 sZm- -)Y^gKj9{3hg->7, `Bz`Ov0G KƤ rIG[%2[Z,c u~~iH:ɊЁ+og^'ѹ#M @zRfl)hKoX2Ct3;OClR| 71.y?̩ N%qpH BHDNM6hX%`7))ib eJtΡ^,;/g-K}snxg?'O(Nj T8/'%?7f,?QJP(ox;yo)/T! p'j!Z,geQ &')YQ x9;0$ @ptII)狣'sfZ!`za'3aUೇلK-V>6qUz?+A}hg7~ H~Ut7[py7f!s'n : jů]q7I&^`TgR 5r\ c#nҶQF"|܍3^GEۧ?brȐ@($xBzcDkr@\2j3 i`6qE5.57@ebcΙH@j&w$ 70LPIL`Umg׽*ıag)V&jj_8r[ 9@>> :po@FPfQ:ɜ㶖N E֒߄&ԟPt2/aAȮxR_z9p8#ut/;қBHI; kEoY?R,PxͲw;PnFD'Brҏba也]ϲgΨ׃#7s=hR7r|NtLΫ)TL͘wm >30 l )SҺN­=ma-ETN߄&ԟP_vGfWqq 1FR=\Q/rB_~Rܕ_AiT EWM~I{erB_ɬٷ@1KFH`4,Q5iXFaAҰ. ~xFR) &)DW9Yl3 .aCml5ߍ&7!>?38BVDŽTOꨎiKǤ1U=Gci1U`tL(Fc8G}/Nj gO bwN~R[ ,D, nSpJզi\ h\Pa7ʔp.hʀ9f4.pEĢJZƥ"e4.8ZոT)7)ͱ@h\Z"r(\M႐yN.*R,L@S9RQ XaVB i4~~7*_!r(],#5a]z{_ER~%j:r|5o ;عetg- 'iu[ eV^hg->M~ dAb@(3IEFXNǗN,jԢiiA 4۶՛Uf Aj)*?PAx2IV dRԪB5{~ղْBZ.µ4NZfz3hg->B=7u6gBdܞ"c[veZ̖H>ZsakI,c P4GB%$4$Dm P.9uf.EN!xD$#G,ɚ{n[FR (@< I#ExTVvN@xuF^1L*^#j.flC&)ҝBZSU;c4Q "fAϻE/d2eGsڑ&4@JKGr)'W3=(A{֭7n$ƍ XƇn=X+q{HM= C =܆7|ou#H8ފ[U^N I'I=+]5"PU  $De,1Cvfe|ne*eizI"e.R)^Wɔ4D= &#m R OC]+PIIn)Ow.d{:IESF34ct($f!ON\ g &hIQ<j i8fjQ}d@[vH #p*WI={`uthI5gx E(фщV+DNP+WqBK"WN 8NmL]4Nl|} ԴE&:#Dl%K$-1'56_8zGsk/S$:e]`ɻ;]oih@xOMŞn%HA2! 4D{0) ѕLӅqy% Iiy?rXmJ(I[H\IwEg ]!#I~ܾUO!zN=$bQ\rOEN#S txL(wH4TD3%kr 17{YEW)pBpnWeS@L0,8"#B"*(2ܽIRO |"ú[Ɩ#騲zك[\TDCt;zԼihSkjهbyg;5B cjNX`Ksֳ8}97$PPN埂>bu:'uτ!aeۜL1ՠo@e+ErB|q(9Si@Aji":;+Y8yCqhȘ.TC-FD9j}LcKS ! w~xrI7'Pb!$f" ͎~K̲&e$3S|W|ц:廝.d<(,r"tM37i)XE0vk7-jnR=@ȆM̦Ͱ)f-hp۲*=\xn(͖C ۖY.e3#p1M+M sM;覥Zٴkn[ݶv*fĬ-ynWeX-辕erZYk쮝ӗ~>Ů}$2CjMƱ? Eli,@7(]7kFP^،tܮZ4z[ @id 4>.@G3*Y4*#.) 3jt0,mT/S@ P֩o*B @et7'l4IʦFg|tܮ8PU5ij$Ӳ@<4o4 UKSP@b>l-)(J0 */n #9rγt *FP Gʣ6+b4:pUn( i*I5fu5zjM @1Qw)5\QHZ#F P,Jk:kcޛ̬ɪ}kRt gS9+p۪̔%<6%x,%+U\QH<((m)JJRd.-@"VW-@p& }L0ZQ-E"5Zyo#NGEYjdfT P h':?VH(;j#U P&4jt/g@L hP1ZjҦM~F @DmgغwRUI'|0ߌ\A NTN\VK- ԲdҒHoV0O"OɭgqF1"NlT&O r8@,ЋAfFlYMގhW4WY9#I?2~CHنfs%kwNXʞ>fr [m,#FEG6!vyH5$"$N"I-M 'eVB4º淊&hEd:8:qSΦGvUqzyՖs"j$$mt2o<"9u^uv]&5֒ ~γTo `>y$ "SpDƭ9Sy]"/5JEp:[fw?2H ⼤uěc%1\Ƿ"+C#;Ovj̡KG.n*} ġ 넫ZY˜zNlŞ 뤧eX' qwb 'l8'~q#D\ $Yo,1b8 MhNb"xcHyT;q1:v։Y91b!43HeN.>ʄ`]I͜]:qs\P1D'9]Ds‘wL pNy眀j3@#vH9)w3S6 Ty iˋwRl]"RމIJm~apްN8ָNpJf>N\/x'o<\l},`Ÿf=ZwFZ9Ph7Z83[GQJX2a2]c-l/mkIhY-R>OnĔªڛIB&T PY&zhZ&ZeBY37[RzhØ\7pOlяMFZnɸdO )G)+/Iẋ/}?O݀bHwS7ǥ)%X+(9 4uflzM`ښ!` sm]]0D"jLd(HUSd/X0("lVm?0hql3ؚ D`@:cBevwk0p+kNM5d5.TG@>vFoڌeD*41m_Tb"7Ect;qԤ&!z^@ۂr RC m UPpfxt kvXߓ'T;-qd=.@^i iMB1e. q6mkQ{$;kd*4$WU04vZI/%p%Z&|:Ag)#7ɹ/CTcw+a*cP% SgETdzYWuT@( hܳ%{J}o=ִs(vN`x cd읛mz?_/׳s?~x\ ^V$@oZ N|FgNC!oL=J$Ft_K#qZ{ᆹ[ގ P{]@묘^@83W1 .ͼt)]y\>n ǂuyȐ"r#J  O4*4'x$nuȌ)rX}&зg3r?w7;&\6D_HoD?H+zHd?3d2Q]5YhdfjQ m3pp*Ì=BPBAqJl9",;e|__z␬ 54^ R92L0xOd2'(Mr<8$ԄV]Hpxxp ,udZNҸ*QS6*‰iMGKybN۷@v\ 3;QU(o4&^&>qRH2HE d :\ ziRT"cvlmm r_^CBphw܄Vɑ~U%C "ϋ Զ]Ql4u=iڗX{@; o]k;{,ݐZ.`26X_#S="Ƽdm-X-{V_D;{<.dSW8Zidq0L߁\B>$:ks/tѽrwgx@%:;Y`A*8R+KbŁ(&BԒHڒ/2 M,QƖ]c-WB_#g DDY@=SJcY+5.d7x`)N~ Y.,Y)"@^1_i%:=}"L œ%w\a:99@^iRzcEI}x8g rt®-6ʓ' X8" 3OqE1wi@=:?E؃h#31=sʽ4^wC FL>s2ꯜ\AփM ^Ӿ-(mϘ })К"~uag) 7bGh- !4dlE.j,kXGW J">:t&A .X- Mhr19|I͛A-Y ԞU#2J3gi?u7c*TzV!,zcΪF XYgU|q1gyWDsV!W$:Ϫ+YE  I 먂:P,UQ1lGTf* :ŇGߛ96sTߎ*$Uh_a* .՜U΍-5ϪF>YJ_:ɘe;(B*xUaJ~i5qF覐VhOct&:B ՞W(!= BPyux ;.ez^CwWXq\cru[GS3לLg5l'ELP|hN&$՜LPa};hsLͱVrLnN&dHk4'%d甞L0o/y;H޺K\ȷsVʻcϥCM,mz 7=GĢY@ic]z-SେJΩl)=C??R-LTU,w(/MU;vSH0Aޭ̺**u$.L 1,`6R1)( p[Ye}@ČDْpH ;6&|̜&r+\ [|hk~jJ)_s,.z'qVԨM5pu-43r"*s•xM@orb8 D.„XRD$-ob9z iw"ݻ85PJ2˖K*\&{/s۔\g}|Q[#.rKO4sja.j'.yP@\xd 9: ƣ8UʣĪ)R"gW-1ͱc. Kt,zFbR1Y{$+E}K4p\]b4qJ~[jl7E̋(7=R/btlC::?f^.r}m^ feiEys7öэx[~BkS’?A !<p%3JW-TM:ypP]R$w`Хfm)T|t JtPvKm E!*h[EXa lz2M@Md#ќ8gu16~5YoC,v.>nR17moR‡G"U@Bxe>'j0'-0ь04"ahM {-o4^ f0pI'DC3c82PYߋdNrIP'=嚷VBZ9@P*/#M4^iL i& hMpMF ӊ5L攞il.5N/ ݦއƯ(lf(KI;*0͉E JDzBӊ~5By.TzH^BzTwSl'9B٪Ъ~~?;s!?[kb,eH]?r<# ~SvZɪ0>ij#Y2S)le"[}M-[IƆ&_u"Q/V)?D)>{E^}˾4&Q:AN>Mj~9ͤB0Hf{ 'Ֆ|բiiAG\ ے7ӛYf Aj9U1P&aCp}UԺx(VV8~í.+NY┵SA,N1bޔSږfB|Ap^D @;bkj@|]"ٛYf k9?DnN."m(Kb8fjQ E1[ZeØx #Z=H(ǶCP[]EEڳziۇ[]"®Gʒ)rpewaơxɔr9eYhz&9D90b+$t  L$r|14uix?+_W2C8v,`L&c)8}` B(C]2Fg`1Kږ#p*^4 UL>9ϑ+RϨV}4|m4Rv,i SfL@El-^;Rއ 7L@vtn'l"6QuGDd&)Od%6 G֙ Q5eH>Q{# Bɗ b ]``Xl aQՀd2ݜPT_2H @-UҲ/q!# hE;)@4YwSFc.STkh+Y-pB{dHp*9Wj5(OH]2 tXy|3is.a-}yw0()S Z Hb&?+S7r߷bqnN@%0T9/i`f4]^Q; 8yQw'  Q Y,Q <oKb 2J^ ss@D] 8әYBwUO'vId K`osV%:rP:QcISƣǻ<횫SiQ!W rЄ *E2eY%x#BqU"+f@:[-fz@V=C[ v%7bby 7amXRH<˽nzm[⭐oVw[4YdNv2e=w(* :!- Z?fUZf'$`w. T};Ÿpw}9}.| { wFD=Z^QFG Ow'#b?O.\B8}Cw0I/f2ܜmf<v}Gjyṿ+UOeeP' 1ɞ[K$F\kr'gDpܮː*6:>\*- ʺYCex-~e!+$+4I;;^.D;IP0xV&3hoE.)2F/" c|S; VB@|T>p 6BnWe`lgCopVKtZzG ~`1<Ŋyn0CJM(0LUS$[q.4ǃr:d: ?un-3ch]4k `ՖVfc 6&?m.a@HL޾D`Qg.:ǽS7AD%BI*kb*0pqFh)Z^bAZjrCX\MKO SϛVebrebNqFNF2*,=7SQqn¹tX+RuL\cQ8s 1₹g.  =I^0 a)/Jb?y4P]*&@C(REfhe%eחpTvo"r#3/t~ $:#oY/xw]̥̏ ]Nb2VpS>E<6 >|=s$SЅ7O i5t"|H34I^D"xynWeE2$D㖦*c)*uY6L0W5{Q5ʧN[%'8/YɀxneJC~Rrز@n˓|ܮx6s H⠁s8?x?E*ϳb@PgfeC.\ gt  k>J JTE8ܮDM̓i,cGŰbf#")R EzD`>e 0r**d^tUndE3 Ğʒ<_2'gG|!mPӵ!xܮːI>ٺY[gNo%VAq'Q| ^|ܮ0te>2$2#. 3X]k$<^'@3&,3Z z>VjcGXXئy_uA6CG8=2PL#ۆ͝7P%"JٗOkEEI#%iؠ@]jz:GŁY#J@PR#O2ghZ p=gٯz_>3Vh"z;S`}ː'؋fm O#RSPUd##[Ӓ:@81bxs. E2yvQ&l"4aRϢ֢|.N*nAc-̣m8 Aғfsl_NrY)X g%DJr|@iDWMD*lf(2@^]b8M?SK"]?* ؘ++Aqg9QאF+v(ezK+ UzJk+0{9q=p-V=Dx/Ho|:/̎KlND *&gH4c !  SȼfnUDG:+HbӰ{%^2L- f}Eʿg#?[׳JEjb5sHcޙN`%WGtNa"MWߖ,w38{1Z\ Ǹ0_8 E~;`Ed1";>3TB=X"[p!,@g껞c8l>S9kـDrBh B lZS[~beJ&[,مnWe, aciu*w&WwVU[A?~_<b_?<b/wpmۛp q",ÔmIM&ݡ8)%eDUw ]Q;t 8nIeI-ʕ;NXa8%1ZZ_v}OgZS#ZS>KVb?đ Ԯ< 1o2 +&̺!Sm1&K b쁻Q0吐!Dcq2$tA%a/  |(;&(z6Z- OnO-{dT B̬',jY^IgzMr(tVg`aXL!co1 X0LbRړW/I E%REsߜBDsU=MK|gKdxyǥa>ORVWG@ ܮTPz:K0m}t s^ җ`ynWek bp٘^4, v]< եLڴnP"i]nd{25ģ"SsP˹&F ]iwKf^z<.Z;0N2vFtRT3xg"fx5ʡnGF!KKbEb@L+rcWy/.\2llӌV)ۏ$6^2jf0-{C0l[4jXoRv^.u&=i.ASpG$+璱b2Y1C)f v#AM :vH:^<9jLRL̞c]vUff>1/ E۰|d _zR\2H2,Z7%M< 7БB} vUɫ#W(`7qe.'O؅^[Wm0P!%( r&96WQA)ELFckxq0GQK"a 6@~J-=]2u54}׮ZGH( qnWe4(N Q@*TDp`pO$^sGY$GvU> Ea󍄤eP LRh(BMwF e3O؆`/\Wms-jl Kp1&]!tEܮ@h3  f;^D!z)%pz3l[OĞ?*~i%@IM;sT9W閛~*vQbl~kO?ję܊Dga߷!F̆Vˋ)فo+z,g`~;@4U֥!͑D'rͅ*N7ܾQ+INf Qf/HSJ v]˓V24xEZQxa^v e-x20ٽ9!fB!u@(H #G ة  e wq ))xqg~Anf~nWeSGRD˞5t&ރzn^ pdR]L_(nLA<$i[=Rqf3$efkH?0%0gIq#`PSVK/Ī"K_ʶD+:џ!6*^ },dcD?Eh1 ?2LOdH$<"`œe]%?l0Qp.Ae@Ep#p*)5byDt:2EL83p(K(seL?!daHl`@Uv]$;y#e+;6x#?q<SOIQk2uSGh? Bw jP!AND wSofbxj}\ i5J>'"Y!5 +b 8~G xWC܁)E/wԈ+y& :Br6p/U|1 Ǝ2c]zx HeAGŵ K벂zТX<$$ _ q@rS՘D>3SD` aC#ҮIg h'4óUILˎ*tZt8il2҄fo:3B~A?׺WsL/r(2c~J)+Qpl@ė\ɷ[ v]&i-e;(_B]l(頼DI.UƙtwWa$`D`,Jg WrBU"u@pIN1LNiL- )ͬfٶ$fYCZ1=|ӘG{wIu3F{|}(QhtjjpYfK]Qdcz4d&``<{@^\6+a@uv(|E{1(`ZPCUKdِ"kR>$\3 GR4P㨤xpp=-x0BdjQypk5-)p[Ye}LO Ɨ#ٸ~Qo=. z:'k xYe<Z, --|™ WKe5hWj9${?o`_DW֒FA,2:=%aB'`Z0[RF:KTKDNے7ӛYF;ki|z!=F!IAD@ʙb^-SIhjZ S mI*Ccz4dGwkTD!BUg)]i2p#fDL⃭D~vD߳5ڕYF;;kqz{Wݳ!e2b2@vݑÎ TmgB1ZꪤlNw-:@$\Djw藓l`?WCF4^l\X![e`l- THh=kAh[fz3ˬ!H-@=/#G, o'¹oa9qDqi\OFim- І&ŧy2þ$Fhw}@O q9K= qf@s,UH>vtaeZ0[R(kEέVٛYF;kqr70"@(.9 Y_0G$i\/o끼ֲْBs9ڒk,cz4dɧ<WdTB|Tf~.IUjZZmx6x[fK 6q-0%n7wֲo"_& defJQIP{RQzMP|MUx˛ZXϹL-֢iiA'k-%n7ԲS,T~A0&ݙ쿄 qkHLA'ĔG,lkQBg-MvkKLofaG){k&dU]OE t;v[&Q*rSfKu'qHD[RzHW->B=%ґ<.9mU(yl=;^]g!-z.Z0[R(8\ @[KLofeEb?4#3$:SHs%nd{i֢iiAI^ %Wj)L7ٛYf Aji|yS`n!O`n'F a qB۫W[u%IPqے՛Uf Aji|dĮ9|xH#i8"WV0vq,`$&ph-)ݶmfZ1}dG LH6?Q6W[y, Yjd&8͖U*̖,u)C࢕iI*#]cz4dg MHA!Jh8B1iU%ZO'Aθ2o[u;JPzBے՛Uf Ajam#Y5$ 0@yg֢; I'l~OHމ`r_8@Tf 5XW|@[l%۴3_Ujfᯮ2R>'kወn\ɗk}N@q2".Z0--W-`ZN7Բz7oa_E\G6][ z7cAŌ>B8[oD~U!酿2ˬK-@>"Dڬcy#γr20LK "Yϖ * c8Wlx,c9[(@GcJƸdqq̖Uׯ ,cz4dyrn9[iJ Sz Y/"M\EfC@E?M?{"oY -¾jYlI!uli2Y>'k~OHIأ- Nc9YlZ0--g-h?[Z7Բ $*'k®qH;[|_mVَBJlgϾ2Y68&Lb~ɻwB7ʏP쑰"2%*̆RoY+ϖO,#ݝlzT^vaxĀ8e<x1" u7lG!YΡ6Y2Kh_gx>N|S"R0 đw Wĸ/_NZ iY&-7ZfWk9Q/D"VU`ByCejc /L_[S^,h306chWV0OJUJ*B LH'g`1W4{+vA@  gE5L`5d :0kѸ ]02p%}epDWP i 7 M0o^3"o=SVCL /Z +93,-cfVXq N/H ~Vِ@32cHC&|eޮJ}e{T@1?}H_2Rrd[&)`zZԧ~gofeǯEQBAb~B1!zd6~1^ee5(`ZZ{Zԧ~gof5eHU${?I9 2uQ6^q<,5뻯i@/Lzmxkof5d~В| _EwOy#/x|,T1} >»LM- - 4=嵖K-{*GZ1=\{_FwOX887{C1}cO>3([fRV2vnZtfveήZ}^G+Ez?IDv]!?f|=~@%Z_xZ0 =䵖C-?{,zTa }B?OdIiPPH|֢iI!liy2Y>'kOHqLi_~_~׿'d:冀O@-/|?<,( >2.XoAM~, ݏ;\8q1oKw_yMchW5\=,E!: h gi5g q#Ng@L־25|wPSCjwPS?bqԎxpڙ \ZFEHwPSwPSwPS?Qc{q]vZpVZo$~Rc2\>RhBJC R̋R N8${b2j|,Nb8Rwr$~cRJr*کkR\j^M,@NZLZNj9*Ts)w.5{;w@yeWyou$s-U 6!Y![J!Sq#]ٵݝK!Ӣ@_ *v~<{'VM)L)Y_{]4˙\>^;Q_Ԣc;RZK!SʝE)Ù&N- gR/v8![JДRȔҭ܄ /Tb2Z t TU;ӗ)2fqWhw*;heۆGxr4Y.ˑi){Phq |f?ʡcK)d꺸+(ORO- dRf*dŝxAZ3aK)dJxBJr}?J3JgNpBT,RtKMT:,6? Lsᴇl)BSJ!SJ?D gRb22⹮x+ׄgrg2t@BȝoBtKdؖ)d\pg*tgqgqRR;WpgqPν;޶tCV2wu[n"&L]8a2wQ I1EjD?OEzMldRҟG?FLB#ZYQ?:~X?? K%F!9v1[=xKk^Ux:“UV}c|p?0_H""dܡܜNZOZfVV}c\ ?i֝y\"M%llI^. .U`| 2tr43k9dx/;ឰ ##r XG*Tu597vy?)nd"Oo.U"ءbCq>K$ॖ'b6;=r:܃: >sv*.e5F* pbɧ@$ޣT]=6"B!'` sMSad 8(@p9<*( U1"(e yO\ (n; ]H- O閩LlZg`}b͉$WŰ}# )Ha:"oT ڣ]L(LAFDґ_LΣH"Syk(GhUĉŝ;B,bf~ *iכig ˜ e=_ ?)k=(@KSRqmhCb \%˰i+TH( йD@cԬ + NgDNM>&$s**uB (ka6e ?3]E78'bZ6؋ܝ&mC`r,T;L?jBl(|8 @8, B`EH֝ SrLR-3(˩О}A> A4!sP<-rc <)Efareȹ]o2H*e e$kd@UXiN-gus=n kݗ ,IXr2Kɸ{a\]}nZw}.fxK2#I.֑.^rKb- Q>n{\¹굯GSp)Wh¥\ށ\3Ԥ.j4=?m"rse>we"% `կ9~`帞TL2xr-e=p1CJ_I/yV$MWO#]#:H>VBA#?<Ŀbh^EcָMyx4_ů>r&Ko|T.ϖ"Y):b0CITZ{^F%XU9q ',1Aщ@,]ˁ7)]$.* zP*1Lrh3*Ɵ"*K\H\oRB1gfz~"rsQerlDpY`s2XCND(]{%<5HDee'Zn nkzrhڛ@IO*^r@I״"zP%R,$lb4ִK?v{ǡŏjN1Iqe)]Q*9?Q-qTUQR(~=5?i_GY *הxR) uS*B~ѽŏ/u ?֏0XCbޫX: ȌZZ2˴CNJ钖"avj-pӛ lQIp!={_lȘ|fX >?g,Xf뀣\ ofb)NIVM\֬#-ܮː %Ӝxy]r켼fG?rk]7O"(sÀ2<ⅎŁ`Wȶ ?֏h,s Ni1jRf*M˼к{ e)dB<J1H"簦iF"@: -pv@O [×0#dBz3)jRf)6!@j"ZO oGi1~cJ?"8S7P'Vis|{Jd*J \9WQ=M;~'Z?"N.t+W$[yL(!ڤIŏ ?jXOSY=YeMv'Ds$Zfv4e،F㐹JmfC. 7z)U zObʴ/A-㴖QÄiSԌN'Zj`jQj-L,א]\ e1%#RQu͂i+}?9?p *ɤ"yB7,2$6LHzSʴ]޶ ?YWL!RU$V`kPEJ8}.^A4qb~8UQ,|ƒ5~+/H I~}_tٸ$Xo)Ax$bhK8!<wI FosQL_|Ix$ +<2lld@v@=?a_-'qi y*X9V:/ w'5$$mi,bo7?=w<"bo(;,vٖA]]`hu^ʸ$W7oЦw-bWﻈ]v3<OtiQjf9a<S"t9~Pfƶw ^2/x4] ]CεwGn NdOwoA t11 =o{XH1YM6_`Tp?Yi 2"G?6HhQ8Yϗ+2*/ί*O5EC> u]]E16Gz,vVq!V_C}6yvoPm}*qON ش"p+jPQ,tQd 鐔 G#c@塍oDӈ甃QT,~Ji-~sC^bU;qCG^yZD4lP8[yi؊2񙴙|}{|E>i/M oC{&sD_nOnv%xt_qe D@3{h~}]` }&p*w\xiu˼Q3ǝ;|cڱTd Pv@8/p}"Qw"gʷIX CE!D2haпMmYBp'b=o=%K,IU$??w7F&n/Ʃ c%TPЎ D0I[^>h+oV?ћfzLo?כwflOf.7wټۛ{lOf>7Sټneo|ѫ+v)biSn>G8W/Ci oÝO߿= ?0ΩVϼG8{Y,g]*~I($ܙzg;PӑɠD/Ңk?7H/~mwY3?)qYzQv󿛓۽ gx.V*p,٭%Cߍz/>@Fr7z@/MN/l|g{K{;?7ʪCnavit-0.5.0+dfsg.1/navit/xpm/country_ET.svgz000066400000000000000000000016431264204753600206630ustar00rootroot00000000000000(zHcountry_ET.svgU]oF|/ @o?S uZQdK,Y˔(powfgt|mj\u>xf*m'd^j]~ur_[/j4YӜ_ [\Ny~iv݉]on ;G͇bGep총V(c x#pҕU-|\lq;oǕϏrs}n˛'G6f\g,SNU|&O8>Mˤ߿+9XA,kl8Z_9CS0>l1Tl7fWwv\%|؆Q:RLgb|yq⧟kNJw@(E(}dKuʵ`E.[h88w*1r @b`#SW y&ܫ.pXpf*bTP){wE>PAGbÁ4f1WF" Iwmr bC+&XE:y!• >/&k₦=ʹ8 7[ Ăh1  pv-~zts**Ԣ=Nf |yv:RjEϿ"6!#|u]^q@"9fI:@њy4J&>-&` ƌ3~7Or^}=!0{Kq+Ҟ@AS(3'4tCخe턻Ȅ+6#\7U]: ^vথpaG,.!q<ڸm7gFcbKoO˿V}m;navit-0.5.0+dfsg.1/navit/xpm/country_FI.svgz000066400000000000000000000004771264204753600206550ustar00rootroot00000000000000(zHcountry_FI.svgMn0n 4 ɢR 0`Ld[qrHK%j*ov;:0 (D9T\4^pHBTE7FA ˝c,YY -z, Zc<~6A6al;աqB+Tj &JCBos]gկ+nLȬ[ƛV[#8`Cȭ*VѝQE)%Y+S*}ռRr`  F|$$zJ363,S -qEŁKƳ{hղs3L"~navit-0.5.0+dfsg.1/navit/xpm/country_FJ.svgz000066400000000000000000000335271264204753600206600ustar00rootroot00000000000000(zHcountry_FJ.svg[ko[G>|`~?4v gM^ɜȢ#'~K^Ҳ%3XHbqN~W٤-狻glL]ny..&Vt'ͻɏw?g~wCh_v巓 D[_-^wn:_ӏ֛t\]Zә˳ݸl;gm۬/mggnկV3ek6\ͯw]elҸK.׻PcC1Rv=㭈̰u^t2~xaf>f޺{jY=材3ͻ˳8Dr`j;ӞmqS7_˳n7oo~XKvdcasat2hlưno{eNײ̫_>& Yw?}߯,Ͼ/|b* ۺ?(%lvύ0}+<<;nJ~n~zÐ]rװy}TQǚ/0Xlr1ڶq9Njab,&A=bk,ٟ=ޣWýp~'h=ָLkm/ i%+=ڲ|~yr5WەAly\<&_koC5FwߖEiqi㯅gd*cB i>}8Z\NW[Vx1׻qk`t_|! 戎-ƭXG,wVĎ//(MWl7`y}Ŭ; (5m-6+GWە^\S 0$\[¾TM'P?Tsc]ʃbwÜEs1t.FnaI,N?~av#MKʺ&ڷ7$vrWrᶿ(fW TN +CPk';` A | q_clvz矵GHIw[x3JNuFX 4ݬX:\tu;)|eV[[R%YAs|sՖsuK!V]6ŵqF /hcw|_,eNgEu Y,ʆ=yd.ryCoZwgm~E۾u._7#.frۛm_?of`xTݐ-ׄBJ02%J@-XqxVS䑉q؈"mQfپ5+/c` ׭<[sg2vi])XGI<.`0@v(R59G]&+Ӫ}dT=cկa>bs _Uq9ٛn72`/}܈x9;sk;Sp{>H1 r{7yO6»I_k2@%8kJr}~=tNJc:J۔sW2kL9H;^vInc:DCv6a!&zDB2dO(|yM~gƁ]!ԕdw;;D= O >S#^* ;N|==Or jot@ӴުzCx$RGл|Do$5RR.uV 8PALI 7 U6ePѐ2A1ҧ}c瘾TP8P2$~$ĈY ]ɻQE>Bcu\)-xdٕh";d_"gHVOUփ%M$f*E{V(Q(/#}t $)Bw/ɂGp#*(W(i@' lM,dt$8k78Ovfihʖ2.Q>6JQ ƂJ`ddȫOYV5MjpxBoͺ(v-ɽ$73!2bTa'rI@Gaz()|=%,YD .s%h]qkFK!9 h[Wz?c=6]-}ÜmVJCz=͎1;xÈ@e`A2zP wxv_oxp%B  gZMDB<fĤ☭ey*IRо+d,h ToTitcNT`!tszn Gl&QF:*!R=)A6bBRPjv%3/V 9˦I*&i_kXzS"TIjNdh$RM@Y3{:볃 s$Hb &C$/@MM mR.Vd5Kϙ!<;BĞ3Rz8=`G8xaYmNk`o,qܣQsqF#'T@Д&[JY8QC C ZML eAdဨ[ʈixdiKpE b. +0;%,/ hH4XvtZXad!TԞqEuYhzIcxRZ_%;_ؘ#Ōx VՁuT;2Dm7†2b)Hp#c\PI}zT'jk:֪ZF֭t˭{G(*v/\Ք.oa*NMFB!XmubH ` TUms{:U'×жr[ֱ j[EYUp)0y.H-ᩕsUsZp$jXC!a@6y'ZsqW۶ӂZ`#r,onfBq0DfDȼVB<װL`Y6f 2nO&jlΚ&i t\ eq*lxkq"fe(,1[ikBJ@.123!F!Bs`8&j=hq E"\F#%1-!눍8@1WtPV6Jbjq&*$Z!#E#Z ;:}#MR?=2{:x)28l,!,N]KZe4CG@ciEQ 4FL1O</WrXj"Q))N r~(; [nD`).wЙd=hqx{XShX2)YBr)OiE^pD5v W?B;Il佐Qqz-TZF q%(&kVX=Xq - Mb8FHjP)\ dqx(IDYT[4 P/p*8b]eJVjf̞NGEu|%FUu58~osh?Z3wC.>0 " Amۋɶo HBR\2TLB`A$gO= oϰI1"*ߨ )(xRvOPZ $Jz)L\Y ^}HSX>T8EtpNY./e`h+ѲdvTu8#JXwye Tes$}PtBxMsr[  E(/)p&ZBrr$ XbR#a*&v>bbr"=P,8 gϑsꥭ>aP6^>Spp0)sVY%%XKZp^Y;RA}a'ȟ!ngSr1Ǚѡ->8 .M:sp('=<]gt8|̀#ÚL' >CByla *؁{Z+x)|#X7|k >Բ-"jՊ*fW",8E"^D7r*j)!# s،*J "RvڍdM ^):xGH€~5W;[l6ϖcҔLD[p]8eKlaLjpy$rdt>bS8Z0+"JbG|v6]2cI%%?JI f֠Ж%ŏl&0fՠ+ /#$lwha%+Rk),UÉH/$qIptZ|83)4`ɨB|R4qEOBt .e*)_Uv=P|U֍B Eǜ(b}1'$DN;O,g_bF,]'3яE)D.wrzSt'"Q L^ sRڇH\eV^(j!IF8ƃ0_9cvTYGEf",TF)&'8P5)U b xJy<6S@Dz_SMidJ1 3Z;98&,r^?xQ@H=]{!x#CuGEʲ xx51N!NцV쀗\ˉ@w6d[s3X]} tWE!\Zx%73 ?[\ڢO*<ʵ gx!CJ9oDXPC<9MU 1#3=+ ɥwCx`C=S_|x < xjEg $X6 %aB~Gr .8-QO Ae4τWĪcՃrPUIZâ4 !}si$pNA[R|1FEXVҠShĤ c^D↨г+>3qjyE PHdni/_WZ?2Ÿ:@YWc"x~ێHr_E ͓a6`f|{V3R2%'Y"{^|l!"SGbS%&8زm+kAWt7#)\kΐs <HSL(jс2q#<%(V55.yCMNYz%xj К1RBᒗ_L'ߋ|yEOVGȬ:Ǽtdqm%F+Xh.u=Eѐ(Pv}|8M%\K,W9l%~H_s%NH@<0*ˢcJ\[ϵ+| ROڎQ<0Nn yM>0=\[^89ڤQwWDddQBi{hi}:4+.X)[SC{k ǑKV{UzNbOnm,˪ _"<-"{\'L_%BU& HH|c]PF.3C(Zյܨ[uHh򨞫\y ,N!Y~}ZU*յ-# lhGv>FyuՍؕX+WQnumb# 7s! YvC0Iz r7K꼜֡$ %HQ+[5[nTظq`ozlHZ$9?6j+s2rJRЧ:$IF|S %Z# Ixb5|47CB᳑12.M#J}#F, Xr bYFW攒c9N7 :>~CMC7UUqR'743~\G+-dۭ9Gwz޸|(/Wwn106Hk0WX;E&YJ>x{T͹tg98]Qs{K7a¯PZf- }2M*^4{e9Qx9)*VMi;>ң~GUǢ$J{qZ؝"W?@E.%vR9<g:t+wh>ҫ*Hnցoձ9q^A孑Ttv=T ai[PH(u;]M;p*=W9;PEψqGq(%#&Cog0'*@ږ*ڲ*LtſNex| >'CfC2KX o2{+10|ooɊ:ՙَM@ ?p oW@ȕb:D|\0f4*H4"6bdwn10_Ta_sRa§e0̲@v&JKPҜa` ^ʪ7Oaρ[C"ƜW)R  <1ruf WhS5hq}(g\E.įsOQN؄ 罚Ui_!ygL5itaP3ZNSȊ!&rO]@XL<դ)ŒurlaY+HfzKa>jI$;}oەW#ZByz+3 rwkڏcϞm_<"S5Yzy>S(t>T .R&׸-ŀ)\fV\9yx@Jp(mH1 NlrA*1 Y@υ-R_[~^/r k(gmeдڴR;x.WtEB@,a+́I % YUd©: Iud^ Q/M=H]Zu?x1(`ɄUNye+ Op))tշB+TR(z6(=GVB7WKtH`|2Kg{8-өݨ9),sKZf0oqY2A8ؘ2Uz!.ChIL*{c$eፙ\.c.S {Ys$T]|~[}θoݦ&t$SkR0BAZ/*=K~mcs>L"&hK|u瓘a^$ k&{I9"dLsS,c5IM3rIUi ~Y'ϝ% W< #Pi(OF%-DFmxSfs0֞i " 5`y^8tƫ.>#/ qԼd293c݇Nk7fz72WY"TA]RTK*x(ʁH$J2 ،vO @ DW(Q!Yk3V4"*$:߭Oa*Ԩ>ߖȏZ^ #<\TL,}ץnAp~KP)?u 9DxקG>3\IPa{Gqp"n!;.T)}ʿ/|˞Yo \?^`XIXآ_ڥ<“6'?:aڎk+8,yqx~Hh.#Pde}f\yNl*A6Q n&iXʜ_~u$Ðn^}јhw[1-<TBz_-"m`1%9v3u%al kro8!ד\kejQGso&['En.wv`J+ca^郪Oh3&wVO"Tͥuy[l6vJ 2d. %k5}1KC[dwnZkYu^Ht'sO{8B%6hyLy(Jd̫R C@{:5̼欫cGTg|s1zf%pK*{aDr#=?D6di':hkem8E(U5D$n׮<.ӥe*>D JUj% }<ӥuK] :>Ssٝp6!kY*7YU q|N ?JL^U ~;JTH{(. ٽEQ!CoCv3])pU,>{HβAi!^n5u8$~ Oċ7r݋n>bx3W;CF1tkl$srT$HbPZvkDvj H ::K+%=S>05m |GWF ojC-kj#bRD6J袜,*%[OZ*P:m3+: '>%WuxGqGmaouv&zpo撊PZ-96MpvqVWk ėK#=z$*m vy%(}axo=ҡ"D(L&-䀜K]E!.N|qA9[+tLG!LA9- ;Ay*]P2 uVN5]et@Tv,,bsd=ZߡIÌ#Ock#ǽa]{v}w'v}t薚l]'ɊQA%lv_΢YE󦢀?SEM50:40Qs#?`!DX{x;moŸW-hźg漟?}8 +$$j={2HS[fgʄDC N;|7ΖxaW|J&+wU'߈LsZ42-;3ԓZJSCU3\G)l|Ri* t_" ќ Ro!pKpKyVDȡ.R+&é"(@nxAݼ#uk AƟ;-*jʑiP*9.݄7BlbGrUjAE[{8CZsTfj 8*K7DMO ;QؔϊoԵ S*{~"IɄR-_ :"SIo h]Yx ๮H V/: SV%D83ꔲ/vb" O|h$^x׃ޑ_aPjn۸9"JکlC>â r;R~;J(9Z4uj0A~,KjP@=C& r;\'}q 8 @\3YqǎáɩHyJ+V3lNiIJ]%u]doJ"vY8K\#\%(da t"Ld5pRcm2*&)~rڊ) 1&) ,ʈ⠗Q%A/%%Ӧus"qW8u+τ~ymκF0/rf8j@ܚ5fsV֪R_Ա{Kd.l]/ iƩze  !^(a?=p}mYn5nVML4>\)Цf{Ys¼_ìڐ^:m=|2Sgcr\R1.[Z#q> n3l~׵᦯lj>)HrgN6Ҧ D & zDǕ`VJ )Έ31B킜h eEzU7~B0bpɭ5K"lCܫtq l#CDvB.Sk H޼ 5L:.l2h"]:[ΗPe^I(BLPS#-[Qױ&JVϸ<֚q^Ӂ9W^se.v(\p}TYÁJ2%PǪu~GK1>viC3r$Pnavit-0.5.0+dfsg.1/navit/xpm/country_FK.svgz000066400000000000000000000603051264204753600206530ustar00rootroot00000000000000(zHcountry_FK.svg][oG}__bتE2ؕ0I/lIP,9~W&%;qPCu=u[u每z'b'z9]닓~vNFd9,Vd:7y/r]Ol0ތ~@;}urޝ=<^wEZ_ͦgI[}VUz_Ol:-kgWTdĽgL 1Fr;y/7ྦ1vkmOu/}r2j9z¬iЀzugo|\jݠtrWw0rr[o&zs|vqkB1pްURKC_l/Nt*7MgsQKN{8aA/.I{"ԃ"9>wJ3IR?yJ-14 ch>|((14 ch>|($PHC|(ǀr PP y9!r((o(tvz[θ%9`*Wg?Jԛ d)[Zo{N+B^Bi8quxfFBHکtV4}L.Z WXTtyyX(}I8КwgӈQ2ʊұ J\tPAsh~o ^XI1rIqt:CAiCA~'܇\`p((`((1`ںc0=a`z((?k01Iw ҳc0=_0޶~k^xDo;+yUJrr]]I|5YCnYHz|yxqoowJy~>7nm ޭ_mWX-_>*Ř;rzwN t KS50lal;/&uXw`=&Y,ޮ&Ѿ#R Z͋0<#n^}d|xQnjt$7s./Pv؝mԾ͒79Օv= )"L{)a=|=V׻NSl_ή;X\/}\fiղ-2'|[s|,M67zSXh閱yZ> LoLнRX\ju1_SC3o^溝ӵvOo$~T؛; P|M7RaGr/+ǯTܰS(PYDjF:t[MGvOkI7w\-2mR0>en_/z{'}ޱR߫<Ϸۉ} S)" DUZȄ/2 鬅ȅ5Hlhh!允HTR! X. c$%cK-*#CJW UpI2Դԙrtax2LFӌ(F`ʚL< 2֘HZ{̊1dtTb=B&K4$(L+9(-byO> zDQ*0 Y2N`MxNCP5R1,mAwL9)7UKq$h<|tK EʈDYF(FΆK3D\0F:r.SzezyTjpθr #+Ur %X 3&'V Ӿn-gβ.1J)1HZ*M DB@K)(IR츶 dIyl"9aqA.8R UF3NL5%oԚ~BM)̾RD6NĖ̐!5`&^зpT/HңL`mH^#fAO,h{-Q6JN09jf=vtN:Kyjœ-[ZK2oYcGT6VrY$Ɋb8UwP>- .]Q6q9*|FP5f}ו1RiU44L#-؉,v` 2-KAGv]%~CCu@>!FFb{J%yH b-ᒂ\SYNOĘIo SJ4RBGC"QHgɿ@x%xbL;lؓE$wvhqHP;!'DU̜*FqAB'e&C 6HT /[+4X;P"dѼ$7XQ XM 0d)D!잋|T@.rI3oދr`>wYcAJYHϬ phj1GLZg dpHʑGw:j,%Y&RM1d0. Af5=!CӺ j;&F.nr)!ຠ aE"nj " YB+ x/XpI=;$[d T\u1hMG /ȴ%TNbC,'@JJQS >9L3m_(w4n'RS^kC|4hUd_O4Iθrv0fڣլ7o.Ng?G,7m xht}}[VLvzw_ ٍ NBDQ| 8& ğZ@sB H<Ÿx"C^>ECQ5͚cXz-MX$<ƠCS9e-(^ 5\dݣ("V]vz=Hz'N-&_{)0PM3~o}I GxˆFdNyj0XzX($S.`0;V/wk< bc0p)eìLGO-^X'1֥R$,TK@?& 6<(wkRQ(#͟G2; 5gRS_ Z_ӽUMD+kys $9:%9.J2Ñ;rd.&8;:ԏ)1EI眎ɐ£-gx)m~5dn+ ʹN?cVG'P#ŰX-(g;r,HTe2U0l n+Sd K@flۆO,o=OAOl tm chMƜ`W.~4$  JeYM8;"O o3lG0d10&GB?%OOr=ym REj\"L$dd&ϣý ;/&ĭ At)ڣ;X,~%[0f/_ְgmdMГ )F+c6r`c W8{Ѩ:Zdɹ9刎.asdBuϒmG,᦯2Nl% MBuN:O$Etz6pg,ɑ "T+\gVfpcdf!}ٲ]q V@ޟ(Jrݒk53$GTnCrXـ$(9㦵sNm-];דX!1nY`Z+cz5^ɿ}`ut.d@|gKN !S[ʯJij5e(-^ zoٍ! 709e++{،;-c8;N&(h=}Rh&8Յ| ۭ1} LJWȰߔ΀w|(i./QRkʽVa7ؤO2%}i[v!]ɥfh`_>EKqqBù]o꽽2yޢ'g| 4-S <̌qamH4ӭ&\,6 YigRl;k5w߶ l^,;½Rpף%}4ǎ8jviU cWKwDB۾S6sۭĜAB8 h2s7;w5`ݻjE ְ:7Y0>4.j_jۅծFDc@5|#uW\Kv@5qX_ [[dACDԂǍΝU$ޱZQf aG*]Oy ZsvyQP'lcp'ZՂ鳇{:"|lx7F+]~oᡥQ삁(}zeXpOH- DIkJݠ+rǑFV-G$-&')ʭ9OQ#\ThsM/5Ѣ5>X'Sݠ@2Lm+R9]ઝשi\V=5f]psĜg-sݢMtmmn#"FY-S~.$OHP_L*:$90.RNt-Sw-z˧5;x2(^4zITt]~l-SsݲN x9]ey~nЋq{+Y; )`Er< ڇwtۍ5|$ɀ0[ZlZ3E:2 BzA`2pqܵKԮɡltP|D|_kbĘ`߳ 5 4u܌7h@k*_4j؛-In=@[/[қ9_ApB(8ܠ/gqt`Sԗ3ʯuok٤o$'$~%=b 82j'Oo-Hؒ6 d':zF.@C | M?&QDXbMbSF䥼$"@Xj \ z!df%I㎈\Jƫ>LmX`زiItOw@aRUt/?$gK(D}';H/AXtE ;uItm xEHGZ5®/vκ溚:iͦu@ۄcO=1b{|7omVstE>ډV?;;B>HJGFLUʫOy\=9Ke$/SwhLk瓧yk~wZ]PkN%N2ZvB bgŝx+n@6-L&%0 t1pWtl7vE?*[ RVXbY~3>Px|ڮ𦦏RbnhɡLZ³h06naV0չqth-rp"(K+nm5!7.Z6Vz c%}Iusˎfoep5fgAί.#1PPf!z#kUw7|ᰊ9 sy˖ş4ϟSI2 _V%OL4.Ԏ 1V_)CLPLC-.q{ 䍓$T$3DA~ Yы9~,ww>7bFRfǬsE"Yli _]ts4禮ɔhj%Z6W@_YoyU,8Zj-l"Q]+[ٽT eEvEC|# cH#~QI : U}w582 {y/4qP),SWGuM TA¡wv@'s.E;<\%áwY U[`c0%bzIA$:(߁>Zv^w؄Hg ؎zGNMImyeH(VxUbyFoJMr1=Ij9v5AeRvb\ 2n8vEA;4ozB-ڢw%`G B2V6bjӱ#oU |.c/h--!n-}3[vkDÐb٦7)>fW%Oqd?; G2d̳)c )x(]ل{7H~C8C[ OfhCg)4 78e ]ۇo#gC;%Ft1d c:wF 'Mݎ`H YDc&LPr%80I',(h)m>5$ļe+D3P5uDhJȒA@SyN5)Owߑ+ 4#xpGqCnoK7gon-28 -^E'( d)QE$(3QoAlPDDQG[ 4Ν wgϬe $mAA^l߉Mi.(Mw]h{'a5DvdKvvL n+òvgx sd,ڑs23mZ(|as=[dt6tC21L2>dPdv *yH bF2 " , &/L1J0-C sR"tfiXjɡG%@?2*y`@[FNsjs:YVYJF)H,:.]7[ꞀnKuW֑[v#Xl*6Go#{N K8khpU&2ж!%n X ա9hZ5fO@bpyƁ/ vYhH>2Y8XPU6%[Uls'*pkRXMUݩ3\Q 7d v d^9B#YhVJ:Gq})ɂ`+F:䢎т8r}N2qa'aƮeAcơ_ G08 p)* uQ0-j';Rao]ZV?(44eiCm S"C\\me܂iYsd-RWSkd,0:K'J"\{o]X@HE^%kT&()MlAhb)΋Vir Hse4ztNCXve i %l(d8-J^l舃kfoӂg2I/6[i0WUrh X'qQn" tq_QU*A*()Ɖmȋ uM,k$E$W`U \YCQZ & 撚6σ,ʤBL@nyGw`n">UtqW 4o <_[pxh QIAbNgzS}T6ёv(Qj*w kTP ` M v}y#gZt AUy?`b@CNY˓+~s0':i,XA!!$v$ EeTN7v(H22Q@2  &I!.sA7`dByt:};C<=t* smwle:5Zw':ھ4OQj[,fYY(}p=V&(Ik9ӑL'qHk:iJRw<~6J:Zv6ݘ.0)Vrsr.MIxp֍i&X*=l в"mtiraM<)ʸ)@d6@ˤ7E 6hrÀӧ0MݷЮ0u:SO/,ƾ9@ -ڐzULjEO%HT(N}á ș$6 B&4*w26Ec [3vV\f6Ш8ܤmo n<ә l7D"O#=0N@5EՃ o.gjW!\gu6r$NN,Y 4&Fk٘ ǑM'E( ژjNTYr:V rPR$z@ ~E. @QeE9O.0 pu:ѮaIQg1D# \T{ G ?,ST gU.&Q[6NDȡeA01?0Py>b~ ʹFlG9F ]u1鍩d؆+ .jOA#ueNsMA əL:̒_3'D* UBIވ^&wmqL ;H7o&8{[PC mVjC>$@.Y9 "z^v'`YH*j͔/QFh`Pu#D jTb% VLL |4~$7p˂㻓M⢏KqU ^$̩Gr|l,d ]Cm̊^8br#/j݉ĚE^f| i֠~5$BasզlfZ3 }a&6ꇚJ&AeM9# {8EF C]42h.>QM\s5,EX2Q#Gޔ^ N*LLз(.=T1K@74Ƈ'd?0P  z\=r$4u)[ƑK0dC&W$cPѵ,)zf%r'1M G؝HjҐrTTm%j8dI!hf2HQG?8 _3aRyFhfٚC9Q9sZVǬG812Xz㏘/\6h*œ|`p'. PD|[uZ46rNXNpJ1Q|ZW`2]>1*tJRFgJ}2fK;fF:A&f1H +de "Ӊ&LΑ z zgX rbϽ,Oc78PxTyj Oo ˍ`CAi..HO"spԎPKAnu[_x&~ij _ `u J?Z =̩FQ|#+nXm+Uk$=pnϟ(';&m$!1bfܔ0\}[s>_,ċx݁PA`am)wvGS6 0 k,  `EhUg {wцfFwb#M(80x4`3ZboҬ xw5DѳH`Ft40eorL!dI8-cl&'Grڃ"l"c4LS" x9CTF !0?*u 'm2z@;h(qT{Gik.Ph/m# ,H [Yr+ؔ0?MIdNM5?4xvh!YI+/E=!H[" )TC#Ù YjtP-?Q}RL p>85_!S< );#ϟI:@[+Iݻ@TPy#Z -T;,7H(ˢ,j[U>YV1r)M"2al b܈q԰ްMu8a}G) akl @=qEǯ` 0C%f3QF8ʃScf0/fI̲Pp-2唝Jh9OO[K!oy:zhh#uT̨[(fdfQЪl;43wlIk!4L Ynv<0=nJrb0x|毌J[H,AcP@H}/4Csc 4iВc-a{-/-° n2gDvǔTfK$DyB#,h́vޖW^,qJ@Bƌ A#5@_z #U$إa@$Ρт3ȸIoA1тp;oWd 1|􂙻f˃0xE._lAұ׻7:HgKQLBjoyb+*F^WQo!6fg)]Vq }M H)$OZB(Tمd+.&Wͧj.k=VCAGSBݫn0yzʙ(z3iƳM^@q^Ew ^kbXɅ=z.qz nACD7 gy* uT6ࠚ~{UGo[n|S(4x00uLh$ GPGX#C}"FuÕԬ+$M{ȟ(3hES U0HZMZעػZRU3˞`'m O5Q Qt:pcW"=Q"觥y04"(<PyޭT10Temq],QwХA \Ut ~5Zk_+_Ch(7Mlt!199ʐj!aRy*~Az2\ /CzQaV}'\(Qs3I.hx)3Z8f:0B~ kǮ\ً&H'֘~LEi`71e*(B.iWMzn fT_|3…YZtIƠδfĨJ4ma@%· D+[e.`6_ ﵅2=K3E)S9(N,;2B )?pLG+nS ?[9Gau!>Jgq\ތ\%8 g 댿@]k;/&P )#p,:(Wg°bx_;tD1g<l97귢 ! >YJ7,*' <<ً Z}S$7:@Ӭ%*Ž0j\PW1%Z̴"Z* [+.A|A5kt2MHɏY ?Cqv/x+ +Cr::,mIb a4[ vA: 83$"(oRX٘:f'w҉ʜ2~,n9ȂL!c%JR':HEnk7[ Ek7O'p|xƵ^Fx:bDPVtcI [I5H#=y8xw0q* ldjxV M $Z D\{ #@|f+O`dޗ_ ᦄ"HPT,3k*\5Wb SWkat)? ³JےɃ@ `]([@3v]宯^"fO+^k!\Pȫ&bZcdoB!cH; 0sѰz=-N3d_>=}mI"fk cnc[O*JPP۱8:N2$ӎY0mw-&E펄v?x4NrrMqv*[|7:=;;<3F֦>b5RCtzHEQ32o-ĜmOGb'=\ ZEׅ\P$ , "!)K2eT"TuCaE\>HԡwNTեNnk%|>HPb*/\kQ,3:Φ[n!tOȄ#lcB쎊uEb):-6ZY0Dq ;g +4-LfhrFϐxG Y}FV "9G1(&ݰ%K (y"ISd4QAu/d,PDw1-V64! K#qH2X 8f-&<^{LvXн;U :>Ы, p@uƙVЁttiC⌓e ub9h߲]#t":ׄǬLBc dd 28]xrMé&4*Y xŌz=rwT[2<>c.tE*n贆 8zۙ2`/p~z%[ := 9)2\tTUC%mƲFcwQ ۛXBmgO0N V ~"ҒS^Y̒7C(tyBYHѢżN2Ph]Xpй\=iA1kguԂ<Cfv!rXxf*8D?L?垮>w_Szq+]*dx2<`UR8ØcXx8}V!6a`Z6-^dd5`q&T>\#; E)4wbQy8hNRضJ.kN]ӽU^*f*y͔8R*u$H:vO5ʬ)efv$A' ^~y Q'x˼C!i8)L#' }IKuZWPYv\~iͿY$]o孰peaFBcX, DFɻfBfǯ(Ɍ@!] J̹ʖA+(}Բh$w9ɐ/PY84`Z6ʏY!A 7] =,$E73xPm&q1 qMTӡ3ה^b*-:˰]b6,Fèv7/m׋ݑ`ɴnsTXM04dDx0!y\L[t:Խ[$l|; U{Z^Zd-Լ-(t#(nW`e ] BMu#hf(5 Z[6%UdGjҤֈ/;s&×gt:$fk#/ h0rzVHh9gꊢf_e$[ycYD1;E5fڬsm"[6XuNB;TB8뾚MbK`gBTKND6J# `(I ]ebf&X ]@qtC=M=܀ I r@g54:#/h{442 oRx} [R#6$H2m"@+pᅎB'9Ip{븽RkH- 2B-QnBc0)`,A 1cPWG*jQJPh3,p nF,?7u1RX X? ϊ?&=c0 @H 6.!MA-D1j'3M>E3guripźvsL'zLhA`ahKRst&؃KbQe`liԢdo#ӥq( Sbx-8yv!={@5wWٽi`-( ^_A(ҙrGJs} r}O]m/F(5J^L殺+^G%|ϬhX?=޸_!셗_?̜?o\þo3n]` Pw^RU?](Fcxr iRsB *c@?|…wvk* k c@7`- *\~z:Ji,˪!F}mfeN:Tś^TLJ 7"EEUtKzeRCYaOgÝՎYS %:YlY.HDpy |!|1kdtvx MK !UJCkbX3zd xU`' " rz[H9hE8z@DaŤZ#JcY`s.U *s{dy  #ɟ*:yl4ܿa (m}bJa>|e*55F%qHGNDI 9;z+QxHX alRP]H=U.Q.UQ(K; |ɪŒE(V-AGI(,adA,2"e TDQ-ʵxbioHF*F{<XP jN{LMGdrK%'({hy=S;h{~lälU'v9 <[XM(EkwZ2C^t F Ua>ĐNF8(%xDWzcSHk悙ΙwYQ76#ԁUq*Ζ`>A;e8n !1#܏"3kFD_qqX-E3h-N NAY7V8keԩf&~'QpTEAIsy36ۓr>|Q:z|NGa#}{eS80)2z47gMPt$~g:V0ؕ\ Yleg.{>ZU$$𑹓{#*"x$Ȱeq2J1m>1'C .w8rŲ)uCYT+z. ;|N/CTYo^ xu:p"rVy0UxuHo5A q_;T^h/܊$ dD(Eb y)lsԱ/mȖv- v9/A"?u@9v5;j0/a2{iLɶǼ7ͩoBW|,nWbاs/*LO=0T сȇ{.yySu ]DXX.2}!x# 1^8"fH$E= Wҽqٰ kmcV,<|XL'?Yu7,z1ı3WT**[WrTvxR5nhncM[T+ E0 5l7s֝HfEvTBGm6!eU\$vF .[;zcn۾ݶzͽY{z?=~S3-NPϜ`z_lkĪ)znIaBv Tbbk!˝.ȃ)W]o ].'/uEL8*A=sBPc$񩳥 !ɣv1ϛLo_\%́Crh?DH1V `!}zm}xW~ƿ]?=?(r(#?`Oi~ `fGqKfaUyTC{'_XtD^Ǝ4L/`LgYق`)_ҿ 8*^$և3*l7ЂNox0-x!ʎj=3Gox`5^4E-*։>L d[{l%y,gߜ, W=.Ïߵwv]<ͣ:2'5VgT4D㾰0w&#<i1e$c>F1ɢyr1藃a_Bx /tWkʆ9قTJ+ ^O7@Bj:6 )YS߇#` K 5fQo =U,O:(4Z-(y,=M\lrD(4ZKaj#==w&->&E1ΪPJ/ZV) hr_#9 X+u9T/MQ-QxWDL*bR6hsC3ȶ1$ XQk3g`(J~:.gBV~>ZKKt^#x{X/*9fmJ GN&kӁY/^>ӊt”yN`MZƸ.+|!@%tէY{y sQG>`sjey~)w&-dSLmvgjS[-RsZz'5éhcR9wf-?f:}$ѬU.5AzBc |ΝY+Y4ZVp~5G]xTx;h;9wf>fӨYE4Ry0ey:*Jln-719872ڹlEk2L D (Ӥ հiU3}sc^.gEelӴẺBr4*@V8VNHdBލ BT aA L){Qc)D O(f6%Ka5sU r E}-{lV5sٹnܙҗL) 5aB g%i@TKL MS0ǁDY/9uq"+|$TdL) xH\'JGx+& Dn\cj9>nLSQ9k >gUC_ 5l_ A8,tAK(NOit$\a%mvI>_ΔQ1GIOW-(xd?0!tTz-v`M#vqcq+`cPyBSI$zC8:PU.+9j+; 9;4%|5VwN>/>\\EүP/ΔEwe.! _[K_X4_{_UULn şZP=:WA&ed![w eG+P#54]]fTYQh`Y f`{S*1nidnl9RU]Tg!JV!.n=2&>xc_2u*sM*6-6kHO.=ΞOc SM̉=00rNNrH޶ gUh(,] 0@қ/Au;_KpRX.ӳY\n w)C,4~0gt&qDuJ57Ԩjv;_OWsy>Nhbj\[|jLiXf$ &rS:8/xg~wZe(\ /Y/qn@uW!m۽zb̧Gzpх;YO% izj/'U?C{~kto;:Vj@++)m2(Q |}闑e uBU_\p嶼q_6N`Vv=IC,^54.uDžD~ʔpn\HaF.:qh{%t~gxxO7w [l\PuGHXKug] }<ǸBዹFK"NaSc *P? 2&C2iM鸢!M_rtdb U%i6t:E?5H]LGcᩥ+jKymKj,z񣖢)N-k! E3pA?ݼ› @s0Xnk0i,}I?ݸ3˰0~̵;nh5\sG%מCHfϼ;+3xp_~\?wEGN9]`lwg]WrۮKLA_%׾d_ӏ'7^+{󵗷EwCɯz H9|=Mŝt@{N?riX?GjȹIunƮasB{`:t8b|?xz3}b3n]S| vk~e;Н. Gt"g뻾){[&p F,jhARH>(Ij05}͘K*/ "TN;_%x4DoZ#'<OgQľ傾5xLNoٳ&NsDff.{QƾQQї/g-.s]J;|Ե}z#KS*U#''ܤ]w(zʤY/tV~+|ȥCX!t8U]( "H͉ ziޱQiM T+!y5&*lǼ6!:=oE/̵OKMW5kM E\rG~ooC;ֆYP˯~׊P9.{Vя{FѽRKܩZ|ugÛbH7_N-dNǂzق/cA}njj(Z?vbt){@|79uE#!ɞq9#Wﱚ>ba2tmk$8 Co]oss>~ 6=:j3s4ZҜvoQѨ[FVؗV2X{If{hο}rk_/y13`*~}fGIr99:cpPjOlK'͔P>N5O=_D Qc~;Ep~3\_Q^pRZ"fDsM73" c_l*r|5"zݽ.3uHE |r|=^\$GMwNFAՌ%Y陁T!~Q?H9I3`e pZ ! m*^O7@V0ݬgmױ2s5>W0+JyM~xR;~A?znavit-0.5.0+dfsg.1/navit/xpm/country_FM.svgz000066400000000000000000000006631264204753600206560ustar00rootroot00000000000000(zHcountry_FM.svgQo0KlZ[uU^Xs$PII|\m 鼲#P)Fr4nGŗǟT1oTjHRUu81(}[)!e ~42~X. nM'UyNCGIDwI/FV/@#e@x7哈52j.20cSCJk_D BG]DN/&Jhy"DVqǭZ鏂ST:ʶVgB 4a0N -HN~ulp5T;s<;?Mal6{}=7Lz 4*H _:Inavit-0.5.0+dfsg.1/navit/xpm/country_FO.svgz000066400000000000000000000005001264204753600206460ustar00rootroot00000000000000(zHcountry_FO.svgn!>dzԸ,`{{62. bEv^/?|806^6TVVYhgYH7m;M@f1A|813uKrCowUa8>zb3)eܥ()g;G J!]navit-0.5.0+dfsg.1/navit/xpm/country_GB.svgz000066400000000000000000000011641264204753600206410ustar00rootroot00000000000000B(zHcountry_GB.svgSQO0~G?ept(AlL Xe8' f.&p(S{RS!(Yj'ma CԠ]hd,qE) 6#ڒY"7)xx6~6$D 01b}<@ > np@?pm"mW=ubRe RwH&?Tk{cDJ%xwڮWjAj%m |H_dƬ0xT=Je[ҥWi ,or^(aT| NÜs,ۧ'P{hڽ7έ>~z $ navit-0.5.0+dfsg.1/navit/xpm/country_GD.svgz000066400000000000000000000025371264204753600206500ustar00rootroot00000000000000 (zHcountry_GD.svgY[SF}Wl՗0V{8N I'3iIH3}T,a#{v%000:]vwv|N>Wz\NYBdYqenEY̗j,χ{?ytdyJ޼#dyA1yo^r4Q_^^KI4?y xQ,<0Tp3Z6eRe9Jr9kȫŧXUNY$0{p9YȕlF_4d˽y=Ƣ8a? \lh,OBSqy%&h vp[tY͵ikܢ0w켘V@AiV(Ldw"ˋzRm lkf#.ʻ=w,M|c|.M],aɠhٗgXtSA7i&y\l*JU-j; ʱ7g EUИູS2qRq.-WF-\_̫QZ,B7bVf}hz?bT6s@ $"K v Y²vYBXsM֪h60lm&JnP5~v(W2.ߋLڮPϚFtݞ '&"#Z5 ,'6S.rڶk۷dJ.@|yv5w{Х"([xIgK- h6uok ƚqQk|2*АJK-Z)5l LH)3L.$ ҏ;Tg5S`?t<) pr.ͣOQJI@P{Rww6N*ytVGDp ʵii'8x) Xh ;`uR ; fG9 LXʤssmhE}g`q4*0 hݣ<2G%lS5g[G= 0C,M t-8z_T1B'-Qꊃ-SS<2r~e("X Oix?*Y(]gC ^oCmybrq 0mCu6p p_yEonavit-0.5.0+dfsg.1/navit/xpm/country_GE.svgz000066400000000000000000000010311264204753600206350ustar00rootroot00000000000000(zHcountry_GE.svgS]o0}μt6 -N{̈X3 r\BwӊQ2!}?9>׉vk [ijU># U2nyYnmz)) ρ97_ ̈́ҦiͰ_M)ԪXH]!6Q㼟ڔ CF1e-NcNBEmB r6[%j'HCg VY-/ouC\"JbgXʬNJ׉+SյkJ"EݺOt⍋b F=F]0`=6~r'B= }f _bsa2' [;884A>?>Z{' ]OgMRYeւ&VGlܙJi2re[:ʼn9xt 7sÁLi-HS(+[~ۿ/1烴59 EFeW܌Cڥv.\UG-NƛM6navit-0.5.0+dfsg.1/navit/xpm/country_GF.svgz000066400000000000000000000004211264204753600206400ustar00rootroot00000000000000(zHcountry_GF.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_GG.svgz000066400000000000000000000005321264204753600206440ustar00rootroot00000000000000 (zHcountry_GG.svg;O0w$vnEqSVPƨqb]9&)z6 dαlyJhkEfc m*/G,[>?@V}t@NHI])/0Va1i*(ngUQL)rXYjm-2ytbH'+qL6Ok^b4WP\QېV!u:G4٭8)cq16`cd@4X dH.&9v?FԤE/[#r #ջ4u;KN!teG| 4Jnavit-0.5.0+dfsg.1/navit/xpm/country_GH.svgz000066400000000000000000000006331264204753600206470ustar00rootroot00000000000000 (zHcountry_GH.svgRMo G@J1 ͭf$^i/6w+U73w@41:(ug(Sfw4| j9ڧtrYXӡ䌱2ۛW8ХJf'Gct<6@ΎQ2a| ^QOo#7Sz9 Z- p!$߸`4b* g G!-@hg TVQ@-e`A# PXh^("CTQ~oJy?NGGM#*X;mhm姫1߽VSz}ۜ_i=!ǐtnavit-0.5.0+dfsg.1/navit/xpm/country_GI.svgz000066400000000000000000000136361264204753600206570ustar00rootroot00000000000000 (zHcountry_GI.svg\[[Gn~_/vEsY[)*mMU[I H˹p<6F_h4@㿼}}5{6퓹|.wYvmO/?񿜝͞׋z5_\\g߿:/ooo ny (o.4͠b|27+*Z֯\v|^/kn>nTrٖܯ^֢Г[Md\sΠx{=|אBH~%W̼+/nmgvKnu\5d^=oׇr}(Mfu|s ]W㓹#QdBt:+m2~ Pnbq^?nyC:y>A<[٬f:춿~jf}gfb[?v/q?BǫAᗙRVzYւy^\xۯ?v]A1.?ZvOjokrZЊ#x?n oG7=Z[0/9,tBGXu' 93D R'~!fZC~;{b9>.VtF< 5p~J_\^n+,x,k<\ yWz]+Mf5W$:+6â*Ϲ]py}^?_ꧏogv VW\Ҁyٮ/nf{g>6ׅja_5x!cn+1#J/;PB>s콹=Z@,>+.Ut׋V0cX*?_&m|ծSv_6jO],w} lȭipKmݨq :Jr3*7Ip76MCYޘF^Ga ,a[M!2t~4Qu)묗~@*]֡;{jb !G@pơ(:oPP FXsƘ>l焑żV"k2nFʼnC2H){=JvE)`|NvtEZ'Dχr4m~8,Pm߬ݼ~ N-h1;ڳpM{tq1~l]3y{ l 3ښQ&L}9,v71WM}ndfy ؋z$:A#y (,ɍr:&@`)` DhH 9t煌0ہ0e]FR,hlq1) uW0 k@'Ȧv71R\Qj ZO޹4iSz1='dځAK6^-DSKTSz-XZGdǐ滢$fz<`Ёwd-a|ClO%!|}|~y#uÔOJ+9%>a8$XΒx86XqhT)ݥ4D]6a N#Þg-5s/#=J;5 C.(>ZGwJ9DȅУ?P4c] Jx`JWc:BojԴR C多+HQcVsZ7 C_0.(WqPw& Š)c,#Ǯjͻm-;8aR~G_/\Ir[+tɓ)4긠 pޣ0 ASa#\j\G[ ͬ瘀ȔSR pa\BF $X$|uuLB*:]T͗w:5U!dAB Ped퐸!5a`z,c)G5FZII>SCmBH#YB*) C6D.fa*5w۠+*aV1 &$Ӫ3VgdLSBD%Lӂ ={-2rzRoxڶ!25lm*i]2r3P6U\ᴭF9D c:JbedRJ`& zIh˔4Ϭ"HKy96rƃ3 \ 夐*(Tڳhbd il±+Κ,284!A漾X# m4:fL2pĘsArBVXEki9qK$ZQlhAD,pYКƨ@~`v=-GB%(1ᇄGU>Ք (ꡄY2 2C[ &Y Z9H>jmp1'3>I|qJyg$i,M(K&mDFтn^o1Xg~2d6(t*LDjIRa4D'P+ ݧNoM>sV 1WTc -S!Y'\z]w&d5p(ycˆR/+E=i1r~Uoz)Jo\A>?tlu]2ݯM^>Di7!o\='2. *L Rq4 L"-c4[>쁗iퟳoe|g>?4oúuj؁ LYgjDúqh<;PU; <y$5>i|/]%OmMvsP^.>d>.8DJxyy[*,vQ;nd SߞPPOշ[*W|}9,-eE2ѥFݗ(Nw{L5vX~N`7 ĚeP= jɱ;Ljd%*n)*e7:$: JXK*8&2buT#`b{!i\ {Nm't.OWdP Um_t׎#&\ALT:C>=`C9]ףTZ !E_<K+r9!g7I "j_ a ,X*<#WpV`WՇfC0Rg&2 0!R2q#>)ȁSM菁vi\4G䃷|1<=Je'#:QSLKAcZdb:xcVE۔ j,1hƇ@Ah~[ű081f4Das/d/  T4 ZKBpnyZ!ѧ'X^0gRhw.I)܋p'=aCڪmCX @V!RՋSPMbv\":3pmb 26& ʼnÈ W@omA<6P)cU?ǷJR@. o#KhX)l~!!?9 b)6{l`º(kۄe n- EB\#jjy$ D42c1"$HRt=8 mDm(3óAgj3)ҶrI0ר9T S;\F9x&dRÀlfPPK2JçH׽bҤC&!òeP uV_FrnOK20P}&/<ՒB5?u31r ;3"4M&vaU^r}g% (lɝH Y`c& tcBvvYoHc~j%P/W:7"f+$ B)t \uV09m2bH;92N^Lɀ>G#Vt&2CR:&~OVIt]ՎteWo4ԫW ޣe&b68FZJ-vUUm06&b c)GA]7Sj#pf I? Ywww L  y+wޥovsyZ\\?Uk5wD16i^?2[`C,o`CbU wZ[6}\ M0wʥݺ_}ߝu FjjRP ʯ`D8[1F=.RZ]s+0sIqKibs+?re8P{+?c"\ VM$衿/+tT.ʱ W۩rx9w!o\šҀW0QtXIӍz2f:(I]4X{6 kz)D` ^Ajӊ$GSPW9c^;c%%2Ca$ ^E n V@g nWxoI\:u%ʔUwR~SM(Mz3v$G;SajWUisNMXK˧ s qV5L Q{f#3^ ۥҒc6ll#N10n;} (G'Lz䉿.z2a3mQl*ɦT,~ܩHޅ>srnavit-0.5.0+dfsg.1/navit/xpm/country_GL.svgz000066400000000000000000000005511264204753600206520ustar00rootroot00000000000000 (zHcountry_GL.svg[K@-?kmJmW/[ŧd!nB6wPm̜ 'odݨRsd>E:)f!4&".J-9'n'?64 GK0#d Y< `nLuCH۶~eUWJb Xc0]Ct)N3V s\,7)N(>"΢R!]M2^)EX&3}uTKJ!UEJP Ue!m<[Ho;`Q:|DOMG9M7navit-0.5.0+dfsg.1/navit/xpm/country_GM.svgz000066400000000000000000000014511264204753600206530ustar00rootroot00000000000000(zHcountry_GM.svgTMo0 Wqe;izqzXa׵À@HLՖ IQkm#Hkqg=h*+mB]_3I2%!!RoO<`ib)-JJo2AZCC?^`T9aZlzhUո4h12Ҳ4P$x,4 G _o/= Ɓ/s_X1H;YOumr0`h{_W;P0j{vg2v*(vK!hm]3?|'w\r^3)[mLEioܧ^n?ijXl ߬/p+Pɛ; E fKWp^c;]]-9+}טxcBȲ^TsfiζNqA{},OO.D9PCl:-ZMQ:+.N~eQ]j<_hC>$73 /PW-3U#-'j9fY4'ѭF̅{'[ navit-0.5.0+dfsg.1/navit/xpm/country_GN.svgz000066400000000000000000000003221264204753600206500ustar00rootroot00000000000000 (zHcountry_GN.svgA0b[@BT[ V񸛙lQ&9<&ij ^=jֽ5RXQ1Nӌs#cا: ~^N v!R&- RH0ٸW>Ai$I';/qkZ0!i1^2l0navit-0.5.0+dfsg.1/navit/xpm/country_GP.svgz000066400000000000000000000004211264204753600206520ustar00rootroot00000000000000 (zHcountry_GP.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_GQ.svgz000066400000000000000000000275711264204753600206720ustar00rootroot00000000000000(zHcountry_GQ.svg\[Gv~`/^eVb#A%y1`Pdk]_;]ݼ#Kfc9]sNUǷɻv_m7ϯt&f]6ϯOdov>li6صC<o&ߡ|up~xxhYl^_n2o7nlwun߶Z7jh?]t[,-wKyH眯6falr (lhanz)_]۔տFٴouza9u4ksoo|M}sx~z|~%zgYn{Lo{Qʟ|0߭l?oVu4Es+Rvj>j< 4ީGZ` )= +~-NnUĊ^tMQ+2Xy5 SW?70/mJ 1ݯۛ].vۿE>7PG%r!U>x|G|>haG'dk=] {gكd=|7{1a+rSSrcwS]5;mȹgwÛ!T rrZfYM2ڹ6khaAn"Am UĩظT/&x=VsN'F3y ä.ƺ0P {Y}rM 46rs~r`ء"1;,nގ9TpΛ9̤{0V1Y#wX'5W3MnB ~']^sҰMP'Ohd| &ѕ#TkJ={v0n4 p%nbBj2Bibj֣9 s* 1ְ C4lbS)~)YI+~k8vvI>gH~ԼuG+5QC/z "Џϕ 4kCL"F 3`2IkcRԄiTW'DbY%D_1\-G^mx%1Kԯl>T3KEGj/1Cw`2H[0zx:bic|1^ L)(PYMa=ҡA@2@+4\Ô&뚆Mw5@ma9c)}jt2ߺA_Ae g:D||ڝhw;:(zC b<ѐ2Uߴo_eI4`IJGGO$%EB-ciۧt%lP3:%CtPtP%iz}*3.p`QAz xt]K@\r'=4&xԾů&GrF"hl#qDǩCvyOY)GnOTgtP9e@8f;z-) J=ܠ)lBD$cJkki}|A{=~Y.]ɤbL5ڧ(B&$8ϧ&pM $ {;_3izv~]k츚L n)ۇLeP%\u*AB&j)D]4B:'J3!u / O#C}A)5@Ni@4]T1 !䙔SYaF yûH3fdH)bQS3jp.q:}B@3: dڙ2,CɄyX%1'I(# #b;$xS-R%F탨F?cMM:,[Bca)D.Ŕf yv K$d'H ss*;e+"44xD-^a|G fr:QI AI@ bF:=u-kYPEhsɕ@ eh$\c%{pae&h$, rjʐ&%uJ3fOY$S?.H DeM0Ȭ98 $\%).m$QE\SUYX,]:@pmZ¡v_HZTKPRbX䚔$ܒ+M ǮGCШ%7{ʋ?W]\.Gٓ˹kd#(f<*A1t"$$mJ̶DFsЙLkY_01ǂ^bQUA}H^`$NήTuF#Uk#+:wcB~6Y9$y]nz8~t:a;ԭ{wwX@VڔqռW]Y3eMFWc:Hm(eA b2X @\Y}缁Sb$KBRE=ifjxB&ݝO1ǮC@ KQf,ڽEL8A,1H%s- |jH3qvG-S H,8CCntU) `h؃EI8U h@:ٳq'ed )Ūc}Pǩda8见<[ImSQ" 8 hPvY3Â6P^2͈b0t 87==Rԭ"tR=gAbXUhqj lA[yhe 'J 䡉%B'ynq4+R{nS;A8UI{a/-{9GN>1[1eH6(0RZdhELR!DS`g{1+B/Um"cirX+B**g` --2?\)aL'8Dɩ+B,N')8.-g/_!f  x&Z[B%S`%+֡!kԂGEˁs)y-g˱MuAgɉ 1+q8i^~T"<LtݵLfxηz q0Z[+9I*1G1Q^j8 0JЉ6ye@`NKw8yJ SXv~ wKHxP♮AO||/xo182h<*?孼ҟ8BBvvTxMEN51^ k QN,˥ȩ:%}qO8̦|xQg-әF^'иN:yTF#TY"t]<\'_LLO!|ADfhrbgԆ\ԩ9=GrS9gxuE>x1곈YP κd\ĕFR5rFs*ꮜuUԭQօMFM߈ -e`,PiTqG^n1jn=(tk*rHܕ冞g4BAPrW IԒrrΩr:Mڤ\!7_17fT4?1AntWZ{.Bj 3ZšST/hb!7j)rW3 w+>5ď+s` d|Rڂۉ. \grSS,J CySP ?H<!s #_aڙ7;3LYϖUʕB N`:xA j*cbUȘXu`Qvv\U 1ʌ{+GTp\FV6APK([((AV]H=|!Ұ<Ռ",iK.N[rT,t Lc-rZ# A,/0-u Ir.p7M٤ZaB늌p?r9?JgQ!U:F3>!?'2z|8gPo$?R{G, ջ1CJ Źj /#/oxhƕ |aN>!xrsely;"!# "pF߰I\@+! *`(X$ $G|ꤿh;$<#3[P?hu\V(<;b3+FKbSҫ9HU7ٸtߔiemb[ Z^~7> 0w5oЕ77T pkkD*wItϋT~8l.їz2Ć%c͸mc`}.~efj㜛|g.-+|sl*`~^ G\f|+-S/ ޕ]'(rq3xu靘 A̡yE9oHG 2; ?, 6RuSb.CBpLe_ ^{~m;3BY zVPl@.:Sv]tB' ira\u#IWˆ:Sm1깩@`tF׫В֙;KgS~=/tfd.!WDckf,enVn ě28-Yr ̥gkV8y<W%3Ebv⪜}ȧ 0Qnc"IٸXMufwED$y-2%ڵtW*z|SJŖ4yu PǦwt@fV^Q λ6d-l;zp*0}+>-ß,l/-,Xv-(E"gܒ#ːOi{  r~ʐG*zU2`Z!抂Iia+)NI#Z]G tk'B@A64x# l~W28lܔդͣCFw]m`Kl^ 1CI#O vTJE1;S,aI9F BZ?(@̨Ry!@Sk)FkhZg1UiMVZcR^1InALZ9g9XU#_Fdu?%Yg}Qf{8 mf8YO= dp'| ^ C_c6C  t>teu2#ii T(FE9~t+^+җhWp݆+l)!j`q}~cbe]K&>x&e*<ρMAEc*m&-]${dw-%32QZ2A)zH JVZx 'Qc6B$18Xn)۬ X+Z uߧR x ѭ4O.([, эÁzd(%kҼ-fO̻}|7tXM,Luɳ'H kƁL Bʶ& ?+Fokmwz~ =~-(R\6ʤۖO^ud(C^PQD%E34Jd$>П^Աwo <7l$51Y԰/QqDWZ1<˿T\Q>@)l^n(R#Ġllzf6g cOeF"3_KyH ~<ֺlK`K8̫ĦؾmjynEyV *C4bAck3wQ,-zS _W%}9IтJ-gͷ% kRl*8)7Rʒi&Zv@<no!RIY}EF|ӌ d_I}ɾ‰\őܭ2` b%Y>K :k5ɘL$Y}][,Kd[E*!w\c嚚[Lv ;z9.`^]os)48* C3*GJȪ,".uطRn<-`9|")/$VR/`gfrSE\ ZT wVܰv "G ?4o.RWx(Sm* UA2R6n \{MܩU /lC-?lIA;sBm:3(@`fӾeLP wd1nrV8ږk.( a;SŤIOy-`ꔪ$ AOé=ޅټ)sz`c~ @Ëf A'VJשs±3R{qRpUƪ膭4*9 xF!LJڦr\^ G3 S#v(lA>}_pߚLUVqȖe(oT_/D㻩BRWڬ.(IjG+)mTAQս ŋmy+8wKʌC5ӧI9'baW8#CVomOk&8%ذn݆RrfڠtيCO&mq2/Nc|rySp74S>I2/')Ѥ=JLZ`ȷnvrd2kyٿ__,|:,=8 NFH-.7Ïjo.hd02TtI'ԳW@ylN!QP7|>հ aud]pZHb&~ByPWJ8(RH\U8"5P(¨ߛjhBΝ.J2(6z<5 A7:3rApQvٸrD1FCatJn>euwj5'! ް5U?d .u,d 6'hx_#뾵e~.Oo6QPNOuO45ޡ.[,6BT"-;cʦ͌+\s$bj ̦ ׊|fx!`!ba9YJMx[h[0 (@ߩ"0JB,W ^`Ђ!pN!g?O 6$t)Q);VpDxB\HD@h#Ĩ%?TړǗA&)VwʚSp}ZTkՋ+PE[H@yR0V1;}HBqf *gJ\yv pY!CQk<ԗ;^U¹|ݼE-'SS ٧rČL Lϧ +R@u'tH!2Y(k E^2qǼS03٤ Mjp(L>ZyvGQ|g@7 -E{=:vxA%֏v*`BĊ] ")0bNAC.3#,#[G1MQ/޹0}WyEvKQudx&+Z()m.JjSM+D~INUM:A < s 6tJ I๤,~Amꂢ hT' SvJU`\. {U,8dHWXLJ[ <;M* w J݃"T0 pZa(Ic8A`qUAjH4< E?!+zwJs~Dg:kt~~rMQJ_dSʮQ2 _UȘ͍^[T DJcH {#>Hr"t\H=^-Cu9vxV}|"l1Ic^l$ɥ_ćC|=,"SX -t٩R~id-h"u)hT ۃLw&MZ<ϜwD+F &&j䄣8U³pS =9CEVY66zpB&YQ8:LE:rӅ:ة3J-hP."  9/$9CuWIˮ}b7eH0VYU*Ε{jp +™%1WAF)x}mħ,fmgY@o.W Fs&Kѫc "DR )!yx'dcۥȋk4}fgf?72[w-|;uȊ{]AY(ldeP=ML:_Y3eD??H9wHo@9e0_Pf!qph6BeZM?:@A1uT~왪G!:25@wdeYzdO0ɀh)3Hi$|f1իCfW'ADʵV/>"~4~_Og~ &xr ;*S+KCHݷ|^ξ(&iK XZF Ik zETr=w4qk}D眊fs> <)~GO><;a:F6%ZC@Umqa:>w\R!LL_Vpx.B,ǮݴY-K~>,,r.aet d׻S!㨘3 UhDka+NO~lv t{ms4O@AksڿX? ޿ǯ||ߴczT7+Z_ tJ^?$zş޿92v?ֺAΖO^b!3l?P/$ٚ9}2C1=O|OƧR|^$4Wx/G|U^ṇ}_ba ~jP𢐚 f 0v}w/ 'Òzث/^Շ٫ڌ,XT&(a Xa~8TښoX_—juy]#{U_𥵺7V$XE;̇zث/^giY,ZSǁVCDUš)ɗ_Oծ>/_OI9}F{>W)navit-0.5.0+dfsg.1/navit/xpm/country_GR.svgz000066400000000000000000000016651264204753600206670ustar00rootroot00000000000000 (zHcountry_GR.svgVn6)X$Yr i Pt%@ ,[[_Cd TA8o~9#xuSٴ3e]dwFkW~/B6t밆<"zC( 3ēАr%&Y¨2ɧ5v'F,Zj]0-(}'uq/|wnavit-0.5.0+dfsg.1/navit/xpm/country_GS.svgz000066400000000000000000000660631264204753600206730ustar00rootroot000000000000004(zHcountry_GS.svg\n#G}/6@~[3lmhe$e{Ndjh-ƌQY'"oN~כTWj:qnyqϧwWqr2mFʒ[:Wiy9 ղI)#</7XXiVv.ٮ6'0=pWZ.O쫥_^^^~+fx߷GGި~{NTa%Qa%rVa%[]QrC}Dfo̶ˍY\\'v8gb~Ϯ5WC%5jx?/60Χ._*:B)apnTIPiRN}>5Wɤ{W+ŚIUҌMǻ-\^yݏ )v&Uͺ33UmS("Hք¢-!=CBV'e٥R2xyɄJv+&CeS{HX[)1˱S$NJ)t >vFz>-W' >(o.{o){8lq^CR'|z +ݾn68nEO7;{ܭe`Z/e`>o/onoϾ"  g.&9Ţ F>q28N Q~w-*;t{~w`[i |CU/ijk6\G'gޫӫeTc`8 x႕Li{d{ oBl+匝GxYmF5P#Zpࠟ1ZYSB'sƾ 9V~rNpB cք„DC[BМ\Hi3kEʼn8"~์l='uig>˹rdH8#ZqJ9˞dY`!#,7F #& fkdP#N?(rMx[q/; d k;sʼnÖ^ڐ9|:L!JsRCp i3cisls;賝0dC$)F8&x b.KX6d4\qO^2z5lqT: u%|_ށMK {'eFI., 2;Bon\6Fcvx;{w;es70DF1FA0 Q2͆bɢ:TN8YVhB, %1 &;iE]3PPD  ;C9K_P~@iˁX #~͜<&Pn!C%ms`8|I=,/7|;G[e&Y8#efmM_5]Ja)4z@7LDrC%vqL Lw3&ʂN8.NJXUkN g4:u>eAgXfp,Z *E=Lb08(#Fc숴pG_~=&odk03f#N)vt0̝1P x34=QC3CȉIw4dpRwfr`U|'&a)_!Ɗrx6d spmix] XR^tbbqe?).$͋@C;HfqMJ{DtMom(/T@AL, -G\2Q T^@@G8V8'3ޗRLbp]h, X y*rBCZ~4DdxE5B } '?Ra U A{ Mʜ5rN" zaQxE$@A/ eHƴ ,2ܶb'=LR3lH=iD`^yC}EPFC#50G xB9yw9C.M)9DK8NLsP݀[ə BtAz͕W`E% ԔKnyÆr\F^[& ]1}rgHB^ fGȴOL}NsHvbڑ21r:|``BzÊZ*:H4Hm%ƱII$zךYT;1Xgq!er׫P'ˋz}}Cp6>i-Dz) дX`ApQM@&9Bth$sA&3dۢ3i[ X&n~8DjP`v ٧pƌ+X*r)6>CQutyUE:aDÁIaIscɒfNrc0Df,* "WT0e<`5?u-6%1-l9# rJJKχ-xȇ*DJNq.vl+N_%Nħ=tK_ƥOm {5p];w=aSc40i4/fw?OyYe;QP '|thI]En ˏ?.cV66M\9G=bI9"SX®\F77%]G \ڙI/p⟪9&m:EchJIƈ)`i?=*mh{1i`&q)92t#zL֎0pƘ&hsFU޲BJv\N k$;qVW,ϔB _*uBDe{4ٜHA,)xfҢ<-/HA3PBH BТ09M DF+ݪ)U/K e eC3{,jK#׹&kn{^`fka`@%D iBZrPf-/&!YBF:LBxa"`]B#)sm 7AhKQGП/K ̚ *Y-0 Ͻ-`E.0)2;w9,ȍBgZ ݧH!0)k9Uq.9H,9Q/DȚ5'aF@VR#_j{(O584N w )0H$E,05XQP}(% 5*6G\MJUYxa1&0H•4}C:wk?/6 Έ ,ڥryþO 35FlKRa tzHӱ sa.W֙9b 3,mX._C8Ji$JB3q ˴w_FXc9:pJYCϯ= Ҏ9 4K8:ho犖Leɑ;`]] x㸯_LR+R9^7EbX)1T,*d;݆gԍ _Lp -s*j>$IM,9-I$dXWNl)!&k O2؃ER{Z )MZ;(_y&*/e"K%D8Xȃ WsburtM2"4*YQc @yG\TWR1v5(`wE=DÿK%;~ I+[zAf\4S2QNN2,}jʿm$~ʰoDl߉iM|tMIJA5""i JvXLk9VV!5ce̚r =щÓaX.GGGZX9\a,@Bbl 4?^Q,oΔ@+w=Hg%O3{&j3+s6T* _uH~+ms@{֩jMq?2 Xt5Vrr Q~fUl.n$ uRsn'BfRMo"߹I>Z=3,OmPp./a3+ ,Ow#<ˮg^8a ;qhj9ҥB'rs<DP#>IYÉǕT]S,6]獚/|Qf˘?(KXGߦH?de+E W⚩cn6 Um1b}j y3ٮ.7`by2e!:3h/gNmnɡyPLlI.x}^A.4d[vĝ'D@?QD#H'-%@[ d%xbn".Y(mSjmVKDujSdg!Wm|ͯY"Dbv;(ͶM}>^1p%M5>p&p¨vder]ىAQ7~J^.IH>h"fV>$ܤlJDNg1/ HR"WPhk<m9*t[#醌)f~;`;q+QJ3ݿHrX,lO+@. MώTlsCq)+ SQCD<+ UG*AjҲL^U``p0&Y&F4)0)x0Rډͣ4[A@a"];Wp<`4+} YqtAf]5'#\XZzIhRPQāO[h"N1%C5ꙭ!096m. fD It/L}\vyaV<ߐ*# 8|G>ű/~ ZT>Q0 j]굢kL8wGHIn|U)L(eCB{;߯~.0\ 3G+ %L$s݂R  9眡XfG1ʨ#81XRl͓+ȰUPt2RWGkkC<Ob>P[d?.>g2ˊohG/'2pcW0Zx/NulLsȺ4/MMIFu Cwmu]ّH41;^ L:!7&XrxgrvcwGL]I;')n"ď؞(rv+ҧ,5:D;5s-@f=6 4S/uta&l\9ą2℥dkTC':ojKb/ {!/txҬjX|'<FQ0>*iog <|fi* ?)<{0;g Gu_=R1㓉GĠUe5ӓK>|?%|)ݟ@;!+g]~NֽFTiURrؓoE~s ;Zew~W~nw>ݼ˓8OhGb1SY|CzŇU╣m3worbq⻳Ch56)T^8iQ]|+Y.1'?mh+z[LSI_˴p'kZ` Ikw1|K!K Yq)M~v l E0US`}ؓuӉoD*C @+ǧv0_ҳoxّQ;Vo0 Eic%׊8z)!@.rR;ImPd]bKqǶyekѷNɍÅv% ;W[V.;Q8 XM{ F_}ZC!h'[ap4uzCSIqi1+k|4"zGQufG ŏ*Md$<6f+ÑgD|X])@uM xp^ }i"16̺ϋC@RkHGa0f57ch*@*6FJ0,CCҵ=\c{b:}4J^9LEDGvwvot.|JuMW4H- J :46w ŰgB!bIɣߛBaWGA"Rv:puu@Š@Ӟ&ٶxusQ =qcc3$]Y*AIK8k:-Pxң:&\}b*:5=`>^A@OJ^h4ygscCp>\1Y18Q!XnZE=M+WZFq'rv+Y Mp /:GFgVt~(I#qE]Б;ޕH},JE^Ц}ع"ȟZ}DZّ܃1A=ɮ `a7^4Aa%zE!T!7$EXyExragQ @@y7GfoW@1PcP g61`z@\b3zg]}(-y0IfJX< Ȣ'dRv AeIXOWuy@w7( P*_A<?9qPt%.9]\QWKvʰ`ں7UF\vdvU#')Jә҆0x)hOsJ:Sp>Y'A2赔J1 ߂mWC`',}Mzk*px*OQ[gFS4va6Ӧ}عٖ>4 S ܀RߧR9V u9F8kgSAK:v4)S_ђeg"&@>!$p#߿J2H|,u#ULv\M>W,ɫaC:}6GsV6+:^jWT!O ħG=ANa < 4ǶK>Q :a WK*|=Cc]7{ a$!!=TTY:Nj9O4f- @QVAҎPV3S1X UR}ع% {\Em`m&ɟuq~|L!u9qǏkl_}8BOm2 + ;(u 'CvHDEkrC5$?]`+Msg }M̸~~G]Wc9Xx%.]7{ Z;_ Qii딕|$mx=T2nwD89coI@1\ϔTyk/戦丂#BVw ۠EwbO 4|P?"mpu,?p)v.ST2z~bnǬJͪm.nugC + ¼%/5e*3o[Ǒ9:643>[y' !1 c.?L;VM[n]. 5-yBqK|^؞O_Q uQ7ʂsMD+qVXOBxhIAczՇ9?hп|-CQ8e&s0-X]k]1M']7!d`tpU^ho򛝪+LhYRRCЊ: $;`#F;ѳXh JZJVﳆ;eɮ:;U8UN+BT yqVfV9Lo1fi}@l+zݡ?ɦv#Wwh,4ܑLpzuiiyDm* ݱLROCVmX;(T% jPolnHgNNV5ɯ6[͝r, ƕ%E |yju2)+Ħ{Hj6s6yl;O79OIu^q!$ŤdB(/0+*ȧDI<N_O@&[%(d7%n6ڝ[Y@UQ":)0%%W͖[' Š"&v̉1{̚b8 t h*fxuvg&WuCR'0e_[N`dԀ 8,U(Ql+GY[Y.VMxXߓSO5kg*рHWsuKxD%ɹ_bw!6eFdHV L E"rɪ[{P ӽ7o c5E qRڀP\TqTHv~h/QB2ڍ.77cn)^%}d}uk4RjQH~l|im+RPev'*Fw,(BAOd Oq2 01i;j3JJ|!p*4&x96"q˚p٦[TSr<6QBn6(Aa{ xvk6MNYg([5yVKQ헅:NہWhH_ TBf\&\0sA~ H2W@<%슙EgX%U$@ar=038Ԋ2ʉ%g6u0yJ!k^왐f/ .EqJxu ;x]^| \?xg߽jq?3?,1,8D>΃'#+k^mYrD̓<2=LpV}PfȺbdP'] *"Wʨ4 >}Tx\Æ˖\`!,@ @ɳ0, 9хChw E沪wMMg]F)¶*sI%= Jm7aNf ûwb} (a)PF(ˊ@ET2c+i]'eF;"60*Q%l͂EcrbsS{#Q rm{$A.A7e% Xh>\.(VF2SU 0st Ff L+Q+F~+ /J(YL9D4P$kq> *?iXtovG,Bh=`2^ۦϻvߛRM_W<8'r=CK~ճxXgL&2xc2z.vzk2WpL*{R] ,ܞ_!O(|"e*ۈbPqf<+%eW=T^q^k},t=ɌtIeΫ5j³I}/jj5__ f7`v 1&cɃÆc!g?i-4>ݳ_}k&?/؄j䧠(K\Nj{^3 ~G#=#2ϭ]h|xw~IUaԫW6 ]HaIqo ~+3=z&㍌Gy'i0YczYKoT/Gz5;1Nl_xތ3>2λ1N5 68%gP8vi!z21[Ƒ$l3\}8]/ئǞsTO;0[b3#ۤ6&x])Nڵ-7~ο _2f&ř?FmjuqJP-ֳ(:t bwڦƽxiM_x$: +vm8dVئ߇m~}Ʀ#ۼ#D -=0nmlsĊez{R]7|^ 5zԋɅ;0O}<wŬn#珎~lTE㥯rVئo~6w9)/RC_߮?5*oWZbMx/+|7}&~41,3ӵ Ƞ2=gfqٝ~&}o{3Ge`Ug1~ޢ)絲0(zZ}6 [Tp{,Y[1~Cpu}m;nQ-ߣҠߣ_6~ BؐskwSu/3e^lifN:. pf:nW #C|]r vd*#o >HPRmP TߐDa>)aG(CclmPbO!x_vv l7 ܩ@[14E' MZ&.~;Ǟ)ݠYdv|s~B0 e'/~œ_#=T‹Kv]bAn[ݨi6*63TlgsTaşa۩r;W(j3r^D5l]H?<{v%]5-H_,w`lR}.)[vږwO`F5'|EZCHjb##86#yCCjV'&U< 6f%ߜ +TZ&vmϱw-.c˞bRyrX%TU)U:B$*4F N D_!zx)j{%;ȄL-T3o|~dsL=5I0g\JW#(۱]- ZˠQ^jCx(?*9` "a/!ҪrS&1-vg߿?\)GU- ݥf0/>Xܯ9>s?MJ6]{K9ηNYLVKXT gf+V=V?z;;Tj!$Qj4J()I=Ϭ3Y" 8F29SZVMktJ*(U3m=t"վKpUd!P{Wq="TF&eZ$^pP!-Hw\KeZe *npj *A^)nFXhC9а lqYw&a ^sK |8U ӸiMq~{wRCɼƁ>IJq6t.^L)3fUʔxp5*Hl->Ll~Z`ZNQ˩-a/҃ }QD2<,HWu^ml@CEj^숔_hݬە)M])ԓi3Y{P8MFXR ~QI(o"~;K,{ J"2rȔ-۔. h(3)c"TeSD{kv(-j5qLζiF). 'zvtP B!ovE {+6RkUաG$U[?V-Uj&$X6 c0d*͌>`_`w ?›҈qyc,e'-Z"oM WB*7Y-ctJz;Q>$UPq쮃S=-Đ]35O8_54Zm͂ 4-~ac1 lPB [#(RW:'O ^B3$ƅ:zҮ\s^ ^3z\KᤫQwFKv14Ɂ%#7`,j4}G}dlr~RuWa ]iLU& @.{רhL'+VlUD%D }i_v<"6PL`zkP"QA V*G'd8GhD.iLmh!P|m QRD`:G+(ĝWM;?'=R]4Z@ 8H[T[:(U6p1OV (iذJqkŎ\%Ѣn00( {=*c;ȉm>GA0tUR]ݑ颔%T6#ukMuzN[™69y9&lz Z4hY T2M%79qw)ij>ypԚf;w}D":&LJFrݚo-PWȶ!5L%=F@q|4AWPs)c~J23IdEtRa[rgPW@/(6M=)'ra<-nV`|%wQDu[@ncL|oJ-[kj][>f]d1}ކRB -evɕt]$B ﬇ GC:U?g5 )X' ZgPz]@Cy !(`?G*4yCU4ݾ0pQk&r=ZsCy,_>ǪRӾ`pЗ:6pI \F10+`PGɯÙe7q΃ իƕvI($̅V_YkHL ɻqBz@?(&ɘFmrUw)WYZ#$(6ߝ3)8rV^'*%p&ˎB(*VBhCqېRhӁnq{B𸲙K<:>= љ$b;PƏ8ץІ!K1tImWUcX&s M8"1P]%~ԅգXI 'XD)xwl1#=2ee&Oa;4"S|~ TounE*i63,8;掊{02 e-L'%Õc)E,RD9)c-9tvez-Q W#3FE<7uxr&ju.k_nm$2>9[\c㙬}z= m&_ąAPA@mcq餸C9]ũBDxa~S(pQ)%k qm>+ i0rA{.ȍwyu0)%*1jٺu7Nƛ)adO4E0U2s//~(rCL?"^NyɎ h_U*/W1w #(S4K%j`,@iyNAKmv⬑y2HM }nX;8L[aS.kt0*M,_8,E]g&z*Rs2,>q5wMzh:n|L#㢓1ѳ*q oK #= k}])p_H hpsXѓ͆w+w҉" iE4Q$?1qwKiuZ;Xl35ijjmm>l 7ZBsZpc#uU(nCHcW1B<} "wב H4ZRB )յ<>;P z[JT_NİEL^5?7GZ+&%)4R*Mya88RkjcpUA9ϣ )~)*d Bbբ"D"Gh:w/hf&]6 1メ '=Wav!EZ&kJrk3qWWk йHecarQ<7$.Eƴ$Ӻ( ӕ \b^= ﹦ !~`Ķ\ކȻ@uEao$I7t4Ih;C5C-N!GI!$VvĒgS7'mww|- Za 9cvjm釀6+.ԥS+bY(@).d+|4eɷyoFI{h[WLJ#@e&yaom3 J!Sี8Je >X؋Cs$$U<9dB_ppH3rLOyGm)G|o.Y 0 v(!6͔դ" 1Twu]DwF~oJ[MZ@8:c#8R!QɅ395'h7Un8a8u^~`C#*v"'B.t.`;c"Gqeֻ\-nu}NDE؀S i-g1eey2Lx$j -+ ȵ}hHS"Ǖ#;v9:K"씎V.F:vk(dݔv>=@D/)5("ury# dͪFvuCǵ}'ȂJ+ŴϪ?4,CII#a;iܵXv>4<M،̙ - !T =~ؖ6(5B64F@0"8I9 TV9>1뭰0)m/l);4AT$.Cձ*ޝP,v-tpNQz,2ˇ)VT'T RoIU,!gݓ:۷ňS @ܥ2Qp r8@jW,@9[Jc2 MJhZSz|^RXbhG-2|bKÐC _%76)Ԩ8^)S ƈ,'|ڕb(Bg,KSU2z.=.js'7KM@$)bs@,U9=(dw^PzV_6ىI`" yi2~'@)p\89KEi$@'C0KQ'>X%bc8@E Bނn-9^S;>p#DrT%_7ajqf5#ICI+J^ *y[%FkpGh ."O ŖK"x{h ۇ3 z8Z݌ښlnT8y9B~ۇ pUB!;k1P:onMcRcm7Q|YO!.YpF-irvi.A jU[ #+*EucuD(F66 ݺiWDV@Qvgq~qG &b DqV]ȊX`eL&(9/ĭS|XɄwzPs~5*Jj`~'@y֭?^uﰀϞ~_u_`~^1-`;Y"7ƍTSCcWKu%0n@I zV]߾a^S]fa=g^W^q\dZ @nYm-[z}WtxzrEYi|Ў@bs/?,vo)pp Ih[EzZBYB[jfڎ !iꑦ5hW7m-7%&wz1|(J^TH@M[^Q'``}teH,P5(:xK%`H2M7۲PxvF:]*Z.[ᚢ87,R+Vg]FQ;10J.|VxS$E]DžGbaw%ir#,`6ݙWv~0\@x EqV[2ڌdGhT9%&FWJ.h\0UdG I ~ 6%LΤ*A37n|@jcEJ {/`bW$?<X9kh;Qbo'{nFe>Ayء5RDb򴦒3pE_ 'P%gc?y&C$yT~eg$~&06eSgIniEA x@+.!K@0Q7PzL&Uٺ *6wU!B='.or:А"s;u% l6A g±E@pE0'0epؒ.MfyOfC$.H;* C9H(ÕNL@jȝ~A~osAfN޶UPYf(:#JtŽGfF \d.mu.If=kO?  ܲoE 2`@K&>Ro=?:2z$-8o=)M ƞ)x^bLowՠ, ݊'k{ۢ69tѥ8e7N.IO 'Kg+7=$PY~L B+pFDn ) Yڤ}TSԅ!U΀ݖCy8#BI.BrGi )a,`i8bf6~j;+.ŔDneQzQ;U wIab?R{-]RHW"x<7Q;4bwU͎prh:AkXS-x v)Z75te'1Qb\5" 0M։̘ @Yȓ&QQwJWqB8LLV֤FiGC ]#Th2MBB)C/czoUQjWGQae0YD-Vn2e*GtWJ-VI,zxǂ:zBcťS'RHU`BJH#@Y#UHx24vuO,rmy qTaT/CKaFQ=${ti5i.gh7P"*[YRq##͐Yw LUp&>l T A W}- Q##J9~$Mxӻ{I#D̃8K<EjY5:ǭKÍ`RN&SO;_ZW->2j..T͊HqJ궸^j'y! DEI2ł[۴FI颥dՠEC)BIfJ鄜-c pYTL!yڢ_B7<<bt=HZ USi3EYZ ԗU`)^P-}YXFev=$]u;]T;ƱQw9R-cv]QY^xR,₰((TJЗmh= V73mC|10,b4](R="q 63Qꊡ T8:@c p@Pse#pϺU$d>lVg1E,L=Pxv>R%)7cek2y&'Iߡ*nJuǡCPn3PWVjX&eYsf+P gW?Rp ^/-P0ˌ&dIsZ"HHB5PbH[ Ȍ=iھV- Gi͵*lo+1+ɁGf5ƨ8uSm7t8(/ r~|T=lɲ 6$T׈g,&1#eAuwhWB{>x劸'% l@8Pgo;L Q$JZ[Zb}K.)D8TBL h)@%_mo ʆbƩͣ_<„y%d=tN1Ui&mA^6msJ3$i)~|(Z$,/wCٝxʀPPKi[dT4pH]eՄ*R}Tag{Xq}ڼH'\f:rt)-:Zё}X* nY2&ye:Hƃ:wN6[RZeڔ|v8qȾ6X|c%nN30%{TSHSWʄg $pWVˆ ^n#T'S5aK9_ndXPج瑙kfVTUS/izI[TM\uן6*=thTbnܰE  H0xQ+Wg% *t/% VJiS;sN$"ҲrQ|J3((%\B¦Q."!h7l+>gg&*H4N5 -8WrH--^Pf4Kʎ#^pUP5 [0N 3;'ۇMJigwމI_-U1b=MvK7d]F> )/y~>\ |'>?zg7~?y7N7oϟ~}//?_-O˧/['sϞ:g'_&;/?&y/y7_WO^<}/{~a/S>ۻiâ >˯x_zݫ7Oׯ^}SwOy'/^}jUw˛~W]%~ٓW߳?K7=/A;ճ%FJW~퓯}o傷=wWxّAËo {I*{er_x'=^sOWg&yOwøv]&gۏߝ݉TI.4' oI!Rex8շQ_eˣ)U:_ޢ No=g1yϥK?`λ~ .4o'[pe\mr9'vrvd.ddr=aPeee8NƘ{?dl\zw \!=XY d_<8Hv.s* K}UX\\q|7JWw-[qܲx3-F [KYFB=لVS͞RB.20) eٴd$ 免B- D֓/& SR䋭D'3ZDL! 5OY7&vO\M&brzR$[aɤIZJZVd rx2VCqMN#9rLVBvke!.gT^*(bK[7eadV 2(.׎"N6PNeWlK$ސ 9p"K,R3$*fK.!K; GѵwO巐\P`3 Y7׿+?nɽe=Wpcz&}\v^2p)& ! EM/`\reIM!K\r* ;,h wj-:A9A-(/NbNaw1eӲ+mREc$c᫝?jV<)D(^, Cc;_zšrƮQ5. )}鋱XZOU*,|ƣ(p&C`yC`ZrŵHQ؊(׉ߑmӏxS)H-:X[P IY>ۋ!'Q.e{.-rNO_Uά FFn:YiR4=0ZV^\7@xM#IK<)Σ #Svo_ C 4J<^xsώ rB`Yz6D z\BYxaa5D+"b] ^SI`<5ՍoE]8ܘ(EejGeK˜x ̼%zEJ'gi:nz .%zk'/^x-Bua@1+V==eXE4ay:kGŲ­zbF%C={EP Uޡab³(W[9+q(6:SG@[Tx鋱Z82s1: EtQ\\8dTiqE1yCpoꃋ 6ɇ/F)7VW[pzhBBvqEQ(JL !d0>Ӳrg.|!A"f\ۗK𽈭Å!zab&2fYS Q)jE_rNL)ρܩNS!w^ t@&*MIH nk TrB+¢ʖ(BI,lKG`ŚxkO/+j? Kx|M60Q*741NE>]PȿIagR_p ;Pc0#" I ={[\S%StdMZw뭂 d$Zw'v Z]ڡЂDP,+店S++N ^wi@WhP@  CW.߽` dɡ;he]X)(m#hKrHdPNx> ?j{U= \o"n0KVߩ"4<3S`SSFRv/WFqsr%b\× 9^"^T7NjͧᆀE,_ ~! #UZ>eX'6~W?OsLY^ty])V+«L |> (XpX 8szYtq޹ 䐍"H~REz;k-2/FSM,Ɛtr k ˗Wؔ 3Q 8cQC8i.R:8GH(7rȆr4^_m_b3N>}=|š~%<',)eX"ɡ/YMs1>D}G|E:srB e`f Oދ (4'$<"fEDm4HQ=b ߜgDbXbKzGvd6MɕqbV% .$]-:ߢk ,la n.p |HsJeU&4Eo9rG -3O/S \Ob^pqȧX?Wnk>GqtQ m` mĈs "zjb#q冕_1Hh%s9Ō-MlLA\u)bvդZ{2"\+ۗA?vj̹ȹ3ׄ:*8=vlJHWQ\/UEKT-XT&m)`ZJbe9ʖJ1+ޭ`3A"֗\ۗ5}wPoބ. c !]IXfLwPE:$`a1rw1) 9!U C2% :ʿ(#) YdF2aUdSR 59.+Qd%漺RIKp.t!&# tPPϼH(,1Ïë. iK`H=#'q}~ oB#0,挂cb$Y^!!x8FUpKM5~:EƪZ/艐0T+JN/O笋5bAz%Ȫ3gO_:_r_Ⱜ/c2$! { /fդf)r|?SM¡^[=@84ѓo_\^s_ba){l> ? 9Ohw&]0TR:I>Ў;r&㡸_%RR cIL4 bR0M &'O)s*ΥcnHE($Rs"jEatD@;HJfgck$Eɗ?g,%en E|: *gHHgbCΧ=LaTQ`Rx*b#U$1J;J_ʩ *Aq٨')Ar 2&pbWEi Zy/" T6!&QQ?+c2x:SǙzoʜ,&( pYJ작#? V"\zL*zj8p?[hvg?e6)wS31w2XG=K)C^10S'uĄS;99ra~O' P/1y-~IhC[D n\Jn1(Jf1TξYPg; \N) h+XdxVx]0jG[9̩ G> ZNMLΠ#xZZtDjmPƔRèor]E3 ]rEC+l)*`)~s(fj AUbvP]ëer)d6>]mYϦbf;^ 7z4AZkBB擜ao&RX]I', #OثkBj@mŲ)oBK f("1}V 2}ư5Q*MAV35(8q Ḻj.Aպ :&@ ؍3ڗ;[*˪\78 {3/fLqg_8`.ypnBY˴g>Eg>EfpePg>߲̋`88֎řO$3L*{^,x Ǽm0bab`fy劁3m'Ya I, fN>|QŨj0{7)(̆ÒͦI<Lv9@Qx0갟 +v($&(2†Hm9#Er94xh07 f0tm9+ !_Fl1/sݏڐ*W@[Mv`JO g̐6 fzS,ٷ?춢MՁ5eRCB̾lr 7!PVr٧/J%4 f2rEՏLF֊\44M9kH(0 f2܈Ͽ6Ja`"|>6C` y7@YGUDprY 9N>}s[p1qit)3LPi8Ms?W]+hه/F _:3 .?Ti13kBi1YR٠fIDH-fN>}9T'eU@J2-fp9¬bkG&0S)w+*W+C rLQ3W 1ҦLP 6n;̜}bfk3wКt /r0q 3XB1[\5fξ}yVB3MEO S|wͮm0gw3aץ1`-`_;0Pp?39CBF!l>z-}BΘCE30la0f@CP07v$3>0s Cp|^'3|~~- Q[UEoLgs?6Knajf$<|j~wص\snNG^kKBuwvm9e`56&>ƻeX嶳[p((، W疳^%^o_`CLzU #PάӥxMAp0 w-'_ HA%r%l3"y< M2=[NЫz`Zٻgٷ/L9ׄQƋ<[ ?ǽ8߈SA{NtmaқѴm9eDGvbAB ıڡn PcIKz|2vCKxGfNy =[ l5<{PPԻ1̲//9?* >vWΦJ=ծ-Xd۵o׫k Bdk_K Ȍlخ-":rk A2jMFMm/h(_f-"ڶ}2C{2#wDLIXM[0VthڂWzGMfjr w3rvŖ2|D31سňlӳHճ8agه/s^p_`Gf6l1\ [̌Yh{|K1pk ˪m1 [Lk5l98p@<$jbRVÖo_楼`yqׂFs0Y*J~WiӰհb4l9` S(#qlo;ZssxZ &VeWc-'yš~= t%83vzR xQW-PQo;3{o;}rS^r_`W"b6wP6nҦR9FDi̬S84la"4l^ݰۗid9//Hg;1[=زVǖ4ѱe'3-;fwl9eKxZm8ݱdR. ܕS !-nrKW+ Ln+dVB5۵ P_Ͷk.Uۮ_ ZN|z#AcM)xV-@ZXtC֋bM|8V-g߾N|~$w2, #6VҦty9CDٮ>3v-g_Lm}š~Jgu86eZLB,<3Խv-P^EiѴk9ekU/ZCZ@_ ʃ<>_)1gtXqY_] MPv-ٻ7yq] N)v-lrăv-g߾`gkNǦSq4eLoXȚopswoHc]-C`6Te &U{XP[۟2i9svSyk'[l{@=mo&A2Hp (-7eξ9dv낙eLj-i-֖ `0@y'_5`&Z T= fg2;˘YE1PO)3e,H(2L Zq?;&YuuAxmzpi|Sd&V)v{.ޝe`uO$7DZJu9"[hRw?e:J _6s2Pr(j-9HEbqb+fu>~s6HhXvH_€w2~[M H0'h!J+u׳'MBJ9 aAbX o[hNpß3ԁe`?p4A hMG ,8U#nj,sO(ֽB条GN}eM_8 L_8(_yl'_8U1jƨvMc#Yw9qC΄meHJEVfM۶2&dS?RQ4YH')u7h\dnh*ô! cǏ;yD!3rϙE [2(la3d]3tAJb3(vf0S2gȑ;61TǦ7?hSzG B"6xB۟G°ـXGTYu2ME"3{D+)h5QzxϙN4aΉd V^0Me`wNs,ܭ|"-m79L)gT1ei*E-=e`{ß3V[^=e88٧{@(e9@orϙCr)S~%2Kd{4S$S۟ +cOh="pfVOh=wO\Sb!Sh¯UrϙӎYOn6 Z]TSfc!T6HY?9*=exH<)sqў2 !}7wO Yn*sq=n*[֕^i*vSF h*3|dLbxD|soᬌex|Jl>TRH+%I†f*B fJ$,`;YB5﴿\PL'GĤ@_ߏcXO1=ߵK90$){2qNQЃ=`г*}Ɛ*0ڵMiHXZ`5H{ff()5DGD_Q6>#JN49iH%$۪0bg h5O51',Ojv QzШ.n=mNknF P%@cB2\Pl%s |wRɡ7Q?ewm޴̪E ]@C׏Xӛ yzۓn0/! MnUHkƼqqޗ:YxמF;$,И6dhfJs[ؼECI]cdK\yoo~ä:R䢨rcut7xZTм{d&Kݦ"yrߞ4Q̾p qqnOqL}[@,7UYD'P\t ꉟ xg o{jnHcd`%c7[Q />Wo˕ʆF4m U!Dվ5,gӭ4|:#i6 sфDFDvl{tP.z 9H7S;bƢ …Z6SN鶎O[WL kYkpe(޳#}w5 +p#W ނ WV V,W JBi㿃$;ZƒYMGvJ3NJA,%%Ek6{8<>s e&n4g!S_)Vb4k*GY6h!6sMSDY1~J>@r_4awRPB0J,Ц23lĺ3yޟ#~:բv<{}t)ӧԨ9#&>epmaAfJe7UFтL\՚`1H+Hvr9S}fA#"BmN dq+;#&[=:kD^;'j1ZN# BKF%Uj جM ք -Uዢ?ES r3)D˧\k`o;3ґ!'Ɂ+#)3ٸHruC &j&MDQi}1!2q%~6T\v.{ùΈqm}!`#SY懎Xᅋf{}f&sԅ{&:"ъxq+@jF|{$_N)M߶9=yNڍЅHl/2; ]vE P"M&*,^*0^(ZN4ΟȭH jط1[4w@+G41ʇ+#<MRPah0EDDЉAVP@n[@ĖIidjǼAՄSSTudPyVhaO"O*-*AMxȊ.:6OZ@^ +F! 8ܸ]"ѳg?Bƭ6oxKp侇Gbxէm&|XI? / 1/ENMD1e%RR'Q HoC ?O`O" *4sҢܫ)[|T-\G)3&k>Txd^%г%B)DP?H c[!0Oz*<[QKρ _D" ELh!X%Z F X{2<1-?v|3a+0>s"Kg};+ 2XE2oi Y5"sSjNRyOd "nT"ˁwH-I!-}Y-BΣ[VgC;Oola I\1|۪ULt." O4n|OX|:(SƄGH]$ޠHK˸cfwZ'Op~G(m3EPo=:(2 NX;Eu_ASID6D~Zʈ iEnNwqGR@Hbs^cDc,>FělO WxVd/l>6ݤd3f@؋r_b_=uWȄzVRg1%Fh}rR 6UY5dpU=Tn>Rb.7tVHmk*8YFhfU ㊄zEh4BT5AG;{H97Eg8\ĉu +)tE8rdRWlcNgZ4c`4|MaɅc`l tc"0xQ@Tgnx`ڍ}qFr31W%XLmO<ȬB /9ӋU:']fU6ő $+PB}-qw+Mf wdb\'ODCDV=!JKY/41YF[UXf!ٯ0E'@ŒpcmlphB9oGNy5@YaT ރ=9Zdj෈Wy.Z$KZfF0dI3a0'*eZ<+a (JenggY~޳FXVKShoE &XFϦv a VGgx7;ZWe^\EHCbyVRUZdM1$(H @03y+n+2"ݸQrЭc?gD`,ލ*DDWNJAC;dpUupFi¤!\j30]-g jzoiQ@N鎦ml |׼7B޹@o}{M2qmy4R[ȁ=y_q+GT4ŷ`GA^JÁW&"!XLP/4eKC\o43y%}_2c*~GQDs 7Ut~,Y-h&f5MEC|\F8MK>|zt'Z D_K"zm!ZI;x9tqnVAdobq1h9^i-sϻ#Yⓘp w6tFsv3MC(d-=AU.9Lj` 2vŒf@ `s,ހG]74ݻJX܎NrX g[$r96qyo!4[j8`>,bM@v6f5wvd?V裀ӓ&EҫS#ܵo\=l@a'4cqZ 8𔝵 67-Gav`xTEsv%? gmЙuPN{5t b"brpk]᜘Mr~+M%R[hi4U: [H`G8G7x^Q爅8 PmY#pOmEGᎄL{KoI dP{z+IX0"RYv_بMfFI{FKD b*W 3owgeC)]DwH|VP"xSDkFZBPZ|85 =p3/M|bj[ l<'y1!"J Jm*T,ה3;S琮X YTV=i!} j6m?АXR*A s/25 tJj1ըNTefTbh 1 n0D˚*Yr#PDœYRzB{? db(ę5;Al3]{y̰h㘐$"Yb V \>F0‡Sмȏ}hXj=G@|雟W<7xSfV:낄hxʦIkj/bVA?)Rv1-ath-5T9{zۜ-[iSڍTW]WZ*`A8_dDƱ&8Y/b!a$KmLI,X̸XS `x=Kˈ*]4YGhDو.6ۚ\T5WTXGXkq0_ zjʀ)·K*_$:51m5K&46dc]l5yӢvniLzt2>qePcI()?l Hq!mM;aF~cS쓀24]`*O)}ڀ; 5'yB*fSE eO,VHL8/ơ>bs)|M\Q-8@doH“zyx,Nh7׷j- $Zdw x2 kޯn\ڙhi`)MN *Ą:2E,ĵj.-O }!wjLs𪍔D `>b94dnhcXwh@ ge{üq3wXn֦s h 3ZLl3j,{m}2>L|VT65fZn'57h~}eMAo֩ Sv Ȝ>V#2 X4IF(Uzt_7ړ](f &sQΡ: 佗°HUGڍTSTatvxr\$i ɩbˮgog_sSSF\SuU+zl..ˁU1M >p1R]:(?o|N_sє7ɫS/vF=!vhڍ (08*.8'0H<* 40'j\ *8i0Q4􀯨=HuZhjuXf@a~&"GU&/nB]b+^8H'558,g:ʩ$j+]t@yM.(?o|N_fd ( -oxOF3A*# @Z8P0^0۟du&7R"gEQ r~z©nM@MC94? ~{9ee!ihÛ(hG AݢPNBoleC2e+OxFw?_T"~}us T CHlk'* "ƜNh`*F 7 dF`6NPe>uBQ)&w.[€y)r h+{`hQCZ`ߡee9BQ-hPaohE -@H^vPm>&+rAAcK>0 w\xFnϫL XSCew{@Wdž]y658q00Oj}$ަ0t +*[pz!"#CvQiNғ^؏le3w&|*~EOW9AP νzO!c]6NWx#[!;LWV<EE vޭlA9gg[:2QƸ*,lj=I+'(й *ySF5+@hJRI5&ƫVQ,1LX`PnPpEɼ4S좃xZ nOZI{^>Qpe<6ЩX Z}e*j)T;]!LHy4EϽA Ć|TD{+Tt[ZJ@]4z(#jE܊4k UvщZCZ/.B&p܉5u9thTm2ͭ&g/EĎ2ֻ c YA[̄T5J쨍m{3ЩV| Às:jNBZnK`7D{"m> i*_k/! JoIoi9%pض8[`4C*eݛC wuB{wXKh@H63CAYPzLuvo;@EhD},[@\P4W z,t_S|fP,0 i<1T~J qis4ag9I$Kjyz(9 74]BE=Ó$GC81·Q0>Q4@ĒRu@ES}9~ja/_ "JBC``:EF٧pwbwM"z$]jv@ rBRȗ: VneƦl[@g7 Zt.'U-=>H,YE&Ld-wj)?h2FF^fMxÁ 8*Qh.43[AQubqrMӚKmg=Vbۛ`Ä_G6Ks .bb5Mr.*ҧ;&hA6uQfp4хyUJD}lPEZfYd6Z6o7 WeRݨ؆ZIieF<)1/-tVg2k{)Օ|'z@6Fr9Db?Leݎze+%XGgApecЩ!;ꬊ8` BE?3Ci~RŬ Jd@`hjlF646M_)& rBjk^\0g9;md?/%Smb8Qk'2-z:~=IU#ut<\miksog\tv8_nDہk: jiEPGo$Nʧ6=vH ;Bma>%5ͬ6u#msCv[/Cd̄:.>DSf<]duJ_i2395G U9ԑF@~GRH0̤ )[TjRUnK(k$f:=sR /7Iu3߉H4=~D-iI0]Ol?C[EQ ,cFȁ|"Qt9hce^H0'N6z35&VɎj/VL#9Zx ӂYrQPvyQ1>U[]`t1ln&%M\ha c= hD,A9 (aZ7OF>qӢtQӽ1u]ytΗ?ܫ2]oYe#e+EP:|Ao ؟ۀW[;@& pCPӵ!@;)a欚.f[v“W)䴻_T͂N .*:d>P#b phZ"FnX4|x   * fRdzYX]yjr%Q@5qąab1L%{n'{H/NJvi(=vAR T',"x!zZCw\ Ԗ[~':}<4g^PcYhAffpNB`!zwfY&{AJ#6|U[fG Q=FkF8<7 >fwV{1fuyr+zmn,{jўכAu|3c}K~ ,XjUUEw^m;Q*$ "pk)"8 ,tAYpFj)9kb$9wy|W6'y#ȅ% iRH8xCMx6/XR ԽPbC5` cbS86ѳ3T3#<6l41 <#}cDEiD\jmcoJAG}&) tcs=-5ɕhLaD@ nKoqFgEʩHIC~H=I6L_TE\At61lz2 U\8<_p͇S@dlIe5A[Gv&%D/ʌX&HNZE:_؎S|(5F "5 y6zSH+ !UG4!@10C#M7iq"C/o2Y+"(輜\3ee+v}CI6b+kiN94-ȳ(Vnڇ@-Dx6kP ۬#'fr0^Oq'?ѵawP͢jTF,8tVc3bNCij"ˇY!ZδvA׎\a˹5Eahv*7nrpS1TPq\2ȥ' ƿbtNGI}hHTBj}J+?s4 6#\?Z +y\"q2i5:Դ`l0|6>)U)66cm_7|ūeEwa3\by}Z0%{J]s= kI.,ߖ[lU7zA(3Dٜ<w&q f|&jKr S蚧iz>lɳ VһqJPB1r#@D)-"?bvA,CnN_(VS~xXp˃giUg@d;H`1[u1Ö>–PZp6*<SںĖFM,T,_۰İGv(HvD&*hbSoҍr0Zn 1V><-xXTSXYQbVOVMc"KJh-R jħp^< "$Epk=aͨ}QHCtm8} QxϧE/ J+#L&:AJhvYxcVb{u,fx<-9N4h9@*)5f[M7VHZ3F.ǵچTjt;yU&jvG%yL7T{ݽ9\2UͧC7fcz?9<&Il>m ݓV-b|!ĀGl1Mm\_Ͼjr%XW}Hbzy7ܖ!kzx[q D26 /'/'`]/{yNLq;0?H1L*t?L\M"x5ĈSm'tfkۃvyԃRvNբZaކ4\u(3Dm"+AnͰ>,H/\UZнf:mNM0x8q)mlR4 TV+~*-:&ϴAKck"ڌQfhZ4-x*͠L6J'%;"0dTt0Ͳ>ahjgePN8pֱcjPSg=9|k,ȉmhN)h_uz3GAȢؗ`|ZY;:=Bb}yB1ΞMWR2\DPߑtӶň&p+:4BDJ)b6<X\0`{=1 [n.k0{KeƚhXn%I9}SN^3U]ے4u2K-a$le'Q1|k씣"]DI}e*JEea6 hqO=kqp ۠ܢ}8M~jO/hQacvpv^/Jm$T4K vǵ}:cUҿ d-ÿ뼞ÕgHJZӇ31hz7$h.:ҿ>I-ء|ƑZR\0fBL28As#+zR@/SX*#ڷX^\+_IY=KaPǥ& eHpx<:"%6GC(QXXfT(>EuCGۓCDƃ whI.!ŮwG,a qme v\MTBLF̓Dlǜ4fX U} Z&ƒg:GѼRI1l7GIR/K;'j>O.~YjCJ#i4`@EQ "sV?}Z&0C[HvL]n]7JPn"; <ݡȫf{gF -^PE0RWu!OC Wլs jLS.A+hL!" ;*yˉ7̭(.Mzz~mΎUm0+OhPLc .kwbMpS%7#ŷڏ X2# @ ucU6iLPl}[k 2>{28<8ͮE^s`ax9)IML845zܭU' 90Xi"D? Qɇ"XDت 1q׬VQר.>4i9/pJǀ ub;&Bkv ] 2^T7? 6$֮ w@iAٖwyR#fpqL}d64xM^3Ϳ] VSD;" MiH[m":u8T>'r"eEnHL֙ɸJM8 rr&qDH#v.~è)^87Jƒ7Uevi,zΈ.' h:VKE&!XSHg s&vh@Ȇjj}!4cB؃Ӛ*P wGn2יA؏Y]MmU.:;[PYzܦ$dY.]k2C_ ?AvJM,M3V uJEX yd^aplehqĪ L!۔BWmN>"^m_F |GV-1Z!JN(M{?g&]4:ܓ̎ Lr"@e= xD 9_q)& /N6(3yin#XG[O]g%m C;8?Ͱ\u#OE#"6 nӒѴ=ZҿUmaNsc0rTʔ!P9ÐJӜY/3*s#Fk쨵O8&V"q֔V>k갎lL&X4X|;٥QDFAsED{ ճ+ lF?hpJT=жd.>H_5{v?JyDjl~I=92Q׋q;Ķp*h; UmN^nMKt["RMh<]gn"X í~I=ln`|F ( ȵTOiX J^uٖ8W%h3x6K{ُa^/;g48b3]]ٞpVBJrG]aOaf?O2^)Zx|nߍÝ~9=cXQM5+ *ȹGzExs89ׂ?ȹ|p_N鉱utJPf mKZUr8?o`Vj=:@|ukVF={+kVQ2<YjDD>Q~/?gl4Bb2.p 7{gqevxNsdOgM+n-|G8qъ%  ~C\~bQqI &S<1WU?πv# JshGPHu+[eX~x_y6O]vqV枡TQۄsj'<,.19Y0[qMldy˯>gl@L}tsaFK4{̬8픀 *7fD<;# 4chqKO9Y)jkqJ=Ey-3/{*LժkK0ѷ)ₖ8 ̘J:`q^旟s7!8z,M|ϨYpE%+Sp!$'2wDDbm ݀JռQ̭~9=Gjk.' ] *^W=\F` md:ƭ5ֈ12)qgS=GaV?YH }lBo5$Fl8ȼš~)=LȰrΑq~pO !݉΀V`v8tCτT!^WsNu-؀Xo9b vG1+~Qp=$ k{ ]j\&ENi7z_kSԔ*j"qbI{<1M~.s<)fu3ISԴG펺N7d 7@y| =0OQ2g6Pc%"̠6Fp|hvL]RrosT?\P/'Zͪ(K紛^. KY:Вѷscy/?g/FCD;5+„C\ *xY*6笀j+8ڛqd5ng~9=TPMsnE+9nHݜ]4Ni=9աEu @Cq~gӻQ^TNqv{3V9 p-rod]h@t͐V(?K؋|2 +OIT©XoK2*7#g ɜMqབg#k-xlWT=cRV-eV7겁;c3=+At< ͎(CngZD+hJ-#2M7:&kTlpXХ~Qh&8/ʥ_~V)ތv5!1^eaSnzx6wHQ FspEN95Ա~*-]v;-3w^5d o`]Q㼀yY=g'eׅɰTGSkSi#0]uwM3dzԞs?~I=vOA5ܵ"IT-t. _)o(.@m"|Ta^¾Խp r̠Ԫ)=\sqAB\H" ]銞 5SJ|0xUs̤,6_rvB \FgBDp1_qaҡ^Q6xBd]"i܍Cnf,n& t^uF*l_ɳv@p:"٭&ۙ*Sa̬WԓA5iVl򃙶ɹ8 z׾̌cYtEѪ`A_x>Ϲguж„=nwco8dWkO9Y;y܉U:=nIbksMf![iQbGlh7M(/ 6^|NOUdRZ1 = ff-nږ}lkywlW>` ,A,#D{ QpGELsYgڀX<0/0^}R bjm`$CEODŽGڈ]Bq#ⶐa0 t7 í~I=dnDA/7.}`nwk!pN],rO8a^̽ڐϗb 5 {h Ӧb>iC ^_;2p~yx)=yNd kZTCi20{xFPbqEP+Î,ndls7ʋ9/>4eTpbL&ҷd9k;k̪VEVDcq v6̋9>dGߑ>#*eJ͖UiFGs31A]ihҴrՕ %~?32yzf)dKJfn=]EgC>:&[OHFӾu;(wxB b_}Rϩ1p@ʳm5w aG x:щ*=wp3}`)T|E9֫O9y3d%Z*lշEtn#@LEwq^"yjZDmWJ=Z=wz]0F3Z蛷q^h/?8FkK݃{i9e.w9Cݟ㹝/szNravcti+k^bnSD/#fkچ PTw?cKa^0_}RO6: &rVMWK?ZU޹bSYឝB3v6̫>h/>lvYK&=vܽsDvl*(Yq~I=G%}9N Ѥ˟nwK5{ږ$3Ւ0/tWsb37( uڪY;XvW!1+@8;*tf^raWsc&i=ݸşzWgXo+-OyaT ެ:]%p fO3ڨXky,b"C'^4 4\y}Y=dM*;fF"h**Jl8"fq@X= !줞s'$30d;#X[sl;&/K9my2A1Q54|/k n *Rں-xngP_|NI[e`dW$NhӔ G0>CuQUĘ;OUt4Z8/_~VI7JrϨϻ2D)Iz"Ԇ7)vJkdRt skwp{ zҌZFw;E93' b%= (C?]V2&1ц׈ngH}Y=*c8xgV#v(:iҦv*?l?NI6#:b:|YY U=4"pCnn,+{KO9NQ2oȟWa=hˤy%nŖj@-{4ifoܓyaq~Zå0yP7sb?͋J\gdH7]iOO1 I -mR df?W/3xL^ tŶQ4^lZG>$L)C yn~_QY6.hmS0iRl{2ZijIRk-ɜn!Ü_?\2*S֢8k7(ԅ.M?bWRqJ 4'),"i9TǧX"ɭ9cŖZzjv#5 >-/Kz7ɋ%qW|vcjcXrudAؼ].*BEh Ɠci$ '+o;IK-hhS=Һذz|0u1Ez5] 'Lͮ6E0^V[Y\0x^ASIb J(|A%>Ĩj$r%[w{ N]7n*~>{bWD `'V94!~\Тp'͉*T`}<+z4¯|(ꮡ~c)bkEC?N}>,VON!F-B"3  PMwQzbuaZT"hƦ(>\[& In.?x rı(HϺ@ΐK@;jgcS7JJl`qZMiT@~%$1[[VM 1MD7n=@Fw1\)!ɁO4" xdޣ&X0zcAirih4NTӢ|AH'%W:BX(<<7.bPqsJڽE]Cy<:EJ!$n?>.V@+P VKǓ~=\0H1Jr7}qINݑvB MxstZVT7+gb*X\JsՅ<- Pc1nbt-qb3X_>R9cW\ v7R2Dh1wr0K(/ޙ!?D^/]WltZnavit-0.5.0+dfsg.1/navit/xpm/country_GU.svgz000066400000000000000000000125621264204753600206700ustar00rootroot00000000000000 (zHcountry_GU.svg[[ov}_TLPМ@Zm!hPt_ߵ73G*$8׽׾L^᷏.~w7 Tnsf?2-.a{x-ū_߽@njsw}8<^饾Zw~J~7eJ#sRʘh ]s]R "[_֟˲]>lWK60SYPaqi}}lSH/EJ޿{Y~s|nUK[~rfwU,~~ۿ$ٛ#~wY}\=@ǟ_z߽uu#ڽެkZ4!6A]R ov!]COׇT?@/GA˰]R~s񞝮~<odqqyUZq5մSքLEl~~"w8Y8}I˧쾼HzEca8m {}|F#,܏;2O~}o?q釷l!X9q0[~av_(fon~b ~RÂԅ߾/>2p\OTI U=xX>욥>B][?R+Ţn76҃2ׅa?|xC""]pNDD|s>re—ߥIVᣵI{ ?v,~@&0Y™eq:/cR]: otFYZ:E(i`|ɥ/\~yYӵ^ۼ)Y|~hF1L@NifJ$ v- }ǿ`8 K킆]@eR8 絠Ww_괏w}t#4a!T.ۗziuPQ_"ۜ~ˣ--FT>)}A1U~sR&3fV#Z0"VtA,YŐJG0wGOˤdv3/Nܘqݍ=)oo#y, 6_4GWVm2ڜ. XçsEذ冂TKoNl\ [o ;vKd؍+֠9ʶ,1WB%(m1|X\/&#WgQg`oH/Me+R*U0h#P iADK|>l ;v_-2}!Ah^Sch% hctfz3Pzҭf!ӝ^F|c̎P2A(ADgRZDn Va ʗx#B)4V &3qrX<Ԍz@^B% \L#z["RS_cĠ2zH:snsg3PZKo_dMu*Ŋ@S1(_A<)7\ *EJ4a!C;VBb {1YfPUalfEKd eһco ;j,\<EB&a>ST:]z ,` GGrJu=+ID dV'B x!sη P-x]}SdH1R[%|?) C!\TE0E&7cМϤA@JP5iO0%uG8r[X|W7l'4G&bZpC;VYDb'ǒe)hdOw -ߖbe.z%\,4.-R)5gbpenajNU_莟@]&:d*)URR vH4a'[B7U {pq9MgZ6}P,}d8˯G<0)18rIIYJrX12+;%)JIzZ2 j dg wLA͔t Ҷ$T/.ȉe)<4cޢjx,%/=ѧ!e]ј$6OHr(bk/ma1m2uB:TaP)3 O6kL iG-dbAexnR;H{'5l@6X[h!]gkQrѤQìĉm 9j"bO& )ږͪ.јcPqur(4JbXs`:fՂB#}qhy[=zhL @T8&rU͟i<1uslug+#ǩ6KL3ĤeFj7\s(CF.9! ک2G% (iEh=51A?!6rݰP!Fc8hNVgKG x= Ф|O8lڂ=Y(Ş!eaLuoEI,7#x`ܳlPXt6j 7Փp p' d%CFzEhGGހ$Jsw'g?ax<d`hJPCFj.;!@biw6C^SmY/RĻJY8Clr0rm8YZ췄11 Nt by謓S}5dL,Klnmhq[Ð)7U(LQ453+rҴ,9f[VЕ=lm1CyIm%=~ěz Ys{j*$8T!70V_ r;] .ߔ3)͠)Rƞ"nشXoZջUKɳb9W+zSZ,/1M<0)~f:@̃Wl@v?XF,is{4t2e\KTqVSzHQ ᐃ +BC1dž&#"Fi_,r\3oqfͫpmV B`%NvDeLuYY:BMjؘ\ڔGŒ(ױQ/"srv߱rYgKÈs3KU3iƽ BDBG (f])\}@#`C\r.HOIhŇ 7 V-~kP=0^y5C%zt8mfN9s0b}DϴCTCcDxlxXzOIF'Cg"Y;6'#̖;{׽jn(/4=NO «PʎQ&_ ƇLKryC u/TCQOp@>)ףx*"LsXm&bÂa|G5.]P&iqݎ:hmG)N!{ef<LV3"/Okv4'"WL`W"fAhß1 m-oy Kyf3,yk|ybj*7^4\mX0u}O1?ܭv4}D21f{,oyB[?c#=y)O+Dr.˜tE:BĢa 86*G-#ˑYc#={ff<Î' LQ\V#T;o#mAɬ +N(QK>kaGsw8f﹀yOL;"G #MG,8^ǀ%s7(7!he8uG"v=ﷄ.xð1_y-.5%zoPӓ =,-4Nջ/^~PAnavit-0.5.0+dfsg.1/navit/xpm/country_GW.svgz000066400000000000000000000006321264204753600206650ustar00rootroot00000000000000 (zHcountry_GW.svgN0 { \ԮI7:- q3 mFdJu=!tl485g;za+W0 Lme$Ç|7 hr6~.(Ӊu( !EӲ;O"ݦ죶i ]3N(Aoo!yѶweo|qP'UZ3<eŗ!yKuCk: !UL}ո3Bpֺye6t դcdm&ŃSH-VWGjEFB.bޖm`d_N3:B7¥Pm^b}.>s}8Ia&2ɳ1" lg!(eQg"DY./Z}„B.T4BzP sc΍-1)e ʨTC19DS'aX? UaV{rR 5Vce괲"V~*a+̓XCdӥ\c2D|KMi|v,Vk]8Rz-DQ{B d}v 1Lu5̴wDUw];&QQVbj>^zG)aGJ}azi4H"`+l,{djk\eUcjAMod$X&M+v=AsiMX3eaK4㕅2 \ӨV׶O]G=C+xHE f"pa.;05Uxe}jXfg{C &9bƜwby[Moɩy ϶}9[Z? ,3ϫ<amǑ?_}Dnavit-0.5.0+dfsg.1/navit/xpm/country_HK.svgz000066400000000000000000000014261264204753600206540ustar00rootroot00000000000000(zHcountry_HK.svgT]4}G? 慕6Ό=JDhAlTB9nyLr!z>x,0n _֛)0U?5zaٱnaG闺K}ˤ]/yv6O-B9h؄D@װb:&\/,Zp}pDΰ2N3^޲qX)X f BpD&g:Ɗlg%Z٠ґ#$8 M@A2ኊ9X \|dP۠'>bMu*_K &D<3+X;D ,HlY`N^ئ=&DMnmo5󭞤|{E -o+CFRdtAYvNWpփȠ] 0=PI@\ dYst+AXxZBCԑaprU ٠n@F~)Bvŀ^!(.8 Aeq^s ˕JYxbvb(&ˤP{s o|K(7-\gu4m;J@wc+OEOKOl6N|}0tӦjX>dIM nfmo~z:z&Lf|y:J˶'1kCOj'gOGAɋv1q݁ F!v8s/NO*0k!}1C~^Cx `4,orqCмy4T^Q`H#͘CqfUqqBCګSJAE2oQg0,7}4`[[FM!hWd,BBjYBzq yp*X&,TI"PҀ~CʼA 0P}u5LRiFphw=7yI^bQJ7 sm]Y7bM"aF QhLUG0mFuukj}֫⍛BG.u>20 T'(`!.ʵHtI#)k*@+Tc.E脩`&f&Ȱ=DF8o {ўze:RDje(e:&Vs)Xmkb)ʰV<q% M;FuJ u((1(g2N[6*FјBPgn5ʖLJnOP;[ ȜpTN9pʟ Ihpnavit-0.5.0+dfsg.1/navit/xpm/country_HR.svgz000066400000000000000000000332571264204753600206720ustar00rootroot00000000000000'zHcountry_HR.svg]YoW~ϯ(/ F*}Ql7=h;/,KS@R~|߹Ud[SA"Sw=_^L/r2=<ѕ:Գ|<]=<_?r5~x2Wlpz'M1|םƋռHϕ97 -Ζg᫳~Wq_W:dzMx5̞\<ސmaMn1g]=^?/;ы zngL. cNWΟzêZlUe< 2/'5@lG0w0-%4[ޭ~_Yirvh+5xpSj Y[h<]{xހaSL`v==Nzo+Ao.::FpZlxͷ ϒLuk{Qńag2Y,`{.~xG0L3kMnW5 ¾JA_ __m|Qý׍G7v:j2'9w~ ͻ}Y?Z?= 'Xt8Ì5WSѿ''% /Q vɚa}xZLVyY/.~nnf/.{iK5OYGŅ>so$`S /:ѴH x,׋ Hegl!wCwW -_Lʠ[f>+F \U9S<|9/AFRZT@ &avn ME/8Ct=y  ֘<ϖ>Qz`vy ]SVI6b`6y]h%m6oJUa'3Yl7ǖ;[Ӡh+x}㰯$xw3F?_[?]^\pCWzs@[]C{^Bk5YՓ;lYvbfMӺ:ͧץw##GuЬaϬ>>8W|O~Iwqq~}Xs*uQ+auYw}x 'fW3ӝ-'o mn_} Qǚ:pq7/l>Wb6]p5E;ԋ.\by=W?kn (w.A JFA}:} q=Inrߴ _>Mb8[2~x"N 陪Gm WlWߨ*e>Ug% b쩯Ro{$2č7 >FU'wjTN.>:*& lPJ^|F~'?]@rV.wȺ)9'ؔʃhZcDS41W>fd1jgƔ+͜je0dg2bAtu3) N`R.VhmLƈ xg|܋{2 KKqHPJ`ir*,:T[%221UA̎QKqTuh r"V*'@Me+cQRK28fezw]؇0"` 5S ❋=ڮ8=MI#_C!PVـB,2$M 7`CI:yg)V*FBFhplU7 H&:{O.e BŨ}$(TDDr-tFȨh'D>Q f"FJDpU $?P4$ Y@q1ǁPQ$vQߏ> IAD35=4MQ슫`Ò+ѧ mŽRtC f.D{d4 !Kh`)0v`N Anٍ uj0cfH8UQ$c~ lz j8{XE= .1 BL FvzeYbO%{Bc(k w`Bӄ kB)QzL fbsbi{c 6ɞ=FЖp Lh{t2kd|h0wp;uCy4.w06b{Y˝H$})ovxfE@!!7`CC;a\,l-蚎6ֽHNч5]&u>Ҭ":C-3={ZcRwʣ*u^cy[tU(8 شăyk|a !mTÊbKbF?"`q f9dtcKV ,99oP(€bXh4a`ar  @(ˠ$T*Ӹ>;QM6ك/3g:)Az%p l*:pi (BUYbTS{h~s 2.ttz0"rnTUA"b 0AvHzu3A`Yl;F`qn}0-k E|'&8/ 0gdșnrwupa Cq04E$oHp\kMĶA02f_MI$ rg95%I΍$ڼdt٧&w9[V G Q4 OӒ'Ȉ]j!o"R!)Lk41~A)W3lhR#'e&# .' X1V0[&D à/k^IOtS5c6 `tɽ "1vT}Tೂjvٗk4IavOzdRȱ0ٶ9\QRu]O4j%VIA{9XބF^w>Q! (%( _,hcR)U\ʙrrTrӦ;a:|Y!`ZRqQY-o';c{o|P.]zv6:DccX?c?Uϸ@@, @, UcXc > @Zzp,o @@O2c~?a@  ~zC 1}oGyu Hd -o+~^Lٜ Q@WkŇAdn |RdwuC1K ; 'N^b.}_D#&Kf[%\Ix;YX}&-!DDDDD?; ΂t|gJJJJJJu%"Yp_wDiD΂΂|%"; w Еw% ; w|W"QF֙sI>$h$%yR('f|`Ia'"LpBh0% VC>QPlY>JSLYS޲l*#1O}?>Yvuuys!/dy '"?%9C?)0HRA4G唄lGdXN$brɒyU8yj/(ZAaf`6Ux50y@ůx+aEDH9rEDDJ[1%\H!Rg|kGx /:IB^rR ­15f*ǜ MSVn{taFv 6,hcߢRdX=X$b#'7X brA.w"H|#s 1/p^N$_苬w6ߩa%"HRJ2"p'/*R*dA[:/CJZ*V$,HRy"䆈'bTݨ,rF^@EV%!Kpm@=VKr/@KcX^j)_6UYS˒.8_uWcǑ\8׈L~+#~2 }VwHJ[-UKd'"(&Z E8oYsA[;lEv})4/aP_Q 8CC3u qTeph1 D+%7iI }n!`֢xp*Qڌʻ+N,?tugy-5]=aԵ֗hk+2ԔT^Փ2|<{9"K_RI/&9C7ϝkm=b2+h8&'Dn{Ӟ'm6tɗTԀ5 ֜Ts=hГOOzzZ6 pd3 8 0-cݚ>?O( Ұ<=}$~Oν_a.31S#>%-aG1 ,208.gWpdd8pĢ1M1=& "o+iU>/ܰ l\=>ld2̴)v>gFѽ~dʯK߲a7oM[NbtDtF:qh6ϘtcCPJ$(}IPT#\9D]Bm,PP|~q;OmP;C1jFwe+w9ogDu͐_ѭ^}vx,V*pۜ4ZP׵b)&-B5^ ,QFbsF%h8縧!Be#!OC5}{n^~FI/ѧh jzLC n6Bo>kPRJBq$-u,z)V/o_Ѫw*5.&N /-TBX&vZ}v/>j ڒѱ a!ayz>;v4JE? m6v>|aqm֯.aWDcQ9DPe\Q8-]&T Sp*PPE!"/a4l&]XQ oO=W4zv+ 55ȳ3n(ݭsn&h#ߍA]D.Qɧ6J"ʹK,}0m,V`uP-Xno[~J/N:mtoFh'ލ=PY `"fR@.U9PxZ=SxcsO4ZW)+j:<&Qt7k?ލ,\@*\Y! ݜqTfԴ5 <q٪C M\_1Pَ_3#Kf?óEAqOOq0pG^9p Sp؅h`CK &LCfQ\x:6H3( F7LHC6ؼk`)b˒џU/I48,TQ1JeV*Ɂ!8? F3f+Uz%Po,M &u8g:)gpW94.DVV J2hP )Ñ1MW|hf[e8NSIꥍ/b;lb2cKVb=eQ.&<)Âl*1H-3s+`祓-dQ`Eէpd"vOGt$.y S>#P9-1qxc}_`w`;E.?6Cfw1A ϹgXQCy Oei=H`C!b,+Mr\V=r0JaS<Oa =NveI|$S!+)0+㳟()/ӂ&y_O 瘒Pdwr fGA"x+g8Ek :#M 9 $ٽX6㈓xh;@K\sڲqi+7n{#ii0L!bCC̵s`P0qa<&_wHM^Jc$:D(/3Jr,RL,Y=r֋cMWBfpN8\rʟڠ"Oד<hToƮ {PMH?%E3O 빠Dpn 2* | [ѼKjw`FiVl8OcoT+׻MK2⬹pP5 XǡBl{PmN1Fw$d=Ϭ+けXfQپ8$y/ǘP [4ރ'bih>JVVuE@F$ Pտt/OKvDpJT Lɱg~/Fbj:_iVUHe0t^b3`{_R2)֕%04|պ|N #e]QxMk( s{F͑Z(\hMuɗ(~VugopYg!Ba <kMc3mtu3 0RU"ͤTH|: N߅S6 k~Qq<? ?ӧ_>o?}뿟Qw'U{= pJ\YT " ETڀ%i}PTP)TEЁj,d^o\xa8mٚ'FSB3Ӂ./%3˩ԝ=b/DOr1ǖ^*4\j ]kT,(cI^J d3hI9WO]}s Aaa&r%mVƟ .̯9J?1SW|5ET5^وeIq:x2q!XULh1E9"lMpvb+hM R:'ܟ5v0 Jv1lZKp~hUEHb¤5ZOWcXӢ]sa߮#>wōt|otۇ 4 /+Z&JD#2dըw~F2ԵSPYU Zf?~DVNxg9'^> tDJh$c0X+BC0`eou%|nh{V'qL%+B 00Gb.Ge3~',W¼laR#`saޓtx[* &ѣa# Kbcn0mmJܠ0,U9 ^@hf5f:=bwc4!}Ir#&ՖL80ԨyN;3ƔdFe6U=A'dN!#\^`&?nVn쓜yc=T#4iỹ%SbZDٷ\pQxvυ~Q&_|v6wr@`"W5NJl82/%lR6hkWY'a &qF0^H{iK~-1"#|Dу#pMӍ>b0U44Qs%@B"J=Re! lKMĭn6lg#ɲネRT*U/~S.=ijdK7K0'Zj`+9_3Iͻ}iu\fÂ<]>)5J$MϒaaptHe ζPҘye\ 4ߺ U &]#k T6fyP1-amJr'֜#6P/wS\!p"imvna3oQ(a GZ!P–tLJ(PpD#LGE &;qc[ݤx3 }|A^Q9J޴˩H7 |Y)1 6"E>1(CHAѨm 7eyqw(ˀnK,Xz!'rNS"!OVu1%xK}B*NaSCX ¶CyBU) |[?Y%&=;T:DDʶ@}}UJiv.|y &oYD̽oM b7iA#- T`\>,yRTI(`ݏ(s )Dd_]oŮ}u|l옺ԍ!TT5 gy 'XOH~ FCySoa2A}V2S[nc#M+m9 ? ? l4D78A5*R YLӧRwT%8ú] MB 2Yet:ǐA)ho{fOboL͎/lמ2a+hVs$]wox0]~v'Kd=(o9~!G]\Ҹy^U| ­tpoNȿiUy'EqĜ5.Twd&;yT]P /jސ>-#7./l4N_qmVT=ٱ+Az>h<ޅϟ4 -"블z ev $RtYj>Lbo'ǘi՜aa1:)ܫk]c7EW l)IO -~*'MծUh,Bl$:q.>r2,U>(l^|V? C ݸS{"` $Kw$І2n̸7{>L6(*XgK9n&P1o+|R(L"6l"6 =w~/h֜F 1ټ"mDZ@TL =Rfp^e*b`0;gMeGd;bY$(8n]Cs}CkOE;~ ^C3NE_W<|)&xL;卍H)otRo4YSj֣V̼T8@)]i8ȫ)[ߊM%U;%u*RPwx%q*"g&K҇ ѾF{)M-rkmP *'$T{@LB6vp"!  "wA#0`~6&4[C#֊-NȯȈ_|ݟϿO7?777wo??|O}7/׿_~ͿӧOBOo^kƣ)K|]_?c|f 7߄OS S|曷owo_iŹ˝_R_?I qz[ň͞@FQhYXUwB wOo_~_Ij ?~爛~ßӟ~x?~w?]~_?|/?w__L7J,DOE6m!m*k#:;\ZEBE-%˜Q'DZ]10÷?FhnsN5|rb{?|$~w_z,P ç[S>Ƨ)٫??}eq6IؑZ;ob+קGV;6ŔK _atjjҩ%mU>0|KeJ!BJӲ>oSK osOSyK[ 6|l{)(Ũ J…)2hx/WDOHA*ڂZP "ѱ~\+%SAqpq'U\xoha؎ӯjؗ˧,Զ)L.[4:rjN"[u=As ho5 ")\aP~FPb]ěA?/ i1^bkE>\<ۮ? e- BYz{d^۾'`(MEU u8ޮg_QݔJ'GRE$ 9g_Qv%]T4tEmU֡j58,MZ_c`򹷊 SCXdl&!ҞGzCUN<Ш Z3[g7.VڜDV)=ҭ[a'6(@u02MX*_'.Na~ ܅jC $ Mg}ǍsTfQf&puJк(OF?j((?wPL=o:*T拴6TVM ZtP-'G _z1 Rv-.^8鎫YWSu0ͽ^vP[v]Rgn h+)}3^r7u][҇)+kW?-4ocVÄUk;2w~= #}W2ENhhvW47=0X,,hR34Vh<.t_G54 v62m1֜Ջy/*^4jڷ#u]hw[ hުx;W0 m_AQ@A.\nh ܨfIa_.Ԡ ]i 7Lz_)sV?-^Eݵ׌s~%r++G3k3R>\Lgc1fU*ۑ>by/^, <)\敻 7Eb);ԩe*ޭ՛N{[S _Md)_,Y÷,).[Er$_~/F3%;֭MƇ%I2I)b.M~Qs{=4Y({7c kܱn-xRd ;VJK)M>W~-)?-+cߚNchm֕Cu-vׁ"k "G޺3':CQ$inzņM.^ż= m[me.+8м"B!bBR"Z+8[,iqQ|Q#Gu5'jpC8Y!F57>ZGԶ,!z*GK<6`Y7S9AيF-ka5,۵(t3c?Cb;Xe%yên8 =1ljȢXV!:%rnVetjt97 ꌶGS!L ʛ9\[Y=e{EC1b/^sW)VV^yv&+^3sksxyo5[UWi(d̾XPz$+eWu%<J}ც([]&5G6&WRO2ĚΖUW;Wg~H;]pTu6TUCBĖzxFa嫃f'XI#BvEҠBOZ -JR(?{h ;|U[;>uh]9 55. UޑNcvQ+mMw-.^ ukFVMt:s~Ҝ; V-7ߡBYnmϽa|1սw@^LY-Ô*X6@go-@eWT5v]Rao2URuitZLs_6fzzkjzSQ}(fYX_,󢠃EEƢz@7w$}k+ZZǪj/5!"<ͺM#dXsV/Wqxv9c-Z u[-P+ XvVL@Thwϔ)!A|;;@p~-+uwٚ2y+t6cb^.5T[3MuJׯ9Lvb̡|bQY¼iE(Vښzeӄ|Z0+?[}e)-Bׇ>^n.tf j(:Quu#rUYZHM(S%5,% Z%)i_jVu)4T'3YQ{CIېvfeVXrgVG ULiW`qs(Z<.=?0ՠ2drb[KkCZe! `/opK" i A~G.BjcS3hO7<(|ڜa\x EZǾ^l9Y:J4Vk%*doLINאB7zM'T/iW45l1Ȇv6 lϾ9\h{y{a!@ gtJү{$5pБ ֘.{MWshcZXtaC>eBZD%qu}(YڙDL/(duUqF]B.Uۅ68䛺 ߻JqwbǝlSl呿*JbE[&? P z9v^[{vd /Z0IcR/޺v}IaJ8-B} `ٶl:j$HݤTgSCո^g/gWRLgbXuZ\ETjѡ*Y _ K/(ns+t6.ƜUg a/bmڄ.bB#qu|JvN56(S}5l6ԷjжDWZKXnͤzkD.erR+HQh@=}znM©.=a ^/!#'+|Dog*w]0֕Jl,kJ,ti,=2hY5RY![BPՍX"萤 dy-2Wgk5cfpWgl2i'oU]äYCS z9c9\,ݢREe" Tyf~Q% ' 1%koE$Qx*G}ӒԽAXjj@wJƘ\WlޤʒjͺcbhfmҤ{Z .V*֧M eIQXQDNZ@6!VbB T,>V+0CQEWfeA- . X:mfYUjW*PABb^zZ :`*O/NsL0ftY#;;iS̴s-lL%ٓEVTH[ TJ|q7wQ?ޅ5k(ɀK , pѝ̬7z[Qp+VI=Y5U q1@1]<\(6vK:tR/gv,':A65. CᨏCvSM(F-hCv'#uv6mg2mխNN`ǷP( CvWMlt4){_b|S_ A|@{֕_0uQCshdfVM4ǁ2{f5/{S痦Hgp nmՁR3c8E}uZB4JjF L \%ŀSY-١Z8?>p7O+a))rBx@w,1t[sXZHf1Yp3H7W9b^;NS^ckf .vMxbfKj"c_0b$xM‰% d}ouaN݊m[2 ެO>ltuNbp`]ǟ"vBٶ`Go82råK4m}ǿ@"7W-}:Gy͵8k㝵}vou.m-JZ"8Q' 1o\ڙPP٧"SW-L[iaF>IgkFڂӸY^O0JMF2QANw4\6lsHgY6nX5j648hNdR[4["{l谟S:im-*.8-ۧZEgY w *7CsQxl7"%,6Լ":ߧN +V/! G>Qͱ+]Pg܀[b4 6=0XOwÄ6P'6,iN)D;,XF= m6,X ηo2l[0-|J|&skG{8"uxKosdn ϋؑjtK g7_-1hw4nѐ ւ{)~nW%Ձ] XPg;]B|[簝pkݵ].%syɵ =Ep%ķu0I!FYv6q4-Hh8۬7te9*2A얅zhZ <%(Znj6ULg- Տw6O IaCˬdU1ImtB9e m&TYf<-6H,Njgs{XBj oXx6U8HܺB]Fbcq~&#/zޠXmUȺ] Z4r46>e`@X}*#P16 7g:_+dMЁS|{::PDlLhe57n}蛕[RȚځ؝Q }]|7꺇ΒKdN=#qߌO3j=+D'E?`^%h)asneŬN{@or3e4%è*mE]ao < ŪV 2{8%wh8Ԇ^!u;sScz ]Y\5@ZiYLaA8ޢZ]W̝b2"D| Ze^n4 Apa:bn󓹇PjG/y؇5" +RSpԸt21" 'q_œ67- 7oze} E An_- C>piHi{k/"P|0AUDdX["ĉBxߦ Tx'm}O?Ί {nR{?waEG *W~h_6uv)Ձ:՗]puJX ø'({=ݹPtIF8ݲ,Un~QR$u\X ,M$Vͯ&7}l@uў f:EPN*"[DpBL/B'QH`Q9&Oa' ~swW?`w>;jC 䔺@p ye)Ptqvw'5u_^O0j/_xZ`=B w%pZrF} UB}2,LA +Yq[X݌4xQ|zk}r#^e" =Ki *RJhCf;̺$.Os., (n|^Ȱϔ[`C cQ_hh-ד|}5,JFcFVtkMPl}vk5DWG,&2dx/ToVy!Y]mFQ]hLYXNDwY[DKDF۴ ZN츋jhk ]k FW)(~6&W^mW!VrHkj$"ד?YpZi迠텂=!΃=䏸$IGyz$ /y{0u͖h *חy!˓,yE1ˇ&X(HVW}͢ys+?"ã̔@P~Z^mNX&Xp|bnLgZs([ V b]]ES@&<2^xϘi-DM|(s] Xp/Y̷ 5 q R8P| `A*azfT|J^.XLWi=xU6n& OL?e' +Y/FVi_Jҏa w^Õ4l -XIaYnS2k+Zł9-J͢7p7Zik ]׏[:l [poXь1s:d.aYg^PP</l&qз8b!GhPV'ƀr L"OlE6!R1#03O#7v(P#Vz_P.qͷE}|6zv( j_S:M)=MSxU{Jg/|ߦX,}կVmWj~7/իa`W o[`Ֆ%BY<[O7 N{*ƋطeknopV;v5`dkKK"͢^*WwPw'rmrv!l="fN'=Ci[չ_fR9Q- ^{:쓺{zw'L.Y4˵MxbYi iEIўfi\`槭Wv 4ejDCrh׏6sZa27 Q&E\۔h4ûF5ev8lBPGB a1 y^[.n!`rxb꽊ǑWvoW~jP0Uۏy\M`2\y"jB xhEOo^ð{ כLrm"#(Hxo̓ 2s#e1߈+u/ Ñ&v [B7˖Xy&z4HBFѭ>N) Ff#pN}9Zoϟ3O,lG:M\j}TTߘRvtĮ rmqF2Ɇ\~[~whGÓDUj4w{^L +&0%b'>*fHcfrdF1$*&{,O*dtSy]1)j^-q$Tsb&Wn10Z%b=[o]LvfDnOb6aw1~w/UР_Q pH;"qG;m:y{WLIѸ ɆmQ1Ԟ96DfAUo۔?ES/Fc6vWkhGNM\9ls?1mT&CoбL6"d_؟iHӗGOT7X?.Q2GzW| uu6eK4|l>d2>Ȉ:[Ψ3~e \g2Ugׅ8IE (![:ODփa6P}9#RX!h!@'_vӗp,t'eXZ'Wy9-FdSK=r^oov7ЂĢm#kNv^߳on/ؚ I$25p̣BYqa;mi"pBo[ 0.㽍5A?.:yh&̭BF.\t 7z@c(=E1~Nż8pX>!PrxJ'&)z{B|"* ,TA*y7dD %SE|Eɶ Ò `d|`JZdp{L&!}m!qªʩ@5SdֈDxj k+Jǧ'6^&s a | tA{Ef5>w(#dY2~5^wBs|3NW3} o׆id[|A!ʄG=,Y47-K%挴hd;}07ѡ*U*&L74[xJ}U&X:"6U>E7q%_c;;WlOw' >DB_% Z\d {b&kſ4_Qg~Pg =38dOi^J~z n Ae~~id[?6?.ڙE)cv6@S(hcDYϞ7m$Au9NU=gy rP)0?[ъCt?|4ĥh+!ѽze^QOԫ x 8_3H˘j!-N tio3e;^W-y'A _ke%*[A!='r^D@{LFZk,#L@% 2 ;QG@@.%x޷l͏_PlA3f`fg/1!c^WbjAjA[1x-ǰ,N.%x^_k_0T æh)hz urΕ4&^vN.9wK NͮA bufbu.f4M4~K]B@H;SovmKݫBqNX>@@-ï. BHib7) ;-IZܥ|TjAk_)fK@2ՂՂ3&?F58K]B@( y[vŖF 9%XYuЇͯ>B*1,`] DT [%.~ ^!}!^-(Z RhX#ρd *h sz 0-iH:'wɹ_W(gtfIpPDN,E|vu84fq@sN.s/Px6H6gv.KY,)a]]@J K@%P?XBl^sN.@J-6B@q&61xk_Ђt(&懢Ze-n,f_##5qFq.=1ѡ޸K]B@a&ov ]),"ٟrfl&udPÓEcҜ;(6@@mϠ[P\/ڂ eAqL _; Zl &=#.9wK lm ٮa9HтB ނvDfSjAPD ЂhA|`+Է{u="Iv1L}uuޮDycw=H!{$ح~<8wh.}^!6i!-{›].C^d\^SSva1.\jlx@ g[4gb,9cK d|ӂ=nt^JeN vLTv<.dvJd ،b&3%O}E:K* * V6 *;z1Y"ȢfʢEOH/f1__!$c>+),'_(0羚`Й)!_ҁv&0K)BL2f+d-x&xiv[ۅ'M,ӂi=;̹X~I8uHq}UC־y}hx*m>wVJȣ H&O ?9x}ȺEozN:ӚNzu&wzH8d!Y=C.b6G7Ccʅ^C--No .ɉ''~Xc}f kb]{ȪQN?zZO2jdЭJ3S5,>jg6H1_ijONs]luNVT p˜,K.'ӶKRU^Tg$PIYxH<!tIf#[Nc}Hx)nMLu)zFv@GhD^Y6HķHv ?L$? tꐵl'DzUCW@ӚTȳ<|ǼvDZ|X64 Bu3]!"ob5^$?fr(Q *DmK"^xu5UHے$ictnOgvzOKJUwGbi')|Ec(|XR$qcu]3?TW5zJ=QC3_|!l}*"7[yO C!\otV?mb00PkUHTކX 7?l5}m.@ͫW5>:kz T0+0!,DY!,5\xq]< Q" }Hxv*Zvllٱ4)G T+Fba$5^Ј'~ث_sH"{UNZA'1Ow2JzaKsc*@eD]YBZspj!r]j>=C>95 Tcog0Nu0)_$ÓTm@S9%+պln{'\Vۡ5$8VC$1=&3;S5,ކ L糰 6"/)fF(R]p:PÙ6gjU!SԞÝa}a]aƩ'LOz}n$gD|LsQ&pHy>kP<U#9^C<%4(XCJMO\n_T̕ %'66JAS-'6Ü4r}mZO| 1 *W06'v#aq":T:Ԡ5 fqCuMoPC P:ȧD{zrl(AkPyr=$̊5f:T؝{39Ӑ@IgD˓y֢ 4Tc64{I3KXSi;j!TsgwpܻXC ؠ6sSPy_qiv;hSE P+rGS~yG2BTG%VG"ZVgf38Id? _+5ڜ["p4تeVv!z۶'IUd-ϡgCϥ6ۓf Xь)ѺZp l}J@ZyJ8?^KF@gh|bIVLx_D&EtQ?ic>5Z mO蓠9bk!'s+ #|ؠƳ`69yJt54XtZ""@ɘYSOV X4%@b:C\OW!ENsgqJAgAqP6M?UbƳ}!\Z QBjpr=%3yFZigApݎP1O_Di' ?>OE,sט@Kʠ>Nti5t7[ i mݥ)? xv "vS1? vcv-^5Y8@K HO;Γ abDS? p^HÚmඕ6@Sdתbd`wf=Ğ8 kG)i=]d!mcfxq=pF7o-~8ŷlv! P P=-P6KK(예~H8=lMvX|8)gkZ{Fci~ʖJ,@\-Iէl`n+v4-XYbf+)<{E+w JѠ}(Nu3FZe͓)9{qZe(@  gJ< x g vڧ3E+ڡNl8[1aCOXlX#̔Oli0mĂȺ5~H4uBX|{&{"7qʓ`6̾CIN.nGݱ˰udIx!%ʼw_;8G?@ 7#3w)?\_3N> H6y+PQ&Ŵì%#뤀v, nd\ Gfi!¶^qi\Y.Fg?9LșH;Wռ s1] v>-MAp~a2yミvC#\nF-f&8Sv}EN\_Sii;kOHT-顦}~Ҟk̽a}s@.-B/?9(UqoG\u@1rq7tvJ|~e޻/΅Ӟ#ڹ`fuf8Sv}A(C=HPjGz4}t<]` i tHvNxtR;NpE:>NG>JK!YVZ=+"ͺ]+sTGeGP엷O1}NS }п>)Ry_}"JҌˌJ:!w-,D/BjkÿR|:>}bçW-Ӎ?=I2am9is̥d HrܻLqIµ_%YOO : *v|uUyWCK|bɘix$!g.`&%١v~IR2*qI<.rT$9Gf1d\f󰓤d'VVFlŦcd\qWHpZʽKlFd'Nΐs4\e¥˥*k$ \崓+dԏ:Ph7/㴔[G v5F^d=RޟQե\dc]/mե0*sZq++$tYPu|THNe`]3q($ZXqUk%Sa| R'ـ |v QXHNi>t,8 4{f;:*M+grNVa?{?Gm6fԋЌAܺ88AUX\2uٸunP :Jr<([.WO5jqڨ$$IP3[F!qUg(4I9pU yaYtΌJN~H [WF!UIf.֑QIDINZuc8{l$dY$ldS|*=l]d3$|i:-*i$Nbx8brs#P9\ ᭍Z{0ƒ ὃbNCgTCr[.A1][;D"|HIi#G21VwPA-E%RjB"yHxU vj cbŜ#^9x!wLT2vhJ:28&f, 5Jx})C;%*cADwH҄8Vµ2FԦ/7ش Jra@v'2Qy6`{5GE2 kz djt{O@u oNpMHY?%O iv'"^>N{;u]bТ!\UVWx8Iz29p:$w 7aWmdxSjD \ Cէ?uwh׌SƇ.xE+*iQzo.N:&%ntOIu h#Ķ8qr(5Q+[bK|##\[&LbƼ"ׂ}H0&C?yCzUu7z20W,bJl*(L$Zu|cS)rž)KV>9U‘xH9lHT!#JGyy};}W\ 9gi'p&V]b(K@Kp媿8ʉ BqEQyE˗rEڑ^W“W$tOb%uMHkM(RIQ_ 0cH*̖1PqOAd(oYg@nJ ʀԧ: b@xQ3N05Nj(Nj!BAM~ևPUz~aD7ܛIfDc`NpZ쁶c˜9=ˀHl+y0Ƒz ye`~C[.U+j9OCR5MQgy:Qmd:b|t?e 'P}qt :ڶ}w(9Ϡ$oMЇۼD0 am,O!'._RkiK{td諳nObe<)3vR~=|390?o6Őw.?jbd ȓTJxdt7i\"-oSVRg1_Qa&uk-I_Ouwc;ko T|gM^"Km庾I?6 <wvS>w7Ǧ/:`7NlQm}`e+`G,}^v740i/P;`OQt4h;es]h~P^Xe;*/n/ByՍM{a7zq}ҞYܑ:G͔{f>]'L@폹a&i<xE@wV4nzHDCt60O C $~ : |KkbMR!A86!ṕOrЂ|ܧ{!xl!3BAĆQh~=#$r \g\3h@PqLtA% pߙ .5֮eCm<4`O.pݓs>%MkDoyL eAC%=4k~jSxqd,MTxx9x* i]} P+IsD8Lৄ|6i) \hc)|H*qN8 'P?[9g%@C.fC(1.OT5@g!IsN |^ S] OReKil)zB;$_ƳIDoƫvPɤ p[aj! 0FGx4[JO٤٢@s3 a z (u}vm:r89Ǐv'*0&ZblODd}xHA`$*M7r1ĤÃ`o"=K&xb?6ًTDXw iC-WI+ {6H7/PAmSl` jv\y~MS`f>~aJoC6Zx  s~lh/7ĀvtU0Sϝ=|-U[ltFgٞEE04KSϝ;>k we}֯W,`.h7R|@ckbx@Ul>:ϝ~{O Fr_|̯}>ً ̻mi<_1)$ۭ3/D ,Mv;}DS5Dkނ^m!hD~ c# h1\l!A631.u=#GW':1Q@eX |C 2KnWfuw=@C{$!x$ߋjݬEge SFnsߑzA]xI G o:<}^XO{yQހu\=ݜwi%U:ĊΪHE큯c*s&;HPypf HA6⇩zH 锜+?Tpc=¡l=>LOa#Ծ Q`ɏ~5ɀz? -N ߦ.p_&R0$uکwff^{؟fջ=[b˿nBѼIAخqSTֽS leZ0@&K& RD.w*lOk2'q߆OL'Di !z)F:-8 mP4BjgeP|+pRiCd՗YV$ )QL&Ò˖;#W0Y1KX.9i )aKF=ov\$wmJFnrP.[Ī;BdP~$Z  )I!AݝN2f'`iA5%v./gaҾdہպ$r$(m"迗 *4+AUiA.ˤPyhPZsG,$I$g'[ Yp?="mE R]ycJZVjc@o&:5VU[1}elF j&Åf=YA.N^`?ۃ KM31} utp8>d)?fwЂ4"+J=keup7qKß=\vu`˅MZ(s~ rU'Y0hGFuC/94g>2aYu̶3SDOl5K.EƘR`1(,6ˑV0/pǥһCuIH-p\} =chc+߆zЬؾf6g:߆{м3ih,! Pf4YNh-=3(mkr\/0`} t14xgۈ[ s}?6mTZsf4uzizXcӋp ٣sE؃i?Œò}5ӱEoGN4LU9N>HJ7--YDƅPYCAl1yxţv*N$FwSb`4ĶVepIsh\bp#VX;6mk%kĶaF?;AFl֋<ФBmwmyxQ7& ]< 3 |',3uU]dlw:H݌=W_yb$'K:wK}K)u2"eo-˪olڎp1Q~Gr^"<iM@eɼ ԛSIlomd7}0SpXh̐_iχ@0܇2}G'W JJ,q؉ci%hEKS 6Us70y4aXrE\)ug>qe3q#40̥Ӟ;t`Qk8`'6R chuaC/U;ۺ>sw\g#cCӮN8û= ?cȄ } !|Cޛ}B$5wZ┸*36r943RMPTvCR(641uz<\4 aF3i59`Rk>6Vͷ7POqLm<2k_':[POq~A]XL_ ->I`AAi_aAA=9^U  "O28.>XmW~XmHٻ~v}W~XmPFF"t6/>XmW~XmlWφY3Hy8Su\Fs_mċu6EZ>h#;t<"Oewg]ks=1&GGEL&it/:!,~ $TJJO@6JXYF]M Ӵ7oWQ^]IXO1z p$$'Lh%VNİ%! ozxP~u*yOV6΄OODM gķQ'Vrv[{?m+yJl>FXqU%^C}nU%^־VaQU onu:+P]G8%tCs9J~hZr!j0k>,R<'ra5M2!Rp3O؆Nķ0Vk>>TCxlW}`SP^B|uTXr pH|NgДv.%ķ'^38bHW ̘^%@pel<8g B#YͫMop~Jm \īR,R.2X1[ɣ7xZ?5 荠Y`x/q|xɇTih`U%n?&ݔh5=n]uԂ*'gb5)^`}a{][x6$TrA d~۹RSNķ[>4U_.!&%Į۶ !%!9`Q4 Io[jP0XķfX-\gXR4-Aؘ374NQH=rrhNKj{z0B> $k 5eӖw\,7'}uwݣw.4"e0дԯi]i{5 Iʁ>I%Ű4v }:U>I%  /tpef`邇 ^}Ȯb sj]s6@p9\"9Ol#JCs5w$z^ ÅaݧhnvhJnN@T#K12[]",͉nq#ݧf셅ez6dEl/Cg64"q#ݧ@l@8\}BJ0+B+2OQY5R.lƪ^Q55R., d@i@٧F6 ť<>elzc*kS]变V/P̦9tqjcBy:X7t,UPMsupmbAkyҝƣk=ԣ/dt_fg^#5t؁>!Ş.gXbFTF5.X|uwM$V[PVm ;Nu݅kBWuE֩j}s]R^qUz3t5W P?[ 떲uDK.2h>T5kPjx)eom k +uI/DáG4lGDLjp$`?9]PKaTȟփS2hޒtUzoztwѐVMvK >H4=0P“$4]j]N$ AsQ4C S*փ iXI13E[ֽĬFe.ֽ,U؂5WN_}T[~P Yq|[}jsYyT u/^/i**ጛnI ːX**xEgAbŵ 2v:[ 2c]#cmi,ЈLj#Q'n4J1)~ 7 nGx)utF3.>u1#AԁvS d(\U|oax2-ŚޠH9TP=u)|L9m0u-Z#M/~ *1J1i>E4p1h 0sw sB*Nе8J/9qnwc9&w1/C&#o|&-,P<4Naݗvyւ3aE5ǧ+;1i:=}F7qvuR'JYG4+1߶[,nHGN&4{L7x7G;03 6@ r]t?V2N][Rlw荌J`T]2*&x_rd-?g\eY'ss"q]uR~{xcsWhHЏR<<ꂫcw:>ߨ`0aW%Dq27|~iemuV Ӡ:/i5M5 T\D=Y j,ơ`_77S&>߱\JHoC$-r:dj No[~ٱ haeTSyΌKXF=| #̚Ƿ<'Q=-2A)7:sa>,3 i!@Za9& q"d٪aHDlh~M܏qP4|PC}C.;;W}l"0O[o?:d-ES$s.P\`ŨԵcuFe~//׿? v _anavit-0.5.0+dfsg.1/navit/xpm/country_HU.svgz000066400000000000000000000003451264204753600206650ustar00rootroot00000000000000(zHcountry_HU.svg=0wE=gi0ꀃkk蠉w旣Bgvha@ ].u`[3@kWF @ b=/v%ε";c\&ikL !;aI.J'c1~In(@ucL[QZՀ*tBK?. XU>"dƣi_nM`Ehnavit-0.5.0+dfsg.1/navit/xpm/country_ID.svgz000066400000000000000000000002701264204753600206420ustar00rootroot00000000000000(zHcountry_ID.svg}M 0kJkw@PA"Mhq9|ٱU.zBJL'K~Bh'@nWa,L )2Kh^ !x^Kvk&"r#S9(n~ 7HW(navit-0.5.0+dfsg.1/navit/xpm/country_IE.svgz000066400000000000000000000003341264204753600206440ustar00rootroot00000000000000(zHcountry_IE.svg 6cԘE=A=@liLzVA"o?8X'.qӔ⦲2~90A[ ()EP\7\`BHMm#pF ANHK h mR6gODt稴.Ƅ,9?\7o3RoE=W=lgtӛbIunavit-0.5.0+dfsg.1/navit/xpm/country_IL.svgz000066400000000000000000000017251264204753600206600ustar00rootroot00000000000000(zHcountry_IL.svgUQo6~ϯr/N`Ilrf@-еn#-aYHڊU'1lh;>*8m3˺Xo %oo.W>s(ۻϟ@(c=<XȢr@Jk(j6lGEA󦔙04r09K7ʩE5fw1n7AOFfܢD\ |+jh* ΉuHd{#zcJo l63 V˰c[*ﱲ]Ⱦi΃Fڢ\$ /_VA&j'ܿ3J=3a0+mRM_!\<5v9'8 NݨX`+|A2Ab>,dcFل%l4&]v'a<Og,M!6lBS:M&i:2$W$9Aj+J4Cww'@5<99ص *|!\l[htRZRWĹ23^̂t|}UNl+s``]%hc{-i%[Ş2C.<P.ʪ}cU;ҕ(ٔ+U+{368^dofi>*$k'}W@Qs[ksa,K0F)94he}doɜnavit-0.5.0+dfsg.1/navit/xpm/country_IM.svgz000066400000000000000000000167341264204753600206670ustar00rootroot00000000000000(zHcountry_IM.svg]rGv}hc^4a!5P8 Ma/z& HU^R Vnvf-y{OUˇ_f7˗{vj&ӫ/vP&_Ë98NśXr|f>:<|tލNOirp_^a2ėӗw7ӫׇgb~hpv7ջәμ9{rR{MC;ɇW:c!~y]XN?y~zr=ulq߿;gl0.s_ͯONg)~:˽g7/x_Y`E?p~rs_fOgW{i'?t2χoof8P;Ww~ه뫛Y;я]L fx_oޝL?lۓc8Ϫqcηlqrv8ႶsHL9n~Hㄓށ {._A^ޞ,={zFQWNj&/>^n۫͠ꝝ=My]hw+ⰿMQKF?gߝ͠NwrO?]}WWo) q_?٦!!iH&ߟ_]?tºl>1ג'f,5m?\|ݬ)$52s@N.=^^o/fvh?nƯC->^Hq̎g(gZw& tdyZϳGzw{ɼFJɯoymK NpEN] O],zrs7 ƅ oIF1=m.Ӝ0#@ܲ3W@ طM 3ut'6%p t9V$ YSX+8Vm$ay`=pNS!h,(P.S@"CN_pLhP-@sl9{DNmgkd ..v@E ~*gl\BiR 6*Z]~ T; ^tYe$#Kӡ~9@cLSti#&MWD7N Ư1L)n+ v/ %aMjWp)Oq~lehu~j"n+h,w UIarqptO bbuK>ʬlڹ0% I!7e7;k;E~reS+X/lyP ߶uc&*Sd vIkgp}@Ie|DG`l #8!!n3zHW( ii7!*)Pm}S_S!l (g&!lWh. H@4Pn:&9:b% 1@U -$/1 dcbk`l8m~HU7N)O)a50_J#BZmc 676Rbn66zɿ #nC=L#jL,IԼw^g N тFee4@[ 1ar]d,k9"u!2a#`0DW#$@HUx+bݺ=`i@x7#BUNx#LBfz'X<^f/:yK#̛MAMYX캼INMkx[[D{z@9Oچ+Ts D栣 H3T8E9r1H"C $ MF0\)R9k  5W1i$i0;hܯ z/Z YwqrGv,Ce 1>ˍ5ޗP3'Ax[H1H@!nQT_.zƷ +l%{Vme$rgӂRVhI Wڌ- wfP#zF 'p- h#JG!LZh{)>r (f]`T q;iKH%fPlaIk2Ok|ڮUvK6rewS:2e2Ntq'5Rk,PBo|irT^,5gFǖ÷2!mݭF(3@ti9*h',E`z`:0٤^/]U0VS`002$"EHOJf& *࿁¥VJHV/J yJCVb@{ Z&z)W%yιŻ#ut+!Fj.b {,)lL17>L[:/դ`KёFf`M! jeVQ "+πeתG0d"F-kW2X R6ڙnFVm +?^tNK3g}jic$&Ɋ|NoiJM1lVJY)H0~9"ei &2uR;V5t Zgvl_[o¶LU82L,Y}SN?ŵ+ŃnTR:T魈r'.5A]+RpU ֡ՎTjuĮ蔺Y* @kn.Ä÷Y+R>ك&8R5nex`_j2lYQoOA?XS9jTOG+cB\HPH[Uǽ:bi~jAKkM캧X;-еuNYaJhWtkU-(b༊1]u2arcPwHFϟBJR- E Ӯy?EVجM-JU t9u]<=uKkwɯjL#h9-mX1jCϭ~hkJJ݊T.jyjrFe<\a(M1ggڊOΧZ.٧M*tx*FX@h؊t 6yJ XV[5X9]]hT# $"BQ+,4:jF~/-AFa@竪2d`QWAm0>$YjV tO"% u_9w>n.mܞɧ: d5VEӓtە_sNVr>t$j F;֌r|N߱x[Kqfw,7ы1&j(.cJ-6#ͿK)X~S̢mqDĴS.~#3o'w7r1LZ'Yk` 8QΝcY"KKXUNb>nHv!w7%g-`]j[*еd LXalJ.QtҖ66g-_ݟ"vs  uiyLjTد,lG6#m=|g@[#m3ć|z3]yڇH|l._~xWL+8ٞ)A}ƀwp#<-{(4#\m=\>}@_{zF8g{j: #I6(#Ycu=0`IŌpݛ HW3nˍp.Sp{Š>]krit+-k+__sXҥ9SCֱ8:|(:Cxt#UZl?Zjmè[ w+J+d:k+{KS.(jB x[]w{(Px_ =}Jj""U皶&ٙj+ºzKZq,jm5vw+./g'G?[]*A%Vely#4oмhަXAg r'qv2srssF_u :$>B3pju;χP&o}n; nݖ= dtP<ݶx5nA!8g{9(a[0G`!4F=&2(m% |Pm#.Hg.&"2Pe,hێuN2bF,ۈe,s.еvwӄ8rjWq}uH60X)5++&hGʩV%&VIP9 \ 31< /p^ :g *{zkz㩲0&_dD"ct>q s@i'v!-vF!1ػ.m+kE&V ~.r%0Ӈ* l@V4\@nt%Rq$bB3KM GSNhĀٜarEEf}tYyϽsASz է+pϋ원Uc=3)@0a~0חo>A,O!rK߽5]{֭/]aU҉;´v7 rx3}s8؇뫛dz{4Ry>1a W7?| 0Dڱw5xihȑr{nw񱒧6m׆/_~l0o)o~,?I&oT~dW>?By^dHDX0$y|d|d^eïqWV*1u=͐%7FfL|$OMI 7J_DmX2|7;|"^8$I= ZD< Ck? ҀVp_ZfiQ{J{l rH*_ej 9~?0F<S5qˆom#m|yn{'6~D=>V VhhhGڈ^{ڃ~Qf{h{C0Ftۓ!AnOIHoö`و{j҈tܽ͐Ȍhj s#znsEwHFdވ{ȼ[E}Zjb"XU皺&ٙz+º{B6{옳 ȷ@x]{%_{7|#ToP7Bz~b%X˽ǖH%wg/}|ގ|dp׊ٖ=$n|͏0w< s? q=#aF!4b42}n&ȷ; ߞ @nOd.ض6b c26Be{vvc#,J^Qm mSo iu Dг,][Af)75t-iSD+JhCR˞w;@$PgAi ֧%AUK'Ǩ6}^n׾?lrk{XqYh1T]kU(:5J|zNqZsX}|U&Vq##<h~ta2`QEE1%6#sD`…lhtBvD(v"uD~5'i(Y a/5]4Y! 92 fc3Gʰnd$@G[c'Ʒuv?AyP2lfC^ذFӔ3?r͚/(/;Mo gldKJgS4rM"NAh6 flvЭ%  7G4숆}bhػ S/>{QH.QWڳ> e0~.#F6NztYgI߃5F:VIQ0r`ȫ#-B AW1B<okJz NWUԚq"pY;HTWD3^Ldf6ӫgW6I-ᖅIcmoA3f;pL +_< u(__¡ߢn<~Dc Cv l2yx!(@i VNC+Mn%X# ``|^$,EQb4 f9dE[>&hOĆY[ ae$AL/f3U }nxF&7 "=ٯ%3g88ϳlD0B] H*Pi=#~KYqKJ_E G)E(U\$p@H茈?pSB-/16gd\QyQY#]V |n_nhnavit-0.5.0+dfsg.1/navit/xpm/country_IN.svgz000066400000000000000000000065341264204753600206650ustar00rootroot00000000000000(zHcountry_IN.svgߎTM"v.{1RH.y0 Čl>#ѫpCwW_O/7_n?zypuO_^}ڮNwo>{󧛗W>_/͛woNoܜgϾ}>_?SVӉm?=+GSO &v_?ܾpW,N=}y|իn~۷yzw>ۏjmf;ulO{/ISӵRZO'ОVNUTCr=% Sfu+ﱤ7$]=i}vXu4{BΌfS{̌vHMհ*wݤ܆4oŊqjzl̀"}Tk2/ICRPEV^Ȑ$[)XxMKŧܺ!K1gA-uMWUMmJJ߷SY5IjLϽ0 7N{C4vbFN#Ȉf[I-]uD6O688Fd<̧ۖOҖ1NV'֤N'bZR"l]i(gb$%'<""aA% NRex8R(d2JF.!˜-a(F9DL#(HRa"Ո:2j",Àq!xn h ӻ"LUG@RDdJA0[lY6z^L8a\F#|zMJ 5fX}nJ\1tnRh]2 }#~ikbA ˌk춰)A3V?ph`x #j  v<  }δ*wՉS[Bq8}6 V1]ECJ{8ޏPpq8!%xFc.w`K.`l'ͥ=қji^fYkn(BĦ=R*9 $ ѹ{7%|/1\ n9vG w9p2œ8[y8 Ӝ89\0M[cKp`ku}Vkm~ʱ($ת^ t*~kKj,BoH]eu~'[, ֻwC?E ߮G7x68~e%navit-0.5.0+dfsg.1/navit/xpm/country_IO.svgz000066400000000000000000000315741264204753600206700ustar00rootroot00000000000000'zHcountry_IO.svg]k"G__vt:ߏY%k֮-@MkZ@ÿF#4=j6DEEdFFE󿼿Y ޖ|B r͗Wß~vvMey5\y/d[7)O7ŻwM#-xLn^5 rs9^'ޭj}}1^\n7CVU.7NNQs={}Cy+%cB1i7r5J۾v|QP'_M&I:ZOa]DjN/^m_RZQ/lzo募T:nA3A=A5A|fجL-Mbp={rea3NQHs</k=ny^ݖu^Z̯4jYgU\f{jA, NsM f.淓6pgyA^N?Vuyh [;?0dvAyKFש7hΪ&hl7L-U2p[~-fNvX| ;#/ry!!-dNm1Y^ߑ岚Q~.u8@?4n5asYޮWiE{=o?plo خ݄_P7靵'WjVL};N^4 H9Q بi\$5ET6 z) 3xZ9Q*#eMa~`b(TNڞH jzYziUǷwEtP4ZgMsU:h\t`P*uv<` /xKh:Zkm;NP]KhQ otwZ RJ$/uUJdU(ELg$SQQ(#12f;YZ))#Bh$-rئ5G\)+ rgRr5E{(m~3ч rCA3wO,R;3KjncX>vĘ\' {$嘍dǕe=,졚1Q ؓeaMr{@'[ߌ=S+ۃϐƞl<&W[\Yؓg.߀gLY ؓ-oI6 ,1 BR_.#C.qZࣈɠOu5y`dȲ&O|X1uTX'>Y -Bo1g,فgh|7OB8rG >QCB@1Y>BFg蓥? HXց,R$ !~@-Šo5!7 + 3+LJ: P+57ir1g{Pkraq3,-BYgʽNkd!5 ?~caopF|"U{0dxcAvR8Cȹ A6$XlWlҚ :RٔmLqm9dw4rЬٴ-w| mmcQ gӶڎ'쀴 6]^wBi/6>Z# bI6C?e/a,J*b2@-+97g hb33-r oUsoTrE\{(^sAܟX}-rCA3P>m(_-7HD6D?|⏽$em wUR ms.@j"dYX3[I9[A'׀?+-roRd?5s'oN,7k V'u 9!J?,lZJa)㏦XsPZ'࠰s fͼls}sրf.y9c!@9"j\U`1Je)W4[̥Gb%`0wt"w<ͽ4sMGvXL<޽>p,7d(Hru.i<̀vEk;b-$FZ3{!_ǧC6K%TU|ֱSaXi cumV%χS٥RR7jwt6H%/~.߬WïF]w쬵8ihu8:CI=!FcEpU?0'վ(Get4GGLq['ߏ85"}c91aqA{s=[4UOK¸?f O,Wwێ߫f-ǚAU P b$t?GCY o$Շ,=$<8wꎊо܋ƍ<1$3 IJH$J0{jlURJSĉM(:'H䎺wVOM'l]kZ.m6A>Ev=})a2퐫 >jhߵyV[|N DceŊdA)R65iƉ?trw%wpx,_ǬTp/a9pvfLv(r9]P Y'-632&}R0 J_h#=|{6sC K8H~3Q e{M -g͛z=S( iVxҊK֙wyzЍR-/wsԄ.Cu~z]OM؀AE^iUuɃq4]EO~|{)L3{dM,i)u $͡u.}f$&Y}Y}$1<"Iԡ1*P'} -)q wckl'Վ؜İjPT{Ojje۩#:h3mbs$xpS hjΑ'==qu/>og{?xN|y>e!^Y+tr "RMzHİ|+SgMOBz Hױ'!x#zr F$\Iȹ$ݓsI7'!olOB%!޸'JB?H *? 1F("YtՅq,g!гBbBc!V,lbeBf!V,lbuBf!,l%~w~ YJDrxH7h[ ""1C{t 5>yY<+zy=98yS=98y3O8{^,t.N2-mXt%H!=<Ĺ|T|C!.<|{r6!g/{r6!g(;%}i//oE6Kh(Udh"vIkXp%ɷB.Rst4c{.ri(nt]͊#\JDd1*CEN+oōƧ[RyKG"l03nXchXӮPTm[󐦃4:GbZLaW79LD:GZlyCF{P j#O-x@="ݭ i7 %">D$VH :oT3Zu5#D:RmT#De GBD' B$LIȹ$$ӓsIrOB%!AKB= 9( ٻ> I-CHzfщ}( -%oa(/MHuz̋qd t-To;4^ ~j aV}[Ĥڐ[hUj5RsBLbǃU$9i* L;3U kur۵ehI^)M՛(+lwnFc"R|iL׍酳A?9%ET(bAY "kӓ%z8ELITB#S[6 \!PpU]uO9; *$X؃F'zrh4Hf:G9ё{dˉ#G iU@SVnn8Zۻ#>P1,^C/$28Z겶GwWfL%|:dFe&T+ÕY2F xH;R4xrw~q PWQ6*ףKXL2%`RUB@ڌF3I㵮B)zwz E|\=6l2BŞ8vcF-[6pYo258{2zc1aʥnO׫tN_}D"/f* = Oܜ/L,s,FiOɦ&8$<|d.pMG!BUD<=&`:/G40a Yt 7Z,[Il@ (>S %,L\<, W"se`1R쉪CߦeKY9f);;AT&=J vLL6&(6Q@6a4hhy#zv{dPдR+ʆq .>%|n/ۿ?T7b>7Z(%* &TVe>EV4XmV"ӈZQQ᥸Z%ʥJk.W2m}M򠛚ڟdk#^Nwꋲ`S$&:7LQe rH"-c㷬Cjj386:0U:to@Å[ٶHNi`*nnh[6 RЩeU.v,ZS%.:LLY u4;u HjU%]˦걋*/(+ӈo˵m-5m0q\S Ũ -F`\2x87UNf"` ˪1xpBͯ.%h+Y`>ގIO& -MŒb3]bwSؘw k8A pMћ "wr2lM-_~竗Ц旇m{ ztoFF]EipթEGanGG`},/ʹ|| <{~:g9tΦs6Ml:gW;#3Qt=$'I^ pG:\Y=՟(o05ai:{lzn oP}g7` TL }?-&D ?xǞ jWwkI@#354>Kڿ:d =" \P%@tvi!EQ$(ҁNR' 5aaU®Tgâ`J !F{|#Lp! N9x@ `v.e E_@q/Ew 5@ǦyK;G%ZBMsz$g%[;953<2r1c`,/F+B;*yOLć8oRDn^T?3yRfX^Y$01`'[$ Ő<(2/.|}0V*`<:T5FxDsHVʼnX -r˂E-貲`E 'UՙrtzZrtZR: ::ԍe`"!iɑp]*Be蘠<Xɧvb'ҫTLjbyNǮu,-N2lJӜѱp J_04!Փeэe)YhanPZ0hH .JkC:-~efdaEE1,COZ޵N2*n,|5ӢZ}eWZq‚e49xltۆFӪc[Wױ>͞V% l)uNvuQ|6Û+ٟWVEA00d_5%?|PVZo?'쩚G'c~:q.\s/]{.ő^|-ƜXpmK asNFbᐳ[W@ݑqs1'9Z .ye /!2%(7G-\VI:5cw$cuYCTCC'`[HW Wнĥvgi=ϒĠg bC$ K}2)WB )@v6fke Xeȼ/5n28Y_M{hhp07r:wŹBIҸ{΅{oGk6NEf~PNa~,^_#piK{\/_-E£9KЏk0.滹M̵ f&z|&wLTkh+bb+nLG֝"38A/\*8);K`oyO4gag\T7- : j+ P8~_?_A7konśfXx< Ңs, GBR=57:Lwwt\rލ9'8E&亁ҔޠI{tz™}ӤF[)X!ASHp$7帑?H0'4GW-_b Abzհ!U_lA%K;՟jl9Q2~y(\&N1Ps]&䅜U8owp11k30J!p2s#4bFg*xH^(2ݏK&bkX@V5d3$sjdOf"(C=LߢI3p9nOy`VnRFkHG(W "$lo= ơ~\0 'fĥ_fWjJ1=/eouN Hq'-c5:d0xkk JqI,Tr KGMDMutyӢoQ~ϋzy$BW K_YJ!ciBퟃ6A8^e 8y#z֗ q0ྜྷty,䩌ĠT<䌏r*8/2FpKQN~(@xD6֞{J-vE:ꋑŒZu쀏顅@<m6Q/c|eiȷ0cR0D(>e.GzQ[k0IRT( Ŵ[S2̑m5FoI2L>/*fC}>{!' /S f:< oV5 <.L>ioUx K[&|ߑ/૶;,&7~ 43~d;=w/o q 蝎{:n+u: ;w]6J2&wx>|Ծ_w<7 ϼ]ww/Sլs g_Os~[u./(K;߹sN][/Rs{W%sۻ7/an^2듻3 c/D$ N}ڻi/\yKg˘ɖےwW(~K#,= Ϛ(ϛ}b?{=F i_U 2!.ӄׂ 鷄ND5DD8! =B:M%="RN&5!݄[BG 'ЃKgKR_2[XK敧w~4+]A#xKˉv=JNv=moMd8=jn,IjAi0N>}wG?~W,\"i /(~PݺP,J9Kd~nj! nE&Kiڜ\v[GګgȼCo1xù2G"!\-M?(fП91<$33U(3p#T{~lB:\joeX)!eބ } Yy\B9)==\3gm)0I(V+UBL9 L,w=,qxON@}L0+st3>>bCmO Px4Uz&Lb\ULLJ"Vj G'*N n启rW1ve[*u?-7aɘuokv8w Ɖ[p&_$R $h [`X& _wsld_&ġwM.2f,Zp'_+h ٫cĠO4 5U [8=7cL]>ʼn[8"S8Rf{zfSGDq}39 .lz)Oߍ#t۩rst1kqѫIٍ~DޤA Y<bJPKr d{ 6Dq0lc'V/(Xm=TasbIfGNbDr-I$+;fd[`-={~WD;i_}NwTbbmŏd-6.[bvv4bWP5XmJSؤ!I+dAקΡAz\]QG'T̐r)-GYL#';&eN^9 yu)K6]$ldLpQK2.w{\qNtR"0;ۢ:ǯw]?s}s!Uy4Q5q[6}r#AR=glVW\`kyMct>ZqLCz(5U "oa>RQr,fȜ=STPل=ۤj8 )LiS!ZeLK6h0?sb*YWl}c(ffa4xCsz5V0c'G3ƻ{JzzڵM}e!G_lR(uM+ 򩯵Y`_A'+:xvtg|>Hvglj) eiٽlb'H{z\6aaƍ՞ QiG Ba'.CM\/ +0|uw}8eK5Tvh~.I;˗<1:0(Y7Ȓغ o.;OOy2󖂤˟ w; !R|$)&홐}mRM~ d+êH}m;.^/؆EJ.p6tS nX) ʢDޤ")Y%skqZOύTۅ-V+{ކ; P'N6\/!eXBCiVcA6ON ;=q(;~[1s >1Vi$2Jca@q$0>sci8 ;N ;˸cYgˎw˺#T>1 sr$8~0N8$/#eo8"55SN'sP:L8d9~0N2X's|x/~rTƉڢnavit-0.5.0+dfsg.1/navit/xpm/country_IQ.svgz000066400000000000000000000046221264204753600206640ustar00rootroot00000000000000(zHcountry_IQ.svgWkoF\K ԼFEM4.mk*Ev~3eNY;q|~}YMd)&Yr}u6uE|z~u;4a\jV&u)Jg);4m\LFN3W =-WLhwYVƳf<~^/g٤Ngϒ8:&]9Nonn]6S%~>+ [ADaxx Rn1-8 Nlj~|9ɀz{k]Jմ^uRN^(zڪNg ..>1N*U@ޭm~3ߟ:H#飳ci!SJe~L> ͼN"Q2ZNwdž4oZO7A >]= "KA&0[ܖVBR\c[”{|)"ӫtZ>`\1,!,Z~,9&%L6X(Uʀh)DW 2z?z_p_'WFT!<1WB ㆲb⡁w[YDM*}-2=^\@ظk uSpDagR*]`}08%a!Ċ-N9j kv0` mFjG"?Z@ L C*kf'`ΒtIh ㄥXJL^|'@y'Fyғ .4zE E_cKϚ|q>)wh{ʤ_#2؏5ºT*3MSl#qJb :r\LdCh*]xׂ >R{!U^"GebOeXhj 񱷚8BCwc"!eM&] 1ҳIU\_Ys_tnavit-0.5.0+dfsg.1/navit/xpm/country_IR.svgz000066400000000000000000000013211264204753600206560ustar00rootroot00000000000000(zHcountry_IR.svgKs0wتd 4L{H=eh 3@LOߕ?_вvW/9fӐ%OglW'W޾ }׏/P}ٸJ1II $Bygqq₂ċ$f!Iqb4+SJK._lз)3KlL}U)d\y>]? ,CRYh4(CakCqo@a7W3͌Zݢw0ƻ]b p;!ubj[hZNfcHGU|f<'NOcwq#jslq)g\"6  Y*JNQZ4.=j]b1Ps:d0{Z`?_X>ߜC*,Kd3Q,Rnbk"E0CpɔŔqR]ҕ3~jp:HR>jOmS;0(6_e5yxtG$Yjru/*CyŚ2jLx|ZF{U   ?zOtX0߬gBD{a8 CQ ֐~y2>x  [ȵBsśi0 navit-0.5.0+dfsg.1/navit/xpm/country_IS.svgz000066400000000000000000000005161264204753600206640ustar00rootroot00000000000000(zHcountry_IS.svg}Mk@dT B' |+F(md;߇#J}KnW4AIw6@8N,GT \fgv7QX: ~&2navit-0.5.0+dfsg.1/navit/xpm/country_JE.svgz000066400000000000000000000315011264204753600206450ustar00rootroot00000000000000(zHcountry_JE.svg}koGr K_{$~d"@@YRh_;d}˻?߽V_s]j=)9_2Ň__>U4^ڷC!'˾.?l_]5 G!Տ7~z}Jg_?.%WۜˬOSQE׷`տϜ [1|soÿۻQig|wnn~\8kJo~Ysoo>ۿX_/Eq~߼ U;3ZҞ*HT]䧭5:pL<՛׷n~?|w{w}s>5;tk/.n_ۧ^}O}ٰ>n'Ï~{#JT[J6)e^R>Z{yːz~T񵯢?{o짿<*2Ɛ?3a+LkZfi9V%s9l/ʉo/oft.>bu{'2\}gg~%uѓG;j㫗GP]dI|Ƿ(߾{hć*_zG}/w%7껛w_?Sy?x{};8[k@yg3U9m-q[8[alI4MxдWى]c&ۋݼpwWZe y%{ưnhssyUV⻻_z /@I]w̗(W/g h!r8=b?'~MVGPPVſ_<1i7Gou\|wu4X~V]yu/[.COqypLېkM3ݶSf֖a\ZgekyJ)~sb[F^e#y9r~n52Q !CȆ~ ʾ Tn6-_YN}ᇷ7ww7w^xJJ77)xܼ{wSܓ_s l' R_3 ;V|˜8.m tXE e ˱8}$[jh\'1ۂS`sjƲ(jO`Ȁ[l`巔=A)YOlL㲦8_>۶o=JFi%lA,fE3f+%MK `-<,)P$/ZmYsò۾1BqvD_B<\e708X{K@>~/Ŭ{O,"_ DEp.ƹRfHd ^XˑE|G 56F1s(GɪGG:C*c5Ghփ0X8 ;[.FT`{dV"7'KXE!+4Jpi Q3h~ɈC<FdLۖkb[W}ʬMU`8q`lT سEbXAAU02gzd#),cp 8H({Zg)FQK3VMj3`nDȍ0c5mQ RRGȤ"c85Dim] Cp(#n'#`n|-Xoc?VΈ6UK'6* `;z|ф'E=Vud2)Pٷ8q":9}vx/Ms8!8Qcl6Mb[UTRƲ: w`N0kHh)[ Зt6cEz1+K ;b r%[& ԠRB"r-:5ڼ\8* T"'¹l&ICI]h qǪRlnFR"8>Yp oRZ`ZLp#b,ۂ`^ $j3+ӱ)GK33I*a]u#J[w&8i*pUIg%p3ܛǫ(P'Ē۟.tw}/gP sI9)MnǨC@2CCU Y 21f;%c5@f̎mB#G@˻/n΁"}5UB1:;ĀmGw1^@*1bz@q>;X[΅(r^WCm[tDzT%9abNygdY\3ٜdij7mfܘj\0-A#B@yN {NT#H`R(=G`C0ēq$ ƹ>(֘R'@ @{Xұܶ)1Asj1%uY_աDی@"U&'{1WIZ0J]lBl GjKVIY(XwM9LY{h=?Y/҄T!%8mu~FXA9Jj٘ԝ`9)Z(U x?YRGJSZ$)EG-T3*{iD(dFij U/)EUl՜hqQ6\KgA2mJtW@Jv!mI\yTt2MZ)MQ$H?dHZn02/pq[3HDN6ϴk1Br&P=K$$(f<`H5{9l1|5*:X$w!}F Zax=ABЇ{dW_9.;rt0Gϝ$>ZrK`fj/4 #gi+Nsl @K7І1f.0 RKeinMϨ#õ#EVS1gi5:Y'*U wkW t hv>d&sRW˴cB%3FMթnb+RJ606`l SmQ'Vt"F^ 5h.G Cn)͵QG> dش ; 8 *2 RbBtZהTK:΀mƻKXZ.G3RwQf[$dP:Ra,`اݬ) ;W6/i|hǾ\ *6w`IR-qO hIbƦFǡ3k4 P'p u| tԄWR u:ڵ3ѣ*J0WE 2cD )fY:ELbB[)I:Mn0`d4;G?z\*I\ \>v~Fs9 SAA}+\m]䍄GQ}pXX؋dq ' MĒȤ\xA(dIdW$HR m ):AjabGaPXj!)D8a5^pPg@O5TG&*).ոiЧU#j"٭ Q,&:NA -ҙ#v]WS7| }䡏jOr#o6F7$ar.L%@Jq̘Q}\\޵Ĕ&zVtXL\k OʐSdC冹#tr1t$6'Ufʌ85 uqJA5 v,6oTПO$C划ha' rb rݒ3[p\gG3(=Ru9,Lay6cŒFy?9sNʍ%O@G]IȤZv$N6$AZ}! u7L0k7@ª{cB\dh;k(,^lK;DAbc 1wɅ5(Ѷ?c!Ԛ+ ZD}j;V W@Ӗ"Ŷ}:'K-koP\{ОV&~'Z&ɸb=S9,hJb=:eq۔KdFXP7$\ZrSZ݆9NJt:No& .c;\LtdHӘ;M RP(\~D 1t!q/ K 0IM-iKr mMiDmI[0Izv,Ddp=|)A@c꼔]SŤ.oA͙1ZS:ު$ >-{e\i#$_^e! zZ7`CB5j!},Ɗƻ[n&jTnW7ᙊ|K;~RНhT~Wt"ҡjc՗3Fp>r4dE ;k muhf)HY8sX"P{ܲWKRZ.. qP}IͶT wYG-t2dum8R|wpnUhPdֵbO8n{pi=8wn"hn28Մ(tøYv*a\FqSa{UߌɖEXe=ƅRgϽ}O:[ȝ<p3X $]8PCRg~mQ i֙!z467)^](DQA KiRܰ<~W>x{Z@|Q(4•ew`+Nr)nŽXwA2/0nv`pLԅG er<_ Eu`қduF(*q^Z\h\hV.4T3!V!lDj Kpr\״@ G;%m 0b&!vv{; .̑"$q$Ҥiߛu8Ħk(iqlF= 9(i12xnn|&gc5UܒKIJ G5 )@Hc,$$&).qMPHU`9JqgBQ (y ˜yݍ1JIl瘍~Su-nWc;v@*Q 氹*07+()-Z3hWO&s4y5r7O 'YY}'FTկQ g=&BED*BS-ܙҊ_^(lM;ISSJ.r<-6B]lYBS%~6\Qnp5q,O1OfF:xłv |6dQsڵ8eȢP鑇MV"qtڔY:ׯjȂmlkJ1tENDjȋ jU9-jRQ&ׄx5brؐn[ ϑ>༂j )dp,nM SDq"QWWv9Sw5i5vmi [u:  sg7KXDv.;\ nz=8`۠6 ~`m$4ǒOg Ba ?-y3ߕ. A8ss;5 ܬeMSvrE᥾BwNPM8,gYךd b%9㢝s$iRp {1m \Z˦ %d>&Ud8R|eJ4ܚy:nc] ڲ6|ڹ.pz(ѦR\_=c1ip o"!Hl붱7AT` bmESIquxI6!*,aS% CxQOuWXǜ3{DN u@B'gz&T寚,BlZ=eAJq_Q:32tM (FzJX쥯[񳻚ݯSp$8 ^͌2/]kNG;s ⫗o~XZBdAZϞ;. )&/iF]2He #,*]\ٓ@a7$eNĤG!~ne6{ٓd}@3= _:؏9xԕCw3v ӡPcy~oϞzwn::FhÑK qn}q>=5BFbs&W\x] 5g:\_Ir?oα~kFxTc-Evz٦ %@ c r#{dLru:ܩ9IVAb] FCo@1x(!:tt߇`7}%.,:ӛ1ta·⭅WZگv·;f6} _PÍL,!߱,0r_67TSY7ʳT8$Jb @FܡUwV p1d`LUߖ2v _w~r#d8M);6Pf9u3y>C0 "ve H *PaY!Ҹ;\4hOM8F ^j8kz0ΪZFm硺/5'O'OqS8m>06AX{ݣnqv#/5艻G>t`?!r0C_)\>N C(ǵo.Hq/ÿ=˛ԯ" 7ZNP0F^WY?z|Yh2d=[hYOl:d9ت|sG}7Nz_s{ZНx;5Jw3C48 FWϵvU*۬|Bi$ѨcQߧ'*j|ԩ9[wWx Ĥy"ܽUaAdqP/59XVd* <9&a;K; `ƀG:3b)>ni8h # Dcd^ 4'9ztM0:xP!!SgFL;"F2ˏtѫ(}ĵX2¬7ZJeq7Lʼn)+Šq̘03zAqT9\¤BӖOHE6xP ),"(#fԾWL?I~kc-)!(硉FU=2UmxiXxbr}:3Z& 歧bB\x82=F;%ߖKjm ʠmm=GE0_JŮGztfSxzgNf #⎸LPy_CB֭0 koKA=篅u2 ]Όv /YgBL=ӥGB@u{`mewqS9'_لG 50!BESgFӔo葫s#]ѧ cdՃު+}U<p/KUMvX$VD;?}Òeʸ_ Pks9o%=uzKa:"OV%XC'"41?ՙ1sN2M'>[G5;CC:@x1BV{t}{ŴE/2zebhz >xu#UCqG;wkxd5ٶ5AX6@<ƶFM~+q0b" V*f"3 j/ӾKgFK:Ɂi^NH"&Xb;}Fe|QOnq<)%tfSxaVs;F?'0퍪FRwuo8 xŹfFbo͌ASsQ8a: ־V^QΌrjLE73,4"|p &`YURV!&UHu)\a@AA KgF Ѿ+ 6,O!P"h ؉{\=ַSouĊrP\ΈTXL?Cm>SgF8Dj{N[JM5Z$q䈋L‹M;wVkϞ ^1b~#,%(vjS Bx=.:705a4oAhp7a=k.t;NcV8+4z,3Ng:vaFBr+\[}|p^bܒi*"k[t]΋Naϵ?*YO3ܙDQW_aay&PWã+'nZmфJ0Y [ܓSq{R\t<i)M`@nr,HB*|t.o&j= RnV]:3ZI)pZV0ߦ14voljLDtVc~^Np kSxԥ3eK,] ߩ&Ƥm-{3&.gxkPܥG:3JipZƚHDDo r-+"zOA )AÈCE'݃cLUh6كN1b$ K3> 6nᑧs#\X r$Dt!=`$9`כQ?jt^|.ƤwRnԹ "1.+LUW16Q؏rNPT#J(8m#\8~信?Rnavit-0.5.0+dfsg.1/navit/xpm/country_JM.svgz000066400000000000000000000004711264204753600206570ustar00rootroot00000000000000(zHcountry_JM.svg?o0gci\*& t$n7߾6nU{O ׭P xB)T)5b>f7ڮmgmZ1LJ(Ntt%D8(M0%梪 EvGubH@'gR7A / 2 =+N#o/~ {!%fy9Ҝ7\sϬv+ qЅ),)|ȼ8\?[Fw=M/~WBOaX] ڶCwlnavit-0.5.0+dfsg.1/navit/xpm/country_JO.svgz000066400000000000000000000013601264204753600206570ustar00rootroot00000000000000(zHcountry_JO.svgVmo0_a̗!5t& 4i4:Ca]R%޺$}eFs;9Н+c"IQ)$)C..EOY~]C[lߠ @AAyb:^{g@ϗEQ6{Gx)Ei5] 8udc,v,1%@W5;%(lֺbDC+-$Vsf/Mo_f0ɭ2U?H¸eo(٬=wXob2c+Zsy/ka렩zshWh};؏"{7w -2] rۿۚVVlr˭Jn=tD/^nO[+?ΑXiURZt㫍igz0DϢAj%_mPRuaw 5KT)"5j%LG~/(5[b#"vJIT05-Cf#JtW8Uچa˗SFT0lr#n|9T`jY$4{b(T=6)C[ `4 ӫ6L3m ~F4 navit-0.5.0+dfsg.1/navit/xpm/country_JP.svgz000066400000000000000000000004171264204753600206620ustar00rootroot00000000000000(zHcountry_JP.svguJ0!IW*Mk 8/C$,M79|OSNAQ sq=ʋ}l[=پ.75+Flv yy[<' 0x?#Pdqm4(0(TgeR-3%4!QJNT+{2#)tr+߾WZ3\` eD\DD|1(k'f-O&$Snavit-0.5.0+dfsg.1/navit/xpm/country_KE.svgz000066400000000000000000000012531264204753600206470ustar00rootroot00000000000000(zHcountry_KE.svgTMs03؊KXȝpaP8b{A6uge9IB/+Zv󋻛 nm˦N 2^6S-W_>6w>.ЗHI00e^t)s[Usŀ mJۜa^N1"x*cy$`#0_ud]*%d-!{<Q,"`ͤLi\͔q@>.Aol<ƴQ ,ƱqvePT<"?x~ݩE8zs [`dh\G=벪R_*[^A^0;m!=dסּA2g5kz ?_z笺y9s^*s|.xXބBuy~K.\@y\:s. ŇY.Hǃ-?weW{Hͧn9G[T1Cu<`8/Ԯoۖ~dx%{NMUĴ(3E⇜^qa i0Pط wwVoޑ'O :'-lnavit-0.5.0+dfsg.1/navit/xpm/country_KG.svgz000066400000000000000000000057671264204753600206670ustar00rootroot00000000000000(zHcountry_KG.svg\ioV_Q$zZ) :L;/DjdQίs͖ -0[=n'){&uOx&Q]v5c7e]|'|ћ"Klݭ"eܝfwww0j*cX}Eϖ0w[l¼bml[gZ >KW"U9.bȄ(Gtˇ+@t曬H Ft^f=A_-c&FH4e~7y~+oՏt;ZDpǟ l-&}D?Y~[4a>d@1Ir>)ڻMČ:Z.Ǹi\ //rLiV:@m-; %|D'eJMZ^%~zˇ]'mz:/7kZ4\o6?!Mlc2I/|rAw'P&_fDPPB4)/Lt"QB{zy+m^:{b}RLzi,MU̾jsdgHuZ텲7z^$wO '2_LW\,7jg+V &iLk5雳S'^]eW}O/! : WwD*XMĦё z cr[6vn5w- w9сE7F4qh&, JЫZ#FaOZF\%zN{ei=16jL:DhP D`d dЉTK7LӮLHapB?aG-8 PKi,(s& cx3VDR#ns &SӴ$b&60gVA0^ٯnzEJ p[AbxQOg?(BB>ƼtFs)#p-G%K )  S0KBJn@ZU!U܉WCŘaThK<=niݷP"PN n(1)[i a*vYbEX0UJXIl-& $RA%8qYT?+.i&:ICi48dʅʈ,(1(#`R"6x\> dP˵“U2+QUJ# -ʪ5^Vz\X$\B--`]VUU$oЫ*U͑Ǭw(MLۤATjμ6L3d= ,ᨮᠪREɢv ID>83BtVu\g@nqӘUQXP #;I I`kYpW0r&G%D(فGM0:;Px_] $:Dc0ĝ1*+F69lԍM{;o~Fd =̎d=Au0z|'r' HOHOHO-HO!Iz #G'Žd(?~'C#?O~"OiG~2H?AD 'Jd(?QyP?_(?ғD 'Zd =z'C艶#=FO@zbHO#Gz2=ғ' ]cC>i!}S}hؗ|C{=\OW wVI3J0Ͳ SpwաEQ P!G'qu%}.8rS4Oa t1{v(r݆3(;~ 'jj>QWA4Q ӽA4Hh[jY;ݸٗ/)ZWD"cЇ1uiJ=H;cZeཌྷ$No}EYY# dAR!3@Hָ3ݵ֏\Njr h蘄﷣g3VNYP6Qܙ7׋"eϱ0y9yIZFU5 ˲D;))iz0zbuwyybs2Z̖˗'Odţ˛˓ˋ:=MVz1Z旻v1z}{~vjl˳F˿F#|>{ynugg6d?|~Y-Vv٬JSdSJgƝ9wwo7wbK1 #7ļ[@Ӯ5[47Oiw4fK];]Ng-<_j~ފ1\_`d54ڡS#Di٫V>9˻i]˓qn|=L߾‰ic_vzņY>Izx7>iozzy9j/VS!tN-Aի=j T]^/VӛnݩwWEտu̎LS=f:_y'[.f^YoB쟟}xy`n`j黛5w~\r *lwe!_Ӂ@3״t>]Oⲅ@R=8~np{{s}u}TlsqyF@9<@9Ie mBh{[14{3 =H%_j$EꭜCCABK@zPJf{c^ { z+>IGB@SzZwfUS+>Usr]hTNPD}`#܍klX﨓KOda"_xN1 ̷Kquuf>kxNC&h@ 8a7Sqq66لv!YB La71xPrũbukdߛ1oLEA0D) (]) A\pH&Dv%ذ1T#D@ _p\W!D(BCCcO T)ƒ_ҽ(Ai]1K_QAk*Im&BF]0{XOU‘/Qq"#"2h]RwĂX/"C l ǖ1݋pU|R HpQX݈%>S؈/tQaHOUVB\>rI7R`~*|BUdr r ȱmL&dF:C7yG|PE>̬0h $S41^8Yc Hlp*tL#ҁ1Q+G4LS˹KP@%1}wR}񃿰]uT:%Gv(QA h{ѐ Иh{*aZ;{EapAه^xAYmE+U|%:D!fH~#oC`'B3?F29Tي^[='%E/5g"}^Of ?=c!>[|$ֹzMj *z LQQ<p/#bы,!PE?l.*qn\ЃKP%GJr(&rn Y̦ޭ%˫{+:[|zfZM?,o[n!dɎc: -z+GG%d>>4 L5Sl%'7yI3Qj>N< X+hR9PnF͡>*`%^ow! Q@NÇZ7b@=@ r'd{h!p9n-W7=mGJ'kK6Ιƥ ohl,dqO1Ҁ #PA􊈐6Nycqp9cÂtQo2et֭}\~"G9oS" ɕO6ww`y?y4$@ ѕBRàt:>#akNZNgD9( Lz108%)'$nD!߁;b<%6'${ǓěaF"7a'{a^|0fR n@l#Ag|nz[?^ݥn/8$1v&՚F}P$.~ 87DL&`ɂCZ rmb/ Fae`yw P" Ia0b$LM(|NBJ7!H%8>"͐tfYڰӾAA#HA!L|}d>T!3*uNj" jR0Xt;;;;<my8m>q1sbpBesNt6ՇQq+|1{uR:dT٨<'D<"s|lh ³}^>q8r>g1b┇ECIa|v a|.Y|~a[7f䎶wc{7[=uXC}H ы,\"-{x"-s-Ҳ<п"-'|.~"-jŸH}虵"-Gy6j[/ڃm4 MEF`:FT ߏo*WnH]k_ȑ!|m@đ#Eu:,^9ZjsX_$cpɖ(ŤS*#I-a]$1RPgTYh#.}!/E_H52~ڦ,艉ݦVWiGbRF둕C`/  C,` @$LЋESVeE\rPĐWr1j-EExb*PV6>wHx;W\HP#X]d`ޫO>% 7<_lvM&*2k}0}P*Nl-lc&c% M (;L`N 6`hO[pam,%::iLNWa- **&!*Q]QLDkP\mq^L,a@>=6OIsTaaPl -@C"I_B]0nL4ʀzФG<\3ցy #z$T+*YD}$;#H)_ |%J E0 qv i6@&uFnFu Mtґ6!lbh)uw%;R]7N߭}s=5C;'+X[e@SȽg)0&3F$DGc%(WkSA?ϭ` yS@'Ux/[n]'SHC_05`D k Q7t[p"'H8jd9cFsU]-cPN0HbH́ţx!q9HbpCPQ]lI* >"%;+]apn".2+TxV@w+&~/d%e\ntKk.sI3pB: ``i'J;s!Ipr@#n],CY]GX/*T`$ܢuV$ `,kmC8`8v)7$f,tCd0}>O -IꙬw5hRn۪lZUNP0mlN)`@]1po~|*b 1.j-;$/\p8-t=^sՆ֤E+Rj܄_ YXY! Kc 49PI,bD?9abTP&X#fHMV`9"_@'U("Q_O4Re ҁ7`)HA>)9HZ 7U8찧!'Ҁp`bjJ; CTLdg!I~DԂTyF-tO+-]ӂOu7^-cTĭwKUtؽ>$eJݜKbJb`f_ߓ94bnavit-0.5.0+dfsg.1/navit/xpm/country_KI.svgz000066400000000000000000000067421264204753600206630ustar00rootroot00000000000000(zHcountry_KI.svg[ms_9@in]XPD@*'I*tK:0ӳ{;e ʀAޙ~~ٛOzv-Eޜ^]lΏ> /j>Zl~_>~Ewy}q8XWmŋ3W߬ZZ}X/WPJ֜mb;^lg݋7'݇J ?0jt]nnfVl-Q?]BX*:z:hamӣE /Οnn"8;Z`]xȃݪ>:o˓k3z}ퟍs J{L&/wG9II qgCǴkcV#p:i_'=N^env9lK3s۶OsF޳-mmۭ1ֶCw}wrsNqxܳg3x,e27Z~JHKfGj5ٱZ{=7mQ46$Y*lGʶ(mjU5[_VqF[i-FH߷zegyof;wqE|]EEުݷA3ФK(6rWw9+;BYIw!m`Ҷ[5*%FUJmUJFiK McK"vK7MJɨQe[6rLMc;g.x[)P FRXlGv]ȩ>JGʶ(U5*$m(U؎ mŗQx5jT TWHo~e[IiԨ"OV1FX5WU~<7M3x 4g)ە3ͼ4.^F%k$UHiRL;%*Bh&wJ:'_mlj]9%“+WJޅАX{2~~b{nړĶޥ:!%d~<=٠=4c֞,4==4ɾ[hI)[ 7cY +|D>J mIG e[a6JMccҤWF@e[q946k-NOFyʶ6r妱EȨQee[QJɨQQh6YJfKIngx9<xN97UvG<T`(aaC3v9$9aXdxA,6YJr*Ȇ|C d˥%9Su22K.,F5 U2#E=zx1NE{8ku֠|,ܞ1R%[#w8^!::PXNȋM C"#*sYX x".Zb9a4ܐmHf,RT%ץ@$^ `uu~@UhNvP'"-O4navit-0.5.0+dfsg.1/navit/xpm/country_KM.svgz000066400000000000000000000015671264204753600206670ustar00rootroot00000000000000'zHcountry_KM.svgXn8+8M HߤT+EI}M;ƢmdHlKʒv`\D^<ܣ IguWeaYZTN4S__t'g'F ӷ3pXU= >!~86p!C#sjEnfUs z0=a$[`s"[Yŗ GQ ZC-yffQLәIͲ@eJ>f2L]򺿯?navit-0.5.0+dfsg.1/navit/xpm/country_KP.svgz000066400000000000000000000011471264204753600206640ustar00rootroot00000000000000(zHcountry_KP.svgMo@Hr)R~N^@go ׎4*REP^3^^6.ۺkss**ןv(ڲh6W]$z= bwfՂ`!!oӪ~bbWZ`j=: 2WMQF}aw}*R7u [4)j8 ğ&k= !5VgsN0Y*$Gg`?RZ%oLFn][ʧcs(.~U^Whtz˔n }p:ynf_u>ȅtmnS LfIg[6]rSaჩ:4#EL>z"@.1xc؄,6XDl,2=;z3.BDBkD0RXKF,Tpd`eDdm$.hΛ]# C! ; CF:$Q8tD iQ`ϿeE.Lgo \JLz enavit-0.5.0+dfsg.1/navit/xpm/country_KR.svgz000066400000000000000000000007331264204753600206660ustar00rootroot00000000000000(zHcountry_KR.svgTMo@WL&K^uԏK^>TѲ5`Tzf}샍앮 6qT 7W/}>CL&1d<͌Us|ɝ}U*˟3c֔6MhES0m"V7WTRMw =mq>:ŁoQ\_nsaO5{l|6>Of"ƃ91%@c XEy<"N?mpnavit-0.5.0+dfsg.1/navit/xpm/country_KW.svgz000066400000000000000000000003271264204753600206720ustar00rootroot00000000000000(zHcountry_KW.svgM0Fb2n`'T@Om--+b{_(A[1MA޴z1*QB Q9'>Ol/YFD,^ߜ 1რq,cŸ#AA![kۖ[do~kYR:N6. 0-Db5navit-0.5.0+dfsg.1/navit/xpm/country_KY.svgz000066400000000000000000000533071264204753600207020ustar00rootroot00000000000000'zHcountry_KY.svg}k\וlx)gZ $_0Zdḃ@-۳>EY,ʭ}v{yg_^ݻ/߾߻GWwo}͋u{tͳWo}G|}}uxww{_^|٣/z_?o_?~kgO?^߾{w^߽GKKؿ{鱧O=={z(_Gu.<=OoQ p{ߖɴ so~Ww{s㟞}ʱ~_^ݾ翻wo^߾ݿt{p_?ǯ=os Ǒ__}v{~6 [i^@'7b->}޾h?v"~5l_|}_|pk'ޤgO_C{իG]=x tLj|^z?o L峻%a+N?{zo?Mb2H+`{/cǟ;V^^ ~<Ch}Hr{"f>ϧ9F3x(_?{rǻ7o=c}bdS7wؐ'_~ o_y{7Ax4;6wHy5?4P|#ا 4Tx|yO>jE/F!S wZ-x@>߇X\]aU\wȣ1 >2^71m,qG뾖g mW*]b`Hi\q#(s: RA[!U JW}U\iW&w}Յ}+qGUu߱^§AxgO| GXk{WK+nx%zBh;,ֺEnvUO/P,y8); sO/ΧO=8JG=8vUol ;\7}Hy_{6\_øjXQOH 5Oe{(YjvCNsy~.)mhiRŽ\O|[ֻ]*ֱoէ+fo WzE^ @%o@NL l@K)Vkl FJLy*oi0< F^=~O={6au9$"X8Ì}m!t M.w\*sl1[, oFAi u=;1`޵u.h:Z`+m_1= ]w`Hpc0I aG}\aW*J@+ b`/Y3 a,o Z,Pnx\X ̓]t[ Ghor4 4}a}NXAh#e+c{P[Na/bBP@aͺ$sӨZ?aXZ^Iz m`BPSN!:2=v1!*@p_ 챒 Qބ lT\%h~PL$)6<Cj WX!`δ/7(0`<X0e֐JXPd)i&Aq1:D=GZ+_u@,XUI=hҜGdtc + VF$PLZ ďr1Jd= F2j "^X»3C;KC{3c8hX`F@RJOj@bp;!BsvಉnroѰa=Tjm[O7GXZIԎℏ4@w,i\907N0< 'e2}W 1 % x1߆2';Ǖ4ZƸ[|e{9Ξ`xsL^#_CA6CAF2rFʿ$~bɡ@طiWv@X VCJ MP')Anzvނy:<q^ ko8\7X!3Xdq@ ꟉlZ `]Zk+ x;ՕKB,S 5Q^6+!(/j5q@;]^XJ29΃!#=2 :f/~G 2 T " K1O@7;(|4\X-,~%s&KO,! `ɐ~v\ ,1~}2٪c!na#LPtl;8@ xv|ZdAN5D~DCHJ܃Sudp"g"f~8%)R*v0F 4u,?;YaMAs Vztk`r3 [I`\KĔgu`'/;a'`kASVn{34.;0^QE0>;\]\l :Cpf@P( Clx ص䡩Uw@I!1;dw Lܰ+(]de}ڡ# p+&6 ?&$ЪhRM2 7 8: v*Dt%ڂ6r,C_)Aa{e, SiX`Y"cnY4 [:L (,-v Ye'4$flʇ8yů8}vS=zoqؾXE n,66$)89'40@r>*]v>/o}|GGe^ ;5c\JEBýGȯ7EYKaե˲ ;l5m<}rAʅfwld"$-Ȝ`QU6 &詎/<[ j_dyaXq :&$/)<3 ^tAadׁ0@dc$T3aw_x 6 *WGAr lhO'm8 zP=%xඎ윚 zZ1ڥ).a뵅gjVC8PM"x=tƚZ*"bɟ+-:G0#cJ::/?O R1s` ~4Sm<+k9 yJ_5I\TN7W.Ȟbַ { R!KO4!Z,,h|9] }7kD$+a;F b^ X3  :  %.q.RxK eH"K䱆a|\Xz|0cҩxxii:^_xbZYP5-Z,LA_E?A%$4י'yTk2 y@ X #t!#hDOzm8T?9= +PGB4$\+`Yar[ygزyaܧ s#b@2]ZxD5tHdZBRg{fyGktفKzi(;\:F3:傃E⫐aw0-}[߸I9H1/FyXAgXD=+9a R8@VCO;p|{_|561"FH>>>0GmWR1i/J \e^r%\9R0̱C1v!_)JAPf'q+h@^-XEd +&QpĸS1O B!xǩ}-ݏxb!> K.b4X1 + + vU_ ~[qYd&(y7 Ja︈c arfnW&g<{h[mOl}2NbPNFxEr )>  r\WĐ_SS,.6TJ}MI|bxxEaC| JtӢy;`ь=mJa\zyKO+AK7.co?4b~Er+!>`yŹJyq@g=浴1䃝D|_2NL/P<(¹?tT빐M>ŶLnļ6pKE0 xE&1 #$O;% f1BY-?vP=8(F`xɇT/;(!>`yeWmi[J}[.5ax?ڍH8^}V,cO,C%Se5W T8i O5jW|{ҙ3P4N\{pxV80dRd.DC];EoV_i0"//8j.E񙐜cy,m}*'-6F茏LU@܇h{R U ?X\ɫ'&d?#IkmLL0g FiZ c,ڇ+GEXY#V,[[瀛3VP39ӰA%MxCNWf*z&PVE^#SI>M/9n6zLY`E oҧ,̺ /zEbZ]IVFvw,\3 36dJ0И;uyu(+V^ }wy[9kߜMl;?mK.ΰŌBH7ηS>rx@ύL;%ɲNl=2^ŌE]&9u8iN@Ǜ \E&3Oa(/BY˔N7gUj=d8 r S3M- }8a3ڵ7xu$ef08di WJg훳i\ضۖ}e['8᎙yO{f*?wblUV4V+3?%P aWx$kNᮘ ɇs3"Jy&1OI4$1_id`<<wD=f`&0q(YN4^yLFr&HP' x ڀ:N46&`S}NW!g7NLgޖ u@&D+D/}''i_]dѡW/KvK~&*]9iNrd܄a|se5evK4qS?…-0?Xv,n@v#S5tE;|3FZyI+ X!1)*ˮ~G%~w4b]/`둗aT2l)=)ϭ-̼cS3`cU]La]4(WƆ|= wc$<,u= ͻEpta?8I.)@}fA*{^)L^:紈kQ3'󥰇Ǻ!*mtG_``u}#fԌ/PiJo2cFkrqy o6m 4CuJǠܣ2P+\߀kԍ+AZ$Q$jH34gK>@Ki:dO/g\LMS@L? CX kasɩ҇$Z.Sgm 5bU0wa~A(g 20'4yҼ9# ||| .f]y60t;NNgUٓ.w3r :+sn:,FUbfE33jϜ]~3C b msIgۙO Z] E.t/ÅnF,-VR7RӲLHrClYrjD"Lv׬Ux7>%23X`eymjB>. 8L2'ݕ fL 0hMɻ҃Z-f:NGD,v S1ピ8+ҳʴd&gptpmLu< [?]}Ib:$X,ׅw(&츮9'e$Xȑmt # 2"lTgƔZCDɩb|Q;oQ3z/m$%?|W ˅0q22Qg`>)#&9c:‚+."r gQQ> J/wryD*yϩi@\KgDQSv^sULemG(:2R*Ƃ]FgIZa[V+JVzGħs*%o*k'M ,,=[JCw*+4&wLd\[vOF9E:yu>)\ѯ`VՔzDm@0AP,|x)g+D2z>Ց Vd+Ie1zLV ctaUWF1:YՋez$idIIQsjx1!fHJ Ћ6v{hV!g=wϏc)WSoₘ1>C BAd1XS$UIfX w4^#&@MJkV'="! S`KzcE L!˜2y:l ̱Va*`@4h*-X<%ku̸,0{녨 7*e2Zbt70z8 s?:Hw<w1 t5 VqAAU@!Le `yTQ<_EX2)xFcnUL!3j/X)Z ` =ݍD%@mU5T /Um[^±VW5Ik8as= LϠB9΅;edћ/e} +yJrVfҀXKGE,Q[EI&DL4;,ȨDϞ=o%q"SQ[KhD!Uy 8?(Jz=ڞBK1HW1rhPԯ\ӵUTF } _uGRhFZHZIyQs1ހ.ڕh(Dz ̩j5'A K2n1LQBY4K2KLa1 ]m!K PbTc;jqhVւo" cWW|޾7޾}qv=MS ˇGv^!o]#}1<_e*EtP3dM5׀O0|w/<AlD. ?7"fŸ+^'0! iekdrH9*X.]W { LC,hd}\PpØ:uZd:@xģ N,~F7'_so_ިͳ',I`9 XmVvRcUǕ_֞7c;ۅ1b{A/u#TlOFfjcg;!idՇIQ4-+b UsmVqAuTʎ83;NMP9dXJ43.o`=_r:edV&H?)g_Z8Ux0ӭ%ɫ%!$Py%YxS:Z463v$> SxǂLOpL=PXA)EO>jMmLb#=F{z!L]}#c֜yj`@gԞ^/ ?:-S{zUr N=n6t6gK\(wgX/r hZe#O!EMg[O'[N7Aw gW#:.^kPtF7pu2oԀ,T2A6Kz&S=0}ƴ8SO;W1 s{`ڿOx"'&&8 3c\ {ԝvhE?5W@5W5)`ЁQP{}W^d?}"a[1"jW:QuC7Xר#>'.1 ?48S=BǃyQ%^r7bqB9f&[Dn75;0 tewz \!w^iZ1 ѫe+h#KI]jgj!G;y`px!3ƺP:Gil^FPZ=[ǛF{֯ff-P+}acK7Ƃ .qnWp '#DQe90GN4nxCYVs"͛KU\D$mWK' æ</=x@<0o/NUc;0H#iL<P;=6L|iq*R6Ǻ3d`1+l,=^?1zL,},+#Y67];F08Oo3UBu]+ zueS>V&[!B8YgF8Oޑ=KL7i޷G*;a./\d /?ɲjf.mf,zTϐI auھVzEZJ+'tz+9fz8t5 ]ajmcI^8 y$Vepg`q02._4w#drX/<Z^u^g9]'{k]T`[dfaJf8v)°'76 Jѓ7/VzحSʛ7\%ĘLSt 8ffL.w5"7gYa71ZDdEf$/_&'ysT=uqzF]ʖ6Hcf`p! p4>vc.buerˀN|6Y~b?Sf6&^Z;惜€Еe׮6ﳯ$Q,NGuq?c;:OnY৐V􊾏Zkjf {#N7g߸caμDv*'b) *sw瞶=r*Sіˌ'sy}4KÆm2 !16g)e5R{R@A@ 氌|]v*Wو.8u0>0WGYcTs-yDr G{DNAxMU!šm^?m6zj|ژYBZ&WjfG+vkz3;xqlqrLOxݜ˓Bt:--jv%5p(K-X> IE1cl9< :[>l(tرk)˶=^sfbC᝶=bT+jѱ|\i.WvD|fkn{ki#@`)o#Lv}nz/=K) ~l\&Z JmHCB XDnӎ2=|Q椉uH Z>y3gE@&N:O|}OF_)aǼ܆yGsAxܮgA*ǦFΨUnPKaW.>$8<"VL9(&K(;j2bP`W!!ٿ}X8!wbQ!ȩf@LENym>,nO7otXxFe_շ2)fm$Ȗt#6:.L'H} (6:'r}+2Aic.";ȢU(Oi ɔj{C>t>l(3eFeɡz)\R0552ֺ dy)JK>I~Ğ;ʂX)L5=]e%FF[30e4o2>qen)1~>CIf2*]`v,e6,5W3WiβE]ػ\=d:qҠк%i%?g&IV>Z, vd9)sbko@)/ wG yOBha)F3(dRHqFaΛ,|X1!~ƹ2+g +'0& U8ɨ3r>l%Ȥv-u~*]fEQFUzVF&>i@5r-xj)h܊qL2xèky+-KW1~&`Bx7J{ *+T* qJn,Q1f;avPl&+ڼ%Ru͆jĐE:]H7=|>`5&u5z sx,\s}Z(: &4 myY2਄d꒫, va!{Pe[?i* y$p'1n"orˤNڇYi [8Ja ٢FQn_Qd))6%pNExt2qׇ;4)E4.}(wǐ W+ 22- KZ1?'p , X!,6E/H(kaG !_W2u\WwZ~ y3#HcލpVE^Yh]ukFK^k">UJL~^|]O{~WqJϏ,k M/Yd$BbI^$=*wYִOU#FXLƿ-@._ $<9{PI3U:&Ծ@"D|)qRC`Pw %>?TSE D%SEzD|{ڟc'Ţpe,cquAeRS0 2N0G,_` YU'1.jIm t-(U+RJ$梊ӷYNw>و :jzu?q? hNWa7*=g%rdTAykQɼ 0GQjr(6rhAd]bt` vN'ʱoA̝"kBRt*2U>cF?K-d5\Sk>j({ͪ/c*YHӊoa=eųȃe(BVqoTl sgf֦BU"7l,56H#N]IM$sbaUᭅEK#_|A,.5T&z1ѷD^`|:[5S\{W ΕefX.dY@hkBki- RaLC.#V#/y֔&on /s}ޠȫG_ 3/25K+i#Nsտ,Z,r,yk|Lu&ZS{5 ,g]]"2G{ «l9X1s0Tjo=ѷeK] *P~#ݬoLx:Zog›@ھ{!DN7qAs(PlԝR$S.J(4bsC~֠W,as`zN+$c sMtA`jo ׼LQ 6X` /"j(i33RuИy,ET۱5D!Ž 2>wƄoY ܄ Au\ zBo0`S01Z"LŠ5j(vRyc=P @q0fP լc5DP_ͻ BV&8Z^ q4jyȂ7JjLA&0^dTkEIU]NO7!@d /} ്~V@l]AhQyۤk1Y}cFp>3WI6޵lj*k&7=.ʀ&X9lDC`dQsqyM `"W =844v[C.9pLď`Ztj~3C1;ͣ-IJ N)ɠZ.WYְC,ͧ9A4[y? :aGHX o Z<4$Xej!ROBz"5jzoC&ƼaոAU'`96k Н+#S&A"Xht E4+Z4؁WjQL0G\VB%gS')vALn@mvSXZ6"Q3" hq7:Z<{ B8_ y0re~P"ްex:M%zJ:sֳ[`a"%wc Iؼ԰}0%?xӭaMP q=;e>Lc AƄBH UU`.LHYG lL͐O3!;wa21I0.*Х B<6枺@^d PMa#DT}gl~IcՅc;.< o+Ð,ATþZ2NB &Vc0l;- riraj8AO/*5հ1Pf$DBJz6 Ηݠ0:]d&0 ̜=L7d @WU* gN`|`Xi`XÞ%N rIA.,n^"QҲ7M;6"|:>*0ӧ{x2kD?&ŃJdϫuAʒ[` eD׆Nh^U!fd=,"hOiƆE m:|D+^Z)NQD%hr%IjlJ2vֵɍK:D"[(Q sVdgÄBS.mURІ0*}uH[ikE-.m,xK }fs }˛ٜ~Y OTXs}hȦX@!9e  U@t ^`0b=8CϡDKXa"QtAsmXR +1a;O\m-:Hƿ}f(bJG㹪"ZuLl5J`,ɿjʠl0wJ&h@# $H]iD\U 7 S3Ш. Yj`Cl 2UvEdtFt1,Pp ,?zٷ ?V(ǃef4/sKz]mc4@)K! nt_ PBτ\}YtVl撣 4THi?No"2|Mn-s?Ftt%ѫ0.lJ%A=l>ۤ^U V8|В$$(X0ueO1\4d+Ev`f:XGvNPgcy2J6K(ܚ4s哜㤹6Kj&˛7g&R(Z'$`逑ޢؐj09WU,<(M"Z` B16`L2,6xturnUQtX^sU0V q~OV# `Ǖ}`j9M}0Gխ,"T5e]ya< H0Y;Vr?|9XmdBc93(ۢa=viS`yEPrq[rWu%iЉ3HK}{l :Ӹs*NDyn +nDڣ-8aL]9Ž= pbr1q :gY!(%3AW}(۵vgVͰZwf;<ՆfJǁΑUE}R fͬPXUQ:<|x^KA?Rqs>4V8U +v^t2c6N 'z! lGDT4Tm``؏6N xB==(^~D(1f$n, M&BVY(E.]*7T^Qu?HIڜwKmT>jT.۠V,Yg gDx905v` V'%)G#:ĂV+ꆱ 2{DFZlWzJQc7J׻?0TL3<}Sisa2K ݚWP-O]{l.)|V zal#ߝ"2Q"j2S.TORvd=-и҈ R5RCGWQT%ue;,eR,ӯ'(3WE1}=*j /}{Elg[BӑŚ)21_!WA =|8u!%#z̨ ę-H_lcOSWr4,Rl@S7xLZ ^w웳mY?)mLk 嚊|CJ5gLy\2F&#+ծa GZ[,ffEs)yp˫ [U D,Xɮ[dcMX3+IaߍQǥ hRFSjorL9cj dp6x Tf$Pl>A ' {Ysd$dg{]ƨ2/`mpCIϿuidi1 b#ēA)N%VBdCC`!j** =g`NPdcL$%@U Yh9|0 B0Vd,Py 0AEdަĺ $" HB@1z ,h[ɏ38bpEXCOe׷ پ*-jq(:;f<'hj('c>n G=9JJVnX#Eԕ1\ S%eK4"$@#Ollu#Ƹ]VY-c\cg"k惥Eh|m1b0^0m=-ZA1ׁ ؈jkJE]PEb d{I6A 4\h/:(fm֩GMsBrgb܃(`;>x}pI0RK$ddF9{cx E0k̖ǨbQoxېyd)0Φ\}ɦ)$5.8rK8Fvɤ(fB ,AH"7ƛC(yth@KhzH6:Ci.t@a7 Z 13(0f7A"=F] z3A>n\`_Uͮ90:=hQ] v-ESnv\#F nO)vsN] p8[ƫa9]-H$4'x jBEUhcuZBhi]UVsS5Gqݮ.EsX l $A;Sđ,̙R0H 922:Fދ:x}Q^YƱKG֢GCPς{#) 7#jA0o9i%c!PӸYE:!JM erhmT>zRP2..a^&9j{ X ԴKv/Mt(S.+v>J]^!3ODY,X=K>].1PnHPpl7;5 Ϭ4*tDפt1(kNT!hAEj\TH}SXh*am 5:C<FO,"lBh+\6cÆL%ߖ<kPlnρ&*0jն>Psm9P:w õ9s`WOSYԃNxdx V0476C.`ڠuALj LZ'0Ή$E +6vՀ2eJF+9AR1Σf[ gݨZ&bs[.n .Fㄍf{ u0 m,DNXl+T0IfcԦS9O*fbS4i '[1WPL3jK.Nӥ# X?HPhDǼՙϺP S+)07j) %x6w"3Lw$ .\/ 2S~*1wo_䏷^޾?}}ŗOxػ_Nx#o<{[׼}=/o^\~ɫw_<'_>{Gd<6緯_o~ÛoBI5 L0졶IL1%_>~G8J7navit-0.5.0+dfsg.1/navit/xpm/country_KZ.svgz000066400000000000000000000177641264204753600207120ustar00rootroot00000000000000(zHcountry_KZ.svg՝ko[וWp/-#?ryuv~hv><;\=9:׿yozu^^tjGǯ_7 f3yt|r;[.V/Vc?nzusz9_.G^= e' cCX0bqr}櫽GGsv#ިG?]wn~_ֿnqg<.Wo 7rκwqybut9; sr2|u\Lf_Ϟ?Ox. -M?]M1'6;)}j?9z"vۙ^_Z}zu9{t ==aG}s|e9 f]טw{|~zoV7?^~7:__G_3Tl)!ncF>7\>6_O񓣣oɏϖЊ_~;ZxÝ7/WIǴ[S:hgz?i>7xoLΤ8lbb?V)Cz{KwQO¡z#r߿u~Z_]O/5K?Vߞ^]oWo~rU?Na7ϯ^kWOׯVoWW/tS+cK5MԒ^CpS!e|*]\ty=NHۥnv񟳣L;뺿煟{-~f|?4͗ЧRcHs6BoH>L% 4 mjUSK#2Գ<T[cǚs>9fMbv0l]Jy S*!O㰭jbQ;g ɥbә_sޢh9s֙Q ^+ﲏ.kFOKSϡ: wGY\AtiƳbE ޕXfL@cTŋ&'/af]Ϙ P a̷Ǝ0M(cFIh0*!=v0pBUSjк-1szߍc)0oHmΔm:\I##[HwTġH^Èy S)3J_8B6 "m)Tb^P&; La[14-yAMرA[F 8,,0^C3W>gإd2by<QAFZLH :ՐEs)o\by%bgXN1 $fF);⠖ɷv<+h9r-pXy!dtcVrޣvd:Qx0N]*z&3g+^n-adےnꂒQu{,1@*vQ /p5in~DإA2;'>4u7#N" bAe Qƕ:[a@ [@V''9 ǃ BEs2 J3XÂl{H53`4Pk MB(m08Ҳ5Vy6'2MDq6h<բW|!>G30Cj-D \: t,-λZ觤L-T./l9&o~'Y?Hz]2#V-hq+2Pb 5+!``* iaptX7e.!v$,MQ @(6-%{HaDE ˪IMf&y?2˷fD1αQ9O|萦izk'"v"5Hh8N830y,M0V|u};}5@ \.9'r6!J#Uyn-`#1 z~,ⴤ(P9B@Bv)"Z!߅6f.8ġ 1l@q@eǼN! 4À`hW,%م(HHpH ?0b8G2\ږ m ĈZh*# Jo`|@:ٕ\wß'$  bbQi++t`8 69K-(Ĩ%؃~AgdFǴDRro_'ۮW |܄CxeuYňf_L5PY(ql2%HmeM2uYd QmAք9CVVdWsIh]!ca-YX 3b ԡ|F>D;cNڋ WfB ouL@FPE$vH؁6SrP܇ 5 1L,y)ᗛaGmU G4+ʓQ8)].} pM yeH E4 sn𽙼8MZ4ȭp5^4Zf\JvKb Ep}#K񢲹bJPԉ ,C3D+xEi*wl>]>$tX̵[48> ~{r&7w,DxCV2J-nxl/*[,]ƿ(ah#v`_ _LGCŐJC'7ʍ@ C;rg|Av|q4SH1 }2dݱ|]~s*=O׫zzq1ffbţ{ThR$ٍۭٔק7Njd$DNzϞ-_-)wٓxwh/N??vm]/n LmyS6^ݍSl8ؿt$_pۋOw|˷9=vm쾇"*rK-鶃m{Wp43^X=Z:;u?m Z|zOvd啤X}?XAUIhUÔgVZ.۸I`fdG} 3mz~VW*XGU(&{BDS?Z5*ϰB&6Y"\QI0,3S͒YΓe8m<+Thj݇nS<9ZWj LJ'U un >,>N6I3<;4Gc  5֪J[UO1>h%s$M]a]͂)@Cct 0Ҧ /INNä3ꌼz-tU}jHMǧf*j,SP0=0#UcPq$~JU6MIOEASdhcnQ9,m&VhMe.ONF]8hW#hfW7xo6$5fR2˨Hmi &Y'Ff3Ȯvh؝L%wT-j?V(0z}٘k6ۄ똲qbQo˘rҹ]VɐJ>jgpe :6u*2LSkb&.A "D:|,Ҫ1@{5sl{׌MձXJ٢5&هZb9s\ *"Y8SC4.oVISD ňBkET=X:4H ECN b#"F"D Y;ufj-nl]@u OdH*am˚%UPkCNjCڑ[n.y2#əjK&oB=#< 85l9.ALb69j<TORNI:T9jMcXI ^n1f0`k3JT'L9$t;fHe5$VSE:8 dLIrNz1%Q,*][m P:d8"`˶9N RYW+3 TINƐe8g::.9ƴ1RtC\FXpn"؂$0 J-Nz.e5 7 )ZX9qf~Ku^@,#O&?eNSdVtlBY 3:@LtWh{Pqp,&?2SUw8 (6_PXw݈#u,Lm{4 +!#ЉBp6MAkfQ;EU! M5&f4˜'j^Iw\=cPwvrMZ$"~24p s Ԅ5|kk%h*Z烦zߚ.U߇&[Lt @)5be `BRJʶtNj8 ~aRP@΢t>>Sjj sH8(6TIma{QQ~t2Ep.] '`0\Uh䵵rt09ٶK&0ԥHh/j8-֤[+whz5[`?1g@Xe pD gY.+ʦ>E^5?H;1*`~]<4]f6N쩑}דsVD{Zܡ Se < B&tR)Bd]pRX]įIa>M(,$f"9t)UOI#:áQ'NvCj~A+c5nt_%]Nh#;fIN\y^\2E2PԵr"%*AJ.ni25-[2VN1Xǒ2Xk8yL c Ymƪ%8}v򎑺֕`4/Nu (FCe]ꬋʖl#ڌMew$@!;fE Ƀ[F%_eKH' [!hfmX4=o[4ӕK5ݸuN1RI~6G ڐY ^Og݆qFV YUiVptrp\MQlSIԌ = fةQ-rG~vrx HGEAw!1z uA,ju>nqn vy~4|?71V\}{Vκ$R=@4l^Y&Еq+|kY#n*ktD7-VeEm0L1-3E' byBF&@BT.)n}YZ-­aE$Gg%#$[mͨߩ2urZtݢ-G GM{Xӳ@jֱulFk.X'RfiFC)Eeݹ*O\|9Gk|:݁R ُU<˖1"( GXH)yV<pC M(zՀ9%MFڶaPt)y`SrgPV(Q>랏^10ܖ(ڣ , }&E GR]-V#4'-jǙIEͥdF ]KKPۧ.r1xDPqE5-|MU]uKyT5Vuc1zk(Yv&oW4Gq~sm C.Yb7D x]Pua}e*Ǯ[%HV0f *ZW9(8d4`LkA]J1 C8 WyVۮm7)-0dH4Gill x4@Uo0PUSЂ2rPڡeo ) 1A=jA2u"/O &oywDS aԿԊؚoJ3|©a"2ln: #7O079fbX]_IFw" xQoD}+˔q)T=ˤE4j*m<l*2aZ5&!RqCvQẋ0|Vբ%"NQ 6ֵUspAպ MA5cT*t줄U匸625Jj+N.JnK Ƭ/iMҘB`xTu5n RfVo кX;jf!2rOi}2p$EZ^>%oNsU/_pTksZ_+e*Ehҽ8F%1I0Ck&B;vTS&Y[MKX~K/U G;RjDяN4k}*'!CNoXm1XuFt\x2:liT(ƌ|G-#Vj8f@èEIvT fIѦ F=d\8#Tgr:JY[TQTKr1D$ V 5*B/+V jUHTQVuo8;4ac+ %](JwۭP~޿>d;(܊Zuy:ˇ^:li*Fu$IlU>U zkEBERq8,ٌ:I'ug}=9b]71+<,EgfrQo b4Q$j 4D"@/Zcރn,,`xv-?p_pD 2( U-b7 v\Ak^@xD FeF 64VK(~ލ )~%QG45Wp*m_hᣎF@@/azMG~e>h֓N8DG+uZ=}Z2/zq0r ``DG*z7ّ6>bZ<9;{kP} }ğq{ox qHH@yox cM&;$W˧܇=4l{h~OP-Bi݉J$'PiYAz 'abT9~7[_//V݌+-!z}vBٍ3kOe =-xw[X=L|sxw?+Ζ[\Oݿlp@z@Х}Iq@XgrCc ҇MH? ¾WE8-\| 'fnavit-0.5.0+dfsg.1/navit/xpm/country_LA.svgz000066400000000000000000000003201264204753600206360ustar00rootroot00000000000000(zHcountry_LA.svguA0ὧhƵ!0zRҤ4no 1'閇!v!aUTBo8+=4ӬH*0Pcb9hIz#BQh5s:/x Rp"ϋ?_Ұ5-쯮xw\{nħR BYxzDA0navit-0.5.0+dfsg.1/navit/xpm/country_LB.svgz000066400000000000000000000252761264204753600206600ustar00rootroot00000000000000(zHcountry_LB.svg}[o\Gv Rr L2@@-gdR )˞_RbI_u[U?Nj_w..\^on~zw_?oWO/O.W7o|]7p5(燏jwsfqM7ͯ{?~篯[>ܼn|joBzkxկxDDBos#wh;=ӛÏ3ZzwW??]]loo]bHIؾaFtS)<}xwk??opٛ1 şOOǿ|ſ?>_?˟ע3zwW?an[7?n!] ?__?]lpgL[lWO|Ӟ{ؘo<\vOoÆm BylIȋ$7..(<# w5jX ^Z>u?Z[]s\Qϩ,'4F}4v+Ë0 㮎Y^Ŵ⇋.w@.6̭\0+ жW]atRװ-du7RZ guɻQ%`yJ#[O-͌Z v!%d?c7KU?uzKN)`8jhUcJ6 s(7& M}.awb6uaDc3x.YFAe%.jac0q;0V 8LeX-bKu&mL/a ǘyîVPc ۆ( `5VZRiˡ6c5xiX/E1t2ukFtԹ i?u3f0Z[˸GIzbԑK.t}qx6&QT3qu75R6TO֟390sbz nk}ZLsLqc>ۮ6ZS:c>J>,\q=k{0B_ܓ\]6).J%0zYFfX-Hb9zl_̹/'6 !b BlT X`eq E\N^ !ji-щ0Wڜ>D^`"Y|; b3L7c6`.0S1! +iİ!1 Aw+BX0 =cCR`"T 01q8HӚR~ l :;czDcmA A% GSh8w&eHI4s6`P`gGSp@ 8w,l䧔rRcX6 |X:pouIAy4ayXoG^gcTUg#ԀJ|V%,;6:)WoY 6a'l5LZln 󌏕Թѕ[@HrRwHwBC!ցyQ&7:52 H VHAvB h `2bؚ܍u0 -QR+Zݻ>vMna5_FC\ g\YvF[k+ r^0kpj7―2QSWR( l  824' ,3)[c\Ĝ ҫ7 LzHY4W-IGG3;#փw8تjPDcfhմ;E &(Lh+İ W7 1Y)=McaۅAflCB6r(1(f # (5nt`͌ݲ,p%G !Ξ[¹l] )ݢw4dZ3LąSpAd|B+ /2 -(dy=\~0P{Zbʓv1diBJ͋UAtBxv2zRLS:iЄ, nJhYt:X88:) 1+Nz Vx_a{у~@7'NNb[O-jW(NEA| >1(NSC2UI cWxG>pfT&1W2XWth&y%dFP1"{TbQg-Ł?fA Ƅŀa#62ܓYce%x4v si8t\8]3Mt 6OtoQ,tM1Rc&bWV8AS"^8y Tz$0F) 6mlNohy ۘ!f@`D{ 5!LB(1JD Wp(GRDA)gC8_˭kp1p84/e}^U_ݶZFFe ;S7P2\o~ ьnKͻE[hb`،g\XX!P܊QLkcX;@u1BksϱKO 0 Q E5-cQWo2gްn rj7j(70JhP@8/ٱl[;Q`VhT-#2AtN?|D50I=)7O&8P$@.1DIuCfhч5$f7q%2cRB@^gX!`ց;> QD #Ly~'{:%as -FCIJ+1͘~Rx&Xn0 i;@`&2 50L v,jCg qIv1"Y%1zFߏXvAlUELlE4Q8aґ [6 K$'4]ă/+.7,K&αqL@"򰫐FhQ Gq\, "Fhg[ օF)5ܨ6=07 䋅'tF~{=P)2Գ1zky"N0B-P5`Zڰ@x|JU$j ݌5ֽ밤V;쫨[v1hJ'ZCT`QY$f6*Yh!`W#3^E",rdf@qGgqH4žYXV5d8#)de3_hqtgҐe!K-qWLSc`QK ſp`;B2gO "35$T9# xҲ3QU p ]nĊb,Xm!;kmqP&n0!VK,0q.tNLj QiIS<$6#@BF!(L²&|fmƁLF"{n%cI:@3mƪ’区HR"S rdU:wSS,bl>GKTG1= {tMEj@͸拫R=i9Mu#8:Quce ?}lLsCpjJ),de}0aVtH%_b0 Ÿ¸hY4:0!g΂Qap"r0M2*?A4-N:TPzš3 c:O @2b046X( %8PZ󜺫'T.12$ Q4iP+FKb0wܵ V?t%chi7 U52f6Eu%# çæbe%ZLq][9pPY!Wݧq@t=,>6gԫLa0RdܿW RPE9T7O* %s$WlyaF31XvtE8A%쐱xD( [nc DU岜SU+ ~THOEΞQOH%jð4VHU/n7A$6P+`%(X}X%:#1VXbԨg]. P4ef͞a'EJȏa)`y I 37- b؜5sSvcКx2/ց`u eL}atjfl:lʺM%[;jgԊpvҲ2x³<,fRĴnh0'+KT/R"JH(>jX` .("Q15sX41n&.z1ق* pYx8e0n*s5Y7Z:;DL;K'QN(F[.QL9ݳ)pk?h:+cƥ+B>SLd`iP:XBaٽwh٥¢nYYSjּ;s/XgPFKIb鯙:|Mye% D}EpyhNաZWv`Q a.mTL: mSJJE0t؅NVK)xf 1nB#JWeUKBcqٰDUI0bpbBXE ȐlPEpωX5c[1F # ejYx?IX*ɓf={7sX8'w oy ^,gfbY=I8#:"c|7/p-to7$J_Șhkc&G-itrΨ;j9YؔCv~ftIkx.j9d w]caRpZb|ua*M0,xѡmQ×e_ag_T兾_8 z/IsڦJ&Cw3aG^ҽqmd/R|Y)3"Q/lo'ŗS$AoLXYŸ#Z'@o2oH Y`n^L_f&:eZUD#U]'eKZNe ?Wuw1&AwPiʲ> UrP37MXԪ+ItF퉥V8Aȼ7PV]pŨ,WznBj I jݤHRꅹ!,"m &fg.S]M^*VYS˪+)ʠ S]4?X.j]9ӵUY?tTƪ@bn,t9z\7%+s]L.[߼ )_7r%ZJ1"FNy҇vܾ0 ^.mZֽko&-W-zP%)c"gKUu ~2jv{maN9^m7dѓ3R:T=d_qZɨ*%a#R 程q09X/)=M<|i:;"GTt˱ֲ穛6*ɞP7γ/DOJnj ,bsܰUI8"UծUKL4*Hf46gTċشM3*Y:tkQ3hKJRb}cy@c /jyd`LJe.{P[;X[,oBq駰,81ELe0r(ЋELB˫%ɑtDz7]7NƖ YaQ FsʂV49yV:<`FȨ3k˳gnD#Xb)̲zbwOu5Kb6ʼnRubb"Ы $ .et%r1Fa".\Xob؈3"yPfȲ8[ģ ʘPxX{f:_Ե&`z şnXeь c۴ Gc,Nb#0.~sQc]wktA9Sx1';L}ڙ-SrKGFB-ȲTn⑘ B[ sK:[C)mt=Yi,Z^q04CdH|ȳW;ALur 9jɑ`i]i>|c#qa𠹪/͐- wq2ۑv{V_O$qKd+IÐM:lpF0V`5L+yYYi~s-7sqaƣ)56l7#F75 #J oĵ6kV2&E0;~,1Tn9nh9VÆU24NŅ𘫎h?Q>_p{؂ ˄%(|BN_xi>ucZ3 eЩmוbnܕ0B( bvsRR@R :&ц뺅(SFz,l(TwJM@G^YaM1G9”sz֗]J)[xZX\PQPnB h mou|gjN|.ºj}bUȋ(ƻZvP1xu-LT#)iTQAxޕ>g2bX N[8J`q2ɘ;VB0K_g~RXSzXTNP21D{%K͢u kjf0#o20$%Z!\]0ߋPx@B 37Ēy}AnG&.B:QorcPY< +˧3uj3쁡g7J^ _R _”̺;INdd!ZxkA(#醟:4ڋOB!yuoQ\ɫΠ"'p:5\6@6=XZ*NRDV SOz<@^sj11kY-4NaV)HefEc05x<3jdckzYEw+*Kq =|%XeXJյb᫝Ӊ4E6o_(yVK5VJAvcSQϤG+Շu%d-K񷋓gHv:~Uw͛7?`?>dnavit-0.5.0+dfsg.1/navit/xpm/country_LC.svgz000066400000000000000000000017721264204753600206540ustar00rootroot00000000000000-(zHcountry_LC.svgUKo6WeoEA=4[ IV#E[%J-<3߼>ML6;'V|UZ|3 5 skYiqa}ddX1JWeZmm:Q:B܏ȶٯ nB7%e|;YwXJ\V q}w#-[85b'I)R մa׵?p=*: 3xd= kfL]wRnfo1x4/TkolpIvQgwK}AIIQ2[M)Y{Ǩ?^շZGqܣFN{V?(QG5͖f(-1(hu{yo^GC̵y fvi`i=00[(ex齌()5e|1{is xcȒ->=g1ÌeSc-vV9GA賿`7%v)*XO{)Z|=Θq j&t:wSo~ZwpOEܝ=cX {5gڧR+2=s& g2;1-(0j4)́ظS-C`gZYom\8Fl%QhsTkϨc{}f L_zEI zNx8L81c݃F5,}p[ "Ǝ 06N֘R+pޝ 8qF1ea8%QQ=vV;`\ gXd': ۾ęQfnOn-HIŭ?Zr,Դ~߰6R\J > 3M|/{p -cWsqvņw w}2fP $ZݽKj~XpT}^_lxpK3(3!nogBhlzJ_TvW2px;r吥WɁϴNjgJ[<^ !^\Clhj,9- o2nyIuwɆ Saz~_~K8)O@_~J^x 땆̺:Sr`x~Xfs\_lxp+3!ʲT%>`95,|]/͠B&,9vj4> zI*ax4LX b pO_k46T` cDX`G`'296{"[tI]/E}~*ІVh ]72B ?MQemޞB(psi-X0TiTyoU9JдJXyw}?`9*Rż1pIdp5a\ڻaGɄ9%9W- LVQ$(Fh\xDBhjze ϙM\h ћ350bazl@ᓅA/whZ^.AY>0m87/PJV)LV.vI6;qzQ+Sb/4 xַRB5d~$KUt00x]x0][ k,x0=iΡ>jgWV~S8!1A,aZ-1evػ;9RѴ . pҦ*LPRsj8π0_RbnRcrx(EcMveZR@8M'+״@R;M5\xIGy5}?b*Mq],βG}9gF'9Q,neB5j;@\ 6K6j-ٓKʂ>ɩVrQn.3ky3AЇ%t,A;x$V'AK)u;`cFX:˽-d ѽ&B׳`" %@I<qK 8r9stfQ 5,̵* 襧 Sw$gVtVNkA9wbAN/xPO` j&V}NIcpE &U(FP.uy;&q\K ׉e\)R)3-\P,_;X'xiqSY}#~=<ֈ]4ŵZ\f0HFgܸyuemCMx6)hrT\GPLJڢ VH7fKY,"JNfqk.04,/jZ;58Wߥ5رk0^rX!VCZ OtqgqO%*;n"VwR ֮plY6qCX!D-MvS|,p}}}>x%( Kbx拷sE;zZ;v)Zvk "D 6_d1@C%ؤw|mżGd<5ܵO$5X,Y-Lr蒌;޹S0%] F\2Xy%1J}lk[W8r8N8fA,*F1Ms}H_YuPg[ ?ro-/q5fD۫ڂc&Aق8ϡŁ^/Y5Gj)J4"A0^9 -܂>)]XLdи2Fj${lٸ-AG pz, I@mDKS!Q|O0wvOB(`ag9jU8zpG  MgHŹuP$[kK<'sp!y:g>C!NeᬍH!HRB3#X]KHIpR HHL 2:Cd0ܱopEn +qXրHƚl pr+ ړC6> ɏkTɸ9wê˞3 t&F_ BC-*="Sgqi$_O3y1~NL?&lH_!1+Eh69(I.dlr꤁$zd af(G̮g8sMU#F* RW18B=$C kR *91,m Pb (o vl#n#`$aܡourF'bt",*ӗD![5AȲ 楲>{8}z@DLp_xif2-i,+\ޅ 2SR3HV_`+ >'#pS_>9GZ+X*pܪ .yF%#6S-{4M6PY|t)N>m>9'.l4UTSH!.65!l(e, JlIyQLi 7/7IqD7 : TaG@,Noj,SĔD;3n˶K>f9^ wӇq4"ӨZ__*q*u'֐Ҥ4rAMBW ; *iԄ/NXx0#حJ_ qJNzeM^Rpxw FPT1 fZ"bv 87v1GeKut =+M-F5O9=X*T-4w0a+~Ri kׇQ6G.mO~lPJ+0)xZ ѕ#Q<%xWI$8H9UDͦiZ^! 0fHyႵAawt ELv ZXCS+زenN`f 6^WanMӞ8٨El A#9"3-ۚeWIaSPpqM縵wbQ6Gֻ҃cmbO!o=p&:]Wa"ϖ` \|u8t;f6gaJ LXkcZ UaɊ_xmn+zJH6j]Qy;$"S,fŦ+n\%+aͱ=M$&iYVEG!*I$g jܤ˺B>BJ>4xmI(Ȅ e scK-I?A;йFCp8+&JcT}k|

5 ,!U/!F7@qe+"뺟C I{2R `3PvsⰰN2' [VѱmD頦sQEf 9ar!2Jq e%QԨҋu;\M~J$p<[Ƿmgr2Ȋʙ>zE p ,0wW~a7KQ'3bqlԕݬ(ƪgzo+]BF"3/z0Ĵ=KA 6dӱ~~.GJ| KI7 ]>JatGn9I bf&U۠YҏOgSPGx\#mFn(TX^iƕ3׽_-93v=O :),u=5vf@k[D"ގ& JS-SE,v27t+&Jor;a4͔hFcP$:ϛ8Y嫯Ƴ5_*њ=L5> %,67"ZKu6>sTkRJuOׄ(HpG!.) ;SԮ4M aZR2QB<-a|EIjWu5)ZA^D4'PQ}f&fȵYFc"*`#çkgiMsDD-a_L8 ?L72B9*$`Ṽ 0nFsv*USYpsq XGn:އ,%SΆk JݔL;ӌ]ΝU+ Q S~Fmc<5#1#bPuHY@-v}%T(! 1<^D,Q/ށCvC 4=l׫3[8'zP$2# *Le$DJFT }C\GJ=^ \r Ea ~6 iFf3?}kT\oL֍ 뮈0%Q+Kb'XHx~J $/ wڎA] S8kw!T^xCϜ=%F,gD#l4cڄvMz-0#,v _l9}1XJFc*-P/52Yz=Bs%t=bmrW~$ >UW~8J4Q60N:aߖ9 ^<g7Y-;#PFB 1nqWϻ *ONdc*HSF %`79j`֔Q895>kWddD]e_zb6W= '1nj:ӜHmh`*%o L1ߺ뗗ZH˧ V8s|qݲT1 9gnWIb#t^ZZ%pIAhk=Rf* O0YV? 'i91eB <7Q`#1J-B-+ށڄ IXjV$DlYAH[ O| z_U.//$o}=E/)U-kW&ʈ%T0Jת4 Cw7m\Ҹ.6)ߦ ou72A̠ylQZrH|&qK jYpa/0o,^xzi$Y.SkϴL?gKNs4ZRn$q s'Q5!+r@̳n˛P@(rX$~5Jz.)͖[]p?Od2n!#bk` ugOQc'|Qk_lgH)DO<G ;MӮX˧8u$$^JM50$MCC( ۸iğ\6;H8 ]I-)] CER1c.LI y CeWϊ;|OȽLHdR!f:wa/fby'.IID f44oxG^b*]&b]##QqԿL(!Ąs["@f*!ѱ%JBJf$c-b)ТCX!׶{t-a =O1iqRQT\Gܷ):\M>hىTA|4|?Bg:RuҪ,J`Dn῀$>dFcoS ,3U>e4 S *|-@|+1lt7f9VD7 ^ lwx?( 50ȵT+/grhe`&vW,*oZc&~Ioe)gxA )G]B*㩍yYtR!igF?°]5(/I.H>zeƘ1'pY&~*|M)+v)%N:ݗظ x൨$;*-<ˁa!W];K'z |SkvM xW),1vߪXI8K I_U */p;(C20qPkq[SWRHeAgVqs@]9\Ը6= O_/w1rI|$&5KQ@+3C4= x_3vCσ$Cuc_8 9† !0@8 2W˝zKΥdW8 r5cFcbJ(|v=~+ RSc5Σ5P+6EW tn;ؚ2/WJM ÊtuG l|ۚ/vr*Ӑ,%a^OK!QXo `y^2"ț"V1AM9']nptQ9I*(o?!ѹ%˧Ӎ7Mf'D]KI5^v6CG-˅ZzBK'e ҅R\%> )8rg˷ԑʾOYhjR*t*ۤ $9Fafw"<[䫗3+G[:=:,D""kW]=yv ;C2R}=lKHo` =! "3#vi09}<cp W:{[Ogrnrh=>x=^> *a3t&_N'svozʑ+] JdQՈ+07tx^,ie:O}!& pmF)K5|7M} L` au?B*!׼1Vz䰉KM{߰nozp OMŹۀhs8'7?X׳Țnavit-0.5.0+dfsg.1/navit/xpm/country_LK.svgz000066400000000000000000000142071264204753600206610ustar00rootroot000000000000005(zHcountry_LK.svg\k[Ǒ_|I3wH va Y/Hȗ5FGXv~S՗c9V<_Ꞽwg.fvj\o˫W7j׋f|y\/for1ڿv~~tw{Çn>vf77li׻˫F}q~nmgoG7vo0Af"|1ϏxcM z/R|7g~\FD^MvҎM7Yۂs0־>G_w+LE ze^_.oa2bzX_oMsζK<=y\- xl'e1rU'+vOouu؃Tyfy$-.sdVɁyPm./8fO[t8O=\ i#-}D!| _ܿ_r rq/Cy?_N8_?]mL܂ k_>m7{3\՛O?r©vIFc {[Xpjl៴4Qr'7~X ;랾[(N1n|gnwobkpkRC;oCJ,<x.yٺG;OX\ ZZB(MۥϿfGlƘ\]6frf̏l&7?b3.n&b3ŗGAJ>,m&[y8!a|?Gt5K!Ƌ!^onrg}5,o⯆i7 3rWAo|g.Nqi֟`҇ b `邱) 0)&Pे k2. aU^ڽv|W8d!]g@d-8Lg}nvm-|Źp0ebЙekn4 VbE_pvS8LW&.CfT;©)/PD/<%)dL>j!`Qp7|p]r7zosuRQY`uPeiC&1 uA<()AÈXaj1N[4 *I%c{[L m Х#P*s{:].FP `rۤ036 b^0 FLͷͨN8|0p±Y Vp B@Sۦmd[qM~g-67G.@g,$Q@'@@7I Z1EPEP@G*x[.M&'HfD(2 8s];?UcHah×F꜌JRZt<ڰs!RH]Ql#kmW0b9i-XM4QP1D} wh|%$,$ڗjM=b A c7Z"P"#&"@l/ "I`<4` bN5Wi246 =01Ybt~/H`921Rٲ`cW;0|Y"`cfa@59J,akho3_FY+ܳUHY­Њ B(b+^v+3`Z[̜Q˵8\ Ķ'h0PG\74b8O&ŁVz&l0/ZLcdBɍ0"u;Ǔ?Z8 bKY3|A mACDLHJx;bT\XP" m!Fp#<$28Mm\Vۦ,{U d% XhOZ`Xu^laDZdKp!bNIK?oIrawu<-8GWkX8AfM:HF3 L 8H_x8\j "zSa? X"4+Ӵ˜|NAv"NfjKmgvSp$\. UH6w"u}~ zeHcHh^Pf!:F/MC OڠNbŚ!<@FmFӉ8^Y dm4+ndB4ll0I^C"92BV`@ Ya10`s^Ak ^ 6h⪲#24s[[!dvQ0$p4˖"ܣTu`B !V&x&Y(DzP:ǵEѴ1(zӨ۽ 6ucQm{M:&u)7U*Ib9KZXUU#f +駵AKs>@1v Մ{f>:_`LhcFic։XQ d ,6vL%9DE-[Ҩt򨿚mk ka>u6)햏Kz߼feZhY/OE,+)$E1Z-.XɽTsVܐ[ lcDf%,38 %A>Qӻb>F{r֌hDK2h|u7j!c4'ߤU}gUq4NƝDYkTig, QR_xj)buێ4?2KV+XǘhޏYa/ ?dx;# .g3 k\D&8XCV8tgf}IoTX tNp-Bj~ƹr8:9shVFLe{GNU)Q<CS5BKe'rٓI#bq0"3Mϼ%!:Қ0Sb[z:B(U cl֤ R&Vo^4cxAsQ%]hZDXkJ匣8r]Բ $IVxgf1'32eC̷`~eP\9K5kM mZb)#x("ܾE>"@bA#%QSAg6imlCnaq`] ZRTt~/~ CkLc} CrD}LYW 5Ȅ>PSn_F뜉 \Ki[$@54I)DGdC>O '[҈W/Qr,Bڄ u(y1HS,R=^Fd(k"YDEP&YU#/U<@h))Fo&Z pN!I RZU ǧ=cV"㊔/o5뢉v+a>tjØYtF(AC.R3 8@rzIZGb 5@ Srq.B@H/G~݊ |a"pN:1rƧK1} CJBp'/ң=ڳ#8gr ue:gluPP璆,A누4Ntϱ䥨d䋳roFM݄?ay1:tԗ iAuEַ=E(`|ux$o>K6dtw<A^30{:Fyw|AcŨ/78I"u'&鑂P`Qӫ^Vh'1KW-η YS({ыː`&c?Ϸi< TnيX۱[SỉDq+ {֚c%YD5?Ŕ.ZaK%EZZJ I|1Okae tю׿%VhB%[/Vk`Y#/k+WNz:bE x)*Fax]|Fe墤{jWv͂0DP6|C歨w+ 5B&V&04,` >p$e%vzSs<m(P6ɛ$VI.mD | ,ʔy´KP?}QEkECc#j$efkYüv|$"bkǚ /qOr/Vj׎ eEFFKɽiCZEa/^BZ[o¬򖖏!I5{OyQ_$a#M9r2ښ4B݃ "3-#K/pҊ%0 "xN yb|TҜO,/{Oq/? An:ǰ%MRlNӠ`!ku3'V۝F[HQTp݋$8IIyA ^94vzG`҃/~LmԾ 7 tbNobnֺAˏ{`%fg\jNࢸU*RjJYzB3wzp^*f5N/ r* ߘ9^8c|ns kD϶? I̶1VcI;[ j`/,@ Ld$՚n"?M`;s'n*t 5[61̫[>f6g|*1pSԿD% V&_4űphhM6R⟠d%?KxV'0k8 1db*9rHk~)6KnV380e5@x>YPUǓa0^-hg*DWRš괎rP?=0z:}?p.)KU&4(yOxpiUsSHE)M\N.xW_Q9Mnavit-0.5.0+dfsg.1/navit/xpm/country_LR.svgz000066400000000000000000000020531264204753600206640ustar00rootroot00000000000000(zHcountry_LR.svgV[o8~ﯰܗ6\ؐvJ#jQ{ HCVm6|~QT*EK0qV$!H騈\"ąğ77kuLnB`\ !N.+U*b\EG]^'u+6|YŻ^trOZV+014Z)3e^i/yV<_MFѡ%uV6Rtx*,ыh/Tq<+: 1YOIs>f| 1A1B6@:k\.qQmB3}gKnC%OrGUߝyA?-T<({V06R^CMFTF߄@pSVQx/Գ%ހz/tG:2򭄱٬-]Cs3Y=Gh 9o::~MaH z~-EqkftbόMgyD2AkZbS} gud3ذյ;eE,O噿q ;rWiJ!fcCgœC -ss5H-ǶEE.sYv^Zf]}' %&^UNg- 'Wjl ݡ`CzLsǯq"ykR5R|xIt98-+I%LXaSۧbWdZԁ|u)iWAxe"s&d:]؜/diluieǢ_ڥaI+C\??a&=Ӹ]ƃaY&In׳Q";Z\ͅLz*́.A !H+o9#ޛ:w?ḻanj/>xs5^?=H navit-0.5.0+dfsg.1/navit/xpm/country_LS.svgz000066400000000000000000000027551264204753600206760ustar00rootroot00000000000000(zHcountry_LS.svgXn[7 }/{ـDDQ"Ӹ6`On&^;$N(`i!\}x_tfZNf|y;sv.V٤_߾ŗ?d/[٧lrizc I<#^>3)lvv4$Sy0u7.jg4XL/rkTaP,|#c31WK0!,iU"59lUhj,TϢRIŚU ?mmnMjiV!*[1k4 Q,Q&CbVVdL5wԐpt`4nB9)W*%H59&o gRcVFP*xhM5d $X@VL[@8KqU)hӡ6/ TtˏwzyvSV= ɋߓ#0bKfJQN'/|fH4)Qᖝ Q=cIhg&0U`KS*e7B`i3+jBМ!d`cjS)gˈƆ*-Vi+ OU1[,J{2cy^[q7&"os fCpWqĠ_OZA\jcOAàyd0G(#h Jiٹ`^pOW-cfosߓQ ~ɹ:tkBeLBnEcn\H9Jm V#nOrD!.q89zO0r6u8Ÿ]뒀,dZ&vuT0Is5dWP "ʘm(Fpr4l`( p}5+jCQ3.HeG_ˑmX{d sq7_ Onavit-0.5.0+dfsg.1/navit/xpm/country_LT.svgz000066400000000000000000000003261264204753600206670ustar00rootroot00000000000000(zHcountry_LT.svg}K0ཧki)z`kx{ LLVLFha@Px^vZђ6XlR[k'Bs7QJO 8%lki-tF%L)PH B_~HG:Z܏aw!UPqO`Bgb m!#navit-0.5.0+dfsg.1/navit/xpm/country_LU.svgz000066400000000000000000000003021264204753600206620ustar00rootroot00000000000000(zHcountry_LU.svg;0DZjbB٤p%c؊8"h4fwG9GXnqӓ}j棅\V Q۵%]JkȕMgb &0IKG9a/G$[o]ҸdPǡO}i?&\ʫeŒʒRSnavit-0.5.0+dfsg.1/navit/xpm/country_MA.svgz000066400000000000000000000032441264204753600206470ustar00rootroot00000000000000 (zHcountry_MA.svgYmo6_!_Z̢*b[` ]aEIrwߑz4I8ݑ{9^_.3BUZs l[*8͓'8̊\_=U3˲`r^Mhnj꺫uL8rU*+ ڃy4G BErY䕙WGe7 0cD..X86Kgw*xh*,f5Uź)=~+:-(\];a@T*Tvr3'MZpVmY, V[HWTy~V*ܾ|¯T6fbc aebkimk#;+."Ii8mB]EuZקVy:Bר^f8CXA'X m8v6`mYM˰>JgYPazRâͲRñGTOr,Eob[n:چ☹]fE5 G!^A4l;/Di/)kozu DX&Ƅ`c|lXwJNQI !w|_<vkNF0Ty3UU0:b9RpWNq3dPNqbOr3l{oOh l$a 1AK!&ʎ&,ίͽBR0;8^| t>_z_og oƉu'^4|] So U`5!e q.dƪ.2Uj mugE߉)"+ʹ3OҾuy {|:/6ګ^ڇzv($CcT^Q 8HkP]2=e­Ew8̒!FKaJw"fa^8 *9D9GL<raIOY i~KfJ6aӁH8t6G¦):hLX=Ӯqc.a]/0NA\.O/&Gf! c2쫪.Jk,$uZKIi,?S,4/rv\ ο/ATLa~N X@< H %#OF`&AckJ;~NSw}sS{B&(̀@~OJ!CA HK1Py'YL~R YL[0I*uB+.=+NP6V Ij k$^ZF9Z@RbwRN >e70y[S) v.\,{J504x P Z 8X4(DCp287YH 7HpFY`lp +Dv&͒R fxG4#=navit-0.5.0+dfsg.1/navit/xpm/country_MC.svgz000066400000000000000000000002721264204753600206470ustar00rootroot00000000000000(zHcountry_MC.svg}A 0EwƵMbiJ;&H34z{Sp%/{vϻhWXF= DػI؝֫6B8 R*R]IJJ)2F~w YmXa#%. 7@eY5: d,S/9p] navit-0.5.0+dfsg.1/navit/xpm/country_MD.svgz000066400000000000000000000576611264204753600206660ustar00rootroot00000000000000(zHcountry_MD.svgսi]I]P]i[ me%+# Y wvDsduٝ=cĎ=>y8~7ǿڋ?ߝ>?˗%_/OO|wӋ~^w/WǗ8%OE/q3 =cNէ~v~9ms>~s9Ǜ)?߼돯?|:_~w͋b? _o^|Ͼ{O<Ç׏o8?}~7o_}w?yw|_~i?{_|1_߿y}o^;Ox]$Oo{S{/~I}뷯}~_?`k]x8÷y \x†3zwjKeO%~s^7ûןƏM`2>>bu/9w޾||9y|!2:ʷ?O?W0>}>}Oѽ~g7Ż^\?5}t~.>}G/_?z>_a}/m%ߤ/u/<i_17/_ylNo|~G9o_}zĚ?_`5/^I Uy_?y?lU^8ٕ +Q8j=H̅D|^##6|㧛_O?|⯊yqo ѯ_}|}x߿`o\0§ew;'8sK~O<߅*`џj#9||zTt!$.D}tx_קs9]a?|ӫ_~{ss+׆N?էū'ri%֓OCgw6ggpӖK!C-7xB.SxŞjQǾ3c ZOxNt gEL_龕~ƐyN9q~`=Ԓk S^s? w?“>ty9|\b,w;ii}i@ȿCМq#1swVkS9|c$e_}@>zL1&|zhWk}̙FkreMxH_Wl@\ xTobKƋa72r9ۜ}2},\9sגo\Ĺ&dO&͌U体ߛN~{SxکxR.6fQ/<;<`Z+qIEmy9{q}Q{\y:ȉhGqCڄ›3)3a!xWID.?ܑy8]'Mbs$W0]sbPß$\L qbí©}im[k{ y{֚;kmZj[jmn}dVWXYZpcTp0Ii#s,'NJ9I.lN #6D{ '; 1%fE%78J+87dODܯeX:mqX[r#<'p0fc|+6 X9 *U}#8_O%@ *n 8 *xH8?4*~=V X?82oJD~oKAg'1>ʹ㌹UIeT4]1И3|dmx01F-$d(I  XЙOP*>4FP@ ˌW.'a IO9'|Zg–ǖDB7Fm)METuuh48p(cP5LyYIP =\ŔR=q]u<߃|?ׇˍ +--ZtKrUCPKD1s1x}#9G=/=^Y:WA@uٝ2 $sp=}9rq bZ`xh6cI͈2`^Ɇt<B[{#x}^iT8vL$qi7@q?PJST|{ b<=S %q"ҤTz~N wlo] d&k䆠#<4.9a!:i1&7P*ԁjBô4db@|lF8P\9A`ܚ{]F;So]|O !x?kY |v\LC˵k/Ҥ O$C!4Y.jk4=UW U>:n/4_rwhe$7*4dj4 ] cRbaJºAzFĜ!.=9d:r[ǾS=4:lg껴$ ],L,)V}uc UdasLpW!$ ]1 PkAPI :_}>4ugHW޶sK=m_\u<&fXcWBw-lYR6)du+I .QC ):袝Ah χ[a Pv'ӑШ{j >ӢoUwovZJ-DQ LM](xD٣,ik46נ_l J2o>;M%jhǡb I{'$&S 7@6D2do˕kߩi|a#Gg  hb{ d9ldsi)<=sj3bnN5 e>(_ܨ=-EJ[kB+NS62^hgbUlZBhHDM%rB'E%eqS<#B[33*˷].ΛBCf@Ӎ RG"(} ̄v,_W"ݛ*XzbGjW6Wwh. 9W;# !~䅮hF3V 1T'/tbS[%SA&SfE?¬y ¸@VhSniL2XA'˭ vY4s%;dP/,u=.,Z-L~*n P:Y2)KZ~p;V$-hENI|?rl K%aE'tW6# jN#0aT(`aTB_{Χ̏5ZN\hlj~I9L_˜9x9|n`okz]Gqjp Xa#M75i|o05g(UEՎ~1"sL4L~*D44@} ZAbc7Q1':NV@!5'7`%RE\BÊa`tDI2Y /FMhtVp^,/fG!LƁy]vTm‰CG(Y20&%IY]赭c,80,@|0V&Ţb_..$ Stf]OfPV(;h+6gǝ3{EaXL'Z3s;Dɢj^d3V臱`{V!7&lh؊8:),tnj3:NR+sԨ{#niK8m:K6 Ơ";b(T xR|Ω4@9I*c*5@qZ|P>c:;6koA(aӤ#+Z9E9 [7oE#PBy*o'ס~1=% rQqF y $pj/L j ( 7$D9m9Q߅J%m\jIzN 鋶5P( ɚ,Aև@fD(#k uX ^S\,&'_*G ݗ@0JP*93-%N= wN{">t] ^DI>N=iy)IeNضQ6IWv{h>* %յ<4nd"`/g&p+2gXz9i?DPCϋQ`2l { eS*A|%Y?*Bh/OLEUR2D !BJN9РRT2&*/L,]Gjx{>1e*͜ ^}ghn#ȺH}Uz̮QpϢkZC1k=z]{lT$YB5x K,Hr83c"d (<+.!923$3<]>^Ԣ${8%@xs1@ލ12~&OT?.7C:mnt8CZڂ6ȾF K Xԉh`VKsYtEk$s{lI"ro U~8`STZMՒ(0K[T! "7F_.Ԏtk WaCФ5fd^M盹 sE5/(i}t` AUؘ6=s'I9قZke`!ɝ9I7v ^FEyџu,x(yC\5t0G21A)i:>Z`CF9!OCv`L|ߩstXFB7kF?W ׎ di6^R\NGA.͘Hu8UjYM찘Wi2j)ZQr٠]uż͞ȕ]37kjiLP4ti64$ S&ВP"{&7{5hFV褻1x(Ϙ2?W0ߋVTڔW>33߃%gI1{ERm7 gc c}{k"U_ygDޯ䢌 R$}uSH`vHd1c\Ѵ"%JgU9rLPnR1_ SS}ĭZ)ev(IEzkhʆB%k+? 6y80FOĞ淑5cZyw+)" z̡XK{zqGV} /X* 3vՓb{>P_VW^?L/cEl0eS ;#NUxt~_| F I7#FfENeLDN@=Is*S 1 R`}ᅰ-@'`R43 0]S*emOr1ʍ(m+yȶ1T2% УE "*&``fYzj#]Jl0&1"·Pc/O)nfs`Sڤ߽#Sşe` C2&WxN&Zw !`3\#uP61`[,bJ C>2} H$Te+q/#۔7# Xo88Q잍mxe")kY~ jZ:eV8_]QWL]8U>#{ ֬%(rGv`F5#R‘9o; Yg;_}CqNtK|.k`@9"tB-NN1 7GP2=V`:yz04#vk4wj Jy1,ÒnmE)֋@%7Ls6Z(2.sҝ =X7QJ.UؤrXj~QDJ@*i`Wpo4|d]꼒!(TQIyti%2Qa:ft`%'}YTkηdY?trJKMӳ:.eh*i1f۽ ,fTKL5!0! %áN5E>k >υ(eJA Ճ)_iRҶH)0r~%ZA5'Ѱ:>lNJ80ȟ@P{&ڃƀREOmm7[n<m.{sw`INFp30xc/-)m1z$i0A椃|Ɉ^: y vS#a["@6t;281u##>{$sJv=U n` 4Va1 9c[֕S<n@a#`jYvx0+nGIc*u=hE{(ɐ|6/*/D|4X.6%%1sP'3X{2o 8PYjX+CɊ\#՞le.PCDAP ؼqM#+L '̟eX̤߈HXKS%Sܞt4 y-:p1L Y 9+LI,őV>;TsF.ۿ{NG3kC #Wwl3 ViZGBY5MA(T[(aL 5g H/I{3 Eۢ~Af|)c&c\<)}&o(C4Ơqa!/׃XmuuX24tByg쾨T2`j-ޥa KD&┝:}ގ2V$d}D~ΪASnwNvR sPT\ Y5@$>V2&jdsyJߦHm˧Kl-z x5ff < hLK]+jxJlwy Tfb5vY~aь d,Ì'ʡAvi|}{6lfĶb3t9%.^̥ۭ&"Afj ėV#+PS֙Q^OUx3×t^ƄpqNsiy`ߣ2+C"ʴj9h͸=}yU8?op!Hqu5smծUr*)Tp p·ڛYT>qN: =<3VnVLflO\Vоb͒m-VqotajZ9bV>)r9Fh#ȒK=#X~BQ/5؁Ls&*[+koU>W=^W,%HK~@8l4 ,uLoY{%n4{1uwHv/ʆ/HV}$Y-?7w^ e"=GXspIDL<jxjaΉ/RHf YXjƮm`zb~[.(*I\v:77)l9okx$Y7p4k}!Nٕcro%\miMybį͋Ǐ?GGщO;hwsu۸lٝg\?˫ml`qLZ9nO_}y`GZH.Mk֧}oyէo?0q`wٞB%R5F3l>_W;u i²T Rah*0'>M4t -g%k͠%SYIц1Gm;|m Lg1,DgJ9s P.4wOU Z5+]sQ{XےSGZwV09޸[L, SjVn}{M Iu0((i ZJoʘk)XCX?vV~~%^^<nj7܇{s 52D7*e'`t IЕRXd5[Zf\-2ɯ=,f@RiSY,QV82݃J*LU19TLu|#tL)ABN,g- .G0w{9ƛ)Q, oDә]fMy=8(`n ݌JU `ec.CX9ؽӬ>$T' :YgPTf5ɿN''LdTf~a˽RN+PJ8 a()Ղ? Zexɱ1YU<&n gMb83Lo.**q5"آ5mf` a$)ĺ'0h[8#2,pt]|5whݝ"c< SQU2`f$bh(ѱ )3*SXLP s9][C\E@`X4R盁! o.hG-3 2f6.XcrbB_}${^m-diQ֪v7xz+QrZt3FK}TUj3ijUebe)1q1$ZE HeK_LkfG0 Ӛb Btc5n]'d<ʀW/ݬ4fOC5?ۂShQ IMOC~@UvNf`si |HųO`䕉8MP#&ncʶv %HqhtRh훰Լ쫑1waW 0oQ]~`6*sºoBn֏^|(b)G*B`rK;._v,KM75fn&fޫrj<答g_rug2h`6mh5{ JX¯P8%t 9Y-;(qB_E12oΔUDrBr9sEgXeP͓Xlg1sbV*X\Z!Q Uqym 0J P"CmRۑpw.ȽFGr⨖v@cYIz;ݗQ}qluo(x #Q3<}:D<:R吘 &>+j^bsp1NJ;jJYBNP,=,MVF>U͔?0I 'Y˺ : "Y1e]AEq/M>J>8PǠʞ S [AW*xbTuVekY"ULmݖP@Jr'3"ijf,+C 5d!hFGflǨ#!/ jTFRzXL1Lpt;`[dD_MӔ'*JAmgRPbj»/ WdS8]jނN :KN]+g'N>@+ on][j3ؕBxJ⻧ !nJ N"M M[Zd5ƲR[R͈VAok'`̏LƔ.DnbȺbљj`ra-{O_Kl &W}VP:}L*?dzz9-m~^7WmEa 9cMv`ڒe*OoI`^2WGeg NT]Oytoi{#|7/;U}q~!0Gt`L 0NJū_bfA+;4Sg>Blz@'b8 q~7UlS&ozKr_^eU6-@.}~Ԉh{5OFyi(AӎUΖV7wy4njMlj3 t  P]z:?K+p6>ݽ?ӟ qK,L[1*Kh4 HiQ%.MJT+:5}I$kYEh51U]il_,Mb$k56*I~XltI5 9/UW:PYT g* ~tJ}J*v+U6㣏mچGk꟨m|o(u/g IݳzK*Zkrz$EaȲQ CtrfElKAc6GY F)Yj`%^̱rSV :ORK.@ooRF|Y y0)0u {j3zx58c-:mavM3cK,:rܐ~D?qVJ@10;w?/spM6dxr8J%)>KA}rYo %~YnIfI,D)X o;M68т{L$Ka/ORe 8k&26'Wwaԕ'[Xs!\D,,A`HxےBk[e{iCdjDVıh<$+UOaf1B;-=vdžGM_~7ӟ{n2wpD  &л☨-@?bS1^YpYz*e"ˎ!R۩d"TqIw0@T1sz봀Jӈ:OGD>ƪ@eop;`wRnxna_&~<[6jcTȓ fR'Da^Mq5<ܽѩ Vւk.du./lr30ڝ!޶}wlnǷYq>n~8]lNx1qGMv\‹uICp$Rĺ VNœtʠȒBv'Rѽ ;+ j *I4y/r:p;ˑy?'"ŀ7]NcD"s7(vfgAZkJ:_1{7|[x b U?e+%X9L#hsQI4+jE&3 #FS1qu`"9b,-šPc,?{rœ,}r\Y< oM1cgF{!p`IKy6-.'nkwOL{ylMn]N񚠂]ѕyn)F!Iػj/ {* iBNq BT lFs5Ea7Y`QybnJ/A⢺ Ԏܙm!aq 3֫R' 痽1vMolnOiKk4oj=˨M#9]>r_)wY j\3gEfZcdNd7+mZKh?\( z\LdxBXZ끧mPZDfAtlm LZuz8 *Xĭ,H^p ( @[WW18z8pjf)کWS V{ @OEK87clqaD`PxҞzMةjCdziʭ`6F~Q%/VW)?ho^w8n@P3lBYDzt9ωp%>DF2WhXcZtJ[ح~: \ۣ{\X QB5I,+cjMZy4ܬqV)JaBQI]tFdWW!k[i]0p`B&;WL<9،Ysʮ>j DvRXX%[N_5ZzNr[z\>t]9~mE;(xϡCg>t}wbc (4w8&,Brrn _ 6CaRCXAj`&Ǒ MX+%1~*Cڈw~V*f/j POfbfF@/ q\9% bŞ֐f}&[dqW˟$#F3Cx-Mko^F=z2N bP}ԶВ 0X!y&#{K:ESTRX;rGAw" xtcvE8 b0CHD%Q ڷ55}94qqEvR LĞw-` sB"X=̫h\h T Bx^#]qi0cB9ThJʸ\+*L]C R \< bͶ1MzSSadҤS-B7!K2J:<.OVlrI1m4,bv?>8v=pnu~QZ׭{k%uovH~-2GB!Z?RJ:j(&ñ h ͗X%AVFrXPb=Ss_4NM&qݎ xOg'r3]A.*8 CX>K>d0м܏or6GyOtj"^[jÀ9~κݽ.ovEt%vc54`~Hx.u,oibɸ0I X P! wZ͒Mygj Z(9j鋀Rm#5_OG'H_=^q`B!5VfF9<:'`Y.SEs~`H<#\% Zje ܭ.L8T 蝋nʱl] .RrDnksE7U떜I ?0ylDM#10=.ԨTq^X}0@km2hEunߚ~bqA{Hmk^)Z>!76Ř1sx=ƈ8<4?X?xFlc+^Z'պWEbP+!qeo' :eVJ2NAͬ@iRM[i$CԮ|媬[t&rF6XD ޭ'Z6h1d V\evu'Y8Vg?,{N|z+mHjua刎ZǮ`KOT՝em*V X,Ux5b:Rj^։kKJAV`B3чh8wL}1Du4$3VKpB&r<}< :/z['rԷO቞-H1vLQ9|iQ[Y[vjsF ʩ\lKQeh*sBj{ :%Lc1gd/ 2)+\s pGS,v"x!mڭIU;>no*~㭻;W]쮼onm"س%C-&!$vd+c=HxP;w+!fTlG!U\)"9Ǎi\ wrbo~!YQ}8<ۃRn%73Hj!*Ž#\F8X_b H~}'8Azff,ѝ\*|}'$EPK#$z)6@Y!Mנ&1Di%34FiD{ ȣ 3*PA=5eݿPy9M{7*S(zFƞyEL41$\4DZklK]ֲvf$"EH:,È>Y8Q,pr9eLRP=k΋%ĸ}S[̆Soqrl=s4&,jas\$VLǝtjh(E{Ľ!,O$GzR#[+bxQM>Og`VE6Gj gґzP 60*8&1[$ ۰|~S2Qǹ&/e6v6:y^pc's;\a\  Wed4@6Uk 8쁵f_Z-l V,d$}e4DTu] dk#K|9I^("BHL5ᰁy3/ _YVͳ=vFx;6Y`ֻ݀31gn}NֿF.sbة_ow[#1L+i dy~Ѝܩ1RM&=Hqj9Wt  Lpÿ*c(qط4ޔ'B@zyu(;= JZŦ5k^_Bd5τLfЙcN٭RT(pDtb라OR*@$ŪQ&2GIR+fN'lՁǎǬ> {x=*E* Ct7uR ҲᶲXJ@'X}WODu-6& R5kQ@27Wl\m*٣B#7EBm qO׋n*dqgso6Teuh藴u)є^]1k B"TAJ/Pad̲w2'gvs~oL[n3.L=˞w*5WԹ/Nf|vý2B_>dUXwT T3I\eT͐ǽSzR┤uF*KUrŷ&1d݁ckU yDur=1 vgא"1ff~jCSd{P!x+Uq =ӓ,S5۩vT 3|<+jd#q3b՛cFvO1A|þW}58u`覆$`OrQA'D0陳 e˹N86xk- I*+V[1J}ψnd9V\422S{d}kσMi -3VւEh;BAJrL!rnFu؍@c]Kcbcd:"KRsIhW#)3Gp#9Փd5!N3r};0 P>_Ri}kMx %P|UJ_:+Vr`^M7^Mg L EHP5yYnv]}h;U?T859If2ʃ"FEMzf]d 6~qMnѬ-?*l$<`>8/DM!k nGgiElM3kf_`zߓy90 RaȨrx HJ{aq:č2QfM]:qވQ.7Hof̍VIjd*)Ai跼;#.v.,.v:]7p~3Ыwb>Ӷ'?2,u.Yi$EyQZμYq30:9xU6`ҨDŇ;FJ0 SQDۥF=<3qګnLeJa ˅U ) oڊնB\0rfۈ\5嚊+ɕ )b`f |`Wb(u3 6A~oHc ״7I<  Tr"W>yPsGw 1Rj~lO%"04"bG"4ՑӐ=炈 _ak+ H $gu5qIYi8:gc(LKRrw={ qQKl@Zk 08 qcf ,#Q8-g"YZM:k:9tC_Z\y;ye+&bAR-K1'11M$UN:ӑ  %?sUXWy>,dd.72:%y` @L5W%āG m*~a`AD`"S x4faͶ<jՑ3sZ6})j"f?BzIW@n|Ѳh1 Vf횒(^ )fYyD\ lɢU*Mdm8އ)d->=\4C }&*2= rzP $@!39B;s@T7JNX1sg+έ;~\i}E#?~.LP;^bwdl'ff!c[5wyb8&]>2vuid?0N6n=ȩl90 ߥL/Іnavit-0.5.0+dfsg.1/navit/xpm/country_ME.svgz000066400000000000000000001372711264204753600206630ustar00rootroot00000000000000(zHcountry_ME.svgٮdIw-zP=`I`nRH@RA΂BUbOO/[t<&{۶aZ/}x×w_wu?/˿w?/?/~o}?O_b˗ӿO_÷/_W}ş7?oǗ?h/˟o7?C?/_~w/_Ǘ{?_׿z㿶Z~a]egWm_V_B?8QKR;Oo_ݟ~]lW×oOVꗟ׿7?䤗~o|Ygog]忸/o??__w?۷?yW:kz~<Xn)x1Ol_ <ז%5v_G/y/|ھ:nk.k}ǸڣTʫokn.}}[[gyo5vͮ`]LK_oj=Z/ke9 j`H e^jn/0u%mj [gzOe]v?jBf WvI?kWoka\f9ǥ}--څu#kv3 y}v1/d:2p[5} =51֗ f]ޕ=T:e`Ch﷯}p~vS妡RGc-C6=gZ^f_zbMyiDYW/hc60n׽獿ؿvh/|4AnB2%4Rz~% 9#k\wciuW'hڳ}k<t=ƻP~WWYX4.纡Ŧk `_Nb2!U-naX}ݟ lo=3$k^`[XXYІNJ-)km]k*6V~iY{ԕYcՉmj ZZԏu֢R4W/_Ga kS."DİGSm,5zh>Gi-A:5 cِ\j5F_L/z﮹E9n2עb.oqJkp]f}"75YIvWRF{\lMZ2֍[flکXJºfdɋ]ڗpbcjq6qـh9]xtևcTѽ7{Iq¹)(.]Vkӵm@hiŕ1غGc3E`c]l~,/{+gTRǩLDqU>j=mt}l#hЂQӔoYOjLuS~VSjmW[ު/QMPw5mqX: ڵa1i%բZqM5oᝊMAzty~ -UMLE-kU"+Z&)z]_ke6O؆T hwFs۞cѣ6zm/W-B&-ľmE&=xY *yaC/iPWe h.BOZumk^!gG遟Adlm5{o-v-­ sA\SԾk~7ս4šHh<ݺJ=mFE!OS"5=6UcDWFXoپ,C\۰ޗ!dؚa~JteCNJ}V̜e%wVVX:G]r9 7jToܻU|qP~(xkPZ96n[whvEіMp}/ #ߞyȶ]>c.L%拞zn'-g5 U7aߟ;s3L~n߽G+K_YsѬl s{SSPF 1!zzChsšaĖ֗ӳ]on(׹M}],{hWp$Α۷0Dq,:يAZSstCm>޾+W9ڹSY\Ov?~;+VK!oPwN.:)Ih~Sg tNϙ"( --hď"{wBC'sA_'s0+a޿}8DBɬ{TZ4٫Q̘O5r=9!- J ]_3B:u 4K%L%DN:ؕ"Ya8i^ד𲴘V;<,uf jKP0N~S RpJYuN|$vDMR뿭Q #}hb5wJL^wbff*3ҜiNcA6٧'<'zׇi ]?q}^9p`Wg2ڂ?Gz_= `%L[l@*L-ˏ?e2@}20ImK_jZ#V\G~޺]%$-%ֹGgW@(;m, &&eBJ^Ew5Tn4[U `b&RFfHъYSW:0 4QT͆)b\)bPPUGƏQ ]g6-!vUTxqM$Ed 44C mlc V4HȾLЦ)UbMeS5+[U9^+N*uB^ /)\Jո 84j,XTBюEf*6 JAaS%Z-2Dvx+YS;լuƋsE1 ֯VR[0mq+U _rr)^.){ںl-M'"+[ SRNjc*c->e?UVH[hQ]U¹yP[OQzE^!T$ TjpNAҀ30WrFU3R S*c~jIxOS Yg Y=㏌5irVJF[iRZ|eS5ZݹiCúHI!uKZNdc7ϓZ{d;Shi:yo]ʝ1^@ݕ#AZ:2ʤr%T;r.xeFEu"bh]_U֡e@@'Ӿwn *ؼ0ў9sel-~My4f"\x|42Wv$M9Ayuf\SPdyt{mI'abc`dZ@7YrRvqV}id _&qEik'^ _Pn銘 hGu~_дoJ IIqV ETARvhLJ68eoX=u:n-GKMzZe#VS&TmUgLEf_ZثM\}mulA[yS (U }+QY 9v]gWvE$mnګhLE ˽ԽL%{Gkmwmo@]EQi%+ yByʳ2z8W`Y0ϬrN;e!}e)7oFjVxeq۰®PE?/cĠƒ{=K\YkNBn*k4ؚżpyzMSH) {ejyn|j%,@kT$]W7UAfP.&˒Nl}@Y :6&+ '紺'SDZ5e0-s9U%C۶B$.S4 t5xR*f^aBYOgf4z8hDhTj`@ҏb1"cd7-ٷӽE^6S,Mv#k3O P^RQ`EdK$5H-+Uo`*oTC# guvU=勢Kdhh4)N&\GBRK9秉a,]_:lpOT%p`&шtTa͋! 4Ht-[&xC!qVU8\`I$_I<ʑ떛`~U5_ v]V-MwfaOv,,"h@_̘܃EIۿJ՛TV80,LȝǗ5\Af:M]c$0BޔTlM,z;$($^.˴AJ rJEЀE%Zn( /lCf ֌PQ\@ !ڒ,Sc֦2]Ɉ 㚠uܯ6\ij%؀$X\@dHe;%EnlLM@3өcCVwAl!dm*/LO,v7T)(8ƙo|7*u f h*X",\ƫjST+*:e׶$N=m!֠ߦ0l: aNOۢ*͆Mqka2GdBWv%}jߋX6 aa _uFX={˩ji,m4ɧ}_6Vߘk&<۠N]aSnݣݩg!7~]^&lJW͓NI ijY $LA=^plUYM#("JU[OEgs!=Z :zt hRP'3 Jnz4^S](Kc */>>Yvnt bnjV7dp&/ 6+znH`}P oM~-AH8Iw0aR+*(lo77o11 Rq.-C߇I V%u [ICc~TkP2Zs̰ w5}PV\V0Ͱ;Cs|zXtSD5mB:JIyӾCS6WE[8K&ܜl$}9^)B\Ar@JSV' SC 4eBwV@MK^p*B sʯ+Hrj|w}Xx "&6 @K2\XU9}oo7.+z,JHm4W\+GĀ//|c2>v"Wa>!ӞES5iH.\rbUbd<~}=Uמ;%zﴅ.dۉIx9)ü27xv{ݺβ8F $SSRLGmIz/U%d3)o&XA쏀DTӑ3ҨPfkHym7 P+bKmv#gz.rŗ>E}x0!eT\DR8A(tKp2^%mZ=+me9.UaDDIĤTN=iچLb\(yI"A D*XC+jl' J T"eǮ)lZ]AdUp:89eAFczmƛX=ӛ/7,w}nkRta# ߧ@B}Dme켨:' 6UOpA`μ9%J74u'uo^K傴5zu=M1k̍ C2ȇdD 4t2dM+^>{.O@upj< Jݼ[بR-u"f* Ѷp1Z^>5k" #s cS}oT^q,rVb@5mZ=maC>hu_!Y|;0j=1e)W|2'UU.9;B$ڬM*xƠ|v/ 6z "J.eUMlHNA܄4<,g"̙PEj(V)G2G%YIERջ' \roK1*:&ތ:+5;lB?jjc> WW jLZZ(:Y?naӻ#a2UG#EKJ*t8ϖlkJtOQT|@9 cD'nKIsgHޢ".hITR;$i2^fhpuQzV@衂"@8*͌hGɤBv]w: )qW'.7݈km/Ie&FZ:#BIM%!FUoH]e-PpT=MUlD(dՁ*BsSALk+M!l٨O߆'%OmI-ub{)} mՅM`f&dE 'xfISSDRd֎ʇ$]^|% ڦ`'~$vѱcY܊`2 oj0wfU(&M{R8:>q٧A.Yk7!=BrJ'V+1yֵ PGZhGejhL]`M!vmx(%= !Ϣ0nA<ldɇ0\[P(r)dZДDxKLG@ }~@uuuW74J+j3@.v.ޯ|F00?e˄ZR}:ߑZ-qRJ'4(Ϻ`1!̬.nd% >xM2HDupp/7Y&~$i#GpʦMIt/y=86Y.̄-IYNaQ[^0 P2x$cXQ -j螟6zs:I`u۞Wtl#.4njtm$*+A{z6O wҊ-t{Y-hYiOݤ)uKjDkEeFuЩ׻L 痐s`lXW2ɅbY&1믾)bK]]w8/Q`!&AGׂ=Ec f9(nC\ܯ vt 5] -oV=~P1A;Ľ->VQEi$9jOhخX+K z~ov:hqOOCI㑔VnlT͌{B\)''1eNM8iJϓБ6}uGcd?Y-"^>$&`W$\/' j\Օ7w)ond}r:oUdAYbu~! F26%,p܍w#!`yCWI]ef=$ZDí 2+PahYk$LFfnqS'Ç+~Rֶ0 edK'g3mgPIhk/1B휪Cm_SU>!,jo}][ --3&kOߡ7_ qlhuެU!\ź @ISvcV`!杻ڹ}(]aMBf !ZdӌJwdb9I1\г|/:Y|Tj"?w2Q2 P>)>}HFSgD0PJ"AIfo>7GQO-Ni|cgJfc&lOs[BǬ>^%5ŭ`SLR>PmFs@UD?N34\p\Jz |xdZ 5hIA>ZҶS̜q@d8Y6@mVC K @RpXV"D xg@~pД#GEY %ŽMTFdj㸑2.go("i9+zB3LMH41TkșD7qXcF!7ׇv9]"G2>i_fg_(`q"~g2nZ+FH!Vh(WBY/ Xln90jGㅆjq$οvX\{O$yj %6n/yvrxo; izhk go(]<< iis<c*p~5f6WMΤQn>cA{+\Y(ga,M(4E43MBmbhh6ȧLn=J7ԺTNaAߔCr+67b/$坡J!Ś-2}_tA7' TKd ~~Q'٧|mzhDV7zUx4# /vPmak͊L30n/d Nժˢ>c® =[z[kܢ'ԱL2MYkp܊#HAu⧰ܺ܋=iwrg}{K2ΣQ e B "2lfUjP~,gB/{wif72%]lpJUB=r燺;^/u^MFQrn>FS/ҹ$k͝Teaa g?$nYQC4Н3'qq5*ڬPsNIK8`sn$=w6Ɲ)!lX^G6l' zFôىG(ۭ#4\Pdhqq<)06\T|w(VӖ?C6l8/JČ%u莛JLBZ|X=(+{je@O %!ŗUUۘDGT_ձL"ؙe!+~NhSņsߠ6[52U)qԏ:j"G6f(m77Ϩ۔El 3 λ Li`nywj'10Ύ(:k (Kg+ؚjc+TӺQX6II+GplJ7,ޓxM+leQ+uv1C-!ջޯ;t eK)ґikEdDf[ s~x$QYdLIkvZH)#Oj5_F}r?8L'+>o> Rq"FH+u֢W"0 oY}[[PaQ͊M(Wي2T!S$q|ɶk{N5jOش ^Q/w$l:bW'qOu iGrYE8&Yӫ?cԆMw$D5BwcZihKAwFmӋJYa'RͱT,Rv~fs7w~Nn<=++-adjlGCI*2M]u_kAn6*n^vuIOߨE[;1RʆH&g S5f'R&-xi}~6 T0D K )喦VO}еc]ngv2p:W]^hH6Igӈ4dp6UAJxbj29jk&˃6R1rEeon%5}1 E pL.ƢlW\(=lc|.e60I;N``Rߐ_[LeLeQ3aANQlJCYF LLJ k҂6䘽`·i*٪7vXd+C&t.;c[ԹtPq(3*UDw[G} I1:+2Uh_E洖8z֧uqБD*IsH07m~?:Ӿ_βfn90vk!º|A$P4pxS)k[c᪼xJ4std-VQ(y~d/W sU X~]߱% JLV{'g]_]\7=݆nR˒( oj:j Z%N)QᏖcCR?*!tK!UY j+Q#.I:1X5߹_d8P%o(RADnԊ,jrBYH%z,f^Xџ$ xNQ]54V/6UxJ^eHvS+Q 6TŴQɈFIˁ0_ _֦{(jjC5=~ӷQiZ Wd"V]5u@.M9.[ljRP5({M~Y6g,lE@߄F+x[>W`J#uJA&[+\Bt@~>+ؽˈMlcXaGL,8ͻӾ#.}I690 #Uo F͠Iy9Ʃa~zn t<6 N @ޢ_~i+Sn ϡCvSF\$QyQ[Er'4+g'P˼yJZJ ԄJJ cT'oӕ+j}?b*t9a8섁iO~ıgN%!B|â XCcx?|;4aGS▀BX }t;d?)/JYFmyTvy$fE}wU5c: l1 ?tQ PiuҒoDf0bC@n|+7XŇon8#Vޣ S:&t^\x<Sy"u0j#E-9LΑM`n( ILI["_zddg7缿ewɚ`ùj` pԺBepqV##&!cCƳQ9|UX2HT>bkC$կB{)^e "5cf9}V,"O:CCnL$ʴ)y; IUMO2uGU U0m@i`IjL6>O".kJKǥJ@U%] sqY$'n8# V?u;=F(E(RLrr =`Oˆf#6W-#;)wK QTUL phĠ(%!I@<Q[u3]3DL$I5S`xH`=W}wnNfI*ZTy[%`u%g~z&]ukp SșB >6ke2r9WҌp~!BLNd]M~>-"KNti~k0!~OJm~w-Ȟ`׵ RPB͡D2:4)B“:&pHkF^#e'!}ᛢR{fNm.1FI'7VūD_w78:\X){2iDTee9 hzd\@9xԀpdFI }Ž)D5(eoݺS6Ō@W@l5)/݀5XM,^o*d D7XL`E5&e~0K`YnAAU1nup8 ZJ~ڹp0%R;&QC]\ɫ`srܜ ylSqP , ôaIBGa}WI!e &B KM&:M6 B\;dR%nl5q=sK@7a 5R:4u [E0ELiZc;u:i&(5Pkuϰ*6k'tru wbaMpz!XnNWtb_}B y$QIe5gBu>rBqFn_ʼnPІEѩi10" \@)ڝt u uѺ`(;N,9$sMXg_mP tNM锜E%5ka3 ~ !ۯdN {! lm8E܁g/e)N*jf5dFJ)FQ/QXP;R>0}GR; (9aNqеoYm[HCN;p?ЛfRd0G)N@Ot\}>K[v&%a!ğṾWL(dP"!r]!enZ]+ x") Bze/EBa^l YQ7"ا]a1O-.5u73Pz`Lf#Usܦ; I( | r#DP`F˷O}+PTdcl`*rA00q@ZLsɷ#=y*{RSt='rlå 2+Z-K 6q EYaO;t)8MWX:ARe׎aI=5CY<,'cVi|~fȕPkLp4ZR <ډAev7% d1%WIt <BlŒPmS[MR?GZaxxjY{dJZ>!BD%u*vPpݦ&)9G־E#bwM`g©1v l݂AD*ī'Vx}_G9dͧIm}֨UhTQUb}DFٮY);Ϊ pRwx5mOah W@ۡW!0`R2Q]il&什28 zfrfvʤ#~; jFbaPhIU+ԳWX4&qD 2ZU* {/{@T(w=By*]/]+$B}(i 28UG`" Ix;hpLEd5t5VŞ؇F\P׽onr #8Tmآ*xJ OJ|/wxͦj_.&uu_H1U>,uqatf$4%D[9IB^ț~'ҲqaanPu%M<HdQ)iNr:}[I}O. -[h<^5LʕbDUV2?9O sm:)h4 $ 9!DOy`61c$t0vk)`8nƝƊ7^$2Hn&µg(wL5'E>d>~~nh"jr&G3|alj?`FG2's2xAƜpk N8״ L ;>h-rcTd/H$9=$IwgϹ<wUAGnM88Vh=fzmgxcZvݦ*5$vq@Ҽ0/¥i/@aYӏOgL\6EbԘP2MQ&gd;`>Lنx<*oF v9GUNuw%Ivĕ{4/>"8]/{2]!]QlɒD]mXWѧMI|< 1^7ưb AnU ˆ[kRnW@!I<:خ w99'-+,u)!">2xA4|D .nΔip32RT@X9NMTE\uv0\#5۟߾??{wKm,T_}q5SxsWQL_E?[*/nQ6$IQҠrNnkA?In#(`Bsm@"ٳ(6Tqܞ0ҕxߙ M%du|L&0K+u ^*0dF\R%mEy0Fc=h,njK9Jfkg͠R̪n5| 1 = = HT5SRPSR 戧xo;/.FG:Iʘ0wVX/^q& GV#ZyW|GvV+L5wԶ"3ҩX| MSy{'N^AQqV|d-h6] $HSiweMJ %Sj2ALc)N',蕣9GFm*V(tpuP}EZwZQ9"YmS+aLg,|#L<55-cOz]+Dmcc'yN/:V8RJ:VƸfjh^ Lsuo\'qĘ2P><+(EKw7zs FG͋e`5u#rqa:HQPYUd8 i 1[>f)BTC(cQg"LlE }21"a(,<\Ejmj ["edn{IN sZ) M^{DͨOK$Hm2RIm~TUcܕST)%]:]1}vT.uN]EA>Lg<5U!b]l ܭsr`X21GTx)NmK|MΠ:60@a:vjJa%-NebZ$T`*<\@Zs}+d ۔u2QPіqqw[PnEJ4!xOmt@qZ,>=ϯFF埈uwǺi[Y2#-*gu֥>Q۬ӆY"Ɨ`BP w1&`!X, %i}?N"H&ŀjU lx" Fn; =<O.(Uawwme(wJ>`"fŦjODs[l4{s^i`PH# *{2hzmh{-@LFFu+nuAוǐ=#$7U ']Â֨F K:n_Yv3 NJAH8*; s9m/SIrDZ=)0*$6Eч+Scԇ6p"&&`"`U*LI:Zt)?4ܚ䰬1b)9>(0L4nw4]>\%c+bxD-VD_$ +ynݷ2xɅI+ ~9p#~ͮ{es5hgȎ߰hj?6E(I^1 UF"jc`ƣ&)T<@,ֺ >K۩*>@@c;_ +"_qei Ӊakw[ %e=٩LF FU}dpCAfOܟ*.3E|z>Cmpˎ>"KGbR?VYYY [$"JwI`Yd?f=";iqz 17pfM.hW%;ϱ+ #;U@z{n1o 㫂e>0:XsEIp4u]y?룧ׁ%MMD8&DҌ3Y` W^n\/ qbEADBlIĠ3 ҸLV I7 dU֪x3rh~3Uk&_KK aGކ1kWO&i&A}#Ie+UF[z- ԭQ#u+%)xtH@N]]hEjMk.f\Ů1 js? t-ΐJ6%_6A亍Φ"&5aQ/Ƈ:SqS.~O[,jC3>h*O(Ro[V1 ;afX.a%mKx“EgNPI/SXPޮ p_i_4"9щ.,~w͝V4wPT#Ri'ydW0^dWА#6!n;-g(vǟҜR2gh1ڧg6ER7Y?E7\7=i+WVQ+s{gpJE{ϯ>@JYibbI9˝\PŊ=NҾz*$t%=y2&`ʰfM:WE>G=^2Sl-a.g K) d\QdYy%0 S<~dNe"DҧY֜`]$.NU82%ۅ鱭(=d2vxy٤`r IA^*tȈD$KbLѕLpᓊ ,ي4O$OjaUQoa%^QU r! B$u+dZc(kMJO7@-|zoDTVެ*G;<u!NW7oD/x)(McQ'X0C1-({j9^o;#|7l´*;"kztR +2r1Np䁎<( 7=Wi &&;wjgͮc"_lTH}h^aYխu*LP4?=˷ ^Xh 3;F(rN H7S1ܧ[7ɀޱSȏp 3c͉iBW[:hr?HS^&CT$bxZSs2ӱ}6 {N&%OcnJ{pΧ-Pv.!{yrA,d\>'LkfI63)$Uϣ"PS5&&pY J3Ĭygs΁_; BLQ4d!i彥7 j6@N 8"#xiƀ# U]tTi٥d4%aQr2 >gvDEleS@,Ɂ2~p}3qSxh 4#$ <0d%2F:T]ZM)sBs 7kfأ+}`N+\߼s#ӆGb]#(4.+-G`e C!3U !"tUIay0$dk8V!lF)9{#Ϯ;\.G3iyۏCc[xZ_J~Qԟ`n5pzL'3^:Iw  \9qN>b<0)kTӕQtjۖՌp'UӂӉ)<ַ쉙h֛LM4ڵ7N6.u.2XLeeF^ yw}"_ݾC!SG}zJ۝s@s*"Uzm;mlO4=2>Te];i٩NE\]d)bIlu*tџgi8䗲&$1X߮(c\Teq fabXNEv+C/]VK֨s}Qqaɵ7({Ѩ}2)YU"vV7iBtKDn pV8mU~`0<#ݼD{IBRl3s5+y duqEv߫+6dT]D_kw6upXOݗ!n@dy@: Ytڪ hħw-0VLFFRX)IWkrvdU5M^/mrQ1pg^S0)\qB-YpD@p (G!2ÈeN)iՓYC3g&ð$qM ˟ W .猡aA \I+$QžtNAYTŦ5QԮ$;ce ‘h@!TFZp߱R]T ۧhOzR]0QܭZ&ދ 8з](WB wr:Y{b kP=h:EU6qw6|Mh)VcΣk(üYGQ Qslf AM19L]%%=K͠$(!Q >It+&%v+QSF6z&*FBnîB<Y[DWhpu&qܟUx̒#F> P/&ȩN6|1vLLYyaV**afiUo+'/ U@rRMD~ӁJ+vh28S@ij0QN~g>G4rh2'>ݯ;סYլ"1kG`ɊRHNi)LI%jnF(:2"`EX4:ňIM" п R5\Q\q8r6NpbRx n5ʙ⢗[ v^ y; 3v')~Z!'4Q|AKѣ@mmۦ|Č@ځ4I`{s  3>j=%]`wr3;z;boʒ]ˆžDfVCAm+ PU@psGtefD c 2D3Q_vp9>뷝 @PRd^ ժ]zWvJa@cb!v#rR7agB:w&Na1x}@CWo^B%sֵ~v( z `$l$ @Fⷓ=R/bYUh7YnP#Et)Hm&@W7Y N퉄F(In߁Ge efMT+ˀ$d$*Ь%Hl5tJcBtw`hW vc>lȹw/?>6[sYшs'1 eOFrӾ/xFp} 1pO}1ZSk D8oF &<$E {ѣg,U0UԖ]H⃋IJ栥=MA>Ft8zt׊a۾lVӾ6XsȒ6ܶ)Q%{֝l{> zq cT")v &lN\ HՉIQ,av"e,1 6RA ~;ޝ|xFt=ٷ^ziJ<6Χ|{pۼ,Ӭ̼wsZ3x;EoN?(LSLL9Y"$oZk: NBQސ_&-- &"b? Y0m",~HdXo ~]7^$仜|m'un1f}nBK;.zmYjOnj%6Y~"nr8fW//])2u{I y&'fSpern[Wphwzn]n<סs % ]C.N{OTa5ZB;ʱ~6| {74'HRjޜ!sٌ 55+huz;ua]S|#jGgv0STR%KCr"8D?ޣϡl#Y-'tp؜gsNt6HF1wf Jl51v%a+o+1|3?7^V"ஆƖjaBo./azi-!U*dvT"âyCǒAy4= Hd0ULѺ]f>ԠY~ZhS DVQ}r.%UԄ6bB?&8W}|\E|z$br>b<zpI<顣|n|۾nݱB#44Ծd/@!ro{~PM.TYd2v{"k k`I)6(Z@)h gFǿtT2rDhwHVTxlWr9;"Fr39yJxLڗgMA |xa*,8u5>$uD?j?Նac~л2zM*Ԅ;yjyKQĞm ɡtAS)IF翑jBIi}'g +m$trN=#A,޴|*"UtX;DkZ 9RPҒ*t;;M95\d_1Ƙs{/ͦCyɊ`F)MzhƢ6h~9JAHEY8@HV5OV, i+B1+{@RG"<+sUÔ(6O%adVȑNRLI6$u [>+%"u.;|\Yˢ.k,Q6 d2SdYtAOȥbúJ$ BI &QJTm>_6koSڏuKeCd3[-hn mmP$%_6"㽒P$+}Q ^O}xݑڜbu֘n< .}E&SڔnqVF62}KK׈S ˾݉ܝZ<0hqȈ,(*t$()aSk9iC2|\ЁvV9Pf/w,}x0)]P'#Gth}j&i[!^~uNC)pbBDZ^DF 1 qAWD\c4 ـc} |HK%UQu[eNԩw :Ip$V)֗%΢z 1}uH1XF T:Ubɼ$sHTNB:v-:_uml_QyU˧y{UkC֊λ#0^qA⃫2"q-Ͼe҃E%G@ZؒobPRA&Bc=Vp%] v~: } Iŷfc#Qe &Q@h [g{{Șao!}BZRT7b uZ̤|@ Tyf_rgȢ6"Xs%VIHHAN xAT΍]3eh!%Eaa$ f8I@q l|i :%p XWjNgTyЬXAoD`_ ,mCu5L{cgvܺ?iea@ugò>+Q#gsSnhB $}m)b6'R7Q3 3b ͽz$-Txaar*I<(M/ V{,(uxQ JBD(9գhӃ'yp\rW;cނl!f hpcooxn2*>jH~i'kFS,.^BD_6.NP17YN~zy6Va(_x =D*)ky\7d0Ӿ,8kqoA]\>N2|R#ѝԳiȄ|YBm=^31^4 ;GbWLouaz^WCK񓡃56:˧;,kgGRq <1jBSqVܢEIsΗ|`c޴w{X hJBsn7)&D9P:dt^r 9;>+sh616Dz TY8jqU@j&㺍RƊii[GI-a9L"f/n;mR;c. ~#a0T`DmXqs<{h ԟ ѾAD$S\Mtb"BwqJ:j xf:.BNR_ ӺnĴڕo'WS̕C\rl&/=@s i|I}Rx2 xSt^˧x <%E*ps76,d:_t^>ٮ90zl/Cg$ɄhdznܬH>Je8In(KX&dmX ]{1( ٮ3<.hQE4{  J1)*cS qae^ӴFfdeS;.%Lw(C aYh:M)ؠ0U氳i]&}Ŀ/+,.s۶2?)l/PN!4ȍ1?|mP.ykM/NBĐ5pM@~;쓒PFFauqA& g:8P:@B'[HP0UY|>^@|Eji^NMQ )~D7UãF󚄽nVMݻB/LU-$T8WpPdŻF#s܀ιonEC?' tFW8 =(k@{cbha0w NQv<':l( [9Fmx|<+3FTӥʚ= <6Ů iU]MFIseRav (ss]fKwP*ewV&\-03@=Ȋ%:UJL見hN<BSW.=0Xs !10#C11;F<]H]X(MSAd*Fa7QiYKe?YfiQIƮEP @9l9I;ՈEքL4gd]4ZW;΍FZT³IG=@h 5{RߊB;i+yNw[tvB&pm Vw4_> Wb??Lӿo~01zAA{/jN1 B9m)Tܾ vAfæBi+r*4#_Nzqퟲ D8#݊ٻ"m'yH)ta~ ֑SF rcѡPÄ)rz,пrd:.b5qėx;?l$*>ԁוrJy/q/,1!,\U\rEqd@ fg#09NᏻR3F3I8:0+E3АDCfL<%DtB"4(7k`Iӗ2ݶٔ(ѫ|qhM6l;0vH"ʒ|=8$&hyqMcB;L6sƧt䓹F i*[WB5S}OӸ$Ydb6L3,#ļ>bqƝn"o b0*cPEmeVaj,[ Vv#!Z4X/mŘ%%ƾ9v%*`DW- ɞ%'6ħ4C-=8a& >ix n>iN P63&ClG]>dMÞ .O~,zܫV,i&JD hT;N-j@˻,ne}\l𡟊'ѣ+  3cZ27}et(8̞p=Kރ:ka$QMA/E>$ }N"&Y B]"6#kC[/zb/3t&_dYpzKJL %6.*m;XQܑz%-ξmӌG,pM+hf` K&t{N"~=߅vNY@9S$yol[PoǨ!Tդk[L@gҏ'p:ĵTET,!<}̓+ne6G8[w/T@<qWhAC;ډ"Ê^1Qʔ؎Y?,C̓6nVb7QqRDm4@nj; j-ےLHWtFBVan~Tv,D)ǡfm%(.,j/H}=<6f_^\'ؚ 4nש9!Xjt qNjx!6n)הPQebirQa*Gxcwċ$uٕU-Pĭ: Igjv>(^.rtkFY6hp$ 5 Bj',= NBXHJ)>*g@zF,C: Tt:3'<,Y絃j2N tP%|ݵQaiª™Aue. +U·|e.V`2(Z#'iHU٠@ߤbGߧ E*;=Cm)6$"i6^Vx]C͖߭g.hY q EL+V h$Ri _aHjtmk;XGR1Su5׫wyTJ^s(<|;@\\yA)!l5&8cҿTTH74(>h'PuώX)yE]/o^!S1UVD(Zh)B/B& d6V&<w0;qzu'Qc5Y&Leܶ憋"epdONвeqiMr>iʫu)<߰ Vl7uv͆Jkz6)C=-n&*vKЫl #nؐ)MH%j~>5QeCA]vPׯD^bFpֱoc!t}bhlFABWlF <`|thVGVNT AQs|?F]滛jUM\Aggw+a?H4"@LHewWP"~g2E0[aÝ؋Ԩ"g2e/4ZKmXa뭿!#L& {C;,Y}7}8]mkp°m$vN8imv˥ˊW?NvI8Hˮz1o"-QAɮ[%:Ԇ?ti !c2e>,.lA{Wca_z=vqT_iOWHFݔPu6ϕ{~;Њb~±Wuwl(>YjdE 37lFK՟\dc_\B`b2{juSQ+VKs戙e@$IOf-\zЫ&!tڼx6OIqr22 SDHn y(nn}ϯ#*A˙Dde!KLW#bҎÞ;'ĉ2qybp̧\J\&dYYOv@CՏ -yRKdEHj[U/S2CΊN #9K `LkH j&Tw$ /}ۀ"S Mح)K!^cU5+ β II5R_w/^ϡzLϊ1) $@JuӒ8` sV;|*o*Oy}M@TӗGI KJ΄[c4z^R|3#&F~㈅tN3S2drlNj\׻{ ٛbx{G9kker;+T #@ٓ+Z>UQUh@>EH["N.UzOP]kCnފZ:mYz`HíN(F:QqtK~><2x a;ϒ1`@ J1]Sƣ)8Zu{aln뷷4_l$WC^XrH)qjϹG #=AQU v k35"{n@|'U?];S'<75RKD$hQé0*Nh)m:Aڞ~\A7 G_$,a7iN~O7.3Nry Av'w;*3qa (l>2٩4"D20lK/;]l녖^E$Ye>T%,d%B'V?],a6 (]X !/Gd&N9GϥruTi>;!"m(:'HgP%C +#cvݥMG~򻽆5a;uF 9u꘸PMA[ڕ{Fd`Z{ʣ<4v/2``ӝ"OCN8bT2UpS!6)y:ac--!%'!a[tTWO~j]",,@@j *u*9a-xH 'BY]z;)]"'ǃ# OS#?t6iVCS3BNCdV-B_Cyp_w#Ou"{}[SxxWt&ḋi\z6׹h 6C<=P|jڢcB &ip ؕ2܊g[kNPa؍wW@jf/+Ќ=9䂐JV!%ڒ?Ke/ ^nEEcR:YVJ=>RXr2^zM?Qg)8eUn **yN85kK #FOI}(f+%!n` +}U|zxwF-/t0"ͳl!uysMh0v(?yE;:=F_5Twm +ó@x!S[XSw@(G9V[gX.rψ=&2[49J[^mՆ岔k2-z=wئu2="Z,.ĵc uмntQO^Jbӗ)%aS[ n0sU#ⓐ\3 J^9]l""EH񎬘6Jfo.nWRVvlUң+E[K"āDֱf+G'U9) O KHU:GeI{Dg6k_pO,IΤ 07մu{oHc1t];l~UZ$cj` ^uQR-Yj^êo7=G$K^i ^0I5"hő$]^<0wMXs+yܬs~h~4zl+F:s;gn+şz6UT QAF4JsS6|4@7&dc :,lBpcj$cˉ@ås*V-#- z־h/M}e.8' dFeSK *YP@$NEY1 nMH _;FE'_OObcp%!Pĕ#$IrwsK'I;y am"J}.nדtW|GKP:sϞuEwe\(`1~xQeOuAIVNb}1W 6|xs;iLF2NEpKvdy@8t?05:S6Y'FY!Iϑ0b LJ%2 ? 2l*=S&@qLv%^ۻJ=%zɪߦ;':Qzd[rSܓVa|>(OE׽k/W^/W=V+ÌJRӔLE|'ʡ bJSP9=&<\sJyکwSQyK痃ԖSH~xtO D5 L^sUzkٹ]I&i(_"2WO]I*|:|R5iPQ,ճز*{*4 +wx|s7xM.Z2S*u_Om4J^s@ZF_Is%5)lLhr-j:GD!FN/䐦(N(cH ;(ה|ddž`{qv?t>f[ki߯A:HÑ_0TS[V>noIɹVVXT.XD o`9jgE0m&ᓢB.TlyIh9-- Q)eв|D"nm3L3OD?2a2Cv;Ơ|9G啳#U%Oϯ$:_C/`A:0./IUKd4*E1r:ў|"A$(0ظ hoz?x5S`?#Ϣɨ媃A  _ffoI6nZ2O1)(**]XǺH?.{Ppm 1Y1oqp:@ZU'BFy?5g.xf ngv|ݮpب?Y O@/IO*'Rl@GTS :&2Ga{_-Ŧ_taL3\gn?Mp&;ۄĝ?q8$fFȼ5rר{akV(#&Ug}٬j矎Aa8EO`󽟞O˕/F}yOsx(>.s1usy|;~x%Χ{<a^nXnavit-0.5.0+dfsg.1/navit/xpm/country_MF.svgz000066400000000000000000000004211264204753600206460ustar00rootroot00000000000000.(zHcountry_MF.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_MG.svgz000066400000000000000000000003231264204753600206500ustar00rootroot00000000000000(zHcountry_MG.svg}M 0qm?4u t-ҌI% ި o7^. \uG W:-WjHUK4!tbYY59,5UH\E::6$FcmGMKF16`(~X/I^DGC[-KTw8Ynavit-0.5.0+dfsg.1/navit/xpm/country_MH.svgz000066400000000000000000000017511264204753600206570ustar00rootroot00000000000000(zHcountry_MH.svgV]o6}ϯഗ(^nsҡ@]a^Zِ8ٯߥl1f{_,^qtvvSI\djWe'ه׹ئ5ljI֬W/οizۻKw{fʲ(~UӢ`?=#1;]v[Wz_H!x96  "ˮ̂_<<u-&=܃/I!Z,Ԁg켬n6a2V[G|9{ hnKe9F9HVZsْC?ƿCU݌oj_,k'#A BAثC2gb FYQ[ao)O4#C}Z;A(rOXpEb32JI\ a9YJRJ7˃՚l "^ŋ3MJnE*gGdKb@9zg \zˉihkBXHx jĀ^4^ts RI:՘ ҁHVqoȯR&CPb? #~KeS[K{S^FH4(^SxtD 2\!XZ3ð'u=Pg:iSe~8=țY!oҿ1c5Kf(7E2Qd̟d_m{]լ_k6\`5;F&H H(!D9Gzi<'sR)KiyPr^K9|< q9 navit-0.5.0+dfsg.1/navit/xpm/country_MK.svgz000066400000000000000000000011151264204753600206540ustar00rootroot00000000000000(zHcountry_MK.svgmk0_p`0m-k@ :UGTɷ$g[ؒ7I懄57*A4$t.TU\ӓ,`7i>LUUPt&Rf B|h <$nVB~@Ou_nng#@_{#Аb 6g~Yŕt%{6 navit-0.5.0+dfsg.1/navit/xpm/country_MM.svgz000066400000000000000000000110131264204753600206540ustar00rootroot00000000000000!(zHcountry_MM.svg]moF_|i$5gǵ&bbb(du+$v}ΐ(Yv 0SÙ39s_obbq9-mz3ZLFrQ\ ߜO%VhSL:,zY wwwnp.2<<}$ &^&u+.U.oW">6{&WmRTD!C)3>[߶B!z~>[$1n{gE^ O ?q흉|>7o3Ͼh\)lz!lr1rOXn6\_ Bb rQ-ZT5\j-c&b|4hq3Z[{^Ǐ6 UqN/6ǏϳI|].~j|=\#PP< Zt.k%>Q{a9:] 䱛%`m*>/դX57Ƹ[Էx퍫g; f>KYN)"6ڨhUR\( qkƷ 棇bՈe2Pdִm'zA %pey 0l3̋Nb=^͖nEfXhn[lt>/]`ZO7ez+=ֳUm{{fr>[_ߦ~o6X-;W.haS78h^\&rUN{@y18/Oģxۡp %Nfy?b88@}c_śh0|dGb +`?7bph1ŌE\Qs;0m!5G_߲X ߵU9xĸ?2z]޾js]Ǝ[[a>!^M]1b)Wɬewabр}S.8fl;CX%w\M;p޽Wכrf bZ˫uy4mETㄳUcSlm~?5=2+8k<9p[ώq Hw<?__ܿ:' ] ] /oOÃhfz19W` |4BE ^D 20hIHJ6ND['2=ضᐵ;ZaMUTQUs=8# d$'4v^E9@rWErSu*URbQn"%鎴vioA,LAY]6덳l6*5ʇYg!#:;F-u`h'm֪8f_!?^TM5+)\jջ痱Gԁ}v¶Gv7e; kkG-Evɇm:A%\u,,2r ]H пдȠrr`{iQ.- I>%R(lRiUMK$aFjQ|x-#`G>TI)hC<0t40| Op+~J\aAA``)s E825ʠ7,(ha 4j=%@9d:ߜ+s'C>p),>4ҲL) k볦R#0ۍb:GO|h- |!lYE#p ^`Ka 8 zA8М/@& \C7A^Cɹ,Cp 5}xlI?}A<)Dc!='!^='Aq x]7> a0qc`eoN =(J9~o4yV(%sg}oN@lI=U`n̴]{uÇ 0JF?q6|NK4v}SO܃фW˂}\-&Jbɇ 8;Q:'SEec \b"¯sm N3.=uvƁ= hTsjV_"fDdpJ!5G['HuQL TA9-Y9p= e OॏT7?0T)bbݢIG |}Q6YmS\\#pA&=c'!6\XL~5H =ѵ뚞A e^"]nL,- JzUN$L+d/ؠR6AN8s8%4N#5pLb)YF!α!)O,NUdSie-5h.gc`K !>uH J@s0~!? |VA.NjK ҪX72J)OSJ/rLBv3j9`)&}ߎpҐ࣑NC3v"basi.|^օ#ZHX) $q5X 8-DMciY?hࠃ'72#N!\T™l7J xFԭd{X+렋l&ܣe.Aux=+EAȍ"j !A%xv㟪~lՏCS{T,[O8,a> %PX>Sb #իc7Ydʒ@"* JA@QRWZ)dg`3ym!by!>j <2$MX 3r!BXxh6VX> AK ~0N(]>A' Ugь cbXZOFBŃk\MDUes` ē5AexC{"g@I`1ϖG4U._X"ubrbӅ^+H11Ot(O ~6w, KF d >8TFo J4/inD<ͫYH72OslQ{a`H2q36{ sqǠ=,23@*Up<$9|(I#Q6:7Q) `J?1">I3V*Ymj})9oBm$+aCz%cm9ӵuR-@hYL9% =')Mq8+<|{#*)yW#=oIep*,) 6N- R ަR*'ɦ/m3E"-y!nx>ogXgo ~v);K|",:0_cZT+ޑ7N)Cq 5@-gc_~ .?H"|<%""7|;6U챿Ǭm{jR\J`gdJ&>ZO+ uoRPld]m.<|ǔP} .RcSl~{y=Wwǒ$,:^rRcvr'meZxWA+eO*3*U'CEJ:YL\͹&%_E,'{s*1۔t4(y9kT~,3Zy$V?"sΌ@l[`=i&;ep`67Vl+DDpNJV3܂_ن}7pXr[tDd&$fuC#?H&G6GM ;?[vh'5ŬDd yGVǖnD0'g۞̹/\uzwxp)S[N4pg_rl;l؃B/AA Ҙ iN@ȍ7:sC[~BBXSjnd_zTuP,\D'He7(vh-ci۽C{G/t/pn{navit-0.5.0+dfsg.1/navit/xpm/country_MO.svgz000066400000000000000000000052631264204753600206700ustar00rootroot00000000000000(zHcountry_MO.svgY[o~ϯ` *~QC-EwEMR6YtI*xmKќ9sW]򥨛_/㋤gU^o凕_$MtWžZ|V}]m'DzK~nHkۇz}<Yy]IV+lܾJl&Ϯ'Cxy.v}o`bѳXܰhCulYUD!5k)WX5O6}\דS9_n6fxQx;?N-^l_|.Wm>![~w}z_4iV4b2otǻkw2^@ad<m:g3z*2z.S[tw6{1\isѶ?.>}(m駧e5~۟@h!:.w*6}ھ+ۂz!OH#DɳnGbHփ든'5=ֽ4)"ώ>N-.cś3Hܥ@^KP\MUE=\gYk?+"_lg19UuOLAzcg Cn vIbYŌyx ڥOE=K.$]u=yև3Uzl̚;SH\JT0n>QV0KDiǴs,Pkoe7@'9.S" 0\D*Ǽւs`E z&q::0˥H2@_!`e`tA Iv t@L3V*j*44JK9H [J2Dq˸02ZÄ DZa GnPn ZL`/kvLBd- 6J %(Jk&y ?KjoAi LJ{9FR0 6KCX!z[H*)YSX}i!- ,s6" 89lsCC[?0n-\)AVZiƍP|` '`(h8>M($tR`m`$WXE@B 撌)G#%Vh;9 ȏ3}5{N,9XKĂ^D7Fxgxpc|~&LA3`I /Třҳ2=`"̐,d$Zl VSjYFZ+˧RBѳBQ;QDOi $-,2'SSAI%TNKVPYfE nfAB9vY m7Zl7_,3?r>R3!^]hvPH*kP>YO(P ca@eCS3 c7(DNR9|C"PB'@@H*ZPo{b$;X:v;>|'Dj?uGjڴng2}>cIJ=,Ou4$h6Eg/eSޔ;:įm^6Xp7[}):玠5 t ¡~.yazsNA7iSXT̅,V/ݕTi3cyڳ6d{%AXQ(XN0b>D` ;u4FmMUչWgV3̯>7c~[37.#2ѹ5➏`; v3oin™v uL V)ژ q=^lsV7X`1<턋a=u-HD_Ȉ:&v >3Kya;z1Hvs㚈"":h&L^aSaXqԱY6k9(]c O4"{hrwXQѻ"YT#@˗64);!mVC(g:q,iHYҴ,њN hhiUɰ 1d1/a4q2?e9(\HO?ko߽xdnavit-0.5.0+dfsg.1/navit/xpm/country_MP.svgz000066400000000000000000000506401264204753600206700ustar00rootroot00000000000000%(zHcountry_MP.svgԛ[ocǕ+8KaSu(dhC0`^ lf&}(`6XUewU^Vzysgb,͛^\/n՛woz^Mⰺ|^>L~[M~pl}ζL^b& nW7wv6zy]}\mK?×?vn9|~<~8|6/] #^߿u2 M ιK~{ڣ;0A+3o5۬_ѯp}YOV}jXK͇Û̕лIo.hßO\@Ç7a+o. _=|bVtX^M~[~݃N.VWx<Խ$1B_ X~”oįWv5(^헻}ӻGqZܜʎۏLݯ/qN.WO}0fl {חc>]'_@ٿzO= mH; 0x1{hCK<~2v|ނg_vX3]qqx(+'>p᩿pꙝ3h^~\k_?j';`j^<3~O]mlu1/OB=_׫Gl_{ÏOc %5{ ~e ~ՕWUni:b}]][m׿vۿq$2HgeW[rl7={4[>+49R.M#d>&ͺoX㬇$:R!j*jKOcj͓v%+$|>:*t︞1YwIbtN27=14<5f>k.it)DqeFD YM1I)a/}*K0k1: 9G ]0 )͒ǎ& l2WS$ĞO(oxٜV8IQX w]Ygalv5Fd\*zmIO%BX7Y>32##1#WGzEN<%uC3>Yh+Dh^ݴc2YHܤhӑ*l t;gK֊ܼ$#1ZFiĆ&q(%I٬J.8#zJ2!5߈h>>NT_'6i vĮ\ȎswPkR_Yf4eV)f 5$0X:V4i8sdiB-`sū^JÈl>>/Z7J%qUk;# ?YT`4*j<ؒ#)  rq9pF)"YWn| }4K 2bfQA0"܄Jl@',*Jgpc8>׆n"VĘ@qޣRB4%dmi|vL6+."eIoMpJ$s]vQ c I*%FdN9x"ӷCmqE;بL+X& %F2E9Md$'suDʔ3ҊKԜM8+Mq.C+ @(8d|>{;NLwG!)1P9AքJ <#q졹(d"vD4ef._V'!5w`].:qBb򵉨1UD0%%* dFPaGr*hD(djB{xFkI$+6!h@#/_HE(;98#;#Na $$Aeþ`|.`=(aGV.5a;n!6Z_>9~=2OQő5BSyبF*#j%(&QT+G'&YɋQbd jCwV hA;`H\QSn"Bqz?cH`aOh6I/cNC ̀ @K :2y|;Q~6!bsiPS>EzaT\ 8%E@=VW8*RH DK4ByT6I) J*̜`:P,6J2@5%W*!uB#qD%T}x8՜*hLE)x:Ш<]+qji t%8mia"t%(9F"9"-$dh<%8tqd"n^<:.qZHl"]5Jt8!)) `HWwpҠ58Uy bSTIij VH2iT6KW5XTgH pI!v"sT6a$6 l-"TMJMVךmȶ'B׍bYQX&=\_)Ba-$ ֮ӤCW@2n…,ro#GWrڟbrj=}[G=yHcjxEut}w[C4اJdu84m,<CSF)AGU0;$티n9gk|)Z6Y%P*cf2>X~JAM1||$jUak2f;YP_R9l Qf\@*\*2#i[mv"ś\(ñ "*|[߸߮7mכ -E"p?Ὁ'Yǭ@T$  $*FlߺdTG$k68jQW \t_7?z-6{]8~ͩ?}S|ꉗ\*&Wo9}UUB N"<3"J 5D"2/2%,$/Rƴ=Mݬy$$f5:u#kֻ,TąTs*pxR6ώr'Ǥt~V?1`]`$Y3A(LN] bsN((Lyҋ D"th{)z-$M@nW᜚dZ()GE?}{\]t8a>,&lvhɮ=P͹S&q&ͼyv+!b OWpUHV=[P\-bHD.h ؙ6$uEpPF(`(%oV!QVT|UUj&R1US{=B we;UGA" 9X.j9IA A^J!nlmLd~s~qeگLsORNcw,k&c %](Î'jҮp"1 ~L=RxDݹ"1 L5woIfvr@VUZiT0`B5!БG,];Јś'e^|iea1v5ɖ"a дE̎}>2H5̓ umHYY|j`r0 /.rDl*'ts"r&vi:vɥ:$TΎ{5+KR]V6B2TQ6Im޼I [4 05q޾d=Y8? ?/_, sY!nl3 S2#6(uXzғq<ʚOj6Kp:L}zlճƺYaIִ{#dYUp̴SiMuFϪuScK")>ŕ$:;ʐj:h㨚!T YS֢ ܹy m[.JR]m3E*u}zV<&)3$:Us7'δsR!B%MsEr6rX[6E_%|%P"!ѭC(A zo]M! \Qq_TO8:rMVN`="|CI4d=9ғ]w]1v 7ӵ-^]!v@[9 idB:61FQ*B `ߜOK]u1=C4`Qt9nI U5r$bXv躖v.uֵ%n/ռ!̐Kw ScYWQWa!ҧ%P/YdiWNWi*"5YJIP( If3sCz>WbΝ+G˰&C19)$mi5 |+yYXҞ>NjEzݽ-c\A&uph@߆\ L]*\+?+eq|9k±X2W*5`#}$Hq2cL)?lN d 鴭io=ÊIrADpF8/ k iS6`$coht$O"ɯ#y:`!FfTT)_,V_pJMF( }!'N<.Ш0sH'rdHAZھ_9 U;Eu,!~wJt&,R녕,[h,5)jDנIzkRNw,d؉EkN!Lܲ&J|-89np17diܔWMiHUcxdmR9J(dDMDz-GuZh!}h JpxBK0(ӘT:#CydenNDئѨp*-&߸L]Pn+9Es1Vbw(9?lҒW9YF 7mjlE^+JIğzʰ}IVSs8hQegbE`я ç9ot)nS5`8P$s4?'( vzCSD¶IkIJ.W1$_7AeePr >.câ#K"b<ue^ډ-HkD&Mـ80?nY5tտȎBSM+,\/ .G9tQ|a\dO.UNЍ'sGGHq8BDz 2*Q$Ymi8X]YgS׻NB%7D,HY-vQ˖2\)cjLuɰSUlɡU%eh4TD!dDx@b?M1PkV5 jeIb8' -(KR\n v)ԏ #ԩch11Bl,ފX `IHc1Izne©sR\(~^ -PTl[VSnSTLD9Wzš*%qZі$fi] 4Ddw2  [⦉t74@InEi^Oh͗]KR%D$ո^):$H5̽u]18H\Bø8ߢb}P9Ɉ5pi'IƗ7:F=^q\BUmYw9 e*:2Փ7ljN}J xzvr( Eu4e8P-av*0Л1="msѲ'۴-80VN>t"̥Q%3-Dybҽ5\K3ExVE1rK3I$7tQ?a)+Q+V2ggix!pqacp٨y!ɹ^mQ։uSu"֑ cJKp⏱\2+$d,ݼV3FN|?CŠKND\\_ٷ/ wADZɲIZ~LmRo]yJPdo]on,:A,-"Qev@>(j _l(JWy]}#hO:jwY >Dhvr HL/7~`8JvFXU-1)OdU]6 Ng%p܅0Y̔ď ˝nֻMH$%k1z5 ` rҁ0@9]]'MԀ@+8B}X0"JZ t;I[+*j< iXR·Խ7-G 4R;J[MJn'x_` B ҂cPO;h;|FՕln4|;hm$,6Sg [C0elw_&k cHYwf~LH(ۤ;jcV=8ЋK-pű}|ؚ_y|J˲f7Ca!mfwWդR{18KxFIuc @ya~D& հ)J U lvb נ`:-5noDr.ʰ8tNsnu~wU`Ru1kM} wwl77:wă|b0愌@iI(]J I?: L6e`N"U3/T։+@7$y;[. *q9x&g՜灻93/Dcvhfҟg]m,|wtWmtxg6e׍ Aq0jyuH'ߥK$|T^2.*p,S?cf#R\tj$ pݎ fV)ĭQX=N-Zs_\/־鯩Y[D b# Bl-ɰ-MJwKJTNeWqx S*J~CsVIJQ4La\mvԌ}j9%` ^㑑ӹ}ug @@4ܡUrċ;ՄKl>U]w`>3O=oP*P//QAAQq+sevKРۊqv4P QQ:`1wFl|_Lj:pe6OZ{պ w/F:/"XW-Uq 3G2DCL,6ّ,Kv9]?,QD|kdnF0!ƍ^[uzʺC7Tӝf.f^(1g3/Tw4k5s'S/4ѥ+0D}ǯf`0  Z)xRHTJ3(Z uuw ykݝݓaxK'ȝ6rm32Z6%֒xT:6C#1 cuΝ˝o;dH``LŝūR8.-$]l>ݏ>czH5s8и젎bU1,j(ii:`Osrgy$bOAEH9aSz tsg@e&Ǵ;s>.sևbNmW?Ӗw0g͍IV|`lĝ>OtKP: Nݪ8l XyyDy:ÛH\X^h6Iq4RGugw|\|0Q΃ܹMAu.*@՚;w>.w>T(A<ܙpd5c0wҰ$oDKPq"M{׭sEcɎ׈odc6޽I̝!~1-tA'ب4՝?(.*29q9MrGЮCOct O~ Jӽ!/=w{qzo5#Y;6jѪ;j< #$SGŻ )8nnZh|F;Q߅Q3Q.aR)Hdq.AC50Cst\uiqDo͚W$]ZH79F{=j[5krgH]F(w+q)i|H嬧Nu^!UG7GSh+%Jfc=G( %p$icYiZd:c7:#{+7[BO -% ]`ic~67ii#if:p3;1$ZBJKL"nF[amRttaZm< nd|^=V 1VLigI/tG*J9fѓ^z@XEQm ;6*l;1o1hiX#xYE.GK֍f. --H9]:.;쓙tE**Ľhڗ[IMHu f?X*J.^1H};J[cD |ֱiuF@!;-#bKr x9QbH"T"Nm)/ЂՄA:U,3E=ejKQ㉒gڛȷKYoŔR$?G_) f1h!㢈n"鯍kI\Az҆;\Jd{czshKn4iqh*#hoZo䳯q[z7w<݌{!+$Kdƭ^ni*қ YJhpP/Ϊ^&5hyd^+FbhRYЮ´G[M*%RT״NDHvKPhaoױj%8$_shRT(ЀJ3C M%ti3*Ԕ(R/41D .wBjhb/&:k( Ak^:$lގzRkr#5Xfzbb3-ieH5(vJ]E+<~m ,VrG[1 > 4Yzc11yoOW4B7{ c32- P%-x,)%Qeb.e)ߙ&H9t7AVLWֽ,\Ҙ}(څ{f5>LfZgBӻ!VwzҍC|3j%t4;8%XXgj b1jujw\96;-OfvP.`56ZRt e6_*hJc}52~7zB^8oWV6Mhfi.iO?QEWϢ$}L\ e~Ag{Sk(Cu*-np^ KsH HLu`'neE#cu>KˋFAp@ϵ>>wo/Eccd!hD4[6ao#<}D`몐־v%oehV8٥ҊtFplb,t5ڍMa2:'nŴ1zED1,flu6QZ0וSNu-E2.dq8%pw*اhL򹺁Dˈn!W(Ů4VOPr!ߺw NmM/K *!rۍz2hh%R(M}LϚLIeI&XUˀFCG^)gKZ%:z_HGE-!"}& ]K R8+y6t |hh4gt?hWR*ɀ1tq6LFVZ'utMISlBM!w91%[usM>7D.w'IvM؍E|2iv_ Gnlߐ5:Uҳizs\nZ5-ƞ#1hcu3 2C2ƣo vG|ِ=Q$'~;Jʮ=$ e#3/H,L#lL4ahR@ՈEvK? 䨣?dZqU_!%ҝwբq4?q5ZNmGӸ$vbێ{lhYxeP6p4ʊJ &!=lfνhn0v2聾qZZ ?ul9iWu`j8w,Vˈ3㼌qymNF>zrrrDΦ;z)$Sj텧i]r8&+G8OCpL;IQZ43զTиv֑Vun]4]iAw}i^}{yN=bg>Bz:LoLӖǟ ?d~AlAOT{t<LgvVp}4("P{>?%T7o߾RYH$FѴy <\߸-u=fu~n@3rfHe#ElˮL:vud$!PxH{CvVl6KˍϷ#YV~w*GYR+X`^:P!#\DXNKѨb_h^*u~ˇB'uIyA\D*^ f)ezyAy5u^+U|f nQԺDz_Zqҧr.(#N.3hO{duh|x}RRRG|IJqkL{z5ʗ'Oyyfۍ7<16:XWTSe"kPgړs'~WO0魼zߕt*FW\_(CQQ_}tL/|;&maN|ԕ*=9 S /)3qDs3:sKĚOU7^io_MeFq <ӓ\vޟ[mLbsElJ#8SuVRjWz"b}`P\s-"E_ʼnPKic9B{:LN{;O[nkR .YbG@:|s$.I7Not?2?=pJz: /4rS]-ۛ|5M{%e_$et/FHlTഩB'48w5_7Zhn(PK H +O?&x@fKV$ˍ~)d`PQ v:mRIpf"q=Hnڟԛ'ˬޜb,&Ѩg*sKVb8*̧) 5RI4$ Pש`8O~ :`-~ʉ;OFwb|Nx:1"fiGn˭<U8dZ&m@4֙ƮS{}$LlOӷOT8 ~~cs <듧ټq3O[v{N ܈OiQ/|22(H;&O[*\.R Rבr Z2Y?@]! `a E' ^F҉Bb}hO'hFDia8~m1ǔ<}͢.43TZ\F=wU )Krׇ݈-gʙAzlڰChx<uUiDEĉ]uT~=9$IuL{HHŨ՗iOx}:ㅛ9o`lF > c3J6*9U.phk~#KgZ -$8ț^HIbyίs]B}gy?mɷrXI>q(5R6k$?j.֘6uYWWѻx[u/dH PS5®: Oge.({Y(ٳLB:#gԸImfdGo]xG2,ѺpxGuea16H.Jx2!F,\%L^ڼT֣aeWҗVwV9R|Nv!jieO5|~@eԥfBmIowV> TӖO쑏+:EA)MXS}zsgJ0-\faɆ4u^Iv-[MO B DB2+]ӪJv&NSZi1dΉ~3&BK {)X4\1E_WVvA'䵭ez\b9e=C=>uHHK{o]}K[ݺg7/'LaVI u;)-!TEdIgb PL1{KKkm_hkՓ ӧD-!B,/ OO^'s}YowlK(}J ^7=oc 0^i:N@jETx}RM:QNol%3(O^gs}yRnxHn`:9O ^xTKg`6EC9!#q;\k_J;Ju /7J[H8~=yz: Ӗݜ~3!B9Ǩj HJ)pBN&+!0/IRh,[@H)Xzaܗ攜aZ1Y+ƛ3GǡqsYZT@ESgݠSԕ(QDlgiKnͬpTVmR!+Yσ.-H*LH[rPI,ZR b^Q/ t3SWH:=:B? v)LOJh@NI4\JCY]Yl nP6YT YD~]Qvm!NBcL7Z[ CMkaopdnX+k%Q59A'3" х8NWmn]J_n xRXu(eHˆKTC(ƶ`Q2U9cZ њ5ͼwQ6`* j{:SF$d*%MrSZy-[ ,v1(DԠ$R*,=2k 8dN|PtAGuTzX@٥ae8d\{fKbx6xV``df 〪QFVfFP?AbOf!`)9CkQ&0%%` bJ 1TpP3D E_#- C4sTM.ET]B~pԧz;6 Ϩ!OX)VP?rJȨд>9y3HG> j O.:V-˸)]"`dH d,3ٔMY'Nd P)[|dNYoV-ܲ,3, ]h2P'ԫCG?')QIQRL$cć n _ Fj-b;.{s̝%UbekBv74w:*ſ'A Tn_ϒ܌M @CÿDQCr+`GUzwca@a[p]حObl(BKA04Ё7R ̌NnPG1H$^[KD(ʭM\Ȧр"h̺D‘ hMk:hq@ٮ5@ԭ"ؑ7S\FNi}AB >oۅsԿJ?Z7~ &3ඦA`ju3w̦|SYs~rhs50T'9]O%nBBhbEl\?sMVY5/)[i*q|4@ B> `|Ť Q\,YŹ׫EŬbҸ1PTwea#ck&Usv#KirT|:Z BSkSٟ eҞTҫ1>1Y[HWJR.MW]W>NaR ,z!D[ʧmg0_}IoF7?1c:W*[ h"cv};1jPt'߯)-<+]Lmj":7PgY7àÁdIrN;B(4vyX3qjlq6ӻqc &$jzM|+_w~8?\W]CfgI BMFAsU93S# ݎvW$:S\SEzΨ 80j,9_qο.ccȬtu1l4wL=Bx邺N̍D"]alg"36iSp8?bZ}D=l+:KOϗBߌu5byuu7jn][W?׺[WodYW#ο3jwg]*߉u#YWoFh=ӵɘcZ,KOMuth 7rtM e1[C@FJ]JZO6HP~mQ=Ecq5\EA~> F K5 6m`i͓j|eYϜ4W q`@e`cM-0iņψFC}.U/NLo(w)R5ЌY\iNffSCe o⺩C:r˺hV^a0nۻԒ/T}壻Rw8+ A;*Ӥ\8TdЍl|ET]-A?jI-)iK \SuϏ6weG%kI3CxtPrfV}^:׿"~.j)ϬgͿ+|տ/S}_цzElO|7ٓ7/N?nzݾ/YRկퟙ8̽^0ϫR}̍*lM՗}@o/o7 |qFn?}?}Ynavit-0.5.0+dfsg.1/navit/xpm/country_MQ.svgz000066400000000000000000000004211264204753600206610ustar00rootroot00000000000000(zHcountry_MQ.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_MR.svgz000066400000000000000000000007151264204753600206700ustar00rootroot00000000000000(zHcountry_MR.svgS]0|/?l.`ǒ!~@_Qe[TI}׎ avW;;3o o!ARg@W>p]@a&V;ߤ ehC`v$]Ml|<ϓawl[SKaUNۭ*Q* rn$sY[]zs@A)11_s}IL1QfS%dsVJwg,bZ2P6yS/l iO'R5tc̡vv ^K[E t q#sA5FuŢO'|19I?[ .*HDu#NOz _Gߨy0;:\%_7c\,znavit-0.5.0+dfsg.1/navit/xpm/country_MS.svgz000066400000000000000000000156711264204753600207000ustar00rootroot00000000000000 (zHcountry_MS.svg[[o[G~ϯj^&X꨻=1&$} ̉D $e}})r8HF"UT׽m.׫g3g~5_/glVz??[gr~>yg~1yܽ|)wo7Żwmvsݾl2`r1>Ltb~j8_w~{6, [J0r!rwSA੩bȏu9pa\}Ry}w~u1>7b8Xf`q)ۻټߎ[7Y0FH >+8xX_϶7{Ÿ|vP7fo7?moo7_DbݮDvxШvs-7PC3Nq8;@g_l_mPP 8nJoPÆ?׷-&#)|}3_bggsgf[w)'B !@~HofͨCnf{ ˫?W|~?w ^߃#b~[n]-2XN'_b`7˻])޿[?푍]f^>9fvl|>Nl]v*‘vb%w9xI,SSqX b)]?q47lO:Ä1fB0?0UzWGEyFfgwi+/=Z4bUHf]^.aef;)xG.j\#w]0Ye㻐 d#N9B ]xʦt Th󐞁tΑA9 爲'.3׋1|Ē}H]NJ|lLLx/{)-IeN"&73]?Yp f%=ZI|Nb)5,H] DťXWĸMp8YqxY`]*+7XJxX/ }Na@ \ȅ9CauLA\y).^>=i#s<2F5J<҄d x j2 6'&kj DDD#Йшr6#~%Ad8'؝ؤaz&R ph#0!^(Jt;ΆE;,ГƂ(3|C\:ᘣ7?\ krƊ׹8Ac=P1..adIXO}{ɊO^ y \RCl B$ "NWL &"|Z(g Go<e6"!'C!E_ΙH)&f"k9Aޢ8S]AppbcPJI<"j1`u3I>; 3]_J1::80TT \Cq[ !{?Y\!(peD Xx-)"7ӹYx%627QFc,|0/,C t9"{0fJK!|tc'%{Oq'L$SP y7J/nrO]|>h8x#J#px9l[_$\̏yֺF+pl{d<ФB,r aP4"=#-?nA]LrI`p6AE/3Ų'&nj%E:zl\O U.;1'u:-JTrMxBwB.BmiEORĖapLy LZ쪰a4-V"=N~68WMS\ HSR7D Vdg_֔f=ALջ]!{2*o]ꚾ# H=ipHz`#A"5%  DH)/A_* ,&;}H\g"״]0%dQɳŶևjFe0?»Ԍ $5݉(%V閔 b݁.ڽ5p ;#o,aFj:95 ^%ۻ:@vb][ڌ/.<,7-›i3JVA pQ"@T(}VrV@" )L0 Kݳ&D,!TOH|gzB0hW'dIMpP\`XW[0QgOWKuY94,w;hi3B%:TՏQP 17XѷYIB JCIpjAj"8gvMPr-dSVaR7/RG3B8vOy=UdeFWI↔c )gĸӒ!0ݒv)CfH3 eg3R! QMMPUbڱ N Բ!ʧH>1kgB5IPKkpuH;[G@DG<`XU2# T3 /1s^>%=i <&Y !:d&kA e:1e aS45(a^Jff a)W,B{ {S0$b #B$A k>1Z] Gp~jZT.k&gNq4 {]cCE'tp8t :^z_b|VF^ |>+:# t(p]lK ;=;{>dQ*bTiLi֝C ӣQ4͏<ϙO^h=Iɵu 8? pT;cO"i"B] 0Llkrh<~Dﱄ oht, n,ˠ |[QQ v|QTRB3{#LswZGStMéSVغUZiO%ɸFm  =nsNk7 ORm/(T֬u#T7^6 B#̺C^Ax>L e1W٠ v*Ki>h^m 'zŹ@|JmC{>\OE.^"Yu!$) uK*k./Zɕ ->re]YqTXZ))cOP3ѧ>%(r a!ʑ0 _{R{Da ["z9#ĖM}&|9G55iqDxvJ D-]0j\S`S,V@p͕*k3"eC([kġ a*'+7凱*""Wڊq6-^ΥK QNKhBLCWv>mR[`~:ߥ(a>{sC1BLر_T'T{LϹԔ\I$7 > \c.~Vե iFՔDqeV^4؊ߐ( Mw@ (c& _TrDim֦Ł>&~;F?dő/aJqPkq|6Y|;j'd#;$e}d~,> G.|cKFgl ;"*ɖQSNP ѯo`j| eF ԏS| 5yCˆ:lZFz=Ôr~+rxR3<3'GP%$s^!R]/Uu;S*GaDZ['6 ]=|r{n-)I}R#4dGr, PicWgwZ5ޘ@QvV$K%jg )ه\Pc 3g %s Ǘ1vraV-@65#~,/ ,Fsu=k4E71&þ\8w(S*cOqY"`B[%1_,i¸BC~Iq`JuP @7iV/+Qt<P6ھBKVZ©: r#_mM ]F9Գ\FhkirdžΧd۾=tD@oCL q<#_,'/_ 󪔕bMWfNTYyJ]08Z&*W/)~2zReIX )9W="hG\eHۃTMAHǮ&r=\&Rh/ AA']QYm#&.h͆#_FԖyDs5`J.n8lmg^CK͗ FE]u) mMša6TMjbXÆ ;NA[j_0+;a3$\G\ބ -8+ ZO3&16_ޥ(Bѥ\<(*>E?wd1(\l4:4$ó~<#sl_X5*}(& l.q3U)ŽAeǟqҸضJś;b[[ -P8l:_)]vh A/h+N;<wW0,y : yB2lߘz}5 O$5g 7}DuAcOCdnavit-0.5.0+dfsg.1/navit/xpm/country_MT.svgz000066400000000000000000000404601264204753600206730ustar00rootroot00000000000000(zHcountry_MT.svgսK]G9_VM2P`Q=.(C :R@bf<~}om~/딪;ЕT @رǶmO?_}oᛯ_}Ï_~~駷_{ͫ?}w|o^֛?իW?_?W?ZRJ߾x~=_'=޿_{w߼W_wW_w|oǏ7o3wMoǟ]4z4qs+_lq|[h?}W~Sz̩c-m-e>뫽îi ՞c j4{Ew,uu޾xn}:jzmqǾo_^^ћconny9?-Y|i4~782}o]ѧ4Frg!C_q7赅9׹}_P?{w{e.?JwnOQ]lUhweqtѻ tVr4_MMxZшnޟ77~erE3nzr݌$o/sqm>ݠ^sRv7=bL?õGW^_I!>dY?Eqb\3K{̭.tG}Ek~\j\ME[k^}ܢK°^l_[y }nW{AOKWfDzvNOWyO(Wvݢ5=Z~5uMc>6M`y6w`onѥe]%{h^]m/oSY7n֧pEn4)fY_1yq6t3W]k|E->9?AإZ')+6dCC|eyj.R0ژUOh?=iN]uN*mgZndf;G?-G|v~*QV5cׇft8^0~,VS6f:z_l M3WSgO__}ǯ_!=4ӞS"p%-%\xtK}*6ܼfX{Ff, %]gIy %)q5Ic8\b|arҗw?\R?YFj욏)|ΰ?#GEa5&ǪI8PZ,~Η"!J%¬Zԣ"'miæC&)Iܪ1"~]yE1]6Ĕ(|FvϽ#rxԟ؟\PMQVY3B֞leHؚt! vXeҧK䵚B.HdK^.ݥć,X/9=%DzAfJb({SFD<˃1DD%L!2e0tq 7˕dC~8:=hSN/BG. wHƲD=G yȾ9 ?QKx{G$e/"?'.;hMq!dE"]z Aic qm N!zQyEV%-0ۗ m}m*xEۅ$JEێ?#riwHiU3ʳep.fS* 2Xv P?[0C߽|F{eu mǝ$?!^J:_*ʧ z3#Z~>voT4>Dov \:|Qf!H8>EଷgqtX/~^>1of,!VPхKH* 48{wG|\G׌ -ܼ|%*p-y!+vBBسTŤA]ϞJ[X ' ih;҂4xz~OZv&c "KUB⎗ +eHSȩASb2OvWH8@jdd*<M*.VM`Sz'R}~=\[77w6 [zon#}D͟1yy#KG'@?S/یDPLy7ӫ'k7-}}4|׌ +t˛'Gsmΰ?°HA6,mLBa8M+W2|+f:57ÅMO"ɒwk|mvڷɏ e _=oZp*Sюo_zIpx^nGs]}u߹?w]ZݿG> mI7 hs2eI%l,=X'M="MuCN=NoK/k\?^wVO>煿 nvFsy3.']( 2,rao`kZ񸠑l0o[(]{KQmmz[q),ߎgC7򷟊%ؖ7)uf')|~H;V5NYy^%8’ l'ID2gK3I}ϒE~b_/Ou`ɂ/R,-O/>[9WP+A,XfK4 /0 1'%g1p651Vv8Y]V5b2vͲe^zrB * 8D+rĆ`ﱇVwKtpTԬC8uO"SIZf4H20Zʽvg63 *kQ+{iK3<Ÿ"Mw GS&<KNEuj 2]ɎC;`Sn)mSOgd*H3gci!1\&­/nmg(ZN|-bO$Y,RsߜQ6sˈ"yFηc٨oK-uX|m7bdzw#> H"9id)ۡ[xktjQNx^o->;sY,7^g<2;%Q'Vttӌ2%Zclm}|zYqxiu]ݪNw1и#\i`BȘq$ q~a]>Ⳙ=*ƪfd#GNbô 2xT>Ⳓ¤Z(vI冶+(ڞYAPylqO,T}BLp Xv5zk0>  B*yER}`K ,ldr6a5-")N@JZj{yln2bhyܺ]*4I]ҨJRw}g䂍nuA쟑$x73+ at<[bd ؝?TvI HNp"ȒqER ˢFL휂bD'`2IѴvMkҰѐkS+5E*x =Sȡvْ%L-Sm}=δ=9ujP=P5[49X^-H!r^|V4J@iCVg²ֆr%zOrӎc9Vk>0u~_ 1$I0bH^zV4-zr}S[ سO 2i@YZi$ެ#"Αcv^Loy<3KurPOsmBN8Ιᄫ=A<0@'a?75b2l/iyQ#S;,v /hS!5uԯh!j҈݁9dWIR5x;k%XbKE3IkQ $:loC5cļ]#d5<)b; c7ҳ"1T#ᇙnWWo*n9"lk%IϟqM0FJeZN=ҙ,ydySn>LIBX4 +ާf  R`jJ3Kl(W;Bj3cϵ/>a͉Hx=G#5\-V4)х g*j@| ?WγU8ְ1W' +ޗXWfɗOFUȜ&[zmv|tHm[766$pa|#N6/p~Kݚ,NℚZfJNQGlH/[Q+C5٧ 7x2Ÿ4zYEVi15X3Yr!o0^O1%tғX>w gbgR.P{j^z~ЭkF`L~%@iNڄsje+@ 7sX:r^ !kߦD^1}cO/<~Lig|pV>ܘdeEDGK, UbƓ #-w>Ȁ|NwįtZ~ӕL|NUO?}??}ei3!]J=\,%1LT @mTkq;]L?I70P]\:a@&Rer`m"f;I+4zQ)#3&Ԑk:eùс#CRحӋ&)At:qI%S=@eaT gqvId$pV('cMhxOĝ]ŋ}4;RzȸqsW6ff/>6{OSCs> .h=~rkm)$l[4)c?ƞ^xXXGQHrb:1N'g9tR yF\z=g;B\nkRY$Ap{]Y\XFDҥ$ӭ,O.8\<{ࡈT7J@T4 FO=֪/?ZnS).&*IAZ8xպ>lǹMVvwZr:x .k4b/ML̴QyKnŇZhAYOI6:;OB,O͐*9cVy [lvj*k]s$l5fg`p6}B5PIRzfIЪt ,*awR ,>P[x@Ӿ=?5!NYy!49ϼt>&|B*g{h0OjvCp`9w`_mO7zU&=IJv-:@٤prj_|@ߖd/6]P=Rq~ o4v[Gwa<\w68z|zٌ~gP&=d+@!;.!q9N}CkX^wGܔAbL%iGҐ"Iv4VIApY\̊W@Dmkrh [sWx>7#cW7 ?jN IAb |;׸Ixa0Pqj^zOj?'LF{/6i;g*UMُaw]Gy*>跾) Đ=;\Gz3 ݴjcӶkGށ-|RD"q>eY}3(j5nJ88hPX;jR챁`U;I}#4Od]R!G -tsQZ'zphR8lt֤ĥwXq2v&5`rZ>"q~Hn!KFS/ H+ GTaC!RB$Q].1K[#wK "̚*k_䰀=/&QESh)3R*5łѲ"}I&%JUBc! ޜΙk3lylʰ,8.;)OBǹ Mfn3Nvh?jÎrWm"qlCZ\)ga>4qem?O"w"%Λmrq!,G= _puPm5K|%;Ro9>5'k?@%N{0XZ1=zLE>CȄܪYAJt>kmrDwo7DxQ9Yb})Z\iKc~*F#ury&逶V^eR=&Dx8ir@{gbKQ#HC`eszcA)k^9~: @I%xb'gɷR΅if"+9墼 Z]d1Vv `[%{=;ʧGBCg3B -] \qA_,8&cN9oz)a e'yYP= R{ȱmle czffg07VRg)9=Wwm q8C%pݟ'bb:uXx9/s3YH6GDN =<2v(N$[G^ ꏺ>KlpElDB,a6Jбgi5MEɦ.CpAܰ6'gr8 w̪8&0#)q҅oH_ ʪ"h[ *C]tl ]EW:/uoE*ueǡ y\>|nd+C f<}\tļm}d`p,A1rТ nU dJ:jj:(߄y#Ssx2WMDƟB흪-mgU 'W\3 bfLy]~": K2UWBͪ^j) tKtwqZ3}zxSVV9;/%A1N[x"(Ҏ'Ét,ZIecHsbS l S *5 ?>1酾;3G_N~+u|OPN[<]A$ snLӅA4Y`|]{UN۴I'ݐ3J " E$*z ~f`oc965u&"v-WL"԰x[ҰdEy]*SE0W~No C҆R[Ẫqƍ~Z3upU6 ~8uk?d]9+Hkc? -[ 哥{s(|9Tsw_a,Kݾ9}n|w[2tJc+NI8bz%0y)x0;zboF h`pXvd~ ;*YrsV 2ēVħ:l'gyppxc-0.+#=</sȼ2/>}Y!ǽYCO,ѹ1Wrvq|ij浝tg~8YO5ѕ'k乧.yQ 8qHrԇYΧx> -0z{|'ʉ &'Ӌϲ\*C|{sپ'Uj0,;1,sԾ>ҳHRq>E l[ +u:z#|kd=]Ft 83EB ۹rnk6^x&M縼‰nOeW7YGNGgkF O/>{I7[iG͘++vɫԔD!ʄ~-Alq{z]v|at&n9mϴ9\(5 -Xq)c D򋸫dk'isBMɨaČ⺐(-PvIM` Yu5~oV zxD,8Q_0O JGq283E 4i{n:`4.:8$[ӯrqe7K lP*[ Qdxjr/ӆ>%-JBޘ"R6:QX!Me^֤n,Piӝ,e 67"0LC, x[ww3'N.&8ݣsrq3N5svR%<#HqݙL$t:*}$,.}{PIOrS3V\+Uq-0J1 G.巣B:X U'ؖ}`(`ZeS(RoftHjoX"bؤ˶|lcxyDtig}w"Plc'ŊG _^4!xcS;Rtc[s1("8b-P◱㈻7=GK_oksZ~g(S\:5Yiw lGZP,`IR9ѢxpyqE1y#zF(S(O;)c&mrr?uG:<5Fd0FpKF49^'߂m`LOm~ c9mTJtiAs)Ph*Naͬp8wNRAkCU+D&3,(A2X'? c%e2w+iꄕIE F/vg!_K"ZϽTT&07fէD rd1r mݨvUhv H|.]' alE >KU/Dס3H/b/sNzClu<[.DMR'eyqL2;ɓ4_X4Z~s,גh5;/*`.+h߱9P0LSr=;Lǝ} 59#4F vĵ=f.IoR[NGNjpByޖ m.6f}~xW[Hp-.)Wz*.49hMkm<<) 'GWƵ/7 Xѐv)UC+( |p?՘,1RÆʽ`z̗sɉM`t,y1f1ntgY]:INz| ֦ctJO9P*֨,GQ:-$m$iU3ԥKxXJd uVZ6- sc:%jRN wLy^8%j&U㠭Ae&gЂhTe듃`,z#I>,$ߦte:((,ѫ-*SUϴ8p^^$z7WO#VzޔJ>NhqlhcoJ:hҰ$۷QD!TfGׄCTϘg7ɶͨᤍLHbfRqo]]>NjVLZ+.sM%ss, DstJV#y&\Bq@7G`ͻT 7W_>GVIb'vK$nHDgt3vXw\u;GD5kLr$[5.:ooK)`TsC];i^.6 >DNqt'6 OSţ[ R7ԫ(ti頉A*f.(d|$Fd<abZT 욁(CGmmj#u,;-Wٱ -vwQ% šmtEQBuwj}SN'N+;`GǗ&xze춽2ik CԎ%]$qA0̷c>kxΡ.4(!;O!vfdXpSsiU~rfidiBo!AUBO"i9[mZ#( T! Pvj@'\GKR7KH\tX>DPjria—\60W. Yh2lbd*%Ē'@X6AL>@8Ɔ 0IaTȘDtr^'TӬzgjP֧GF,%hOc^m|0) /{'mv/:T`ba4.`ZKss,B^~W0veFG)!uXfȿЌ"6Bcv^‡К-c6uIӋ pCbX3g^,TwwT:QX>gn!L4g{7:4nS:cF"+c3;Z&toVM2Q4‹Yf@ĐWmj/3Q /OnG P4uZ(,#v;*Q"9Q_2⒁Bcd`7T_3ir4l$ "4>`T:Q>M@z7~WDH)a`߶<X9ΚvR,Ѥ`iV5BiُjqEX(U68 :(gae<%$:[#0~VB1S5Vq H-!=ˆއ!K^a<^8fZж K07H䪔L̜0/%JLuzQ9yh!V{Ic[v7/+<.uaWc}8'fyUfᶝ: DD'+`hT8V?Զ˝$`lGBMp i Nb {.M3s2!3읙TfáՆ'WIk0Yf cc2dsgG.V\cg">BPp<UaT[Vk G{M nmuqhZ({gb0}S\zB0Q!DC(9B0V&_Q_+ohnSqJ!5>ŲFRyz ՌIS 恢l&?H\?.0Hv}#lF-4u3YLݔWzvnTNAlF+ԕK=̴"GQ%j}& JR/d;6|[qtke.Քok?0 :4WJ#(R*"h%BA褖pJf%ǫCխ ͻαcNf`/ / 0Γ@`UZݢV.jKG/N`0^}vfcEBvgxt9rxԽ]^ \#E+Nr43E ]N{T9[Y\0jw(u~$Q27*rnwXFqAFHLŐ()Lbt?SkkQOIIH[\Z6&y]:\4MTʗA.0{F![ڛ$TLRaS+QO"uϳ;f1QB%*XXԆ,u#Jڗºh<pmHc'4/rf*@%G}ۼ_P5$HZ9"/RN+@1)<$Z>hTh@n)е"`ɓ̈́gfj8rS79Xɳb,rLHѝM'=HqNIЂuNdbǬY7!&Is ֎P50:[sv׌;dM4%0w˘ӟGŌ1op%SG(}ՆpŃ8i.g//᳑2eg̅ +v1^bkR[%]ɉ .:olxK:4&ˬ8x1hYr4~RbV P3Әqfj~Ǜ;pR;B ץ&dmb`xkFT?-sNtrBĭ-UWyyAS~6ϸAHMjRvn5+&'CBdL Os%{UZ[:vg{a\yHu9 ҥF0#eʥ4EԜ JSt/4 jRdAXHyBɟFxgW4#r'x/! u/ R[}=y4 M}$wvIn1tT +Kq!>݊x{D7GNݔ+X#GӘņьTE6-&c`6+ujQ*l`\UR2 `(G'S$!T,!NC"KaОq}"J sG~393vfߖ*aw J4&냧#+L)E 5xlN% AKAz2iЗ kg4#,H~bBf"G{m-#S!y=lbmB.`^sPnBāc€X̍ SoI@Țd#hT|l\bϩӝ#M~)Jhl䒟ƔPc9gEdR9=!%HVj"25OԠ423+ksO[& 7qDK7N izvGw(>ֆU24ʸwMļc4Hc *f+lAudrqcߤ_uCOssCl$k&~j&l=42qܣ!EL\1Bl\+L;:yJ=Aڎ!ZjgcFq["Ց_4] HLJ>̯PK,GwmE q E\gx2v%{av: ud+٫ًeZm*`z:54k8a#IޤR'ghd\޼x[ulT:vZ{XRV3_0 j8ֈK!,zaxҪPi)dGh9xgWAdKQѴp1(y~s54IiOz9(Ժr&3p'g0#F}iOˇJL,t,&9z nHR$$-ZtAӡGftՄ\b#LmaH L4԰̋lG{zl\dTTt#G9s)B)hl+wdi[7WyHfL6p8Nvis (!pfj zWJ_^2t`vA!<Z.IIcZ 0۔'.~˝5nE]-g5Y+ӢW|Pl }6dqxp}a>c0ن$ ]fc{O4Ve0dS B-9ep,`Cn0ii9C8^@D5Hn# R%$:7朙8]NJQ:Y]' qH9rIlPz" 5n>Bv\x&ixv:Z3 To}6H¸Uߞσbky=;#u\Q9W%cEE}St9y:RND?<۔2ɨ;%Z^wn?{w{e_ɿ?~_ϯ~ǯy'緿MInavit-0.5.0+dfsg.1/navit/xpm/country_MU.svgz000066400000000000000000000003321264204753600206660ustar00rootroot00000000000000(zHcountry_MU.svg}A0нkXH\x=B)M5PՄ6,'̩x=:e?hklx^6JS5RX0* [GƼO"+ QK/)l]+@P+j4 ag/+7?:Ȧ. qg"^M%D,xzwO|WA(Tnavit-0.5.0+dfsg.1/navit/xpm/country_MV.svgz000066400000000000000000000005341264204753600206730ustar00rootroot00000000000000(zHcountry_MV.svgu]O0{xP2$&~/g[ڑ2F=yha%l*C1b2p4v'x6@0{ 98gFqWR짾~),޹(NFEV0BiM4O8m+8CpOq]r{;ڷ 7oxK,g>6;R ιw8za>\>cj?x9k>6Ho g~Ѿ'9WOUM2~oW,Zvǧo?^œ[8]%wqKASc_|ww?^=~}w._!wgo\V==\xw9? }ͣ;F%D LaA7l(]yUނ",7X~ PP^sߟqzB8}|l>Nn׼U]mp`sїpʺX\ }tOJ l= <#\"o󁖇?~ćO[HҰ!o|F U4Tf _˾ost0y>o>nVsN|pKYJ4Nܫ\Lm_Fl%>,sM(1luSXc& -L*UͶA=S°+Nj'){_ l%_ZjƋlf4^ь^_M2$,PrZ cI/@(h(hei\fP&@&Uk:6|tSLM>c^AG2ğ < C7f3.|$c\z2:yY2ԦVK_AZh1c NeKE~S}TkG6872ʕR[@Je.QyK- wM@SvaQhՌnX4V5N dGa3V0b<؁3{w e LBX f]FQer=L\=:KaJo^ClBʏhqxE\\D6V6'Rcֈ8n7Pzʠ:] 3fX4a]Ppߢsb"R*E68jܫ=c-bRC]}ܙKs'yݪ֢P@RvujD~tul:9$zD%H+ZRZ./qv؁s^cĶG `l18- {c!k#&CH!CX ˄d0C=P0qI D{% ㅳq>G]=ѬYIھ?Hf;mf"M+U,T芐K@^eØ/ mFAWҏ(5X6[H@qfa0T(YC۪8)߼Rԇ лZ2U;aIz.9aQ p3p Px&톣 8C#d7Εye¡7j]N9eAtlB˦4:K12^Z 4.xFsr, +( <=qש]c l법6n}:|/'J,UY3L=715̚#zjɚWf(J3ѱG|_"Ԙ{5H" ر'-ٛȿTsJ+|ʴ5lVGoRi-N~Tj5cB.|P+8xU<ꊇڭ }t~xŒ_7|/2v+navit-0.5.0+dfsg.1/navit/xpm/country_MX.svgz000066400000000000000000005662151264204753600207120ustar00rootroot00000000000000(zHcountry_MX.svg[[oG~ϯU^bتEcy``FlIPФ,9fyB~ߩ&ERM[lIƬu9uߩͬzvb~vkuTb2_}WtT-W|h8^hTwmj'tu]}=a9nnz]F#\*,;_NgG}ۻn&&v޴D}{Qwrq׍vnr[s'ʜ3B|<ϷF)uo=a1dFǹ5.{ȶ߾|zlMκ;77˓5] MJ^]ΎR~?mx8;R*V)ں(=7͇{,gGa۽/KwsA֔)z?9_qŘ:;j\[\{>LNjz,]je:dK>l/t,; ^R}ӮV_Nnr5E鲚KiNo~v.m;6G^޴fҬhOW/ӿ/؋Ho.zMƧ0fjz\_<~`Շv=AbPN9L9t63U'ej־ЫeU^}'ȣjVoo^ 7acoJ(ud_BR}uwf=ci.gl:^/n#ӭ[Y^,nqw\&Ǧݚ W_vEgI(YS[3?Cd?˟c6}uI \<鿕d{j] Q꺭OEͼf-,𢮾KH E.JCrli+CXWjj4YVٌC?f>{H3>8CXX10ދe7nysinn1e/^3Qllm7}߬[k^/x%2#櫗pͤ0aIdq?Z糨RM}qoװ#$ʫ]-f97:,1@_ }X z<^A&_ʟMbfesHD NAaTJ_ȶ4:8hFP>E2Q{\o F@Xmxɋ.f Pu6Pvb \XVm(ՇY[zDȧ ^KC#tTOFt/v(GDfuV:|U9( %z[kCh؀3_1kPlG#3{:Gjc;-(V%mwUo0. ::-ƣjme5#gkn&'`1ܛڨ }i`K3Mv]4&Xc LC&cRJ0e+{V6"GKjbGׯ9hDtMoc7oAwyЌo&}6ۍ =9Z_ﱺfr$M2ɔ%厽V=I_;igFdᑠw6Dp05 mhvLXeʫͲFk#'PPq>MW0BAV.P(R\Q2Y)z:cM Dfrg6wX)#KfʑIl+{iegCmEe g(T 3Ŕ|DpSi5Wǐ]٥>`~vc*eԡΊʰbu(L5eiߠm` hG@ …BI1 aѣd$)(rs&WptB;3\ @%,`nFM Yk+%+VmZ,mkh묵lFu̖)H#) 9 c%q/IS1\Y@c*-/rŪYw HM M+%#TDئl:=Mm$cء/**A)>,Bg:o jOCa9T͎wTV jfXHr?%f 9u<| C67跼f]]/m3W=>U5M pƐ !0 xw 2Zid{ _LoxpkW,ص,w6)6b6a5CߓAyit=c5 |>П2aSt3hL/%w?voa1"Ǵ#mr*Ў,lXxt!Yv4:c1 ?G"JzK9{~ʀpsP9\r?@ZVU2t3vQK;u#XWhX#AIP8#9jEbU Hel.m.M  Ƞ eeR , BK [8q$KYxŽrocWQ9-HQb;2IYCzp5s<LDr9r>*b]>/auS0P.(Q@+'Aah8oR}-,y'11?"ǥ,նL<'ѽx ~IK_ y9P,߱|Oe#?gͪef 9K{HXc#7}kW@eѫWmlllA;ivwtv `n4wi8=biOXLԛfSuִInʆMs6Ĵs+(>mGr >U" :Q؜e,/BآQخFTag1: f",jaim7 ;1#iP4t UPC ȺR(jyl˞LeD>GUD{6  :8Pr:!`4L'sPQb,Ju^9/BJ02&GqF h1 5:h[ԈyoHNi#v'E`*!$(T:ZP$,,桡RZ,b.ʔȄ c4h""e/ d^ ,-|'d m NhO2)}uUP56.1*glf F+x>3+Elې!acxgEm>RL aW P}l=CAh 5ڀּ,E 8X ^h2kx]?Dh0G2(Kܱ˘1gA˼Y ^F[\ʒIXk5C@ 0"4!^H)`t ?Hv#ᴎ: {ᙉ{9HJJ%#4jh Zx:4d;) ϛ ,\1XWno$tQH3^nrXr\|n__ h"$|^3I-\K1>@М\#>Aw?TĚ2iDTNQB:1@" :Bl R@Oe֖^r!C^&nzD$.e9 + `JZF>1l`p$HA%=2`zVrTp#M =V}rC'>3`񪉩@ c %E$B|vBz:؂KFҢ3H IȪބ漜̈LoZaA0LLH! y WQZ婔o3xvDƃ7>Z"--0!"D(dR|^bY#$t@sE 2kZ6_TJP5k'&>7PE\M@$K{d[5%a Jv t dY @Bi L| . zJ;?Г/ϪOw',KlEhS 1څ<  h{B\W8X0aC>iw|ObV+`7n07h`!˳~h`lc ue7!^!T^Twr4d($??[ %=20ˊ[L|x'"mDA1&{Gܧru>;F"k(#CJE` bs3diCS%OvtY-=p^Oqq0}S@||[Af!I&$[Kwsw}5r$\ޝ a*kR fnW>/~d|B$KŞgL82X|jZBi׌93),e^Oo! ^0֝xLJll;.dIGr>mgl8ې45Cj)XR*˚}?* ďIDj(DLVÙ>-w"swf7#HU9ڑ <'M(E%b(lFK6w)yP"f: A5(ȋW Na.q׍zyCER'g*_]$FS1n ql/jP@ >ks3W72(aneyVBت$E2Wl'J 蜐*,RNqcaړ8b<wrX"DIEVϐ8JY'א//mT,7Q`'Q^ $~z]C3,Ko|JX].(qf'Ϝ*X22&VȣxjBE&¹Iyl\N8c,\\ƥWql۠;5]_ GBRY&N>)߯㾘 PZ\(!=;'HI,|JPUf(/e٣$!Nq2A)ݿ`UHYx鯙{*u``@XǝۣZȕjm|8)w"!hl9,}ô5R`(_7'hOQ~ϷS=6 u9Oo7cS~|w?C+=`H%WNU?C?ߺ #=OVi\+au((>}l)&ln5EkZD+绌!SJpnYvbB5ᔟIqHOIYc^(.AV'b;ZXc ZgكPVr.UgQ$*hHJPQJ╴1YQ_,HQ:pUq zۼ? *z|A=ӐpVRF>Hc4pd#a , e04 $ AR(߱$*'XLLG{~TqLVhR"H!Fa d_ 8#~L߅=IB^Ra`>lhXhY=C\':V%$u R@d {ǃ;WRQ e J+=kd`!rO-ȘͿX!#^Xq9,_dv&tDzlLbYG#J cwPzXIHXg=~2VvL]g"XZD:UȳR+ਸ਼NDף+5TPD21~;tB ,}HWd+nÅ%< 3>VU#[OȤ8du%8,hvlaC J(o}YNN0EJMъreo?\OۚYSڶH(RJ$.SU_osx+w!Iұrí:lXBc_JE%ڴG3 `xqaΧp^ՠ\9)Ogr_2'4 d/]JF4gM8)Jrx9=75m(%*vM}- UwD@0{pe&0&tJaJ>z[zAk[%FXثWQ,VZRجTl5(kfERFv[*js;_u_vm31+|}lHWeX㌼+Oq]=]RʜRbj (5vJlm}[v-So^}ُH~ǕFAZ]pDᐅ1&wJTsPUֈ}0N <M'~lI'Wzx bee&=)I)PώnĄųN"(N (SY?ةuzn|(xX(JgW%.|RA8+T"ztmgVRa:W?ĭRCFݺ/u\}0mڏ[5=1u..*:W;Y<Ȯ' x߅X7md*kx7gU8Vك]xPӘ%BsZHjS^S\ eRY\I7AH4AXAx0a [D8*%TSU.wZtiEa8Y@_ÝbR.!d'FT =]3z XyhG!a/e0?CU yNm(۪,,"j?xU.z Pو9t0}dcs 4 ws_qi nf+ayt&1E\2q6Wvvvh)Vu4Y.B>.lJ^Jؔ=>p5 6eVXh *NN,1Ê0l5 ULv RcLTrkx]$;`09z9C[BQSs/(LD B!\%fϧjY*'Z:@۞A 0ɫ@ ?aWxd0e>KJ׬j=1"RgΠd!qfbct!)zQ9B/*|{rOys?Qb66Nl4SYIHFEsm58~i&V}R꩖C]*J@m ; PkՓ1p o#@=zZ~NblB}ﲏ,߃J6bxb.CB2C68Gnz`Cl!ERJC5Ѡ͎Ҍ%[<}tC4rEo54/v.o qzi H=ׅ46HRCjƙ1P s<Ϗ;PAǔ1R>o=ʎs@d\Û&ÕvTPѨ1O+]PIO Ӱ{ %HmƢEJAŮKqq\uC+ CJb*2y=_9R&n 0^ r29IcbPYX;Sp2ۇ? U^\ˈ~L (6} xvv W$ f'\bq?ySحaj ͊Fsk| ,A_WKW]U:Y+ />AΆ4$J36"d*+ˢ^);XSr7'W҈jgvz{TE*#\ơ;$ӴԤ_esSq߃x9Ie9B6xh8DR/)x0KڀQn[9; 9ya7$6+v.\ 3 z ڂ]ܮ̔ 6vT/w')wFs]&.d2}C|{J,?pCT,^?&!B ][Tj2sćoybC\mTb0*,UrhIz:G u`rZ_;Ps3v'p/&Zʒ3DBX>I&?nU[ })KýC,-=Ap=$vN=} Re琘"$Vwa9Joc12ǺpqWwR k8CDisT2]dxu\xO2MX5X|]܆~K=J0'] V:^ 6o~h2sɟh2^i7n'#Lkt䘅Bvz*ur"0-y~(ZlPE^/R2oL%渭pۋ%?^.Q|%}M fʿyFAg?U=8"H\*y.37,~t#Ze}; '7CM̑5Ug /\oe(ȥ.Nד}f)kݼu2!A'WKۼg}$>4p.d6遧.]CboGً[C /^QQ<I9VçTDxk$3aJ!Tnb*5'ئ$7O׍`vRVC#Eva&DLJw>ENągNԫ(ORtD>߯R Z@HNm;aq4y:<%Z쮯aYQ J}¤4%G ō¢q$A`Tכ)OY._4D6][QG `MTq҃]7N [#Rs\fy$> O zp}cygٻ=䣁;gɜMI-ރ25P[a,XJ;j8ţTdfjB`@ܮšKW6 G0+jI]'qCvR}%c6V"tk"˰4@rp.8OKu,_nAzxG%A`aa:JBua{ɻW:.lo %);e `3UK9K9am?~j$iϤ:ktnT][A+e> &C5ȔR;A(<ŃRAئb/"R]-!8'(+$D) %N4P Уӂ~T_ z*Rm Ni2' _Eo t^>]:ziu1-u?A:f90{(KAH0+?u?㖎&sI.y,"BjT #PH r'.D~W%4xK@^PV6/֤ S\USfU;+o(1] M*\r^,NrBzD^jZENJUU ҏ*к̅j?;L6"R1fgEH /bX&l (!oՏ,r3)lÅi{sJ -aTD3/Fɪf.a;f-]>DՑR2Tro-'/G1_*K!}<"j"[! m_K*&u} T>E{Q\a7C?aC9֠j5i3T̩!kuO^R͙*ӊI)fwh>9cU ?EEAed).ǪS/U+KV* C~%ƲkhAr$\Rչ"g!VvE5RQ%jDxq6 NtYWG ~ 䣻=wNᣧftb?)J8J͹PN}f%$bѨc$H*7^au#uCւiA|-S%=v#SdA[V֩CJ÷Q0a$9dIKmjw)dnڧ=e&=K{lMtVF=5]avGX5xX ԨjũÞ'5(lʷ D=m[ PUYb. D/JBBYYVy!t:)Dy:7Hb8\͢ަYЪu-}ױ3>(Z-Mz^#>I!_/>#!;P#`]8^si @^(u+S|)ynVX/옺Q'tLj? u$VsSEhdkj 4ms'="ORzĹ"w%K`srY/Te&:@˒ C'/l~" 7oPyzb'{kL-0j!1&Ikhgm~MtO5:%}{T;1l;x-YW~Y雤Ժf)v6:Ž,VQD'is^Wg"NReR@d.1"fWV0_^rr20xzͭyU%62וI!K&i(u=d%$V+m >CtXw+&d]y*!;GjS5"{DB?%j5,i쉔afUdC\h%sFXjQ2L1:T!ݶZ" ǿgM!kUnJEjƛjEa}ёWQ(0rQ̭G9]J :k'~k*-Jba8/ҦcÇ5_ aXBح\u Kl")"ON)Sf+g[xn,JRt{*:?`3s'̘O@t`l7 ы4hoźF ]<$ T(YXR (!+41VzIůӠK@p4 {1{/Q7(TG r%LqHۏ)?LoADk-_0 _lT Vv&74zStaZm8N?pH,N$#H_58YlCB;|Z9FJcqB1$dc Z{Y핒 NKj=#]PH݀) \'5nwp_չ^whs;z wr&YJie)a5Y I;uR,N6uvnH3!xvj e:bױBr{N :.+ aCgٶCţ+#Ea,] dEwlm=YuvSG h(ƿn߹rr3+sKwOj"쥶DW"X4:5:OWd3.vhr-{Xu_o5`o=1pIK"Ba\HTw@ GOcڔ-c$-j%[%AV}hS7I3t9ui'h1;ieo?\Ia_4/Xw]KZ"x{z@DA_ݢzS/P&@b?*dw~Ք18D_AbZ}b΋޽}Ȕ9mڴD2q){צ+7[>%}=;70 [ɲсnW`Dm?$'ϓ}H\8րmEq!#Ubp=ʨIyS)Eݼ8j-3\`W1d'+|7m@E#V2GP/ȷOW>(РK&k̤1ģl70Tyaclw'mK q*jܙH|=r=J]ũcQr?JĤ HɹJUbUףvQvEXyINl_!DkS9^ [բ I!uqe e3'1M$`G1]bT;Bh\qT|_xtN\]~IuW2夥c Gda(zTJ[-l~%.~oN SC6gV7G?s[Pk)~7T *cz~L|ʃ% uވHjU_ Es?8$__- iɱX=&F"0U7qii84R3*E QZ mgX "liDdr|Xy]3'h lmŎrN$8{AH핾Hr'tAbՐTG8:%6Be(oaiL}a_:w}3,ײtR=|>PN.7E/%˴h?O ij\0j\.>gDpAlɺHP=OyűOH(?tQ3^99UǽV"0 Ps`ޱD(ʹx1C+ C0g.;iM7Uv.dI}N3d#k#b/gA^Q]]A^/cHh5")~I*4F5y 09.NzwHc{n'^س@S  x"rdK=)Pn'R?CJ6sK8͍ϝi3xaZF`J˿S]ʑO} Vw{ROVW>zoo7hG1wҚwp"NDW:/JnsԵ䭓3vx^]YUI)kҗ(}j 'AMQYSȖ1#9*zo/׷ 9:K"JIM-.zNLJ[ӭ_:%QbE߶0>mVor-u8c|iIILpʿwJڼ#j!=iSz9)hC\BlkZIxV0@}gѾ U5(V"A͐h-r(ʧh,zjgYבέ~H׵ kLԘYwHn,_}7]?VY8Dc]CE-*kT墮* [n5J8%tP le8VA]Mղ@)oZ "ȁڐ+z%桅-J3uKu@ue f:Y zs29:+1?{[D]aӺ<oOETVW?+b6jRT1Woo`SBdGs×̩Iױ_O7"tQR={ȂѫȜ; I%M%I|峬2$3dYMN`m;1`WIxr.6rw**/RϨ}{̶`oLpp2 }!v_K얝Qas!frKNUW*+dLuޚZid=ډv^j4Tr~US:]G^,MԬv%j-?21v!,SuNJ54,)ӣ.u&{u]qHO'.X~p3 &L8H FZRueIEX/zTR]`L#CmোAn*"]SIܝ5tTsCDg5 !(_è;b|} j^] WVaڂRfbbmnE}]eњe)DZ_yJg1y0y!69U[!ݞɥFsdUVmLv] Y;cp/i jhGn h"CT[gc=香%-[^%WigvM&\x"G,]{̞h[JbE*˵I( qUsʩ݄"C Ǿ9LTx50s7Rau\FTk؋,s VyNBs ڧ59Z8N%f%]W-,q2Z-܋Jn4*#u]1 Ͳ\JaS%]i|yI)Ybn5ߧAal.Two~^LFM_8ۚ:klKR6]s yQFN|JUW[ >IuU%w NKbDLhyhve({? sPhܗ0CH vs?{2~,P@%%a!W Iv*Sk wU]nR-5uA!H*3Ym Ft;C ɞ&Kh ;)ȋg=Jmħ=AVY~o$)1BwۏW.uf%^ Eq^tUj6:xcl>ҺX7_ VUޮeb2lq[ ͽ~ʿa%oM*UI7uUPPYY}O_구^G&Nc l-}\V!R9M}։uL5 ;$Z3NU`)p-ub7 >=Fi[~o|p*Q9\ NL1X|d7iUmi BYLCi*arfrn1}[4xu\ Ԟ1fяZ*Ip8𒋝yvTEoāqvNZew}e@=?&b.kna‰Eq;ΉomiNǃA_Z! )%0[xvӄUO2[[28U_ݾ&CM?%f3o.<9\fSPi:ڨο]gF4\O? 9iޥ>TLBZ Gy 5x}v%GH'nwni&ؚowrj?%{|uq4% 1.V_nuzC,}/Ǹ/JYwwD?48w _T# 1/cJNK%w8FdH_%% y8xK! !7& /)%CphnrQyʏ/|ŵo&Z uT ] d X:~\JA'jBP8=ժ*y |=JU=ĭG0Xi !So-G0_߇?NasKE\^{tpo#6Zt?.ܱ j`t5Ax71f~ 6u1dwpbjI<]9&2_o~%~б"ۢc~a&\zhf=pd3,zUW;MLY&RtFHҹʫ> CcT77*LTb ʥ'eMcpK]@l>e<FNaNI:k&12^l-`%5k>Ur>1Tq{4 p>oTjf ZeҗȘٽN^ڽMxxZ.j;U娩{iLk]Wh NFӪdoZS-'WRD Ecr~Och?%ual%ЌA'滔\%)Yf_E5tפ*MlEX槪6>=čYnj4sSABۏYb=.:R\D7%79:LSGowbMڦds}bh᚞CAQ-+Bibh 7A$ɖ&e8RO2/jk*L㎢$i|'Q))2tƟw"H7i# Zb*$b;Cit. 6Һ]3S8vE$4&Y}|w[߾ةM}hnKߢ?S.}/Q?~?vovطg@z;'&):eYqVTUxI[ ^4!K*V7Y['(jdP?CvMEgw@[۳_[J _w|5t60B?K('<@2\ˈ>Ɨc)xڪm !4/d <W~|knK*0K{I%Is]YįP7%xj~#}no-oW.ۅ)f8%AZ7.E/m'eiU]* lATIjy{ISVeY,fbo_?$-$?m`:N2dFZ*jv#q hnJN}RԮ&4][Q)!YP%P9Mnf ysjZ%#A3Xs6f>3uw$LW/_?vM Wcx8v/.O(PPM#_0ۿg]Ems"Ħ.3W1n7B~ߧv /i%5a ޤbTrztР/gTK*R])}ݞ}V. y͂5W޾;Nge:{<]RPM 9(CoOc!g@4:cs!qC*!?%{Ǖؾow|GU!-*y˼ l vOw}^vGqKdo5;>|65MZ_HFNums]˯)>nltjL AYǏ!Vi~t gIZhiBTtÝF,v4P2bm0v cV-g&[p{c nz~W _Ү\0d %{you&ݡvM'|=Ew)m0_@F9ɚ:" $q@ 聫rulPcχ~X* ܃?Mꖔ Ij=4;s[*( ۖ g\Boj!7҂ ~|]X_>[E&߆,>K~tVrFonCoҷ#CrĒNj"]O \+d>d֖@nWR~7)`(j;cNdz_[~\5w|LjZ K(xoi|zK7BjCD~PxG%N;\[~\~\NV`CD"N.@Cj^vlLRp=P$$'9E|$L,ߞ#cSh!ug_%[V{-$'wbfS1R_7ͩg۪S'Rl+o*;WQDhZ|ۆR+sхHkΐP |c TIz̚Hsc5s;)4MHiք%}`cH ̏U 5:{fR_~пmv6qT^ULh9uY:Q:/?~|0^qͺ@ Kn: @ov}1h#] lG]^6T~B,Yvii6cKGkM=C6v8΁,~&pޮ|,wnϾIa Yݙ>Egdo]5;>|o:>VƸ 9È}Ƹ p17DWBe1&?zb"=Y3X+}u~w8FAy> 75Bu#:|ɼ+Kn,;d%Uq! mܶ%{;/IsY/~֝)Sss߯'d _^tIƯ1 +aXZ|KPOw06!כ?=cR_i9uU+e ؏uxWvXqp"uߧ7 FhyCvRg(b00 חZQ}~zVz\xF{ ư,{9[0pwHy̯#AnӠDkL%Ip04XQnѦ&tt,)C$Df.ùa`aEJFwBpA4;T9 m9 aiYAx:"TO"9z0KS]`'[vRLsDdBAD`M 2 .L*WdT-.+E:PpqC$ SAmjpЭP XcǠMtM̬Lu2 v5ۀx>R 70N!G&I_`_Z菲 :u,-a7Wzljæ^Պrk(Ja%2z DOEĠbPjAqFɷ$z{Rmq.Q wggAOmW&QV|bQ ji1.'uh&ԃשцcw{5]K/ (rŠCv]"DŽzxd;:al6m KX/d;xͱ8лRGitw) `y=_'<BGH9"#:/:rC /,H1VZ~=_! bWKSGJO"0}xo-XTOR,IUOna1Ä<\A#>3 p\zETRVe2/|} R_YʒhCLt0pat U\Y2O?b,(8M庴ڑwLJ Pf'OT38DY18,px,Bj87`*62duͣۑ"LB?i. %e >E0Tc~"z*",j̔ON Щ$E(҆~v; dԾ@SuyZ1ZvN@pU;t\xzf+CyXRs4` C[LJ??PN4(i*uXm[-xHTAhxdeLأ"` a}ƮͿeoW ~4BJuXS̵ߛsN[ܒA/ID1l2qMRxj"<aB6QBs$ZO @+.Yd.ؾ1SLJ 6$ajC$Hhu55E{tϿD4& ux.-p`:e+!Fȅ <*_QV;<+iR 9 ({t%ً;xPcwUQ°bLU9c|Jъ/Έi+ވe  V/VV{PNp6q'm[S,ԕ#I (IHV ul51mST N<@Eb@c5lz΅ʪrlA<]ohYQ(c䋆M=4`ӓ~ m0vN^:h/0-{U#mjIhL [D,9,{h'SD=#<ʇaE[=~'dwsVp9`4La %F̓>p>DXg wJ-}7R&x,>RDQ: zFRPubP.D `9z=_T⫦OiEu, ᲫMRʘoڰ(!ʂB*}T{lȴG U8,ʳ!|Vm',%Do"َЇrʊE~%=N<l@Y/ݔ32j6(!+2qdƂN?yBFUw< Tjc8_% ,-Պ"3|bHbX hr4{g9/ )Cfa({J*I9Dgۘu\}k֐0ԙ*f;VuM1nm'3M0 O(Abˏ6rRt,6%iڳ?[xm͕~d6l%PH^%/f~K2=·警a>IVD">$|]Hco`G)uUq)l/D y&f+!-I(NS /ֿRN",V5CiC(ѦY=}-N;qv'ԝz}=_ǔkw`@(vEQ߉,=zU:3)?տs?!m9z,IUNh(U˪KcY~쓔'|ϦPb il@C͎qa^%` e@EE}!iiJs5PjI?#i/鏪bﲷl",ubJMǁmFJ#nT%[ooL!F!br.kO,IT?a*q.W!+c? )@u'cBtBqSY3s~ZQ0QM/{GnF\&J1)ͶEZJ@ zP%&jJ7pcE< j/ peHmPjl'K~=O,! K$iZ>]nؼ;:2>Jg ܕpSC9T{`sC)rX\ȤD&:0JXW.HqXݴ\N c>wW28 OޠY]!JmHi7ԩ9>d`_)x)/Iv R:?t>wu/Yї^_6_0_"nJxڗ ip?pB'z^hTHGP} ,nB/'z}veY[ =GIQkZgwkL ͛^1΢i)#T$G08ʹ,a8pIҩ YӋ7S% %v}ˮmStur'GJ oK+>c{ ba  KoI7G.(1cd+(&rq|Lk0I}e0_B_/Jʲ3b4ytpjP?lab+?e:%ΎhW5߿pl^՝P_۫N34Spf[}ڦt`?}%oR4 .bZKP.4C f 5= IPQ B}~ReԷɈ[ϯa5yi`Td8E>1«8ʤ سjE!M\BɨF^W^Ң@9.LZ kPpPIӥ]gvUM'Z5)bĒԈOg!F6HRnSqhurSg!cihndky:|laƒg$J:+}`b 9'm؎}[:I- ?^`eԶyE0a_:/hԥ LfE^ f^shlSF06%.!d8g=C{ƥa?/`d+:PWaB:e $٧UR,(^mVU޻ Od{3f4T =]7ۮc{Qk:G:mT̳u\NyXPqh!=BZxK)E%2Pn!(/~S첦zvSƯq=^֬y unng#fAղO?*>2&Dh[Nӯ1C3ߟ) $gnuPp )R-"U{!,b#cӺH];6Yx@#w4>c)VIoʧi7ogjzb`DM6^?j%lr˶Xf裖}5 TƑVpφe\8G"rC?a5|J1C nq+.DI)"g.ӥ~-.ا' r}#%W>H#0 w"4YW6Eh#[ԴtWdo]8醯?A__c 1@&Džt;HIv;^;I+I0w5mF~<"Ut%07xow|/N'n4޿ܿ%D,XT&ݿ6gP8Aʲ346;lJ=[mN__0TA?żʿև 'FuPK(w'3R@Ի8K__ϫF>Ź#dSl3_ ܇SS_nߞE?ҢM0at6|^O$YTS_f&\|?j0d i j+%z鞤de"֏+q* x k!| kxn]o]u*96~ }@C E>*sGPDwOPomw}4d!\2uJǨ8랟e}Hm] 7vce%MEW ӵ/͋ey Ig%Xyi}P乭߀Z*〃c+|^U4g &lMi{?khj JpBP(I61rf CxUi޻V[@5vV%ݞ?"H "8wvlZNd3as=$g7#;z;F 8gLK `(@2{=UἤLT#Z5]lZfK"CPU^?[յ?m)vǃWͭB1Mw.sb^dwX(lĢv@SsȿOs<+A|cB?EZӏAUK8[M DIdYckI;jbZ5wǸ˱mw/ܪ#]0d/P%H"3 ."ap1rWEL_aD9^t8Thw;y{fdr`W G4%jc3fi+X;-yq*i z>[_$ [BشR׷~ikOlA?Nz|61mR *EF~&ًOG>"OU55KG֙2q0Kk8/ZbB6smP?rΉOL{zm9]Ήw|'rl+&z$Xc@Hj%m@RRA"6:)JA*Dqf ttocWd2<5}lyTtњڰOqYKeue:Ď$C^9]-%A )kRGOܒÑra-0= X3roq_S>OE}Rv`C1퓴 )p@8xfof NsY5d+7 c/ٛt+ w4}~4IX%ڎOn}/`ŁdU`xON&+ C^!qS2EJ |1~ f!㚨„~]R<+,t'~,Uov!1uP6|v}ANj 2giyE|Cɲ%m%~78a\NА,*!#V}\|\1w?%]F?o>U'EԈ`Dߛi'/"zH,{ux=Mՙkg@vqڰw{G]eCL4Ӊi6@!):?C`O~͌@ "n T@'Y{ `urZ\I7J@30ӡj>"ɇZ ?j~wIsÊ [0Q ?snM]C~jcP~2q7I*N9+dEʫ[櫷 w K g"~/kzf!8TLyܘܯ)xCr + ^vI0- X1@Y&Sc(N>g}6h$ Og&&V*q㵡/[< ǧ!:"-a9t6wYB34irg?/)pϯQ C-R> #|U,mCo2O1Ϛj J`^RV9G\@ѵEfZxmđ̐Y޽0ߒe%鞰8_e+KVz֦F"#EŶXFQ{W*'Eq>sAV5@g׌g4oQ7 R[HH޽d^,XJT5gb 5"=Q֚H6vv?t\>]ZXѭ:bD$2ڋ8iOڏ}ċ(Y94疌:r ͵1]19.Kf6k(Ei,7-DzTce]ҽ?ϗyȮ>hteNzoqY Pt_m9YYszs?uVl*|h$mZK7X }<9ђG: 5{,qx9Y\qT>*e{$-$97 M-]?L RݲLg]iŃ6Zx|gFUY~Z)wlHih7 ȗ3ϛ(~eRy7o!?&nlqAm(ŸR1'^~x _7|r2TtטarMŹB}̖[> U imAa\ ^X:Y?vg#7]j%,pN\fa@VPEyN C4#Iv_R'o7O>d,t W/q XEIV1P )1D~HYkE2w3%g^JR- k-Lp9(yӖ^xE\^*^s35Izmre(ֻ4A[67?oXUBo\k@„t˲ltZTj^R&h,4YT ^MC׊4t[},UY0Pk 4b**.XҭqXˡ,B޽A =vo?}D9mS Jlu5fK&La84.h$@2jD}M{zɵ&©ǰtZȊ/ YzW?ǿ}S@IfnɽnT?DX\%q%ɎcͭZ N=#=.K* WfWhn׮js1k}]EJPoAEa+}![7#0r~yTk@ڽ8}A&lѻT-Xfڪȕ%@62ȳu3#u}͂tkpW?5]c>N4TA2)7YԖC93.yvwJ,F뼃΢ԇPz":ԛҿtChj(gid-~زCݜ-_n@^j(>í 1,:Lzs͐m՛m3aTz vغk<5/iž:U7ėY^b_Ke>Sϴ=7x^FP1ݿV6沽fkU,|ZWA\dr;P-՛|eQ[/ԬsAy{3V7g;k,ZI`k8X#>c'}|VdX~: B!x-wKC%{Qs`1 A^7悶&N_,׳G`PZ GpfOgNYF}e}CS% (-nH1c3zkYv*IHEνY~KxyV;w*['N;y3:?6èr32QتjIG /霊Mz"Ogf(Lýᜱ^uR@>8N&msv{1dVQFcb=vlBFR;6s_mxkb ҫb|e?I gD1$aTډ=@~({wh5PM 1kؼmiq&vOa~Nve{Ev۞'GlMLQoW#t+mkj\ j~XyyKw;&լý^]ܬ#[6(`9)V@ 8PSMrz=6wݥ¸W/ѽ%Sg-_J_Mv,Mq&K9<9>]YV y_\D7vuO.ٖI8>kQ'^W2lYs&|]>&4EP zP__7Wq ( N-DC5,nE j%n>$onOO'l:~nx<]㴬YEW`P-^3O]$=*$Sf^ {)}G=`Оԅ 0JQJӡo96x&+>ji~r.rEݳcj9`)=1֕qBicC~ȼ ;[1ƘsV]*2c__LS4s/1\Z<]ҩc<ɣrBhb% Y djoVw)5PUkV 1ܰ'gN#ӠaKX,j=.ap-WUۮPzydMHz UP,*ݠi2&@eUlJJah s;$꒮R}zHlw}ZLs$gzixf+;Lzar2De$|ZlIjg Ɖ26JQb|[@+X{%Nkl߼Vھ# ,Z+|ei7-P+jOr6T /d69d|\DhUM )y0滤4kG5-@}m uVM𭴛xOWR RΝ62\o+i1:3!;tګ#S!8#!%Emٷ,5ݱPv7b[s TWjWq~^iڗMCĘc?/gg{(I7fns`9vfY*@Qk TvGNY>4ww{v)%pN [xr=4%D1 5>d簤q {,>C*fAJz{,lduz0 直Q&X?׳Y)[ŁV88qz{fqFBaO{O6ocSыvw-6pƏ.W.MDZ5]DY.U$ZjXr(ش*I01K@M&Oρy.EmQ/kYc.5MhMHP\G&>Y vJ6+r3e2t@A k>VT"jc;`K]Yi=yԙ˙c0aNMeûE";6.) cT"C]7\P0GԼkvFT[{釙ھ޼-֧ %*/0?.APo^n:lfUKuxK/\Ïy]b*H܁dY''5wM2@~'ڎW˺pW$:eE>c;ީ]JyD0{Q-%F_@zU%;IaK? D0z; "a%3XۻjYnPmAT_-%iڈ7ަةn.8_~7_u (BuKJ׬SM-·BMk(sJa$IHX"HueVE!QWY{o\M-'7!AÒ"Nb8lN 3n[sf+MDV>ʪcnp&=N)?BX8EoJu,.J"Mz!w/+B ټQN 7K_ljwmKieDo˲f-TƟRf?\)38aϟ𷘉K&'q u\he:$#Q3e4 (AWְ%Bc$K5pI3Pf:4(3`gb?CTբ|3ޏz!>g fVkO0gv#.p㒋Ue=7(1t9剰OSCq5K=Y/iیL59W"SjT+ЅNR!{5߲sNKiyY$_EXže3ȒWS|o7-~:Wڊ?ZwkE0ڣG26+-2]bѣ!+{0{lb 6ETܵg!,i0[~C6j㼩Y]P>\`Z [eTt+{KfOWDi+ GtK ]rI6҈qj\YYשחX\KSPHmwiҰ hn8lmj|ڭ #LY3qP|t (?ɨ+2nxKz4[U[b{>`>tVXЊdSmǜǬLғ$6jś>VWa?Am۔ ij|Kvlv_ h~UhCyuՁރzғT6bO?ِ&;X3&am9 s"[\ˣ]_~n^L{1m9)l7}UʾNSWB]vg[jm1mX_4O; 'st`}>AŦhkYFwPL]ۍ1zeNq'oEͅTK ^I5G0FGN'QV__=ٙNe3L85.zWpzߑ&1៙y8eG}8\$$: (uSxPR2aZUze¸4 @! a+cP&dJD܇OA6QY pBLIڇ+!5P0x-b{dn㖹hm1 ALd$B74\X 4!=㘕hJnZU S\gCRJGݔ1)<{4>qY3IM$vI( >)pn_#s\IM[f!&sP;Tqsj:!M%).ATpZxq*tƀ]Dh7N簬(4dZٽx V4Sn@Y8Gg&0Q^@iL7ZQ~k~ƱCudL Epb% :/"iGZjwH[RT4L1}/TЂ^K2SFn辸|R2_*BњCӊʰb?73DRxB_P5mRT@eT=qkb݊Zæ̯x qж8]P̑"V4۸WȈМTLRB8y*VLc<\5^t]d6>mWBs}OT v@rAvc5D0Fndw 5Yk*k"L*|9r2?#h(%lfg',qbR2\b.j3QM@q&p7_l6}>dԐ iXjI,1ޔ@IDYh$xu2ӼNєg&B`m Qb&ЙFDCQi5\s9,d FXSEQĆ XAT̥ 'J*d^D-)d"}+ړFҋ}c@mlQNBC!14l. L=eYg|u,LrJ#T:Y JH5҉eRa7 RL󐲎T6dMcmU@KTtc<ʈ~PCf؇sU_SYNN<+Jm+%*&*آS %PwDaiLE25g'R4mi V•o ˲L:c$9ܮLQӤFLA@p1]:Iې AцEqt5$lh|_EK#q&Aҭ]_2?9)%ad;ڼ8/rk^` iC⦓&K-/a8W< W3q`f ʚ7{'÷;y5*'ȣ##f$),~EάSЧ%i'Dfqx Ko;?12̳|Q.+* ! ehenU3?*|'aR=HZ4j-s$ pYZI'+?[&jƷ ӭC]tC|fa>s܇9$d D Y O >#O ndq)a=dpU~aE'(ָ#yb}ΆfD*55 0ݥ3K Ök+?UZqFGaƕ\kjv$&2zQAqP1MAmˌQyޔ 6˯+93jDbD)=BbkѰCj..I됦G tcӔ|:+,K0|}I]*.\g*ּSt2KQgeXaGiݛV{0 cȊӪkũaPqn A13ՙ>.es;z),ǜ %.Y-NRRzƻxy%{穢!:WY+ݴSY#;cWǶTFޑ ]m|ê@,az=-QPl)q[ݠUC>m fLw&-Lǫ>M0<3ou^&[#]$.p%ۘfD26=1݊iF9PMQyp%dݫJQi?P`oZ*vp R!r1H ހ[U5BF.~/Wr~8:LFjX{km] bxH-1.*y0"x̴ kP~!EMP`F"  b747qlj+)E~5h-^S"ԃV r")7OA@ j^N86CױA*>'FTFi eF'򬤆ȶ2( uCikt$ev)2AFn5`׏έZߩ$S'5i,sdy2#"TK,1 R}y\kmLS@n):,W GN.z{nvw H_ӵd&Y:=A=4,^=J:*BR]ޞS48=״zv8FDž|ncÁImDƜY Q~]*ڈ*Ɉ4ɊLy~G3fꇫ~r _B隻GȂzY@kBaW akg>~5b+3,! J~ݬjR A|Ey ˏ=~tl SfVK>~2 .aY20 MF?pHibCDE[Ie8Xnj[ēo¼nH@ti\M`y/u?~T?mY@bWfEED-!w ELu(p%&3W[W ` .D8!,spZf/H? ~Sbˇ`tY: 'lKvKx2 Y| HIZFxr5"fEvk.h^>)@_qȥoZj7%Z$Rb\oת|,-u2N1x(uQ5.g4)}%kZp Y A_ͦ9o4@y1&ƑZ Т+M <@R^~D{R+ کi 37cn*okncfffCcDrfnҲLw2&N6e'cD )s^gi+{Cm|/vI uw,Vj.KM^+gm=HAB=lBG^kWqX&ZsYXRI:H`nwG,-U3F8+|`jTlvYqwlхjէERܤOe0ҫ{6XEq1 d|w]-8@i5ĦFYlQ޳a艹_ -^Fnӽ F]Sެ^`Llmq({Xջi$"(Nt`^Uv'vփ+Yl1dKŬ3])vڡ"J({ʭ:~2uxFͳ1]rggS9T2V -dIL.C$>[][XfxAszB&33wU4cNBOIZ+Gin>4(5K] `46aXn̵M'xIRFI$jg9mŝ_ Waφ)qSVbI( g zF (m)ƯAgk|&ڴNos{qHCZXmovĊP)<}@ 41գ=ro0eQ L٪B+](eJ8tQ#/_ȍvvM@%H2Mh14 S Me(~R {NH˟_g ?Oѩm兴yj2ډee@nOZXeQÕE KK>m0Qɧb.șd$  `\7tȲJ.(q5Y& 1 GɨC*{ Ḿ:±@jJaMwK-FG,3@6:->$Ceʻhmhd ]AŸCGMOjÓ+i1%!1v$7)xjW1M-J B*.7P+ lusAQUpR jZ ZAUUA'zLdٿM+~֝z g #`zFFC7HHZkpqSb(Ď_ȄS^4ab)?TN\XsuoRN8ږɄjgmF&IC-)P,8W.&.I9dPHbE 6=kmQwuуfDKtCo#s~s5Gۄb.^z51ch 4k@XSg 3cR+ᠠǺ@uLO+ T"+֨$1>=v+؞mtE}\]. sKzR7a77>˖L=Y簢Fl2jp׽`a=V~ ;K% mU'-򉶚SؔmP-v|,{J XsE %4lxvH^'6Մ=tG)@dL`딿]Z cٹ'iJ-M&-AL6P87ed@DfO`ajY~ZZHLyId[}:,h:*)T ` O,_42/tsWű˱u2ji"\; xyvJ[?S;o5+*F~9vY!=J\8V*g"̪MMPmLj$v`#a7t2XȲudɉ/ Ṟ$"Jl8N_SuR",dxPv؁YisB(u7sC{Ɖn샔H0 IuP[G.A!2n9]%a|Kb݂ PAf]&1CIAURfU<{f@ *KJSSD: x\=OKUL<To3MQⓙ|-VuV2x\p AlR[vٌ8tmU\{WҨ٭VT KbuDUmoǍ2A+v&"kv,@D[͆_Y46H)xN)H(zkz^]:}YcY;HT7Vߥ>ֲ@ے4$ܭ0Q>*l—QOP/w$E}6 D!}ivKUiZ]&ijA~XB߽#x\oRJ.*j^2=+!e Rr*piMjZ!)en h;% %_J1EsV/Xt͌vNptԩ& _ڛD!ZLYnB@a)A[@|*x V`Cgi).SCX nZTN8XLP”J ܺ'7\{3}e<2bLKna"USSq+iuڹDap<@YD@l|]ȶUt7KH!c5.xIU9%ɚU]h1m:eh!UAIDRa& FτUyecoP <*^$'dys~Y0-426U*6kӢl4"EMc` OwS'GQy(@UO$5T.0wD; 1Y&"C{U- P@xEoZ=2S.W7c<Bp(PҩCTVUIGF4Ç 9a|,FוvWRF _'#w,T遦v8 8E-~7P90A L"gn pVMKr"}g=OLY= DEސx+6W`#p]8+'ٻ Ќ[.T K }&=")Kw~THR=eP]т#N-"~Ckb{k ,ʫZXl,[־},«  K˩\pSmȢ|@a3?%†:cIq|%e(7)5Ӕ:%?C`x\jS60p ._ˀa_e%/EDmf]tRɜ7W@J67 ry@v0X$(3B lWZ~!1v6԰>„Bsc58o'MAfȅ4HJky_'j8K6OWI]"TN*= /7X~byށ4IfeuN1+\!*zW7'HW1i/&EsQ .gK*֖Nr6&2C4,) *  l3Yuy=݂s`1OG sԢ>p0\:ltqKآ*ԡr@`ڜzͪ?M;v8rXbVHS`DTs>ᶝyQ/60Ӥ@I {!cN2e%ci4dc`hr1둭Q͹*}qt%8FXN.ӏBTN]vv((9B2" :-YREFRy VAR|Lj-)"8SFkU F,} LMW9D K5R"gZ99ErL\ZsCa*'d hdКe"UXddqHd4biRdKX~k v cmY%jhi(Ĺ߻~k~%iKKC1)b`N`~l+ 1a&\M~ِK5 iP{ogR!ߵ j2%Ep& O-%Bk4{_%!DƮ„ޟEiqmDწJ'b:" 7Jd~04h4?K<=ەTDTil]0R+bCL6`KaQ@lWCYVN]4VVPXx+qMkFnvrt rD w-+,M$v6YIk7]d@4+dS0XZD~JTuDxS0rʍj gQFxU(suCx:@(]d9ԭs11C95x"HLP5RwmB[AfBiflgzY sC+lr&tWUa`N9턋[f]t: {[銪moXBTqo.#O!5\e:F?ip9u,)KfT{NϨtṽ8NgWRN/&)M/J]^V"~R,0Qy.Nu&t`%[leqW}aM-Ϣڌ1, = 4T7h Tf.}3ܦhU©;jjih:U3AOA8%t2t DhY# teycgcjob<^8W}ѤUu*3}orqlgD X%ӹo}%zS|}-AwB;,㾕u[͟G =m/O$ !v qW%cOR6_|MLg8mjeHX6l~ZGt;u]VCF/RL Un7D) t_![=?1ڢ쿬X&.%v=}hCJ%ed뿜5U^28L/i٢ߨdGߥuG}~Kv{I i|BnWa,6] D i_&FwgKUA#,|d6veEbLǕ ߑrG4X{c17|Gb4BR@*n]^5_2$R q4NY/Y"|] _6u4=e ?>.mN}JzZBi"C B /X:oo7a˔qTHn\w).=&RX_jyw~oqk^w|G_bP?t/&IK>İq6EuXv%iE _7$7iɷ AIAl~! }7$uӞ%?} w?Mw~!K~6R.2ۧMՕisL.+̔u}Z/)iY*ow#->M%{;o)Ɨ+5 |յheU?A׾vp *V(lqMq whacg:\~/f+05is},Rh"gh0v4}-zggu"i]-WILDga0iڇb&眮2Ȉ:  ~y\+jXsiR-9宦6v#("["+)hZ3U#tMGav'mڰBKuQ;@ '@/1|{r7ٔ&irqnS`BcՄNUyNZMлSDOw3i|U/ h!0oB$X*0 NIЧD]AW˼qƳ S)gT|'Q &< .}YҘL]3X!dJZ;1 ~Q2y˷֚p+lI 5ڏ&wOq!$p u6I!mM;iӴW4RY2daK [ hI'y pZPh 0$qDu"V-`iɋ„K^p4BFz7[\fA$UE*a\{sd%Û5ƺ!/%|b?< Y1=UUiSp-6|7.a0C3| HV1貞FsPk*:\cԡyʋhE㣞C4$Tat7v:M-DIFUEFUa9Xue}g,{>ԂfߗN5hw5]rCsz l%SMh`'y0xmNOٰ֜ǃ}Y9fzVe ~-p^dЌJ\L&d;GI{^T= ܞc) Tq U}!xoNù*vtV^>'[ ?;7=`E`IW;[ב*U\;v*.a5QvPmdf7#=P>]ig@=l~NԚ~ 3IXexm`Ŧ:Hva.dm?O!mC5$s +RRw4|1boigerRNN0*0&_5wAhN)Q0G6C%Y.&[(di+PO+/fj.z%/r`*Ym5+7N~wo yXaDˏ$ɒ9I!.h콌BS;aS"V@9gx ҋiLOpCVmw U/u+<䉂%a ԿRު/  ٞS0 myt8kRFUwcv)QSc@yER'L\!vф`FZZܤ[#d"R}݁[aI.3I~\)h<;(\fu%WZM:/>x`|bz.;'X(qΪ$mt 3HcNlؿ<ɉp}Z+G?HrO_N̛a!~;]2 )5V)Qx4{}Rfu0;qL+W{xe[C-O_@yT\^=߼ 8do?\IROFn;x .{R*.ٺ]I~K4):d>RfXh}yhmSQpa12ymK㧵ajaUD/hy鵇g)5U}ANU$ͲrvH¬a`ՈH/^9+S~5QA$^ 7 )OWixJ{Yʯ}q@ni3oQuu@wuZ=].CiSXk]yFwV<.bi7Yzz--Hۑ]$}nD`vu8*mMRÛHT3M,?4Yc!uSc4INU^! QvYC薇~ٜC.'Ck?'T&ɶ LMgrS/3/.CGn*j5}o7c*TZƪ?~IPآâh.d:<ݵZ]4GԒ 'n".)KfӨ@PtBG@[3gE*r=\lx "W)4K^W&fk#k>6%Ny¸[X^R"R;zk]$sڗ/[/VPVb-gK慭":g{t_"q>Q ,iKZ7aMԢTtor,NC]*h6[ D:"49n FR2dsF*VFgyO̧U\R9baƓZ:r{M!-LUyJ{')bqHpmBLmCL5ePN2P*궲vZJꂡds.GO5jd5w#rJގ`Q,.llPxn;OB $(4 Fe# X}(Ʉ^ɤɴiKR_|JKbL0SsUR槛tloͦlJ\4>˚)˖OW!@Lļ$W"=2/# zGގGKO v^CK 1yrTIKHЧ:ۧcDaRX%vgq)Y0VS#W,wp0;+9,{{Rۇ} nIM^:n瓍Cw,gFauSЩ_I [8"N-މw1TԓU! АpI_V=o!}$]lt .u۱ xeͤUrT~bCF[UVN6cX?0>aЙi> r$&dpDm[eҔan~"y/+v S]B6 l:f-QN#5td-| \Kǭ^ t/pWJGFZEM*ojGU W9KJ0GelRyjM݉U&: >gߐݛZSTm% avLn\m9M\OL\}i:49t2"N_bL$xے{a?p6:&b&V>W]B|eyŒUt|Ȃ&Z#'$&SpXM:sv9HFQ9*jDfj!z'c"Z2Q-a[ؤn~z(J=$[W>8z#(,k#r͋}}Vn BV  {clNN-h%ԓ7Ͳ[vh^[ Y?j>c8pO$aj3[WEm B2og0VS<qgRl m;YNGWD^TwjM*]qjU,>RޥtRi+$o ;MǔK2<؜&u) .,=<pFn(UXbf<#&`ZbJ-6}44[E>e@9g,$Ů:LI~ҵ2fv~Ʈ~Rb~fi%cd`-ѡ=zPg"H` )TМs3/<#2۱S=i3] :clT 26( No)-ÿS( SQ7CGM)o5 8mk~{ '纵};cȄx/O]8vG@گnw+)JD?=pN5N-HPАKqEܼy,:F6QoPH% *U]3g!ۧ"^NTĮ+_Fl$TVM%J zvo`s-S<I*b ϪWݼ_z/"2L?;޳!SڵizEz0C뒚I[N` J:Gu+zmdD]r@Qڎ`"M>pd-1w!9;g9kM\uB$EoMVvtHhP.p&T8$x'Ҫ{`}|}k_eQZYϦFxckJT6]aJ4KYJ'QaKC]ϱU^"[ylPV]K0i_,Af&B>}z ϲÉ@奶5svm49s-;Ւ4AWe>,d[f27窱fEܻK & R2)UL1li]-! ^UC HD'M}"j1Hs=Zʶ2&a[a}p !U1fSXj%tUjdAij')" >k7.mMU"q}z 2!f̲B' Ŋy].=5MI@w.;>YmL YXG 4 P)ŋw\Eb ú|ͽβvڽX 768Rcll0L7'Q5Ty&eܰnF7/ &|$n k=YZ8*elB?MƋRR XlНOӅ>[Nt:9]Q GH3N+P:!Ԇ7%ĺyj=.XUCd~_x킌nl*ɷ̨Ofיy!QX)6A^J^0VAj#;v aťqTD[/guY$ZRyyG G4.*k^C,5>-eHSHNŔf* ǖ9z]PD±a>Tr3Zblȧ#wMes PVo)9[<+ Eۺ^I Dȅ(3H}XX"LILg#򫉷y<ѮK@˕Vʡ=m8d fʻ,HT:kj!n.17e`Ŋe z͌bmnLw8Ѝ_&S vlǿ1e?M?5\M9<}r%=e|uRZuh[^`Wϭ C-r ʖyR54QN<<ǗMBĹ戍U{&=.ۇL]i$`ߪ/:%M2 jʒ`HwM0 lEy);H o25{.:f2}AOm&B՞U.Viy#dU%H_n,5nn4ô1sE}57V0ϼÔAfM!hJP E'I|@K)}S\Ľљkb,VV/խ+0'GHEr? )'e`"dX KdCGjNZvߛ׊:$$4DZ^s2>ӽHbM8 mEj(#6}*[lhB-٨sT)1ŮM2[؍7C 1]r$m5,}kek[u2 d\#!dng2i֝;T$mg Xwln[nX<TSx+WiAz1,v*:S)][W$9F%IX.eJ;Lשpvi 2fVxiyb}Db V?Z/9IiXp[K"6k@lvQ=lY )j{Ru.6 53E<6c\#&hukm:lyOͤRar p訊lA0473!]* zː\]urj/:'P9;4z'9']um@Gj*oHƎ//yRUi\VqI6#n~us{ZY|!l tVG yQNH['Eݭ `da \Aid$ɲ#IC+ב!M$`hk_.U]x%ap)݊$֎H/ !iF󇻙0h1i[O*؂@] mY{$9_N1sz;+: co#A[febBZ1ρ;E 'q?՛v>Cœd>s,I/6U_d> hnɣXƥ YiB}t˷nW+8?@ m7'uDEPΔ*6]W隊I%PgP/m"M1z)+ 0jIA4c#mWGVFG]ȍM%69$BЋ aXVs (`s]S_KUGQ{eyB6^,m{=~YG{9LZsC|h !azju B|Ü)/=rw ˩))?.jԇC'CWe]KwEe?*.]^⌳6=K#NF .JoXE:L\{ UOeuaǹFE6 B^)m߾{XهͨܝߨI&m3!7Ʊ˥ʦc\8EGGK?usgCS=N[YEwoxÞ)}Ur> o f7,'uGz첣W?,r"`q=${UMj%p*~/^&:/fF0 >ZR4w/QN4Qöߗ DsB]i^3c+|ͽS-j5>jm)=Ҏ^ ([Yc]<9 @g/ij"<&khBl^BK r{RL[ V}JPaFQ(ۊ -u0ZSk J ,G(Wdň0~%eLNxt1N^ه[~DzH .wQCn)/19- ޒbImB* Leb{k<șoKJ=lo%'T/V[O jmqK{jlc3\nPM䬬%+=sօ>zNwO}#!^ÙVuO+}Zd6Ƀ~.+b:bג&NaRpjAczvHeV'`#@E20}q}ͪO"FA_ټAk v\4lne6kRn6ucl?UE6H^@$ EqYCex.pRh2cdԸ*&o*PYM Lvĺw6S5\nP{_527̒kƊm0˜N̮lpX}n!gY̪KA%>fL$ls]Ò['.tĎfqS5CG3To͢eЉKAS_Ʋ7ԆYGMQꄊ V/4Ub9\H"{ z.v K$~4d%[Gj(l숵2s읺#vne0oϢw4}B݅Vm;֫؝2>F #<'({yZ,p J#,Xbl%Թ%h8M0bV\ʺ+j_4ɪ&0NO/ |-dHz퐢a[D䏕x8#I&;渦VEi%opxxl&()Aɔ qr~5̿cjV%s& ͸ih tN.q[Ν^ck6~*B0P6AM'jNl(|ޱ22(艈UK S֓h]%e0.mJ$&G䎘)4cI!&%-c{9LnBPs8sea G!Ci0@@ًN4cc[֌kiյp7yѺ8pIy :f؎3[XeXK% ^҃$[n*;ȈA;{=途\B po).\=wd5jE[K`Ϡ+_V"N7?$Iz;ڤ5ZΗhSle[2MԘHi`cz{cmI^XIړL 蝹typ"t 7,y-f_k;ufl'$x:j6qv)jJov i(Oc#rcOԐIQ$n)h᷻%+y* ½2Ko'vT86p2#`nu/=T%oE ǿdʾY(bZME9Onk>ӧ Iiy҄U2S,MN?Tk:Oeg ‰v' " +/PvId{Q&w3,{,isi?vժHqq D樰U+y9|1.6lӊЎo=POǾKqv_ʄy[b_fpH=пc{wV#<}JAQ};qޔT w+EĎRFe:흦;%{IJC u ,_F2o&%Q=U?nö$J*f/ʋV'G#L -םYJ$SmRx 2.߷0ʹ{39 =:g "VE"eR G)ωlWn1Sm4t՟_E, ((+:vX}/c6`Jir nm".`Sô(܊k+rGG=,+TdX@(?\Oh cd6_ަNN=V% ia91hft]%ʠ:tvjo>͍|HB݆OǭUYJwl BAGf!}Xc5' LG¡L x'ԗa~wmUbч^軴*DZ>ALUrf|{*܍*GB$N5/h ܲSR[$̃^^nL)QAuktOuT2KׂmDWXdfwUY С!c32wteAV}RMEXp`:uDB}68x]+K|~f鿾_fɛkΪ_S`ǫf:ĿF/ [YN=cg%"'Ў#šHPh6_;W"zA=Hc0x Bdsce0hBzGQsU* +ͩZe[ X{Z|:ϊ,\H$t;S gne,qQUE_ѭn2\7N7 ={ﶟymuI y=k͆Ȏg-3XP10xKa Q lp,Y (0e2 ?W4o@HG@+龿?W/cX)D[+{Тyc[K@Db'\{}6le16T2.FeěQ)3$CdQ.Bֲ~SA;w|47_F͜b4bϵy$;7֌J?Zqpa-)4',UEAO&"͇$#7N kГb *6%'&5hq1D zWPmk~i4 %]LYܺV*kDkۺr4F) R 8 tvOܟj_G }-8mꆁg jkYCl11i"ˆ똦#ĢC۲t&-Wr֌g\ &Ŭ3d?~HxbuH5}-zH}=ualG=bmNM]޹B*YcfriKD{m{4;_$ geC{k:T:8"g!σ~4ܤfAfǓUh1xuff ?tiJuR E7ڑ]$"_YM /45lB0bvQ;׫!OpaJ˞6y[ˋ2ؖajC3˻:i؟#ާVS]~t1A@ ZsI ywcU7f ;jRllf"h]l ^my\6]REZ3A?M1Fr r)Xh Sl ^VH]&Ma]+@ﰒS 5"tf+n==$Em3"jQh`"[]{ %l(+2Cc 1F9 BD8hC@~ÙC4.\*rF}$stR^ 7JvR?eN̆*ʆvu`?^7˛z3ͥ $WA~Zit^@=U*_NZлZ^l?f!&o whhcuաt)e0ۻ MҸuӶB*͎upҕ&!yy8G˕B Eo|خ}]\3F*t zt=<>/ I>^h׆&RI8S>lՑxx]~bHm5O4пO1 <΁}W>oTVh{< W+ x pŊflI@8Ȩ+~@jy(8YbXn3f땏 s<C`i~&ƛLJ>G>YcI#!su-*kAKVeցO}.~c.W>|{#YΐV ZWSo&Р߈=˕Tb&j]vb ;*GTim^.|> -\EwP{dPbEFug,pj|ؼr%}JҝdַӜ++z/MI7.ZD)H. h˺{_M j zǪyNejz3纅}P.}I*;}mo,tGjOx e4׻c{ցN.UK+ ౐x ^1]WiMӺӧ˯Ȯ@O{Sݦ9]C=Z!QnqoB)+>֨-oX(;>ā؜@BE%ӷ.d[c{VшNGL݋f'Yc< `WwϾ8=MȡA o<.8uyu綟W^h`@HL-;c2̐AK>P2wk(KљİL|E}$ur6W˅$s,.|'?t-2/}W^7P{4S:qb]nx]|$$_>1?Ly^j~bS+J+ 43{(D;b>:/W>~[w`{ 6c)Pܜr柕I9-φi$asjxq2+a8F9cm_;58dFxTHn(\cGyEG=ʶVmϧ!Y;c<8 fs Qy)xADkx,8ޡ`_lt^^NpFm%t) f;"=ξ mXxk"z>7/nܥCoK.?mEpA|i2r)X:e^x&\0|tKv0m $*f/Ϭ+rρxbч%uE"$;B +6W^l#t|~hʊؓ17֬":<86524lG$+MbxÍ2 fۯu!r>RYi>xE ZeX>#%Gne(׻`t&mtw=A(w:=9u{"P&DA_Қ~P|7t e?-(ˎirwɟ8Q!y9hm?zxY–/X`88wxJ:G9- ;T[)Obr۝"Wf_OV[7{47_Fݳk}vIV% AⳫM5zvLKi5f)E #cІ8mH'je$=x0erK߭כWcK^M{${M^>i.ıv(( ]U\@!ByOej志Q{_sG,MUT(ժx>RiM?PGJ02cu#/סnEmZd7vx}ކeb& !~x_Fl<9Ցӣjǐ`3%a Jf7GUVւD8Ÿfp&q7~LH崵Rc L4[`,S g E+Iр:vD;Kp)v dxqƅV!j{#ek2]v,#3jƼ} oS 2Y#DQXx,v`=zBp<.A?oA}Ҳ;:XƚGLuVÆp*[ jiRFj*moInaI鷝$Y>8: 2X_~=Y~wOjNr!i;|F| 9N@DDפ҈}Z,ԢC-NXY''F QW%my37t}>ˍ헱| f^y݊ IPA3H w1a78LRu 1+Uwp27"PdUt07_Rk3Ck۸U#IU)ŃOXx@2ŏPZB0^\`;t]Y]RWiGU߈hY`f~2Oۇny0)Y|;KZp2Ӥj04ιjhysh>PeN[pԖH1VEXZWt<. 4/Q]UBeGNj#0?k]E]$ǐ?nˋxp'Fw2XzpW:!{ݱ$5?(DXP)L-wzb#Zr76 ̑4LG m况p`z#kR +Oef_T҆@d="J8~0QapZdQ8l>fڼ핽XkQ[܍mDJ2 a'(jzw A7"AU3:qk!rYKmUo\ЉOۇl 8?fżE4^Ffem#>,N%&[,bdKiNM~E3EԚ5|)O llݺ|SYoX٘9Z s_ $ӷ/6helO$5P6So]mڪaSO Y,B8cK&VE`*V5mEC~ZbHm U1U7^kۼn`dNm{WLm9"ֈ6[eKcomcy;M`ۊ&>d툅u)eEdq^][~QP *sJXT {)uC.=z|碍!ajŅp5J]\H[|EXs'm+vNjz0 $-71\܍ZPH3tQVb )ԧNtjky$#b_8·g W^lƁ-Oyа5BJ9ně.3%ox?%)|8rʞ' fO!1ۨiˌFO,OQ6t辙; Ot|uى9I}4ͮC5S N?}*+-ݲUIJﶿv\^U?CW]t*hMdgeoIJK*V-t:4UtǞc[8~KQXXشU>w"Pvч1av<{ǖI >D/4/rJ/_]iB)7A0lBRGy~y(˻#UJnzxB=E؇eId}4gWUz\W^9 r]~b|i=>3}q9y_cgb- >ᶢ+Ð2Piq%Cg^i p ;GniC|qͥI MF*7`<‘Z.XJqr89ͲKjsT10\Lj^mjɛOjY_^ep˕|Ptȿ 䛭#Et;s6R:. ;fHChU\ Ț;~v=JCm!Tb]MO$O>]BV{_ߠ] [FQ- t@H2sJWwtOkXR kPj{|}}ڟGmD覫Y=Hvc-Bq]_#Msn遼k!Fgl%":oӧ QM;īK2w;c8d^rp(w_]Ԕn.$y3_)ܧM{d%㞒uD5Jg )`0Ba*r]%Ӈ[aIzg6 <}_螈'狕S Du!I-ѷ"~LtBmh(w7 7,__??=,sx}9!OTeOw,7_mنS#w"]gc˕a7ڴ-v䃼S/bAёz @$J&[I,#brϻכj47( /SJr nH,0癿@W3Įb[ $sȦUq8p#k*P_Sk?SGny(ۻ7f1u#Y"Vzm 7Nѐ֏*i>jȤI!ϺEsnvQP54v!9MrLDvGRKc lD:[JdƜRmzF1Q)/qvBP{_!Wo޻8:n&Q &vpӅ|Jw(m gA2lwgքJ ⬤aa L"Kݬـv""c38+x.J4f󒓈j&e\Ȅc즳[@*gj:^wPTSIm)ΛjJ* Ӥ.mp<ّb|,iY7O L|e"_cvKԾD:ES9!d/.B~qg\RSeXuR--q->֔+ԒFUZl;^+/"bgsZ'6Ёx}JJowUޱOE4gME푈|mG^L]z?Sϝh8knʶl S+%t1 TxMY^k?^ 7+OmBfC9h_5$J^m\ƾ_l2ʐvq1;g~_^śewjǍ5\'‹6+&P J0$ coV}[[j|XM?]%}C#lAX1}cƁ޽n8F=)z P~7 uiX hAhlQbu3CD8]/`Z.?rJ(0h0 cz8$(rؾK66VDD,'ne$ Jh܏[k!'|zd-mE%Cօj.~IM|o|œXa Gt5 ,RW r; ]OlP~yoFygj:hLY ~+cse]L X, ]"{,e nԧ,>lb}춷X>(ѣn-(1lqRxKyY ~J)VP%)D -=raJ[зfe#c|aq% ?Sڜ໷4=rb*~ nlw=QcKȌ1.XLV=ʍ헡|xQT*x= Žh `(9abo.7wZ5+0BhàYuT[g]=xdz6Ptg'.;)߻nI&*C]밨익i ~0sO008uaI@eT|:A9LNnϳhw=߿YUN@ QB}fRt($bWiv̏ơ6БTJ (>lEtFsV),VϨɫۧg{"Vi6plů=[:ۉ:Bi+ wA2FmFpv)F뚳ERVޟS2gWVxEW +ӺվH5IMi5DžK-uwкJK9r#a LEn+KRZ5{Rض`IdcGohR @,3/ƃٵ(ky֒hZbv:q[<ʼnP^e,jSy[g&| /w̦&Ɓ>!n0 T7x;IޗATMwSժ(M;/ҟZ>jڶ_[?vӘť\&ڑi@-<{6Pl;"'"z vȐ#Id]P;V1zn//+b+Ifr%L#ힱ'j 5P'wNLw63j)Adc/\{YN CN=feZߊ'Xt񍕟ٷ*dA8P?md,>rcKсO}ŕtINۇ%˕&%3C[IϬwAו>:@Z'T O\qD+bCI;?My5Iz e))83u`ЭKaCB}~۷#~8lj2E39i_~eӿLJˋXۇ5zb_Zo.̋*YxسgQTSQR/oURjIT*1⭲)VF%ݥx7Waz7~8\ȳ, A8^l#mLe4-R$8M )|?Dٰ =m|vVz%>mן~Z`i_T R>m{]ziw.")z>V s޷X646oiXB|Zp_}cj:޵ܡap~=zv]&=VG||c2年<}ܧ aeh`{J|اCd{\DZ9~t٧GCVѱ 0j\پ|].(x?c?e |l髵G)["9;.6oxy¨z~#ªWVXo$o|^|7~_FGЛIsv켉ǒQ8u5cNh]~^PC{ ]mx>@cC![oFͧf/W>mI~ܿf{wÄSo%bu ;jMmڵo{mh0_.;۞>dJ`UcϦL]P Hu#eZ^|> ߈|32=]_4xi`y*.j̡?.Fݏ(|-][e2Q(x.˕E9O_ L+U?e|ȿZ[T;j}n3CkL03v MͪpPh ƕԟ9miqs·`ݟ h텙Q~>YMe'ʛ$\hU6#Fѭu`ڛ-Ke?g쮳=i܄#vVDžLD1.Wrce,E >oΪ:ChPCpWDJHpgJj#9U\ [~@ ZI vt?&Akq"#HQ~wH yUҦ徳r*lWK][<ܳߖH^N<c-1j>b+>3f,Q׷Rqq "26$mgWV ZdMVSHy#J!;n% {.R'9!b^yđ  wGae@ :p\ θne 88l;c ٍ [Е\ ܘ;1n<(SeC^>,s)Mp $ndzK{jՊXa~w-:rCų+7V@-]/~<BBZPfTc~i "‚R:3|A(hnX!>$oXq*D&@Y0 Qa\Kz~>w09_l)Q8qbcj8W\ŧ.qCf[1~x_݃둶d>gW+u/0L܁*U|ZbǂU6tMB*t)Hl8(^mF@Ҿt-mZ>'"ԟr 7AeݱQs;)X!*~Aof/̸7d[eaqڒ,̦x+qԔIPsnǡǔ:6DI lZ wkWHiy7iUt՜1[@rpF!fր/^}C"0v u\(?wef} b%'NB)Wq&aX@V7%OƔ3fa 5.EhXyĠ7+5kI1 q^E K'f^HGH7+hQqw&0U%.;r.ټ6kL%o¸R/ٴ[tc2Mt¿A6D&ޒ1D9O Nj1i4?WK:Aρ/p!t̞{31Wv~Q $ZIvi|g(jF䎭j[LŚ&{e)@‹#rg;ΰB^VbݷW>U\4Xl Su3-%mkNMiaHHܠ1ⵉ<9Z>NP9<) >߶#iQ,oiWpPr1Dšܔ],~Y^,!ʌYnf.&[?e{8y ݪV:~4ՇxvsX'ؗkE%M '66Dx3.[Qm(u V4s^]t L6ZBb~ ah' tMayVTǾ /!XT7,v_źDeՁ1"-H[jQ`xEܹeNfPNݶr,[dP,$% lL㴲SSPuD`,bt&ymcٺvj# >F${;/q~%)u}TGAe\_$mH kT+}iJlj=i-op ;xE &d+ a\XsrUhWwqMvʴ4`j=m\$sqwd9BT? ۥSC)[Y>x0YG`a,n[8<BU}?6fژDKbUQ=)}_q;svW}X{52riYI3gkceYXnzIX!٨k]:i!|;3-bKz7v;[kAgVV <çZ"Y;ZtٓXPalC%9^-Yc? "V6>m\rsbeX'qMi yd-M/syֻ3`eX/M<?fɍ%Xë7_:M2r>}8膈0w]O@Ǒr iaps(ޤ+t`6х-smKS{@~&_u"ǻ /H j- f]Э.Vv%ǽq3]) ,#D,KT8e1TŕO7FFmL@mMqoo'}tDڑܾڤ,I#214|%>di5twʵeF;?#+yfl q5]WRػ"u/& U.QwuL]Nd@vy[ZwϪZޛ-% R;P]fbl]YΣkS,j8\Sl:;k3W JF9oW,8:c{᎓.4JB ]_j-bIR~ 1A׺öP4#o0 mTCqOy%8/ngɶQG3vƓylj>x+ʌ ע<|)x|)Z_u^3*1PNU"߮H {۱_,}b~3`;+s펓'!#/t'SDSQI`Id8Vɛ)ꛩjQ^{X'MZ?p6 ~ZFl 'ppu\Mu9˅MǎʩmBj(TcX sTJ8O:%ox.\|:4>|F}"G&i*Nk:3rH q*R+#us8Bݦ9iQa#[`-Jrq7̆4)d|4䶭5 9X yK֦9$^sO?Vpp|v4у1LC=ӹݟ۞Aju3`јT<k<1V C /o!޹9Ξ`6H|7MF4׌/C)E6xuur?칈2TӅ9PofYEm>Be8q]WbpW^WLKh( a)){#YJlݏvkd/7\je_ˉ c|8A aAx~7śzdԓ ހmq\jN[b;k=nKIa|ɼ$^'<8sSlӨR ˩ף)P&?*3t{S4KbjJ# {XM&gVw*SrgȤP;odV t6ȧSʸVQJq.s|hPa軚aa 跓xr xrc%9w+S9STqiGXrޘ=b-E-˺H](?'XU~yo6pÔut=9y6XaU ZDXu>o/o )YS M)&W{ hvN..rLR{E8d\֮# &e~g,`z]m|:4+k#ēA(py.wM:L_NQZi@vjXֶ;/o&d9@bz̍!;XZFd*:CT?}0@e v M{oq.0Ѽ3{x}pU5Wf"|*o/`Gfs7"jKZd,v;:wC{˧ |nVdT8|bB(#J?TUOA 蠉IU`Y@ E kby\w@$:_xᾺC$ $E$y>L~*7G %PP6SQaj5 {7*[#sKApZ1SWxlj>+  s+AlEXAo`ƞr{|Fanx b|jn1*\,nc{@ui‘<Թ$/ ;~Uk G pً(0>~gI}&DԕIL$yz?NM|9[e.CԶc酸3!U1=5$P֓W+Lһ\Fn=% G|)\[W.jY,ZQ1Δ LC ZGX*tL-sҎ;6 蠡+P4Όu(! @S m@7Ɍ(2$ ZKto1Gd*Qyg /dnm{/ɃԴv:r7X8+̺Ujzpf@>c7~MZ3}x&?м}bme;S j-TpYM(jMzf+4|_^Û=J.y21J~-5O'EbV.=c^M#i+P4gߜ9KlYˆw oCE*OL%u!WjKf<&@ 1W$'44ڑ J 5.ӵ6 P-G͗fZOOw`CWw[D?o??oy? 1ʢ_ޥSfL-joO#K'O%mGaEdq~?/)ow7?_;?5ֿOo?ǿO_Ͽ2OoO?j_//_^~qSokb)?%>#߷"~VgV@?Ώq:/II8yH DK"סJ"YIP}E տXnwoX, G9>kbpT*x⁻yRMy}_*mKqǯArRm=k)MoT<*j__ԸLyٮ>'3i U+w-+79$*B&[Đd{i:[/t6PEID<$$GHx%l` d'@}:c^.ozKjոI麮ou+`^?`gqvZrR*C:xک [_o GwEcǍ[[2=ԧamV'z7~Bɜ9\oMSW~ۿ7sQ)9RoP,3,<⡓I*!,RcaP`Ӻø4o[?eC"G38X9M|1^4N9`V+&`{O3bO" WαFy`W=F\Ч;Lrr˒Qf\\yB@D0)sHmSIp7 U*ͪ0ս-~L|H1ԯM16V17[ahYs@,u"abykgOMyP&o`_JC&ƍ:\PhH~x {L<{hi_>OzeN{@D`C =;*zѫe"|_xoW)6;@ˏq%ǥ\NYݷ˗77bc <=#{4cpGr}8&6U*懜*L3 翆 7ѽ'e?1? VJU[̛V ֯n*[BLW*D?moOY;۲tPȖo"[ EG+6tCW+L$O),=:lڤa_rx.B7xE= 1-hV-Pni1rO鸿T&ڲD.F&t^><C#;Yu*ڏ)u쓊RY|҄0^.V2 9S<ЀP*]r@ra'RSur+|1GZD!eSƻdhEM)H1feN.َr' 5%PR[ "d?/[ m}DE1ufݹ#8-~wpQ1N4B>1x, "\X`- ڭ%8]LCmILV`}APiaG j~i]nw/S;u&p٦CS2!Eðy6 +[u TTXYK$O&$}._G)>$lA!ۂWS7U>mMD+{U6CwUC#6t,XvBԒ*撊Ȓ)6pƛJPl4-<^`t)w((V3[2Mq*{DOd8VS}EGS%XB[Y=;S_M~l̚P4`84E&2_.jmiOsqt7;ޛY6~ ױ%3;a:[h!ȓB~ZC7Y50iRكNc;:1olSjrAJT BD%SW*ݷ0<d%c.-U0 Ze5uۍpGr!j%qCE7a㹛RՒ@ä/@&*)iz|z׏d.:is})ܜ~ xb+yȀN3 {}%aUU|MnR` rY"20h{ $EuC&1rñv2o}0>&MDl=]UǒyqЊc)4k!ٱ]XSlbQ>#8Henj]zcny0uRd`q Z9 kC=UոI'פ~HpxY}pAa7/!VP 2~ P~4ObteLU{nG w8|ЌҒ' IPQzA1~J~UKhhu,@ M}2'+yQ9b/@s`5@;|h0xc˛( |aV X+M">46>H ֈL$)|WX2z;gO"9ǚtgUOf_1fv!j3а-wA=";.R=";6v4>TV.mm4Tf甄%\ߥ4IkwMJv[? 1Ťѳvnx/VYsd9>2J#+&0= KVv@{Ht:ښ`#܁?]D+j'` A6 JFoJN0}; l5v` (jm83{tj04cN%& nk;og7/]OꫀlQ~eHViOU*lfJFJҏ9P[?DexC%ޙ'$E*"l-¶#}A@Yil3W᫷K.҈È f528W]l9g:|#Ѳ DT_YjB*`إDzDD 7Cz.[[;?<#qҔeSk{`u71 _fdGX^(^5eY)g1MԆ$\l5.ⷅJJ/HJx-s엙ޛJJ6f3!y"E8A{t|?o"Z{ls1ν!ƶ`8͓Ez\큍bb۟DA4  Y*lh5&0~HJN+DQmr"K/`!/yqݛ.7͕枒qUҪ 9䒙Uͪ c+mVK)JBy@M5kO9NBpoTKu*Vli\=v}zX˽0]Y1܍ønm{Iz[ē .Iq:_N>7kgo5Rk-ӭ|㼟Ǜw&4jT m sa1yi JqU@:S.鐄AVOd⛗~8AsS*v;?wӛ-yd$gn[`URGئl*-}&eE٦{`|Z Tmk]5y ̽Ðz.Z ,~ePsH5td.7H(Dnv~0nEиI ý;4//"fI3F>ĿѠm3.(2W-y|ٍ6݆ е-djC:q]@ymusF`X6lRV$gdk7qR Pk)QIcOgK\4w3Ef1> PsDwGt.=MAMmxc_@N^HA.q.bIñphpH:öx%툝BO?c]%AG'P V}N,MM@% ި_(#+L90Яd8QQŵ5B(B:c%C hj:&kjH׮O\OVg1m}v24g6la~nh{mg? E>*t|8a N8d@m6*ΎcW\-s,˄^5)Z:&BZ-v*XlU?'mlm]6(NϭӺ_^C{5,'lOqvMEOjNTԛ5FIۼG@=dnt7F]l*GҴe1s-v:$N'W![d$$8[z/mJNYݯtefua˫o U>࡟8Op|v#8(OHNÊ؝&t7H*-Ujia 8"PMvx J)#g*}5l%)[]?ޔ+=T>ѹ m3:Y^t}7|ck O ~gI҇1g UH$_1)rȓ5M {7wwjf_oIїcG5,?3>𚿳dSŦX"Mq; :/;1C7_` PV_)?yܥRi,D02e:¹0W{q}ڠ`ZUAzlB))?/|ՀS? ,<VT"D 5X)*x8e߽7|q28['70IC8[1c)Л""7=äc\lfج]zu52+n BR}va+PD Ӝ >yY)j ,`rb$IFǹH%sm'!Jm>!}y đ{d $o#7ΰj[틃q:g%zTUUQ%ܘ 6',͟i0 &]N6$9e+M6"6cJDy:r6(5$4aV0 aU/wg?XEBp^ÈfQ$+ ;*sFd "%"QHtSRAʢ6tfG7({"qrO8@١un=ؗcrflUm?\+KdVezyYHM qƬqDƅX4 @I%lhuo,m /Dp? XoOP rpX܊e+Y㉄ׁ=(a4VbpP_omWJϚj1b]Xc+>ENuHDv8Fwv9Tt#nI[V*N\\y Bb/hemD$*:’Xn ~ Cf,!mf&wO/fks՝'\ٖ@NJo[r'ÍRDВPf-bK p Ԣ0[$h39m۬}Oeck9 9YlfN`X 0]e[9XL¼ q%]lx*'~_)!э]pň24HR%J.hmb}Lh@hEB)>,y)`?Q@3;'19ŗT|!w]/U$=QA@'Y˭{Rl caSv6Q/I .C`h)MZmf8XA$]7)orU: APB@*Tc9lŠ{!J}T]EqY|I@E-w 5qno;kCbTҿ;NsZjMmk GWX{c͝v}jqRߢWqkkPXp%aX o@Gn|bEVEe"O D=YPbx!v*fH3cC$@]S)ώ\5Jү+5XԮûҕVj>TE}M1)DC,*Td%5w;INN!ucG a`J/LݵVճ(R$Dŵ>봞h^X}@#L,zc-nxaMߍ T{1(# Xk{G{CiƁt*T"A> *411 HxO Tw7/T$V󒰢 K0i&͛)a@78jZ$Rgsv˛ e2R}l}ԯVi&EV69*)K ^=N`R}%*f 2lbrvo8]癰;]wUmHя{9\!Kf\ tg&7:ZvH.\|5Yۧg `ؘ]4gw|і^9@=M[;p\I0xb+"q*zSt;}hrӒvB@g@몊0xaIn!d-se)]|:řkP֍d 8jVމ^FKLJ+}64LXg5YQB)#~}"=q2zo,HW5>oX oYZ +kߣq̎ bwƫZZ/@D1S O5ie_Y#zR/QB!Q֧kM[Y]M'xquw%k2x ،9%n})NuNIZI4ߡRQ HK>o/K<[{BYy|cc-(пB$KDjy&&//Rj@w*w~alXLaVb COZ=cujv%!Mr ŬWKIK<4@!ݘ>#Όd@Nܣ7'%uo7['KPdl?a 6bZ6+!瘀y%RRَ_T '$K`釗od:PJCVW?FN(lȑb") uG@.OLdntd*RVjV-j ]PQZvK#.[UMS鄪3+{OvATsWfL5ߩը:} Crl'~dͽ"! m&螧( zcs" GCDU=〢F|@LTT%O9E'1|(tP#I+ėPIgf+7Xj+|D],)_}~2כs\/mKߍ#&5U"2&ľ@RpΔu7GD ˋ}){B@zas&t$,o+!S mrŒY8nø}=[ӛ B,) nqVN0j,L@s7W&6UHe9h|}6{:5o;IS}l8VvQicۯ8{9%n/sLɔ3[+؄Z3 .lW$E&-\?poJ6b- t MYE>e؎UH,**A(zQ 1P5Fxɇ]VƏ5M 38|J$e|1mh7pO=6w{#$NϦ0JmE͉am`>%j_D]فXaץz?\"\T;Wx3m~oo]guk(h rg￀uBJ3@FS:9^'}ce(ƈJ0& 61TZ_yRbFTy4.[kޯk#K|S(=!Olhx}AkB\ f)s.sc<9#iv,Pl׊\r{b;=PV A%JrܐV$eiM(eRiіjb[ID 3]aQ(gqQu|AI 2R¥px`-4N FD,(oc@Py!?!8gLn8!<y0 y)6汀@O{6'~be^S:*S]I@jISDDE(Y뜦__/S]'yZk'=ds6yƆ&r7ǭJA Y"e)1Evt8sUaoL=Pe!0:+')h9k$tJє!wݷJ b+<ڛ`֪jg/八e rRkRSD085brF32oꀂA*nSmx_$C' PX$ .h6eH; @ؾL((| 8ڨQ]f͎]ǯ;{=jG jj( 8J]Z鰧Kb8u}nL{'E@F7V<%yi$ŵ/N v4:~h فʎ anmױJ{_ƻ'sD\.%XOn:^M%WA]G8z\LRa7OP P{76Ɏ{ȧ7*'1 h+M "6aJv'c&6@:}6Aj*%4*CTHY jaۯP)fyoO8SZn)P}nl˩| dAIZ σԸ ҍ. 0U P,(c*]lUjTQPЉ>R{mO=gL{5MCO+0b=X&"tgg^ %7ViY)0ə zMbwc/v{Õ7*GM>.j~5q_GOah:܁|)h [h)!_4ڤɈ/m 1ݞt0P'-AKxq!ゃŸ&L@CR̦;SlI&DoBUy ,{h]ŏٯ 97s.hQU1fTuV6ZA(uրZzNӴӨ x9ı DHEvq9TeaccEsz2kK$dsfHC%*ymX&W&qMsT!T\\~?n-rڹ$ALtD:;C ;oE'xoFb f3l@YX~sC??|CXܦSX9cث+\FyN"aSRcXJJp__cz\)OP![¿LiE.`i%mq7 |ysA.61ZL~1"T!ĞP(+Uczs xsUU(2\oI屪ԓ"Lqk[S7"jPatLjtth#nFE S#ak<@:wL-t_%3^jo7]Gr hY:zX&=_&|h 3/.U3DbN*1Y>Bk2H~9MD\רٌ0u#k< Fzs >ʽ]"aFEz3`}M˗P+cA{cJ 6;5Uz 1WUfz_5K ׯiH1?GG,␽LpNi29Ӕ_|k{hlbη|!Gium SEDZxdr(HB]BlvšW)&*9HWޛ|H L(rL|3$*!-`H/8d(AKZqsMbJza%WlPV]0PЕjuPx;Ƌ5Gb v,gyy7NvDZ>l+}y!*QzMZW{@ r5`-/I4:bZx9 U3C~r?=N .P@4ÿ x~F"SikPÜ|m\|tcJ[?BHA&Ե_^M=^ዔox3ή!w{`z8 Pg` _xˆC:atUZfD7bgbS^Qw!X9}}Qv%vXشqڶ?r+0")cfa1"藤R$8J~I¦6F=I2A2Ɋ>Lٔ^Lj.0l1a`>!i-Edx|rZ ?]0Nq RQ gTŮtkD;p|U4SАb&Vqa˖|tbjMؼbJ<$1h#ZR("çh1! zNgS/Coe.^(PF]"KzJcĈS\B˦#,ԟkRM+]C)}2^(we F8EЂ<T Dx\Β,ڹLK$=] Cp=0lipanZT-IA.M*%1㖕6}ZM}3PNOoW5I."jr YxpHlHOeDEV̮Po=pEMQ"RNӬJ>/'Nh="d72lS%c/>BE&PcL7s!EqnmʱǣQj000ؑC~>pfb <#d8wH64SNFxq=btsِt}ZM3jc}2 utO5MػlM&]SL &i~wJ3KGb3y?1^_%-IصAe{7

>Ū`n] b]}pT/u< [> A v3Ui!Oڏfel|7 4{Ep#C!PZ u <뙁 o䐌F'"Wii=aS#Vq$`!,%)~0Ag#,;*\QI~ͽR/\Uի {kgqPWE )uE C\g21g4"i 9},qxy;eK.9V`M Pzw:{.K p/- (K;-6ƥSEDI"Xۺ;@pK.6lTLp7~}Y Wf'FVfw9Ү pV#%t΍u+|$vYv:RIgz"*`&kR XO)2;?mʙ^wpgV.>@` eg$΍wEr9:HN 3n珋b)0Euj>NK>PGG~w[cv}he fN pYUqpn=L DjY7V D@*; Lc}RýEL |Ex ;ֻ*[QKR7VgfĸOPYğN#m]tDYGFm'9߭A!$(ҧ9aՙ bQsj ŋAmhdyw*D:ך7!{D'Y nj{ܭ!y89NٔԪqyRC XTmBS]4 \y{?<)fZ7b%< Cp0麕J;#P$COkʥ%Ůf v:@N$V>f&~iQ,ֳܥ4`*BdŜDhG1]G" 7(0wUnm?\{.<V8jQYRHԴY/T>^/c;1qxG"wRUzC- ̊vl#!CPqK&_zZ) ACt5~g~VZڦ  avf ,m]*a1nuYQ˹HC!"t%]Ib͖CٺBSh?F;nU4 d R;p bMe[OLz˧d?P#o1SNިj5gR\#S溵CgPzk֮Q\ZE3c!}BQ '#{NHŃ5<6:'+C_$R:!/Ofua oob#Ii$?Z}hNSsШ-jq +3>w=_bיug8Pm&ќ矖*rۮCԩ6Q5PE(WpRcݭMę"{ݖtglTW02;w* <1Qt<:,Rm]e*-B{ߤꇖe/YRM!^θ xtu clq"e{S(:,W6dL&քP6@L<# Cw>}mͨ Ht]i|u,+9JH Ǘj0։Y[]+.]Q B1Fuw s:03'S2tYeZMio.5 gZ_zvOD. (' Բ"tJG${W9P9aП=p?2ҳKeS􊜴@p#h&2'"7Rܯ܈0i 3uxVERl16֘}ߙ>lW]m«UY"܆oU-CI|hL}4 ``09sղCZ~CSectW˭ $q'`$M6tŪ_;tFIt r=_'rը9OŊ=1fx"YC"BEV<|3-nlLW.vgUh)5L8Nnh UY0 @q̪+I89Z$ nA4zBDUl{{t I%Qn=`ɑ?&kK%Ͻ J|alҭ_@AqycE2fܦ g˛AUjC8#Ѵ{kV&YztCr/4LM(S]wg3$ܟE3^*sāxwHln۹bgVya<@iӥ :JgEZf 2SfOl]ot36vBs7[M2@o)a$[: fϸV8.̓Y:8O 裫NMڈJڼz.Ns""kjb>o痡{°Wϸ6Bj{?F6|^1څ)XP7YQ6y10z(Qݺߑu! *ףKߟ˷M,_SRfq<ͿZŔa} *#c L[|2n]hhx%O:b֦dFa$Cl=AW }S$ 좒j1iY)f0L5b$ Xj-uݜܞC /_9! j&8e5#+ѼzFL~>E _iִ)U1>ecwsVUôPt;uEt^Xb %%撀jML3\ޛϹ`v?\J+JJEE kirR"S+@f&F<8us D[TC|(Nta(v 3cE=*%nl?\I!SLsJ| )Y!ݲ0qRP>].5ɡ@x^ͳR^d'.^L|la|Vr.r`I Q5EO9]Mo]4Y=xb%el}\6 3xS(}~[ =vG0=4S/ s?7; ?bYIR"bc weejo3E\zK Z)$0wZ1k7+;[W%[Gz!# V2P4=S9om?^; M"oٗ6gC^#yk)ĕNn0!E(4|X_Ÿ}$D$CN$Ud+I<|8ҹ,wBK,zUlD9"XK38nⱫtc-Ht޳l][-uZ;oDgIߐReL.1 јzIcBnvTY&KN#aId8+޷%ڪfSDr>pŮ!ȇIyVtɉ2'AdXhIz/]5Ic<~1967S^7 E:Mבq"}!†yT;U"Vɛ]x<l?^8c΀ 5KҜxj][*TVf@1!]%)wv) kϏ4qB)%J}#!ؠj>-^M+aMb*?bX:N Hm=OP)>eNvIeڌ' ͗Pl(M.gJ^Ui0KhrYnm?\ 0`ni(:tnq-F!hJ)N6:Sײ$=a^DĜ7Bfﶏ$6租fL~[ xy5yR/1IY]ȃ}v-(k5SbM?Xax<~%R+8^8r6DDz׷@]~gQɴ$VlB`L Ё,lgww/zs|mR6 @xgƖ|,/9-LO\AZ3Rq!CG t^ѮZGZ7v2a!dzPv픥P5;(46iV(؏ֆVRZ*(wD _Oa=m 4Jc) wu^29ZO`T#ט|P5h<:61#u PJWwx UP~ip[a'}pt8lbG"C823j>EC U.OSPHT=CIV%ks2OR"՛jszj iG] tG$kj'#֖VҰ䱒s˝ \ktr rJ8y_ZsSs9Miva5|s/] 8ZJ".4ǹ.'-КSIL"ىӥjKC{LuJ# i[X/յg7ϵ`Ѥ~J]_e_Եbuvוd2َm ÅXя^F[ %|Ei"6>쐮Û..ZN Mkk*]б[&nLQ-3?Rl;,! 96UTG[&ەh*c0/?6-?9I C/gH_nw֑2Op&mko/<,zClFˍvCobx[G 9boPt2oO$+UƆItۢ>^?-L` jĝmV!D<,Tsjr^o\ Uo!5Zn~yu,UdxF-b2v]qbZ<^B0jm1}v'MjW8)c,,M`tZqU.nnfm"6kebܔnDSYE}nDÕjZ~V#XSuyV}gkGꡪX͹P &yQ(H]v=vLkVx)bIF9rn!xj`琩&0BI!t%t!촒):jLuu oXvLq@+RslEۨ!EO$p6 ͜8J{C}' l 0pP0iorh];% 4F"tw34T ^#dJ*Tђ5qb/yZ"$^U87t>L! eK 8#b jGH[v83#EEl=muCҙ80g}t/ `9HrՂޝa*6`š6Eϕ^-]}[+m4*y"MQH8DJl54Q3 !a\%5R:M7KL.a,(+3 Nч@76j[ LIϞwWI˞1T9a}bg.3WRQ:|lItI2%nғB:BLwcB +R!S LLTOi.u*SlaՍ+z1K$1TZ,>R(7^ݠذJ*M~: k$Ɗx>/^C^vz0T\f/ZSs>6? adLMNf#Jd$v:ދ=CV6Y"c |kfZ#GSpܙ>#[stFgV^j+-1ui:̇ʔb#[9*d`\3F"_ deQQMӹMێt(ыEh;=n#ylm&*bԈ ˔ n7 K,Hk̻ڨ4v^/kXj%ؑS^Gn%˥(307뎢鬯jPj28!k+qIa1{WwoR5cptZۙlUj=I)/~$7j{TQwߠ]R{BFVtA6'.ꕩCx^BSe˟m}|G(7`DB)i;|K}SN"t5ɂ%K@+t~_3drhZ)TZZ-0-MM I4G./%Ҳm U)A#܅hl8c_O,Y).&;4rM @U] 13(ˈzO¤˖oxy_MP)nh:akh!RUVu.QgȤxu%rmLJ')RB`pnS?o w--4]¨.CBo?+ޗyuA^3,z Rj k~[6_=rr*Muzaq$(6{!p;dMw \S0SՖ,Kͤz%LDDiU0G0ips@BUK", + \dN`k8eˆw'^HJ mQ֭v* Wrm7V1JEVCkkeWWR#&*f`OTMLaucHw9 oMh=yOLv{BE[«kV"jHGO+8荮Mix@vв0tۼq?nbxysOU"MH@ V?ћlûEI< ;f" gҘ!N*%ni=姏7 vEa@2"3aoAa;Q绶P㯨b309H'24$swfS*JXd+i $AmK4 =[g $k~qyNRUM;nyDdϋږiN7;8; f^QG5[f:+m677Of2?5<*8/#Q^Bl#b5emxw]y .t!qi=ty]T&s ٤,P))3`E1RYSj|l,}q]r dHGPRKjɼͶ=[`3(4T\sxxi-l(1YN5>؀' gXl"; BK`jyCP TH %u#O1~j£:"`Ov⎦^]i~Qh&U~n]ATj.=7^ifHý=3ሆqY[K85sRE:DQr=}8>aȐe^r&ϳ;Έ:vJP a^e) jm M9.1B FrJ9|NGF9a~{Eh=N+xTbu+Z4KL #;Pz-i9QYXBՒ|CLDx%tO3U]e =MAq+81lB &jB ~R֞ 㡭5Ra?{D ӈ8 ϤNޗ,d_DWefDƜ۬Eݡ"EY&g-Ҡ= Ɵ5G aH,FisI`Li?$k(oM"'6'1~>) w܋!L%L]<-XHLB۪k7GT6MXP~K+T-G XT};[Sun)p_B4jRga/?^KV~,m9Rsmh%g?/9hChIDxi\a[Tk%JuXG3hYЬs_TPqlQ[dﭏ<6x.FK@dg,nBr./1gGwp썦M1[7)544l]l?[e¸`ltswIIXG @~PX&eIgYY)X;mFESqhSrim3KJ !p %:% ѣ&G =N/,y }_ D4h.yUIH8sh6w&j+RCu*K؂ȓ Т9s1[pL^O'߅*讛SS 'S[}>fFX. /m$/Sn$8%i7&sb)6U;Ej\yW%~_14 Zn'M aHitHorc{?DNQ|~`{[sxEEX's67F *YӎW#CD 3p15*Ea0X ;LH=nj1KJ##"a.[9;Q|zu|1}?G)AZG16H $:`ۛ)I2dM (*۶6epg{?Ixx-%_cЏT'?B1Z~[?0U0ď4* 5qX`ɰ@E @[_A\U]V:iR- )5Sn#u{@?gs\ Я:N+E42ffQkQe18DlwiUO|8x;͕qٰ`${S*Yli7|sQ^tV y Hh ۋ8)Ӆ"D0y&\ΔЃ(*[:Rz,n}M+GEe%ѭg'YZjZ_"X_]^"/i4}^_Θ_?=R 29xm#5~n"M(b5N/Qň̓ψpk}:a#Y+ ô**Tmgn*ʎȁndccAS$_< Hf5YHձiz5S:k|FWI  ] RmID ?h Nm)XSgq%d筛Ajy&q<+9~}'~|ʋ|l[Z\P:Ku)-Mq2Vx.Z">ua BM/4yxxSX|,`%wl)C~R0`8¿Z#&UuZ~rGZ4\c轢NbUyD4>wfbo I``fIQ@.Ǭ%+'PB̄^+Ic ٠G9eRn_]I!zxU r> au-MJ\OU17bPɳ~p>!W=dœϟ0E-YoKOJ6r4f]KN6Rn;zC`͠vw2k94 1&qXyLxKvU,N@X:Hк/9'ɴe[TC)dN\,6(h*gXO)E3@|",kkZPcf7_krZz2`r"RΆ%cw›L.\6HU ŦƂFP[b bѾ}# 'I]i5#kapePQ"IdAkGv[A;L9wl`EIhvmZ_r%n*~oF-?sœZ},`g /(4= O"GqWص;e{7VgD1>TjE?ս&CrI4a8:+]Xk{q\jNeZLJA^]$)oWKדOg\M?Ѿx t itImB+rtr(-e;]Vuo[UpsZ̛m̽ }'=w8E/d_X!  _ -'qzN66~u>~)ԣeDOw+})@ϟ {Ey_ l tzăк_J8LS_pyySuD7r;ZqOvJp2v"XrR8% +z>GEI,ƶmlYP1ԆaDӅh>DaZ;cёOy\zUa?wVyʫاKABɰ`(j?[A+b J;B1tceokezsaE7FʩAs8?\ZVI⿿1u)F芿ˊgJfb(Ti|1d<_xZ͏ F¶kj)Y6VLH89W$oE1cF9;6;9|oFn7M+UM#ٿ}%'T,V'J~BE'BBQmba?_'Q<|S^qkUbܲPlh<3f踄sEf*qS Qװ6;з_C&\P B9bsXחډ򓭦\V\`a78UtT`9*o4mb1s1>v{S1`8ფLtt{ ձ#;G%[#DQ ͂K*A>nlc鷀M!*d6`Oedde>YU^\w|n59->qK ᤗBoyeSbZk0[l*%Z*Ǧ+ZooVF Hi,qI. ͇)m!aQw+I| Q@m ZYg hߵ#9Z{U , JrV9)^xduV{9s-s"ڞYьHܦ2ǯ_ϵ7.]EK!'CJ]\Cj[Q-;.au^v4ҥ߆oID9?*II~뾦dlDz_p}`3xܴ32onHE(B%_#T,xbWť-IW~aXVUp)>!tP"^p/s/i*@_P *BuƶIm=Db0>Nq/#!g"QB4Πf.Eq9[+ &¯x] !02)w/lZ ck!ԉћYWGJG-_΋Z5sTX>Pۘk3 ?/LQW靚x%k%z\> d]` L^7\Ьp 7Z'/V;>3 ˹@uW\D$: 9cTW# H'dUe{Q{&:( 9?Md[Ϳ<>dG9!U_j' ?Q% ^j&9FC"e4meKqxsXj:WZ$Ё:bF1(4(1-aS` ^mފk*`,|eX+]I=M{ieG2Y"84Ӌ/eeת/1 C/?R='í#}$IGw/P; *Ž#I um]m~V-C϶6S_v?oߞNܚ{[U6F/A>7w$;tn6-jB`QC6B"Rqkt!uV}v >UU3*5=k@\^dv[ -R|{I{-m~c,]^AsĖę9C{U}:^=j#R?%gk!X^4$S Ј!UڡWSd7sjeA~sP@,~rIXoy\וcA)̆  huh)СW54ʼ-4'd3ECƧzg,V}6fj[߁l/V]+%Ew_S;yI6kQ1-6L^^IYr=w_3Ћ>RD#I]6_9J y fniFsXU4jm 鬡Q"lQ{B W9;'XJ{UE[8'j Kqkݾc[ͧW_˃d/Nxh08cTS%n֢~3+cfšJ+YH)}\x$0]|?WW1THu!Q Ghʣ=hJTx3SD. WQ<[^.+l9/Ev(.lmޫΩmɮ#HINܒIypx6 ם59AQHhlsOwZrDLC^^m>]it9~&+ td'#RrSt4O{;ysBh݀nȭ]V0gd6k/$5м}Jv:Tu<7]9o_RU]w2i8a9#vjj%w|;wfxK-pI4qHԾWY1N--q28_B|i5exnLjNۏ1^6a7$:9I.kSI<(>Hj\;Ū@HP˦Z)#ӬjdP#@upӞmIg##7ueuF /&{q$ ֫zNJ=e6N}<ѪT4ІLJZ" -PBoJj]Ol~X+-L%CE:}!uoBڔrK{,־4f'SQ6(/ߌH57FO}m s(h*w@bssSbMJIa8 #RU<;6_{ hsh]gARsx8 FTybA#Hw853_oif&ȷȁmW}2/be]̹N︭V_SuXK {rFۑMo-] `zWױHiCZМc:~["۳*r^%{h/<8{ņ4rY S骐޷W, ӱbc EDeH]h澜a+nm rדRTosn*"W R3#?׬`Y%H:5M TyW"qX0n{PNgWNgge-3 KCqz½mdg %{A08#%$ b+$shx =cCk @W>鮦pp5,fԻClڮEZ>h-{?)iD"\ <ܝUcrϊgwQ/ozlgDՕULNs΍Y/|TgK1 (Zs,8NWm4dUG(I6JE'1՗eK7ޒj}K*#4rB,.Ph\HhZꉫ?+ x[+C2\N&lK*lKd;ܐd*Z"bxn2ܴ򴹆{N>>Y,U֭ :A0ef^-6 cn!hߤpoLԨ>W Y)[ bIY%Z>$UվPT>0vSG Ipň;ud]=ᜁ$gg;\sW/SZK4kۉt<:Mt9Oem{Xf r_6d~#&*ca뙩;^T`϶7l.f<`]#>f\ }Al($#gGYVgRI}\<5|XD+h_rvheHONZ;5=J0FStjT7"0iBxKUeN]+X,((ujp2Nua( 格Z_>[YŪChHwCLsF=eYp b$%d ([AΘp>3GE<qR"4Z5T (Z).@@٬G4|K\{.'fkW!Nr;ӵKJ'g0;)p׿3 x3dؤ+ VP(J.}Q$h!]GFSH8u/~OCKͧF=!OT*ϭ\ZJ9MC05x1BZ.R!B9ˎ%X`{0%YDq2O*ANP743)I\ [5-P:4A Op@M5b#zl󠍪cIPsY&cI̩]b Uҳڑ^6/ {{'gU:kY_w˒ckըcU-{@Wpƨόn)b;#: Dڊ =L!A+}KH`Q0JtE v^RP#쾷>[%V]1sL2,BH V2HN -\Fzll&no_Է욢ͷkYV{pɳ<Գ,E{AT^V/fb^"PD.jQled%[2b TECοBk7iXufɇֺDpb]'k D!Cb2k*ݑꟆ e'#UۋUو*(G"">]Rvw w190zi +׸fAId)FpILc|=] 瑾pzl{]D wb0m]C( uh/2˱}yPrɭ)͢i_N-H#w{F$\%犈"jw|R"Z)jUE#܎z}C9ş?} cpHgA{DC[ۖlυB㽚 ȣB̧_ꬒ¡`^oKU/y/2{~czJxM7|Ae(Z_ݺ<+8пBO;JᾑlwVvrC`]ۂGF\5/eE`jЂx3ܪ~r@,f0)څviLGԾc֨%ۚsSFg]kATRB3rGKZ[_ 4LB}^5xWԩnU҆I0P]_"?p)_"u/n.93QRŁA rp3i 8;CP;Vy ٮE@G[ӞȠ5_ghe5綝/YGz؁"&zSDkf&ZطQ UrZ^$')Vs"wUTc.>5}$Kexk 'M; W$I0(Zpr!moO2¥5\@ Rz׳۠l0Ʒ|Oeϟ`nW{d,-sK澯Ք"Jmܛ&AoIC5ހ=2ZV|mљ$$d3ǗF>v+-fExvy#@Mָ|[-k\= Pod k+LZcFORA2wb"'<uTESzN})R%R"-;>4{Hd]gxT8=nE-XZ:m˻ܙ0x{|+aVdY޾ I"M%[s賿JᮥЪ97{h8I{ MLU ؕ[Ǿ"*1&K@srۤ6Z߭ ZJMCա[MC`m:qCS~չl=q{WGBL [ߡUN9gjn3BK!-Ӝ[><#^om;+V@o**h_ D:ݡ73W eK0sz5f1F: cY<i-b;_Yu%xJTz~3uzXֵ"U}71;XR% Mˆfwl#38-mg'z BX3Fo u$L8>/e_]6yO"Z:vLzx)>]ZMg*&mj?M]JMO9W蟝cdjޜ^X%2Iz~M`w̓BP{X4 v|BJj}6jy?Pce]!ζb׾Ҋ~ %u Q< .0(.fތ08~w>T$zt‰8T dH(Jvz1e'w9GuwgbS|ۮ컍+*['_])L@i BH=?:3ne]tBr9.=\K32A~K Y60el]lW:o@!糒D˭ZlU`" cuqvg: a?n@@rUTcr1< E dՍTYe;hV՚鱇L|r*6*dEdk][8$lVƅ7K͗9rl\/^1 cMRT4b/2A;'cX`r.#eo# -"qM&I*uJG!,2$W)588J^lVآ*$gcx̑W]JWwSE~ݸ/Fmnn %,ۚ0>%Bl7.- YZ^V3帬b}5ēIK! W;$#{(Wbٯd𷴞#`1C&_huѭ"i$<\K7K[%IxQBdf^EK1(MY#CzYGsGyR.+D. ܊=֢ HLl~(E[5 YE~r׶(_8<43 [j5zNC*,O?f!BSCjN )-&D nfv,Amiu]Z/$rm5ϝѺaf8g/ݩfVjԡ9A5}^6X ]/"@(w&{,D{/S)sJ>Dm8g.VU?N-P ~`ܕW$$R[.Զ"=se _6YyTL!O8O8km[RN뱝+dtޘ|VO(][[;30yDu7z60Ma\A gkS "`u|˳pNPnָ%tWRw4Mx7)/ZT@^p5ff8V9xR| &Ywc^:[tvXvIpDov~-mֳk`7VL^ .N*ˣ^!SM:#>>V,4h]'Xn(!R9W';t9CݕI/}`k 2lo2woҀt㔈~.w{ \4 Y!3 Zmr=I#= V˚tK 'PUR EoU9D?7c&Gk8/$Ey] ɤK+ju1H+gc6]wnO8h~f,wSWpWlz1+@qtsVG4 U"#] *8(:ë)[6c\j*#MU8.k,5`B{E}i3II`0F;%e^wJكO ΊVczsE׈Vlg%/^-p][Yح BsfJE}) ApQTgA;CY^kYBIl?5B!0m [%K_K-#+I꜔ȈS*ϛ8Vy$„@iΡ4^lJ3, ]pki֋,[ry7/rݱpfYdܗ^P:K;W3I@VfZ%A:6ug>`IR}V1CuEa?Mt1.?rL(}n7y7ydkjF_͵V,q9j$Nԑ/BYZw}궇;.vfۨͽCjFJ*gM(8$lRX?[+]׏e/DjAc~ċ(n! "OK4~% n%t_,J-du#kXܲOS_h)0!)*xF>JNweۀG ^G qR)|]M^Wkq2K5\hZ7يϕ j<_[ 0M1SDͰ/WSt%K>xOnDk0;gLNUk2Sv^PS$ب;/ z/{$%U֛ń9ȉ] {rVPMݶ ~Xᛜ$ \إXZ`];$ %7B8?D$ZD8Ǭ|0,o60i(vyn/mo7c5МN&).YFGW\ҌNqjȌ)^&HEr!G697@:ŪS59l'kr?wDžn}P5/H hAoz[I>-Z]IV >|"P9S>~n=6їuPK(*3b ::Wr0o$-[K_u.OXjf {rjٛ> kR <1Tx 6nK6VJ|>P+^}/=/Kpď*w_-P%φsIwݖW,S '@-8oH|n3iKz/!øECvh3WkKR(Oq1B .7#k7O[tD)>87Y !_LJNt5鲘 @{{[0rшH+su '\W~•GRBn'[yU:*p]ٕv9fZk?Ū F7V&?& sΪ"+4-m%y@Iwh UMY X'-vZ~sW_ӷg(j ȃeO[lӎ"p?hԒVYtZ'苝!~u;1hPcK-[{˭qFl59ej^-)ɊJm ߄Ʋ={fUKz@24z8<}kFk7p'YKΒVٍ7{GQm{͜ W= тSHYZ<_7E^)|r$z Gà-2f~JXkB$5%CWt~1$E )6Q Mvd:6Wz?(ތO[Lǚ3Rū+tq W41^y/+9/y /3cVtS=Sۣwi b`dr:(!tEClF9cYF⭧O&\LCgv5EɒEG{e s X C@sk P|Z8uexN$ C|eu:R}޼3r藚mY]=>LI 7]g<3`!Yy~aO0Xw,O0h+ӳӬN&y;LI58mUfPmvQ0Iu84h}߱&~m;+>[F2(W@#Rjb}*+s{DzgQbY3"=yى+/*fsn0C9ae}_Ͽa] ""Uxce+۱mׯ?f]ۅkf/!,JA^qHHQҟ{dNvp]R{IF tǭ_+B ep ><'Dqz9ǻ+N VsnA56{9[yf}:%b9BV%{ &l$cGl9kC,so%K{ t6>P%g~>Gd!mY}>,AWyU.*\V/dR:K ܤ4^P1CA?꼉N 9]dnuD[9L 襌['.lOdRDW8y5[H%fN؇PHri?̤ ;ly"Q:~NГq.{BYu->f*Jix?#:%Z|@ײϿ]6Oi6R-umï1g1ʐuvk\yuϩ:s [i'q&`&(u۱`pJrb#yuP'pㅢ/q}/S"/v3x8k8P}N$M7% :  rTϿ9[7MoPZ_sP-@Ω("oDEߟ'k,Ͽ _?{"g:!hn^)Ѧ6U3@ϿKfUCRUz95C²|*;\L ~ce幊ԋ *Q]e?9`Tև4Aڦ` !}EUKJGڐzRsO :{XxߌWȿ QQMrSD=Y3!%eq'3a=Kmh{{H.awUkS(8Պ sYبz1nUcvzLÖ}:i07D+N~ Iloj``)Vv=ر.i/g"ؘ~Q#}Zk\llk>o5TvݨGɅBDü7*H&+t#37$Tq\lG:|fti8 i'{. F4_zJfp)SB 'c#jtDy@+R@{LKSw7m]^?{m'lQi!Wk(O0 ~U: *M29̍B:]^TG7 ^?e4:z2XrMRӤPu .C!۲Va/VaK8l"uHf̘Q>ݶ#;+x&@O+IBm%Aܻga߆ZŖ}ZkIJ4k>6ˋCUeL4z ^ \sw}j>~Z o#^+wOUl9@|d&eޅ,ΰAo%T[i&ƴ e}Zq8 w_Hc[N:D&{ǘ!lZjSe<D"Hy^ ]8&#ӐS&av;i?˃fyA  H֞a?܆xE{"-BcP{g;t7pj?[Y`}]mբ+R-fpǮ߆x=mK4T^nP9xIR),dvnCh3]ܕt$"bzMOL ^9}ڛӘ_.:S^_sJsTrB2 .7C&tyOHL8xxYQۦp;%Wɦ^eʼnl)Q6%aWE}=K_)/wZY~\Fe{m P'݀4&B,ǍJ`+CęY!qCJzksC!3IK+1v0Ő]c` 0/m <6.^/.ǣMa߄2]&^]~ //hP4 |'ד~ٺP;ő W2ipe7A3lE2syMoE[Ni&V|Γ Uo]hG0#gB7DxA%W}[W LV6:+7\\qj8ޔm }SK!Kq8e$[ѡuCY/o \A+Ztnp&گtS!#lk eO~HT2` E cն՜3HcB Eqj g Yh%\juX0\8l# jj⩂~}|%E̲&_[ƳEC3IopXӓ8~!0 P+Fm;']11*ƩOS|a8xQ a]>i-"NN^VWoQV&ĘΆRQ`q.:e h3 UUkGcf+mZ7ϳ;:%5f`pk+BlO`I`Li˅<- 9l0\=lz^箪b[Ecq83SX}WkSƩФڪ[qn}~d@YV*|vLQιdYeEM<(]Ɇa+"`^ 8MI~M'*a)>ѹ` K_ސ5&g;mZEz㜝l@g^ls~~5xy p&˱sc0ͦ@*>aP ;VWFPX6tcRU JǿOe*,9Ğ#m효*v(>Oԉt7j-HזU_^7UѮz <%p< Nsos-Zkɞ\-5֏}[rc̒\^ORq3j@9Er'u)k Ի,WH팢Dh;ͭ HADNjvw GZ*I3K%460w $4+iSoBJ/9rdr6mgrJ}rw%/:uD |Q15ܒ[ )C!Eu o߯Vl4F#DcOv Y'  8ak֨Ǥbg'`nE2zO x'`+LJktQ ֮ Un6 *>ܶlNñ38mXzt\:ڢ~P_JRL8U~ZҌC8Dh:ƊQ#A\[Cz[R;aqvy9}ɬ:b_?^#[\<#&WXˏeJ1HH~'H't%|, 4/ M|S:^,%/Zg FVf@345JaSjqVM1W;M[<3OּYfZ\mz"1($UH'? /5>_v6Ϫd $J¬mpjk?J)J.gyj9 m(wiڏ&0IuM0ΤFǭcI)cOIXuMhR dLh;WA<_C5Ȋu1w:ah ).ahi%$ 5h޲޷s?emq8gCIZ| ]+z"jj;sd^Ļp?{_߶7Vɬs:ej=>ҽT)hݬ]_*dkfA/_NrܱjuXSt6c;\#JXw9t=$ga:ʚ|u/%~Pa7e~7}vxeNW[gyRlGr32s\&(CۖHO˗Ipxjω*<5ive*ģ1kcuܒ(`v{/,Qk'Cπ*XD?@Ҧ DaˋY;(JM$"jW3]u91eΉ7dJǛT"3arw#q0D4B TNtw6!' a$~C()z*nCKbA84Ux۶9ʮR?[9& iDKJn(|+9wl λ0j͗D6~g/pu Ww&jjp)QƨM}7TGgC"oIJt ꕬlݮsvpP pH_(*WT_T@C}ʾkV25 qhP4БZ (b9 ^kab|^s=ɺ h6 gaP5gY#XY!e\޳jc"P{vQ˖}cd+n>vJw~2DϔTTW3/~ы&YrYB_up}Aȴa8P7\)岞{JNbnf\'L~M^֚SRyj!sFN41Ti{Ğ/O|"o2hٕ w 6ɺAmX 9.I)7uHuAx6кDʾ|Ӷ% $>q K=΋L&Jᅏz+PB\Bɵ⛗JvK{8^jR\rjƖ{l,o…$(ͪ G[UB^Z׷X<|I_^'_`(\}PjNVu)EWл/-k~LvTcҾ`yJ=G6 , lsޝJq#y1 TdO "b܂pU@Su"+NУ+﹮]^R7\dw 9FJ)+:UvWK?΀oymYU.op?[ZnVC lW%d8E/uXt37X]JC,ҁdUtU5TJ:?oS7/ql{bD?[ Zoˮ:cf/\;<zNd B!gkh9@xK='t ;`7S5</!JU%;d1@j7BY^ &:/ckJwa.j0fb0v1c<ȥV}Oa=үE銂tݔaq4]O6xV^^i9eك6ZSmϭʞϹ45 I2d\w*l]Ȟų]:ԳSVnr_X(Q O|{6p=@VnU'|qt{?/QDžT'?ΌΥ 7 YbW#;kY-J cG]ԥ:En*KoFrϑ@- |F|0 h4h ryi4~f~j(Š8eb6^j>u2EpI_Mp,'܇<^oe2+];q*R, :|QWBKZ[ŋɜfxjڛ䵰 :5E`K?zh啦Um/$\Қ9O\f=Lv"_,BD ۜ.演C"۾uV܅h:_tcLg"շr|ЪcТ-pY\Kl!Զr=C!PzR0$[I#F㸗m<7G`݉q>b7;˳j>_ R]iW]Q)5*1g&QHa='O`䰞'r-NXzKR9nArwgSM 6] }NSJ(䌴-}HQ\,fK!wHxR9?f)89-"C\]U}kAM7I>) q>?`>/e`U;[Ã%֙H?Q R]!΂γR2ۚ\TWxZ툦U^^f+ `{*29V~m`0y+.Sd$`Vّ--fmgn_Q`k쓳X ]}#3|MNy~Jbye; y@u-YD KzoIlP;jMU1-b4Mhznwuhc%~zw~4_W#Ľ/`m& ]; c:Y4.bjM}t "9 G9dD:UnýzX RLc&l=`_5e'1\f2V HcC"%֊':_m,ם0a5_\;Cr1"-9 ~N3`[+JCIX,&`w 4)h U00f3Zu>[eF)v`s<뛿ZU(Y^CDW\|^gb#F 0zL]r9/ [blB}\FY ak7&ݔ?`YY</V_%4Dy.j#LͱUa?59Oը,C"y6*T9ԩVw0`zȦIZ?[f'6^X~Ơ[+ N^J=Q]+`T%xu ZqsxY8a0MV~Xd *,`Kqu9zi>}q#֤ zJoVc25sN[; R%Xj\HM ⣐:XtDДtMIsGc-Cz^K9%!_CUۙep֨P[I+4o='_{c;6}1D LaިwKIËU|[Dޟh_4d%]?mGRQF^]-MgNOz m'g/P.toqȅC쵾`%GVZPH:p-SY9O%#si΢GbT{Wf!9߾l豞Z*}|A-p<וfJR^T." J} (3DXM#cDAwS਼X;%實FK{|Ł*3A0}PY[-b SR٧ǖ|x TN~ҾZK,?|n`E=[xUxxFy.+|!Jl ?ƴs6NPcSUsy T|Rӌ yu?>?yK&9K+Ƒ ?:>;5&al=R˅W6/bUowQR?#鄈ZXf6tSķS"[^K*Qæ~ಢ _\mn,1qo2+&ڧ6DBQXs~"W\z k=h UP߳DK3Q5G QpFM83(:F4ĠpL9΢^)&uo]FHu܉}BՋ8!= ^ZJ=~d<I\@֣Ѻ?w$t. }r^[_rX3T! 8qy-%2}.)ň'G!ggzp]!}rO ~#hIX#G#Zbl \".DˮJ6\ٗVI'Cp|DO2!:CPNmL P܄bSf[ʜ.؇Y@dƑw1˄>S)&Ɠ$Sh66vNj&kd2`Jv#аKBgOPTJ\ImuAĻm^[`4Yy_,oX>̋契ud4r3fp(Af+t} xˆY?Z0_C:ݾEpж|EFnP% UE;TJi3i(H9h'4 Iw!F-M5 ;kLjH!?>Dkڧn-vuLxPĤS},`RXR{tsn*%9i$/u<*/`F9Jx0<]sLj[ө&N'aV2^LGu|xJP*r1DQkx.əcJ/$*--k_=4%v(`ȃ)4`C39T[l7@!:{]dv#ț;A1_gPÝ?bs#I0/ Ϩ(†ss?zn\@UCM`!m,~xe&G)1T 4fx2Vf۱Ѝ"r_V%L&`/A6ՍD7 .)zpGk^7UMFy4nS{ZE0y^6R+X]$~L%0sfGzbjICoj]e([Tm*A&2/Zx6.bC I*FئZi%R랣3bu5=Q[f9QGX' ObZg^\%8Vp7YĠCFnXƌZքUU$XV$D;^ѭ8W!ߢ`TZzWӏԙE,M-R庽9w"D3ɤލ%9z|*JQiP|$ E_WњtA6Fy]Op?D̎#5gLdN>^ɴ.zK|DMZ;pUUZ;J_?v + ?~x?[.Vs@>k'DrAϪC`scN^ZkAA.zdNrLj񆕌k6 URn5=mf8wRAV%@V{])&ǸL("mت[j WVLb@{|R#ի T_q*kK5i\W\I1$ĨZi=X8I XLMĺy5F?/<=hϯ{>7C.jU4\e̽CݿeռEEWy^(jw_0/@Ns4'twq*( 5`s L4rٔ-mΧ>wմY;Bb9hTÝtjqA:p࣭\>qSm}MBV R BZK71Hnnj6V_%!PV >"ԍl/%X&Mɖ 7H {-@*10[9+Ewkz/1_|"=6K$\m{\&_-JEh`KW+.^kW{4?&CZSu#j6+NC2nk' L*Wg/uO)Xeԕ0i{(̘;!ԟ_\9 , I;-/ (ާ=-x%t,HztW$}O?B^Iua61KP$k-LLDcj;*=Thi{Z )# VRa* IQ 5ʜbVQ[ v"!GX5d]V+1ZL<6C4"z}Ls,#_.8ˢESviPvbRu/}6^ʗAVT;.%X3ApJq~.]+{OF 9*dQ]n7KW*_>ҽ8ݞl6>N㲾L3#2?O(y|r-!,}˜u\\Ox5%i9Iz\WQR(d|J}ߣ6vDZ勵bG?Y_~Bݾ(xsWVW-pC;r]R:no]g*)5UGԗ le#_?k\ $6lͽK򥿂~BH5wco?n l'$MZl1㌺(DN]S42hYh  Q|Aqg{}ɟTEߎ ?[]뢫Y_0ީlAk{RNaUhM:gVWI/6Ua-ғޮ'i)_!b(#n}k^.S~~1LՏK](lzU)UL~# rOZK呫x#vGzg3w-1()Ǿlvȑ/kDErL5o5"ɟYOٝISK,Z!3PXKFk QZW\b-F'en'vJ;Yb +erAR9g B ;XPK:n`~Vz]#!*8u @ZamӧˣDnWyqmyZlwTⓤHH0rrQ~!gp(&uANyӕM0CRKjC"[?k. Eb+ e&ɝ6;Ӱ{F)r%%Pzo-Զ$h]J%s/)K8"3w&Tȟ0~4lT$sX,:~J]9ץმ[=^bX փrH1h>wHz̶J#>G5)l?{\Xi$TS&Q^h΢׊ ^6y )z#=[C6<f)%h֪\*EpnUO٤y5y{t ӼWrRXs\nݧҥ/.wǷOG`N^4]^0SN] إݝ º}?QV:wbYߒ 6)*vl[](Z<bAg gTS@ WIL!RHս@;:k D*,r Wuj*W1/zEub<{5+^ M=ΥX`ւķ|Ғn9_XNNr,=cūYGSWx5҄;5Y"w^z\Պ|ISP귟wּN|',` pJV S&Z{"H@)" xyٮT e#IƞYuhdt~]ǂE=EE-L@p,dg-ۗ&cse;˦pPHWe2YѪVd{Ox]"p] 09F|FYUȕL- 0I|(S]{; 8sR ; 6ˌUuwfGcETaoW/K=!#G?|B3$z}?&^ݽwhyuXCtUQ4T"YWIWr6+zBE+3oKӇD@TF9s'1(^KPWuX{O_lWsuٯ^ KaѰ eyo0σI5]dFB?!6Cؚ~ v}FhBnپ |VE,#lG0^T&pLb!~V-hEXe~˵@$K S^sTcGYբs:eKt{ /'BsEma+S3f[I|6/|c{|$-~Q-J:H$IY1%zKgm2޺wb^ }mECyØzc kA_oQ@b'^ do*??o?_Y'Φ5-ZN04案->fQ;Ggx&PGk)WI.Wg,8:\?4kIٷ g@ི)wN>l_) 93B".ojۅǪl BIO7W&-b}`b93Es-e*ڎ>)^./iLu07`4ȏL9n]󳕃)%eQjb ԁ&fͥ+paN,dzm\SB85z97]:=W1u*#t8TyZVֆD~<EWy^T0[)YnHȰ&k4OʙFlH-(Ejy;Z&W:2s!ɽۂ⮟%7w=D{ ӷ":2ؘhDmU?Gs"QҒVWQ(oO M 0N־?ڳrk 'k-/4U..7w"uE[{?%+t pȂn*EгNj+CYˎpg{ 3UJڇ엗|O" `4w[CbI38\ߑʥ*8!wKWkD#̭HУd$H4Vo1vՆ˂>u7*< ܐR ]4SqdJ8_~PCP&ϨӍu|I~ ŒuUF:s>w}8W Ux.WKgqkݦ'L15bv@I2'͠sPk:.:!`{1|0Eq\6J"ĐԹb-%s򼵽ݎE &U {c%Yǃ1!ROV8M%{q[ %JaJ L܍1PST=[E!I=~:mnuJ|f5—.jJsDcRSV)p"Z#77]0P9s-_̀uʟdrH[Jl]KOFHE*]ԙmNO!r[nmongFT,pP_z- EMFQF[&*q^@ᡌ#Sle#LQn0Y;vD?拨KiʥU9 )Kn3GW.BwE'˵Z lX,f 2t +7,(3ndQz V" el%ïNM.Ig71uKPm~rA8Vݼ΀%Z j4Y7vOVIȵY~R=*=Ÿ ُ^kI:U{(ª[GU=Nl{!f۠|8# ` Q!_- 81a+@]SUoAH4!Wb^vEó)GFeB&WPG[$\QI<-;6Uλ7d'qqZN壻g䔜.Q0[]Bz \*8b}e%0-[6|{5^Nm&B*5=τl*ar2h`G~+-gvDPu:avNtuQ6i']Mg9dz1u>֛C᧳Y ZUxbXf#{0gEuҸ8!.iqRۭ\T'81JǾE>6 ŨxI{A2R*8"ew7\չ|A= (""5 ~ ,@4JF ;ɭv:Dtger%o>7Y(L]}ΘuElL tz'T bǙk rU)tCy7L?J!{I_P-U Ai2+V6F0}=$wA΀.B 3эk!`FmJ4+_stR=YD)iM?fWL`#P1J-i7-\ b֫t{⯨a9yFk@8+v#vzMbàv3t!Š.gOKג^ AgoW+l_ zEM %IFl}}:gt\ S7Gj:Ʌ%FMe}i[(ʁ[~7 G|77m0cOMȬhQX\=)&37f*\(lj's8OFK>?H 4]ˈ4@ N(svNolo։∮jlU#q[3E=E(Q*ßXSM;?om'INA #[MI2#vBmq{LdK}lI]?&qĐ1jiK i_B_ꅙҤ}q*8Fp?/0Z}^' m']fFBWgI)L&9F*7O;-M"PwToҪɠt.1v-OVޒ(jʦ_Ȃ]WC)DfX2 D:ݑډ/^:J9[İ9𷋅fQX6y7|&.ߺ??:jRm(yi_ShsFgrGZf5kOԯ4I cZ {cQ/PPP|=|4 y)2@ၯF-n!d?Z-NCͳD-OIAfEUgeE*gvw_4*0QUHx*c^8ND~~8PE-[T4q-lK7[Q`ӵ6x \#3ZGRZB ];csjPDey}5(cl^Xˎ}nsg+ R8=/Eg>iC."#cd1b$Wm&5[ ۢEG FWy^hvqlhoCW=dl7ENoMY9 S,byW]FYcrQ/9ݘOu}F$\ckE77O.)BaY:!E/D~D__ýmy&LNV(}FZQQ;{ i~e <'Xbj:άqcy \bжQkʼnv_f:(}ge1[MNwN(65/C1.c 5Ւn5zg I76ƟQ@5"EMjN +0!Qrzn ^^J"%I#]_l(v * j磯DoSWuIEcҁ!3ҋ PscF3*|H% O[$U4@2@"4psOr~_p}rMqAv8wbTq4!mNs'ǝ"jN27Ok9}tIy%.܏IL*l~͠W9#-f]6|!E_ qאX>%f$?O>zH%2UчXL=8򤐰I) j䓦2@YM^\1sw}5׹>6Q{T̼qc5+=_4Ղ,MCꂎmr򕁑(<3k{*diMoO+SKU &' iC! U;ߵL}}p>9a& ?L.= ?'Ϣcޅ[_¦;=wKH}_{`o8Bi|+IqB˟Vmoq.=%;?[)#C9_ aAP:5q!T繀by>uB*T.shDG٪ Jtnh3I?@.<ɵ6QtS*kf~@%d{Z"+8GʊoI]SOu0OW'x1D } FqL:PQCb 9:ND[2svnl'";Z^Zc|nVv~b{lrHI/Ͼ_"!Yֆʘz%['8IݍE6bQsh*r_Qv0n|WQ݁;Q'z9jH}IhçlR iptnXm['וUNvA'YeHAJYs{R>EZ^8b/ua(֑kyA)My}k{?mU R$ߋ79RA̅EE+ |'*~E>osg > 5\_W9طq3(=LV_bh|]w8'vZk]m'}]H0 ė&!WUvZGEðN!ol'ɢ P]OwKygTSiE І;cCk `u9}9~&DnlNwZn!P#jzzD46,=dļԂ/-QL5>71ٝ1SQy@ 6,AH.1tp/}D?6]=q؉@WyihhYƨma`uN"#G:q޷sgi*n=T4>\r7V3B^T꫻OZ,I0Ld,Aun;#cCz@9xvK&k>չٽ\N 5A6SAݢ+tM0WUo|uXn6r#sSr]-%~E]M\U"j{>Ϲ%CQif=(ߝ~_փ廉dN*5)ÊBDSҦ C_CخSe#_xZ:_d&,Uy ;B߾W?*;/YdW/r8DȀN!ߠx(]_Mb6@}n8('Lu xҹEY[j{vT%T D /rZ98~:7;4_ΑwU[Wq ԁ6ҙM]|Y#^Ͽ)894 "E.pd}o7}c{ *_dQJlE%iRY[%U-`4K &p/}v:·$eӞ7<#9) U4s=RUw!;emV^^zn2YP=9:=I:A0&^fݗmR_)o<ՠ*F퇳^na"!/x'+8dj~"ⶬa4QDp9nm澺 B И:¿v-7V#cڽ0jV-RUF9:Dtk;k%Ԡz ֔g@iJCj@ioWAsBnloӤ®Z3DF4q_BY*|i2T N%>6;U&zj,SOGKĈ0oMҟ#W-]x,%U7 WHA_2 GYo"Escz^Ͳ<4I`p6"*MB"QKYgiJ(U·r<0qg;/Jecebt@;BF~By0PAH,KSZaug'xS 4ç pзO;'>$W4DΒ;&AaE#p7nz((!+M2!)7$Uf[j<|1 sR Cz\5kGdE8& ۇFdxԫO8gNcWwWl:om'P-Qu 3e~/˕k(xn@LZz O+ [}v<=X-V?,##>lt~xw!dXPdqT.u!i5k13msU#zK)4L{`>[zw9AKDke>^6Yﻑlioc1آtf gKRXX)F)S\kI{vBƽ]`{"N"Mr)i)PZgG&?4qBC05=@ (Gv? cOAa5yBSb[ = 5osДܬr9H~7>sB'餉5^"Kz{HJ¿ ejxfά:;/7qR =F皒 aįVvJHN`Sˌ/#NYoPfcY^_g m.'#p9[xC%99ᖮi]xs) O2Gmi̎w>$0{央V~UzMmޚ? [;;|X[VvCUjl .NP0-Z[m,1@j)l$WJ8Ih#ŹGڭqSPd~O˫(=??'Z'J XI VUY=ڡ=1%) {KEJS躦݈P |w6gl#M+34‚Ĕ::{Y>8:yg%Rл=}r ᰍ?53\\[xCw7O+5OByl8rBkRާtsFAbњ8-5[qmFW!M"5lIҍUW2!sàÊqΨmPchpg{{%h@@tb%r=E÷8(<% ]k',(UK3ݤKZ BtF7K_4sJq#Բ9Fu ` grj)nsTUBF0Xtj$*%.r&"k8=4ս"4_?-ɽePXMԪ4 ڭqM]Df/dٮTAS6nmo/,AKRGR]T3A^IN'+Ju9[*"$0KldӢfe@1|RΟf^)-osUIRyp@Ekxumw6B2 h$¼|*Nj/$Ւ! 0)VS;)|g<5*Z)A&Kg. %V]o}8)nYۿlkPԘBV5zUY޴W]Ulvʩpbj1y魭ھLJ\ܸ }gVaER!DNHUʰ54姡e藛错 }֔ Yx"1-3θLK"vvc [z%}0K8hYXMaA#kGߏ^j ^,I-EybH\f_m'Qri9u*g\{0/vj{?INuOHD>EqzPGzxci"7JgzӧJ~FBv聉47X^sjG꜏8lI4 6(hY7`x {}Ih+| _A~IzY{4fg藀ja|48'3齃R " '%S6N7h G ]->ԦO8pl$ C55|_h=tS,7srP$A4nza_$NjnUJ3!R+*q[)-]y$= }w]r 5MîxrX?[ qn9$;FP%iW\No`Qek^ue'5 e4d=)7 fRDc+D<o̷ܵB %]XEQ>%_8Jk.,erJ9\O٣y,1#HIdS6ws`bw/f_UX(fkA0nOUED$S*x=?r#gۙ3e!Yil%AEo[*R~aWȍ>nrS@nޑ4aqHXZL-r1.d/VP:Hdfh QX4Oa4XЗ/@"RAtL{᛼j<:&K, w`y"a~-,YB^9j4j5Uol.7MyYZ/!(ǧFj| uNhwLύX"QJy2":T/1ȫ+g#d↡$/W($3]c 23\ M w& O<lu]yx{}aG867Y)OsΗhn/K}.5ԑx/˭ /.Qms>nD @W=GV&0GR3m/.Nhzcz澐{ANҨEuw3qSELrD[]S/ iNh50w k>2]͵ ƭseE[ 7`tr.Qj>H; L{FMR*d2SFjy돟6c@UOԈ\ 6\ݴ6*[Μ:#<&8!)tݶ)gq2[QE.J*!Ƥ cDTdž#OzP+|b[i #mc)r{|t^ӋXpg+UJJ';9~lO9!T A7@4Myֵ]- =1Ә2GE>x֜PnMqVքYZp($\'S" p€rk{|$Vr/RA2|}-R!xR{Z˚EjW8TֈLJ?-v?zR  Ih5_MOIJ[~4?|b@f5٢ Z `iʤ9h,5=W(%v/)o9Ԁ8iv='Kn@Wpc\Ƚ!qz}kr.v~{G>[2(@Wܹ(#@Iif8ZhP ɂq0Br#^M2^õs겻 lsFQ-6mUT­̑wjE9oV&w5rdc",Lv!]1t+Yegs2277Orl rdGw>Ofb} l3S _L~^<w9hC.@C#b:-#9gzolo<" /'ʠRT$=ZlT3$Vp^u:k=g`W'~8{ ])^!xx# hG-PR  9yZHs,耨J"woCSrnEJn# X Wӝ-omo*cnyR&"QvI83(.Eº?VA8f~V,휎_z%>;Vq[Xl8]?ǹye$1汸fnM\lv& ՗N:!B-Dވ-HG:%}Ia%3a//O|637mG R?K6E% <z'lW[6DC!˱̧=BӺ\]4r9KxKS:@!_ AԒ!Ʒ\56w֨y nM(RKW';Nf*bn.^`+zN0F=ibU2{lE2L{?_pd:GjvVHv| rk{?I]U&aJCzDͪ;hE[e(O]L،S'7iA!?nQ~ ja p~`|ɡ5zѾI($;s7N!/f>="BB]s9 ҥDoZii+{s|}ʋ/*8Q$ È]z1vˎh{|$Suk8[ _w kTIMX)JPֻW-U+xX&[WJ Xy,@G qҘ"m|ۼ$AB*YeRsSG,ӨѶM k 3E/?l|x [lf!R֑詿#hܓ4/FmBpnm[x E>nvW֐!KkQBrѾtV3xunJ<8 QðT;Os[u'ԡ oD)]wW-]-Y @cypwT$M\d A͗3Tz4]ƒ®2{4lT}ʏU ڎ>BTH4%R~R!WWJ\. 5 M(WlGy?z6bv^S9mzUr8̖lo$նveJC]@un'؂n,IK ڭSJ]+:-)) HA?~B ~X>l7[_iP=C\q(Z)[6Ž+x.<9F:{% ڦwmZ X'4k@"IƋ>3%$ukD!5%o5L )p5>\mh\S!MMH8'Cpv8(7݋ D췶O Mǣ54 x&!_z?-x4)WYUy$jS jUr/dq|tHYLIVq쳻u{D-:Τu/l"VK:-nEƹik| ^3KE9tzΏ~Jڡ}Mr:W 4=y$"Ý3 r\ƒPd|G~=G|n,޷gg0D$TokaZ@_Ӫm~!ޓ}&?[S椨YVc!7 ͑· Nl}θiY}y$, LmҢ"g2,=y̌rd3TrtcqY5mtmT2Fx]=Kug{?9*؋?|.=>Qh cd+8XOcٲe"P!/hP\wK-Pq:+lɰe'WIٌE['3챓3=lNW審< rr;{D"qө]5y䦉Al5:m쩨%!=$'* f$CZS馽k75y>0/P,)n8Uzut߯ZG#w墭V2^TՙO;|Mto{| E{]-0ϨUP(M+r hy!F^qHmyyyR`N;zXǎ c|߯ƴۭn wP/|Ӯ:=`S)7OЋT\,?トK ]Ս-J|N 4~(Z{vMV*2\RPjW4Woxik Keiaˈ`.HW|`|G|WigF&?f||&Z&RP4ӧշ kn]Ek:* -spZ0s`KgiW.u@6Vyk{}^S?-LH٪ѪW>{ ;;=yQ(V0'%"֛eFҵ}1m[3l-"}&ixb )a#r ( q]̹ۻ")}k{s>d/ϣ͒.ϊǯ3᫑s T!_S8wWVgiK$W%,XOM8RoiH4WXc4P[=~丌^]y>TܔvL`|& nTKR&O \~<"8fy=3z2/qkU],5MȤİ%Mι@3IpUcIB@Q-I5꾬7NWS7ݠr^l՝$eTvh3s@'(YXۿM3S~,aڃ6c3ΉBb(~mǎxK$7V>OBբ]T܏14R0yzQ: ɭN[*?[ZEC eJ+jzOXbƪ^Z0lZ|KN^3:aWз/ ȊS/q\\Q5OYk_8v&pw!# 1Dkh~|*#'Fn_n-JC$*˭BI+>rq.#W =8IԌWR`v*ryF3Ha3W8EI&U .ep5mʼiv;M"ǭUڎ23]ħ[,͋'u_=W-[tvji?6SCDf]sҹ~2^Ǡ:J6.2\Rz\>=&áߐ]B}׿ȸwql1&7 X~zWDW.s^"<hinhEus⨹> ꜩqj{yF2_R]vxHH,%^XE%6(׉u>϶Dqdvqtw٨D-Ҟv^"ר&-(r-x<;XQc$; <BZC[i"|PE;JVVCy6}應"? ~] w;(O?*X=Qk; BteaZqX*pAy(d%%5gsx^5٨Ҵ9fZ;g珟-.^`!zbva[:mcIK;j^;}Edof[ Vmcjxl%&czIi9_9Hp!&JjsJG@Jqu.u 4fwHgk^mz\yf{=o, w@7 Ǒhq8Zܼ"Q֭kJ?lT9"!k:1>FݴWwdGmˁ2Hr$*zpr`$*Gyڝ>3dcp[v_TwR4eV_QFo'S #%% $+mՃEw@kʧf%`4}db2goYMbF˂8`Q.(2sz}}:z^!Mu?]{ G- Y4U.ղ(Y=\\feSE({2Wn*83$=ZBT\^kA/<'MIJNKRPJ Ԟ~b{yK{W4\^GFW^ oed< "4t0;l~@ӳoTȌhIs03u֎B?ayjڎ@[! ~,>@Ik׳QmC6Y@9o{< NU*EG"֥lIVUbϾW8Bvܾgv[!_m%z)  қ ¤*jߺXCؽ Oj?l͠4kK seG%OG;Kn58r?;t5m ӮF278z *񑓫>[هM(Xrߠ-~!g )2 ,%= .F&<;>jqVmpdLukU;B#fhqӛ#: -ٝC;;L:trbɒ5'֫Ƣ7HQ5R[~D,E|"W8{/)VjҨ:*s"ZZr"H:H"vꯋEv;ЪGѐ/yN0hiNE%+: w4l1r%U+:uwQA:(jK#jaC۽5%2IM12l- awnZ^#[ؐna}|9O3_W~~˯?W]__=M24ډUw}ڥܛμ!1-Y]BJ жSW^x]wUd 4ЫҞb_:*^$[IGϼM.seWshgRMgF/L=^ίQ#;VE^B5 ~ 4j Uׅ8Nl/W^c;}ΐi^#G?U@2\mn@۝£U1.!}@ܨ 95;&奴o6 [njMU yGi'7T.\ NvC"2Snx!Bݟ&۲_?o= ~uX:r f6 a=Du{|oyP؉JPIjKZ*q)#z j:0&0%ٖ[Omg/=?o8fNrl{ePoe gyZ8)>}oI{w)!#_l~W+/o%UnIH8ܨd =3kgų@Sɳrœ?gdz~T/MSmO'U-NT@4zTR/>fRlQK?^ί*ˆ.gxr]\'y7*rڻL쬶g$"VV5و% v`0 6ïI?6ĿNm/o\yxW/8!&N E<xF٨=/x }v݄Gs'~<em)N}~r˅%5Pqg։j7ɾm0-̣zt1EE#?{3uWvKB-ᄽx |M+Cבn?1^w YVFHͲR¼'~˿}տ}O_:F%dߔ2*4.n(4sWn/_x~ !@?WƵ|)yAB*'I!&:S'(.g#)]snǯ}˷_{~sߔF6v^/jZ4!|twFxhϳWzeZ+M+³wSuv@\b-Nb՟wqZEU8JW%2HO-(R*wu{13k[Sb=le# aF6nlْktYU'fI>EKo1:F*QY4bN-v/*77k W!&8v=1IEG}vdJDpsQj\NkGM*oDӷ~*Sxdl̺MI<LsDQ'$+Q/O I2:tE{)Q4/{*lB{AxWN0!zV  S]n*&a]6my(; l:͏kTȡ0r0dZp|5r<7b`>[* .c 1DɊllz=*G2 `ݪ-ѵqct3r(JFҢ˼MxCժՋ{ި&ލU%Ƶrpc(B&ZXq95{9'ME@>n*7Ph(UhnkSMȗ}EUf&?H.omwz~f[}'$"˙!(ر&ŮA#aKU0? É-T%MG Kî3- AP.[42l%q6hZչ%lcy slhی>">5DZ%o_{~ dQgV5rvd["53=mt`({$+;*O-LRr:tmAۢIClzo1tGOxZ(!+&}?׺oA ~gՌ굒acx꫈Y!AO"͉ʙkxU}^޸R)H<Ԑ FN ZԜo(9tO P}F f $V<ޛ<C\6<fha9+E{J]ZTVB4 "B?XX7[bd5u{m8wKbBwbwqf䊦Ӓ*&}_ls; 5Yl;Kj#q(#,,:5L;`5+(W{7<;w.pnu8.d% _=P逡 hxDw۶PV4vAƈg>NǼ-%nTgk{LqAZi('c({G^uZʋ~buOwAWʽ cSƺ`x\U`$mSWJO\—'bRjO_g Wt!-;_Z.IXG6T S4iJ> Hܠ[cܐĔ}sr,4{ +)TVHpgg;rn Eނ-Ȍ"~̷.c͐&L K '{GQ؆4;b:%}sNmз'<؜r 6Dߜ܊oY]+$zSËL*Tu-YQt*z)KI&u(۠| >S П{+{wrUv̵V{sB]>}XZgxukfX;aG-NH׭.ŐӶyKz?Z nX>+u]ڱKyM}/]Z~~t{TQ1C] MIJV3fK-aK!ȶWO)y~~,Evif:mzsmL`͹O~,9a-o8a$}[gzta#-GEq#Wm ܪRPnP7ǔӑ;|j~؃ه¥dLm}80c!W+8&J~2`MjKJ3ȗUJGa $ j#nTOGyJ>̤ztEXN9`6"?ȧ8AޑZr;$=29#n![NXb $mrΪBn_e;UKz_.zښNRol3ZebstY#6aG|;oXfy [Rvk)>]kU4Ì!͵>x s cH:r&bEXOQ/ Iag, ԋ͗4hp%\,Ɨ˸Q 7X-0iVB^,5VĩbYg/c䰕AU6mF 9 ; Yt+͛]DX{x;lYZD]cvHqZkKw qGg:I7^t&8]g MmP Δ2CѩӥDj#ajOºF #hU"K%#$19bK&o4LRÜ[*% ?l76 dҝY%QF"}OSZ1Ws-Y.w֊6WyW*-%Xuk}D='Z(zMkIS:G=$xZ-~](fK.`_PюqA1%n۲Kb;vFtFB,RsۊvM<#53v=Ac|9Jf 1FI" 9FS")f]w䓻o{hޜ fvV/F[xKnZ{P***!_&ubJ-BǜDJ @*&:Wc1f P˶ה?1d=lҒ~zi*:YjNazxg HZ能JXKdE!n諆3@x@N.lS݅;ޖܞbjf.jBDNڞh{$B,Y/Y [u_6XOhՓ<{ddE  !HxێAsvd坵! 1[?<Xʕ" >C?pH([T>Xs7d^MYUhsSXLBTLXKB-I;W?wgINώfW #m(꠮稫4_gpnVYd_K' D^Ӧ7I4myPkz/BU.|LϞ[H?ّڝcSe$8yh |/v昚 Lsn{tܽÝ* o`\@p$Ӹ^[V^RsK;;_oX%d$=TV+E#xUY%ޛHEQ(ȃU;ҷg΢9.q5I|puGw4O8cZNk&~b([y̠&RW qw%j昀2Bfbv%Dx7.U{?Ҥv85wZ.+^Gl9C]yzt rQ>a"KloAf{ht6rT*.u%Nxw mt+ }?Z%-?Z/{ FM ko,^7}ʬ~אoFBs6_}̪ ;_N5oR)$띵vi'B~!sP1C]uIބI_%0h3Q|yxAdhj`" L?dzlD5"V|?r#^?,ǥ w--wgf"[%\S6-Q:tgy{=NV'SqTEJ/3H5-R;9b4OI=rC)u+bw`"UcO n0S+j; ө޼т;Uv@Hhβ5|ȞX5qP/gFM&ѲƔ0#WsB QJ[xR27dJT.ha J[Tk=03cWL;EzWܢЍ.&mz5}#'+\PuDıx0e#FCMpW]s": %ֻG(}>c2/?'7ؔ>[Y:0\ds&h})o,ԯ}ՔjUr˟&BڎMRBŸ6G;>O7?ą_"bƱC~Nڳ(u`{{<|~dgvcCmR BjUuAH,h+h$Be[ځtm\ SCydf#KfA6ef6s;tV$M9GFe4G(uf*"KZ>ːVvfJ * |,PF@JB4V#ijd΋n>M' WBjS5}.̡Mzn9>faWcWvRSnKk$Q\m N4*%vH %.`C$$%1qlpl!9{횵8= he}^Y 6%5p1gc .5Js 3&O`~6\oAфobŠ6i||d"zn{=}͡9kVc+ԑ-cGcLC2hzJQam&]c AnHKd@"8L"dIkyBQEcvthU{Pe8&5FzJش(g 82{& <=ff;1PоSig6[Z;Uijз~1#o7W<{'W|_m8lINw֑BC-t!!t;'l2p}tUn`&&A,i$:>mwɤ&5ԑQpŀ&zr5BUAq|aRȨȊV%MP;v;㘄kvݤ5gJ8&Gch+ߗfR}ؤ'&Dccc(s)VEq:%&+o ެ_ e^|g}gʮ)KK s:^V$`b uJ+K[;Ɔ`Q)Z!lbo5")"g,yVY/\KMc}&JO af"5 “䩗 eԣ>&T\l]}Sr7 7kV@(:f d^c25ts< vUZ\Hrc ݾ;jƌ&FdÐN&{s9F}Bj'hb:h}vIӎuRӭi9!SY $M3gz4g'LG*J0'C[2iy'^KǕ`ATkqh^ڄQK)JBr؂q ?gsX7zYn Ħ)&.Of (qi.[_͹<ʌy7>ڋǂO>]\|fPS.CCZB 4jh9*82+UFBBF<|8HgWOorT;p˃_ΈxfRs#nU<I7uSѱ왺? 2Z92gdL6+ ۔IBG/V{+xmϏmfy{ &Gj3S64bv s"BP ؍gZkɶ!<\W ,#M^RVZ!9`vDt3+I HQm;bK(鉵{Rr>kBm&EORgaMP0[pUUáR'7 =QfݎXCv?Asl翜1'ADS(f͂ {͆(Z]' '*SנMtx]<P.O"r34fIvkeܗ[bGpCL<\=̪9D  dw}ّ;fݎ~Y r48f}d2;|g [U_+*m;7%gls]˾}6߳7ᄴNsh|u]>ca6Pv{0ɩH D2 ɋdX3TRq>m~[=Jt\37Wz7U>%iaF Tnk^IÕf/w g OFTrz ҎfgldW9H:0.ju$,S(> mO Mo&<=cN(dy}CNn ;ܜ均Pdpc?PoJ{ 11{U|k :'`|jj.e\i<VKon?`1o(=Z{!z O/kPhӺS]IXmGUy`bRFPTe=ˍmqVkbYQ.hjھ] ?p]ǀܼ/p<7TGq]rn9\`.iXܯ_s/5_aV/kU@{8]{/2 Q0O\]? ު&衜Is+/Mb*b5k\e|̢_PW;:.?}}=LkoXQŪbJ?Nm \Iڎ+mnL{{Ɲџ!r%E?8ҕѢcnOG;3.kBݴSvDӌᙀ+uzNAȣ Wt҂;ǩmېC2uA&2]~ԎɁ*5@L{x6IB mᵾ\9 ,+hb%4O_7!lw-hpsCHO蝊DSSzBA QXF>js.ja`zpvy *q6yeYN1Oo/ZX3/GRʘL&" 2P0ޮsJ飅oIxkڵfq.22d6|/NFO Czُg4Z\O&4CthUZBŀjتǔGji^}sl턟ڋhrIݽͬNu TmĹ,xq:|?zO"qDžvԬ db:ZsVpp)o Q 'pnsw_L6ik-bb.eax:6ZJcJ@ OeAHoPJ%(oӪkym,J@ٲhhӞ{a`S'b?߮Vt:rWDy`%1}6ق%KqIBsE;U%{tizu]-:%"XEe9Pw|iPo;պOBSD͞eu{;o̢qd&]ǡ OX]]tZm+uHxl߮r-&X6}n^IyK͎%|UQy\ ?hwtw W+5h-4J,75R㴏#)w$l㳋{ԗ"$dk2"[Qf"PïJ#47_Q/YE5NLI5+8[^? YK)꟤QihTɥJ>k Pvc\{0jXfHHdG/aOl!kŭw2ܚ8IAsPR >qp94z%W-f : `̋Dmx* ˡ4faeF9S/yH{7V2JN%J_3{y y̽fRTbٮR&R{9pPyk渍!j.K='LEGfm6!j;uZ)Bȹ;S*ҎOjX\l'CUZrPF~W$G[}z^ O/T=#"gNaJb;H-\/ʾu])Ւ|!lPKB^ufPqC6HJa,4''{B .Wc<C& *`8Ȧa>17'VDiXlPfВ=6os~n{=4P2{OB* \?gVѹb:]`EM0 S@5pF>CI,7wa{>Hwz>M88k]?\Rb8 ts-LZ`pĿkM8U?\]TOHŚls٥JHx!04WU@)I5*}=? [)=wf!U ^bw\?=~oxm e0zJ soW?xW<`K.IZ7o4﷟Tlfʠ٣[^}:p"Eix0W &p9 iEMg5>~< i;A;'@4qip־xwr tlٻ[c˔ƤُA͠ d?I7PW36y1,׿xSjv;VL?Ǽx=o㹋n8DHMO&-||B=] glZw?+T\n?EbK}L&bHMJ&0 >?~y.qdddD[ǣUsPO<1꫼ܨk%S[ W:ź?\~9,Ë 'GňUiQ7ѡnp^%dPnS8srN}0SGi4//ۗ'G_?S?Ͽ?~˿_oCoߟ^aO?_[eko?×?dO}˗M=>4,/navit-0.5.0+dfsg.1/navit/xpm/country_MY.svgz000066400000000000000000000015711264204753600207000ustar00rootroot00000000000000(zHcountry_MY.svgVMo6WKFZ@֞$*R )l}G{d/̛t_~6Kd ڢ+v%%b̛OwWVⷾǪz܋?/C?Vz?p8 ][6%'*Pּ0/cmvWza7 xu9y ,E~]~ힳu%,;~-0L:U1ƽbm1Ѱyo `[76þyewOm8~H]%apf%=~<|~do}͒S.DpIwք\&OOts%N} L^yvY}̙(ئǙ_UZ{E4V} o:Y6N}|NV+5:3-QRgn3z_ʗ},PYP#$qi/#J:I>5X[eRy-67S3,"CMʀTⳌY?Qf&K6"7-krj[V Ŷ"lyif%9  17Iib%#S g7,GP>G>hi~ۙ-q!*1VsVnre<.Jyvf@&HflN6Qm'UYJ4Yg0srHJŊgKDcGq`$v%gx{x%`t^>uʑ2S4qKu6f&܏S?Oq navit-0.5.0+dfsg.1/navit/xpm/country_MZ.svgz000066400000000000000000000044751264204753600207070ustar00rootroot00000000000000 (zHcountry_MZ.svgYn[ }W/@{̃2oh,VH|}9e;}u<~ݧf\#q~-Vru9oQVzV/o_dҝmb.wW_W糛Enwszrr{{ӭ7''._u]gWSс`[{a系@rɫj7^Χ#m[RM;|/>^ťy:/gf^7f'{ Ns=\n]8{u/w_N'7Oz>y۬/&&FwQO?WDHc*"Ϩ)޵ZbSsoPj[ED./Ђ+Zc{G _#)J( 8_/ EE;C3}{ BU| yyr)M=6ba]5H.h)qe Z)`6q9d,1; xjU3/%Uj 0v${=DYxjTpbC)Ct9jw|5EB8DeGaD!jP$&|Nh\r^5ɃRL*83^]5@7G7HAR!h扚+O)N'j'%4Ýi:GY]|=GsTp0ET!$8p9%+cU2O쵓 !;v!}MtȩkXVi&324 S>T4׃"w\V'Q,#꫏8Ҿ&~=zZ;ݬ?l{5lf_NWh!܃%퉨H&h;9D%0q+U*0fќXCC 3tMm퇹 Y9 SR`nv> 6` OmH ~`7q$OX mЃoQQE$?|>aN-JAϪ.ƱRU IC6CA\>j&J 'շ\n,qMFه%HE@‘ZHT)Mc7`nN(͔ u8i;kjtDcWiվLVc<+Q;, 8xFP<#a=; "މg eQ`VzT!`md90M̒$NddP7ЅgJ$S> ޢ "c_c+&h ꙜPgw Ήh``C!*~B~DE'9F楨*jGCWbyqԖART:ԅ{"mXj$<4mon]8q[Ê LWD|2  1$ёZt&`FxEۘak#)1}j]] 3ɡ jR.Ѓ4" VOt2>hR:3}!l0F0?rB28U)F. p,FqOvpU KE=2nD)eƅ`lख़5&c|P."AF #)aO hˌl@ra0)IjFF3DL I@Ət6#&[S5 h~x;;_T*Q6-yB<ޣ<$RQ#b /Zp5wTv%$jdNpH YJ6=QM!2P*1%?r3~Um([(%CU:,&a6 <3cA.yr{z6Kг 82P} W{9t*pMr$ C!U~{cK(#U+{A߬dP&7r ȹ.M2BFa~|MWo ҅@Bnavit-0.5.0+dfsg.1/navit/xpm/country_NA.svgz000066400000000000000000000014441264204753600206500ustar00rootroot00000000000000!(zHcountry_NA.svgUmoF >`v2uG`%ؒn[b'9N, ,ȇCRM-fSԠ(լZ Q'?4n..>3!Gy\Fhy/)m׿v-ozQM79;ɑrfL ,7@<*j. s]|!7b.D5MΡ)W.Td쬐ʔx+8zwWG).Rdo˫ISNRaՇnޔOu,Ž.$KzOr=E>mV.|ގ4B6yuAպG3ԊskM9gH2^\IMyT!Yɂ8d1hH:*;Pg& FzZ;2`т!gt{lr!F5d}Wüm}XRƢ= [H=e {U@CSb]CqFt9m6-`к_odC(hrsjn y3Q P.d*]ϛQrHSҎ_i:/4C#:OhM"| TDf?0qH# ƗybL$c}~'ai2%gyvLKG}{ϼ/o^ t7_?q|~b-|^Q^?KL~ՖOϯ?OPӁ?Ǐ{9)˶;J?ן {ןv~k}񗯟~z!>\M\O__}5?t"c#}?/???>x5翻}w_߽~ݳ=IbWyݧͳӗ__|}w?]c} 7?{O~_|yӇQ='ߌ}_zu{(W'>#Ǐx˳"ͳᛮ?K~ ]ߴ~3|և漵%EnX^ݻ?n?<>Tt>%Ó?@#@ǿOzۡZo~r_7O#&n߿wy_?3_~ӽwo?Ez{_mk6?S)?!?Zw53}y.?ۏ~h_O.=7||/|ϖtq&q}U~˻:/G|Q~?j;}}=?e%i)}ИQJ_Y #zϏ~x]ߤ50t.yýf珿|x{ >y7jZ{Xl`6Ԟu L^L֠|CSȝՖϴdyBeB}$Ƌ4ܚģҵ)\֗U<(ͬ|r:ȚӹSS ܥRzmZ0#[nԆsә&KЙ=6T;Ƙš~'yC3{&ޙlJIێR m$5*!aKlj*`Mԛ]m5E,ӇF[*jJVcPk)z~/ iʆzb}%_g:Sʝu=EkI}_Ǫ>.LbkBMqQ3.xKLc]K7XX:` Z8惃) 5bem-5Nf1ҳfBb:O!sh{0,PF=*,3'Y{0siIF̨}P@6pi' 홐nwDkc_j7.kUOVuщ}c&v޳x4bHьIoW,:G0fjLwDy6i'_xAiżr_Ob@Nj^?:]JKgVTľtX{$hx~q>naYTݻ!1@f|'-Hmϛ1`09QBMghɆ:+6w" ! 0`gڽA0f`4A]Kh1DMٌF9L@\J4-!䎃IQNZ⊺>NgnԲIȜ%J)czǘᇖǪS; /R\Jll2 PxFA)X+U:l$_LHӳla, n Ũ*(y:2>fԶr#\,`-"D_ϙ~QMr!xAŸ0 "M4*~b*K'@+mb)cpX &G|I N>='u8񏻏6dfث Z/h1RIw+, 6),D4YA]$ּOd_t?0pJpvg7\N8hAةx)+_)}ʰ_2"\;o}U(@c`=zZqk1A)(:Bꄘ#US<ҧfW]-/J{-R.1. $e׸* TQ5yp\bkE z>`f@Kz01z-m֭-/ F%nqIhK`>M![m#:!4T171'1miTir6nzhyOj~}SDJ`Rc&vےm.Rҗ m'y]ˣ`@=Z8_Ň67Zj|Y4mcm [h,36mCJIͽF};ew hY,;a`R]Ǻ2 9ݭXe>X lVLlZuR@nkZ^Qϵќ)fSub=Pkw}ǦF6h[j)eMSqbik1uMc,D\~qSKR㢪#z.ɡӥ](b0;dbKi7~"}bwú.I6XBi[ri ;c E>E 7NLVN Eg>-8W1P)B*8-01ur C`aQQ$Q{0gEtoI,p be$y2{-=()WUaR5覾m&@ [8~f$;Q3^=rUjY 1,Z Qž- n0l* -9{"p4-s>֠ >aLcFT`z7&6znxđzEވkjm vF=Rk>pܜ#Oa%K\O!D^oX>'n\D 2#XU#X"&q.xT -) D9ӨPʄQ#a_d›qYm3 dbSb'+w8eE3J̗+=ɨ$ 7QH_*1ܴ4 >!%}ְb Yа'bG4w*4#/|İٹ5Xa/ ΧYXY oRC)D/8{!Ķj ,DQnJw&ɋ%yf":9~Fed,{9O=47_n=!"doUoߘ]rX%}<**c(>%Fq+j Y(i,4hE얏{3qn c(S #Z ?Lg}\;R8F#WX!͐KgȠbY,$p'WOٛI-.: ٽ1<>j}&?\&1);#;L*:g@LƐk@D;naRMlkp V={wTbm^xw7-|\M{`%ƌs E͆#A9pTtⷁehdmC0R\76juCu"7] ۋKM)M4dyhܽHXKg\U⦂œhԁ mL*R^hvM/@J:5jmkBݵqu#Qp!{v_q+PK2]_߀Lj+ )TRu|Lmxb+mLg`۩Nv\yP5np餴nֲr:U/#9kutGEDU4jO`m<EG\%'yAμB HYo^j54ldv218 8i4`de8M^mm'_ظ j )X%f0vrQhm3I0- 6<Xj8EPaԒ@7V+ZD7."K @,VȤiRde=UІ_]֔1` GaIGOb[kǓ<~uZw)\DH17-)aO ӱ L2E ~,9gz\rg<ܾE ZDd4Vx$IJ$j=;}Uy AfM.k0^7['.V-|ZWp+2MMA)˫ۨ6"zLAvʖ"@ІY`D6L4KMt8Ǚ0ޗtQD۱F}='Z5W <HBy9]ʾ|HY&|N +mh<G趌sm"S֍vFʾ> b"=|O?[бFHx|laR,֚?=K"iWq>'>Pqx8#4nQY @:\>gCƦrWuFEB5cDMcՋrsgb2϶!MfO҂<2dKlavXv7Hޅ6tͳJЙ-$ ^mGNNEx=@&EdDx{uA?HD0n`=~ˑ6TanE8j!xBFs?BH-6ee,S ]x#G[cʛ>HyGؙ}pUEr䝯/i$\q!vg%"u_X6Z%V^h6IzRhĵćOzq \$vėNBǾ,pU],7U$s\dg_c8ψՂEHd&7pmRz1_N Yg;u38fپ"e*׹ Mdik)s= y΍0v G踅ryR>d6}^i% '7nhOX\ɿVQ<\'R"W$v'QDCy`[(#,Z.{XjtM J#cA 篗"R"[?w(~n7C:W^[_7b#]1 ;R9S#Ѩ !g&52PӜmR#1!$ԧmRۡf{.jonjԤ\hJ@] G:_ޘESSqKhRLmyn,TBZ=I1F\9w~dcܱI~'IdfD`)9%٨Tbrp$SgY:;N{)(0ew "kuHVpL"ث y2qHٗjRb^Obb8K#%kR.hᄚ/ZsRb[I9oNJnBMAidBr!ebdIq(Ft6,mw,+uw@:?%!{۩Z&F@B.+l.0Mcn0F@9F$ jiabͲtPqTƴh?AkT&Y u>kХQ"=z(i@5\e+ c vp&Fd􅅱Cc.`,G0^:O,N@q `L;Φ3݆ &Zr|Tn QM;8A={qFƜB1T5j,1>74v+:m GצFˈ FKgK]1v8p1h8`LL=+X;[üK=&V_ꅸJrce?6c$!J{ ڛ1Glvn6vw\W:O6e^ܜPb'Ob9C>ޚVD}J4t楺.}8ӈ(cl솩iw4wuVNƓx q9?wEŐ%|å DNº57(ѠxF 0{;UK]BV@f9[Gڴ}<Юi'Ljm4,Jy8u*1Q0jbϥP٥ycsԄߧ:e2q|3lŲ'?pqNn ԧ\׃\} :ˉ'u^FcaF'u(RrIM6J7؈A-llM 687riBT@O|3h ܲY-V6FF`^d#r>%v(&.@ /eS/.r[mK0˭jߝԮ;et qu}CkŕJÅzWǵQ!F"K~Xj%n6q/g3y ǑnK*"kcaэ+A;).:NBhK\WO}إge@S_rXN`Fjxf]X\zmn MvZH5alb6p!=kq1QP 'ok/*m.MYާlnw#S6J~)h;r7*)nȞqDCkL \"+[_I2>Q<R jmG a5~%qt/]塾qlI#5]hШo@JP%unǮ4:\" C`Tdz;qcŢgP9Fԅ=oC^\. J#lByo~@-sy ՝Z,onR\v)d/pzT`2qUf4lN8bS<.pPRʠg=t0ŌQnŘؼWH 1\tYlcyME铺nR|1?ҚFdQ&~2ucSSil4wVix4ch-0菴Rۮ؎'uމQ7ujJQ3@sl>(2?]P *2Oj[Pohʵ1nRN#O0(7$f>PVmdV0N1!1[ce1ćoQћf7e[LbA\۹+ЎjRX( CzZD̳05e|^zdQ.A ~qIeLŹױ F ڨDK%]SktsW .1`T+$ްGm;c؁uKۙJȁ% 0t]ظF]į17批-uN t`џ$T>K;_QG6cI-Di9+j V[AK#"醶Цź1 L)@yNC5q3\kbJoiS\#ӣM.u _;@pX{4m?Hzf&rf& q( ؕHr u]^p?v xWz{křK P'QoN(Q3 RB'*F|豎]tͪlV"V WRs]ܤ3 ~ SeU!I\78\l+i'G$w] WF2Oܩ$5R!ylȈ tёzQĝnc) 1f`+ lD6y SN*w!q~rVɡu^=* Ė;/E=-BfL.YPO(]aD/^1ϒjкFr#"5B`'U;3j(2j,_q ćkzNcH`aL sŔQ3fkFzaIk|%(J|R=\pl1/b1uI&@ Ty{hJQcQ)>:\};i>rxn#Wc@Y-!qh7wXRaL,נ;iq{d9<>.LGj.8v Q۴{4q%3.)<3@C3[ږ.]v DC>0%fOm4V˽Xm<7)Rb,d0^8=bQӖˣwѨ3}WmlĴѼH)._ &.Kk4W}Lf.Cm>ѳųi zRlkY:\ziԑuNJ9/(8F'UT $ˤ&G.n (Yj(`K7Fz77We|*PFċK DxT$XgqX?&.\7 mutG${=U\Y<8.aO'l]z(#}"SKJGՖWVW+G|_ZpN2"~Uim  +vՈrޠԔ7 2Z<6=P&F:!XáyC@y{RVrvuyKMHPf*Yc& R(cnR#){vziL:#m7=\uWxͪ+[SUj^ IԜ3"0˨-2waEk]dR׺|Ky ս'6Zl@IlRMolDj- ȗת3SX6֮_[k_"aD@]:VԊ& ,aS~EW54l#:6KrMM)jXa/5&{00&8˹%!=vs@VƯ&<\hmW׏޴%zM8-N&/r֦EXmHTPFeUFmj MUO`/UH X8$mBԚ Nj _*Ӯ?vf&UH0O?94[ JGun8/`z5pT/*DD쬭6a NJ*C~װ(d.O_0&c e$zs/rsoA5?ruER ^$jiտew7XOu<X91z~qKxolRM~jƽՆ,{h(+7vlw7_.oFr@C RAh8VLx .:e QX٘PtftrXUu^ Y+rH͙/FDa*Orߢ'|K1 1v`۝fC4k=E|r,Qߌ7)zMO`ec("³.[~P8Kر2Fe꧙u1ʃ47vm.Rt hhn1#Inj7$/gL&N7~鸫ֳ_ZZtc(ۘ)Qcxq+tR` k6ErD-=.LlvWo.vR<%pկćuZ*Ta ӳK ?8(0 (f-.H6s)8 \ _%h}8=KjLT**Wf⸒JA+mx\.Ql0 Q`r(ԟe2##=  У e*-J&fJ+-t)ȫ46qfx  RzMٲnG<+ntGtg5~C}Y .GE\4O`䋃)  yÆJr=smwqKK@V3J7dxCpdž/\/pp6/X؃Q`IsXvFX NSWDNOyXxۨ` <zJb~nդIZMP~#y4L0aIxqQ>XAƈ];qADyZy]$'J3_%LC=Q ZiD[͌@Pϑ+Y9ߏbTܯҬIrG 4jd~.´-( 7u?@ND.M[o<9i̋5XY7 7z8~`زJ 5)ĶP/phmˌ_. -S҉b3I OLK&,H].GQ&mc4fdM=J'"0h؎;]KK$1(9(ZXƵشrA3'r39']G:U-5\]jBtv7'Ć )]PO>ǃ=#S[^x'!)EAwV&A6kqٯ=r\aD˩+jЊlٳMVfS/I1mSfl`Yz;uV+n1 : r#Tw޽ vQ9Wψ3Z&_=3?,Ͼ~5w?甦HI"+1֍|?<㇯}y//S/F|7e???||o|ן_O_Ozkm/? /9 G޶KL-V 6!D}߳>eiԡ1{OQK6r`:h)yzyp9ѡxMi&HLhOVջڭL]:b d܇X+ۘ@{qF8jϒoknavit-0.5.0+dfsg.1/navit/xpm/country_NI.svgz000066400000000000000000000316561264204753600206700ustar00rootroot00000000000000#(zHcountry_NI.svg\k[Gr_YKفٍak f8e9>4D{XuvW׻Σ?tu9q~<ՍNV'7珧,M'wzxz}3/'w?O_^Lv1?}tݿ(UVn>oիW+ܬϾs/30_ s̬Us9>Gٳ㯿{L& O?LOx䓯/N,ss:}Il6YWtbb6|M>_k|d6{}8yYɼ''na<>=.WW\7^K2scf1ziv}ɴNNfÄ$.߼x|zps\=r<|4qaRx"cjh: ȖCY׸{y{R}Jw_o~c_^՛kyq.oz߈1INˋhs(O-Jknn./n gE_/r|כj6n-ZiOnY_~# kl FnW͓_`2}0ןoW"αu#'W9nsqy5gΫ@5s\P'Ooף@|du-WDg:(R׷-?j+߮n7/OSΓ=۬/0ܺkμ <uPzt:ޫ2ϣ5?=ϜՏV3 @NFh&7Dw =H&6&g͘F&_Ccq Byi?fy@&*6.: g^פ]U)$9Qd=!h'H7 , Iɿ ORlLRthRv0dokR0h :gE &R#AY2݋)JAxZSbJ0whKYaUMRvyXwA.UxG7P72{f $7 xXбl0-tԈZiuMa] APBOC\'}`JϷCmnĬ,~` e0al΍anb~=jm-am_ ָuBAi`9zC$WJ^͓ 7sM8\`<q&\f)`]5B2 oQK.t MG]&{4AUlAhWsA5ā Ll?g[$lG|r= wm5j&94LZׇ<ńVb*i$8z Z8=Q>:-v0ilKg<[^rCytc2>f(!S*#]qo2xk,u &ج0)q?L"GUٯ*mD-9?֋SٽS+\G  xYV 1tYpG9\1{mv+z㵂 R3*l0{ ^2C%4*M6(^ʋ ¢mewzRgg':[ wM"?&'Fi`Z 6?-An1~+*K^(, ƈ K^7MGiO &.C$.ܙb92lױ,,s nU۷ ح5N֘w_o`:>g 9DmܾiG5EHA##6zBB$xa[ *ڳA#+z9vЌŅP#[p?Gҩކw66y~^ #{JVwp\{=eRÁR.q} C;#6F{??ڛ5bb& ox#5NC8bw hkI#$ŁPZgٙǼ;Nx0Ƀl \Pr. 䰑05?s!W hЁXH`y(* }c8" Q|hYhj0&yiI q43#1CSɔ 2=̱!7pg6 6\^`4ˌEAPE xc$[1AhN 4yMd eچ&$AvOaKbma\"_ c[WÝZB0ی/f='7 RY1PVZ (VӖV0D n߈r7j9}{ޝWH,4) 2Mk"3uT!;Ց49G,hb{l,UN[ZQO9 K 9&=1l_y2[Cޛznx vb t*p<!PШ`A0'd^ [6BBWRvz[I m{A YA8oj9CĦ;fGvFG_)\Ħh[0zGI0ȐR6 [5{WB -:= t%sqqLX\9ISRqlK:ưz_:$wLD؜:]Y {[5p{ߺIȌKHFJ /1?, |]$$p(Ԍ·e4LJ:/t!Ë~$ZÎ̩%#G֋tp!56Y0l6-7Q:*%:V&Rϡp7RRc0 eb+ #WA9(X垬dp Y3uQ`mq*bm5h)`ds:l5O4f#05}+dKo4+ C3èS "?k1ųGyDY\OaIGb>+Sd.`c{˃Vlt;Ԭ8h݃^ ~$D+lHb%;%O`1Z^oQ$})#m X{ =ckn&؉ ; awxusȝ,#7v*|;^*ޞg-y,5'K0H/{6N2$)k(1Ur ^9[t?04y̒1e{Z)fK}/%. [/!v|ɢ%^k`wJplKVV~GXI ;ؓ o`o EԱ81.2r{QgL'az`1n6 tN4ɺh;ԁWtIRrL{Ag%ox,WV<?i;d9F.6!nzbbèY bH~R ʲ YaCtyhB{O/ln=ę{@H9W9վɕ}a㠕E:ƐY=Y?TxخQJۓ*疱zdY6pv*v_AJ0pncr:ѾUXr_ݬnD!|1 X6k5,Y`#LXgi[]|YjП|զ9lU^d;)1O"/y[5Y3Ʀ@(^j7^#\$x'ǍM85 _Ǿ @Xޢo`a1pJ^ֻ-rM.aV_7!,¹bVpY$yaVd337- t޻|Y'Te_Ώ}-b)&'b--t<6K*`"H)QlAlAM%%jK)-kO囈tςPgVQ F ear>ypZAfruo&kR_Gȅ|/ك]ySSǒ0;%Z[9-fnЁ,P$*5]6)cn9`$DǺb}C P::H4 b $x |C|1Լ=ȸ7tN~pǸrQ \3>9ksk&m}E,K=k!{)DF{| a-7=+fO*h3 TKDP/ =J&1_=srtX*z8t~:~6mqrő7Λٿ]؁IZe|pxԒrɂ]9&Gh-%mV{i[Zo 8D'`LQǾST|GbU$ߵtY{~ջ {~e{=h˻ 7/X`"T&_&@-@LAaGd=U5suq!DBg&zhtr^vR&ٖjq;n!mŚ#E@9 g#\E5{?myᗸmoKvw}gATOl׸%]O9Ȥe9me*dd:pt ? |˦Y>x00iGjK;zV86Qun,A7n'Ey8u{s eoмsɯeJ;C0o 04һbLlm~˷{qᢞ̀xN*(x(H& 33vqZum>{$Wfb"H#Ih(WP^vsAɊ_TaEXY]Gnc⃢巆(~r' tc"n.HõuA6%Ŗݫƾb$. zn"lr ?9-H@vb[_5k(]/JS36/qi;.g/Q2bn猷P)Mp؋T[rĞskkU s%_`"ƥ}--7j2's =4O\Ҩ'ܣ҃ǀfҶpW:)/ȱ~'r 50VqWcΩ/&&`߁Wr ك̮8^jc{0Kfp9#2?٨v8i'JH+3we>dM\c"^od dNM~UUǾ^vJluxuBc_#~@jeN$/k3)W4LT` me[dmtVfux4=vV/{O=TFkaU]-f.M%T ?U0')(RT^[kOdUR"#Iw$P׼e7B()]j$v؄w(4 LUX[؜IԦ78.1}ۻ'eHǾF"X-|`zH1_P?lxe)v6MI*ݑA+|af!kR,5< [7rT:.8 ca@R%w pHoƅ0v&w3K'7SٹH|oAS㿌WOMa1dSlc,Xc8t7^0^n*^OdcAYEU R>/Ž~H<ަ/oA06isDagIʛ!p5?3n; ^F=9=Ɇ3;UHjr,='2[Тf< j6W^*gGV#&D' wPYZszqWaAlsBTGTm&C>:1 ` E*tQ>Ҙz7E/gkn:f0lxGd'T"C"+̟z&OA饪;*_. s¢TK #'|~dũ,)6 ǦU#Eo1EPQd&u%0bĻ0 K\!dq¤W:3ɫ҂]fg w ٰ!u%X,h~'cJ.c:ǾFV-PH ox}T[Orb B$ BnwTjzBA'MGvFBX${0N0Én uj[oA>^,=3Z{%؞צ6xP,K!$*PBIx`N*jRTDnBIj4WNgqI@e[;]oוfUVO}HN#3ѽ<'Y)uc&=} o)+eXE%zѵRq{|h TpkBfu6fW Y@ꇊ"'!L9Z_Rh ON |$!#sFW02h#f&4}SSyJؿףQVㄦqLb"3yA֫(õP4cqTt-\ājڴlT A\SQIԨ 9*UxɄՄLRvW(g*YԵ9%= jà}lh]r2Ї *6ŃmL+Q;6IA*,zg"7va*Kfcu*z!uxŀ~RsG)}:8vEC~[Z'Py[0<?)Xl9bSe6Nuߔ/R}Mtrp ɤ&YD 60~ʸIaLyρճ)-qEUE(J7g2D9ߪ&K,caP:ИXAQyèzSoR#b:ۅZ !_`8B Rz1 Rb_As[fZꪑG Ate&=_Bb;?E=;*)` BQꚊ|t'| E&I?e#v{L }++o@ZHG{Mxԡj(Vd&''=؝L3]auUuߩY'k@9LP 1ybdeB5Xrbzs$.} d"Cx,2U>MNІxߺ:Ft=2Tt IG\*1/;Pa nR';e:'dg `;C{oՖG 'JG֣~d&;e+HBL]j@TƹtTI(_^^“qAi*RhNWxۈkϝuXnQwE:56mMG@vˏ:/&) Wmǒ86w?gl$$6X5 %ZaQrlSŚa%_귷(k⎟?8c6{p^ c)H:074#5ӥ!d߻؝ˌ]7}ONedlZ#,:#q.@%4fEkQ˖w%^ |^eЪrS=m`F+er3>UNTڞnAYzA_%x`V OᣣriᆗvW#ӔlX6DI-"I"bSԚe1{?VWtCJ8Ⱥ[ C[W"D֘Y d3Ȓ=WX|q]n)Z(͋<;X 'sXfѼs%ȳelZQzd3zh!FԬ]IvC P#.12$;A)4ʖfuCYEcr7\5~JWtF71]ĥaWL=WH=|>S;:sznpz* AOA"UZ+'v@X8nԎ׊lh i0)oo?)WɄS?%4,zf"nfuڟLB鑲g;\ :χ?CG9դcs5 9(navit-0.5.0+dfsg.1/navit/xpm/country_NL.svgz000066400000000000000000000005211264204753600206560ustar00rootroot00000000000000"(zHcountry_NL.svgmk0Ɵ+?n6I(Z 'L74&6.&3_+ D}98~w Y[],ЦݤuYYT8t;%|`G{?!dXY P9 {~XY^ܒFJZic# P84GVp6ԅrmsϪ#G 0SY"$-8%a%Z6&iq-sZp{N%KIr {$iz>@]Cʟ+F&:a'L>mSnavit-0.5.0+dfsg.1/navit/xpm/country_NO.svgz000066400000000000000000000004321264204753600206620ustar00rootroot00000000000000%(zHcountry_NO.svgJ0xE)t`; :p*^&i5M\7dU;I:߽d+{;Á4U'9;5KXWQ< ҳ>_nkz XiIXw@qns8 C8a׸M+>cC cX>G13 3%u8$~r'm\5?q@)ٱ6)8PFe}&t,3t*navit-0.5.0+dfsg.1/navit/xpm/country_NP.svgz000066400000000000000000000015111264204753600206620ustar00rootroot00000000000000!(zHcountry_NP.svgVMO@WX b{vEjTEzI\lC8@ %H=eޛn/3vUZ1!pVՓly޿|!nf7EzVcn$ݙ'l^ZI6p,"s3bʫ,/b>(Z,BE9>ZFWG!DDIcltWfɤ.'UR ~nNɴ5M`߻lȄocFC~؎Y }aJ#R{)9B9-PڞƟeqAn#$(cBY $ 8dx:+'qvfi&Bgb _NZN5 y1.ݕ#MP95(JIYI@^ZJ{+r?ֱWD…6JVq-Nxڑh,3V:/˘/٤N`>T6V X5dɞ`@`?=^_KQЖ1=U,}{4'oMb{ Yz@Nըȁ)"YDS: U,)!`U*NHU<=**a ?/sj2Mw1x\-TQ4{v IO6X@ XºtuPRzGZgT+dmsž#ҁ{vNxPZjkP ) O!4<RMti]AϐgiziJ:w '{h_ie&=o֮öRA 5kv16W}L navit-0.5.0+dfsg.1/navit/xpm/country_NR.svgz000066400000000000000000000012731264204753600206710ustar00rootroot00000000000000!(zHcountry_NR.svgU]O0}?; H+lBbbeCmR%i$ҴDs=vOXʊ<t>),n !Lɢu  .?o.AW#= '`0pn*x٠ GE9[r\M"[-)%(5)t[y:1:UPMGڬkcyvly`$n/ϊP.UJ:Zgǐ j%R3 \s&fi |Vn!u Qg.r) P/ d$E21etD_;؇<\O.t:/2eܞfUVf8D**Jj}׀rxT`QɄR5*Q2|IqƸE RF$ e@! :1xhaGC+}^!:{  }ߧ}G,dDks Jre.;S$^S?>tr;][ ^z}kky ^*M-_%wwh\zDW{"~/rwEenavit-0.5.0+dfsg.1/navit/xpm/country_NU.svgz000066400000000000000000000033341264204753600206740ustar00rootroot00000000000000$(zHcountry_NU.svgYn8}Wh՗S_\;}HP@w],(P(u$C_C]lJ{A̙s̐rnV-ȗ!A8 li_-ÿ?08OUegf଴qm`Kk<-:!*ʫe0Yl^dvMj$+{c"Q7O[{J[2i'oY{Sɖ5FaQ:Yu,{SaSS)8Ǭߝy/@/aE; N=7=Uqb7:6Ke(q;u Y7e!x+4yˆֶ[Wqp^Z$ns*T\~3XôQldj ,/FA|2q˜?ɦɡr7xo2oQs[}ux 7Ӹ6^B)p.ߴ#' qq;"M@M\f7u;q}{>'k%Mn27)z_g[HD}FF0"/Eڌv0:n;DzzYY.Bpڢ/` c0ZtJY@B8.pdSҤlzZwQ-w+")VE Tnoy}(n\JIɴc}rH!҅)K(*Wm,R{Yr#@[< г`)Dwh\/ N3r2LδW@%de"_cpNaYٹy,ygV9Y׽`p_lss(*[J9Sb qmFDݽH`gcѓPaLj׭tt٧G. R"3 V@ ke?c.4J d_!3F;__sg,@AA @Ԏ_Tí>=jZ]?(=}Rz$y @Q"O(B_Q%˘gRYDžD f" ]ӧƏu6E!Wٷ'u0~pkQMEI+=UZC(T2pr<.* *FR_+㮭 l)&H~ \=W4LTB pN6|ި`HtdcyN䘥_\79dc 6X fCd/\M(`Ve9fVaLe "3j navit-0.5.0+dfsg.1/navit/xpm/country_NZ.svgz000066400000000000000000000021161264204753600206760ustar00rootroot00000000000000#(zHcountry_NZ.svgVn6}_`aʼ$D"YmmbQ`(6m ECRdCJr$ ZaΜ9!=y.`:7pMVγ”zJJC]}3_nzk8ַYn[<t]z;%ٜn;IM c<@_ouԽSyvpF`SZW[}Yo%kr3%OZWc֗6ٲSȖwfq)i\Ӕ\SWrϛ@t\5S9^&"fŻ7\WӡBІ!#"}9pw>`tZgXbJNa|C̬X+ ٽjJhkhP:__sTpr *=p_Npl%5?*^0%UhٲkFcvI>}< _4PN+:`?,[;?WakԞfga%*|)t.{:{hSfE=nZd>DpsAY$we֒9>f?"VЗpbASC a`axhT~;rHvtBYb_}4R#7r:~F.mZHQocqFp}/tb| Y?̇y'n|UZ(gە+ "S#!=2pU'`1{=!_Jf&1 T navit-0.5.0+dfsg.1/navit/xpm/country_OM.svgz000066400000000000000000000236731264204753600206750ustar00rootroot00000000000000&(zHcountry_OM.svg]Y[Gv~`]{4H,23E^w ſ>w¥)KE6r2 ԭKUnGoz\<ʌGb7/xLrQ?/?ٿ\^[ՓM=oތ!wfs}uݻjݶV%Ʈ|5b}=>?nj6ozY_^ݧWժ^/VZM=WwQy絓+㮜Dfrzg(<6cmz]w\?jqu7W/}if3M7jo~*ɴ^K78|| c(  T-th_ʻfO-?dQu|jFχ?>q~_ |ln-]v,q zf^%04LjZf`>LI8UɇõZ.8-ri~+fT?F^|pa^N>ԫ^FW*z3M6-%]M! y7Տ-?0y| /gf_P]^YbͶ'7mm|wNz>yvG{<,?,&Dc]}^װ1YM^|fqGӶGCȥWz7do7޺[{d mjrU&=@vʨ#n*>db~::Aa>_ȸGlz7砫n混E{^?=n2_I,n⋺=]v͟9ǟBdz&}WÔ~/jO\59ޙ[ݲW;UկPA(FŒ+úAJ#c3=mto\o>܂Kįںx ϼSrp[_or6xnRk{i&V6 /MYvRI91Fb𿝜qq}Y8{y?A/#@]\.ɖf5Y%L`L1ʅ?3YE4UًKklo?ATk7@κ޽lQCFBewۥϻjWB-B;E7v٦އN}A6Z}%bLv`G͸*I}U }贱xR}1d[()i{ 8[of1nWcMFΕDdf1CHb h .&o4H6h ) IIyQSh+H(\ Ĉa-E*}F - QW]'ۈ>dc-G  e-An偆IbڝcB %W)oeo-wڧh40i٣%FHt 1UrN`TF hX n-\4[yeP9š%DdGI -*KPq- V &p,hJa LHv#ܰh1gGx"Jl%`uwXO}oQM<Gwi< ?ޅ{p4oG`TR0eP*l N t:s|{ ?uY8OY'OPhi Gpo_='uZdLC*Ry( V;GP;d5}N>ח')$&;d6 ' )6')&%^>'M^#qHXiTIvO{rVLB ?hI3qEN+hISҭ  7(ih:obr]H') G5h5}YqErtb15A?;ka)"(4O3m|if52wv}eͱdc<В}ʢT!:[J)(s>2ԛ)<ezJ"?ŧL:N\=P{#'&hڃ'HUK'HB H'.* $v#?ARJ#?ARx S 2L8Nd )0i2gW7;>"t횎ґ0K:wGGH 9q.9y9r_v縜#}yCIn`7s$]̑v/G縖#Osʑ 9.HNü#9J29eraKü# 6?8R HCui7qa^đRyG |_S=ƥ.`\ƕ.` u^0u^0Ƈ.`|Ƨ.`|#dp ^:漗9ﭮ.`&   $ ( , 0Ӛ8LP6LP6LP6M6M?z z z z֜u#g&{FTleo. nM4UfqpY25..*A1O8(ѫm`*+_EE[n{Xle G]NmKqNjpИ4c||D/E|p#LuGRTE\ #KU(d" *W(9(j\S~z( Z( ţv)&d@j TY/{Y9Aw8\䒪/ @tŀAs{VTrK,0(K8z(Pv z(5,&8ױ4RP Ll@V3?i_,);}GjK=PNVۢ~0ԊHM`X]] QTSf2~ ROu@wh2`)&}#Po' XO-U2 "> 92{xfA: m(@$B@ g^"EujH%15`X " փvE uR0t }5=t @]<CPL`aZ#fJ Ш, )g~-y,XJN=s-w a(740jP V:/d!# mɆ >),U暩SaD>@a[ddcb[2BT#[< *mO"5|E m/Ⱥu@D`͑zu d -ՙ//9 %L/K@D$L1r#D"jD _tE {"_L _ +IҤ[I>b%C l5qQ\VZ-!-S/vږ ۲;pa#E[u@*8vVu Bw`A w*S9 `63w6^hf%[cQC{@isb͌Od"dfD i 3M-b%٥N禇NC5|9JXHc-lǁXo`pF*VXǚZ׵D&-.5pN^.,pջCBF `wQs%[G0?^iX2dX;rQ t,/c l>p@}GޤWD#r؃SamXM"SX5](:x %D)BN"?HW%Ҩ\#F,rP>x_v} P`b_odv#B6yI٨tT#MHc-n%2t#dոER)=@zMN ;B{ %L=nc CN(Ѡ](E _ĎD;Sc"mgt1ۈ$K҉IZs@RW픓(MsoBF4eXںa,I-=c5'FŚA0-vkD ء; RQdXW#>49Ԋ=[p[*XCwqt+–мM(X!4IV@Ea_Wpg(E3z]3z,V1N ;2wmqP4Ff:02 DThң [s_~Ph mKlL}>Ń2e*"omX[xpGXMnRIPpewA2N2~w"[/zV12j[O F ܲ:nRlv62I;T>'KaURJ/f\Lp0mTE)LTiҀ ŒkYr\2CdHU*HL]ǖ 8/ω#LpEx pHeaYs飌8d-&Jғ;|EAxǂcY[=b-[EoSP /|x&E̊qoKB%X"!Bv7krspGYJN߅AAИVfZuqo Yg[q!{4io>yqH @9o LZQX~`CgCaqU'|@y;e13y21H;"BbDqH 7Yx21T Ş2 n]Ĉ~Ba8Չ1!ҷB,Ā‚"j^*'dLC[Вq'S YOvβVeD{ {I&YsYpaDIOo z{.V,-EsYr1s-؃o9'ھtm*6.*n@y@@۸\-3VokŹ7-ro֫?Q]ϔS>.@35tB?T@ ~>K49szqB~>9@Ę siM%- ѣ4k v|dFa%QxXd …|pSa4Ҵ~%h,ϋYf" j J4J ϓuVLZ.9sΐXsW.NiOKu9sΐ;)}%௜.7 f(rX;C>k9ҊfH7Ƽx2[Z*d Ue=C͊HʵdG*L PZ7#,yu#[0*OJyHBM[I 2o+DY(B.Eګ!S7 uE)@Zʓo6&єBz-INwVQߗ09Snh1GL)j (r77.AY9&RCMX7"F@S#ԚNw$IOEdj`v+%X" *{Nz=]-ԫ<fQ9ry0$D2RK?l+໽S2%>F"m̵#+jeBA! =6t&O V&CŐ$4t3sKݻ 5:wnBR7[8#7^A=D$9zl˭)hj{tH*y41 Tyr!h?T'" L~y=z6 ڝBNsg؊7O eMǁkՓƒY6#?Rß=ߥw4aCFb 찠m\ ]Ԟn>[ F[+d/m=/qWfcJ1rhd@׈\|gS9->O<`D0JK]g+FZ$ǨuϯϟmrfedKGAQAwxDw(oWEiZ?9B_S( U oG(D}B8"}PPxQG,kKaF_RvGB|mܣ2v|O`ůEXv[.Cl@bۺuRʮQHsMʉ @j|*x%ѐW@Viu% 8?u.?٩N ϋsl/ybR,<a\ztŶiW O#hm'}_<Gw ֱYF1 pgl<smqv2ڳXsd}lTL#b{A{_<=xB#|?he#<4B'*#*o,F,Ҹ6.vYs*#U28]pwi:Q֗y@Asi L/ łgv9gQʇʩ\¸{'֥|DkEN֬[,u 1.}&ޖ+8; H{^xiNzJ)L@OPPl JhOD-%ti*|6=x"UƚՍ\~+kh>/Q@KOܙ=N4a\IB˩s$wI'h`i.zޢeOFi.j+ $X:at4&1}rޝJ %S ^}6${*5>ZT04Xt!?8=OO S}6y iow/g03^O仌 gɓhe5۲cKi #<"K9bB{a)zhz~UuAF}(@I'&L[~fFԸEBeˢ* o7W6ݻ[@/a>?cPi}Z3uݹvUg챖'G # 3@JbD&I0 'ι>ym (Vo2BZP*3Ct9mtw9D8'My(dU {Yʣ Xh҆ 8DVkY6iU ErΈTDѫ$C@|Ρ}?G$:sK̠ ?Cf7 eU!,1=`d^4dοd& ^a`?3͋4LSͱuY;8%jc^ux8<=^i'Gx\,6Mq7lnavit-0.5.0+dfsg.1/navit/xpm/country_PF.svgz000066400000000000000000000133361264204753600206620ustar00rootroot00000000000000(zHcountry_PF.svg\]sq}`/Iv4 @^ʓEJLJ~nܹlJEE*<@whۋ>|~w2/W7^~yͫo\=yw??*||_^}_~e,>~,)V򓥎:BWo^Z_\]~sR|-pq@~~_^,vys zvsZ?:rRNM녴VI&z XYl`5مX[ĂcRUTy$]\ge)@]T?S fKEPkC#-&X/')%zfR剰nihk*0Y4߫{\/(Q/_R<Q jqє}x) []t12:%Z0D1HM{qHEXiI:uOq5;z>_\f_?߯dyhcOzy5^/}Փn޽zV ~ Uj/ -X-M=i |ZJjuP_V2G[iP'Т3$g(uHچ€* -& AY] C"ִ<]t4cր%k[ƀ2FZRS=-:gϛqjm {Vt@mDITǨXO[j臘G*?=?[;Z+k'(#VU7aŽC-ZB]r0- f ; %5 +Q6~8Zˠiƴl$OV1cmQ 6HeA؟s[,gGZ:QC9oEF eSuJGJy2C66V֡ ,QMunx4A'N:R2?,榘mr騬]% v+Ɵ0A&>ޠ`Z[wBmnX2Iv.kFoG =.!yB=Lbt LsB5A,YR| ,a2.k6HAg:3^1 e0'l25aEˮ28O3T/o{H h+ݕ(y`і{}so|xZ)TcX3# Bꮚ%@`>R)59Ոџ-ǻIGVy{芽z͋^KzË?_~_0`A/p.w0Sx@ah+ޓA7N4};F4(73]6<Lvy(rgff3pzȰԯ^>IGO uATnAp>/v`ǯFkc>gl}c>>0N:osN>=}cOH(`>]9)||BBw`ZZ}}csӾYo s>i*{uu6ZsGhܙv'd52 ~'5\?0^ޏ} ] O|f~=ϲ=<[$R=<=evLrfnh6חd<5N@)f&Zy 1 S42HIٿY!wG&9϶AIʈv{ǚtkAl;-bͦYԾXm*Ֆ1 O`'0D/̇c&qKdrL7b͘qŷ-Yj2}dlNEU=wY1U9M3h2,G@aC$c摱 HRd՘̀B开+O!XX_ ^Kv-cׄ%ؕL44ot"oSH}B'pTTF-1FWz @`f1|;o:emZ[Ƙ%KmkmXmܭm%l`XZ*h}-Yp$ƝʻN\I[9Unݺr`JjK>+S tjh&N#+Ac0Xט 3LJ\/hj#SF/-5 H@ՓXg徊`WV10KxT.d@ŸP]vu6=P3Jk,=u][@p5ʛex i6K3%0ۉZwȚD_W\VMn*ᳮʜx#n֙^j^}֙ka]K2Gsc³XčR LМ meٺLV1ݹQt4hQzs G* e&E558˚*Dwd윿XEzG9{ԲrQ4#;XfO|ሦ}J41檖o}{27!LnNe)LS\&Q'(s UDQWFFpt?9U`Ƅe4Tu΀bMMBce E$1A`ъjс'*,G֓A&67u3* KB<=3 LYNt$nNkV!溇VI?,4A2]ѫ'.Zܢd{tQ@kйFM~ uZ l 2P`ݕ&PSql( ߑ؈G`kk]90Vb/0s"%D-wuo9s;$Mތ:ElF"T8umwC DApުiv)B7GfhވX#3T^P dy3P=Tո ;&v æ6!;"8v-Ge&!VVX[@5-0-^QVj&2j5>thZqT@4R9z۝ku ޼~KnYbFx}1Yq7 sdQs])څ˱!dneJ N3$v*.,P)6!͈'lҷ{*O,2Hc=wQVzmH6fF8d#Lk{Uum1fQp.wm0nPH d̯uuMm+QD?=e^Vݫg7D#{2AYLґl꓿ +R 'ɨCwlhA-Z(jlVcnp8]F ʏWkU>sSVMH=)*1Dw͋ k{-.pc);XgoP! -$V j 5)s LJL;3dZ6c0R˳"ШZ1]ӼʜCI*sJr(s!kMZ*o6 /$6!zLֱa:l^/iray%` y} ?"'VՇ-rpj>+z@Yƒ܍$ 6;_qJ.ؖa| jG!.;6ae|hke'L:0 m;,XKirʘ<|Ę,ٱt؎1ӿ zcccJ_GXLc:;v4νW2" Q&Kv5.;$Z#]cQnӱQX/]Lq),|ڒ7{Kn+v<0<{WVI2_aW1P}h1iH6JZ T|*`|'cNl̆7Bc:Z?գ/ }ئ}3G3@Ն>;Z$W%.録xCޖZ-JK$N)q<13t,|#!D)%S۫Y(s᝙5{Ѩd'%v>ۙQ[NidST?z<}FRYi-G 9zϹ8$Q }HYoX˩M|!˧}03sfsQ9=?9/sq)#9۬2?mŻ@B$:EP5h+ӞNt ʭu[aIvpuiEat4>uER'+n7r6)@{ O IL7=H҅ vaޤ,Jt\PDh)ee&hsT7*AR!K;Lj,j?a::MZtcQ؝~؝mBőK h,#]"J}:cW"QBvH0FV38w'>Ǿ8CSB5?z_ӺLG  V]navit-0.5.0+dfsg.1/navit/xpm/country_PG.svgz000066400000000000000000000056541264204753600206670ustar00rootroot00000000000000'(zHcountry_PG.svgY[o~/*6M/hS%/+r%4~3.%ˀQ hg~fV~S}ju]L.z{8]]՛v,&vի?M}Swͪ:aY]tBvC5BUUU0=׋IaDjlg>l6Cv?SRd[-qa4Ͷ;̔Pˑ\}shevk<ܯnFVDp2̤RJ3gZO1=E`/j) FίP؇lfo ׈mnsOXu35O î^6˟֫n1 >]Mme B@}zvR>KL㮾m/&onf߿U41ڳܐ|CrZL=i_,.t"08:DZ4Mvݡiw{bԏ tkO{J\?6%O-☖S:/pMJ~΁ ])}իǒ@{wocy1NMj9@Y3r6x=QiVҋضZޯIhn| #%2V9+0fgq\@Y6uYL~Uy&oqw߮RɘR>qͲ:tk??ô\do?6-J}|9kL,U/@/@5drWww/l?nyٶKγWs{  28>v9z;G)F䅬~_߈G$G6zq.?rcb'l>\(qƩme}Qi.T‡|e&&tIh˞mTZT4tZE4 .D[YT̖KcAu"&FXvie(4^$c,j E+8Θ#R ##V' g{J +D3)vᒶبKY̤18B&-d97P!7$"IZ(ϜEҙ/$'; NDKIL#>4`;fAS mX@^PllԆpc:Jmaŕc =|1x^]൧yP ɰS* 2"KQtf}´ |(b.tnHQ.[O a/yޖO h:#+EF&dG`z>ZN)YICFBAǽ@4}e+8=*NJBD7C,0rA(FԌ[BIv^4=#l(E4ωn;ɟn+`ANv>+W1^gHWY5hpaS7֖df`A7'`\-yth3][V{7Wgy^̽s_vxn(Ȥ$àb׮wNھ lyG#3@D\<ҷ0hU3(~-K8E,q\EBS׻}=_鯭uSw̺͛V_HTW$ {;i1շHVnE'#Fۤʨ~7˕ru_wl I Y drv{իwRnavit-0.5.0+dfsg.1/navit/xpm/country_PH.svgz000066400000000000000000000035771264204753600206720ustar00rootroot00000000000000((zHcountry_PH.svgXn[G}Wj_Zj< A>,@^Yu@iXn}-W/!9zwo~Zfޯ˶׻f/~|wݿ7WWa;~iě5M^j U)xOS#q{s]-4jެx7(ټ{qYLg3DeH>/pz{snslܭ7)Q~sspۿ)k 2T@:yy3rdM EUy6ɩәo'^j0$WpJɐ֠hҒZ=jeUZJ]S ڥT!p!*9i񎮤43GF&!6TJM ae$_Rr'za{xwZ|>췟rժCBC-ȡp7)ggBS*˜ȖT:&QT4DIPZ l!1NiTP25Tn]zjI99i -2v́sB%'RBfUT84d$3ZiŐ S.f7*#)@$@Sh55?cK *BZ`M.ETشؤ eBC_?Ճ_Ġhu)N-ؚe"eXpUKON)^hK} R4Jzq hF^a [ZXFЩt+s %:)P[]F2gzfKn*J>Z;G nKO2[h ;1a̓t(T͞sv mK)MP˂Ӿ@qʓe-`\:y*KUBYʩbi2b@P*Z9l7&Tj uI֙MMy4$h&x ν17Ҧ; .v3z@Keu˘Y&E:p `s^# Zf, '6w39*@5N5͏2Vap3SCE7mՓ䗞`1a# vџGVxe{rtW e.LA!O0E{lmw%Mt[3n)e._.տR-?`y|~Cխ1@6$cj/H-JQp3b+LiG̫ 5mdn]E,h=^+c àE #G5uJkAZyIG X5zf(+'H̯k\T.Ƴڔ+Ln'._|w͛׫O~_/7two~u{e뛏oyFzwF^ޝ:||48o'gY^}$sYd"_^n7Wn⟛/_.>߮0v%,1I}$:>r~:܏zeG%[(ݮo|\--ZxCeCd#1붥|Z69־eßv2$vr6%6mm >D])1ZnJ8aL5PRYNZi۳n{d,IK߆Wdr#\]M\ݶU)6*ݛY-)+sC,[2GL!(}#OT嘸N96'loY4\/׋WwI1OkAN49#$qTJ\NU98}L7&Y +i[ARv7.NVuZsnE}Ur\d4/X\'}M$9#^%Wcᯥb7cW퉢gsI4uw/WEfTeD`W35Ր{Ks鞸_SCAG8A1ɚ\W,:x6MͮI9TAmkqa^\׸G#KQ,!K)=$,ONJ\$\TPVJi-(d7rbJ  . A) %.+.  Kh>К\)AC62 P_֠e(qs.`LH9@V^Op8m,޹ ?)u3N\x_ۗnqWR'!yxk"v2 UZ,^PHnwI$cAZJ [J&bҳ"1|'[tRw.s.BPa.ssIV㹐p 7eJŮ,cF /GH$?Bq*1y :`RE&܅:Pmwُ/ŋ >9>Ar Yh ]MRz*kaL"-V3dTJr xr0Nx< OtPoSe)"+{2e@B1:UhiD܁bNb%"#㖭d p=4U:QB⫬B/GH}߫SqD*A007zduygCA`&F—fŕ j cC6'BȃݬIRDyen[ (GPeXYDX19J@`|pI;փcJ!p"I82%B8dJc؂ePêrفC*_-)sˍD" $,liT;PG`1u{! JKVW?Я!+`JNch/ލ5Mf ޕB01 J  " t ^LJk zdFDPAB\GԽa9_$`{J S_Da9߿gRf5$D{Ns (ܟCD]VRz3 1 à9if=^;!@0𨮑%x ErMG"-jHiQ7@%w в/*6we r|ǧ!?JYE[(ݍueӠY*X` -g{-ΐ#ӄaP0]ZbCQX%)*Q,Ŕa`+F˘ĄY%z--5言aI.4H!PzB) .5۹ŽwϞ m7CD \h6eW)ω,g{>&\Ո!1qf5u4r.o?pYD0gl -=AoktuƐSv0 T#&AG K(~Nc)do}/55X.{'{0iaH_SNTo5Ln`/93ȁP5 dU+M*Mu0*[)Dh5ÞXt ̖4:O^N5UJ)1%1Z ;:O`ؓq&@#ٽ CȩuGc3;}<}ѡ[vbL |k]Q[Խ435s\"^d32٥^9 V`Qk iC8, ӼUE 2Jbq҅eea@fYn %ccB |SMۥTP8{ը!#}" ^kײcl` cxϖ '-f`@[2u iuX= Μ fz O+bH?C6d yҿyE0`>K'];,p A*eҨ BJEñfwW/-e ՇZd3Xu=%º]E~8#Eކ7Xqr,nBK%CMؖAض{JZ9߄ym Z0ނK; -,ՂٲZ0G w{TmQ#.-)ՂEĀ2@ oXd$Q(UYZx#y/}W뵖 _(+>zc2oOm"ΙLQl,-^Z m0z3#6nsi)~i & ﬖ-rcZ蕈c=)99]-λ+Z*·2Bä-Px >^nϨ*!fVGUZǕU-S}Ux?<`氕jJf491<x={FM쌏Ҡ"s.CC!wGѾ.( g["SF3!Eșx!1tih‹xp7|raa)'}XYz#0J)1,N(ovD(GU݂P%ǸlE 15J|wDї.้arʪfx>1BoD"Sy@>2Lw4Zؘ{Jȥ04U( @OXW!sY;};d/יS3<  >Sq\.,zɚ*.XZ?ȫce$^i؉Zf(]!@U>cHq/ ΫjBf/L1u+ <&gトT^M} a4[hkYjz6]ocW{,\ΚI9]r!RYfT{ B3ѫP@>^7F<0aJ>|lb jWD~X)HTdK֐-7K q f\&nZdbR+Y]ϗl@+ܛ,DIq) ic0Ӎ4B1}t2"}+%L.| ɷq7Іu)LhZ~\xjW;\zsYo$gH&57yW9qJi)qRq@R_+wh["T 1cLZa1HZ (G!).00Q!%PaDCT̗LlX}qO&[z+=X']^gw5g׸/6WF5ȤS$𾔐ED"A`HGؖC01L8zb ̗_bv( s|-1kk9T2M@Dդv7JGF8h{?c D9)10N6R밄L>! #H ") *j- lwLW QpVG3S-Mr ֤In lQ%RŜ13` V;vG$?PB~(~nD/dyjK>'N)Cal q ֫ఉWJ,KkMG`֠\iB}%(Ҩ@ᨔٹhX5`n_UMNXY"Wj5E #AKuƥFA+F)yuNRؼ8 V˔T-2S<$ZU +_ ӼM*F P$K-#8{wC W Z/Z3QJ(ȑB< }Ҳ(aI,) }gD|!oPXBs'F9r!pjMA"GG(߃T jQ$6`F^(KYt}eZ3,3.(B=bmEE(0 s䞬"4 -9yX'{EgGiuhƦ! Ak+.D8,&њŒv*ɱ`lH8SBEZ f2kh 55Uu'XipȉէZ×ku+ZͦrXdٌ`%i2 -xTwGǧtĠ]'P˘S!] Qp$GMi*"جfEsAsbRR V">ѕňR ײ&%%EV`Q:ߘ$.u2ު_A*TcOF[+lN&dvF-|lX5ݝW6ڼZJ"Sl`5`<{PBǁ+TZ]t42Enג;9AH^!̏zQy3&Bm؝úFº+#*1G,VBF8&/13ԣ9r*5If{MEvKXc^O>'viK<D%(/nY+X%gݬCWU(P3O 5j0el}NV2i XxLi0o$3cjۣuoA579烌z|!/)E`bL%%:PW+k%u# ުf^(Fh/օȟFE& ,KY0OE!3`)Bމ ijI%~|h٬jGIFL'ulJ@0 !lPԡ-8Tb.7֑ +jpIt#~WkL8]M8|s tLtߌԠˠk̘s@g떦) ϟQIbm* δnan<^]gB ݊Â!4lt0۞\!?B3ʩ/"Hr %J--޴PO6rT92jceLB>5sPOMD{=0FKK[P\CF+.E&KQYLU{hQsZ#&TK!5s r]Lѳ u|(01R9x9YoHQgNQ ^-;6?Su1bb,D.G`|"Bָ3 q0 6", -dԽQȅۖ`9Q(2NEsAZ;muЂأ(CyNp+8bN|ql<2*w.N ЂP h(6 U{T/SXT#y?np%Kü94-Ф,ƂcV;L>m <]QeDbfiee#^T"b%Cʣ#?"Ep.:'` +7_MY5:1֪}}S 2? cjo$0n60 S|V7Z ("uXf0ͨS)#UZ##ԜBfk:-N`G}UІ 2|-Cef +`rUɰ*bl~`2,!>SUE*j[X"A+DY\5Е $;m}0N)2e!nfse>ayY*=<JJ(У%R0x%nI2A֮;kp ׸Ͱjxcap( M-yq֐& N- K_~´~~O2#$!u{ٲ&xo {J rGX䳜\зlk( ,Ԥn`Fy~J ˤ#![6jؕkz C򧘏8;Qbc"/{{:>W@aC ֦QmW8);Djݭۢ ^u^yn )<&K\)nr'ը1׮1K]uMWZӜ P`A;HnyV p XO"mkF3r>1`uSXZ98ΠтCj6j+)@_cJ=/mnV/k>ڝS<눬 X:wLYUJmnnxBD\ Vn-(ˇQl+'CB{+O:~B(:;dwu|N~cHM Q)eW04:]KX1йYCi OJj)^+ &4oH::hr?VF2#o}e0y"X#ier@V(scZr:s5ܱ΢vcϦz<#"f٦6i!P;.~g0@ŋ}pUɷR񒹗~tެLoJ(LjĮdOR"΁_?fA!N H ն%w\5Uk)mBJ}pdKiz3xԥfG.=$S5HF}ikԈބt$ᛋg{tc|H8:"-9fiJV-c?4`,W|ᎺqDU~7w ?')qI{>Wv)Ԫ<JUxY!NBe?A5i+ryo^0Qӏ.qk3ݟ Fs' ¹w mЉnkqyVԿ9jY)N6YRb,BwءbJ(4kJ'tao^AL2F>k;O5f=Lxi&1Or%.Sh,ZKa&=gXL}q>AB4QM;Y_\uvJ TDM.{tng:{Db$JQqv=/UM Л-p>0UPD,Qf^35>ғtZ?D\%ԴN*& F=dHiI"z&LqFN}[FzrH~ឃXL;٧#MX2p x^QrvjE dRlyX6=rC||Ǡ` -+=in$ navit-0.5.0+dfsg.1/navit/xpm/country_PR.svgz000066400000000000000000000010631264204753600206700ustar00rootroot00000000000000*(zHcountry_PR.svgTn0<7@a^BeXCC ОU%"2)P}.En,‰KM 0Qʊ:'}s7qO',}N ðµTPJ= wcrrϲ̳xnrQj9IUsBBCHQRYx¦+5L\QL`&Bg\nЊUϽVc=y޶9*qC50A)=ě@dИiF6\[?+{FB-[PӃ`0QP'@Z?Hu.4{ pMgΫG<{0P{LXb)Uq<"*4] Wx-ޘ%W57$A0DQI$M4qEC_-{WcR 6&c}t q5n!qLyHڣK6p+Q;E[VMoE贠7f~&P@navit-0.5.0+dfsg.1/navit/xpm/country_PS.svgz000066400000000000000000000017641264204753600207010ustar00rootroot00000000000000'(zHcountry_PS.svgVn6Sp͆UvX܋ CvMiD "ey>^lԿd[1L~9g1ڙ7^V;h&!v@Z؈{x ֔mQˬ]@ l#nJ5 F,7Eʱ9M_ZȒ\ؒbxJGFg`n<=g+VWARhL1ڧeIYA L q˸*೔ oOswϖg(._iة0)ÙxU# c{Qמ+N/0:-K T;YId&rNJ4,~}۴NOY>u冐!GhMI2'zsHp2 ٴܠQ[f^zhs#}0>CZJ5u:/*= _FY3LKY<.n\ ڲ߶`qtK2v ҥ|bK=.7'7˰<;ƕ83#_@"7%ŗ Y:ǯqS8^y11 w' pCB}47s|}9[WP`"&H M;oz+Δ navit-0.5.0+dfsg.1/navit/xpm/country_PT.svgz000066400000000000000000001305421264204753600206770ustar00rootroot00000000000000*(zHcountry_PT.svgݽͲ%m&HcoK)5j7fnNQ&i=8yYGMј<?_W~᷿~ۿ?O__?}I鏿ֿW?ӯ_Rk_O_IJ??W~ZU/>k2B_Z]?>OO9?ǟ?~O_}//yK.u}^kn\x `<V WJgt0H]@6rf@NO/EgrThTJ={OM=?&>\Ζig,}:+!Y eNS@2 g1P>+O:HJ)"2y^EwxϣdI*&zvj)';5hdH=KVbI*WN*PheT<Ci3X T럱({.KXg;`i5%HUKTEB 0 l#>WR//EqW>H-.=٠J:r=2{y$ݙR#rB,e]beEH](Jc* rN?B \10V ()nb@ r`tq9P53@!_Z.T bb@by&VĀʠ'r vw@^~敞$X" 3QD\>Ch(DAv7*. FFQ0| OD& EnP5! reS˂V\8J~HBxe=4TYSяâ|)I6 c4fvkKZyEgUݻɯֆ]3'`rЍB'"_Qhf _L*6/F}ZMdΥT ."R!?qERY׻Ad Ya(Osש+g7V5$KrHo(Sd0r, $7_Mq&jۻU =lsYQy᝜C5ԩM%u]2[ ~\}L-+OS޸xGoTXJ~Qt#y ЋTIVeMMe mQinAd wچ*9jFЛ4)ea}LZiC9dŌDAG/|iS3ӫL/hfqV ԏezU"BςroRv$'jC=Wonj:4xؕX*Sv5Nj] uӃ\KwdډA,7yhwѨ!Ul,sL٨ƕ3و\dcٿƺkzwR6v XoD4.$e0+E#<&UvXhbA4 NdWFU\6V^Lڜcwٸ:e#cFzMѨ!"{n78'^EcgQpTܔ'‘,tp4ˮQpTcŅJG=uI.Up; Q G݅#L& ǜ(lTec lTwثm[uϾ٨>&aj;.qrl,epoK+vHǞM:JW(eWJ@oJ/0_QUQ5C8vd$48@,GNs8fKǍ}3v@"2 TW/bhŢ{2OR*0(&.|~*O}j? q̬KF /0jPфs -AJK"l8yKxT #TSuUK9j6P^VWpZKy ׻ 2&ue0um,``#X.d(pP|wrU#z_S A+ zŘ(QjM8ʉ2gS/Z |abԚ0@ ְBҭ4YUǍ4ҎV;_]'pqr}*hVp)i*އptQ`˿t#*>la>a> oL Dg&+Ÿ̧l &wv47K /gKm1~~٥.pR9#PEGʕ#&98'W&P~i_Enm- SRe3Gӱ>*[L/>Y-(x_} !!"9^7(97 _\',4/7kTdTJd!0 0[I -`;YѣoUB*F\8HY*p0U T3SWXHu(uT0LԞ7X]/Bj5v8H/'dڒʅwjgLI>d;9IVh$Yű6IڥKAUsdE`wY pYIcgL`Q51@#R,1 U8 4gEePLEY_?J-oMd7N ZcZI4ib$yh}D0. &;wx_J|Et#PA"PP }[U \i)S G%!$S Vg)OLC<@Uk ̸]`+ =WuA]H*|9죥\Zb:_ K5G(Y9 Җ!ض ’ rqumC vTXb[+ᣑ`"qQE2Tc&b7x2!Z+ ȕ"M/ד9|9z sd!*Ԧܢr2! gAL\t*PeÁ [/F?D6nf A0bX,uv#&4tq\;0;q[%7*M\srAL!*k8p%EԉcĈV_c eߘ`xCòjq }"SA 7pg3zO]WqPLWcTA-&C;-E[=DBTO!VU,RJ9,cHΖ1JsB咆X.͎J.,8qa=ʘ6R+@+foHBG+*CMp_j13!fĆcӸCo^;!ixS#TyfwD`uWn<]z4[F=/?5{lɞF%X61dZKHm=Vr섉ޓ{p6*M*:BNH޷vL텡^{~t_f4-rf9B c59rx߷dּ'} v9G)re91%r#-ڬ vcUd[ױ_dX1-,֜N2 #)4#_CwQI|1ʀumV EPbMdeV=>]_׫2$, .s X₪=fnzЂ ic4553p"jjOj܈0| <tv&|󷾧ʪ}\){c @D#9qle"HDjPX T VYjܲK_< [^п'eM2O#w#{.\lbpʂDU>KpY x}e7E,#w- go(/yaY7 ɔe,˸9ȸ*#3;5_֥@JnrNaL!@l֟R)8,"w=٫dWlKAl~'qJ9s?+˓Ȁ3{e6{~nt´ÍfwB0- gvl~[4ᶃ.a87Z}tKo_y>rѰ~χ# jlD]&ҧ"N/X;`*IsBY+XWhPeAYйd}Dll] t*Zܐe0\BXK5`jӖZj.lK%Lv;%=:t5:ֆIBА AҡXW>d=LF0PUk<beC UuNe.tP waWpeʾـ r߸X JJn{-˹= IoXaq&1RoO#C@f=)R*bE Xgc1VسhSv))~V0:S\[L`FePXYbX*zIW붚QG<8ŁـM"5;1 VON8 ;be4ߊτ RK0JFsUJ4Ӯ VKKZSaʲW&0DL,eN:_RVZp.MDwE(eV6BpUm3VS wc\E؏ЙJ` N  [X7oJi ^*'進,պÔN4êpÕ{Xv5 f00o8;bIJ42SO' uvl9b0iنd3FZ-Txh_t:N*Hڊ՗ؖ PEP%Lڠ_ŸW\WѸ`:4)ӽȫʲj7 '2gY23c8#9s'+C'z?ZPb!ͯr66NT̀ect#Ώ%O\ZkӝLH7"`vٟ SZ.ETm40 jO)\qtaGƄh{x#&g`,M^ى58{ \i*7;ƍtҠs&mzr׫oPp ]Wr F|A:-X )k~J.˻\JJZI5.'tۂB[y^bofhe<:꼫ƙ&zZχuCEp~LsUЊM5?z77:40t]L*LK+U2gحmQ] QFbBT}pY%C2\B +H >iSLq-6Wq'M{zWl-i7W^v57vxra=lE"C ?3U):ݢDnCa\oh.C`MU\D.X/E5@h$T}B rn jx@[{=V6c v VZUbjѻ4#4멁uc*v6bS Q2Eo(S+?M35r\9*`"А @T%:(x3Vz@ 'Ћj] h2Me6>crD: Š)89O+R3P./Tv6G)hzTg~eyKz $HyL#.`~f_ƥUqfƿh|qᄆB0^ƁO*zYi/!~7LLtmx-?,]bwQ2[g7s7U .^"3l*<\pk<sf;f*!,ь8׵ѥ-n[5C-TG/*ݟV}3@i:lDQ. ?=,۶kvc/wkT誤åsP*.9ʚ4|1m!M zti#&9lԈ+#44*NQ1PE#U07h3 s)s~vsQ>a!TUYabWk99pO.%*KwyɧKe1?uvr3J5PdVד J5)%aO0z V ng <%|?3Ů[0.Mf)Kf>\[Lݏg'zN]SZᓶ+!mmY9A3(.zY'Pp^1KKͻ] 䵺ܐ#GKO6n^-=yU.-wbg#{ E-ƭӣy+ӡ$@-ʶb'(+.K G~;46gE-Fv ^4>"Ʉqp)ɿ𫋬hkJ)%t `.0D~.jxcH/qpҌhkO w~?BKCKeSl@ľ"”}Sޞ#;]>#UYv /_i)BQ4ZE]l4}K 'm;A/aoyHHݡ#r[m50-sys(o!^xs/5r~b:Ў{kzHjeWͪk]ܰ%~빐j`R'WT03mJ=ϺCX~/G iEr#gh_VZ0OC%zdyaZkOWqi%OH֎%jkc*Hbkէz㦶]peyre%J>]N fT~( {,LhGs _ΚQeS 7aݷ;JU GHaGMu-S=Xu)3lv7,5Ydl7|M"&0 dK|x%3nDcT8ԥ_qq8Wpl-`jΗ=WZUNpUr̒-Oh /J)Ty>C ZKq8:TλeQ_!e׊,{*OfĜ3I@pOC7W P.Vъu9WTiS"&$Urι׶9aaFs᝞($Z7pX( r8ҏx#GdjmrS1nO5\۰к}ai>{i9aB!!:&,[aq z$}MǷvZӇEqi t + w"qťҤv] 16pLqPRÜv<Ɓ2d̥[-dFqZ7ы 4Am)'oΗGzЁ^ ߛ깸b!&&gҋHjw3qT[ОVwneJoc{lAֲ?`U;YϽ%xGЮEHr#CwNSwr<= k7T_3w#l#EX$#l 5#F=Sp4ZN*+Ԁ KDH 0="Nl*U["яUR69j&&o$=9LO6OFԎ[a-P\-,DM,q<&3 Zğ=t9=8tXqb$fQu4J:U8Z l{NjW}PGgŅO2O{a6OR\qESU'M%fHc9E3y-qEzcK<{vq҈[qe" e%B\jlC_E,NfϡH s1PE>6GxSV~D?nd? #Y= %}+ѱa{,:@j~'"%'_8RLK.ih-O ]-H쮷L96Ja#s2lla̸=X؊|ΑY&{C fOVtgdy=$#G:@ޢҽ/Ҕ߀vJx{}Y,0-ܰl)05N0qDN)e'zr(c6efE3`4/F &X8k='X_wBp3 ?M3>\t3B{i`^y\cĵd3AVX+mr.UǩGcG)OqŲruBGl;d\9{5FEn-q,g8ύBn:g ySAN-lX8_QTYS7/4oT&m8am6Ai4FmmFs~<;vSިwq_i4ؽ=|zFVrG4W~\y;/ %[=\ξ c B!8 wKHiң5iIϏ[TS_.xBx'?%a=]u0T-|sv$j&y*{@#G:vK9@R4#%𭖠{PRn+f艃#谝Rأj +sM\8aV!a̘U}h19͡qPm mYrтp[O(q:& VBZsVu9ZAÐIZ4gT%2'w3tAT{^:xG0WL6ff۹,Z++*FpgO#z)GT:]lK]PfZΠ%\ NQ+9Qې+#~ [M?uFgB6^'(4S ༩[iWpD (8'76or$d4 m^:ǡoQ؂MѼz#(zĎ&uҘ~YЊؑYAGN+61)Ut3oVI3)6@H=r.uFPZja%^f gQ2&l>I*[[CDnymW4Vq $F裬M9Dv(*:1ڼѥL6ˊrQf=V$VdlWTޝVOX֙+4%ME^!GSq[Q9$qXFi^X$k/ͧW S?uhD"ɭ,t\܉!7hߌT8C]7RV%:#/V -}tpke\9*׷t=avj&Rįm G: #cT?;p`D"ŗA[8qXTH]VN钷,xV"1Y;~ oBt5wSgDNJ`5kM<,ѦC;qirM|i}C5TT|yc8ۛG8 0 C؇Ek 7{^rѢkuF@*}S[|#̻\ s튙 oM>jޜ_Z:}$ڜc@YNy *`J9Vhd5AgeϺ)@x$ȱf84hGu3wV1fgşhi |)+1-ZծW+Ͱ9{Qw{[9T}a6W9lqbOXvH5/Rɞ#Z$?Kf깖s`) MQ 38/ ay7Q59`gc~ﺋv~78o؊*tZ͙N +aƻx/HhO^4Ժu}Er{#iikfT#®ojcU]n/z cbӫiX׾ps|TuK@{$Be}٧GnG=guxAN{Gо;:p;i = uMJuXaMmOX7$,=)pe4 Oy(Y['lotwYƐmtrA9$" 05q=ÂB{bZQW3#JrR?\By{ JBُ{zI9QN܌{i؍G3&#x#̂?OY'XѿY%Gֆ #lŴ{z0m d5BHJ7bc\ӛ jndt*L5&KyQFe#1]  *3@:yc%&G'u{pqcK<8%cY[MuHe TG ZNnic Gw{4Œ)&1(#~floŬEW0P*Py/sh||TBOiR&/6͕"O^#7beIce0f ."P!";p%AEĆ֧ $ȖBX/5Y{0a{8\ZO_Vdj+s>'|Z>WamxWd2;ξ"SnL}8]Zz:nykU)pI>)=g8Fm"OW1qĸWfnەu"9 l!}(_aNlc ʩ瘺ϡ=-GM8vQ'eXO7  N"cHy+`WrWWTU_|aԛ1w A*Rr* #h ZDb$dO#PFϙa+YlPbZa>F c>wlFxGIJBn!a=i{Q`Fu,G~=L:# rl&G2Xj؉B]Cb\&B*[0K2d'U>m-+cr&5ΓJU0L'ld셉2V@j&DBylTG Kfr޵:}DS䪚~&Qczrbj!K\pAg5,2`rAv59l`iH9\<-FOUs^"sRog>7jz Xq' CFfk3ѵK#,.3%%~ֻO AEѮ.H҈)tTSgbT=]Uew$Zf2{FMP يLp轕9[*gb}K =0x:_8#nL+ZrQqGw &asn!ߟ21FQiz;ȉ[["ҢY)u̼a{ΐ:'%Q4wHa;1( _;$BNgDFp7r%_eoܲ#4B1:ƚ[Xq1u,;: 3wI>BgKُ/s"Z&+˖Ēl;A ƌ(Ӕ-Jom܆e 5bd@4;*=mK$lV +L:`CޅCI7>ְFGQŠhȇg(YöPۘQ C1хg0H\V8D+&"}DŧG X[bY= G=iVC{o9RAu!G@\Ǵ,K{Z0^~#H0`j8ɟN+ҵ!T?Q}Q͙㠡=\å2TX> V@-S0ؑƓTFaC՟5Jtf6eFc'6~JfO詝D--t=c!eM p ՊFcv ,GLKDŽ~"+[VX>f@ň)vRTO{BY?hA)15"1J),p$A\HfD?}_Oo_??>GOho+-+ :<>2MةZ59n`0;XUYA(H,<Fq53^݄qo-+h[\,]fO'U0:{{!a3鵟Ռ fAC]8t'T:N].Rц+,uaJ6깡>S= 'Gւ@lDN ֌iHX7R?(~hUF1黳:W8iILIѶ'jI.0[ b#EۋZjXR. $ m' Ŵԡ.Qc}:gt߸vgp`rpH+6ˑC0rݴurH7V]GM_IuNG=nmg9qCDDIk+|kdiRNp'"]!&&;eO1$D+7%E8t|tI!ZgL@'.ql`PKۮ."8m<) '/sEki[J5 oH('Jj AXom'&;w*t1fsuj,bPjgb +\lRx &G 3й\ aP,:\ VjQ!$^ӽD߫^ #5B]twP\G-k%$G :]&5KhԀ KQD9SMj\ 1f=zo&nf)ڶ?]/n1l[,+ϭyuY$lsS ö)git뻻+C+:Zw" 4r9n_0XulL'o20%vacN?j?{G%GrJ;g1QDM@Ⱦ{h_3Fνܼ6F3ֵ-o,k@g [Nm=,bQɍV@ń2DΖX`+\2 = fJ $: ؑx;T-W#hn䠷On| 3WV>$zeyw,@Wzb%gu9zTkv0){.I_]귥Omy#oܣ}嘂2)}/acӵGLD2f$`9ii?vx|C˾ZtBï|ZzFzM.(2:.ׂO]},{ =j|0lљ>8g:lzuONlQD&7:epfg~;Jfz:G#~<o4/pJxF ux|sY}MKMqjv;ֻJ6:9X+a¶[2"\TdCDְ*0=Wo=/G>sL1;d$026śmpr3f'ӟ!n0?˫@eO),)5KҞ4h,ptTA7iaFu5,1Ȭyl%O,\u\c3E#(h&`I `$D܇ZCZe8F3uD,qTMs;1@z.e+%a2;cL5֔Ͻ*K1{UEg<{moF܆ϲ3K p^ vu{rtf̣^zA XOG 6wT|ĵ/mp]JQo`8G{?g58w"qXVhzq5谟oKs#o8 :] Oy k>b)A0aPHlާ040(P q3Yuk 3P{9![sƌvkRX62;g*ѹ>5ZL,BmlPDꖽf3'@qdrbel&e{151@o"ly ( q۲eӈ;tQ!<( xezq cajݣW f~:0%0}ɦPupߢn*Z<+6 u.'{j9K T8LV_k((3 Z((xxFkN+ {"KFwQPrc(rsNCwAzR&qռC< /Rr 3crãRv6v J0JrhE=* ~$e8u6yt HG . {x B=tq&o6U, J~EQj/hs%楅8s:.LFtyɉ׻¶U[x؊P clD!u^h H~u b ˹WcGԏ:LO! RC! b@"ƎR/_\Qr }2ExyHОV Vܧs J~hdԨ0FK ;!em@?ya&(A'}hjVW(,]qmܟwC$ eplIMXq&Bii@&2^YժCLXB3O}yf#N|? 4z3^3/WkN֟Y|5Vo4|LΓw)?PPe ;5<&Ɩ0}ݜ0U`X;7`+lAg8q/O#&lO–Ib͠/7P.~܄>8ja kv/18e|쩍Lgٗ~ş~& }=5 P#3:A*,f 鿄;ǯ!!1 <1_rϻq*(`r_Q #Eپ.Td$cw<M=oBG W@2V($ 73)ly>]e-A0\f+iC:&C¡rz-yX7V+^G EudhK)~z= TmhNȔD|jMbRRLepAxHCwՕowvgQN:#ZR}D&:U4شE۪7 @N`y mJo2 %3 *Af#Ia5EQ\Eg8/W1~Rje{%KO9;P5!߉#f?`*LϔU]͎g؈EX@0(dlq$QlxV4^rKJ_'u2WNZ'UB qBx+*U BLKHknbL6ȗu։⺷_4-HT[#丰`= n 01=vGfd :l{kOn>GYܫo[Q:L`DquO~&Z*O8)&1W&*Ƨfa<6^3So4 ;"ٌT5 3+grOo"35= j&Ld4!> pa\?Zfl|v`?ȳϳvl> {Mdձf.ˤ7al5ԆozN?yFL/8h\흫Ah4Ƃv!55L(fߍ+O9(8=3д܈CtXaap Wsg - zn醤jo13B2 Q$M0'I~(XmY&Yߑ#N v3妦1[8 NIZ#&M*b(َֈP'Q16[UtYN[lG'sv$IT7Sub7E sjO/W-eo􏿆5+m;w?õ}z.Dw1' ΟbЌMji#c@ cHט1,UpULFo&9>}|m9OVY-4a/'|Fؿ[ [lٚY͸jKN>:stuv"kWD[|CMl_ĺO247Wyf!6An. -"Sr*-?(yPlQB+C( Vz/q1w V/N8З *xyˆÝ0hPHE(r9|¹ D8X ҳ ta=z"xRG4Lζ% v‚3NzQu)#S0OqKx4Dl1?$*Kgm ߟ^L7@Q{(-l%O 8Xp0LE(dzY*+E>:A\\ҟAɀd(̮|9I9mj?,3 ƄzO#eB 4~@ `5ܰ2.@6;| CӁa+޹r㫨Q;Ve 3ŬjLl _O tƱͺ ܪ([b sh(qyah K7ؑp;hKyϦA<񹷯=Hc#6#:L'ȳ ;|O=<<_wm3Z|푗)?#bg?cN_>UmWZt e1uv=v롇]{=V5}w}[8ڙWQG> >y:x#yö#? ]ўӷ sΪ+W cHT7NuV/e"<_IarIWVh=V8ncv.zuY(J'Zvqbp-`j[5bPt 4Zvpgq'>t<5] $Jv}go5'ٺяP# O& Xx! 335W1B?AejIeLf:FjOF>X^|m?OXQ5>"'ʕk:Am1 !I%/}T6{{2MD,K1q FHPMbǚQ#]8eKРi!`ȃ+qn}{i[~U"Տ_>f<.Snmmc ҆Gx3kT]j l>o' ל=B_lnZm%lԎʄn,NʼRu=uD3!نf4笋QL<~Y޹!B<`ne6xQitt#=1-˄@qAp=`&YӜvnF U,繪~JY~x;tJзz9L8RN@]N)Vx㱙_a|F4d|#(>80 ?e+>z˜׶7)Pda_f@B$v=Vyq}/Avq`$& %=VLv[p8_=73TF}%R78 {{{*o| rLG6D"Rc=^,6T" l ~@QϚU̧FmHp  K|ۦ_qt[rkbuԛMސc 1fv(?r0/'lX㍏dӭLKz3&WBգe~35<)nUbe԰Z`]Kz# e۵9׽i 96D9٠I,JkH`9i`u!}?>xc+MzvРn $eKˇ0 FG &wG['n>7B0oe昊qmޠ7[o%7N9epd/j5T6찅]^OZ9tkؗ9WcH?-L{񀝾>Vyqm/A+!֓~<֮9ilymVv+S/p1:_0s7ӷ*7n%^7d .2Z:,(2ir6(+ [޻vxնڿ>x᱕_f9_9p&G7hc>1 L&6K֭ޕɬM #V˧ 56!0HU\̙ 3@v\.lCd)o"h[!g$v20NiV[gte?N#c\~#H&BgjJʦT JG'L 5 0oP%5wOoDǷFŋ~Blo|o?U>m/9CKXy:/={}VC O0&lMp@ሑ^} 4Q$eAyB} U?mo6sK=n\=qY5 xPX~@KVp^s^`h"t@a%:[3kQ<~nl7>`whnn~ 0L_ǘʍ\k,|bS0 Z=AóNoOn~F^ޡxc##߰Z{:7ִv}d[ݠDtw0,P֬"౽qws<_DY Ho|o?U>m/AV nf]t VAhCA,!c40n`0B*7sQ1LXN/ iz}>Z:ٝ>(3ވ3Q? 4Suә7ۿby{+wPEaDaE%Ne1jf1G`whnn~,mO"A{q.Ctv:=퍇}{':_%{mo|oX㍏d_._:%>^m/t`6afnP瑫cPؗaR҂f&sAd$k鑫5i[EfsD/Ǝ Q}"Wy\ނTwUd|lmၟΒ  '~3=Y}؈'&!j (Fs!8#~eP x#`:d4xN~@O3n ;=2~$kb6eNYMfa訋 SNyjOu8y%p27_۾Ac w T{\0ٺct$NT lv8pǐ޷Þ\_}b;V[~ =Q]mVS`PlQCjNq/3 v>0[KH>x}w{lݗ řUe# M^7 E(7 =_c:P ԜF ),Rt0ei%f7N~@<^m\ϻM7eUV5xPD2k]Q*zK"ܯ @1,_ja/\e XcB~zvi{WT5Kq" i ,T-+hPc", Ntۭ1FPân)ۗV 66 j7JUwJ|ce֘ 2#}GQ}=p+^ف|,^QZjVubGm jOo4P~̭!/%}CswnaEے%ulPT_`@W٠Gwv;tAH7`Ni}#Z 6jD;>+:CmcOpI'da;grيJ_F#~&Wc|}@w";:|.'jUB8yrvYb 4L.&Cٜ -4nbat5x|ي^? 5ݱ0q{l,|K -4po^I$ ZNtq:dq@5^e@4` l\r@V7kG퀽P;vA7(`};5+:CmcOp J+a%`^y0ݸUG ; h_C._3QSLJWj։dO[!5>Z/) 6^`xj!l}:`*f+։*@hفC{KN:UĮ3IѺ`g p}D'[Kr|izZl`C u,j|u;s@^cYC QҺq^m|'/@*1ϡSAHe9ҚT*TN`OV8;6! yat(b_ I{niu#Ϩn+k_~_^ɎiwhEhDTGft=ѽ!E0 ]=v 0h2-i)\kAEBZ8>7({ҭ-Np~46#0sߌxfe99[EC(/pj+ CmCI ]{ u] M޹T*KGzhʳ]TI+2Zz@kCSc^瘨BXoI4 yH{L VTjhePAbKNV^Aһ /]D/e_'*]I̶p Jwcܗw-sߺ^\2&װ'ǝ佯s9 훙i28U6ZmQ0vfNV2c{`њr j~'bCPI6)gz =ް0ynx1:bB%~vhE8W1'Ozl|ߌZ@fZ뾙n{_ݻtiZ#[psЅ1/NrM7`[70mNX lkzὛ̓%R@ϊF90CA3FmF[aܨ(IdJ>!Kyݩ^34z/+ſ=Q,w@9ի +)TN)F⅍NjFJK`]$|j⊑"R%ğ7\ GK^'6SC(63S{f!~핦ܪ-\Ӌ-Vϓ J T/&]d}5g?pNL#l/w>-8Βx+P;pj ShV=ZVUgRRZԹ0og9$_YqYjhXAGXJ 肟?QNx#BBtO a\W`X=C8d0_&K^NּŋwdHx|;7Jo'+(rG,/voB߽u}SgQ=bAT< 䒱P+RC֭1`"%x#@THn}T5c\SU'E}x *>oxɞ/"ѧoeSޛC%pTs=ךlWN=. >ox܏̂;W|Nڠ8q/BRڭ3߀)U%NhEcnT́Xa^a(06 F>oD␾"veY{H#'ސ/G sǍR]F{Bw^)ܿQ ?4oy47ɱӼzBs_9$G!/#3c\l7B^Ux/qLrfFO6ÎfN}Y{ӳHVd܍ ]7jV9>n5 G|o&*xoTHfm:baTq}(1N@xOq2RBf"bj_ & eSX6n$oYМ}o4i^in<Ӽx|Y%M'~A&/ ˹3 DR;}ah!d4H9HpyK?̪O6f9md3+RvΛUHQ;_XguH;CWpX*e`B97l)+L%̟>>^V=26ϪH3ڡU%):u4;֬;읨37?OV'7 -zxfpJzegHOى3}{@T'%oPFiQtz2םcܩ>s# 7+';G$$敂\nҀ +p; 1Z-+Kc~ƌfkXWw6$jO{^ouB %OΪ~% yphfŢJVFRHĞpؠe= 4Z⨸%tTQZ 1 ZWbDv@֪b+WeiOk$܉!0^0 1(.5z֒vV7G;~˗vlF.m5]@2:rin1Z҇blP]0 7 O1:֌|a 阶}8`Frr~i3Qnh#`h'зkW/ ;h]hsNg$42ހyfK$ds jw@a=6x^x X`(6ܫu%3r 4wmE/Kёzr(\̂7G6B|q> |h oH?ƚ6m C #!Z=}:`eܘu?yrgm+:Am 1 mN^< '>\hR\i S z}L'deȔL[d*VX/_m;ꕊMf/@԰^k~6(`' 3.P%!k7"V!o΀wm9j;'ر zo}񎣗aF:7gFF.brD|1\誆˅eȠ1Cl,,ˑX 691"~?3@mnwCH۸tn\ҺwaO7W!_#$u)juES56(FgL h|9M_ L76 =yL QW1Uݞ~?AiEƗC /tb^lJb^u=GPA %Hb/@ F_5|"iyt} z xʰYE u:*ֈytSꍘ jl#W3p Jy47\ݠWr;%H\οRxg!OoT|վqnTKNW^Kܺ;c90/71'jȌ6Nf T[} {_f/j('{p{j }f?ڐ[Zq7f}@1!y{t>N(G?.lK.639o=hfbXDi'z!oBr@˫q?_Z $/-('_ nXjJWt#џJbO7荮ϡgvv}zWzApWN@5w`Л49nk=!x<7Xv!?[y*QCG:;WP]R>~K{7OG*Ov‰NNoKSE 7tZig ΜrI8>F܇T^sj=L ι9.zZC-eNPdɛӠGb#{T 6S 6K\`xk2M+˜gDgI=,j=gtzFuoTc=Q3ՃTgodyְGj^ma:V_$ t~Փ!^m/|̌k贙ɫ׾|F:grLV[Aפb ;!v0k=j́R]qq&yL_XS'4|:*mA/}$ye*$3>slRTcHP^) ;[qnO4ڐ>8[ :L}{Khe"17(,._yH^5v;jΎZEvR%j᝽ gvϘmSڟ.{ݗ|\4;r#T< sQlA9#xKseO1k>m>"Q~ԥ$wΰX8zcl ^rWRE(CM+QԎÀRb$vԲe %ȍXg; |_I9ahpgqݘ;/7$G $UN [+ǭ3Jz(m+bc=u-ud03 VqG_;V>HCcwfqCņO}s1Ȍ9ՋJFq镴0y-YP]ȼ{?0>˚ gΰcbubbcO \kzB 9-=J`Dv4F_C:W;jKڇz˺idܲiXtfO&Y igL%haŅ@5ƀ’ c|!Rb=g-|c ~^rQf7HS%`з tL.[/@.~y"뼭.p][R#&iSDDwl;\ȣ@9#۴&s}έ_Pr*`D6fhd[sG0z{}}zղ/=^zxfyİjlͺlViaFQX6U>Ͽd4K]j#Tɯ3TsWyyIIm4VP TãVų̽ɠL<0]S/~ sqǬd.k`*݋aO,3(^0rZwp.DFr4;psFOb_1NP\yx;;!5$OJrL_rOko$OI ys"9%m'jgNArɟ0hW]ڇq+T4fC2~빧:({^x2{ǥJ:˘[צҷ䃭\ȿVon렜'ǥƀዌHX~0Ǫ&д2%w ᷺Lnv {$rF&c1fڗUԘVee5&OѴaTR)e>: )*Vz7֜kؚ`* /ƿ)?a ba. iN=ů ^ȗ%_EA$ Qs'{.RΜ޽(ֻ;?!{N ٳ;ݍWNdod3٫;ɵ_S=F!=SiB7svәwRP_Zx Ä޺qw 0 ҳJq v<)E b_:MJP0(tIE@"hU8&Z=V)5B4DWр0`*F2*$tvjgl3Єf!ꢁ0U(C*/Q]36Tk}N} M0 :_pP;F~FQ =*`6fMٽo>DY"JcؙƅFұithHn0!7jξ6`}LpҮ Qh tڍ jbA`) !x [u<2: xA aȟ3+VMa|a200_ C%kQFzBjIyB+~t|<ESP4$8)d~ kAoHy!h{76_7Sgn`=f@z Rr[f0*}œ̋Pg*ޔWp IWW`]qP)|zۂޟ.;~JKoEGoNdr8O%vt=n Xb'Dcok%6 \_A4T5h6YQ+n*5&D7Bkx1Ô _zʹn(!Bѩ ^::).NƮ8zZz^·N"I0sNa~_Ahz Ek[ 5: /Щc*sw:§KK4]=FƥLjpT}R#pHZ pnz]>$~ B&\8}Pt=cԒu663dڎԂiDy%4jR8/ɦ/<vxQݚv`11aT6U<ƤjV{p8iײ]6B V٤lgjŪNd٧<20XqzH-=x@9cd :ߊ>=:|@[>˔3oibZj?M\<AZz; %q4G c; x`gzGzG`SҗɩyޠPUG"t/:0 G3p4SG ]ka6L;G3L}l[g4x +f)yIiWJ^;!@~;J6WXk}BٖS?GFK#zZIʼeH%`2‰Ty᠗!: Ôy [ÅbmBJ95\77\ ?GܞlfT>m^趕[ls3`Ƹ_=o%U"{X[*m<ÓGMTZM. G{2–͏bLV>%z?+xt'M|@<7%ȯؤ$i0x+qr%F _N4 s4f:;gEo|һyF>Pı[&.?ޥ ;kwOl;`,}Bj.PĔjԓiVfWa[_¿8`[fuJG1hv魯V 6*8>T2LoRjiHPd7Jʕd-SNmQ/ދVAA|{BGn_Qz1o 9 Sx=O|nܨ-tXuc&&[̠cxe̕Pܰގ-CFwhd&(ִFOI e 5yTYy V·*Ic/An#[ WJ#)nM-[Vz[¼ÏMmN04]q;AK7"H>};`u'>q³Ϝ`ǂ6 1S/d>! W^od1λTZOH꼓V||L2`5!8>zƐbSmnpX}.C9퀽PԓѲ?#dkjz+:A}lp Lwu  9c LO}k7 .B.Н\uZQOhyaZׅ\;vDxu2hѢg]b4ކRA Vǭl8{hǗC /H옗>/w쳹054:/d_sg@jX6ԾϿd÷.'z}SК3[x6j/ҨUz0"=CJ4=/mM3[㜩Bֳlx8(Aj; J Y⩰kM>z*;N[{*ol/1-dvOpF5Pw(ɺa5sߡ V[V\)PJn{ZcbZch@=zO!lRuš\z MĀ&__q5k~Bl? ^>ٞP[W}:2k TL:${.O޺|{O^dzRk )e nNjSUYkMǧSޗpxotX;7#Rl):|e4?6szw(>eMOuX!,ޫp5MKp RCE,)ߊzYm˩隨N@@c8Tߪ2)b% S@BA[V抉vceyQK,/o1O'F'@bᘛW{=[Jt2d+"yw ܜ;/O.d>,Bf5_}'dE}d>d_Nv]ȾdFBY}zF:D> DRS=-*N/z={Du㣆<&qB79QU*\] :W 嵯`KGGi{fV?ً\4h*UI1YUkW}+,EUJcFoWݨ~۷j(mңW{nf29Je⩴dZw ZU'$\O-Չ=A~ŮxSfQaFj F3QwjV/<&/y_MrnF6VNsobxTyBArJsfu7Nt3[qoDϝzrL Kd?Qx]KcjBQڽ Ybv(%y2bISmY⷗kٛlȗN*I 8K^R20pP udmT@S GP"7DZ 7Uf4lFr٩\HI PmjYauDægd\GҜ%!cR  ڡr&"3}i؀0U djPTln Ptftdo[Mۊ^Aķܚ\рoOv45 _U.F#b+j?+[<,NJ| Psޜģd2;wh_-^8hR8IaE/FsJk# Kg:E;.",'#.gKP [[kz/a|S%MTުL-~ww&CJpݩ%m9PlԲ7jQ˾;ҸR[{P)4hؽ5Q4RQf3 |e_'S}+5 Kǻ, r2ir2"oM"IqtYul&+oձrnavit-0.5.0+dfsg.1/navit/xpm/country_PY.svgz000066400000000000000000000554511264204753600207110ustar00rootroot00000000000000((zHcountry_PY.svg][o[G~ϯ*/tW k#v,%@@G'2)o~CQ؛ a!t^]]]_uuٟ߽闫b~~D;b:_??)Gz<h8Ųl}5EnOGW۷oUvӣoF''(zsh4Btr>]^wtr_zuJeeۿjqZl2ι^ow-k&: rw'[E]Esiw9?-ٻvFS[o<@j2;Jݼ_!V5C{nf;m;\#'Lr6rO]_}Z}_lv9ߕh\Ga_ޫ%^s7P׳r-Ag7b|ݿuX@:94;(ND.vwģ֤ҥ՞z1]6e/zߡpuz0Þs_N^ϤJ#Gz_&|&=yx=͏z<s-މbVT7;:r|7LXfND =bol^^C["| gW[u+{FqS<;]Fbt/Og[zG2O!a3Vݘtyyqq1nZ-dqX}[^"ѷChSiGSM]\\|gɛհ:Z0Gk+ s6F#7݄j^]-^.^nz1F>,IRJOޝE:̃{]8&ͧ' ʛya0bpNZHz5=].͓~1_/wK*^/bZc,w_ϱ?rǾ8SavvhwiQrzbf37ᄑW-uֿB\f0wkݚ|t';>ilqklظ@F4IO>턻9.sQ?|,)ϐZ;|cjhuwq}7ҟ7"3 xĻ:%%;R},EnGi{S*~k۔ޟ]c٦5A>L6ퟋ @q=@WWrlT6 ob(xVcf*;RcϮ+/]. 3ﱚb>tB->.QPdb1Hb`)SYv"t(THCX*hۅ*FP}kD(a@%iw^|4/HGA P6; 9JFhJ R꼧"@g`8R)ŀI5 cDZ ZŨr8wT0)Ru"=R,AkHSםaxX h2 +m]A$B{)-k1x.8sbL!oǜX2E;'VfoZ%S=*K|(X 5ݚC`׌Xj!0 oզѦÖSb ǟG>U|WbRɒZ䃺72%FIVDдA(Z<%Ѫأ}K0iTЛ*Jd{ خY(dSӑ, JumD+XX&Zl"zDDkr1nC&Z>0fadtE`jKz}VRE_J?[߅a;ۗOH2NАHQ:%2* %)Uآ+t5+!„ `MzAB\o* % j^/abqQv$@^AT},J Ss4Sf GRbV8Ȏ*W.ڬwH1C/hYkTa3EW;|tUڀKAG^ъ H>H(5>t<>暃2_mŋ/ŧdIмx)* Wwa5x7| UVҠk;9RS-(sf8&F8~'N*"#u`4̑6. ?.j̥A!~;Sw3ifZ%\ybȏq\->!4/)bUY,BFX*pA\s54Ūhhr@{-zJ+``UH'!cCq%a)DQ]K^E?%̕3".`2Ci Zւ0ڧh-؛rۆ` s %>%37^Ȕa'ݹil^Hs]sal/A(ZŹ$Z0s-\+@hj;:jլDHڧhs `+p5N$aB)g2jIJO/o0A*Zσbs+q:(ɋ@0B-L3RHx~1T- z, qHf fׄ\;!@~*䕦dg5,0{)Ԑ3'n$XZǥnSC@LtmpZo[ˀF*m/(]#hą=c ܱu"빷9>ѻ`Xb<):R R=;pHiըs`7z,%Jh<^b(x{@mV8n@xu̎BҌH@hayŚ8oNnDl꒹E ~bsgxԸjY6>Ne@Ƿ17S\#,!ៃ jQr~bvb9 1pŏ4Mf SB_X6P!n6gahګhd%WT#&p0+9; DUb^Eha%z7䋡cg@o^_E !`}:z28&1Ĕ`nLA)X鋺O_(=+O v j*ZkШ&s O]CPJEV8E=M5@SR ޵$]Xv_=9-F,9rýx p\V3\OWZr,2f:eoԵ$o6z:.cw̋ܩNrQA"vzhp8z ;]M<1蜷_TCa6C@ēZ?% e1uZՂ*|TޞCߐ5 FEl1Ň"O(cȋ~9 APZooAEB :IB0y{c oUX.2$WlаBm.oM{sP`b;AITjfp)z&B48?1{kP^A;e¢]r3ycOAQ֐,ګh=h(/lS]\frJ~;Jڣ\'H$C{|ᲇDs{s$6 cpy<Uq8vC'OδCSፇzT3ܫh?0/\Ez/Iyfg!2,qyYϔ$*B8Lڃ[4;kƩMkpII w ꋼy( 5*7F+P<M#<Ԭ J˖lEyN[,w*F7Xݾ bp)g+UprG0R/೸F7 ӥy{[)+vG>塽W$@j>Ena$o\5 AuXv#}`p@s%'y,W&| ۨd^5I^mf+_lBѤX" ;%3_{߶+Kr\ %3##/ D a}cL<#9*3bz7 !2b}l/:vayzcW8XM+)cpJ~J4֯ς͞5 /mP?{UgB1bT>V ~vhILe)gOi`(zz/pާgpHӚ,wg(vV7 eUtտ=cE@D&8\hJ4s!T"1n]õ59cl X֜m iq{9HaZx9W/INjE aVecG7}"x8l*\˂*﯇zX1x>F~جpBLik S>yzݓk]8I/~ˀ%H`|\E^cDb^9 ^ѝhwa'/\`N^EiBL"u4O/_?0U R|~P1 1>&\#dd91"D5 `}~bVxoXFԉtk~[r߿?ct; {CM8gd|7&UúZ=VPϢXkWYsk0`Uuڽ;zk`PDπ ^!627U}TPQT*+pk։x9{Ө`ӽ|\5~Tkl}K"!Q+{?i$VӽwkO|\QSSl-X/Rx!b`7_7y}MB$+ !v֠Yog§.H`2ОLyL7!=IYdlZ]+a#LoƼ;;p0 4"/ 휶$Ƽ6L72[ζΓ㍸/Ն0s# cZ׀k&iS25K9ԑ|mGּ8<^¨(I;S BC,qUG d? jD]85 aYe^?f4̦xNfpW`B٘:8dds[O#6*͏]P :D[M*LQ.b~lϰJ& {<6ܾ>6T+x ib/v_ #S[ֶXh,~#܁ƉX@c?<볯mZm+ /u?~@>18$-*Z-d 80ԋcq6όY_疦2k+Q?aKF& `}5Ojis8C]>@+xW5DC5ImLT3+ 18bkbmZ wJ/1 's`e}Bqna'T T z!,xi@4lbUm}1Ce` ;qpaNɁŲA`eypBt]R 4 j+;ghq{\_U FWf yM=V}"){XZ=rjW"TN2X$&Jۇ] n/Ypm& tFL2U\a4kpXqQdS`rJP_\TCcmTH$::+,kM#0!AHLrIݤvlΛcD5ٮa2郯;a[ҝOs(Nu)8 *J!aRIRP<&ѹk_WBפ2bͦʑ"ߎť aVVΩ0f` v pˮM Y*Piv<>S=$`e8VvBk,GRG6g'C7wnY4Ql_}y^%d@"WS&j8SN0Zw?v᱒oL=c~]o^E|Ka=xu)ԧPZ$&4Av|8U+>4ؽZ#cZHc"/Z_ov@i7[r3AE%G֮}uV /r/9/ˑB0Էkkiiש$}dDSnko+k&{~uſΊ1u^7;)xpv![X&`HaarDnY-%5 Љw_lۂx;T2VmGaLTے2|}}omGLBN!):b Du"Jc4D '~?O7<<&s.Ae&Vy8~ȏw&e{8k#hZ0Ȗ kx% EC?S +}bTGݍUFO4PKA,߱T])MBŊ k>u[HЗ0*6e%ש in:|"Ϻ>$/P? ,DB_|Âװڂ(,8VVKTY5P8 V ތݍ+ ^ VPYP;楞.K*Lˆ [/Tn3;ߧ^/C! BQ8qJ ضjC:+?>(w<a&Utyu^kR¥YiQIn޷Mب2b>nCfq.V@m2^`~J-U{Zokg"j]i!q0:@7hH3(spN^vW0a~cuTѺrm`tr"ػɶ!Kו79-`b.3,tB <\-sP76 $iq,&ˆn ]xm%2 m`T-ĀxO YEzX'd1o4qBTH=Lp]]|^_ݘ5 K* oim8Jufy^AI_GRM'\-Opfظ,Snc"i/cXG`eёϧ 7o!sWm!! Y һD~6@~/bV9ܾڇd54|eJhoXc5lVGiÏ+`K/&RM13reЀ=(l6̱q~ LA,u*d:IPR1lLx8 Iأ3ݻد%#LAunuȺoE_o;=;؃z8a}"ğ]~?q `9^lQ'v&?UqO^vo~{#__1yC02=8ȏ!0Q֕&0 `̮ R2*gu\ijuybuKUQ!,{nRVb]>w_+J7n-*̜$BGw`,߯)t֑uRhlT!i$JC^'uҼ !3AcN;T"fqaCt#"!Y{hF2H:v± vu*O|L̠Xؤ0#ʞek.xJrT=]iܓQؙV(1a@,8ϿÊ{{ W^X͖n*PM0JڄiNccoYQ{6a,-])J[gJ`ȵ &v 8O]>a QZUԅ4_Ͼnx~MhHquf'%|&U@(]4?>r٪Qam$gHON߇~zϷ^S=?撇 6h_ud%M> }nNt`'HTM^2N;ΦS):T1o4'*c;M@ X<%T<%~{AC1\0U~ߥ^6oh'[PMu VbahVqҚpi1-A[` tbDMmHYMJ;vcsXՎ5wF]hbYR?*X9 `e;,x"LD7C5!7e4h௱pj -"΅UX!^)9%KIdqb /*4?> šEJy֫dD"f/?u#>FX^r@n-p(WDQO 2ÎZ9C~xQV*ۉ\yE(&\E &`jD[QO@CMC3}":^",oQ9VܿYb<3娧~9烢;SBɊ!/~{KTGtB<=.FV(wW] xBb1Yjޛ<}Q/.~Z5,eHBࠞj0# }2$I#LܮL&qb1؈4+k4%n &E/.v }=ez ?FGJ5,GcBv>Vɋ6JnaV'{qS=5ia*xB:j LSR@w˞Iѓ ]E^mQ\x" 0‚GgC; 5% ^S :cdZkF:tjy\4 kӯb^6m>&lRY}6EJӞdĚ1& Lm3# i4͍V{~u"Xa5={kqM U;7KB FŲshV,cAM.rGN&Cˍ}ZIV+cq 5G:PENԡbGl<'Ryi*ABA ?u0 X& nUDCkfjwZv-M:kQKsy"#Z6ڞ^?W%B H#峆e${+ާD ]:%~ M'V_މޯhtvYUv;M%v1s( >u"V^VptHh'&e!maٝP2TFcT|\] >^%C9%,4Wa>W2˚*"̤nbM^*yf Z "V>Vs¢/1ՆHMI GQl끫R6\oGW_-EfI+190t~'(͒=XZCX?p R#9h#4ӯ˽߂^].3ض6pgɜ Y`ωE[be ,-hs@t_-Rbƙ]wFtfA%!jv6\bGc XPDr{W+Bp}O}[]6NP+pga#rcW«K5ii-j Bc\h+nߍ卐s2@D;FZg 7#JоՄlw7*clF+NzC:h.,c a QQ7')&@ve-?OyT kG_w-f JQcBN:?/La%ƵtUܨ: o ~QmfJi<&1*'1FOK3c*C S ,#w %T ? ׆uQbI,N!m [@r޳Q4u 5{RU’ #֕'ʭ- &!_-+ƋlG&a!͓QY$c8 37a4Nvc|,h]CxmڈD`aI彊YʪvڋnL^ [RqI(DIaKaekP>: KIg_7z}?9 'xkguI齳Ĩ+0ƣǤDۯ34$`M}9~ŋl]UY~R $”Z PNaoKEa@僚'@W{*dNe|>TJW?uK+`MMqdu b24iq~m[D-^%XE&#̩1Hh2#I(Tc]GZ;qszrX03hb"HurȀ.̊G0UQB1X'8dDۮ//<$r&|A t6uB)>l{43h FJLts}uwM=ou` ?+fms*lc:C6ql)꒝ ́ 8'kj :GXF@`d"jC~w1OLb6`9T6ՃV@eg"`٧FvgC#b篾sn)q4^(afQyb3x(\}[Bxhha!TRd_ܿ+l'C|`I@GDEC7Xi=W$тmtEc攴p9J\RD1U_LWUL mu??]Q&*GE}c[6&?#2#24P#zz9h.<CHzGū8nzI8,T5 1u)Mt5™ )8{N,`H9J㘟)k0r,\ɀv杨,L'6YaטKm@ g_7idFLfu+5`im09$&n1 f,FM[6l2(3yJlrUQ`! g,tf \Hc?k6$!rk[rXo9?2tgЀډ[='b| 9Z-l"+lD/*Kr!-1X!4-TB=s>9\9}}6c"$DAy q ̫v3M7-g5o/m  aJݵcQ`+k;x-}~mſ 4vdNFp VaT@\JC \`&Y$aLjmrp%"uN0h2t?u[o1w_Ғ5Ԁ h!1s՚F9zcG<'w>?8T/fe*|٭Ѥ@M6Xs7pv\#Δ\ln,qqF /t 0196j TawOV]>ڷ*}_a&%{ aUNU!ԂBťA{9 wӈkWqBi: ~_|g—ũX8ςވs`faL9q*ps;2&Ć $"*XS|RtVʊ8&*s*.n 7Hf `b`1!6׾~u쳯WDcSF)*SS$|!dwiia7UW3l]@~{~mſ na-|/pytmA{Г*87 uշ`! h6P;;%BE_]Sa1c\9;a8>LP .VrVn=ƾU IU WSRL5/YL޷1kzAuÅ$>ň HL襺_׻}.l&=ދ՗4u9͝i1VD, Oѹ{/k]ߢEHXծ AN]%0Hez;٣]o cj̞К'$zCE:_#LQȣ.(ka4A_RQgG=3ҹK dkr?) 92NKq SLJ>dg{JS&A16 \'_1:{PJQHrгH0ـ|>dh6'Yf9ؙ^;=*cR/FNG13kOJKGvփ`h~eD^QL|)kF,#( 1V%@ –CUnL u5՟ !`)0 /㨿^P3Yδ{ZZ9L=/% cqܿZ9l$>$\8C~%?V AL" rgBi&C? 6ǏW;̝}fTi*+M)T qp׻~=4\\1 w1=+Vˮ4-n+(ClbF5S}KA5V9 H(r!OM~%UQLѺ0dUC0RQck}_t,T+ujaRYԨ[Q,ղJ">߆`3"{bMlb2 []a;4,0mWd% q8ެ|FUKKE&Fr&b[R>#2y7bMfuͮP9;q+% XmLͭs.1JiBAͰo{ 7VY}j4'*3ܒFul IΊ[#YGas |gY?ؤU}Dȳ̿ Z dbYzWaˆʙ^ B)vmrn+k? A.}"e O31fZbAqXs_h!Lvoc?ks}:5 [^Zqp1h#[{$z߳kqr&)T5rj؋Di-~MƓCӯa__m W׿l0'8V?z_PkxkV?y{ 4u&6 :':mXM*lCȑ_գ6:~A1|,a40/b|YI37ZW/&x\; W?B_WBŗB[?x`?,_]0_?\[__~~_z> 5Cvѻ}iHb [⩥mU?VzQ;f݆nƉ =\Wmah44pdg̺zc^%Y{ސ3B>Еr-"NJb4^u-POOV=  0E`p|sCsԷԄ4S(igSrZTuKG0'{ѿ2Ⱦ2TmY cP*vS ZHؤh5o"eZ6F;IChV@ /f4\:I!C4$MS? mӥvV|ɑJP㱨5?/ >,0^isJlT2 UҪImhɆDun02^&zKur{h)} rbkOR/7Ӱ9ΘBu4nneqwC ;$یO ]ah2+ֽ)j9la aŝ4 zfGbjp- @^uT0 A3uw#dDu~`{%[]}]0a}_8Q9~"B@6nU#•i\[|&.!,UriXn9(}=,ڐ԰0X! d $I!QP0>xlO( k 58bZSsfA [aaJ*FgjgUǓgH|V$4;Df KW+W(Chj`#6rhcy&c ԗ 䠽狴UI+XUߝ1C<}Bkc])2$fY._C'< M>-sJs!ʊ_Pk99BuAC!D Spx`_|CxdBB V8@KrM%S6TF{2(HjM'(vSqn>CcMWd?H"yۦ /B*̸ ojm5ъ1o«M1r`C( 𞫷2IɹVe !;6ΨM e騀p \d`UU҆| =Tc+3KqAØI'+ˁ-[™€ x,~hF 7 GT( ,6D2 ml qR:юp7jDXQkM@fjRe50#u%8nzAdhew+_1mÀ]9֧ϥhEZp.J^fJ̥#4 CAFC^9ŏ j(H FZˢڣ [^BNċ#F"&Z x*:ݦy7kê;i%lY@W0nb{j"jJ< 2NjrP]&|OvO܊6DFf>~D0qFòCet.Ӂ Y6XÆ} LE3T֥a(os0Ul:Ж 'Y }Dx"3Lz, I ZrY[ q"wd?{EC%5â-X;>VVYr8a*"OPmC*IDD3{ ܌< '?.O(ݻfYҐ`K?B(mѯʴjcš ҙ aVUabAfػڍ]yR1*lYyИ5zˋ=ɛ ׉D۝4@B=O5\E?t gSaNDKن+eeo*$.仡@d ;;i =Tff0llgNv?ׁCAoLTҰ"f7NL$_y`1m ס`bz[,L+ ش@`NlA*H) &1HsNd”:'+LgڹW3n dvC!@ ̕z~<;-"J[8ٰ&8DP2€"5_4 c8aАhY)F٭ Rh#?Y;< lhd#d AlqH}rcF1La6zЭ2؋c?ncvPF<lmB2qTcCZAHu%pd؞y ˵k` !LK0! 9 a:|NŎP$ԼTˆoễvR~:ójtv՗P17;X-MѦQUA*k Tj"vC+Y77JvDu$SSš+QkkVW[Xt1A\X;KFADBhQE90YDzhG飔B!d4UY0j5Uɘ*3dXԻ7M0{` ^,mKZpѩN&,>[;"045vbwSh Hkui|֌KđIJme|뒿XgxЪ뼡X¥C*]hUpSbf9Fc w@/o5 EUa|BsMwfb ~~_z2 E`6-$NX OW@9,i@Qjdy 59EywD\S=O0cY@*uk8-A\xi0ff%5G'>Jز8vvdȹ^t2h2!,X ZjVZN|_1qj'*:R }̷55ц"=Ub髳UyY4KC؟B{E^h0hc+ݑai^;fV_joﬦ @+cSgUui&,a8]AqE%j4b]I$<i;l9)Zv3舀63:%!CdQc)Sߦis !& el.V(:ʛqtXhթ i7H #܊  KPcve]S4]:B$b2];D{m@(>|$(GogOWgѦr2b;1 3 䡂^[HE?ɐbyq ۆx6HݎdmZ`%Khdn~}%>sЎZl㤊d8;RA} XX-R)!+=+"rr8_dES?<HjAl.s2Or gKtQ87n[% uP,*=U~j.3܈^عY?Qed_7Zx+Z&++*!<` q!* Lb/2]k^W8tƄ,LJix2`a5BE^hӎ752SJ4I˫}K3`Vd[>{DEBc2q=V,T '5K4Nt\/~#̅)r=K'$B;F[gHF?Bbs)M Ǥ{Rͬvp ˑkBSB*P*qZp,pԐaD(hBtL IA}iUIBBƆ_*1N0qN@&q`TXEַ@Լ,;WìbyKgiA^=k\!0_9PqS^|zH'*a֕8@BLԤ1vRrIJヷ,c8MIA]< e5YA>'i[׌X<ٌliJw{>,]eԓhrEâp8 y#E,] `9FD/:Ђs7GIDߜ^J ܛme E9n[BiʐU^,Vt!rdzmŬ^=8A $cDs"[& f]$ -`'mO(mvj{Y0.:h哕U 4a?k|g ݭ?zq!&*Jn-̓U5^ -P 4,)s:ʾo9~(qsWy)x?0*l'h}&l/9(ˏ. FmAK'!;)ݐ&N ;P(l2ˌ %͞ Tz T {h֩,iݱҪR^݄Ґ"6$B.}pU*Zp?I'ɗVຘt1p-G++h<'-xu5u>{5\dg[\HÇ0A]c_cP2a  RY6iwҴ iҸ &s r`vC ea?&A{DcTRa@{0c\IaҔnavit-0.5.0+dfsg.1/navit/xpm/country_RE.svgz000066400000000000000000000004211264204753600206520ustar00rootroot00000000000000+(zHcountry_RE.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_RO.svgz000066400000000000000000000003351264204753600206700ustar00rootroot00000000000000+(zHcountry_RO.svg 0 ߡkvX< նP[Yoo7BM?_эNYÀ&7'[)#xXX-b %8%8@P &XK 2B[ 5 bwJ|DHBtHR:fGi/4=navit-0.5.0+dfsg.1/navit/xpm/country_RS.svgz000066400000000000000000001667531264204753600207150ustar00rootroot000000000000001(zHcountry_RS.svgۯ,Oz%=[RqFCͰ"0lv v{8ӆw""ΩM}.ݿ?o_m?}?~__oo_n?o_kmܶo~7/?7s7ٷ_ov x[8>l9_w?>⏿/9~/o|u3'#$O?,??2o6_׌[#xǿw?}}?o f\?^^݋_7_?_|$Z>xZt?np/&v[{^#G=QnpnǷ}WLJr?0nq;S_ax`H#sG=~=- v|[[w=}}{x:_{xko=v#||8^^/<=G>ߵ_=xo؅{ǥL/57 l77_k>|;?[t]=օ}:dyl{;':^_9vdw%nqf[^/ıyE*ph_ax+,ꉒKݏr锲?R;~"迪s.~wzŠ>6gmZpY3w׸Q}n8nF9a^n!=ݖ!tCCa[~g}~2x v~QN[c;m 2 V%F-loi02V@B|]y`a DQ';"V˳2 ︢;]8>[={V}*Δ㽄`:=SAEi&?=MK~OUyYXqq}f$c#s%Ngx776|ʞ fk3Gdfh -)_:w>>zaV\8 cXr˳77 m< Æ Qu;=Ry>llٖ_,wSE&9]/zDE,[9 ;&.d8~<߰+c5EGjZ}\VKjaG-wA?s35>U367,;m}SksD#>^[N l1QI25Ae5bT6 R'4nÞ.ۙWӒӠ#'e8}=SJ,@M̂ZfQ(07me;֭d'?Gs+u؄j#gL *"WMk8n>EC\3 ۠M)";Fn; k3ۚF)g8v7 -Z{[llׁG#a^ƘSݿ-(L |u-d藊nXP#'VYa8vR+ͨʫƕ6;ye46I 7(cp[8zNxzrq?6> qk vKMTe'a !20<7]9sH<#l ;5')xxcicĖvcl`hxdm5;6mƒQ6_["4" Fun͛f QoF;sm[3OƇģob;_aUE    L여~cx`tHc"Iw K`*hfu>b)&ۊvuj= g~xR\RH f8`4`0x F0Gs8kۻX%hzWEھyK6 `ߨ7\)8 "3fN_՝KȉMD>v.G$4"$*^mɦ(Xe?80Hdžq$'"ex(  5!(-ݙahv-X(0&^<z E1!vD[-.m/+!GfPTu+e?7&m\}@T|s{{ApZ`kfHGҘ)aʬݘ1,͗-$OtUs*63qC~U$* Il`n,!pjGI 3<FTO1U4 5.m䨬 H 0$mw-9 lB\Q㬙_L<, |*n!"D3Bc$NlHW6†FG?wVu[bC)t.T^=ʁ^#7>P@4Njڞҙ/ ~ODo'J@x`Vؼ;eRPĄ{mA x[_@ec:+4 ~o9QKzi@ӈ%6-80 <]1V c5G3e} $^8-iDkfs\8r=h|"?VفTÑiE =hf6_[TVuĆ;M+yxWF-; @ctQNΉ}@Z 9  ^[a*'~[6A Ь/Vٳ(4^]Tꃽ\4*|a̓$#q%JX}qS,t\ i\8_tg8 K7,zv!ҸN[1FmnHL}W3O`t&@J5[ܞ+'d _ {h" <7ۼ/iyE`N5=82#:Gkj_K5_ˏggU ٻԡ^jt9WXBUS%Ymc _^8`ep+C0_?1:|F n"b˺e0߶o#yNXGzp-XUY-C!:K9@oTjʛm¼_'l㇝G"Ǖ: ^-(_ogK0,i-xԵŶE*Xo Ecu8$sܛR_\O|YPl }KYxO4E!@ X 6 ѯ!U\⠽Ynr2NdjB &-HGNB weeO}N]Pۻ[?}nplh]ФfFv'Hg ھN5on8˹qP6ʥYq~9x9zyyp;8J3Nϟf+m FS|_zݶbŇ}a YOMIFi?m%ߎ'٠و3Ƒ=a8Jr%-뗢M\>OK"l 'JoYySu7GadQ,gŤ\EW-(4Oyqdz#[ߠOXNd@cJ3 3S\<3BBll `zy5!W^v_,ӌ'[d.fȼlQpxŒv#kd̪Ri^Ƀ2 L@ݼj|XmVP 697Γs gI"< >ExT}{x!ꠅT z ן]JEܮ+WY8}ir 6?6SD\s=+nWpj{ĮzeHc< oۢ4̵L-f!7l8{.=ܛ/חsXPޫں[lG0=OueҶ4KCIY3yOCAvP(^0vi:`GopG[;/Utb'N\J"?uinamyOAGO) ,ӛx}Mkh?4(&oD |d(XZVy!"JS?,4O};Ľɯou j-\ .-Y $ [euhM$v ډip  \.2F-*Q"5tڀi>fYx fͪӛyҋGB~"܆u^L;UvR~ 6.(/DJ9]n=+j@j9;ӧ.]ŵ,`#`{y1x@m*?^}5IPw|cZmTn. v8}3)<`@"IT 'YWtɒQn8yPY6@сp-{ƘA$uny-Ct~>aP/0̠*9]¯I ]d⪲<~:^4A7׸Q>jfu:^R|Ӳ|zX- `Ϣ+?b錏ox:6OG 4pIj gف$4l@g4jz4Ÿ WUWC 2tXG_so]$8b9_Q6pXUH5^ "+3 bflNLvImNt8tPڊOg$a*9#ڮM}%~VV˲u.=C=3Qpb.Nڋ(lʹY_ĉg%_  Aq^N]#$U^,~/F_ҵErmr/G_BNOJzx @qƼZa IiVUSks*E0Ηë*˿nŘ_\EG:3'je3Jj운ԗIX׳3 e$>x{aǺ>_XogK$sZVv]rPO~Z=]ϨY aQ rIPrg `(tak$Kf-b1ϳU95.ݓRkUfudtK8F,j ½q,h8$N#1C>@pɆ$_\[rZ1)4Wmc{$^7}|qHP-њ?x-N:4i͔)`b Ҿ@)$}eP~ئu$HxeIJDe -HP9.m?=K߯ːI'_Id- E0 Ҧ4@,璂}~V]p?]#3ޚf^ۑM8_y?^Ba1z^e6z5n떠/4n.>1 ܋&duJ#ya"SD3d͋#!8 }>a\)è+^<`@~ j@#IuL:RE E%}^Emj= s态ڧf`-Il|&CؿR%<.:N }v+ߚ1NַM ?لٗ@ -<[ N ܰͶBD?4?!sg8Bhg)2Ht]XUdJpj8(ulv4,)Q'v HE@}%c+!g; 2X9tZq1p9)G,aĠC+g,5eT S) V//"Q0K9wJ8~iT7A69aE!ZvL?ꟿМIYqѩ]`bI`8+NXE$#JڱfKM8E %>I:˪k67K R qReMt׭U$v(I$1H 1 `r.:XC&N /SjȽܽ2Ç@،RvطuL]|8O>М]JTKv-Zr.9dž0QJ/ n#i>!.)N:V\)EI (=O%g+@b`-tGmaQ(~oWRZ$uQZ;ciq0\YjoG]bSD`1,@C]l#m$v;һTNΌ :VfhRF(DK-V 7j߆0\xwƎIl\P,͠_IfPT[&L̡ nOh-ƉleV'!Q$T m ͥ`6|{keļ4hH€6-rOON,Zthf}s'R}DI"lճbnjة_ԮXtl]-]"-/YpiMYNi3LHW V뤻_(we8u M=ڳIw2JfGaWC]Ke#{s=:t8Tx 3 Dci!lTJMGtk ".;sP'Ȫ)ؕR]u]H;qތS/3)YQ ƀjLsʝ{AY>G@$L}c_7| ] 4boȊ:qjč)3M{ӅSN=ZقC&N9[nz{Pݷ{xSA¡oW=0Ge.( !hkwd B);gN,yU$vt "VU9hS-<?ZreFDj;Ig5ְɮM*M= V4I:I~1.-4v R<ʛ읣N^gas^^rXgB0{R"2D2ց{V(=&c8")F;, .iXd#("NǚgX/2ۄHNHCGmn:zx{ >ƹK6q._:Yp2ea%DNJv1q4o;I@w>f$]Nuqt8}t=-AP?_4*о 5r8ҼfGX[h.cXؖ%V]I*o;L;^cG7vRTyCхztJOCvtT%[/լX:%h|aƬ}5B:i Y}`ml=a{2=6a˻55&<ג->*1|/@M`{-ғU8Jj|Uk@ Ģj[]E;YA~E'&ӈMG.7vj%ÃMJ|SN 8߼^gC 8<-+U&V͚p50#kZ#wfͻA/Q5™v8|KAB՜xK1ԏK(%apwφC.܃hpFHWG.@֩f:IuڟTf#Hk͝ƱyI2HwU ̗^vus(Y] }2 0pbDDDm,of܃8[yF&680ۣX Su/pczgT_ց Cc7ycc%եfK# CFM}l=q{`ͮ &Y"ro+B:c8$DžN<X*i[sh&ʙwkkGKElm{@ڼ4<15tolq oeVҝ릨yt@ QjP.xXJVnsUhnhaQj|vv}!,ºѕwSVpPf/e5ݧ,>T=-F M 0stxti6kNrjorv;P+\")(Op3L6 vԣca8*s=T"(ֻ.EriHm:hneN=Zvн1ՉG#w3 (JX0$} ]1c=*y6aѮ/oom K0z,kǽ>V)%"$FAnQ34F{TX*̮ΊHbzϏ|mRܵ]m>k~k6 'xM3"18_Y\"'ޱJxEa-E{`sh.UH4a ] 8&X?oפҭVMw{m|^2["uMІruV4mk!+$,JT7m1+VEAC73# ݖ9\'m( JڥGaq? Q.&yČ].a@0ࠜpL([|^ ךF0:E|ja'zv9PwֻluU;U b`{;{ѪIh!r$j 'TEI8Mi= |0/?"?25R[(;e2fJv/jW TJ99腛0(h4Zξ,3DKm4wyF90 MIʋnKᚘ5`3^W=V'O/řO.+TsNNR3lg+mtVq2p3n3l.ìV/?v cD7ggFgg^f~6pN[E<&? Ţƭijm9mL[Wnh. awT0 |#IMC3 ہ<%bů a.(- C_y}~lOIz5ذ"1V_QBW2+!V??_XllY/.X5^?z0|OD b|WjH5ٖ};*y3;]ˈis $ 8Td|0ˬ^!~?HMdKAs)Q ybUVl^mF ǏT_ 9MT:v>׋lBA'~Qg>,HwD H1-He%0 A"4@ T|{D A$3}U]$WDyA;17L !2_l1>^=qVslQ5nƁÇxItrm#zQ|/D(F b'`J>sUV7ׇbQvü@;mRS%mH(6\Kfi+EpsH~ EǣRy<Q"<҇-]؄1cA :4Md:y$#ޠSt6<q*y:|||D T΋<^D +Y CCf`.IQm\c<NrxZ8,٧"pG"G%_s,L#o<4qfR DzLɻ^,B8\I/z1x3/SwE%8 yl!JMg悑O"Ǫt5~aUe347E4LquMN:+uTƓ?Aʌs 3,?Di}]>^GnC`HgC/!/i%rl~{3VQ@/ӊQʁ6)g7-;GX'Jupd ;G{M_.}lA UD9HT~Bq{?ޣHII"4=8IP jIamnꟼݖYWû yWu(2QD+$3JO$"ROxGP"|/*Ų[ %gfg*s ia 73Y e \&Ѥ184PkNn ܼOV[{j{p=.ep qi 3=qiT$2%VZ-\bP|Ev=* NnCIKOSE}ef=#>^D#VXajo\Y\&[X&18<6XmR1:NvHTTlPe& @B"ҏ㍞eڛ.(J-Fl期CX83li; k'σΌbmfoX}0`0(LN6i" {ݿÑ(v#=Jo(lrQUtg!~o~~FV<>ێwHjo>l 톚]6{hAlJn3-uk\S`F+'.{[;켿`#*7?e { [;L+ιW:O*m1[wɈG$G&c[ Q maSsOۖ6;]=ެ'lhTb;a:9,K33ԆV1(.z# 5Jnn@͐b&(?r#~/ϫG971\3Ʉ|F Vt{y~(l-6d؉A {?p+D;Ѥj"J$1,c0@#ҩ/:hv:I,6:FVeGB#kFȇ"sw$1vCfU"Y˕, Rrp H1MALfC_C .@@uMA [۽&7 ;70I9.7.W\LJJ&|# ݍPGo0͉6rXֿZu_ʠnWnWi[kF/͑炝g{, )ѐ:P_\ 2ΐK| Y=;{ /*h0㘱{|YC9|!4K\NE2쨃$J+ G!F G 3y}Qrb9d=&{}/x|@maʼnU*:օ+9_2]'O _"1jVeg9 (*E$Ҕ^pWRЇCzD,אHE@EK *!k|L/>*M)+g)C͍_lSծDu9ab_ZDL),cёrX~J^<:{mS&>z"Il uzNqhSWd3%*@@S2#oRDP"oCLur% 1pa ۋ"a+-jS"5n*[Xr6}N~;^Q&LwLфK7'$L@dQ &׀%l7nfUCЖe"ϠUu-.o!Ua>C?;-/^&sg$WCZJ,hl;%H I'*ѿx$D9*v}qhy 9wo m_ Jo@L&5SnrH1[%oڗomhro]'+:Po,QlSTdAV_fMY*ru#JR~`~7xЭ̌ذ-Crr|p("P6.vIť0aD*Hy9LX:` [tJ$)2gڲ"C a$;t2 \SIN6,q1 nҺM!.PuJ5 Qzpe6D|!." ǀEJ[`WvMUv3bŮ^nP.uEV::w\M\DMrȞN @6Odb/woΗNuP%k2YaY?ZYY$q.P\ػ VI`'Ma,$ ޟNc(e].DڔkXKHj"E1LNڔp΢i;&O9 {B+b0m+q! O@NbQwj]ig +%EW|p,'tz"eZMW8:P}/jjGу!M)/;q+톨X:YmQeM I/o=(eɛК7vh>IN6(B?Je-8>3 kawʶw_ƾpUЮPYSU7~{K:yo\MV<;"J.D~v &BoEklTqA1.- ƌ V/y>ʷE -h S P\ bF.d$r6Y"z]D$ȿH.^jS@̢c;ɋ=g|Dδ~VL]K&J0df m_tMGK=.ɢfSd*UCZ3\6A%J@LXHm[LC!rƣ Q>ye i%U!@EzzVǾSYც%;:78qetjڕxC^ ۳\X67/[m(l>8px]nr-fe=-32hM麴J!Ѫ9ʲ}K`AX7A;-UE6Zץ}jf!Zx,qAʰ|,g+Fs89/>[jQ.wKIk~wh?>ZC~Ô!^\zqx}Dꑐ(kj*"^(\aƀ$P4iIg;>!8-c N];,yëр!Zm.^2(?XŲ׵Vq^nL_?OKQt@ʫ> Dݰ\{;4>GD\Q`٤أڢClq=oMOzov_(-z$!TqF%#n3Zb/YQ?ƎAPԣe-_tpE5WLߎoL yHdQI+ΕNw#,GH;^q8#{~0LI6S]Zw 6 Gu Ó e,AB//6Hӥe&EF֙ựp/aeľJDNVEڧ1UMG $uB¿˔tq i3Dm!B" +N5 8 jSwmnvY_Zfɿ[cn zt Y٘K-lv- vؙ`tG1(Q]TT'nuG GMAК;vjo>`([jF _8 &|D/$WpR(llG!fAG1Gɐc$7L5%)aӘʈv5g헝 -FWu2 - W&|/$W*>+h !>սlIF GUج8x5b.+[AD-|yo"1 fgP,3)?M;4@Cz"ͲSzm'p$=!yY~$M3 X/ti+`c#XMo` =*4?b·1@"tW\6#ZrMBٚ޼ھAQyTC Jj\A k*~ve?o?hڵrw 8vM*j"lr(5+x&.2~%M,@c!OhH+tu3rC*R `&-iBxK'E<`B"\吅x60 HFfITfY*=O!Z?U|8C $¯[EUL2Ԅ:Ƹ0lj2-A N^m [wY4!F/.%8@ 9b) NM@]e"5"F/6~'ڠ"V 4)s];Բ Tg  5PL ʨ⎭u 5zO, Ai d>J2.QIpU'̻8! 4[.kk4m*<}@M Ye'qIivƤLi"LVn.:-H;]mӄx&"ߐ{ljJc@`.THXI!tcc K4E=:>q7qzREv0j:ٳ=h_bfà{зkWyU:ȊqG%pojD߇iVBҥ{JUbc !v{x"&BXw<@y D.x໧[bМ:%1"Eq3(;kv9$} 07?9rtV#R,9(4l=UZk۽v4є`!\JRK%ێI˘$wr,f~ GŢL2L:^Y~=3J}k<F\ a)8ҨpjsC$K씢`i0wIbAK6-e23ClxT9.͒t(CEp2Hhg>w;^W5`Mie7ki-XG}8#-iO̒>Poi4W9Vӎm,i)0Qw$(Z$sE~J8Sr7{t)YRdw"<iWs{/tFO9+Ft3ݡ}%Q9 jBBH\VZ",F#/-@Xȍ`;A҆c55TI:,I1'd:YkJJe(F(x_} 7鼿`*Gɠ }A<$!R"M+ `aR-hɀ$FB!gis+>h8ؔ <u8LG@'ANn>>F!钃ݻ)N$]:!*:fU(!2WR; ЈH@nݝ 'LyX@B;֕bu!%ݡC6gݦ&a ~ĨBo&Hmq6VállFv!N/%PRf) y#%tH ̚2iسu* ]jJW0{ 菔"tlbTqоv  S϶cƲeLjᆰxH`W.`808\gnÌ9RpG OՆ+2a9+Rd&,m2WdL5Y!SV?fPZEΑMIfMf5CMuw0J,&CpI kt&+Hf&B=a yC沝a؉# &h.X&+S0 \;74_5Uoe&G>M?7Hʎc'C.EXWxphë@v"%xUX4hDu^Dymӎ-]D6Gl"J{$fޡ'9y :j5]'KXƕƩۯ@iPB[޺r[ @@!iIlőVGXUO@$Mp\z_¥Ck%P*aroDKGNm)GIR"hMs\YBQudgOyc}jQYA 8k'7Ra ĔHzܧk/rR`.K-8/%A!rX|'#ޘ ڸjEҒ6 BXMVWCU} 3h 8`( s 4 F}#[ J.iFlh~[i &=Mk. v9YOҠ\W)4OJ{\ԩ=x#ye*6nŎwU wKEFQ4j$6ZK-uZ~VcdŚ`)Ev^D%cVZD..JRؼfq}6VT$x S46Dm]quRbw(XԙN22.m bPuI3\$/Tedr3VM[$=!p㢐6t.m`g4C@D#-bn6Bp9Zɻ#6ɮR+I{?`?$qҵ[97Nؒ(dyA0cބy5_^PNz -[] s{R_4x,qv2m͈ {+G+%c3&pXu1Eً(⨰D}k&N0v$Qj+')͵Dt4ٲBYǬEC Mv+AG[UA/$>Uߜr0@v5qX+Z" #"&NRrt" ȟ<9#C?ucXGDd;'4g4aH p4(_sOcӃ)YF ag"WUF8ݶ ̄֒Ŕo,wS>䐳FО$`oCFkPY%J9__[Ў<mID^H!ં1u&P')O*#bƎ-cI"i#05Q<pCy w@yF>p٩H،w .oT%U* ZKYó.+5e1RwyH!s=JHn!$[, @K4C# RtnG%W7 ױ$ *護67 ƄW&:d@)z%T @bWn!ꑬjEZ8 }蓻F(a~2E"-|OEXInFM& 򗩸퍼N݃L@@2 7p~+c\/s ʐPp]*p*Oh̬_D#XHဲrjzۦp|/607kBآAfd )H }Ca8r8A9wnjܧIF0{e@)hDZ84~t] =V~ ^w1 )Hu/ C>]$ 41pR!lviˤFp1l`j'Fnyf'2pcKT,<ץfGKԮƷr]/AaHԡ>Ik`Ln*a@9!ͷpҔQS/6S]}0P1kJ9q%8A#{H]5U$Y& !r[_M)k`SжI 6=+ ?8%;ٿ+<@K%6yO~3 Ppox{v5ɘTDͰz%LOliGԉ#M i( ]otҦctl"Y2GyG9I"ď;`[{onc+2pCG'̩TS6ςb7oݮYf;Ό2;.䀒ReH3ɖX^ehI{PM1R1]I1-BㆉG^i~!Bܗp|Sl>l']!U$LY'iԱ2l_@<9h{QK NdpyWTJj!SAԹhdש!,η+,M%s0GAÈ `qi?cEKk>XߧISq@?:_fy0SQTZ`6ge(\#*#&.q0| >)WVt-n~gtoqs&,Im$n7e'U.0d,S,VQTwc,c‰"vr*vTJ6Ȇ*woS܎Խ3+ 1ux_ 6"v\TS ߲RY[ )'2ݝc%_(@4^^f&+䆁2$xE 6++L̖R2䚚uKܲ&4#bbE Q@wC"4pU". ƚ78zFÁ xY%ڵZ ǒXДyP?:ynyۍ z0@؀,✂ r70!Hd;q3Zt$ٜ2#^CG~ÂXfCSv# X<pI٦z"}'UL XGR{{+MеB]l(ml8 bTqs2 yr` E',J&ݖ0e 1HdmnJͮ[vwLGq6b \ZͰ9dB:w>]='ZQ`7M )G!ٱX2HT7{396vvCM<=dsA! NO SQ_%5j3#/O4i^f%Al)O4K"m8\d&HEqv⭝^nO|n ?3>}ȶRrō}\mzS"$j0ODx0/<8FZ"Ni [MDNBq:>4ڸtM&t8a^**5 fhYQ eqV*Ln9Gp2Y}$iG34*FSw'(2@CWs"E]c.\zg ӥHŨG Lj"+X4,Yp>-|K۝E,=ȭZl\s9`;:95 `h]{uIIˊ'!޷܇q@@^ %_J$(Z"@,' S#3?~؇XÎK 4ف/͜kiVjQ,H4wb?hn %R[>G $TqeFn*uX#Yw7EltLOq}I˟]E l邴a)5f1 AI;ʤ$' Mh`'0Ԃ[&x%FrdC<2nEߍ&-2adؑgd`M?1<;Y:T"t0AskryM$,gvaU,N,R2n#9y2;h!I0N~nt .G(gwY.>7:I3Ӣn ԵDny&$-|yԕΚBX5Y"=zqmàhC0/9C`8LPn$ڇ>(@4jrxbς֯yLdE Ͳ55r:NM֑ir_r:<YrcoY%(tYjܔ:~S= #. SA]G@ƴ;R@n{@u!~7^ "Y)kqVVwAg=/j=+ɥ}9 _Pf usGaA 7dq!JKh{m:b1FP7^`ppi5 k,ӟ%4Krw92G~,􈬄_|ạnwwn2z64,xJ֑{CݰN>x=}O,0!3]JjPpJ)WUST #M[B.<Ռƭ[\ģ卪I )I֚rjĄ+,e㊚J iRMP]'"4:%y0<'G AwB#ٛ]}^l@&f[>zL^*v^0}X£BAv?>8(mxƮrkU>P\%Yx}\"㑠@z<ԛX[*X}z=Ojj SVQԸ/s\I15 i&;}wK/)`?:PO hߌe,2?wHsrom2_RC)e| |+$c_\2A0St2 ,>{/Fl9il}%yn@ݽxF mhf },8[೷v,Z$eiAÿ5QLb7_vʠ='! %x裱/tKf $v{HV[rI8| V<[;i]-#NEEJ8o0y׻ Rf?phe̛Mvܷ;%R 9tRY:l:]4bi3OqlRg^I2fE9AEǡ/'f"d5bwƎ*lSn>IXd^ץ@+3.>tCjc1X犢αȭ7o\Vnh_# %adݳ?(ե!MwTgÈ_a_fvL3E$2p_َؕiTXtB̳2୥X&8 G/eڥ 5߁05G|O<z6Z,iP ! c {4MߍT!/XJ8lOLͰtb| S60}`jr<1DdK,s3 ˂;0ibp]*zsn?Dmۦ28Kyʂ OH%lHY˕)ѦC%;h&;WJKŚ ?6g%ՐGe8kjnin1 üyRt`{Ɣ"ڬeF&P:[EUnau>vjtG+u"tI'( 阰?;c_P/':De,>maѴd *1)[9$(t@=-ȕō&3$[v"57SUՓwC80.l029|Zb!́k-nҮ1p~G-R.FUNd]yI8N8KH#G - "$)+=G%yA>IaArټXe2פ"j1P]eo[JQL.]~;gpLUKU,sJ p%B:JÙ+ se0bQ9lPȋV=Ptts]N8 U"eBRt%6fL c}oNa?hD&ƴ N-ݪ L ?&Oǫԣ GM>kr.L }y0C%Q0aCyԷS6ܓȜzTR^ħꉢБ<_|e$}9 rʎjhe& c4&-}6ebLO7ΜN;S\њutw4a6 sy6*#2¥$B>dO=Ь/Ty2!@[nڜAVɏ_UZoT9,s_fB7еu+BLv9Dq 8!R5'%/ ;"49o0bacXJXVt:_lE+RK2UȩcKRTO{f2qc^<]z={{ޜ MϗTY( *恛0;x?d9FKgFC*YvalN/KIy @x=j=\AVCjQډ0)\dRF ┢e18P6Ⰸ̎T2_T= fɊ QĔbtB>6L͟bA>BUX@:S.3<nd~\]t74WbGҐ`GTܛ{?BJPnteWf3.u'/-,g &οtJUy_ʃ9s| Ms8T] &hym΃Ez[L4hW{h~5xwPžXXDJBZ˷"n(e;y (:ؘMjaRaY"e6e'k/2Ud\N^\r(d%Ac /1Hb8¨\ `"nqFX*1EyMӥa9mHq)?毩 QHX̎sw$F1飸K)U[$]& Ȟrv"ˡ'IDI'ڞP?JzaŰZM ʧ9<6lWĒ,ʉ2/★<*ضHN> $%F|췡syDçB$ tGlKf %P5 p(Oq2 bmUy؋!]ˬoU=D9{?M!2 X%Ev._l䦝T:4 ~1vqՒ{UTfj/^5')]z(2= 睡8ZDyR"  %{b7!SOGm|XvkF, ;nf?2} @:Q1yBMEaŠL/8b?ܒԜCl±yfT o۷dMJB;ɞZcP 200,r }jg|WyFZ:Ve`4 F$t @(eՊBA=K[LNvg!wאVHZv&q(ZPeڞcA.XRMtI6܅U9Ж; o uDG_{:h佷D;oKi]$(900L$nzUd3xTDZ8#!~eј8?„^N <}|'5;7^=)r0{^īv &/;3ȥd:ٓt/gz}ڷglL HYިδ΁ }c@ H9m5@B\A V=IWg +$ ?Ӡ9:L4~mXNAm218u@\isKD* Q[=u5-0m^xrpa <UVO\OPW-ᅞTqG9++őytR:~4aRV4=v),s}iMl%.\0N4$IS~h ꣋&/1`})̛^ʌ:8]z36θn/Y0_iݘ~h]hMHgRsbH.JeI׳ \}4 IB!0|D%g Of`rU SFwx:A(n?ZɈ-/ј< Na!j󼿹 ܎!υ Rgaz>-cyt2Bf:Q+-p$0$)qPlvAБ44Q_NL}I- $c +0cvkNԴ3L9~Vli|hG8!{찹,Ҵ{&ac@Ik45umAL9i13Je~ѹk:-#zz+pvGQ>$$'1+.@hRV鶚kA.W)8ޤ\^~Iv"hc&ܷI/*(_HUH hb_A2*0C'Emf \'L0s>9S `zĶܫuo:n7@I.)wn+eT~̾ȸTi<$'/|YT$„(`z &dɉ YɘdLvz3qQ-0*Аwԟ^dHV  ;9=7ߑtpA@O @EŇܳ2ϯT V"^W Q 4," VU|\f;JzLi eM}_O\*w( ޵`3<I^ :r$=ոg/v{pzƱ]@a9iMI]PqXMUȋ~jwPd0 \am@AgD%VB*u6ZI%Х*Pq &ȊV)o Y@Li[h緑ABxP6feZ6QQ #Q԰ۼN$g6K+9Z n[I)VkDj?, ҧѡFi-+aVMȒ< 2-[@1.ϘcCOwK;?:Kӛl),υbrx09A#9dzApĮ HB%Hvb#%CCɮW͇5Hr o8 ",I#t* Ev^ga$;ʁoj;@3ѯ-!gGMmQ85/Cc1|'. ؆d'f .@P?`n[:fLSyVil}q4'@qZ6cf}zi 0v2~J|9ߤ:ni0ц,$5ؚJW|+Ȝ!ShlP.#_&7GỆf~G.s<S7Ot-z7At\6ZPP;>!V ۛl{qW JxR*7ŀʗAzaߙ_a A.QN@4= 4#kGv;@?v KW+L(1y֚dD]L:!+8]sVEVsUS6*2 ӈ,_ԫnzvdUzWޅt6_ۂ{RڙjRy#&OQq2u__V_Ejs݄"b66,X8gvD`= ̓jਜ਼8J3?ʊ&8E4mxKkp*'dPZ'גVc6(%_9ΫZzΌC"5SefƼEcD!rZQYųX`)klT6әˣɱ]]/m>C-q`s>B%Dan= L+#o@t&&zAXAZiW[~'(v';P^jjeh@1:F4$_Ia'* (!(+iFVmD d2Qk]72mL>_iC\F b\ g}{"t[o6Ybgjڧ&N@n^FOᴋދ$Ztâ7h,^8LL#9Dhy[{B'8|?/~/'w컧zT_ M;Q0k/|+A^  jZfNl[C#3T gꧺ"DZ0"j@8e6QEKɰ2-vpr &,lE8%Ta>I5| ɴW!}v QFJ= C~ɊT3nH;U~\- #~ZpS%m ,qQ &7Hpe9 e׊xt 4ᒩ_H̗'Lb-a/f]n%,99mUJG즊 *a>>BԳȂT|XN(hF"m-n+Nt0j6lT$ kw`g *fqj$jw9`̐d&ngKb0Vf;n,YF?yI-wȊIk/]@۵<1F'f$uqC]K+2!}Ht"[(UDE0[_BKٹ}񌫀@}LG8J5lݸPRESCu.i(-j E#N mx 0D]x3YڥY%]Uc)֖gXcwTynYI싺eek6e4P> P;Twr"#nOGN +tB B,Edߺ^LpM.g6tCjXI9?n+gh/\ L"Xiv.nf' L'S <#f=;#> T"\Is6BZn.I> L&-@Ńj@$<]`8LGkt+c% i[GNalv0$;r{ńնLpQ[FQPpw\6`(~FhXM}0AF+]"KRh A (Cbp|ѮñDf Zl b5%_M%ԯbFfb \-& h U&i@l]%;rȀtvW)vu>!4鸳Y^PbALpgBc ܯ7 ʛ?=\3އo.I` `(X,ȊZH]‹W2ڙhU^eqH6E~}4mz왣~fRH _:|3ꖧ쟭s[?*fڂF}Zx;%,D *g=(X;.O15rdN)ܸD9ڧ1Ey5]zdG1(pRSl`:riQnՋ< (ɷѥjZ&ܝ]\dmutIvUMܪ<5<`;95%Na;x)dU4߿Ǭ @Bp_Kчly O| xH,% I>|EhHkܘ-f6=2LJ 2 ,!{/s 'rV^Lٵr(xyƶD`3d6z f2Xt~MLjz nԯ}$?bh4 t#vj&9x:Lպ˿Du Fn]cF-Sm-^SOoܮ#x%("1~绳iU<~F(u/GoUt*aDL5uݹB}V念uv k jo)fY!o?w&8Wڪ^G>ӗg<4FMM2GgFJeB Kó.oG`}c[ȭmi7/6tNj/DRm/}$q4..]3*σs ?f?QQa+"hAT>[3Z\on;z W>S6GNjH=UBC;0ye/O^rr "IU;c,)ߕj,O]3f7ۨ ^|(K$z2pt+:`6a7yVdM3c{4c8۠_dBIDr4 Kb $UY&νFөE)cؼ"P#pvWt4fc"ƯHWBr87XG,c "dy~뀲{Pɡj~g8[|r wc4f9n*4F~=oD܂mك*=خQ^a%y;JF*ϸ=zVJpNI'89"!q10FOl@ ۑVF#VWp,01Y>9d; ?~pQekWATcr<ޫ{Aƭ rڀ#ᄪ&%mzqK* !vlj`ƂW.ZE8RQMX…$P%PD??xJ,e8SW袚pk 1uϕ-n#A?@6aEȅrm݌hBmCGm0][µJ$m9oL$UX4+[]}E}PҶ6,Tw*fF .; 8$UOn&a38{~/;ZCkKkScHM31lm#2!mqݞ)2ܱC2Q]ŜlMȻiT3O+7 PvԳH='ˬ8ևxCfe8ib-?U _Y٠ p3 D>9%#<#2Hunr7E U3ER6ٝi_G)9t{_}RJ,QyegH|{to/KwQcRi-Vss@wjoS8-~yc,fU,7$+v5e"$Ŭm"P8\;Cޥ0؊[`Jl>&vҧ1,gyn܄\#_ڢ( /tɸibv)lD߽R{Ǫ|5Z6$ eʗ²0vjs1IVˢ.Dp6uEվB[}l(W,Vg=<CP=2!$p!UQ"qw7v- E~>=JES@\#s_}fS$ޔ;@ ْ ؉P9j}Xu:uMţ>l(L=.ꕪbDz{ C>jsRP",kVPU4d-j_PrH(X_(c@3X*\; 1[.r u3-?ҍQw7G>h:b6lsm&2Q 3p #gzDC5)+Cm^$9(k6ܒZc! 6:k-- d}B.Н!|/^n/^Aq_G˰|rmֻĒ3;H.$@@Zt鷆+=%k!/-K-a5Ѡn5z݇%ͯQ ɾ ==#ڋQ]r\\f3I[p3LUu(6ZڡViJP~ƴJՠ8qUw2kǦ^%zv$r}(UE Rػ5=߸gCaJFх8C#~"+< ˻k q6arT j$\ܒyxL#'0 |"Emd %Oi}xg#z^yN2\3ӽHcg{{5SP@I8) 0z"V !AѨ_uήJhY9TsI*".rO4ۑa?UbCU[&C@KZze=~)g喖I;# *9%k]t2˟2fJy3%e d까-gTrHcVmk铻`brl*9a8Eb ,lTIrvv=v! ;XM¦2H`ݦ/ۓl"z0CBΰU@A.śEH*x8Ywn941C*?vk.'FOjbK*>CBt?KQfSVi[]G6Pu $91aq[ ؤGj9n/4Sqv VA0m8TҢٽsxϼꂢ=A@P$RiQ^SnZx. 8'(c)ȚsJ}%(?AC8XR~a):}نɳQ`%6(-t>SjsoC3$`Yj.!O{1V@ "`_c)p֓4ѡ>A)ܼ%nvqq&^EB**>g'!=J.d _$NTۉi0Rgk%)[sIEg;9xpd^ZǛh,%@/"aP aW08ͩ eyIFӢ$v\lz^G#LcAnt fWRvH?>?jr\J;XYh, O-ÍN8Nm=L;./ Xh(tYD.pl@(x+bǽ?+8*+jؼPSk:%p%,fOس)yz! nFzW)G"=:~+~7w:^Qŋ~Q*bfޗƜdx9߆x_u3)j 6< 2J|{UXU(U1K-M:u4:( lYnf:ӋQ|?[H$[{2~fwoBs)|^{B0tIW W'Cc۱:{KsUs '4U6eӸ4U +Pf%u2]Nvs6nz6+eUl沷eb%$}qL>EjGrOgOvu064ÕN)LV$HG =6LX'oJ34O# ]p3WuI狦xƽ','Iqُ逅HmƌK߿j5E*_4%5 NH3&XR(78Ҟ/{(y۪qO`Km*{oK3S&-YP&95ub/6@'d{X"HЕ]AaiB>C"g՝o}R/G g;̸<{M'yo`H_.;} vQN]j䋗I8S}+ +iR"!3ﴝFbZWx7Q(;z5}HP:$& 0{*Ğ[bFUe M엓.HU )ɳ,b z 'wX7zUImˮ oxlP.' qo8/4[l5$J0P9"eZ#/ **} L NG]}yD\ >=o>&فկH6eȉۢtw #掰b;V$[]Of% mMy*i,6{;{/8.0@ LF('Df8D)7x,R6r#ya6w W /-:OY ;:\~H-5%G!oCM_FZgGQ2<]+;Z7Qyhc7 rWS%о75\eÎw3y7PvCJXH?LFY,(Y;xqLi@1e4> puzrtD;#j[f`O1Xsl6Loz;Kiu/'+`ݮ| y# msR1j:h[xNIOKV`v5l[(' _̾] h ufe6)Pqڌtaȍ9 y ۛGԤ"Kt1 ér?.C.Obw=%!jsWR~+K;(5pnq #o<ˏlxbtdǷs6/wj:i .4gk='U]+#_yG\!z" `ӎ:J ;܉O#" db20I^pYgD:|]k1< AKo-ӥVqrU^6WC*Ű}'T3 Ϊ 뢩wGĊ8GǮ/tk|j$}o'뼇{督isQioQo"SI`&RYG.ZX|$#2Icwo=(J1$x x5iivJد]9옴%& :Wq"*qGu'P82q:vv7FT"=u|ƑŁ=4M?7t`4 ̓V, ucH~Y‘^ Jrhjzv/{G6Ap6_F?8ː= YEAiDF9qcweM :;]?>q?!7Ӕi4)0ܰ 5|!4 1J tKe*ؕ%9vu4*Y U,if7ۊj!:?v0H8vUk[ D盓@2ʎ R(6Fy v!y4Non`KБ!(y&[ݰ7DEΊ['LՇG%Y:Sa3l&CK;vV5+]˲/ޙq QgZ6V0aZnD15K@]ڭ޹|jp]G],Y'/qo$BP1*HRDSȕ7$ą~/#Ur7Yu,958=g1}GiqP|naGzF&L`S8cj>]r{oBiʘӷˑxFQ5Hxq8U٢kLSeb X ;_MBjNaZgV^^{{ڞXPᖎ&K-ʀD{Zxj)GCZ;MPW'9qoC cℬWn[fCin32ԋa`i7at9sx>BdүabB;X_ ]˄r#^fUH* Ӟu N7 mhB)/IãxwPJb^i\^Ey)Ω_mZF u$%8Ԉ?_o CL=q l!bIgKSsruhU.\{wom0-Wo퍶hÉI#/s?}'xȍϫxMs)n[؋Ojy`ކ O-AssRޝrNRo])])>eUTZc81<ԑtQ+":vo9`ȳBˀX1: yWІ w^) eId*ܜ <\)ӝ/r4[92kzz0֡J$Lz!4b6GAH*w0"WAR ˊ5a$PD`m*ZB.Qw NvYEh>:YR&bt+nFZtJ2#:*`BC^2(:չ*WƧWBTTjC tcNn:s+y5cBm1ŝaGbTUV'ǐA>N,xminr+# eiYs-[ c>NG͗=<:xҜP7p\YI19 Ol!B,_6h mb6.ֱ{rU~'=35v ߀g9N'65MX]"ϨvRݹ+!h}bpYH!+mܢݝ|Uqkl(C?YX uq)"ӐKOŕ.%@{8A Ć q,Хd^ӤE6QUGek#F4PF4Ujdi+ 0^OP/Yݑ Zb25OۄHʄ5)HBC/IcqA m7Ѷxd;QjxLv5Jrh78TsԡnKR 遠3EuNؗ$TmCaiXв g4})C+h@Cwl?GȠ|mʏ9\vǤ^Q0>}|c=z׳M2K 7Bٖ÷> J)9412~{9@xtڔɦ.,D.e(˷6 $ 0 fYlnyIC2%?IR_rBb58<Ӿ"" NkBWt~{CGSRܙ'|f-ZM mʸH hҾB.90TQ>bkQR5#\{J!.NYAppa8'8rv*̃4RnNo"x,9^I"5R(!e5YI$T9b&Wh ܥ M˸_^>5}t>:sI ~#=L;YpA6lm'OBGum`Z!WYыUwD7rɥfCtC: %_]$(!X$;iȔk}2z"g5,&% u#!w07X$Fʜ۸U\,I#yXӥ/2-Ol fȂoh,D4U@.д֢ocetCTʂ 14FLnr$mج/('3tRe݃Px,3:v_þ ,7kgTj uF˾XrmmS jB?4"#8*AmѤR<+ %9@\RrؿKۙ_ *fJ@TyNz_Z=ʷ٣C(џx_N@kBGC& H\ 6 ^ERoSOn YLzm G8@i i' v>ʒ0<4SB@,ج7>#ؕ~GXҏkG~~~Dȱ;k>L>X;3(go*ɇ`9yA4b %tkYQ!]'M}|iqߗ`%å}}ه^o}Hpa4R]Yۜt6[/ҏ[.- T!.~Kݎ#3t6Λקҏ~J?z[|+3rOCįk .4'ԛlsݮp-HPީ9=3[,G^Lx^9_pN8lZ0)h#=gσ{i&o.`9斝a33`8.npFS`HAɁ}~ כ]Vԁ Cl99byTr~K/цs1>#p,cjvמfhkw؎2q縮 `_OCiΫ~ Y`ELBpeVdj.MEҎcq]a]RPzM[1R||w;;#?]Ļ/NztWC{r; WC}:8NEv*ְ?ꥥ6+}ntYvu:"JAqSa!kF`P\{N ōo&cy ͎8VWɐ&|D KA=aD?.obDcdB$|(PgpU=$\N kdK&)1%X./&jB1V&゙zQ@/:_ rI:(2_疯0_t]D4bSyD?ǂy7ݖ x^BzAH? Cz;y 㠎YG\>Є$A4x)AbzzaP/?eP0:9okL(ObzSDczgbz=tK`x+(3FM?Rz_92PC\`,&ӰQP_uRLԓu SP̊~90Q?6% s9)PP'ǘ|6o_ fPn ]ӆ5Ϡ Bkf7#"ګC$P3HD q 8(c $t6Pn,o&mܥ#7ͨ=ƟZ׆+6~4\o.Mјj$; K:.B|VZD)= HfT07yE|,@yWgJWef@|^:fds+[HItMQI;&  ;K].skt^]}V((U ri K68'] hQF D/Ku}pFS/X׀"*ñ)>\uZ,}sps\=0nefo̞rE)vY&wن7\VS+}21`4+2 C![瘄~Ӂ{=d@]PqgͯyR?jAs\[Ӹ4'9CѓM-z+V#$f%Ifې& - 9X/^Ulkhw+nB0Vy>i\և"{P*%aޤSpN!Ld$hL.p$.C."euv7^Sd,E7&\GjYwN 1Iv@Z% :ByPin".($x = H`KbՕw'iԊuRi@"-ז2=+~wj=}E{0o8\6n*Hm#dzmk%%QmA=m\(#EFNEv2u$r}v mKE5J2)[$S22 ۈNylːՕ\4g.KL2e.7T~\$gN:a Si|NtՀ[qD_<ռ-Xux糿ޠPlSDU|UEvjSjX35W=/vsIssfP)=Ǜ`#c9l5yp3nJvZ}׵%3I,Ӊ$ W# 79K5!:6zzqx#LkH4!k}h.\^]ͱ/QfϺͣow^+ !2f“ E)5:{Kx%c$™%pr41Oӣ"~ޤrnU'iL娈Az>dSP1yxҞ˒ EeCmjǚt@Z" S-~aV,"M= ?sṼi"3 Oc.>xns ܅ٶIn Dn;:襄rL^[_ ,|&/]Z|ERou-mc+ `̋G9.ܴQ685h|=ݮp/eik3:' t1i\-S,pq&fQXȥ8:2( "٦8-w.kxWM,{Q*C"H,}Ԣ-},YaU/76 oN)*TaC`CcOUFD&Q0 #|];28=4%LS^ikT?ZhɌZ:eJjqT`W۟&pζX`0W L>&}[e16U x} "stqDq7oQn'Ӈo 5mم$MC_8DY'>ŴX; !̚b`vYVw~=y"]= [n"+^jtP]I\G@9NNXZxVMJh^R|e"Z$=NTɠe~v}bAc$g.؞Baׂ=g4p. jct܄xF9ίÐ*D+"S&j$ UcH&`R7p2tjVʮv*~6գ@͡9IG2Ȓg\O2NTTDԸvb[Q_EjʏK:U1%>E 9 fc>UO[p쥣w0_q\D6kSih0[ v w 8÷ T1TE]iJ&˸SV.W3mY ni/ ڱg;N ˄$?ɝ ]dഔSԶ?ȆO/i;4rĬr xnl-ӣ /)IT9z[6lc4ȶJof!n!U5ߨ, hA ˳L'44NQMm7df8%&^GXR7wOyΧNnOrz1!|͡/]8}]ƿ< =iuì#)h Wi̾x\+ y:؝2" ܜ$iɇkrYq1(?өrh{Ds{sJfnx(J8YQڹLVe4\ (- 8|..% g)# 1A̓Swe.Et#dI"FHrۉ"R8M!7bZzIl ?k ؏dQsRQn%npxaX㲥QpSy0 'h:t>L uYX^<Ἐx*T(SXI_/q;NOd4龑L!j_?f]K*6>8FY<3Jry8_|Cp³vI`KI6f?yf#>OŸg xnԡh@oHav^E&7 4v=MxlNݶQQAU٧G%? *lf,4/m;2]d`}|ޕLmY\AiC>H˞{7 ʯF'S /(lglm %Ȕ ,! a+nlwW>]3:_f/s 12"lބELlZaFJNn{>Ng.fLҲJL#1ZiԻTUUt2Tx2Υ(<Y@wvSy3V*r0Iz۬yV\2[k& PXtA"A(@xb%WY*Ǭ;rSRw.;ADѡ̔ޢ8ПϺ7P}Ly<Od~VS1IY]j#_0ֶ=sqD9?CTל4GpPy<3:Weo $@ "< >mQM ظ ik$u/r7pQ^yၔ\Mb;lD)vn>ѕ]7ZY0RxsIQp!Ł%#.f7H絔RSz>Ĺ*Uq`ؑf<&kT2@A0$x~tn'jS'HQ>`Y8{ ʖ'P9zPۤ){%24Efc9KczJHGckO4P5ɆpuWe'9BX~@&$6 I Rj <(6 <7:p$ƙq09X3Ν-2ہ@"zBO#ec` =^W@r_` zQ1xX}˂!6Y,Ez|'Gy&i~IߚI%@H ~{P&D}BU9ԭ=@oCREfỲkZ/`zZ蹿~l~+7v2|Cx/ + k<_T@H@茀QUufO[VX.``4yƒ鮢y$urtE|bԽP:ϻ&|u8Px}8OV1Ac:H6EFT,l _ٚ`V7vIvIJ/(͢9`:`#;N?Jm%! 1yVO>sԓUKG+jw< ){#Mq5DQ=% ~JM $֟M4"g7ԗ5z!( lD}1QrEQaE41Δ#bEӛ_ԟcU3n@-7܀9pq٘7w'$ lD;z;  ;;n:4 O4UBx 0Z_@'Q~4$ϊ  Rj@4``! 0dU-d5L]>FYt| )£f}TDIW>& !A|3ū 齰Y$ksPx޶!~!a7W{h]`QU`cRfZXԔh/zw8'&Mhs|cTES0@Aq VTeh"23B\ y%Nf טt$ ?C쇆5s"2p:h ʼ| Gt^n*OE{j7G/q (Xo&FIujΨA1[&HLD$o9,^"yY";)+"KQ*/ :81Ȱ;/"٪[_Zboq9K8Nq|pWyg&@pBfոJ#vJm̢6K(4;N/3RA2^<`Ep: ` ۠32k=fZ~.2rD$JA^C|4$cs:&<%?@Tep?yg2Dek.uC_lgp9Y{CrGPwAwH_h*ٳ뱢 B3tf #&62 ÛH.ȎDvYyn:Nߟ^LfAZ__=׎2J8"<f- LH.ފYio\>k;/Zqn˖BYߵ"W  EK.j'w3yowI&8dw>c!)JYY5(rhs4*?,߿70>ۿo9ȩcIb E_MEu 4ܷhUIH $Bkl&NQTAVi)} FHxcK7khUKWV}x=@!}u:'|dFC?XbP'"w"C#?}AQMTOr t5?@|`ѿ4[#_i'³_kuFOe|\aEKU`kdKyQgH>]V$ܤ, ɲRO^eφ|^ZٵoWڧ~PS$̸_YF~nB4׭e_VkW>49Wӟ0Ix}H~qcUFW 6S&PazRd+u4FrE ?SB5- _o_^g/%_M;EZ.3yY@+:|"5S[~;m裙F͞(poo|rVѢGwM0NԜ=u{FX'ʹ #$_ɏ"ڟal}%¯wzD[lܛ<*r'u>bAvZrQ&&^nzX\k I=G{71E7n4 F-:I@Te{X F|{T:ͬj8,fnO0}X=( ZUH >]Ah"t#>kj+!{s?s!x?wy4qlǑHOQϛWݬj$!f o)-  jR;;{qp#W6{;f5kZZzs12Te(ȦtZۡ`-kV;Y^{a&%)duYܻ,(0Jyf/_~go߽#|p\dO-&U-)[2P{xi rQR09pM]]$# f$<{-o3U AV(a_7- =#[I}l4Ss9k>{]ܔ6$z, $ydwv_MA*τPQ7W1'KFFT IP<ӗ(@8v׉C`#}34@vI6V/'ѳa&YYBj^L-S-$NxHP6ttϦFd^3@~(BwXhOnyGa+rq~_LvIC TV3ye#y(2m5냘lEu Pb^a2 @'U&O$Qm `/M.UC#)*c^7e0Y&qVRPZ7y7F\jUN}|MUm9 m\ZflzZ%Ox/dwDR X(MuPGW&pZYY]5B hO0yTcrZ,4Hq6~,T8pܽu| !f#?navit-0.5.0+dfsg.1/navit/xpm/country_RU.svgz000066400000000000000000000002721264204753600206760ustar00rootroot00000000000000+(zHcountry_RU.svgA0=hƵtM jۤ6TowD/ٱU-/*c?iW|+ڸjFLJ3927eX4플Ñf$ "¢n9;)w[};mw -navit-0.5.0+dfsg.1/navit/xpm/country_RW.svgz000066400000000000000000000014601264204753600207000ustar00rootroot00000000000000,(zHcountry_RW.svgUn@}Nb1zgwVBUKSeb'H*6 :i+EEJso&+PmۺL3"cmWlblii凋o7Y`7_`8Ͽ4rl[MO}i$pIv#}-#(bާsV#@͍'iNH *@[b9zT. ח#;*7[i0vJO>HEtdE!8 r\ ,7Rq^H%: ĠGM:G8 GH4TKIRNE:IBA AphPלF]4;y\.ԂtmZTR v y Ҥs)4>Yh$㔊8!T2zMCP-јIUF`PFH+N[R%HV2 b'>j㾞|@A{ɸ$ܱU=?/ %ؽ䗌+[0iOvGޱpIz?q6Enavit-0.5.0+dfsg.1/navit/xpm/country_SA.svgz000066400000000000000000000427121264204753600206600ustar00rootroot000000000000000(zHcountry_SA.svgmǕ2Etd40@O̗ ??{ya/_>|ݫ}p*?V?_E)͇PMВRB_ԗU>?4/~_ݫeԣ^wy_}7W59yy㗯޾z_ï޾[L>%ï^go߾{>W~?z}ⷯ_ܽ]-ӏ_}Wg?3>VGKQ~^|x_c/53zJſ/߾O^Z翼^gIJ~/߽&zogN7i=?o^ 7w~m?߼D}a߾~w~A{߈9=8!o@/}<2}}?칵'31I~%0O^ǯj O# %%{ᗯ{=?<>molET^~A_o?xG3}f_w/^yӾ}_޿]7AP`4;-/߿{ꇗOw?߿{?ܳ,_<W{Qk9_\^Qϋ۷ߡfOz^gǯ|?\|kG9Oûw:VYwS #V?~m[2NG5e/pW^|#[w,˗uySBv>^fӾ|׾KYnn֒ʳE]w?˽޵\EwionE+N]-IXqޕ{ܵw Wz5<mh:ns=k樉I'>f7:}FͬX=˜|WfŤ*MbY^Z3XT[nꢅeJwuk#L]_}u+&Z_˘Zva&k&^Z H Դh[ݭԚ^]1dž_-6d͋ѵMŴzVm{KMl^͹y-/ZKZ4qwA}Z6Wh/-ue6^{7GX.OjŴyfK~ibeIRaښM/M?6nwiFZ$؏]&SuAwLa)kDkwMdtתP}Y=qWQbݳIZYۑk*^p}~iNGyyr7W$/[Rd|鿺8Dzc 1G|h9Dh={5t!9^js3Qᨣ)4ΌHY3-OhC ݠ:5 >Xae&: z]f+myt% ^c J0mvHV?պ\Y\#1Tn>kH[w;dt鑘~{8`=н[u[BY8zc-TMRG,[iSbY21$+[ b]}'pšw-qŴ4q:j+-KZPxt]U4dV>Z%`%oxZ[=9{kZ2}li+VCzݜx4U̢"5ef5bZk8)j-C$i}"gyQpLc 㫝i\F<OQ\VRKUJz muSzw5LĮ;y`p6ά4PJA{ltRE{*5UG.0YBvxGB7oP%6p6]_ziaH印ej }JBKR`-T{*|*b'hoZVzb~4߾{ء6<߾~s/K98h7_{ÛWMlԒjy1#KbT-g,+4єzRrtiGC L6̈ ɠMK,Rł`qk>zZ4 D];OO:xr2%{c7su޿+_r zF˲(@=2znHdxRn 6FϦ3p5ۮũɂ<0pe[mضYdzqzamJB/YxS2S_awf<1,6jZe0(.cN@ۣ{M%y+jlcI¦Ts&c>y\c5Ĺda+XQpqF2kt+,|+:mlGkaq9]ruw'Թ kAX; Qkq!I+CK4-sFrə$G@%ڇbbj[{=juoi8i2vnH)m[G>낆#d*4_?C9KCpN -x(lۘ.:68'0|ivՌC?P &Ϙ׭Ȱрl8"k}p Wۗ#2Jщ v=$7FKV[1YEˋ#CkaF\㎅˾xj5VXzVdR؄egl4oW#>_9jN Ӵ,kvۮb*ͻs&LY2ߗiz'r Z pEc%niH4@_ bI&{WWgɖ٥!B% '|Ɠ#Q/v-S:#4bDtf3Z>hQ}wSg B yMpFKԌ-g1|д&\FUm R6 _"I՘·ΫXZŪă07> B[NGCdCCI%T2eF!9Hz󑓚词]mű&9%D|>K >Iiɓ:Rh%āX1HfC3Nj"YyI%iFZ6l6 44 Lc1!8A;$iwvzI~lb—T9Ns3X܊,x_QZVO6f!"!"*r,iKl"ܵ9)}b\ߒ^Y"*- )nztZ^\,R8^ǒh7Іj&dpe8|-XDQL٨X/IZ@&dRx:r:BRw<(mڨkOSfrJ#hˊm=K) qQj|Vd4m$}Jdu`ZAEU/E%kK% xցc,'B0|k3ҋtLѥO$`# U7UrC ]CQ6hN4H6~, gU"Mr#D<;6vգe432&: 82F!eR6SnW:Wy1-qh|iu(8_`CQ_XCd6'C U;uWd'qL=1PA9_|{8ohRH댛(OFʬnʈW./2BZ 9tL> d\9n vFYF0<9AoF)&" [i__uPq.L5E>8p6`G/%!eV:h/ɔAabA޸|:" }"_!~Jl>M_Ymk8]=lr"~wDDڒX<Q\TD$+w+3|CmGo+!TLjΣ67p8[dq"#CyibR\/g!u!-'xs4>F=ˈ;/~$8ӝk&0~G8vL̬5ID3DVp uh4M847?U?#5\1 K<7Ӵݹ~"?pUP SIJ/HcKH+d۸'B5Oʣs=J'ɜ4I|"HM:ɧ*Qif-U#Ӟ+ië."ja -JBӑ/^M\񠼅/ivs>b#Sbm wHHlU&o;X\Ǿk6I%޾BR7_u(9lUļ!œEÿ"0H^VnsctGpGm;IRգvh91Hytwn^"qÖ,|"%# ?%{hWZxG6Qce|&4q%`εg&,)P _s( FE4yfQ&kcPFR'nS Ò~ߕF!בqBoHAʀE&ĤnʍxPE!R#(КQ{@ rZBSrjlBoM"&E"$NeL&GU@;7+>fnɱoOma# F""#Z-a !Q˜A`#7K-RWm+}@YafoǤ"cjM7S)F!=  bٱF5Zv9i8FNHy4I 1sWئ鿺LX4LUJ>6 n%!l(msI1Zg3"R,XܷI;tĦ?WFb53cfi›O2s n1y׿sŻ:kl9DpGc,Hū{\1m:۩cmw xv˘j>YkSc2=;ڞI`#΄ݤ*زN40 B6GbiGZK,У `)}$3<'u\7m\{JR;n fhTj,xN2hL:OG p3YF25x2I./FK#G&bPp,>Me:׉ :3,/Uf]G("fc0%f vXkUEC<:4(@]"l9:ϫJ>AGM$UuvSgrGoIrf1\cیIUK"I))z:u ,5#rDDl\K,!_)$dl_$%)v㉬egAK#5L#*U\$"/ rVE$Ixv!7̲sw#a:iF?=i7$G JovjaeR_ʿ`s f+R^WǑG_]UNA]~4n1j[Ug34+E`w+ʪyd g^3YG]Q6)~ܢ v͝RWH2gI6 Qb\ø{jR:huqDplEH֧dϜϛd9ڪuDc7Wvmߓɷu&VL6zOjgߦ'N9b 2-؂ LbN,IS/1/TD9$Ǩ)*_Z祑]8J'[vmqߊ5AQ[KbT,7/BPZ?Q?$ЃFM/ZXu]}_DN{M4Q~Quʎ/+<m!fWT&}'e4pbX[e64|6WL+MIDcNU( n`b1I1ǩz'˿&#eg[޾3z$Aw n$exCo̿ģ>˜*;G >9DsHw@1 W' ,alԨΓ~mbInEN{.F[_حDnZv3 B\!^v5z2? -O& j <'%~ܗ±8v;WD=kTai|W iZ؈܍\9' J@$lO<12e/j"S5p ȉd6yZPVvĎS"nhNB *GE蔐~_NYZM?-FqN_<%?ip-ց-O,j*kў5JmV(c2G4]NTɉεkw,$' 2(4ra)ģQt4122&Ӱ䕂r=9 5lI(:.I\nU+QF\KkQˈJ&2c5˵Fjzg2X1(L}7COrG&.+&wA+ *I%n~<4c%)NZStM6q:ֿ8?$Qw^x޽_Y50 Shqڡ74-, md1J)6%ȊA[j~}yDX&Ǖ+u.%^DFem;ZB>~J΂>i,u;Q}L+km i"/.gdi?XBp6c;*v,=Ce`2ZέFz5P,. t4Glt ]KHaCZ5h22w|gx2KEQusRh򶍛S΄edw*hhvPz\ v~0q=AM;dJ%h.utû \o0i "N@ce2 <OQLm[ bkZ,kFzIZ!!IkBs9)2ˍ{. =U)<Y$4y#h8,B|_5זie/O.2ӡ%w \SSh6.?wH %LG;lZɋΡ5xZhs iKut']5q퇄&v*FP:LޔǡE Z'lZrc0ēeOlqRhg244|j8$4yHȘN$L&ŜY~kgIݗ<9&{`R+x+Wtt/GRXH#B1MfӉ8zz?qrVJ?JW㹦tys@3(o,ESWKSt &Rg0hnXhtTfN I b71I &JM#gMsC#V<+'$4C"%Nww m؇{.ސFvXEMM76|M]쵁AMNF(N[3O)\^HyF&MJFX4t7a슊A=ǺzKiJocʹG=pͅ< @On|T.7yDhhj^(/?κm<7«aO.!F.(?m{9BZ l5W|1GUXJ%׮un# iS21{:j{@Ư4N LQBܠE5lQpl .Ц7x˽*4Ee jZMI'rz hgbl K&' )N?nu(j+&nAijamȺ̍ʗސM MTW881>͹ىbQ=o/-h([T-(Au$b60y/ц&< qyJ2#IP|GR!i!ȇr‚˭6 ZZ1i[rl+ڠF# b^fK" PٙY${wQW\ ]:P7B&ݣ?bS, @ #]杤\XkKu`n%|Z xD<$Eh!jCoH`hв$.wzSn!}]w%rHd/Tv9ZY6uR'.-,5;ꌺ2&V r|\)ygt<9nb/ 6,jaanx+HsÇJŧ5٭O"ORga:AQLa2 s)RU#eߍ+4#NxI997# ]Gy^6(Y.7\aST\/H5̑WƍNL#d<.JnT&Φ k ĆT%s'6 ,!~8@shaOԚ8?a;g^qHrJW6fLIՠrlH .uJRPuPNI#(lL@ L̻/@V$MNPLN3G^33ܶ8n֕UB%VN]N Qk9rcYHPHeizZ1Uڂ|"{2<ոqi=ANI{h&K@\Ĺ5. ,Ȟ`}ӌhAwd8oƂNܒ{m!k mSFhPˡ}}ԓOG;2,[ZcQi;AV˒-=q$T"ܤ-(_YNiϡ;(ѵkJP5f V\tju3gnm`7Tcn& @4AAjh;d@!lTӲ%7%CqKklLY4IG䋥c!_sbhf9ÔZ)t* oedR\ )}JrgrXlJiAx"M[kmcbtV+095>hCKw?솗΢-2t]Pq"F0r]@689;;-O`AɐÊ55+>eZwRrpSC8hW/-$,@?sp Q|LPW֥t܁G&5J'6mTu%c` ŋ΢[Jbwj$mT%"/`p UZ(D Mg(,F&nj3|=AfT5/YeQ C+}2U b;tH欇 ,iڒw3 J /|R'[zZ? f݃P7)]qlY?MV蓡# őX Hdg/I:9G#0n7 $9 ጃ6_@1b{ _4O+ɩMq~n.KM趚NP Hc@.{.,-wzT (j[d&NISs1r㩯y`ڀBsm |lCuAW3Oz(Ӗt|Cf.H/twz^F,)LNLP# z>BtFd(0Ii0ixˡeob״y0pzTZ J!bq꺆G1>ǫWwHR4ߍKɫeX| X׏٧F&:R;^ԹVQ.f2Q/=``EJ-R@r=мVt]~Q#Qs\ǵ] ʖLxRaahfC#[C+GR {!M`lz-D's 8 VM]PpR.ӆl݉bZ_݅sL@}ZnRqW$j'``'b08|v1Hk Ntυu$zy`k;L몾%J,L6JNJ8FZ@6VqY:ct3NpM[ 0?$&0Z:*rmbټA- =s9x8h ͔-K@F Qb\fԁ$cC"}wJ#dͯ=-6ڇri9H U$Ay0jw`]Jlt4(z;F}uĵӴNk42O ֪QY ŽT3:dҚoåQt"ͥR}yI"_ҮǂRGWGتˎAeJ:6O!ԙ636m4Pסe$K) ujzZ>ϵ%.H 0ԸƫC[n_꡺ڌGܗ Pepm`P7LQ:vOP뤓Z?OrXШB lww_+ےD\qyhc\:O.'Ds Z( ZNqV5xvqѮBllc IB ܴ6D^j}q&bt(3pmZP腐|q\QSF+k,ΥD<㺾λ[@<2<ͬuL:KٕYθ Ҥz\[7؍`A:B_hrHAHe\Pߑ]3hX@;G$0` gT.[./*`ݍN*0Fc)6S3nelm\%SytKushYY;]}b-DClʶqv}SBܒD+Ɏ 4.A b4WEuęoI9.!&w\ICt0*1xLWD#r'J$ s$<TC\vѲ? 9k&%xyC7K+Z)3mm.4.=EQd5ul$gdt"_b~6! (U:vc%Ɛ}bH,.+}v2֩!Q` #G uƨtaW &nr}$`n A~1[gi5c­.FZ} .#ILcglP#ܓdqiHvq)~r@_(\ځͭW㰅׼#{Tw6=,G:A른{t.k$D4v(ڼKd e'@| E3r $]y1me`LWoPL ;축(i͜|w/N kI ءY1h{UON#Z&Ty[flZA(G 7 262D vDA˩"_ht:4IҀ0E4ȹJj#4.T7,l$N"u@SݫZ\ Feؔ|mT h܁0*a .*øbԂu,X߈r{`:xIfr*v Zޢ0`Y|555b\&whBt mAJR|_4uA(7ԝ>ھ(g]9Nj'K}Y‘9r z y@ckAF-sCv.aT_V=/!"J*'w>kavgVui❼u|5$. =ph 9˹r%ҁet՝3xu!BVXSj-CTC7j8Y)7̿8>w?9SmҪ,צ1R`btʹzI+i~J hA Uމ~90a?m@D=$@ٲF80)92moB~]t*׈PAۊ E ب\IsjEEC L~jGfjE-7l+i\@3Wڶo;ɢI>$zJ4OW/`*xئfa?.GQw/E\O'̓ zVԷE"Ӵ{;0WuEZL:hH3+j7uvGC`2a j/6Ǹ\i="EŎc},~EyDS*k;h9 Xxu?䧫umʿٮuE5ho9gځ}۩[A❑ܢe ];dSn ps.Mޠ}Oڒuo'_ 񝷩;õ5_%ɨYX_]h]qJ/E L.Q\b*a7XI|*$0X2;xEha.dLQhQ"1%Sז VH!bZ=Z16Wpʣ7MJ.@5,hC;T r=$9HҲQ%R6ֹteʠZ\f]^k NYܪ$e0; DrKvb_bͻ $+渃 dnphš\ q90DWp˺nhꭾj9t2\:3|rW\&kw\S.fT/)0ho6*-g9{ nD?hZѭ ԽSu` (v.#PPVnFK?sa9䤀>yOd4u8DO.hիP2V|:1M\*$!>x 6][Ք$w_i_?Mȹ.-: *\A 4cNԌx.w/aژ6f:˹!v= V5tŹW!IR]|~4û ɒYaۜy0k%_ ;Ҧ<ػ>:bY<Ӿv{O/xo~7navit-0.5.0+dfsg.1/navit/xpm/country_SB.svgz000066400000000000000000000010511264204753600206500ustar00rootroot000000000000003(zHcountry_SB.svgTo0xs/NBDЪ8V]zUF d $L.y7*&lB T6Qi"1QaCϵh-LJ7DRפsa94 Nuʹv ~~gkٿ@l2 GLލݺX^&o{dzu!,'`ML-V7#F};gtQ>ת-Y#K)PGz0/LB.ebz>m znV;)9N(I`HЉM`l>Jm3'{=0ltql=zο̟ FA pnnavit-0.5.0+dfsg.1/navit/xpm/country_SC.svgz000066400000000000000000000004161264204753600206550ustar00rootroot000000000000001(zHcountry_SC.svgmбn0w8]DqujnP0تkPbu,VdtOS]&5iBmLf9Nӽ_v<2K\ eD|q㬕*ӺYE#Z+9D /QuЁU ńAIcc%v/9A;:5',mIk[,m;҂`E2jMrRYei0M.~~!navit-0.5.0+dfsg.1/navit/xpm/country_SD.svgz000066400000000000000000000003511264204753600206540ustar00rootroot000000000000005(zHcountry_SD.svgAj0E90ݺX6nJ XʌܾJiVgfw>X4{aUIyvϯs{]Qݠ<*}o|Ə.NFL**E~ݻ]}UOnavit-0.5.0+dfsg.1/navit/xpm/country_SE.svgz000066400000000000000000000004011264204753600206510ustar00rootroot00000000000000:(zHcountry_SE.svg}MK1t\=|ݼ٭FLazf=]t]8)%zι)S?]^&~}uxq{oe/zn7w;b/7Oۯ۷gl3gopw}߻÷}uo}Ŝw民X{xGQp+n/o# 6/oy_KޯכWw7;y~|X5>|x[:ElO]|sObMԖq1E_R׻EB|٭vmѹOK~ZL(Vڑ𻻇g݄O0t kՆ8>eξ?^Yt?R1Ox|G6gQywzhD{nfsxɋjl1{$޾8ڬ:QJsT'mPiS̙9Ԛ?9"gP.J?WG!߽;|rC-o\vM$[8iiuN@)h$RRcYJghTj8j(ybSyDa NQjmRXr䐷~l!r/i,mv9Tfޭcyn)'Nqԛ>1Y\?(+ z%W*k{:z~fwXFI1rjb0'ߛ*&W-d&P-+Y()WB{IB`DJbCVJ[s\Aa0Db,񙔎LS Q$Bt˱OJ' ʇ_DeV/Kդ/")ɓ>p\ ұOIUq8STU̡tuеJ/%Ns\Ӗm*YMfo:[Tx$"$ ''tHI aʫ&%KөtvȎMj>2۽sޙԉ(+hX#8zӫV˖@ز*&i"[H!邞$WQ>5vԪ4IJth$*%Y r9S(M YH1gm,;Wpvrzۼ$>-"N 1s5кLV /s1q1m^I"d" Y9c鱙K!\+o/gλE)W:њpɠԓxŞ$+.nl'v75 eM'-8iՐk&P]M+p}*JEjmz) j(&{^KMҫNЬPs$-dQP9 PţLۣ`&TԘGz XW^` N.pJ#NH9NG!_eS_to4hQA1!uR=6ZVY[s/p7dH&RWE_JF-Ƙs) )iQ&*%X.s[N@+\]8U<TC=C W -H@}sse-f[R#jKXFm5bFV2bI}DnV"yJ$L/PeT\ׄ>*>/>kfu8V ۅ9P-Û=xoһ`1-p JT$~L'T$="4 Q0.D=%$tR'PI|@qB .E[I! yiJEPڣsX1De,  j QiR@%ZAjRY(.FԭPP@erh!S}blR%ve/m M ^I%,@y&)#ʎezk\$H@K!F/wi%#聴ULj G 1k2ז9i X8$VaA >M+&ten.da(u:90䌩PZ<5K pD3)#͓GTb/L{!$(jA8|I4`)4ǣRЃGnn$$Z(V!Ȫ.bwk3~ T_ Gr899).ua?I-ǡ9lup (Xc`$&9.: eu\\A;/v4cb؏r)I"5EdVoBTe"#|͚!rE偭|Ognu%t|ds[h>4$ɍNX:^R A X[mpTV[p{@9`NL[|4pD;49CE+š^7@4HSUhaBϵ^Yt }()h +yl1v+e-WVtͽzGn+hEjO2չ[wȆAcs LG?V¡T ,O T7&sF$Ʋb3q,PHe}1$(/=؊RHlS뗁JӺKC)H|Plv f9A?jĈj\`큑75ϑe1d ;KrO$2!4\1n/Iݻjb8^) ߵDK|'?K,70ᚳ`Us=,ۣjU{M"$!ږR+NMQƄ W ںDZ*~,Zq7I~$1jX`#MW_uZ+JW&"{xQ`&īS7Lr^>(yno>kA^``\s|UR,.)8R#<#&^֏f OD uS=@>ťdF՞לj䅠d9fGJ7HkN;⊎WУ0jo*v^Ca=4 2na"6_ i7oz) 7|)u0h(/䪽3*@3O3‹&Foid(%ᡗA#C!{'Y%NvԬ5 ׶׉277uvNeì+dY6 Ewm};-c]ʹ USjGŰF5'cj%-b^;@XRaؾ>d%^_<] $oD1=7]eubex <6%`I8cEr$>3ѧ^z35.]jm)w/M€BJ8-VMRń&Ioo‚]vAq2Gq@DzJRfU P} }R^)%8Uhۥ[+l$&Woeٙw1ocȺ[%(TaZ b=Y`f>ᄎB{4P."˿!pv`HϊXD'p,,\6Mu s9ql(1Pknٜ͜%-t\PN򝅨AqmG<&utTMwNi;_>긣 1Yl#IiU!nSh2+NV|Khw3||>E{NyኛQtd {z9R̚--=T&ޘu{s#'#W/Va 6`tDb0&Øj O43x_J>P-T 7_Y 0O as[c΃Lލ`NuHM}?]~A,4[q2Ӱ\Z-c4  =p~-rLAʷ}gw튉^"W![:|f=ڥ'W/# Hz o~8&aGx@DzA_9Ŀy_]9 7dƠD[䱹- bway }>*77ᦢ0ZsYOI^&5 \qhCe0`eǷ@b¼iq^= PQӏ ӄEPDѨyGhxlIS|_YH]EǏEFGoumn ǑMˏ+ jHO^ԋMJ3v F6)66i 7Kn%A KC^qp<&( )~u%:/կoo.W«AaJcƠ/[=%b+00S2x|./䗇!ps8$60 8UtYl!f/nOOBW S-)rJdk$xڼ:/KvbPfxGiqPxrhC%J邵Jsc[[I}3CXaƓK"mb<|X('M;" *;їPvoF˰ -=sGǑ)pe._Y`uR 7<G):΍?t$O=f>l.ae:%CTyȗ_M#\J0#taO(_U9S՝qky-AGhQOh?D[vax] {ؼc 0/ahb{vpDd.S-eV3j $϶`A C=ކa|YnF7~ci2i$~oN DXCĶ.>0djE+ف36Ƿ$~ }XJ<.87q"CjZ#c=.L䬗zHo@tk3e T?\76VW;;h'w_4[[#DF ?|[&}BT1\fOTiCrdvT -@x\+]9{Emϔ|6ˆp83ƏiǚaLO3]#E,/5r+e"'@߱*+J:Y[mD7M)!ȀYT< ?lv=Is',FdɟDZ(oirfTZ.- Go|MYnD=cH"tk,ߓfJY٭}rvt_3x4qKS"cU<+Y w4<-SI7PC„Rkō56D[K{qg&{*G)Ql' ư"j M +hS퐴`QV?1f16"nʷY^m< 6RRC"#r=bw8he=d$PCoq1H_%B?nm/4Z2yZcmէ!J3;HJ<0&}`}:2,$e:䀋T]4V^Fpk 3.h`z'7?M4ctF=⼬.MLiwMWa*T IH6@Spb]tDڊh#="YA.t}>2W3/!q%e @zb #.6]+shyJ.Uk[bʚIch]/a5v:\.sXLg#-!S> tR-zYH1. 9q9.mY,#wgі6sۆ?$@ݡяAc@xhb.RumNBm5.F}95G]8|m({ UHA.9a('`Q1]蕭&Ⱥ6!k$PW19:|`[}wkfTfZ 8 *U8 _yU* l[s3cԓ˘o#^1TV{ձ]^h[iO$ҸBuz.V| Ȁ(2f %׬(b8ў>#wŤ]WIrX\t*\~#vO06pP/'G=+lai*O|)+=6vjF!8.vg@97.sD}pAAȽW\U;.=5Cqrl(yqhf.ׂDCEO)y<;9߳.h0OIr:mUGav6tk[(99\^,m r@-ǚtQܚC9n@j* :8=aM)Kq+?iҍYąfSa\iTis]ЩfZ0 Hä|[O4|$}PƨaXcpPp̍YpInyq2EVO>- IcO9fAF>Or$sM]j;&\iƤ6vmƂ+sjIƧ:#mV>F ) 7Y7eIS & C3E8_]/-JUGBJ3BZ0-Tݙ`f'TƫKyx8 %t pe;G !7a'+ޡa6!:37S:$gĉ 0$ gXwF'Y) ,cC[\P>@Z\iVMnQ^E!*f+;QT#h'iJhUhUu36ݖz;+a5s_SSH$lyjAh0B9xfY:x HiSUN+ f\9^cjGi" KԵ@qв̙OXu1,5r_c"0\dk?"rFRyԘuWlq}7N{ą/ip_tijsq;Н $2skZƲ@ ?`殜33 zFfft|jHc4Qu=I09}^Oip'CySjțRԕipG㨼<+%2Y©@$u;HpRwՎVZ18Y1c*.9LwLl~  n祫7F;Vd =ڱ$IJy~;὜tx9/_}M\*<{M;uy#uj<~ q)9Ʒ1ܚD5VY;`1y2%=)J-SS2:0]qPiȟZS&17?USmQb!^7v1,i>X$=d)cC"}QE&a\x f8%{#+mZ~"$批Jb羵3JeѾl 15Ǒ{ulTOVmfx߰Эzt!`J:r` 9ޕ+3hrs?2* k!#g҅*lq/[G5_vkTfҵf*{ \K)_*lީPŔQs6hó<-XOh!,28SdlTslXSY=Qة{#lZۯDJl}傩EL,ԷU;9p5 r Lč`2J)Hַ 0bt5ix*նIPyҲR:o ^6t02(Zks @!^vHԾ.`EЫbbU ~O'vׯVJ-l 90z|.ePmDg?3ǢTiٮ2WqTqcLnK /2ϥI@!kYrl?dVȭettS0b,v{cf"jݹ]-gǡ1MvX(/=hmG(Ld~T & H-8fٺzrR22YKŅ9ެrGZ`S:|r8W#P͋]X]cVEMz[?XbamDy@b}:dmNU~bΩ?oݵDl1xv|6k E0/tzYq7KҸ#mi@fnnUU_)0IjY({T0,=PYuq(iDrL/%ǽ葜IdLMoL=y4 j7V~潢K=m0Zo!,1Q^& ,+6"1XRqfPyw7q Q , ?`d_`~[_=k\Z6PEadkL9E.9>` `S8e־aܥ (`>F1+B -8dMt0m|g˵O´N?0݊sr#T]Pffw5.cUR0uL}Ԣ7veg ,,~B]E}dwM4߉&,>K@Ym"6pV4Hvt[Um,>ca#V<ۍS3'eإi8 I/pj)<7*;:0)~[ V{)#X)Vo$RqF?PWĨ&U(bfō*njvv|;I^ti Ldj풖Uemޫzj6.fD ,?󷉺OW>RyCHlEKé<rP*PLn M\H4F.<XBHʙmiD%77JzLRByxfA7ؽ2jGyLx\7 P& LCF= ݷZ1EWYsY6_;6y3\0ҼDe`3)9'b+ 1}JpzkrAVYDÀJ~~_8u5 v:]1igtʜLpu.tcIt^V,1[͙O6Vw=^^{@%U߳g5͏nN1<:4^Fy)ټQ+axgMnHPiKY6l|[#%m'$;A|{#]"UÖJuRqDYmhYzSn8*.@uҵ8]L3Q::-[+=z?PFtX$!kr'IdK 8,^N%*J(JB};U, 1n_O1s½4ڦ&)F4#bv0TN;iJ j=4tlenc wٝR=Nc{"7Zv=gXR gO#OvڒގB"]+:]+i,U8ϛaŷX$Prʟ:?&/u$'Ĭu=-7,'3yN5#٨$B㼠7FHG^GH`cm #^rNQz9[N %[)6]rMcFIK%,dn2g]ԏIJ$vθ8gÑ6;yA /|E>弎/GۀA6,bE$s|x'M dp&2s>>ŖX@T~x}/lA X[?N 8T^WIPEoDT}c\Q3nMJ%d瞘q Jq8̨̎V.X>/D5Փ40I6*d:=&;jRHoM{E<~]}]Fg?Q@Q1X,Ε ɿiFQpV.ȩ)u}+ ~!2D_-5 t Y"1<䰹.]ixB1ޝB.Ig"Ug^T"3i1>"(Md5/E?O O05'y}]W[@tO,?xPBGkbG;'J3-#ŋ<)hoǡ08nu\_(,*FdE]8x~.*VvJ25/3_d; *Q[xQVw&ebik|^sUeÜo'[FDF~4ӾX7wgO2w}*ȻC[@c|`7?eu¯ ,H#cHvA2ƓmOqh!aZS8eKcFG @%*չDܵ'Ľo+TyTgN0ZI{ U /Ɵ+pJʰtɩ Y+ɉu?g]0Gʧz-El(0jߎz|&AWR['/sZ ue <)gNj7M՘]8{URyTACfcd]$Wb% ^PT=vfYa1Q5Xӣ n}gLj;cE^aYQ;;8JTi<[p16ycF%ami5!WJMVls|q:V$s~GJQ;(hD1Ik)Jٌ,^(Y6`:ݨ(ױw@bvTޚgvEac|ͩYD#Pg SY" Nz#2^|8K rIJJ^"RC2qG˛ۭԝ3 crҿgc"{bU3bN}&JwDxkGk:p:3 (}/cg<<W+[a8h1D?KCPd GQ HKPFB_nm&Js =՜M/([/oM{%h)(j#$̩I&2S/L3,ۑU-VAAʺ!06Q6K'a0{YubZv4Yػ@"̋]zMA*Z|+^ܣ^ ~`z\Dr|91 KCۜG^|-سλj~0rIB@c"xp+ kW8DUhH@Dq9'7t`5簫JYڬ>4oY7|M|HAME('( ~Y0oLkvb2Y{}+~֐&WymQ]_\)_V{`vB'VW(eVvPMFVк!06خelG8tB%c[joF Q dLHVG[YIdU ݓnU-Hgs*H>)UdըG|["H:I')Dۺ6c =jˠ/쭅0@`FwnsquQ¨gSx­I-=Z9LBΈrbR2GS1ِǤQ+6/HLY9:]w7!Fц>;" 9jd~K<4qČz!j$6]u Ug.nefv6&?WTvfc%5 'a,kո&ԹdQcYD]֫ΒQuϟE#R!V!V1P Ը7S>8RUeZ G@5 ʍ dU WvAAYUfy<K2Ҝa8׊K/ -L'CІvc@$bY%2"PdR =Ƃ!3YUM^,fʗ!|1 +]`2mF6'2H%G?8*i?Ο3>(% P>q$Ta|7AypQbin9DQmy<vtD/Ɍh>ŚGkĮ9hM>3Ljj_9؏1@(X}^RQR6+5ql 5g]BՀ/zu[dem3t|V~`N7>8B%}x#xP@y8v\IXӤF3ćlY 0b`#1ʃ7(ղ7QariOv$|tY\A8]m  _@V!]7Ak#N2D5 +7$BDH: LH"ޗҮ_FWoApjY*s[!Dcxo5>H}df_^W:}& Ex=K @ʄrsApH"5_bl6T E^pV[37APƯ9T{Bdq=AجwD嚝Zqe&]K{Z@7NKF grBuBp(<!~c@ W~Edm٩!X ˘ƒc\8'N{MNCA= OF1ʄ !a4F nDJ$R\)C8zU,7U\OSppK=O˘B0&X=7=}U ua+?$\NyЅtp1t LbV-س_ޕ+]%H gCؕJUjْx\z\VbEuxUUe*-Fn}0  !yAVk1h Y&d̮p`/66Kx!Rtybguac䕟;AVpQ ; .sUrt>*Ka MG-|a_vF?~crX*rtWN$7RCt_n +Lv؈{a7@ s`pެ7B^zIB2˗vusP%>ĩWNLC+ʍpϵGvs#h%:ak2a k:wW~(_wΒ0J+7:M`Ӂ71aWntn?p UR-W~(uzv?Yڕ: Dt>EכNUmছ:pm~F?Z=GߟF+}ЋҮ(S)`r!Wk@GMx:|c?EiW^IWa"<3)}ЋҮ(FF։lw窯Ժ_t Z !qpݯܕe =W֕;A/J +Vrt 饲7H>Ei2n2!|~ЋҮ(`XU^nrfd:fRNZ~Ѕ1D'wӮw\<2ptWnt;ʇR)Os?CiRRHKo~pk"%b.OZotc d8Wnt_7Q6#0aǾroruN_ !q6K(ꉉ9ʍ~p]%ۛnbt2F?,@f֒_nt9YF]V2'}2Y?AQƞ˃K(۝_V&$@m\0}6rlۓLbC"ܝpǕm_SΊ,ha侏uF?)E ~F?!7bm~yۥfcs2n`']Ie zhkzOz<*A __n+JoW_qߚ֘"v FFF_yO 8,i"!?=WrQcf?ޓ~=9d1ߙ(zGK!9k~F?ƕdlC&pկAɸLy%Q+7:>q2dpd\yO|% N9zDx.pph;leyF?鮼'kT~/'&K0J#)čfFţcGÊ0XkΪ Ai\vG@:'y* @RqH,aT3./PɰO(6#Gc8o;à:F&v?4Ƣ(k7ӁקߘkfX;"oPR|g<͔Tk`FG+z;5rBܼHyA;~tgՍKc\O]H ZShONM8jV#2'?hTpWkS+ɘ?#T‚FY%HDZTT*yl JtVu|,up*T+sB+8ɫ8Rv_}<> (ɉz°Y`2=3mc:q y$źԴB_(G KpەC*? `LgpO0SPfJ'^Gj:u +0}|΂NFVVyʮ|vA,Ӳڹձ7Gd+ޥg@ duz%)X;,G FƠ^C MJWZc咐 ;]ƌ7 jKQi'YTeIfyJP/ե*)NXnePo`EԜ`@&,i/Y&{YqzK_YEtd*2tt N y$ye0F;ZNJB|`dv#] .)W"%KŜ L7fp,TV ҠU0JG9]XI4%ɍBђ\o C&P. QiDhpgx#GFr]nӣEVrh!6*shS?uUAMIYX!vsUxG2n-#2[sޙK_f/*0c{UaR^(i(8[\VM8)l'ZC q LCmjY19fŚ]J(/^VTnVpbTqЬ6fy䅯*ψ9<Pg029iVҤ&J'qgMO<۷QܚwN覕6* Q.4*Tw4ӠQ3[;K9v=STRV)!e*f-b>NGoc51Ac@b؞YxH(\nWUZR읰y(UΘ躞[m!Ȫ˴]gO-Рj㰿P,e2d;Eo:;s9X$aVKrr-H3Yw2I Pzݗ5kGQC8挪Lg#LjF]=qgfL]q {SzK[4CLST.+wME)V׊:;qk> Ǽ$o%rVخ4\'N0/J*{+gJU<ǭY M%cij>?&tEq<-F|AGn 铳ti%TV =7b#=zS=A;ŭjq5QFٴ\+'`WUPsJY.Vhjwٍ;3?(uVP|w]!à kTڒwaaO4=ŭ*K|a:L +~"DR%LUOt@3a艮Ԛ:qk_ =ɺY!TCBJ6DhijfluZJ.Mg뫂-D'?إt%eR݇Ջ!WKu oB%3z3w1ZީgT<'n8ʅFK)+82~"bt1 j6e*e3tɉ%K4xuSNa1V z82:ٜ Uk FtBs^\> \-hl\U_MȊ!+6o˶h]ݻ (&{hY2m؍Su=@zn֫]ʷ]tg1mXO?TuMaA 2mr=e+eW2D(Eu3)X,Qm%`k,%KefQ9@+Pp=$rgN KS:9I6_rwbO}Z[rID$(.^,:z\Vi M8 ߈%e̬~l` nìkWoȉԬ4&\RS/ &i ;`%dNkcAhgMRdv66~)H++ L;pR6&d[E0OV5vPk}Im<bvfq`mQxEe}DB|tzϣK@=QiexѶF-0ôwк͵ejM~ ڤoE\=3ya1Q-;*+g׷f6suMmSm^sh!3Nhy[!Ary>q7[&Ox!:m+X'F!ҷ mV:+r18>{"HقU |m 'J05[{#PsLBg&`S }CnCِ0ĦԴ<7=4BPucR L6E.Hw0D:_8ZZK}JjhV9 U *ʅPCn4k+mt#T:_[@ypMRFNۻ٥o7g#!eLZ^%ڷnD/HhGC^$3-a>KB KB):̈6o+tSt,%֕}~SU*94 X&$`*0li'xP߼Ra>P\K}K! Vɢ/e`Pzz}JtƚˍzKRWhTJq%'ր7e B[sAz;2Ǵ@E]eM%V;m" }lgO^+"`acHs90ҎL4)> T`\aJM%k' A&զ±ĉrF&@\5IrMY8a~So N9:v ˊzXuv9p&jRׇvHǕt%͠ h=ey\cЄq -P%0wՑ`;Frb;2 JRl3s4N>HLfqT=YP(&0 fb1wZ;7V6haJOŸwNgO@\w6 cR7 6D_ʶjQ7"؟YMP0x%rǩ>nRmt‰ahl>u0NΝGێ'vܑFA89jk0я;:5R*mn)`(}E;,ԏsODL#EZ!i!%K]/jOwTp<7S. )+{vI,K)'h7vϙ*;PngX# Z&u3 d`|bW!iJЊqWS39JqG?h~nu }):hs0u`fSYSǠ]JoLm%.Țҏ+Ns!' ÷`f~0wp;mEak>Cu&Gќ4q5Ki01!ߠ!bf<@ἴR4-MjfM~e2sfdl`j3wىU2}dCx!/xW gԝEdHnL[S9-qKtpag*D· .QV ' kٰAy"iQEd'3A'}9Jo}2haݺV\El)ͅ0>JsJ 9m^\W8(yWb

{lZzx%ejҭjA_,DO}g6Qfϖd|;Whs;x0٢so QֱW,`nmZPcwT61k'dR'j塥>bRN`@+Ef-JHԤ 5oIYʰ Z~h5j}n֡[I5"HomQDbMRv U2-v@PJ1uF)}T!UTbZAt:6] 18a&{(!F훳'۫rLEf󿏙/GVvE8^{='ߔ$VFڣ(ǟ64LZ{ eȮO]s)w +Rp?v1jVw5Բs$9R+9m U2Lu6ԅAԒeR(D%uy4IԘ0X$VCIBrJ_Ͽj ^i"}N}rQkZF/r:],)/7诧#־YcY19;Vki'8p%>ޙwO+FɌI} H{)cݝC>_&d?q*-'1pի(=mM{z٣tX́OXz J^dUzżY_(a7Ul2Mptm3ywY~4Z9}1aن/d!^'u (S2ު2fTLX[Om=) cdRm%j;CťjINs}=`5~‰.J7i+k.19Srn7DfN̯-֑ÜC=qvaf=4!)4ԀTNdÌ=?8X"UI}sAq32wΨ6a.t pT@qdcg&tWU*D߽̅Ҽ*6Wn]BFѤ:ݦk錊yHT߻&K/,!S0ȕ^, Kf3FßуQA:Gfnxkj`e)qmDPXn;L24GU55'%Cʊىdơ5zGN:28G.csu/,T .GA?y`GF,P®m P pyoN\,3T}] HZsXe6.WAfSK/ tdAw_>ĭ[ JfEtJ4XZw}]c4cDr%PV-aܗĢP%ya9~y!"_i\0NYr{-Ps #o*)5S/V4cRQ]tr!=28izB?<ڊ=U0]ެ bgXs'!#'JU}PxG߹*nlSu eѢgf [hZϲq4UL].(!)"=1ӝo fҖY_P*#V·]m `l. r"Ȟq>.oBP~KtG CVbFŒ!t%=}aS+*@Fm$Z䁏Odi/9Λ#2t㐾;¶'ox`1BvrPAP;e N26q(ObAg3X&ўg*6\ 7qK[hx*#2b`&ngK;bNJ(uA"-3>AnVPLO 틐bMFQT^ ##I|ij mBvGeW<\o]?WRHkynw#轚,ˍ혉&BXcr<^`z!ޱnoJ# h"=ޗ>,Og$HKIz׹ lw8g*ܾICkA*Ņo-yXY˽Y N7QJ 39m/@a Sz[|ow^u"LS.L3x5fqwxYܪ 3h| c*z2OUfQ`*K)@Ե2&&XZYݲ-*ߔ?s8ĝQwE`ZJ>$ːo:F7)ׇzm'7\R̓7n sA exq]m3s]LkmU]۠u-x|!!n ,ILKŖeᜥbѓ#]ar &^O?qcy)~hFA+ ;H˾Ki.n68Of{k'c}YӮ&&VZH?Мy ,uC矸5VM"( \[z7#)>òW%$6feǚ ErK,;^v]*9 AXdA! a,js}(QW(g7+iļj~Gs>=ψWD7+*ڵd,Ċ\]p.\6^4é2k;#< Vx>:M긷Fǯ5-~\Wd,{390cGfoRBv^(E: E %/J-DTj+a*InUHN0P\,T ^0^mE.@zbeBV1{ U*jLkr Q`+0΁=a}ݐ>H@x{6 *c z: B<@\P Dmcq3P+>1(~Ne8 pZ9#gZra ?#w1{iqx'ޗl*uP@W©ưe3 TN43mqsom2a h/޶̏хS3v xh]c. \S[;:$-tJH|ZSs{k/ 69F䕚F"ROJJ03d%>1sJxXGC閌.]ONhm*0 S7IW^CS|w! 58+)*o0eZ}A/]XrGu0*ڕgM$O@o~*D?CO?qoי?\z13bpBƒELZES$^7Fe*%oBtԝ,[;1'3mhauC vO1N(:sg|-SN|mDEqIV +\֖2;;jd'45~GMd7m;Nb?ǿ_pY( |H7?H$RM?u#&y' k_M2ߛ%kRnz=JE |b?U᜻޿a?/Znavit-0.5.0+dfsg.1/navit/xpm/country_SI.svgz000066400000000000000000000054531264204753600206710ustar00rootroot000000000000003(zHcountry_SI.svgYMo7W^@j*~(sm%Di~_vk$V>XSÏ⫪W۟~r7z}/w?nz>\{_v?ϧaqz=L~pxxems|w4a | ^Ȇ|[Frpeoo>~ܽ\4t{wwO ؎v=|?>~_#//I_> X)4ϼ( F%(0ً0ќ(0$6?O9'*<#΂sQؖ,3>g> D3 IeNlcšfΗx XetrYB S<$Bgy"6l^Uk}D8G3i؇f+㜜y𝒟C3R sT0PʳLq%<@L2G!H},|fDK5sR'{b\qJDT8,88Rt-ugʈ+dL)2!H$eDƧ[ OyʰOM4-G. GB1 GԘ`'O7FPvZ@;- + \gsJD|uO8: =I.zUZT$UhOY(+ [[h (׉ D^ =EͫioŏgJZJ2~eL}+[$>}ߟ̐}|!vm p{@T,0n|GRIxL!z|%-:Ts]m8̸L!XN $-;/[mqxrtyDQ/Cl,  8agH))Ni풤KiO=H$W% ҹؾki/E.ԏvXZ4U=04˪fsP~*)|vYJ.f$|U͸6d4H%sB9GL+ǵrC e8"QઍkXT:V ٧Z)1.Ş#BJq%F|"8Ybty  V:"ab^ڀsv! E8@G.6ZQn$ŷ.ˍu{KcgZbnE<YnJW5@R$mtM9YΟ6[A] +冫$lR |9c&n͊+^!k}!;Chz 40e؀\3JX*W \ACa#%SЋ h "g0UV)k3Ij6T-6 iZ*1 i8tAAfn ]d 99ii@^I"f *Xl[:9(o#nEN*hj ϯlů=L:oQ]_nkz XiIXw@qns8 C8a׸M+>cC cX>G13 3%u8$~r'm\5?q@)ٱ6)8PFe}&t,3t*navit-0.5.0+dfsg.1/navit/xpm/country_SK.svgz000066400000000000000000000033571264204753600206740ustar00rootroot000000000000002(zHcountry_SK.svgXMs7 Wl/͌DXL3ӓ{kk˲Z[Ȋ+re'OICȷ$黏7b{ڬ-6r^ۿ}*ms;__l֋y޴޾:Xj3Lnw7;9y||4l֞[ۯ檑" <.w6nzX-w6o66tؕ +t]nn/WWWˤp%*Z'R4O^,8rwׇ&%#O5Ky$2)TKh3>:$q6M"D_3; 9Bօ  d Y&-$G&Er~BQL6^qM(a煛$eO FM `'`S#] R&b 9or΁+ź[ղ,82v`"ё%np#ʹ.;to0T46ܐD.aaZߗ-ťb7v"` D(H&CYcsVB2xia P %+z|nz> j3 {b4np-vbF؏3zqq~7nYgb{@zVɩm_vޞﶫj ~x/`0y=$>Ԃ"ףÎS O8לU0l2⨐!I,%xoi2L ܼP o$D]@ -J '^ҢM3S?jNe=߻?@$ O)#);EB3&3dosr,=lqnI38dd)r,q@BAxSdxEMhY#MsRk#!u7@xEeMg.DhneL}򃑜F! V.Qu+iz+VZ n0g{?hRءx(ih^F($AF vH(zf<*23z8RIlpmD >”-/4`J+Y 68S +G"4 H:gR4 "Mr}<\_e8j0a`J<{_?#GT گRZ`5YzU YRGo%bF, `%} $'ˠ(|tWTe ~Fوrx *sFmNv{ίf vdg\R FEYrIQDFnۋϕ %d-<@8\e?#B9ՀP6NU ^H&x*{^ eA=CkC'e#_ܽ,<(xRfbŊ3-ԯHZ!jG5V߰B{+ ;Y GNTrLr74bd~I[)v ,I17v//g!xPE.R_I;`c+p_v?ӀG[Q P}>g)'V0$[03.ƪXǺ.)P'h^$!wDvܩץ=ERmm(}.襶DAKc!Y̚h⌦!Ft !'!R`( Qbbw~p>ɩ'M>Lao:n+navit-0.5.0+dfsg.1/navit/xpm/country_SL.svgz000066400000000000000000000003121264204753600206610ustar00rootroot000000000000002(zHcountry_SL.svg Ͻ yf5'jyu. 0ɻ9kyޟy`҄bjz9˹]YSF3 @SG9 sc} g@^NPX!V0Ʌ!a`WnR) qz:?x&FZm h귊mvܼlɛ? AL#navit-0.5.0+dfsg.1/navit/xpm/country_SM.svgz000066400000000000000000000577641264204753600207110ustar00rootroot00000000000000/(zHcountry_SM.svgͽ˒m%8cObKx?A()JI$V*}8'"toMFbp8o _=}ۯ:WOO?|oۿ<==7o?7_-ꇿ)kӧ ۯFП?~ L(~_˿?}_ïs?Wgco[_W_Ϸ_ӟ~07ßw?oϿ?}o|{k_0W#Y~;9?|a:3%_sW~ֹVwޟӓRlmSbm;qSlm6NǕw*ܣ]ک6AW\bw3 >bSZFjWݩ[|8pXm3pPO}m6>A_d9MZ{7k)l-լ5c;#B!{ v׿7׿o+?7~ͫaSi>ӧTҞk9UfOgsa-ߩFyTYØdVF'{t{VdRTfWAbT2;_g@Jԝf[$k-Mپ헳}ex\<e}W0+6OYPٺ.ṵm\[sêawGf߆ͭ>iپokcMVaF̎1Q0p!sfM'sm{uAoҔNZe c]ߣL'ϐʠF ;hzg} ei`Z\\.]ssѝ<,;_khI۳qakq.IqPIvD ;6ڳ m5>t1GDUܹK`_c~䖸0y4.YM P 1fA{Ya\u^aW )0zoaݱ=΁v~>Av*Wܢ_6pN.vڠH1=`⁘AwUJqzk#NVl}xsyS;4V,6<4ٌY(`PE#ZQL(ҍ&Ai)#6eOG+دόcf߷-+xg;@N-߈vwk=8g&<5P6&资J5FO8p/aZ$%N F9cD𡜄?+PjOP> e}y1!l{U+}# Qs* B=Jh%y`REYzP1}6teBIxolj>G$LI6-R*EcԚ}zMps(Fqiw]>1Erǘ!븕 K :K@%#s% H$&ԃ3CkB~a5D2o* [Cۧ+0]O16.CJs~~s6!^SBH ʇ!;GJ8.%_imZHo 5:U}m qU/mVr nDvI)&=dR¦q[h&bq&ePm;Uiŗn BD8a1e#4P7i}lψMPd l7\R,}ه7%5,t>. 25|JƾЇfƹYn=⊽R_cSzQ_2fnbW1{5?fSkſwпNM-w +fD'F~2SUΝ`و^)Sb|qJ7w7tzT_Q l;i|Fi<(7kVF@ tpf '(xϖsK<0_5z<B  3'e+uTvlUDSXi.I 2dU6&մؼ%Pcr}uj~.d9y bm!"sA~V]Eb#wa9n~ YRcV8wgMf#{XnƋ G#"%rC YIqL|oR%|DQ4oBSPbSmVe㭘yrG9xf78pIщUV_"eSR\Yyz"otuy%Yř6;#ʳlG˸OZ9WJd8{͕g2P+"5JV5xx49 E%?-IoQ \,>^wGNGmc05f|q};gRhg!Y1ip]ܥ̡mL 0bƽ 75;`ctimYP+]R, Jum>kJT&^BzGSh$Q}D-ͯxa]L %%y96M+hxzoBC}9>Haoh? h,LNh&Hl#5Y3 :L=@tajE j66b4H'f6{Nf(2KYiNM?GZXOʅ4#V]u^͛*כƺ6cr!)Am#<&7dq5v\sJ-w:p2Mj׵74P%ywt)G?o>d(B\S^ Mu uNuAQ *da XK @#gƌ[G o4\B% ?Mٕm@Guu~3ɧTecDݴ^bOe<-f\313:N-6B'7jEx^#Gj/׆NZmօ'p  J ̸k7*]5|_\|}_^Mϳ(BȈGzy4<{aSڟIe>OW;^&9bZ6'7҉< !E =ޖ N&NfFpl {* wi2l } g0t)V']-31̾?e#%[cogl^`vz1vyjKv-D27ߖ ?&\cRvG*Td{ ƒDpC,6E־P-.x&S[Dsfl]s\o6m@x Yר*Z"#ZcSůqy85:b) !_bW`-D E>m;Wc??=!x'hIUF_}좋ҏWfY`$ 3PXO0DdMy3Sen039-lm8ڣ)-bWA1~)øb edϞ5 娑ҐH_򭄷.!9(- ȉe@ټb,YaAڑCkK9[/;Ū4z] 늧[4dgzL],g*V-@E [ApP]3 ]66;dvͨ:o AL8cx(~8hpP4Aь"c%FX$V3os s%0F4$H+VU0ԡ'j\y@Ϲ=1~+3ojrILR*W3 93=vx!k}JjRYc"/MT*f"0a'l >% 4>F p`6% _0(;~8{ԉmP@.26W2P  l1s`hm8@QI \r?BLkԍX7ez MHIt*6Xp9@yPQzKLU^l>_TȤI(f2hpEWȎBi)\jԘn!y|ՉYb k펍|2 cU4Ih<2T`,KDQ…T5$U g6bɰ x<*`͇ s+BW8A7r8c\dAa;` vSb}1YDbkr`A\W74 Y1}iU#醌>ݵ!zu殩Rb> RD}864Uk(rT]R tw˂W<cC6 RH۵JzMPo%:MM34 qv%Pgr3$51P.dj.+`uñS`AQRhBuw@fJ}!h{o>f(N52R`CI o>f(B:iuRV'"/' %^HBTjkyH%J .tǴk)1C .Rl'W$w~ *k>ζГg2WMMׇM?7b3%vrHO%=v< 3o>f(2g`.#Q5&-2cB#4)Єx@2W1CnXw\#&mhhfL  U&֫BpD)k.9klƓO_x̐`F_s\ci?7VnBƱ 2T%G1rϙVcY. x@]рKT1ydl㴧Hl%jN>f`3iBS*T8>Jp'\3f(<(r{60>T!9g/jV|Vɍ^OU=ty}ݧ& ep]O;L>Oq\p/4}84&/"zhN&RHd}8G 1뉆S@ 7t_l9& \b79eg3Ξ.4rѥL54ZlnNk粱$m=3cL?qr >ŕx>g>ц"<߇`'$.%D\}8/VsvAq<=g-6H П 듆\ʍhZA \l T)Lͤ󏙏 %VtË =Ñ#W\aGq \jPOW'~!.ed_}l9 Fw@sa߬ OQMBV>y5H0W N!Mg&j;h :TWȃ.{vt@j1zc;F;^ qax@}YZ؁ݥnF)zA x Qrbb:m%:FWhpIT7V3ȅ+(ISRB `!p1{^"3-fJ-/tւ֑6r]wܒGt"EN$fo T;S&7BAţt:|tv1AR*73Dfx PCr.؞Vi)]pN9,=Aw`ɫVed6f cV뼦C,pߴna5ۡuT'=Vxر'0!e^5YTz aZ-Mqq=Ob֑&6Bd*$r)s+j.kvbsg%DSrPחq0KB8NL-!8NJBI§Vm|̔b皑B4(#3|{F*tjA4#F۰CU"fD_>$N0A9~ Tᔏ;}< mA#5Onf/QJu>g1s^ud0drT+ai_(hdw2cskqίijM7dWYo.`pW+*q w{EZ/5IGB?/jdJ>4k3fb+=Q? krst͠*Jl5Z+:o&)x sFDFbpm!ORHj_}b76DG)F>fP4=N+Bݬi*HG7t-;x$;^F9x5wc/SS=O ߥt H#&Ƚ l!kˀ^si1N *0uˈ+5wn#J^I?wh D9W*֚󁡐ta z7E5>PIK+h*$=#xd!BWOm^ ޛV7 àf( LxsENIz(P AH˨2~H"A둙2[j70q`FYx&y! `u 'pjOVMkWJYuS)gҀL|0 cỹ%c xftš㨞0mw=':H#I;1ilaJ#2n"^LLLk3sɦ2̔+#!_Gd B w\+?8ƂzL i䗥"!'- ӟ!_H2UV! fUIHlvar`Uϩ&.t?bK?A+/#/^P3 ry@ʂe_U) [z窱_؅D#/>} 7=m){wbJzʾd7<$8KP8sls@7g@BH"8vn=oD-H~n0}"O&2FS?zD9m޸}9gٔ34|p( 0N FDnz#GJbΛc\HXݑfna"`Zf ۦrs @O ~ xd M?ۚ_^;4NHhy3{k%\1_H8Br|S"[ÿA[OjJS=6}x[UTbh;PllTc<@ ޠr7?D(*"aRξAMJU;V ,oRpSXz ;ѩ\S7flu܃P2 a#uʗqCZXx00;".iЎD$Lw ^JɀH^3 Em =\3LPց$72ג6JmqX6)hm*}TA%8($y%nH5yi _RzC"&-W]RQ 4RV0`TC^K}v+T`l)$mp`?آ/i&)c7ЩPq[Tn !" UZlij6 R{L)7Vc\%90$U|%/\3؆c; HP@AQoG5I=@ ,{phWS_gɚ{۬e¯0WclYXN_aA;D^}hwd}WXhvǑZUPxA4ՋZw{ZJ]qCVWeJ8$a7Y)Psѿ3Q-h۾rv'jOsZбT^S"Ѿ>ϑHًQ`!VrrhS;}+liO.;Ӻ<72INE_<*7RM]cQ`jS= ,-JpSܡ6 AWFqБaZUuB7~&U\uZj!kg/ʾ+e 8Q&| >8údRy=|8|&q!`:-!-ߐQ883ͯ,.Wm-t~|Lo{%#O*NW;qrpiյj,%6^ԩlX&{d>;]> Z: <-HިWQAEm/Yv"a,; 祝lHxA7#IfM|o IV$ihROKcAAq!ll?E{OO} M!ϧT6oM[Ow!pLGQ *cǚL ֡"Òg: x#j\>1#i6}-+T9:%= ُ(=]_DP0eEsfm+=^'-OL0%yXTl%ÿ́rPTyp xĒۛ?-/YYS#PA b+L"I{ٴ=o[qeț1ױ{]̈́÷!Oq%V5h8L*҃̈́:|3U͔-TP0v}?S20p<|*}"j)|B*sw_]=I(lnbxs"D6k{\OBHYɧѤ>PDyX2K@5rL22ϷjdG-0 ! YWp2Vĝ]C:W4ʂ`/,B`8{ϧڷzZ|{NK,HѽlZ`Y6!܅TShB!A-Où:)_8NǡP<]!4]0l(CMu!.7u 4(?Y:Wa_bz3[k3VzdWfTu2 \n9[ &D:R߲yd=i+FRsx'/(ejPe:m rg40͘v N6rykWmHޖ}&NZ=% vmKq,D!۹om\Ž nCJ%4 CSGm:>"|k޸k(]Cy,ƥ[~(]V jҕOHcڦ(5bajk3HKvRtMR,-xSƴAlTxIP\&MI&1<%uV`7.50km$yIk#]ΉJ:%U.r^ZdyKUT)!Cg1U̾ b6SB%ʍʤ(ICW.Magb]p 9RKegZs ļoXת xap=Qo0ʩQP9VF߻OU!P'6*% Hin4D \s#_N W9A$JT*v|6L†ݨGi6wؐ#>M" Hy[qن~󲪅(yL> _:q@A0̺ST & dRbub*QE'-_ՉtbL9p.CЍ(t:1łŸ3G7Zubķ)@_-PJ7@\!xJ&ຓ4䝍 ^t.2tr{Eu6pٖ&ζAw~jEǵQU=4GF9-]~[r P/T/e2/'iBsC̔2k[* yGD#6qu01GFBmԅ՜d02y #AWm[igV*7^6@:Zy8[a s|"Jn<=raQn$Uem@kE2=W:D*K=c@v7y-bF:0<8̲׶v^i( j(d V2|;e.fKe6Un2&:F[zUΑ]hӰ.DChLHRYf}'2vN&i"ajs"pFP6E8ڄ|ʂQ1wKj5O>M>KIZs>CkܧgΚܬ;3шA{xuHgF ce3R6 65qKџ~˫ IK`1y,%n%_xh0&6vč4$w.RL)+ ^(8̗S6Õ1x!)=kM1ďclR 2<`y`G)~28Fe4D+cW}L{NQnyxhDq̽y`leN%6O{>w5(#m3i~t`ɍtd^ 6"b RN{>` 79q! &f/k%~4- `P 6S;d+Lt4.10ïb} C1c cpk>y@doV%o61IށY` P"Rb0ecQX MJw c?8CĨf͝ RM#F+ͨww=455],Ei\Ms,%W ~yxw R,/A=~0vf)gn无I?ZY%eR0keRfd~ *T/+Y_:&ˊ6f)c.无I岒쮉Y%aRN7,%T0)}i`f_~ /+ڗ|Y_%Je)^嗠vBuYJs%\⸬ k\e[~ 8.+ږlY_%:-gYbiY\:_%Z,_WbiW\⺕_j%ʮf+WUbiU~J/n:_J%]+טsvQK ]4S1v,#:q{=5>:quȷ6W^u c{fgMU;lXL[zЋr'ǂV~y~w5ga7>aNP\B?1?i;:  Ui>9ZAbl:.e[aHweO2Pg?Q8/ɝ%Zmr'=4ǚ<YiLG$nIvg|.mXg\%Dž204>0LZrJ`$ojݏ,ޡ6kȴ#Cp-]wCc'G$_,UˆbShfҥaùX4 ϛSޡn6 ;||ԀƘɓcw)ۍ<;uv|N2?0/ebEUeNKlc\̳ "wjŏ%6knxEdxQEKגH">Y.a[wEywEvMuE؞RMv" i '۔GHqR-7fwʹ+[ӏ</ª<RTVLYSf\6!FD gij1{nTbSxEBg2|+ dJ0|F$Qp//C4S$Vl5 Oն{' C)k]5+S ThVq{7p5cXsq9u)<֜i>k)k}QZ BE\>9Z&;Ym~<gO;-3 _-Ў Ǻ_9WKÁlqmF=QU˒n[?bLYoB&? oc}|8 1.4;B5Wwp$$}έ؂d=<(F/5Ȼ'زh[8g^ zyXڵRZAYeDqKt |B:B(`Fcd>+rSPJHcL-=ŠVU -{Χv=ؓX(< tjĉ i pm^]ƁO4P"a*hEIuӎ isTEHC#P%C Ӱ9+:F=p>}R@&N 1j1d6{>wr/C" C@ms15قY f9~Knsmϲ@P Me}k9R[B-sD)!Rvo? 'y pڼ*,яgyPWH 8OEzu*_l^U ,g't ݟg"3i6Z9/t4f'] hf0/NopE?U@*M@2i~A]ýlE^ .l=/MԊ ushAGG($ѽv{ {=wq eK+'Y)yI*#\@9{ކj9 7Bf;q NF`BٵGT1i60!sM^NMgM}s;g&(F<"b6ahS`'\M8ùfk쓼D&b"D@1{p4s$Qa,d$_8I&^($O@.~u$:^id~ It"`Dhx/Pq(f.}:6*/%"%YWr/SI2/eJ7TΪin:/jco*LuWVU*g[Hy}mʥHx XtfԖWU~%wcSJoamj7}]ާrVY #.NtY!_5e(Bqx X)cQS*'S +m֤} nA@#22(i6hO:Nqd fIF /vZyTu0F 0Ax F V\F;t@^ U-(5*BklwOK@`I*Y8ᔮt2tti[#LԅqNr;1&2oc#0cօj+ R5ī)<oMU Ku_n/46-&S3"D\CM1g3eY"Fij3@DHbCI,8{kʍΏWnavit-0.5.0+dfsg.1/navit/xpm/country_SR.svgz000066400000000000000000000021651264204753600206770ustar00rootroot000000000000006(zHcountry_SR.svgWKo6W%AWzgj^hky;¨j7oC)'ٴR l[ʔ(<ɉlռTLJn8[# >Wmki[k]'u*%RM<ۧƲ,XjMDRnd[ 3<|@lնو &A$cSRN4v^rcl3ubSUW'Q%{FB0ѪGF5d;-wԎ1ŵ,N` zH!#F!c騇='?~>q{XR hrHO%ϯۦ0d*zإiu{xBv3pbsR5}!ϑIA} <:e{BuMO/JmLTFyNsj{>A^HfQ2`8 g=1fI{r/Yw:cɚrBFՋ^v-{ :YCpFޫ J0Jא?jq`+}_gb0ߴp[ c?CKh"D<έ 1 E|n cy3Ac]AP3-u*6A+^NaMrl f1i`}2aLy(f$@Kb8ǒFK f686XA H,"^a50ZGO{2B-$5ZBCY!`qRn/֔f)KB/^`L4;bߏ3Rn0y navit-0.5.0+dfsg.1/navit/xpm/country_ST.svgz000066400000000000000000000010661264204753600207000ustar00rootroot000000000000000(zHcountry_ST.svgn0 y M@l}[VPv0lAnщeǨ"$ϳ{ؤx(Cu?Hj2I7mlI!vVD)m"7 Z.o&dzok>U`z1B_lc]foX nQРq?< 4Rf`|rKF[SۇD)^ϛ7u-3HS썥e= >"7fnkI=TTPA\2BIR~wbuz=]N/ϫv]rs{s;v}~t .;Go'ba^uƘ <{c.ޯ>dttl#?OӵU]O}sn&wGX|Z==.ayy}EZ}ؽ9)ysC~Lm> ~͒Sys~qnsm~'/˿/_~\ݬg?Of[-l߂G' ڿOoU\^eDagǡ[Q}1>?a{7Oktlv1M-bJEY>@`^;Ϳ^=νʞ7^5=zb{Yԅ)"=wsK& D .: Cw t9Eȵ`;}W}+tҗ:>t׹uX|l.X1<ߚOgV|Ф }0@ȘBJRN/[{E4%3_l+6Zw~=f,:ca1ͱe zNalJ .K Gdy B͇6wSj ^:;3tiD s'Kgrd3~д6ߴ`7Ju@ /܅)Y]tiΙb 7CR _^EG=pF@иOLwJ,cø>llp4UZq##&czd`/3D`pdΗj͆ O!2VL(a"`cW ΍1PY ?s秌ʎ*B-XZTl0O618! lSL#D6+3ٕڐ 0]IU(Q9א7i2l"U{6mv)E=BVY:/]' $X]::۴?mB?7 "{= ^JKtVO1@< ,|p|^/ҝ( I䐫 Bmm'rb-{r*3Yd;&f2yT@&fFNj! XxHq"{12 Iu ǷevZN@Hת(kݟȱ` 5'd-r+@ \YXK <}c1jTe @#iH2)AW&DF'-Qr iȪh2'ZDWL"۔j9yh<@eXp>?lbm@?yl;Cƅ5u}pʰ(+-i]d'ya;a `V$.TP!ζI(`TsT}j5 RAA9H[Na{G/T-8}d>g )d{0T/L5|!|ze@VZ U,493DSuX@eL&;|x K EH s$><Ѐl8NRK˃&֦gAhNa;d8zF?ޛgE{/8M27Gւ,W}^m#Hd S_)NIB; +CtL^^֭ؽCO:LPknAwV;?4 w룖8~!#I~^iq`[mcdeF6dxJͩ~usQqD+i3bjIdA4Nߘ&(IAHDD,rԓ cR&U8dd^7Uٶ h5\QŜg?j5\Kwr`{]:ZlUfZLxK@Yׇ '`B? (YFxj{W[;=Ȫ:\ O5Z)iChG]6|_|o PB.Gñ@{$-% cie 9kڒi6hKg c؋vl9 ~IFǪTA)Do4{]1% 2h 24 i$0[_fDŽNy޲NbLfցT uNIf -6 ƻČ*X ɽ윦 m&It?ÍUNK$$᮲k@:' ;BlNfmVz+(Oٴ-wO6Ϊ;ږQG$tPS4\1@ 1v*m)@2[ 9: ]{t@9=u}r/3N}ʹ^K"^P6d-UQseM0 }AVX٢)N0KʐL!0 gR/ƴ] _Ssފd3"c͈ܞ葜ٶ8:%l&B:fISE}n=)_譠ܱ2EȂ>)6w69/Ӓ.D MG7rUը*7ۉxjW*[*4\Z*a oE$X24~oNV*1ȉIڊ|QPEgӐH>ŴCA"EhxAtT{/l8e'.%0~2i;%;3O7eʙ>{)}:lݨJ'Oy]Zw^֡d;sT"L_H ןQ}ulj %+Gׅ|O+,G4d()an@TaPЊ@dmbaUtڎ3C@"Qձ{WO!2EcǑ):%3֋ (B'&$A$]%Ԁ]K/¸G8}'Pퟟրׇ 'B/q)nw UHEj~ kpGdVY3]#uÄK YPt=XP%K "+Xy9RCA.3d"魐byo#BN+0)k/H-F(2&JU20]WIE)AФ1$VC/̤ ޹)C`i}j&IKm? aМkHhxT Y}\60b ^ZWG-r _ zHYBGNPC9-oMI'""PQ?PY`'nx?ijxdɺIWGOT`WR$aAX6dRe(Fz rqTd=YtQ2>ﱇ!6w-)^j9^"IpGʾ>j9a e"1Pc?Ut[ 6g,FgR-,{^\ GITρ?/9R̼O0BPe[;GUw3 WM8E/B!M-a:.P'U?צ2}–e"Ѣ(W!% +oSR舱kO?F[x=O5LdyY5 JmA(1\$u'(VTN @p>WBSB2k)%re'RPֻAf}S1JU|}}1*B-m>XLY\xJ !c%*UBu{)0u~O EsW (oOr zALe%q<{W6''s%#KW߮ !|óO <YGR#x#<$}qd)چo^2 ߼hF*QB)2[}oexWo&Q ckS&!$z.H&|_nυ3w$҈]!]b/: 'XbݓjPb"r߮wfj3xAl޶ %>UF6 Rz k@\ 1ɢ9,͹gۇ,({h pHh5 Kj:pg}VBI:H؏%xݢ~,u%7gl΢ )džɳW>0- g@+!* ϨᅧJ6Y%k@t{Ǥʰk*_u8h^u R&s'`/Rיz2nu%3dRK4P!0@phj;K1ۢap_o_Grt5BBoàiRUFo3fVJ޼Mp.OVO>v2M8Ig:I _5z>|;z,29JYb7; I7,دo_y>H?s_oZd&6&\w1e+ПmEҳE4 [i}]QaAzC GIp:( ()Y;/;~uIê$֠Ui6`&oTקٷg˽ :UOOѾ]:piV$ȫɆV!}R!aϜRDQzݓM.Xݔoۇ:pO()Xj*I/0NXYnb>jUY}P߮w Ҩ 3 NurH6.tuk8"]E\u4X6ɾ[dѶJA'2DC!rd Tnv$AmCl!22I7#jWՕ[ǯ=_KIp3z32)hiVH{?%J'T/z%ŗTA"K_Wz+Rs`keEnkP&$ˈt(L:d@{@_S3UFK鉴VhIF𺥅XN#14몗[_ ٜtr.=WҍXH4:̸غi*, gG=ku7S[+"2eI n{ H[/?5׍ ,^oFOv\4lg Y OL^˴¤$b};sDٟ?hL|Gf$229x9]h2!,sEkFr+c-,xh{M VJ1Qk$#Ѐ AJ. otIl^tؼ'l"c?tX%+2BJ^4tWawoӪg ׌Nm34#l'TV7pY3kDY碆i9 =l!q^t~5 pO(e;E&^_F^oFvRdǖzSS؊Jv'ah%|1_O@ɹضuxlWCcEJ%HɼJ+Sf%/ f1Vkng *meZ%&VĽpd~Hs[Q6B|Nz%þwz+i2bЊ~[hY7:i]nw9]6I*KWlyL_±Vb"qd@,N{ˍ~`C:j@wiwi:`+./bȍ0O+?U va\a$vm4yh\9$Qu]5=F|Fn-Jjegx ϧ\\v^4m%V%٨GՄMBTU$eǭ3;y!׊C5o P++S6jpIZA^7(inӪ֏7KR`Seʲ bj1D])T) ao5d2\1(2s@*a?Iik c^gz|kmOs5-җ018d 0/6FxzIokm@']~ILAOmd1cLFQ!_m4O}aW>oׁ;}Β^8=m44JhH;cC!l ~F@ Ko!᧷v?gQ/fzJmн:|&fe0o7v_/%ۀ"?:p0'Z!#Wq ̒ d!O }q {IbdLR%>(,1F"| Soh%d11O}w.JCbaK4.sIFd'ƾ8c%cWPs/0YrMyݙ2GmJPp5p+]&jf&)eHZV{dҠBe_nMֹ|>7u.vŎeEf(> åp$`I'wǏm^6[)6 I-O/MZ}KOybl?e%0J_Lg\ Й*S0r1aD><3uά+zVI>ez:a4ؓS":}_eGj2-IqᑕeiSHHôFpWwwe߆"m_1ǢpeaW9y*a >~5ӓte}†kjwXKh ypqV+ÊZvC_ppFybBLʉ8N@ޮwl7^QuuN.yqD.<_"OQ3 @xK>~]׳-K~m D,:'#`[cSfLj; sUpB2hB;?<  ZTca+[^Ý@O&k5/$0݊ N 5$ݲy*Ti9 2ˆٌ#Cp29 fV_yܙ5y!C;egHշ]fOb_fJ&XJX.)M>&[#"&| Ee*a\M`y@, _g 2gV.RrɎ何h$9ũal:l%}nⰱA߮yZuS ˮbS҄5yc%R$/ؽ]ngug3u{b$#SfhlЂX.q,eŌkH( 0Zc r`V)aˈz`GHC_|EJY Gd7 E~xdaS^JƺLu#ۗwq[dw!Z~)r_.x]yXO>SA~- ,Q+pyLpۮ8N*cˇU9վűc,3Rϙ8s7ۑGٱ"DTg4IaL$:c@5ѯ?Ec{kSGQglgbF1uT'0_ǮZ8Yhܑc,H=910 6!‘+\K`F?92a/h5_Kig1a{D8)}ìmaDvYP) o?nLQ} G>~L-RƲ=ξʋ5_fd2㯟];SsH.PI{nJE)^ 0D ]yp$eN}J!DU{AVu^א1LE^q-Κky)>+U\d Л _'no E.$4uzK׋W"2(p{Hd"S8 rkS#þ/Ӽ yB@9/l0rv3S?,NrTe.8GVH+C2tz`Eulud=JF-rEqrE x8!D mc_"k.k(7pb2 U4?$B.(OuX'|!@nk,\ǮRdZdͱ3&kCZՕДd<::k@]y> Q'whܓKek%b>QEOBw&Eҵ8*tc,yusAd) Jլ4biX󗨉Q h&!D=1*I6fn!id%~ 裂ݪzNWDޮwnBV+R>4g? G1^ e&}/Vvv۷sISAn&Jr|;" Y..Ƙ_ v /ev677}견Z1Q8s:pgCLk!~;T9CnP) J mdч|7ǎ>*vrc~X]|U*`J Z$dF:w5cJ2U6YQy_҄GsRhC&YW,)rԭ[~Ǯ-a I왾IhR^)lP-U J䓭l}Psёɾd 3y2-}Q=k')dSj̼a@ $Y?SAOaC"q}}/X>eJ4cl~3S%o]2r+)tz. S&IޛP9'G&*^Y(Tbh8!KU%rBEbi:@](Y 86Wn!:7&QjeYyi#؄@čߍ?4}eߵfFv3?an짴\ g#)Ld-&ju-gDWoܿ&sY+] v^q%dץ:#͗2me6 b|4tҗ3[N YʭF 94-~ Vِ<٤|gڔO=m ۴$7ؼi4t]ȣyݐh7y(6!>Tej*a6PM+*} Y3zp)}@Q$H'>hKbIT Ľ"/մHot'i&TAvfAb CK_M$2h]r=Gd&LNs=b3⸒]v668/{O8IqCoE)WAC DyZSCgP#; @u N>Kt҂n6SZ]\iS8:T F3hd.M*p&.2znuyByoׁg]Ee`._6WlettA":B" *9Ide=EU:2Iɺ;p 8t[cah;tk3oQ!+C Om/cMjTHdU94MM㞜Tp:pg`FƓx%؁;7k$ML9R~:XEMsb@0Mml;lmf /l,CQmG'<;z#ir+{¾bFwVIv@cL鐱pBpKH,<& 22=XżBF,DXɵ(^@M< .#ɬ6a9- g rNdK#, I3>o% 4VLSJ2.M _E>юJS%#,[;&P*'HO\A1ya;C<)Vqge6e:QJ u}vz&8z 2vd0eLX/ (-6y~!*~zƓjk.VL*K]sE=4KG7yo r)RCo4Dl\bnzjS E3?YTC+G+̅ڦFY0s-WQ6Rc&JwV,-|4,dwE1$TL6Rjk Pe2a UH)uf M8 ,!v7|UFPMQr5UU&I<YBZ?|g*:qd*Q&K-[RQ_PE, \&5 Xˠ\Yy[fڝƔƍ21Ôprs7F/Slov*DYe*neSwG(̜^63T Xei&[mg] ]ޭuҘ-T*1c,!FhFOZT۴U#WOch{-XeD~ d.Z}w&'R!Tǜ9Ih%(2+^T'Rƒ쨒8CfV-T^=eHA2N3r9%tb̠|t*wI ۂɆv(q4X9T޲Kw!nuIogeX5 ,znWp "f4#o!-t\zGQ_̎{E။?#c35L+/T{LLLJ"9lIcwB[X4,]ЀyB~klәEC|;;|VKeN]TzZ+YQo9VT0lHl&%u"_F^kLSzzδ2G K0b0 =兕MWab8ަӈd:Ęګܴh1ৢwğw%P^<ɺpHU {KP!V6 ]ҥIqg$nɗSQ㷐U1|`5vUr knYȦ^l2@]*`إ^汝b q2!̷[;3;Y!7Vw@%[e@IC줂I8xA15J`VRgovh~׎ Iv~AʽBS΅\f8 '%GX̠)RmAnYPhax.TWM|_o^ҪSV}RD0F&iM7)KSlXci4LlrAItx\ cY6YoU1&U%Yrw*z'&T@1i%;7o+%A_ nۈHNY[wd1=yf0ͫU0X4jM$Gn\%KjФ%gp]*Eڔe:diL/)К6KP߉̦5\Ȣ|&Bko; $e-aT҇|5y(ML$"Z>X1vk ՆEd> `""Iͺ-߈uvъ ȥ_WQ?K4 )]U3­jL{,0E]R5]RSKׂ&D"Lcq0 f$)8D"b.b\7f_:2L,3bfd3.kt26iX8 _$?^3/$])^P.w8Hfxch9:4V;vrA_Ar*O4,62=e|l%r^{ x&_H翰̿HhI~&[ܸPNMIB6yo3G;\XPD~a \QtX9IhֿHyEz}ѷD^Iw?*iEAl"OcCUx݂&/zvٖxroǩ~:]tz}#TIeu{3Yz(mXt(-.>AmpF]I kɰDY,Q;N=%iNJؼX(02)u30SUQ$FWsn^LrWiؚ .g)t6qkخNlDξ tRdۿ ,XTJUPL2RsGX j(|VagmwG#C q6_/l/k&H`j, 14m [iB1tIRh/RYNh%"jb:K蓂tAaʰFv98-gFr>)ڗ{Oa_ 2zlxE'k%,)1x+*6 |oryAEt f㟣Ð[|9XVtQMLK׶ߨ[=uv}Nڶt!~Òѿ>8"M!"^_Uw -5m~@]&Eciϱ?~UC<EDa\HfۚPĐLH l!5A'mvJE6R֒H̭K"K_]$ږ :sp1O _Yo"U9"IFW]փDGzH+ Ҕw uͷՠNe]\ \#Iu&H=v}Zp;uVP'-Jo%trs};5+]~E#:IIۚ٬5F?R\ɶlى]v׋M -.gqH?(~[ X*'}q:(sxNYMuԠ*wiOxPqy[}rͯt7hl3] 3g΁;*  Y|B ஻4rBSPͩ‪Ar#UǮ\nntߥZ/!nlvZ~/R䮖wPbkۣhGv> vpnv<bhÚ]:i:.؊Rkhg)V{3'ˡbhx %Őۣ&S7)oa2fGfUba3ҏ󩜐6h'ny$ƗiqxxA3U ۀj퍫6oB&ܔw9MRDF:$N "TS8˜.T}6B[դ]3w JrsXwk&r򞜆)&ZbZu7KH {̤&&15M9ԼKV ʦT ޽~{=vRٕnyO66<_ |z6rt\QV8){>9?W9 I c:yqEXN3ܮ\)\ F< ]!˭/xj}S9⪹iV wSOf5Pc"^.)c!U;ISR#a*S v ?D<];.VbI(G F+J7yݍ?j$`ݐw4aYSr@#xzjq)ڡ_WO|񰴋7ySy^b{gTSkzJ0`;;PW<.xUOsOq0Q/d:ڪVL$+vrߴotaXe`{|99T~e6RlS w76% j5ܑ✾! i12|Yj,I)eX}h{L4_N%&%U/svmiǞ{O ~-y'nɛЛm~x=0{صcZ凇Z~)<ǔ*y=qu_'ډhqV߽ǭҶE__bDw5Xƛ-?<;>ofKnzw 6CgrB̧CPc a1lL~m>o"}1_Jx;·3^=sx&̡gvM39%6W#cTC?7*/ CC#iKf\z_5o,hPu-ٓPuCq5hJS(m8ɝ7ѠNzą!ݍr{4{yM(dpK**Ln"p܂rC{)ʕYHRоSеcfbf?zotje*k쨯[64|**ʓ?Refq%,Fċx5O]<~*L3u3Deƕ =^4M*kzڵx77,OOR.RgJ#*R#PL$y4eh#ڱ![Ss]'(`4CȀt+%eМLUe^Kh %OUkcBčlq ,"]D+ĎD_v:E4ܮo/lC=ѹ&w5Du~3ᡎt ð}QqMϮʭh{߮>]Gc"Vl'4y?b}wkMv< Q-$ ' C vv(859nYPNJʅvx9UDzM#/rr [`*k,p'8h"Vu:~,ӵRJ~xOן'<]6e20:ffs>i*nࡵeY{9,jZ]׋)Ǫi㺒Mr `I޿ [;sy//6RW\EW‰Z-m,;'u:-w'{[Sֽw@KE)? W^H@s%K*:@+n3\!Z|M^]{K w Uw ݎ^T5c8k960UNuhXķ1Ҿ$]ڗ\:]Z{?OO?5H+mԘlquypK uK'lե">D8xuw,cߌn;sEʗ!'KVRض,Ȕ`(כW9'p+ G+* MJx .16(.ŧޕqz7WKŕ Ln _?!u$!1ka\_\i\9"i7zH~^%TՈJـy4Rj9 A?õ A0/,%力y6Ru:@(J>K,y3szwp%-(6EtN[ŅN.P^1/u:eWkq]Ԯrbװ :x;;$XttH>%6rUeŶ_,ffֽ]^=L,=X5xr'n7\2&` 3hu%BaspO8v.]g !oGZb|]v1o>yug_?n6l]% 齀%;tw@t4,l^6 K].! h=~=@bI  'vyw{릤i7;qC@wu:n X-qx񓣵hEWbVawe~$3Wz 1Dnxl k6~BN t2@W`G*CKmB֑BwJO*O|e|3WX1u`Cv; 4?]ݒJY|}(v:RTtuЂ" 7@akӏXi/΁@_ X2Ѭud+XKkr`'7n&%i4nxlhΠcB]i_.1صzp:..VmM:3$ v8xmׁ  B|ˍM,>d'(J52>Ots{hwL3W;.(J;]-k<-yBuHVMtXC6}ٿ= RVONj] $71ϰK8u;x]^#01Rl`q], Q /GML+=X,] 6MG ,Xd8{.y~ų4>oaas`6r3!@Bl"qoQomn9{,ޥIC6jBYNJވ "acM4 ?[0Vni=8(9%,HIE-J o&PcWU?bRf)4MMꀕe1 %~[.eWCjꦖvO" N֧]ts,D+JP) QHAԾ~S%Y/A1+qPu I"c~*owC4V J`$(ҹN*35CbWR5K)}H>@/''!:!(c!j~rq /])*}bcY}Y1myuV02ԩxnOaC ձ.- Ys/·T$W+^b9+D 1^w/d凾][e|+@4Dy\î -iMs; `={%)0YvCLR8?9FHMW7,ҥOS:xܙYW7GVĴ{M!:ʐJìATȋn~B=T<ʸacϵ4|ׁm7=픧i'ʯk#kdI;Ks=0 bj+ƙji j/t[h~b :AsמwFƙf4uE>tn:!`*TQ?˯aHr݁rq55vpo2ࣂMF_fCt(@|Q\7%O>nljoDu㴙\rUdŎ+nVj'ffF;Iigpb6|IhΜ`fAݴ'}NPZ(j7 Tf%yysjׄ~vū䡛HKɌj5 tY"WI aKvèBQMx|WskwC&w)9[Ȗ"~ u3F=yI6ZX}`ꣲ_⻖NGuWkW\e,oY߸3/}$3+˔=P`}WM'0p]ҡcM eJЎWT%tɀK8<-n{zMe#|i'B|vcAˡ2@ӸnWj_USj~)8bAa)bJ+NBPȌ8ES"l zo 3x-1hq{k\1Š!CL@~2ZF#C,o1[ )E ,PFf(cPCCc߄PDߗ20 e4OM#[zH(@$c#12ƣx(JC[ {2'=t!1D;"o Ӳ2b$"sV00`a!hf f|X"ˌf`>>9Ͱ:;-ŢujHlv8w[4~32Og8c1q gC9Er9=~If<3 s+1+ ϨBC;E)+a+l3/-Ia%AO .O[DPih6/ 4#z'.yxe8w }ZVL#3 pi$۰7ΐׂ<םvc9جHleA zm*wA pS=ԇ5lZghOa6_1^D]#szoOa]v;lYpCܘWͳЂpWV9`H,WyI}6p(kVG6΁vo u7 M7ub ,~ӓ:CdwCf9<9#l9Ϸf+ؓeɺ[\oCUuZ)6]_UnJsEӈ-~fLsZY()6y3G/&Fe[?sqUzY|L sqθ>W.ʶg^TfyQ`ZT[aZTlo\bVT'iẘZiQiZK{iMTmGnyQqԦcL#1m0d`bT{?r=IV\d\j+Lf1e+]Is%R]_`3aNX+J魺L܊g6cZժ?ߵD?_&P NT(bAZg RSB3&c+9bhx&)IQ\<Cjlz01<VoJCuV-ubja(UpA2Z{0ӂROE1.K4l"mxUVHV31{e뜡&eݍ=tyܨh?K2gd7]:+9t(Q Ps9X>nG R> y;rg+Z5YHwBIfb'yO"YDd>63DȎ c 3UR:P 41h2-h5 h}*\h4x ;h1؎ ,Dffb|qX*DD¬ 0C2NF>wHUT25u/~ZFV16 Kd%/0-/'AV>d8 B<˭|F!1RĜF25/Ջb.l2i?Yd>.d.n) tʲbv'3[w0Y.h{NweC, ` 0ĎXf {*B`Xv};bzCz :$S`j9|AZ'wƬ}#'xq|nd)\\Nh1YX/ QHU6|5Ed<0Χa%}+߉Xzjr?b wh;dAG̯ s2zd1/U/7.Y}Bic/|&ТxIl?^i}Kfn](F9Yd|?@ [OBA@ ;h/^>6#'fIz\ 9nqa&3I$: ,m6Ȋ|>dzΚ~E 4'-PfVUc?Ps=E"yȞ,㗏}22|gYl](d`uQXqC̼ȅXȀ>0ڄ ,=5f3c̵g)MYzl PY#ÆYUZ=0/rau]E|}깝/J͝Ʊ+YYQ;lL`3jEa&6s% 6;AYe-݅ܨE[k39E-52)@4c֢!$3Yz 2A>Yv>f 5J3>!.V:!c..\ VX qKӑEVxF]vXT# b>keG>ŊXEV,2 |CLb *z-0 nyEњ70KOYnV4uBuI:Ld^S!ubIݩY/qw"1l,ꁘŋ11_I&eI,ưCR> ^ N"֞wj;v2wEd-j+3 ,$fPT?= `J)R8.I/9 %y$_9Dr8hr@őiაOEn,HVb.Ęw!K9{((dH;|w8fMmd?<.dNbV1JnfUdttI0k]0s\ee.Y0хىX*I%.~'b!5fRk d4.ZY,m [J4bQh8 5mYY_ [ MB) __PhάM@[AG fmYE,r`&t +bֵ~ >b.,h^.!YtGLU- NbY'b`U}ρX(x1 [aV{?1႙$;fT|Yv3 6yf-w0xdh;xRt=w?|`qy,V4!Afec 2v\YaVz>1+61\@ƃwAV>dQO 2.z@f+jd< ZMC2'bN] 1F nGo@V!{5?nΎoq,4CÉX]2 NYL8K38 ? 1E 1yW KO ΆE /+_I-/be"m2 t8̫ҝ{[~4e˜bO$~A&5 2+6̬*saV490#άڔ:-:x Ҙw@K 9rsvfZT $kv.3,\YGDuBV; s5!f4J*6$#&ZJ}LBl=Q(^g, d Ԑ.*tdqG^fEB 2NȚźC k #EyohrΡ >d̈;f]\|KܟzbL2yf¬ d^s 2I:0⤲ 蕲߅ٻH;bY:6.YTiY00+_0\gVn7Ai/ЊhFg@θ Nx/YOKh'dȶX!fevby!Fg$`&?` --rVr{xЇ|[Ҿ"fD!X*XT򱉘bqRdbE5,ZH8=$ LE^CV-YX0b֏ p̨B 3+J0s*ܞYeYdcEKb7#u.i?? b(pALKiFO$`&ZiIZ+̠ccSB5[Ĉep+ bƊe `)0VĊVeNļ &igE 1KYIɼ!f1 hXehA,X~+;`+X˚ `pzv_ 0͜xEͥ2*^HA8"fqī|"r96X0%gꅗ,zY8«hm Ga@ m]x+plaa ^MO֌0xWm#|iK-Ez?Ikpwj\S5Nj^ 'Z/Vqpvl`?a+-+!QD] \L 8ď.W:aF7r= Zu٢i.KW ī)mMGZ<wFɿ> \1ݫXʀ$KMZ\\qbh;Z^&Y"yGU{pO?6/W Wg9XwfWv_O&b / {zը=.\IbR%%yx7X_вWlZnƣ b51zQ#ՏܧB+n[W\ .F*q *X]Bn۲ė_H͋E*' Q]E*̰Awǂʁy0n7*7HOTMcʛj+*Vdbg?X`oy y_gPwsOT Tn3Nj8qʱܤ0blTEûfЊ`ASUjNVN4&ZU‡UԒ=d\8麬 ŧVNA]ZR ԉU1UXP @ȗp˩00?SxnD*ZbX_)re qԧS!+ʗcEȗyj^0|9߅TTH} fbܦ3r_dzzڠʳ@%g慕W!DJVHQa=HoR!^6)K R=!PYP"wuwē_P9-y5]\PX-)j`2jf˧n VӢqkaVX5̡XIӕefX9g&047*SZ,XoV]6+Wɐv:hDu6 eCJZrW|SU sV1b~v3IJVXMJ&bNuX/X: XI`k`ڰ< ,ZO$q@%7]*[eHq׋*q&Tƾ\o#U)/`+4V՘XrYVrFX*S,57qb%']:ㆤ-c`g+(7z9RC‰UQXDeXt+XydUb{*SAaJO'RR{>EDerhNzs]7b@*"TWEV"eTPY ~BekLJ:Cn+=r `(iއwBRy%Պ/Bߑ $MR%dOSb'RvHG۵#߃TynB=FUR>j~HY~"%.Ej-d0N*P:s8C3LPW.Mz<ſ ?(v4Mu U6mźoͼHwߔ#SwIA(+ʚ@OKrz@Ypw%~V'O8r> 'ޮ?SxXDz+}j60&N0IJx:q-l⤌ mhfwTNSᔎ '|>q2c] >Mlyź؀a'N@uk=OtKE_{\LJ]o8}1좧{݁`_qStLjXh VlKXPVOif oL(1`LC=uw n ѠJFx0y^*5(lmeC;O{=Sxw0ZNy 㩝mZdmA+LdM7]ݴTF7ʘy Xpa@<#TP z5^F<)SpJzXv9A;[V<^NXmdA}zhdnʓv Um]%2[Fqr&h'jL5rҍ"r$(S9P =Gs*jqW -tbͻ,g񥖿CkY:W3{_=s{ uӏ{#5e=.C&?n :i:{萒s||0̰7c;>3=Yci}>s,ۦ8{9CC+;B"}ٱZw5yalnܱj_=ty&Ϥ?8Oa’=[rybN$Àmz3$-<ЇʽG~8 d-qBnW#(j=&u.l:##a1fI\وU?`R *"J/ΊI2<}UAb Dؖ)ՓR3 W}HzC gɋ̎K8_~)?_gEN/)I]M_JTn60g6ڀ5 j d2TDDXn >ڼ{,$IկCp3R)ȁ*'ދ:f>'2A_OK3 Lw|nFO Eo eI{)h[^;%WlWZ"Q yTy.0_Wh 1vQ/oׁߗ5r?e /-j᤾-R' Lp Gm8D$XΏmT!k){Zl:JHtY wae&g1s< u'r+~s~{RuT!YǐǒO RY)J/X3g K h!b%L:LhKwRU *LIkm:q5|܍&ޞӴfE`ڧ]0Uݳd~(-p޴5GeJGC:E4_2;Ul"'m܅|SN/%0aSz)nBT[tsEvm czi=p?:ps@orGɗ=D:5 M@P u@718a>1:9Pː:6*Avo-C'M]XdQW,ӭ^h]fYr̩`h^TvLt;w73Iv:a<*L@w-O R^"@MBԕ6׫(U{dq!%olKq)3&}[>Sg6[ yx. e[b,u٤ɆkAMvbI-o@z+\ zH񜐔 q/j=Hlȝb$LHn_0:4ޡ(ud:_^8f3|P271Nnb CLw!:g=һӌf {+/݁sHcT8* ¡&$5J6sTkWb#`$q7!2l(7 /z(oo2j(!c/Ƙ99y>feؑ^(vFQ@L(|=Sd h:6Xobg$ݷ^FD9E!<#'9_ٶ.H0 _?8UGMA TQ>P$S9~acltcFIH8`7ԝ"g}FY!X`1e"*!1 Ċ$̵(.E Ptˇ(+}JqM֋([G*D붠$.?<ݒvIe02]E-Ev{QwkdwԗU-n&Ml^Z&&jjfUn+եY]ݮnìͬsl3:o}c}14 겙7[zY u5 zM l#>2[iz[M*b+Adʜ+GDtmoN=>Mڦ.:oUE'{q)h(<>YcV#Ё:1c@}CZǬǧL42Bt"wXc:wšۥǧM:Ryvږtn pONIq:|7:j_NܦFDGы'E4)i|Qr_ 4Q#':!3%*JMkkSv%((<~u $/b5Qn0V![;D*h)=>ڮ^ZsqN| WFI7~4L.7Z*Ϫ&vכ &)TrLgHX)ި=>ڮ jӆ[WƏh$6S(w[bDZ|k9/ڃ_xuKTOĜeN\F$$"H^9mbez1 l.̉'*"^p>0IAH> KxocR򫌸cH$m|Y^h-fѳƄc$hd6^4yh+E`/o^0kOk 0ev:W{cw ~Ъ^]lsJ*צSyXS,x#_u.# 3{ivA Ե5m7oj_REVD@+nZS">}g Q nz7^Iu#%arYgoԚ\@Q0WG{zL>wC)qV^swE& ~CvoZ$ GפZ8)y^Iz3':r F?NuPYEsh'E+t D5m_U}|]^ĒyEs4?Hsy !J> RSZ:sZқM/U=<#RnETC(Rec6nA1/wMS DџWr.+Klj~o4㩢ۚGs|S{Qu&EuAG'|Ĕ:\j8HES=Txϐ;h>IN=K}rojܚ 9iʩX3^,eÒ:`Zje *)^嗇ş۞E.bP4MJeU ?Ou%^EzRߵ7l`Kʧ6^raf~#<ӫV!%2M t))wv t^+{{l&V\Ae3ˏ.,QQsIvMn&3ؠA!90TՓex݀wYTe^zۜz2-iB[gMxX>tCuY `D(ӚKVNQ"7V%2Zבa?eez9Of<~])]34 /л5l2c- d#h OLԢLVvì{h#c:m~ LL-'I†1Lۥ<~[h…x-}j熶o+Wpe<<~w#phf$nvp┕@ E7߲6Oq~lB;..IC=ĕ9LU=nTϐE6I-_⥚ mrNF;vF/vGY!jivPԕ#z-ۖy J͋=9#mhh~Mk4rCQO{MFkCi5f_Ќ=%&*s` cF450VrLC}C· R~ZrV_Qx)~O~g?cg{8߯,g{Z^t)~g;"GM{TK{~p~7~ϗxS/RZ.n ?7W@'tZ/o_'ϙ\6]pTrQh(P Քّȃ S 1iBC{`j9>/` ɫpk\088w&sd{}M]t mtEw`Cp9Ap:d\/<>rv%IB_"<*p㽌]\IM܋&/Ɇg.?\5@j7Ng2 QOƬ1R#@#p&yǰ@4XNVU& h 㔐~kŶ"2"'&, p=GQ=svrF4dd+G~2戅RK! eQagB2 *`F. E CK̭ͺ-L`K7 (o M%* 1kWºE-{/污 _?vnm >[w 0~hp!qw*b'!Tou#.@ :L1_0myjgy?ʇ_) »@Iր AF} { }/'3͓wH?ғ^)A87.Qn; xq L%Dh'_"֠$Z4*ذ+*U[ j23+hՐ.gH cIpjd2x/`߱cKisw=܀Ioίm t;g lUp2]"=̑–i)9Nhׅ?)OXnsdY<3 ,5'US+_ő} }H0pߙ\e1|Γ)*ҩ{7"DޏI|!E΍>Me;v܆8֒,jwg?zq/ f Iz ь;mD"0' 0dz@Z DC̵f hQ49@dEup3X3x\7)fex[GVR+y?J©䘕-&rF+}"o!ݽsQ8~!Fg!tm /Ꮣ(+brΝV\/+w> P#uq|G7q0t~,;.xjKB2Px$[amC HB dm800$K!'p#OBpc+L#6a ,~ag/R# Ƞ)l< +"X~J+n K#N01Ռ߾j W^TM c&%C_?vG ޕe K .W8QF_8 /W$7ti~ziʃeࢡqaD# u+KOy #0_bi\=/1*mP95,*xr*`g:N˘\j0r42_x,3Op ElbSDBE$_&}{nK'˝2*9 A53c| T\@=kLK#J8֋и~vv sWq\P ֑|K"2.#qGm yB[d_cӻJ(*3fO2v"$i] L^Gh]?a6!1jfD+h_|IM0Y:/#g,L:4 RY"娌4KN5[ӯf0Fb_; rU"x*9-w]6款}(ު SDO |L'49KveN5X?Wƭ[MV28-bcSk&m)äwjY۷*$: 7NZPY2;Hm{nS)2f6ʕRSI]8r4%-N).yψef\=BV8fm_/Je29Znnӗ .R p֦5aY0gAܲa@хSAb0e|1?P*0!#Sh,ɎIR\pFN!ؽ]ųexɻϊErW*k(}I E[9gCdIZrc7Kt"nڹv|q=N)c_9LI1}\de œ`ЈF/#aCUn]Ȑmy'%Ȩad#Xqҳt;*,G?~ljqs=*]2.-! } Q"Ʒ߽wSI]yy&/.1j7ݠ| H, ^\-cf0K sgET(E¸X b$I1#6ݹ4WZL\liCİ-?ߴ3b'˩|rV(61R.NW -SulZ ,1DXcRw$4=u&2Ff$#SyWRߟ('IHZŵUfXnw]rF']TE',^:AuPݚ GSKQKyx+eS+)PK~S+`u8E+YryM+RTJd6)A䰔2|/"ʪnq*%ϔӍ bzUkLppZ 3o"j%rJR ]<^N/^CSC[zND%Ƥ)SVI\URI*iÂటu*Iqi!MƠJATK\*vNp1U%MUz;xkOS.,L]JAd+ 7ݐAo>ORpxRb=2ӑ1tt;ÉNnxy2SS'.RpȪQzp,ܐTËW/d5)YJȐRZ>pN*ed)K))U{zUgcP9J)Ʀƒ+SD[5*B|+!MFt>1/ ix ^~Y=w~g"n3 㦖ڦܧt ]/C/C/^_7(@g>&&<H̃Z[k!h.`$#Vic1䮹8 -5nk>&<exnQ`ZهQȐO ⩤ߊxG>x،=]SޙG>uKMW|V- m塓kFzS8G>b҆o7ן:?pO{wC7gC c];[A}i9wc[z"%RSW}٫Q=xy"'CP_ٮǃyD~Jvஔ_v=ۃ*GeBX hNቼ[w+S'rXxk=O]xރ'r[n<~yZ=B85e8Z_ ĐhiڙMJC)8jN.anW jZ"2uvu2=F#KqdVnThbx .*DT!7AƉR!G)H;l Q!DJnTY,ET`5e\s.dTAދeBFSIx dhntX"=R\Y-E+q7IX!!IDt%#c 4n#qi͊B4H?L)ҍod}kfa.ጕtA{ {E檗C%3lp6Τ A `d: [@wlEBI `oFr [&_O+Ӈ(U2j &tHM RRUE~}Wka'E7l3" Ly*xHRnHkLaBE˹ Ǯ qQqS O"yc?l32YB%Q3룡"~j(xwx즤 i?x]ZJ,)N0c]Ɇ䚺c3HPǢ| hX]fM!ebjņDkiؿai9{;STȷ;uwR:pqR{\ݲrD ~o/&,!(]pqi\ JVhN歊nJN Mz +B==UУZ[sm9b[,]R}Mz_Oq+0 N-Vw&? „[H,N֣`/q$@,ԊM Z$ʎRKgli_71\,ZCm:XHфQe:OIZegrLe;P1j~7hnh=tn y6"[`Flky+{[Pb˓ EA 4hML"5F )8ۿsnP>rgw.^_ON83r@;תc7aL +*4 -XJ: ڒb8`rvߦi„f"){,1QE_t㌗~QP!@)gH5nd_neRS !=̐zر_Oq$Y=қhW WSy4%qsx\0gU/i2!oL 0NJ)}ȯy)_>*'y,Lz LMk.۳>-BIN'2h'ED){)#\W[0{e#ܷz'8Q]A1Յ[n.T֮P crHMp; ?v]4n_x티ov_/&e`.U@vz|;(5fB~f{h nLV0.Z~v`KS轵T|R%9#s*wTE M*0Ԭ3צz'6 ]f T*TtAC>QT1C7*QKW};p9Mn@ Cf"^ ^Na~vw*aG'O4:\*U_(rB>9M/瀋E~:5oԷcN}gϲʄ<;iFRQR1\MHL' BGo򷤛.Z;n.m|n7FmOxbM}Y(K}3\D79kA-TL$%{j."*^v,bݿ I p.zSI45-7Ri2OKiT4\Ve16|> 62o@+[M~ kVW7lVIHů!f~R= !˼vR\g.$ E}Ngt,"S}OKM~ F+7ht_Eyխ{;PVレg,J.wwOQ8*F-]%ynTz70*Cu$LjoUys)1R*[ ¢%ʏY:D;]׋YN!Eْnr+@K@9ojR%k ~`ͅyvh8l,H1tй7'W-;}|qSE{gpOb?rcHvs^{ƌcM|pJl)ƒM|ԥ^Κ-iile3*|x~N7da!%@3!bd|S,F0~7QUnX^OVX o6nFuWܾ5{fU޸@~]*>'SVT&TX?,L$xȮHE?` TY+`Gx/9 Y]E"g]1eoՍʄX^VXe SO]by];o9C v3I#*ӆǾ]̊s̎Y12zSeeNL7W^/!Zո97MNFMmD<v<~SjC{Wl);}Z+D׋!*HZ |*?Vu;~)ށ$&:2t겳^d)u+מ"̗m ŢEYM0pm?hZ_CnSdf*v2?joaX!2!Z@h* ry귋|Kq?9u:tAg[@5Xe^deo.n3ܨ;hg yp'rp!:M)M6پ*ʻ|89QؒpV}wl-P? R*7j ?W-_GC  ExC_1a[WAt6 &,Z!!!hS5:ДL.G/A,ae_=hZ WD me6qZ&'5Ļf2G|R8. ~UKئ{wߡ"Zux44h]iPqPidȌW' hCM^W|; |m;E':z;?\@|Chye Cb' Xb JАODj(<䛴6c bKb 7 P Lt%Mth ç#D%ǀ>Sr/)zь5aDCÎI [9jn.D7D.|cfaCR$Yglz b8 "F&NFy5leZp"0&!gsw8dd5#び/ڜ{8dԁ!F'?ŵC:KK\1}ϸˆSu dF Di]o=tHoJi PD. 8H-tŠǜ),!ۂy.%~ Dw#N Y >L(si\yYX=j]͟}2u,"SװVXWB3bd'q9('<<8xv;%s'0an b(}g XwDӗ.sgUN?7;1*S=.s811픇O4x>0ѝLrϩ^hW9gol87S=Gew:^ܴZ9WħBjz0td._1ޑOËZy7{V| B=a szzbx؎xY_Xe+S;o,~I^\oVGFe9 r1tóy]7AF5?"Wlc<;@LƊYilF'֌m 6XYhzʌ_Wh.:V; -vQ>CZBݑBCDw ] !*H"ˌ\@,m*:[(Y&)Yb-쁋XNc =Og[3ߎ\E.ri-r1ĨA.SY{2 j{rqYž{.f \ }VBuq!9!n󶰅a VآhZ.ŠZѨEgE-l֭EgBnjZtVXԢlZt^uͨEg@Eۣ lZA ${Xo Zܡ!cD_!C bȢpY%oQJy1S9}6s,ti̢fY ÷,Rz|M;քK+fљ,NFb0g f,>@h}*Q]7n^GmmuF,JޏXK#qP3W13h Wt6mpw]۾x5]/ypmv$ܯ7_pE~eNI@g~WO3L/ؼ;K:4s ع+0ŴrN)U<-F]=ճpo*+NQبSߵSS 1):5P㺩&<<]5`J<)vz_t qfԳ:R㼙hгVym9{98d!Gtу}yOgj`>gxA3D:Bz_r=.aNR)A-ՐL<5m@'|Ɗ}[xF)7o^v!G9=3-W֘ïŕqP|xKkTg~Vڳel-mWZ*fILEdTY ToTuĉrsFgښ%pmjmS8 #'s#6}yRfNN`Sä2CddٚeSۖ4S\ôtJ`|4kT#MѳɬSe󇚭cӲ/RsEZ:M+ nMjT6jh̿$;,7;o+&C"h]_*H?4,¥a/QDf<$/+v, NDp\˿C*dE 3ߘ ,w?)sQs\yeo(&n`loH\mK 5Pf<|9*~7\maͱkcLOs,ŚdyCN>~'+wĩGUoj-;*# K%RPuLevqFl/A*QpO0&[8|$g81,ˎS.oo 򉑓`E4?o7bc$%6э## 룂XI0ˆ}1KR(i? r=-q(5u=׉w@ PQ9 ewٍ!1BAib!B؆\cTK0. !/eJ]܃:Ae)^XHaP0N65h(OZ;J%M7v =} wĝ6b eza#S DBA)"ve BTsa>I:A4 x`8F#7/(Q@ʬw=@B,۽[@*rk@jKc Rhǖr F_aܱ#rّpi11ѼP|;FaDt P Q֎F1J^#nky1a$p^:qBFQ*Azyy"WQ (4#Wȥxb#wغ2o(RdNf;JAS;LLNnͽMw`A)<3JRßRpZ(DEHP -1x! jA<$(t5tdQ OCN] $55qr-;HAV $(6+ (}|wC(p"Zbn!{9!B% " mP]y(YIKAT>DiߌBZdUmpbĤTQg`J@H@)06:_w$xm m?ZU/#o0haĤ;R麎F/6ԃ0,[؊#ei0htb$E/A #-%Z1ka$%z.THvB xj= ߁.ï=(F1SjzEaQ0u1k!DDR7!`` KJv_sZ׼ XCrF9+ErT㼦JD/U}@ QJ~_p܊ bW6,pN: j$|\>"HI:TaN+:9|I cn7c#Iz`/ˈ' #B0K2AK Q4Ϻ1u Q;Djp@ D 7,J'Dˈ-`$q0*)Gж[M;%=?Fh $'0:Ҽo dmc .-+5m$)4|$|_;U!yGy )ܞ6|/'B&תP*D( j)` h2dDQj* " EL$ ='(J Z7H;FQaaUIvGUI #f,%FQtc2e9vKxMB>D]bQܷϭI!z>ҫsC-&7gkg }DAHɱUHd!"eJ7N["wlX]Dzs.ZZEƸ,:0nckBoCޅ(??D~G[LSU|B>y'k0CU@Qr~ &Ք n@AHN}]4oD!CHk(@z%;r]wBEJ)+9 Ov} 3KKjim ]N@%3^iX&ݗ\pဧ󾛐_M;<ĸi "LͲ{_I~1q < nO |0~ZJqH5@n7q! /N @)&̛P(}(ыq -^;zo#SynA.U}(ƪQҎP>VPOmo/jC<NBo7 pUoN|vJ&'- > ,C(wVb1f3}jq P@[>\ \NG V'Ӂ2ź;|Zć}>#y qIޣ\tkj襄p11Iv,tZ-?D#xas >{G wxܹGl⮩;Ox~#RçY=-|> (d;/§}|/$4*@4NRf-9#+iBqY()Q[ta u*3NsӀㄑVt%CKImvՠ4e^2t$FjLMAGBG-}YS'ԀoK|Pxj;a?Us2(9aSnif{3S}W7t],X)Xa끅*]=$̙O[mphϥ>8ҰHIGL p!pj.†MIX9H ێM#7)}NxbtJ:9,{D r'CqW \ B6ٕRլeؤwKiM[@FF/q@rx^Yк% @9 29: 0噁uF@(0ѲR[*Bӂ&mACЂXהaRPsV)dd yqf,ʐɛ=s^\=f~..8np[Wӳ ҿ KxkӃ’{`eeO),wB3$w`Zo8l4`ėۀA1hCzoSM( &zNd_04*+4*mկVh LLu:߃/OL^l玌^eFb@IRv""ӎy3B>4噡q& WmF/ 410X Hu8c=Pl[)6 `#T}c S`CV+ņ1VhJ;6"B`i鵊Ԥհ" 8&g36%KZUpLpZ9O]F Nn@苦 i#GUNS| hЄR7hZ?wqMdj= &2j,bEE&ZV!gSr4@'4n7i;2>+h Ez CDݠ0i.=Ȕ'F Ҁϳ2{"S?6E&c ukzBK3j,aSQuOh\TsVcм hX }ƮLMd(4 O`ՀqǐBٔⰳΨV4rxThPRaL q̏ yy%jUe:e[ǰO_s7~L|Sڷn(E>4[Vq4S4 X8 iVBJyFq8@MղdmxHjiݚ7'Ν.yH{mcw G ձ j攨cji~㡖˦U/S=eɮMNvC/YrtZga%" wt_{oMС@K&hd9SИdZ$h38A!~gm8>>mj75Y@Z3j*ԒbRPr'H1x}S .1pFS+w)%mg8k)\R0mhڰ!-p=jb}5ȕT+Jyiŷzh] Zyy*f+pqi&C-YWWDW%B-y+o;z1{)9p͐Fo97GqNnu׸Dd;ޠ |v\+ dJ A;jirFۨN?lE] 8~K+=YXC^Z9UE]B{ om^j8ᦇ'Szhq퐡^"̸耢=C^¼%pQP-5![=nQT[ZxO`rxG-tĿ=d-Z PK.M];UQ5?^Z}^lѵTO[_i 8ʷrؿ=Z4;d(9[lԔ2Rg\+jy-h<NJ͸Nai"V~|@۴[jK]5FЄ^o0ހ|_cy\먃 WC7PCvi瞴Ņ Gwuur؍zwVm ^~IL.Q6\p5YFGYn1TƋ: ,MX7rcZߚ^p* /ZG?o/QR<ӗ*s%; _kfZj"<^ @Ӄ<=sr- =)=A/ ۵EI??x_/?qO kRؔ4)QP()aR}0ZAUU:V|LJ3[y mb_x[i 7{բf{Ry|)z䚿xUN |bU!2[D$wPڋ'#?2_'|4pȾ71ˑ9TNE7ϑ GD@9U:Q.,=x8jE߇2ooM?t ;'`?d@Uh8,`-@H*l4X[潪MylL׼/˔ļDG|E"t*|o J͇PAJmXz~b:5 /IUY'zQN°mawQμО@U0NXsL6,<S"GG}Pa,HUPt1]AVSP V+WoX[SU)Ioo<BK!ЇKʲͫb$);4FYqeB`KV;6$&Io2|:NV+灾Zc-ɪ;KFUׁPQ:#JRC"д;:%ϴ<&fu\\@=P~3 W4lX|+0bmDi?l!zLq/Eז`ULU&U .Y6jRW]аaܰQ/E#bݏ'Ps&@xdzs+@Gl[ҵ7ֲaj[hk{P93tJ~SpPxjAPlo~RnO#O31*(1CK]U 0mFm ĉ)ccضܰ4 c,aLa|`ϰ\P͆ >> Ci$*QbHE=lPnUQkVCˣ&.x "9`ვ0BV?B%~ xU\2vsM1UC<F+\Cp}ȅDUpx8i5@uAx .XyߕYI6 ($em#+2yĭѣƐTFv{0e\H p DQ |L 3˶yECI"t Xk>Ӆ=H=czⅱjKpC4; 0<$Hsk#w " BDC#i_B2|pU`/% ĩI I/` mUL?ʓg71D*͚!&ī=i+bf SA/񆄯C͠D bꦜ2 Ζ`y*kt[{y'hʦ&`OOvg =?A Е+", QF2ﴋ>'%Jjž gGhPOÅuGaUK+.(6"gwicw`Å j!7mg --|X'O)k"*/!|:|(J#E ᠨ##Bl-9#y-]:\sCmZ2d`F Svԑ3o|8Q@/-MV F^OareN*Ps}8'O_&s!pa̩]#k{ G{Ĝf@د ș2pܶY_Ϩ.0%abĝ髚Q8ں/ (B7=lOF{ہ<}zӹZ9X82=Ky,_ ydOtsh/֛Mi\-$ûY, 敜E69ӣ~-8) ( ݚmM Ѻ'O;-O8k]Hs˽xo{ٯq1=uhC(sZBY] `qqwI>?u_F-c$ %r C24y:煂2W\.my,!<23ϿlCduxZ6n nJ|ѱܠ[RvIR3Ha9)e*mӥv䉗ogHH~4/3b;Gzz]7%yWUKܺTQԍTn~cڒD䉛@ZٽpAR?6ô)™2!&>Its,xI۸#O,ˇΛ,} ۸ʖ61J"˽>g:'n;*)d1o397iU6GocVn&8ͬ#7æ)G9k^/|`+789C/% Ǵub{5 ߓ'^Q~X2΋K  [eEB^ddf,KRLD̅<13C?ӿ=?ϔ͹ڈ=FQսMŜF|]gBe5|-fE˂]H4=~<'2xAh<VD#!S@Ϟ$?e1gSƂiN*/7-vRd^w5;0č;pÝJݳr@0 1DXM5Ͷ!UmBIj몘 yf1@. fUv 8}!u%c*EN^.䉗iGy0x/-h!7){z81m5K졼ps!Ol`2[˜TD/^eE5I+[-w Nlɔ<\ eo\+vey˳ܓGʍ쁩2dmFr 9Sʰ0ePdK.dQ۪H ybo{B%/H% @Gf;ĚtD=p>arBZ/ْh|ٔ&B3_nO>Tvf#mV'`)˕!.J4G;Ęu$Jib' D$J1lyTE Aq 0ו8czi9:-0;=Tjlq%3sBNwɴje{{nV: `!*(!.2xRZpz"y.?|-aJ0L؏5Pj߅i@o<4JRBЃWZdHG G Y 8APwJȣH¥dxvpFK>9`/o,:|x q&M4V/H{=|Г-0qd--K݇%dpqϖ^V+eǔ2>ē&O o}˚ qd3Xhc"pU+o| #Ǚ$ }+MJ0rEh="Nk[Gų?җ>[RW=W*} LS4ckL,1IX>vlmN|6*O|yچ_?_<-c)8FJkv.P \/oZ?/R5ō(|ٱf{ܱGB#G6~-GjZgd '48pO6мrė7mtKHwQsˑ xaZɔLQʤ-2L!*OLyܦL$zn, .J2ݡxdM$4d<Ǧ;_4KM1\ Wɕ&]жA%yil "8yRU["KYԿDW*s䡃+MxjB 2c+o4#C' l c0]`B{m /upݑ}v=MOIH VLG,|I|A;&g&lj-og'5_'R׹laeWT[r(I_L_4߾~<_m,G^iK }&_@$YIHhӝ ϞkH/eэƖVZݡ F-bWIĕ7\aNS"`/Em\[|)oZ DD'7 n ҋn օ+OOn EWR,c{lVW6A "[|l)R%'[rսi޴dz5x_Ycb.lMidA΄p6'ir'0T38TDPͥu'pʛ7׏TXlug\A(* QY.n)ud[|lqiɾzB Q/y,vIIM3Oly(|wQJs%)Lb ʕsR.BQү=q =/͕ 7KAW+!W@+ٶ@Ln= ǏGd9: [ rԤwS ɃbNdv:޾U/_}ph>+ʕ,8<bp%2grJT {~4W\iW&qR WR ;P| ˲[ް}?A mkI/%Y-iė7,n-|qE[YM- [\ԡm(S`L]U| & $'\o"O;>#zo A3V?*b %. ?z- ge,9Aq÷jkP_\(Is#&dHV<&w4uz' QwP1xTBy( дډP1 M[ 0V}n͖׀K3ZtIer-A7U0Dž@PľEI*':NJn]~'&=Ĉ?*I mkb$,|[Otq!8mD4o/%<h*`DElIՠUYEq!8Pz)q&&7PPڐ `7"yXwA/d |Uy:y}!\6J _9!?I7fї |jgwz?҇2VB9!Ox%gǡ 4{Zaԕ\pÐYn ѬA BЀ°e84JX؎֫=fV~tGSIXۥKt% Tq@ZٵELG_aJHq%"0#ym'Or/ ƶNl0VU˶0Ia\?h)ie¦ g cWlR`Uey~*z,AĕY"* HV2$OpM(VE:*DOV\l2]@s1v]rEϥPu74VG:vK}ZqQIJc΢q@HxsؔI -srluv4kJX$va/'{\yc vv]Srșiu~]njL۷BndAu! Ktmi:.4I6/Kpus\ 4_]^^  ۲fɻ@ iʄ^{R̵ăAys2 s d#YЕ9!]~rT>We<%K¯&Vn5gz !7\]%dx y !zG%L <||'VyY.]P6TSiNlR,.b0^`s۠R1qYo1ö,Xcӷ ,M?xڟ{7^֎[o iTz^T$Bɥ/t`Fm%v6UX9l;`؀εe) ^oflf[@y'p,h*pK_-3k =!*]oauS3$pYc{7'.`dUpT1ХrT9 uk5S a,Ϩ Q=];5rҷ~@(-ubm\&_\2yNdnNSK oj;ܦ*!kX:9`vvп~m3m x#89mcVɦ:,M4WAAWr_ I-m7'\ bǽWԪ')?,Ց~==8ܥDYmld*5HB~-+ͫtĤСBI #_lʋt;Yǭ.痣ĚXKHd '8FcEv~IZ 2U/9lr3[/R9ĦqVf5Ҹ&W=צ؞<)%SXׇtܜ¹FK:Wq g^dtOA"?9b\e Svi˼]qPKӉH9<-3-@WS!EFyT=ۥV-uM"~.tQ s&X:1h娒ݑ-D-.HD (q+Qmd8iǾǖׅ.]*1b,p-6Xx )O"f\@o9A1D^>>&]\uҊ'\nAs{R4UwCtYLI]iV&-0=+,7Qu>tgSiz`gf~ %Il&LFd[EH6q敏+<LM&Baِc64Ӽ@_m)Dǐ۫"kqJQF+d9Ec}Е cݓLE2w.JU$Rc)Pշ\.Y^ <\f-q<}ہ?ǖG&X_)fxGJuFv+_J6$ U nEFm0@O݉VHWㄩHog*l1ࡦ!Bo;PO"ZڿCW)G`üQ!W;+x͊Eիo WC "ICb-e7k =ykw7kTi[SK!,@._rQVabw!?y92wE:0-Mjqd>Y'Y U?ˬn0J U@ FIǺ@_M/'V]ϕUVGPZU1fTKBqtRlqaȶ f- Ye>uJZ!D;*7i<Ms0m *ptφ灾l ~l!Fk:uI2 D*K; &Z\@u e$EN]Rh*[HR T GU-ݳy/ǷH7bB5ZKI-cv##^+u%f˅!TL3 7(2E MB-(j8n3aUV1]0ʲmTJ0s6='B'>pݣrXiqbyr&%Ti$)vM0dc2[z,ܨuUz~ b Wi82*F:*uω> 7g9ۿI[HLfC(:`U*\> FU/7r..T$nw@ - Yk 11ZH*\4 *hPZ_IT'ys{F<lÍdۭaRe[$MN g>X\D.tm͕ NN))Z^ SJi-d/sCY7f/fJlcsy/n9A['ި9쉫o2Q_M@N8%Q&Z0Q`j)̺Ez5)]E'j"&YGԶT IϵAG3@msy/[~BV7 ҟIi$'|{\9Td1BJ-r2UBn]j4T*;_OBrno:PF)6=BoQ[$=tRԙɈEHȨz䤼4ȤB]6zH ƔPZeJIeiR<|ԡ6=a}w?!IdS:A)`ȜQmH\@rJ-r]ѧFE.j7v+Jk}9T"pu'WSAܹ^s4Ч̂9y/}-QcdɌ=jBTS`('e5\06P*ŚfV?G7%V$n؃AU֭Et4%븩ݳy/$Ѱ˟*a"$DSVZ+W98*4dԲ8_EfhIҐg{E/vb% e %řfj(U~2{Bo;LӈZ%hm 5넹OW\pי X@HFTK"(\dzJx )<:Jˏ4aj.[WtȪsa:=Bo{LO"ٞVJђ X3Cx8 Ct0Q`Ac5K9[ݒ$#ԫ9JΜfnYJZ~Bhlᛝt{&<YM_?\Њ\ä,Mۖ9zIի\$Y(-Nqb%9ڴ9),+cJ͢*%"QZ)QZ~SŲL [dw]l!2g@_5HIbFVƥ\glIl[`U*0Ď`mrt3c$4vWI]RrtE lSIksnTTCuA䚦g@_ȵ\' ,NP<6Q˄l5Λ`][aH 4LǙj-{l4CP6 jXu¢T0Lx 7}oD,Xs@”IԞd60DYf$T<5*teZMBY꾒Hwڀ;ބ(B?aD;\j=kA8ܓgF"Df7}"MD/@XlE'9MPۈ=Oj)hV4K,ђyOZ6Jˈ9T$"*= {BoKIdZB l@ F< ;قYwFUU!LsrM-[i6`Զ*_Mg ⟝j0"nYNpz U˃h Cv rmpua~~R\A4 VTEnjmR\IWe<@ϲ`=AyS\x /3V7{l41|sW( NN@dg7 @l'_Ѡl;f҄R4A!z+R=.A Xy:iq# }!mD˔S1Zd`(ؘ9e36% |4Afv ",lKiD%UHIY/H Ui98&mt32@_P'jVJk3}`a"B<C&z7b$2s[&<3z55UlŨmUUvP켦Czv H%n}!7oگDA%4<̩eRE#Nyl"WЬʠ ""%LZ3b*"J.@ ֨9\Qp%15Qx`5ՈX3zsFD[*gl-7M>h~9}>O?z1+6$t4UM&GTb (4<5ZSWX嬟4j HEUB8gzv5$!)iGl)$ lZr~AHWݗ|=di2_ͺEY|27>®'VmX?|A)0( #b:fH%hMM͇*=*_ k{TNhj 7t <Fwg?jOEo.~wPh3 `h p!&^^XMy@3  &یMdD6Mf;2K?Qo[x/IсHo8i. 7*HH*2ݣ!K6V#?9Yb:z_-Z.)u.Cfnقh~hV}[R aG+B~VN螼 %Nig8*)U%ow(r|O\qxW|VH\"pwޫ_4Jz]׉&"ǒŚ 2ԴI;-BP}E8oN$_.qWd5okA,lhE^1,R~9ӳwttpgO5vYlȜڎ࠙&ic miTOVJsd@[%c4j*t ]R䏞\kPk(|4t4#XɄpcnbcVxz+H%rXI rckJՋ,􅚽zvAE'xh4Ui ޤdSw#i$:Z( HVY4IVPHuzc|VڛT nF44$ >hhR%# Q [#JIeƌ$ͷ\XE&bE_'MLP$<R_U{Q&óX%$ S66-SIMV& fyzX%AHHfr1P2 ƸItަ)N /@ix)æ #VL/q^bv)oфc:7[ |CI6LN #n&_8hȡw#?#o-^ f.S:~uAOf I0α7g[@ja(c0h5ig@z!GiEF]YFCvmrȨ!ø>֌!t]8Mw^xih-먳v9d`n!4:ǔ,&5:(in%\n4gWmˆN3{53&kl`:qN.7u {cVyV-6 sC&:vQw  :F ˜EwQ2gA3iŎF.VܺbK&nL l0|*u;U?K|l:}xgD{"RZz!kґ+!$ضvKӝ,[nn];naů+8EM7$~T0C*wݶ>ې Ͼ:6jbrѐsk],cڭbHnSZ] <;{m!9,2&B[g]G_{dC&_-pQ*ŋ`;k֏XG]n4꼅uiqv^vG}U2=>tET-#p˝NjܝjN۫H}[r$]ĝnJLeegk丂uW;N Ak'E2l+I]Q.}.r|Q+K~Banvꠊݨ_GwqzvE#B yx/'O%!SH;dݖZW|pƻpZO1?wgD)%v(K}%wߧ\tc&MцNAOe\u`7_*p{XK3oݮwnߨV\9Fp/YuO* \ G]& &'aRv#% dKJSǻy,-A;isLEp&LP:UuOLu;'Ooo7g2ңPikG "HYĻag*;H=ms*Adqm/D Pi%C12l KSL{b_zWy|*V %U\G'dNlڬ÷TlrTyT^"45.Ɩd ls_wBMrЖ灾Dc&ѿ_%iW 1Spt@@zH19|)=q*}Aa؟E/.;ZgBˢBMvi4 7υڠu]lCg#tDo(߿( WGǖz1V$?BT3w}FnszEB&4:\_' jR߳菙9QyZuxhtíc ; <8iEb*R!凜Ǿ yi|[t(yaCԌUC(Po<޹dg!Y_d~`5iM(aAOG1bzHà,~b-U{Q*SVϠRf[8𛱱[-nح,R־v4zMUlOrlH^Kdix=89Kv頊^;tL]Z~_;,@]O"[i@Lb2|ldCvF3>i*6͞t [ºRmM%uXgvr`C2X\2C`NB^$ UBq'8$݁%~,XR*H4Mto=(rq%'бuԋt[O+C Ie:sଡ଼zKGi8 >&zL8)}DZo;xp }l90lyz2`#J6AحTm݈0v$pz FB1>k OXiByĖt8QƶW)7PK;vEvcQȖo26`@7'O#mw)vc*5lrCZ&006HO\#-1HKJA{`T lNCL|<N/R`" 8mZj=%xoߠ@Y *he=xJq!@[O\C)H{T$R x "1hֳ;LlD&5jh2l̦Q"9Zr4l8ҾޫRXw'6|N<70ؼ%?↯xJ`-8_7p<+"H^kٍUYfg#͝&iJxx;um 3bp,, cWMʉ,iN#O-Tvt8!P@Wep ZR)MLlm:{'|~[Ӧlc#[еHTfW. Z2ۗ>oa\)9 4[|l82 7±gpi0˴}4XWN%␜~v<ƃd=]r|uGU]Nԉ-l2p^M3> j۳uZ+J##kr,dR~Z =Al jc1ȓ&ɕ`7ai9)I J W4BҴ's5vdJvw` rf ŞC-lh[ ;9vIu 6C,ΒZ]Ec 1htx"S2';wk]x\*6Lr45Ӌ$5`j\Jx,QNVQ8Hù -gD3hwa$j6Wn&LAD6:;42dr^Ȇ lIq>gp ߲ DnPr-m:,ʀ%)\ ԠZThgr6͒ȝ.frW~-G=-7ch$†6$&zg 9"#wu|ĕ[$ [)G*vz9~z;*ZCDR6IpJpleܱs5JgC0treT9aF 2V* pVJz?CM;fDYRlђ;TtEۢ%aɌTD+qZDqCǘpliF6%Bm`Qʕ$X gKe',"liB-PȡJpv4GƚT>9@w(B:νw vA5DQfDi5b;ȗ~,c+XCED7˟cg[reZZZ(Wcӯ eQ8^&t0d[2~!8sو%@O82ҡC`gpNCő3j9 c-r]zgR*wsI\r T3 5=j[o* q_ Nu &;O䈷1E +8=jJ1 v !o(ynAt*㍱Dyy{~w"j/?j+ZtL7o9cNje*>$ݢd}ߍ`Yj `ddݷVJc7}ʤ*,]P>%Jup< Z U27ޠ$Fh rs :BLIԖP;5E"c͙ *Ç1tʧ4z&HXG: H)&Ul 0UhäⰘM[4 6_9% ^:B<9}ߧ4rz͍i0+A r4rҦ>VXoPT+5gPQQ95A[iS>ߣpGs[(9y2sWǚYNp"tENDwď+ kgDh^G;9tR'g FdK\1b28P rM4g蓂ZLNlv?N^d9cYjqȤqQ]$ 4_YR?1n'P ;pa0X$u 6%Uvԕ$z WNOq?F]E,VMN/8G-Q8AiT%^5oii`_7cVRvYHԷ>3&u I2E; A%] mr6h"̈FKB%~TVnPg$k->òE5$DZޠ"iGﲥubUn泾2^䦍X҃튃vP%e&HbXBh s4O,ΠN#-w?G#N2 m|~rbvl7(13l> 0+ cf@{I&_ـiV(<[=o8oPDfҟ)+ $ zSVccuf!7-+I0қ H)$v)}Nly%\A4*r%G!SW)gbA,A̭yJ\}Jr`S>w3c Ò)<o!ևpeJkpnao@T' 8灁b`O*&+!'t1\Tĕr؉c6v,s&'C-zbX,TXݠ {.m1) P._xf;ٌ ]c.o$  p$8 l|?.A 'b FLD@=Y"lIR'"aFqF61'UXo9X#tf[q]fVz ܉29&9Yl g|*9: ͸5A/J?yz"<[%YK -;l-[HHl($"UEeb gіED8UE$d͌Ɔ6iōv&Kd%Yˆ 0ҴuՄɧ"FY0žv $|>- hPIn \R.&@m᧳<^"M+I5pc+e$֙6wQ'>qaj1O]kLTD՚gQlք! 6p,zʉ Xi; 3n/SrT@:)9eP,1=[eAPCиHץ&&ኆ0@5XSɂ&yubXUL3$wyKȅ"nMQaB@E=:zbf5F:199lŐ¾j9e⸃i<*:%YRdK$q 7@ *.{Xs|YPhgz8QcE3PM}K!ˉ#mCoNc w8i3EXF2l4H/@uڢޠ.!{5mFZsR5=P48lzlBج@ק[M:zU5% f}'mq7(p4q6=Oڪ+bqNc w80)q{[,.φ27n5ǚnq8$'c-:I%Iw-bv:HbrOiՓ\ Kܙ"@psݠR\T"F%bgeK%0H%A%ZqϰK$#%:+wjPK^IC_blΨe@ Oق !(}] &6)o4G@K$PLe;kF/Q2ZtbMÉU)V gQ>7ryttnЀ PAPHԲ erD'eOKoFy&&oP5c6^G7;Xf `649mj&r_fQfq_v&xw}1x:NE'qNĆk،`bXKMLXx~.rAr6@ĝr.qPX@^,G ń ̲{e0Bj,M .o6ה{{ h+.3 &M-M|vm{L5s4yPY5-˫`Xtjsnz' 8MvuӈP^wl'u<8ܙ- a4QԚ^k,ً46/q'%IV3 2'9?^s<,-/SE^{d%Sq[s&p h!(8p/[7nrL).AڝXG!_dOow9Kl$rL 68 5o|ze؁)Ocű8,!ԑԒ]!1嘷nΒ^NI1SB>搎sH9%fXR2"Ւw4tN? ^۽ /G{*` >K xd^|Hdmz6Ag&_JQL9+5/>3εl $eR8 L2SYk+gJiO 4X`j03L YB<}tCb. ;Tg~R]ֱBR-4oFH MFcXôl%фuQH?r0OIH IHoPTiDl.ԛ-ݎO 1 }mX۩b%@FC\e$uoJZєT1  :1f=d<+_N=@ $_I:TM͒J1le4t 4b}#!IeRVC5דoq&Eo_M ׋Ѷ[~EI-x> sC"!Īq9@{.r/|ZnyWO$Mi4F-d9管<.=҂uf0a> DB6c@lIhքw/QIV6vX6 ٣<#i(!P5/=jU)EH ־fkGwW(0W^9n)6 燮 49"Z [+p=u WJ( #!5k,5 iI1 `fYqݙ]<\/`?&tQ|LA8n J~LaksbA (dn LҤ7Rw=\i6t3yGuV+-gWP(6ް8TjX]h$#yoE,/h]=m=vRawER[my# ʄȈ%jpotAuPBqZUej>l\억cxqDQIr*M[ bK:g[x])xcvW2$ 53;#8X, KeHF&4p#Ȏ[[BE#^C:7(fIGK^0WlBzDʱA*'K9 1&ly]Q 0f)Em2v̜%+w^.SC%V$7. bX6kѰ {n` ZKʖh, AUhc 3::<fsDJ:6% h(]1;|A^ d"Es\rVt?Οn :KR5)iP-A5#/Jإd Ổ ȝx+;;}SQ,aNRN% X_;vpbPXXs}7Xs ۓeZ5Edh|A!ds#ueJ mƭקq֘G~ CGO' }DQ]G6^QU:rE$%u  JKv;JN-B&Ié҂Pa/ddROQ܂T 9d*me<:VL3yeTNv2w( Du=24R\|]c1LQ=Ld3R)2/&rcO-Rn0ޔ̦Jy2c¤lezleM i <"Hk,v=]j|DOة=ΝgkΎYi'R)T$]}8@>.d_cK*/0vQ^xՋ$-(aa@E ,Bļ%Em;ID)x#>>).o-ϓk2_M79|KnsR&&Fр*ȱXtOV @oQN\L,,a|X%VY2Hcx6F6;,18$2(1IX -cT #H !t8x%XS:|jﰦqxj2{Jfr)=9^~8DUvLhtI(㇑ܐ!S U#6z <;:8_UㅋM-vs`RhCˌhwS%CٶMVe]Wr jX 2k`ap֠c~\c4ljf2"BѦ6{{\TmY9|j鏟x[܋fA[,db"9g}`mfyЧM_>:7OW$\,pݑ S _8ېVM77ࠧ @h vՄ"1wnn B s<-;Ifu⽷ft|~JaKE |JgF= 2R9mˇdzN6/Xqc S| B7C {F~kh`3F8Aqz tn*zˀt[N%*X2d` RCe/cX+D/< jj3n۝\ˡPsTȤ6"%{] =ܕt Ji(TDE Dd e…jYD&I2czӭe06nNjܖ;6az'MAlUs_k_/S*#,p4F g)񱲺I5Oz`o(RnJLר"O"Mo@BϷOD]_`F>#dd@8er~W<h&ֆ$p %߆%^`H>r68ˁp'Tqzhyn5W~4F&;]_ ,;ѥȞg?١^7!Kyphyn4?GRMCy~Å Ʉ~ryn_̿f1!;r .@v=ԬfsӅ Kڡl._0-@inZ\vS]͎/?]`Hyo4(z0}Wkr.ĚÅ$$jq:,~pE&4^`X쓄YYjM !ΓK"Ox>x P@69JH\m}5fG >/w)CA =>B_`0 1Hl?q( H]R\ R#52GtbT"T"W`S4$V&)ɟW^8+wfWLUٳHL`W(؂ ٵl DEHb,ߕpƆ&6Rؒ.Lڸz;+D6w'.8J6# U h4P1u}iN ы!8ZB \8JQ%Y/\,3]Hz1,/cM|xA`2<*u~H 9դb嫏{<q<@4/ 3;\)9Wa1׈m4`Bzajez?w}x0߇;@G2?g&DCcImKZ/j%/0Q,+EԵ!MK4\ 8(KÖ(DV\Ƀϋȳ5I~KE58; FcObpr76ּfTazlUPf^&j&f<0Q3n {ne+rRUvYILAȞG&q}67 ~= ry1쿄@H]wN͋n4C(: 쟽2'cq<ŗO%bN=,L=>|16lmK3oQ@W-(o|s~("I MElj:aa ~,Ί(2Q)$}?zm0Jz+;6NMNǕA&6!!eVNes 8:r1@+,3dH M,Ϙkrd鸫J<Ȥ?C=%AWg. }ivG*"hu "*q4]"ZVHW*}@~ӥ#Z,kV灾xS]k``ZVa@<7 g^FfUwmBRWCFN>ug'l)]+eE˅5K]֥=/upѧ'Eɳo)H|p${ҏK["+lr%+`cK 0y*iOtV^muW03—Nw\hQ ZOZFu| -xo ]+K+H*pB 0a+UGU7=r Jd,y }+G8''1-#E2#x=7=S)hF⁆fz%z/*f!%Ӽ.og&5L*lT3g 4TnI(lR3 W. jA}+//`#/ҳt}dR5`yS3MC 1rQTA%3XMƞSzgebak$6J0L[bQ9gnߥ>T,RKHjQ@Tk,{Iq8t_[ԅFhT!agXyWor #W B>?ңysvd  =GR_kw;eRJ+sE|3[ se/?__}\Ky$navit-0.5.0+dfsg.1/navit/xpm/country_SY.svgz000066400000000000000000000005241264204753600207030ustar00rootroot00000000000000;(zHcountry_SY.svgmQn0 {{$"C64*J/t]6bw[rvtdߗmv*DN4Ǒv!刘FmȌ1 dl`0]s50ج)z jCUUYsqSj- #D4NE6&_p! QYF 5el"D`NUΉRrTJ&"v7ټ zL&i=y}pj]wۄCG g[,&`N|XWYνY}v=navit-0.5.0+dfsg.1/navit/xpm/country_SZ.svgz000066400000000000000000000110461264204753600207050ustar00rootroot000000000000007(zHcountry_SZ.svg\ko[_q|QrEvN iiZE@WHʏ3%-;EE#}ٝGj:NOZT'I_wR{Ao4WOZI닧?yy1{yZ|W~sT:}Y?Zuz:/W^l9v_eϏ:Yv]U9Z8/QQh88z/Oϟ[94m=}RGӪ7ū ֻϚڲ?9C-[pjȪ`?騚o6ί6^~C5_Hִ@`~eP xe`@5-.8\N :UtZ <66y5 z (N'?<_ QӪ&@fӑ|ը:YWz$K1ތםVMH~L-Hbxr .?0Gb)rݠË9DTڬWl]W Ꝯ5!kr<62q/q5ɨwzstf6<okQmFrmdh8;#@,_BrYj4Mt }+Fqd2ɍ-B8nc]Tܞkq)M(>\MTq v7:Ygj-]ˡT½#Oқq2;oՁ6@a>:QuPƓszk~/M s%D&(iXpGJmK:)j)9rr2JRR*}2mK1.jRMK9֪mM㶵 &gחuM1/:F!R;KkZ[QPdeEѕ:,8SFZ,T?|n. sxChB n&2T|V!LZVֆ2h'UQj1oEbN^ >u?7s?oS$[fmS|fg ­N?Qv/3vI;$Abn=%Ab0POUGw"\L 'Rpvc !h$Ԝjb2((HF!> _:d ̊eEAdLBE8":EyKm}2w6;H!쇸tm[p 6fej˫ AV@( 8L^m 7PcM(4P21pI;'x 8ub0Ő"q` (mVi)Ctm孡'Gr Uh^R2/{~GЄ$p"\aL\## FZk7ER-x7">+ZZʀ1pXuT X){֐tQl&l Τ 'L҄_ p5s(lVS,'89Pr ,It )+@f 8ib`T$;bBc@?z(!BTH0B(BZf  F O65xJXwm@\#ceLecك(eQy>Az]QQ'@$^C=&Ob}Q&g {YaTD]n "`u/a!".&=;f )+ŎBB#FȄM"H4{sFN*a vPfdu ;X;uz9GkśwcqwIqm@^{ ^<6HqʾR\g+n)\x/{$a1hxFj۩:&^Pt_S 6i 6mB*I7JZΤt*IN)p&{$VLwIgGoS?< U8]R1™߿N}p&{$xW8s-A*n^<ES!y&܀{ S_{dP!ɹ(< (3G&9$ rd :S2WG[\j<Ԗe&)?DI/ZRZ$KLZ@C2M y&bYrSh|6!OUPhbkrshJ@5n!GKDqK#;-Rf Y!f6s;l(Yy\` 62 ,쇸mI{3~/M.vi$)'>;zY u6Qp1&]CHxLt9(Znavit-0.5.0+dfsg.1/navit/xpm/country_TC.svgz000066400000000000000000000174151264204753600206650ustar00rootroot00000000000000@(zHcountry_TC.svg[YǕ}ϯ f׾t2r a3nRZM9يgl Bb^w9wOf]Rgr>K[nwv/dw 7vw}:n^msi4n߾]md8r~> }n s>Wܘ38;ޟ‧9?m,y7w/Wכe9s,6꼍>Sa=,fڗwWf߷nև&~'6zuXܵdeA. e%V?n߀m/{juzC|8|z3-ZmZ|Wn8_|vy^Zq>yP]eHՇ˹y z~.C?W!nwgMS*}?5n Tmf;vw9"ȟťZs34:ߓkaoov;hfW Hz|?mJ5}ڽϻ_HQ35_mGqNqwsȽ){Qk{vw+^Won.O^/&6S 5']xZ_j|rnݖ?Μo᧳G te~C)Ki>l'K _qz6gJlrЏ^ej>. IU3,C4Q]pB-o6t=$ [ȗsZqj("MvJl[託%fOONm%rnla=kMXZ夗.j6 ,uep&/ z=f'.臑1vqXqjv &ھ9yA7ZpX T+u_'ғ~Tz & *&l3əSy ?Flkgo,G$%JY$(?̽hV#cN ÊS۸O9M9{?*+3ubBFwKL[bX)|QfSc()؅7-(eL$ vː{IGZm)~BI[ m4[8-I~2 VhiB3$7rD%A; ]!b&m| @J JKzf9F4hBCHgкP:%[kACX! re QIc$-45-:{$t !S3LHβ~Pl+d&uu϶zJ#+kLْm,L-$\yM [/vsd&E"# R4A(ʖ%D-$8 $Pشv{?i[q}6r+V0:Nkcˎ)zXNPY i\Z蠋uҼ] fK-<:hgqKȷ+(P B! a0UKZ8TFEi!' `L|hEHQyϟ] wB>!\QW(FF@ $l0zu42ZwLCZ9O0>e (r Q)ڶ<<yQ(U:OQZ_,`ݠ3`Dr!z;Ѹ=̦4N;i@$B8#EAnFH`aB $v` 8 tТ`xhYCzz1kR{j1m!LAxXUN!V^Rp m 4V:'KA8ĩU9W-3tYJj9(N{MA([>\;*?FPL Z‡JGmXU 2FQ[6#)3pʴ#;hfTs{!XªU@X΂n_0ͱݐhOgagHu ,С5Kd0 &-!eBWH- 0 r,I_E8%3 yHIz&oXf$z@G5)&*Ca 98-3reGW<퀼3s2c eqg4.׸*to0iCZDgIHv?z !QM^JeB)R fB#@r8Z zz؍A'?;[nN.e2O Vٌ1r(inn2:ȊFR.pQ34h$E3w(JWqYRa2b*v&eE/ j4IL-m^Tcd/ekOί?YWU?EDZ9.@LYk"Wi3rLx8"E 5J7i%A#mHG`ReDr4x]@"OuF!MwC\$ 3c|Y`ـ&:!% @똡/QzbIpGԉtH A#L:y[Ȁ`(FWgxJb=Η;IaȬC88|KPdrF$U" @\w~N?%!>qiii,4vmU9Pi8[N =aic~:0tan펌⑚t0 L(O\ &.KfF9 CF$;Z4iH5man$DQ<=j,l&f7)ZXqT!IMG[L,e @IAؚɱ% W 9Rh+\vjge5g)MVHAd],ͫ@qhZU,≡b4v~M.Z"FV q.)+U?֊sVDB8AńJ$AvA#Ɉu%uPN:Xf8ki)>8Tbu^*C@saWF1UQJHlZ"!u/Ƃ!)([L q:C.gKB#زPڳZ$)E3m-3tRִw##zK5Re.Z3\ѥHdW9Wj~iBXcM.9剉%ochÀcUt2j?ueFŢ,Vz((Kb6os'0h`rNl.Qrk-#lp7pҟ`_fFZoyF0}d WRmuEZz1zt3^.ڤJ 2*D]MVfT gJ}=#т8OG vlFWfh%oqeI+-%.&t)=̗SZF]~;r8AKRtrRHB(4xa[Y$akv'> zv"E,tTO Utl_L kI*Z'%-VĚ\ZM_!qCA ~z)ҵU`%x4X!i*}C8 RϳX}AZq&.pˆ@8B>2m@9j4@Qi˒ъ;OR"UC 1^ġ& ;ٍ;^N>FitFm ֙(6Zt-1:"Jґ+gdaXٓ|\iߥ |p\v 4tX)dA^:\D)h%:S I>NG 10ل}JW&srBu32k1^yNV^\Y2[񂢌eٶ5vÀYn[|`Ǔshf+e+d(̳2}w8h =Q{7k)4 iA3-u7hQC/>eG_>: MnKvRdH^फ़ )P!"uw[t(:/ñ*-RtF{ϥ TyK[x2NYhk~H.Rt2Cew6!".gphIAO~Ơ#{`' [)AחAgFol XwSGC ?Θ_Lθn g,?a&cUdrƆ'o Zн1Hd36NE8MΘdW'uʫOqƠw3_{컻b}&= j!H;+|6_\쾘G3||1?/Q}1%cg~z| /.+v_\T%* θZtƆʘ1׳it0.~ߝq[9䍫woؼq5|{sejܱO 䏉) Mhٔ3A IcxȽɜ8'|4Xt|DNIُ =N#jh ,ݶ|SdtF ɡ5T\hV!MbUH#W`.HOlln#?$b0`KQu5s ^8kp xl759Ø% ZVM?8h"H?>LU7a 0X6A8cU] ^}6M3?: Krw5` i=b(! |oZtZ2YZAx/Et XgMp#Y+\Jf#O)v<25NZ9.K'^A (c|&y{ێꛁP[ĽXy%C@ܕX23H/H%RSh|0`ы)z<4h[.p_1ЎTs)bM/32W^%v>';x.N<0ƣyq I0YhB[6{cSGH#4ۀsE.}"iUqY|䴅XBnR4օU\NvRHk:0Di_+Z_x_'u Σ.iį τa~OBH7KW8)7KWSAB:oΆst" d޻пNMtA*Bzq?is`͍d,2Bz3E1fr2]H`'Z;QMڡ>ya|=O'Ef*Z{v Fӟ VW:1oNL'ߞ=0ϊ՝ƣXj|C덒&Nԣ-LyV?{9=MCK<'_ 뮑^?? mt h,?^'U@),V\}vWr{*U2ߦnx|iBa&u~'\=o9/wgNuV {dSutJ#gPnavit-0.5.0+dfsg.1/navit/xpm/country_TD.svgz000066400000000000000000000005261264204753600206610ustar00rootroot00000000000000'zHcountry_TD.svgO0$E& pd< )kKKo!1z{׾v8 –hA:3\s!iΔт68[Ë  t<'VC쫧5LE&sa!Jn "^YV\4:oG V0Sc7ЧJ$IpTbBu!d^8 9T&8C+2eHR%!Q`cɡޜ 5& |H8LMj&;D L㸌k7?ebʎAqJOrZƪ~>.ךe)mo*%xEf(wQp}.-ir1Xb!C /ΚH*a?:N} jgYt4Қѐ bjE1!\Pc>N 63%" 4Bnfse]]J`*cVp*Z^~,=6{#(MjUEV핰+j=eQuq 8Dboֽ|ed JyfnsٯֽOwmM #f L 2T [̚X͉?<x^D#&xShv ! >C5E|El Ӳgfn>Ho+[<y?]s.47P罵Cڿ /LREŸ9oiIwtYFǑ G-V9ni}Į8##ć<"8Q I k_ `|# 9XhE?sMw̮?q3)c {LpH]Jh1 &3*Z U^^HOeaK J@ռtXF9EBJr'|!v Ʃa@eYa@Q^Sy.5LSz.OD";ap8D :0(!UMUDJRS/85&kCI1AE;źG!Tlp?wp˗7j82dF>/q.i&&f f,]SAdQJA4m !c Q 8+J8y8AIZp6,@y9: d3qRl&=*l7 rM@era_HvPX]Jr )A < t;@NT#n⿔^vq~׺~eYH} ^!k$|*QM4<N0V#4;B -Wy~`x;&bQjkj߾3^uL_V[VYm#}zF0@E!%& !SO_[SV[o6 _67:yA79f!| IE iL0 >7+Hf֬6Epoj navit-0.5.0+dfsg.1/navit/xpm/country_TG.svgz000066400000000000000000000007431264204753600206650ustar00rootroot00000000000000=(zHcountry_TG.svgAo0 pb(%%SRtl#0h XR#Bd cj͍ީ s \JuhZ-&z֮iY[ֈ2o?ӗ1F$9 ]i.bse}zkK>]-SYSvc,-!vSJvl|h|<-\+z.ΰBY(p`N <F>tw-~ma[T,#gr_ſLB9E|cy/(~Snavit-0.5.0+dfsg.1/navit/xpm/country_TH.svgz000066400000000000000000000005611264204753600206640ustar00rootroot00000000000000<(zHcountry_TH.svgr0G+6[sTnavit-0.5.0+dfsg.1/navit/xpm/country_TJ.svgz000066400000000000000000000036661264204753600206770ustar00rootroot00000000000000<(zHcountry_TJ.svgXێ}C{:ꮾ b jpVAXqG) )qϩ!9C1F/${zrԩZB}i7j9HJ~|VwT}oy]Ө7VՇV],>owHFZu^mvCvT~w7jAՏoUL&tדɫʫi2Rn~1{wzyܭ'r/M`H+on~zjXGC˭liZTD5*XS@g^cw]y/trΓpnz1)2eӮ]J,ۉ(K0ʬ*{+Bq7| \eQx սhw6ilj| خfZomJ}q+×M;۩9igu(SVTMF.]{EFr'˿kfN홇M{n7xw?%bo}{<*]yB7Y,\;ctƸL3&X_&tM|DNGYm eX@a!ZzI^g+^\4.CC:{Mᄊ|L@t4LB)vV`,ȑImlDlFBC^MˆއdK`gaLL8lsl(d}H.ӝ@e!`N *05Y%qtz4}LXb7>q?fR+AP;lԂ6-bmD!ȼEq'AAL.4SjI(% & 19wMz<o3)o reqCH3xT R6R4xs˧p\˥Og38զ\ goX{[hM΁Ix4>է;v9_Ib)L.RzJAmGdAq'ކ*-'YwF#D40fp(O,#n= SbB!>ŠoD. NحNըNg$iC5Ѹm%֘@<֗ gTX?r⡐9o}v@rG :htuᑥ+ebO%( LQeE Z#Tr`ct=c"`^-~X-Y^͗;lK2Mrm> T>3BIF ![U@aF FAĊ(0;} I1,93B 3:cf89y0xrT^yΚbdRi3-$'{meF D ˩*Q3ǮP#S((;]دeCp$tgY< |hxl(\;@;(*SQѹ*w3@3.BڅeP|_Gd1p+ ΍{`LӤ"PӮ,O{>LGc-HEQR³s)>)\8h%H; c.R6 w= }Sv!9aҽ<𝈰z; vA4ϱ沮1o:hdwjRE4t];Ֆi4/a4h|^><-/c܌i1N^b20`Kly%Y*U3ny fC5C`B|>nZwiA)ȮijhԚ ښfnU=΂l0k(}i6"hhQ|MAxtӼT(Ɨ A).t7/c]t"sȮfz渻dVM﫧 ,߰Pney(lVU=f7B/"aR}HzK-[OM=-7^O-8+̽i0\ҩ'r(iOf8!3,()$k͍GmlJ7q{D^EGa! kCA)t 6zE1PX';m2!ıX_eQr}Cptx"ŴYY$ѓ")-P)Ժ*+w9($N[!mTd=%mk ^ITןZ ;e4o NH|N޻VhPA=Ķ簇Ʀy/}ȞYv1 cT5IͶ-uuE9S\R Ȟ Doj>i{E=Lst,@^3lS*/ =7-c i6[#tv1i|kk >z?Ǯ/}SCU navit-0.5.0+dfsg.1/navit/xpm/country_TL.svgz000066400000000000000000000020001264204753600206560ustar00rootroot00000000000000=(zHcountry_TL.svgUێ8}`]-\͆d[ieGEN`Nә2#XBU:>.ǶelmɊ+QT&y*ٕ?f To-kiѺN=:TN庐پ,˂U #5eܓJAijp~w5U9?E6buA1aQm?ܪ}{f[sD<(in K`z_ `Gi@V'%JwY)!N7dF4`1pλ[X>p@[D($7w3XV<ѯP7T>E5?kD`] `|G{9 ]m%Ҕ?dy"$$ E%ġ >)$$$;~_(zl qDߧ,0GI0p)x)A4h4Bq@3WIpPBQ'IЄ`B;3DÄ%whXM;5}?@MŅ navit-0.5.0+dfsg.1/navit/xpm/country_TM.svgz000066400000000000000000000414241264204753600206740ustar00rootroot00000000000000@(zHcountry_TM.svg]_s7Oӽl1x\uUWv[qd|5fØ,Jzԃ~`ۯ?[rԹͫo޼^,>^޼|Ojx凫ş~xϟؽw w~͟{9xqQٗ{k_l _߾ş~7_ݔ]__./\ųrxoW܄ ^׶{o/.R\jH6W>xt.^ĞNɱ˛O?󋋟/o?^gbtᎂr^w.ir| 5x8 t2jQz}9үF\ G@7O׿_='_zH~]=tOW9V#7|sukNUC\Ew{eĎ6pO.oߎM ǂcTu] o(!kAr!.&;JeR. :|". ERq, (m;&_(ډg.]u20u^|͇S bu:sgrf\.Uc'%ٺ xt% I.B]Ag͸ixv8.Ǜ$۰tj vmPds0uQk6GUGMY`NTEޕݕ_!ۂ.lexoix~GR3R;v[*=72Kܩ6Q[׶;R@n,cfcs>۔QpKr^(z|ˊc(mLSy4G$PQ$"@eα8*Shvp-PE9lWSMq(Up 3ԢsQ:Њ+&ѢnVሇQإJPҢ{9Yjq(zLꃃC-Z0ICu9Z$}APwx _LB"xRK(-yl7~]@> gPHx\q'q"0[yQY!2c4ZGyC`K!1焍PNB%h .vPWgJ'3)  <-1z&"sQ\^a HDaLa<wPg{l$- /y-FG=#/SY|vSUٲ@AȟНOP/_.kTQP!CZT6 >Ha;(l׋q(Fh$MAHVx%{МȱJ9V.-[Nt7k-"*Zl@ *K8|j–Y}LϏPHrASj4.}wJˑ3VZ թ9'uj]|{xH3$3O$3gC} w̑&*f6G'9?Qedn!&3 N=4y1ڒRy i3s&Gsl|4[5#nsb%GJىUYMbNm6ymܡ<Iˋ74d& Õm}0-|3ɗWWֆ+{G͒\yd׶q ܩ!!D(aͽ= ?dK٫2OCCD5i!jɭX!mxm6$$+(M Zي*kOZՍѣǍ˰QJؾRl#+Ril)tSZMUZs)2OH1;HH:O2-{QH4a;1CFH6WdߢS _M@oԖZ^1l#T#M89Z?zREUֺVݸȚ۱Hk>I=՝n_Gk7fMs26eP/n {m=Q>ZTꂳ˕UhId_8._g1u>$sؔO yۏlMf!¸{ݖa Ɗ!Fr^Ql Iio-qټz٭^hwQW Ah,gCE UPVPm  b[S$]R8l"ӎ>_sw+:wڕ},޸Ksy-l$[ kؤ) uwXU7VHG*} VPv7O=R( )~:QOAGC?1 TRHehH5ǃe.AR(/B>-SdsO,g[o67lAFB{= k P^*K1ȣ8Pb۹R>qLΣ ΒE*.# 䞶3_*߳G(X^2]Ѡw/@ ΓYC{=_Aqqa!-s|70!)oH` ]懄.c:n]lnb϶D'G<OQÃ!x๼^9s 4E$vv8T R ͬɕ]=cQ;"׻w}蓝>y$r{TLmە}i[w6[d(p9e0YuS&a [skr4 FT1U+&ݪIb)Lv@UFIimb&UOj&5ZŤ7uҺzD񳓼IZ}Q(+?'+rՓIM.X[&0iݛϻ;T^c5ﺃg,p`ygQc@Տ(#}UT-|Nm[ ?n̝B ><2^S+bQeQ {Џ]9 0Lխ#ȩ?m&gBbRnW{;|%;c9Zq*i?;TҪ?!{scS5yuţ҈Ilcr6AvHu9Mw^3c+wCkVVWԊCչ9:ﳨ"*Eة S7=6n,j]Y}Ii\SGB%ΨąL0nH-bҐ~L z+ލ='`ҸqFrmvCYݛù^/E+ek;vd$)O$>7sCg_ff f_gC!lC"޷XXJ<1_}0Μn0lm E*"(m)+vUNOk%)ԅ zS>pRAmU`Mݚ>Ӻw\bۦ[~0`MCEʯ7~`K7?A~[mEͅlzo) (BJ_ĭf[?RZ^M| xlRo4enk4]u>惜~ qtn>S2h e>^徾[>M[h~o_glۣ}7>W!msf\ǪKm_,$Å5?, ^!^pڒIvae %m7*Fa 9r0bmkjBl6ɵSz3.e<$VǰZ-6D-np>jD|"հc8hLq@fR=1B/,hK;GTHE ). Q<4zjJH6&&0-kxDIMF51 ?:)J$ll F9V6F /RL5lZw ל8c` n%nf VѶ5ǠӤ'(ezցp2tSHjZYүC)mb$kbU6HCwOX rSOEc9`,,Y LzmTD1`YC#ۘFH/heXsg>ZXLգ~В)V++r٣ e ړs-r欫8@on{Y_ &J8Mͣ[k8o.[& r+&F_9Y79'kyWXd/hijOv(X˭Vޘ]򖼱~䝶sL e7}R71d.Vxc`qZf@٪Ge|3 :X1QF|lKv_.r׈!Ԅz !GYa՜|y(Xb__JvDT()0¤/Sƒܿ! ֿH~1FBݴ&si"gM5(o:HO:.v%qխ0y5|t^/<_KPej|/mIڕB;)ׁ7.m76\7 qO|t/<>z]]Yuty3&K[ZOD׋2Fr Hv6?>3Y^rvB\8~ R=$Zg=Z_+:P1Py0h# v %N:NQN* L4LFߢt^y,PK2L:)jiXeܚӡlnH5ojIʿ4|恊̚i: Tvn2^j[]DVvCbWbD9^Άychq'ֵS>8hWwGuIš˓dD;9LgB9E2CHwAp8ڭ fe wĕXar ,I ,'L>4X1F=uS n|Wqŕ:B+u+/`WF1ʶr'bxV5ދ57҆|,ZV9Mc#sgEg9 m K h3ضXy$p]33ضR=+ z()1t٠S zPg5`s™4v+/;|2i8j1(~6⼀w?zuG)rO%~OG( o:Hwy?:qw&=*KH IJsVƬp?ڦ3ơ:TS<ɵi%xg=uԞx$kpL;X6o4ԁZ|OrX燌>V=p$ :%5~UvMH^sc'>Jz?ڬ]%qֻثj߲6y/եw;^sSJY_iRM34wWZ@‡.hdvrQkwZd'%05.`dOX\@B^% |G9ڭd?demq KU.sThNX/ 70Jo+7$#2?Ĺ(#1H ySRzBylo)YViKmєrhIUdWH,"4ĵe>/Iek2 M!Hm*XYXS baUK8E=5QC3N';;96b bkO=S0Rl9Du"_ưc~QعKN|O$ftΉ`͖q/I6Hqu"R(!Ε*yd #2G+zb ^$Hgwus%K@,ڰOee l߉z4qEpOq>ocsz85~|nUE#Ń%DNEί_AίZtdS'GSB>$:Is"v.:WjikAJF 8mFf7|ZoGOl߶T{ $/4Jlĸe~ߺjWFv߈xc*3wlK|3y+b{=L| 8I6)>gE/mR ass7 > < siKFv?^HG[> %NjS?V %C%C>2 ǂts*c'2TTϓGuә`K씲yxd\|gˣf3Nnzs1hX\ER!|D1{IO~֍}xn\Zqlw<k0jlxܙkJ?yi]1Jʔxo[ʶCems~9jEگ_Ɂ"1@ 314i󛱺;~VLRBx[yRySyHE[*KNYJ-N-eDSji)+|Sn21ىrqMNd$əTO"zɄq{l5m18Rȥ5Th?RaŨbV uVՍR0(M9V)- nJqd_ЊX؎p,A/:UIGHM4ŀT`}$wt*Ýp @P-,]eSp vZzcjLzɦ4c{9&}($!qfU3^W㙎dSǪђ]msᄉ90j(wy,F^X7~̹FD|lqJ4 MW#.xh;|I;rzXNT0a[N7 {tnû nyGyఝFo=}&1lm7WM". "zXQi'LTa1ԔSт+Xmq 7NN+,݋R8V%qy~Rf:LuӇΥ]6KCEZAo|q >s{f2WΗfBW 5Y}KxSq|½{ĵVM vG55㽹ܴC]x0bWj{}#MG\[ +X39OQ\mwjk&jC)-=dQY(2,aYTgk&2]4u2YmID 8;&g!vmϵ3q+1y1\RNoxܪ%`7ոE-o4KMXdm7fj2o.`° y1ĪԔU\ Է̗6ERHoI[[Vli;ewz ַ[UU-Sf#vzVdN|;&olVQr=5rH) 4aWI}ys{͉s%hI%%%`6 5Y2} ں/[pFƶc̼ؖZ{X&[;,aD8ߴ6^mnr RG;wAOu)US{S7=NTWbvOz!Pd3V'vmt_=_"faK@`ݖ,!4Ci_M.uo Ec/k7ww)NdhB^*[) yH+uw(][ +\͵@b@B#PPed (]*2jeIu';y4ᷜ'í<yձa =Ͳxkm'8c]ɫ޻VLTt1pmH5ʯ `wc/ջíz6Ǽ9S<GB l:ƏUGQ㧣>OG}m<9~DFV07ԻaHst鉏'>&>NG|@ <^:у1aP0p*z%Ҽ_"KZs^?yQ<쨱V2Ե?sI=4chPpFA<2EAQǖ]JojyN>ݔU_RsQ_9,Kl;j^vE]DZ؝jꑍ2M(O:֨ K}+_=@ F͹(nC3wj (FYbOXOZX8Yk8AQp/fYv5-P:j[r$u'"SoCb -WZ†"KpxzjԇMDG)9;Pc  Tt5e|m|a(LN,:b4F;b4=VMQ0[f|Zukij1:G>`/J;~wQF ,6IVK*|6Bs=;_.О4TV#_R=J2q/s9c)Rj(6/w#J ۀ)q8JM=jRwNg\!bARb4f׃Jbu"FR^;E 5ω,+Wezz2;F|i@Q)aRecm`,e+Mp73aif0"p\ᄡ3oҪ/X:)/拥|E_%uϹ6ܳ@nڝk(=fK7ńk׉iwW0g8B& KTX8hSQĤY^#3 Y~G\5Q0$4+-ڜΕ+9r* 4|Jkqrqk0VXhi%#$C48/=l)D,Pb(fkC`lyJZVP\N gOǍkQ E_4u6`>cad 3 eׂ̓f](ɇ) H3m! 7CuJR2lڥIkә|f~{5!ܭf*nvw\V Y|/sWY[$&3K#lނ/hU߂ aRv8"cX0{LI<++ %)ڇ^ Ea;3)̵]IJG WM:`T JqԷ|aU '\!1taP阆-Pk~<&bVneׂF\`"׉r*gcoSξ9.I1k[T~ >c&oΧW[$sϤ99"Orr\ZNeKY85\k' vڄjhH chFgPNl{D}?[rȎ~{O "ԉRg+,qzƖ<_;}x7B%GT(KV `/_<zHG^F+޽# &NS =)eB8ѵ}31Mi9ב7X@lft(N̕ԃJ z)B;5_{a] ۝n8f/] E] LP ;lGb;??dl9hT鿭%KB(qӿ)tɡ|I E>s=2G&/ε !/g @B[=|[uz~} H' /tOnavit-0.5.0+dfsg.1/navit/xpm/country_TO.svgz000066400000000000000000000003751264204753600206760ustar00rootroot00000000000000>(zHcountry_TO.svgAn0E9h.'B=@, )АTr`Ta!(SJ1ETh,]>B sBx#l߈=`uZ,o*ݴ1Ng=j_셑 K NT&yJ7l8+rԺJzjxË6^b,i92Uh@Vj+4 O^|Qnavit-0.5.0+dfsg.1/navit/xpm/country_TR.svgz000066400000000000000000000007551264204753600207030ustar00rootroot00000000000000?(zHcountry_TR.svgRak0_q1H$MФ-ng+*Y?YNld_|{ޝ' /4B YD*t)T& 46We.xb >}\|K,WKX!mFmiS[ojQ4Ё#c,*mNcnEik5Um3ORQfx# VCpT)+g[)z6N: +͐1 vVRfh8>$#^؃?_USHf[C9v ٯtur{4XfS>C79"|h)ݻ9 *lUZ{kD*$6Z(,`Aޔddp Ն3|?" YHow} kǯȿai:~UE|navit-0.5.0+dfsg.1/navit/xpm/country_TT.svgz000066400000000000000000000004711264204753600207000ustar00rootroot00000000000000>(zHcountry_TT.svgmn E׍m ~AdmH]6Q\_RUubΙa#w8E Uy^g͘E"vKƆaCB}0,VdyWȕR lZ M425Ý?j@$A%!"R zS]2&_KI"#w Z̄_[pD "-te?"y(ޫ仄i&U$KT>!iZ`! 9fE{navit-0.5.0+dfsg.1/navit/xpm/country_TV.svgz000066400000000000000000000032611264204753600207020ustar00rootroot00000000000000A(zHcountry_TV.svgYn8}WhkQCv_],(P(}8!qߡ"u 93̈hfmݪXe&ۖJ,YN`[$Zgifx5qwJJ/uGe^j ]wۡU-DYp-ǁeY0mZIѝgdžR iV`8R۟;jsP{U:%:i;#nTbU߸ , .|ے "(>QR:63h%[`z)%3|TvKZ,*Kb\@\_:{AVmf;pX͆Z}7JGI#Zp#yiV_8'˯.\ Yf}ъIB Dbu- ߁)~:&qM$YAGZ?Ilm 1uEJjDmCP9^=Z{&Ud;P:Vf'd >Vޕc€xcCݘX Acs6'Ep E-n`)3HK Z[)lgjq(ew!iRuyiL5E'_PeAC& #^TNO0:@Y7hKh#Z&Τk9Djx(JޘSCo*T*͒MZ)hu+$FeW[UB3ݲ`Z1L`̭?,Qf)p|"hAZb> 8>b_ad)(=d9X_difd R >܇@0 Rg)V*$ثa'̷lQog G!8򽀐TIQ 2E0:a5UGSE3SE0E\5Y埨:*򓲊 gI%=NLnnR <~a0Wv~~å~/W_xv_1`L?*1UOJnb1<4^1W>PU 5*+E&30 "AVKijC>C qΤ GjgI: H$^9;44lcYc =HHD=?29{IQL9<aN0FӵXbV-j[v~2ɯjB fޯ_o`6մBoU®E[mj|'}|d.ajdUcyy*ZR:1<#-+2W}(Oxi௿`L_W?2߶ *I9{BjVRZ*ՙ Nާސׇˢap*a^8B^A??tjNι 8t_2ZЏno ؈Ό3vu \%'Fda =`p,3払2Nr0&Y&00x !NPH;65xpqRYqX9fhyYTu W6:`7 [2i){f=yLw lnavit-0.5.0+dfsg.1/navit/xpm/country_TZ.svgz000066400000000000000000000006401264204753600207040ustar00rootroot00000000000000<(zHcountry_TZ.svgN0EWanBTu!+nb8Ug l̝sg7φժԅDY!MNJLMa[q1) >CJG?%k{WYnavit-0.5.0+dfsg.1/navit/xpm/country_UA.svgz000066400000000000000000000004121264204753600206510ustar00rootroot00000000000000A(zHcountry_UA.svgAK@q<ɚjU-"*ʒ$qSKW؃0{j7Y"X']oG|6'Sy]-Xmo 3 *7%FxDunCO|CCA[]Y bR0d,Nb̉>a\_Ϳ?xc iü/73\,9r|\j'g~pڹMs<\<\[ޜ_ u{;7zys|_C.ַ뻇qvq:i?A#.9>\f1ݰ^ p=_yCI}7;CE~u\䃭w"TW>MdD;/Ctq cR}nO^^(\. yܯ\a=ݞoW?ŋt0/Ǟ%Q\'"eA gJ5NQ}&u5 TR0 nt=hz jMcoC.8Sbg]!_ [W~`/9(cα`pdQ`uEa0qcśJ{TsT,Rqr;Jy$,#į&c-PRteOB"(4 PPKďa9"T,c)8R14ir4XS\Dkf}W .S=}'C(>ƀʐ!o^̱@~ЛvMCP;H][lcn ,"sPXH\~C&$KAXXHΫ#v fH;$D=@%uxޭ;14E^])%&L^Ed df$)ZXŦWW±$3#;1-tMm,*c Si-鍼JܭXf>/2U8D 1@尭$ȞCer2g6جDҤp$[5)-!Bc@UXaɩ9vK~L}F]`~tBmgv2po@; &а$TbVEu˵]2@OSH`5 +~ްY3ab(]Ix8(PF4!moUr\M{GD A"#a{cHʆ-UDY1@`BU)MWw^ 墬oPyd꠶t\7؟B5FXY| Z C0Vkc/7zV"p^ } #kyS W,i`j%g1L[ 2f1*Rm@1ܒ5#8Z4 ^8^ [eFH-:l}&=@(C!Xd Uil j7vIeOl+1v,Rx<bh).Y֧du@4 jg f( 2Džh?B4ޛ@MhN!1ybSeqUS j1 ndsItVwHjʘ<bgv/qqm 3?D1Cۓ%¬/YrJv-uFsf{go'ge`چ^.{RIIZ]Atbޚg_W,gmy@6eGG/ҤstC | *lB3I8025j@7jAUgHݬz RIٴA lN:W~4[Q[06M/[%${ Ezx驢MO1X =N#b/j45kWom:z \$?=[r43. C?!=hjvu] DAw3YfѶCS1(h/ MͺCTxE0#Zf>eqrm7n8;e:˳V:{ld-`]dn%(Po&;_ZũrC9j-| ônavit-0.5.0+dfsg.1/navit/xpm/country_UM.svgz000066400000000000000000000011161264204753600206670ustar00rootroot00000000000000C(zHcountry_UM.svgUKo@WL6[2c vEHuZR lwE`{,38WCOAQY"A8 ]tj=q.6_wP>pwOcv?nh"!UU镡gEo /}%+a)G I-㤥CgGݴTy5U>"].9EPž$Aa$\dqPgs.FZӜꝓ롼vpml@b ;vYgeƨX/Ie0(aS%<(JZr`">rS[].=U%@qĊ8\ѽs Aj w3?ԙJO 9a#09G`#"siu贖f[vftE󘨕Ŝ. e+>kG~;֓@#navit-0.5.0+dfsg.1/navit/xpm/country_US.svgz000066400000000000000000000011161264204753600206750ustar00rootroot00000000000000B(zHcountry_US.svgUKo@WL6[2c vEHuZR lwE`{,38WCOAQY"A8 ]tj=q.6_wP>pwOcv?nh"!UU镡gEo /}%+a)G I-㤥CgGݴTy5U>"].9EPž$Aa$\dqPgs.FZӜꝓ롼vpml@b ;vYgeƨX/Ie0(aS%<(JZr`">rS[].=U%@qĊ8\ѽs Aj w3?ԙJO 9a#09G`#"siu贖f[vftE󘨕Ŝ. e+>kG~;֓@#navit-0.5.0+dfsg.1/navit/xpm/country_UY.svgz000066400000000000000000000016261264204753600207110ustar00rootroot00000000000000C(zHcountry_UY.svgVKO@+*Nm 5mU+V Nld3k*|8͟ SFt*Mp/Bմ}\<ϊEqk l@KGФױܤȋ&c!mrj~%T*Z2cp`,d9H­AoX ĩ%d|+chn,ՅӨf)іdlK+ZNˠҲ̫U&m3z|jUF_\RŕZD 0\Eh.xLƀY2#~ c&XC t| oli]Ŋ>9c&L]F_O[w85K׬D_ݭ,Wᷠ<., _~WI:Ζ.^=y~Is918v XnU[ I֨#} F-^~8C1T q<|4]sGp$;QGq bbܹ?ֽiy3Jn#)Z)>4)C0ʓQ)mMC;cqpomXS6cG7#q#xhnXMD{Rrn%#X50 KA=eBBgBн9Qm@ ㍐p^"1}r hjF`pVףƭ@V-<õz~?@ȤAWPD+ܙy>{˫PzҘ|k;f4Vg%<ߒM'}dm6~n>lH_KΫ0:Y,ԼdP&1#wa6~z~z:__NEI-oF+ry۫6IOR9[!˫0]Uz^ܴYܮonׯl#5.=&x>[&' QB,QAzC Y,_FoE}~9GGտ/ 7Y=i>m"j6Mg?ُHwVyV Zl㬱g>ӷ̷ HI߻|4!)z;(_b*o~XNeuAm\/fE[Kv].Pl1[1h*$ZoR`dUJY++Uxւ ʑ,U jqÇofs)(X {Uӱ:xzgJ-NjmRt(F]EˋMV1tXWw,o$Ͷ(YIb6Xh4}\U$|v!MװPu:a+nWg12&; jcU(n.'k< SS: OKNd`2' tNd (t' `Nd`2`2Љ L;RP!hZPQ0@AiS<!HТqFDmP{u|3艞|QR'D!|Qm#&M>E>|VOA>X9h#`c6JM4)~hMߗw))Hd8% #TId8U NT8YDS:TId'2 ,3nHkwj1_W?so>|w5οK <=/&V]7䜫u1׺N@Y*'n* )p %NPuiR>@h嶶7c36]+\TЍUF{E'!M^Րٻɰe$7lhk܃00kczKhMIB J}hӺ6RWflU)Ԫ!">J.ͅ}Tsg)4}f$T"KFG`7W.9UΟ嬧I\ne.\Ұq0A+c𵯵\ʨtZ[sIRJ5$듃/SWw*nԺY>^/힦O?z^7Zn9X XX-&2=R'J5aJBQT* Φ79Zf Mm^ہq;=={O!^jhm-a3\w1`2WX syl"~mє֒x-42K:[Φ߹-ah}.oXDϾlaV &V6c{0y 4ΰy5D<_ ޜGy-㢚f1[! 1@^ѮC+ő@?0ҩ H\/CM>M"e&zW"s 1Dv;SH!kyP3c%|~8GWx7q3a<iws^ G`||Z1ߝF`/y~*yĜgaW^!G֫Y!vD ՉIz@JLi?s7y#4,QOEתsiPF Bg؂N3; vڐ:bz{Mp/MT~-o>Q3>CqNƓAIS<_FF!,Yg\V`r/9$9bƷ"}ex-e<cf_}|ES|EtWTuE+jz{=ǧtRv|EaQ C6{2>hw̌c|kW=xsԦ>y+cTi8< ](DrT;PDxlKiAl=;vjH`E^[(9^B(a l"V&@00šqhخF!ӂy{xKcxA}ntY9 vd pn irˆcmd.I]|c7Vml]k$V&:y#'rb =}s^oi`Cz eM!4_yoJ==|(mGys-"% OE92[*5u $4g/, /aM*gcv.Xd`7 رic!XSG#]]|@kn"*LKu!v2K,B4G,H O2ce(Ln]V+V "cgg"~)SBaJ&6m0r7 H;P|E`pC;;t9Z#% Z @RetKJTicyk}3lcgFM0D>Y+z#J;GIFLV-:}C|}[%JOQ i5."rÒ1g^KIr:*q쥐jnϔst*2A6|2aC;49_q|Yrd LVbHa #%9Lo'A"s 9lWC05rC- ֝7d9_m$pr*:$1zꄵ64oT܆·^GZW>8t"8,xYW*UF>z5D ^ c 8r>6첂H> {)|`S]#u.\F`;4;vLT7|[o5kSL{]y$JSȔw_@Q6ϼa)dG!e){ ka1DY>EMx,"'|8_ZTګbMҧzorptJL0D$ uI P{2z$~mɹ@Ya+&LE#XVjdύ_EKm [&>L)Kk/*&jYIŞЇ47L$RudB6Ul&r7-6iai9PlIa4NGh-"G+ULq0)ΖI0y_1f[9RZ$i >ޫ.KqT4ӯswƱoJwu(*H;J_ 6?QdՋ/~azZIk|uaDbIutu7P?dJsn"EG"wS"rH d*!t*PcBR5D䤬nJEDO֑b"ߧqmh"&)Spq) ·MzՐqkq1p 3!,Ɩ&J Pp̯WMӊIpP0x-HFW@[mܯwy?sF>rF3TEOf$R@aOA&mIdI)B7"·i E(~,akdL=-@ LXfjjjF2ri5b6]W5 T¯s.svPdהٴR4_LϜօ6*{Kd~~kz`( S3M1fl5[L4lmHeQ\SjOԑ=Zu&!CT:6*>?1Y ȍ!%?ʉ)dSOnN[i^ysX)g?Tm*Ygd(#Xz6Zύƭj=@W=œ){'[y֌dvpڣЭtg擘G}dЮA(fgqȗǏef_e4Ӓ}a#Pj?E}Px%ʠbZ^2ڃk-^O4SX{|.fҠC}xiz=kDn%9fo:4@i:L,&ǥSd` bq!AlR S 4"&xb,ajz"=gWl۟C 4A r`>.<`! )1ɩdYn1<|?N;/kqlyf4%_1&{Q֝@bрa ˶l h[suyxs=2G2g3;&BJ3I) |mtٶkm4#}ݬ%sJ3 ̚эLJC͈_Yy<ڵva6 k$ZkۈROneC1~xf,`^^P9K\zzrBxjfj&:k"F(aI7m^^Ҩ3ZAK66-]5.䖍&* ma` -Q1a=.ݿR+1춦2UKn2_Ҁ&E/î9?M^ʕb&ez]W4,痥w5C7}/lzSe2gr/sRSc^B$ `^p;_IW>WiNC*Ǿ@R[:QϲN&-M 펶3rGϾ]Fj3} ZY:#٨:t̕QIgEI7rKNe4xږq^7iE6HדHf%Uڤsv4~W{x<&jO3|WUvjvyW|jl)dxe,̂z9M?W63> oL;{?a L-K:*V ͘\&L'⍛]c`P:f&GYb|"YHQx CgΧ ?r*ܝ̎dA.K0^./1A9ёӥɧn!:]~r3Z9y[?x>8Hh;&yNȆ͍˷>8lܽ(j7Ϛa@Ӵ0SsÌ}K)W9a̳a._uw3kOͣT7ќB/ Gd MMӬcfXj_FIEDWDqf8t+b[y$i|` k={8!bTֹ4M =̶>Bj[6R^ նgMPʋT[Pʦ_P8bQ _M9^Fp96 hU>\tvRd,kw Fk?h @y)XmkvJ}&i56lwoJ{J=鍙[s'}|7 oXƨtT!5>ư'E;x/ #]ԙrcB:Y"8 R:`}F}:,e˼=ɗ}K^}+~ݥ}À}1Ixۆ2xϏ E8T+e6۷v2 c6SaZc{gi4^pcoŒ3/H/WꇷB~'B|{zFҗZ^> 5 +|m0`qdO}+;Mܮc.8#Vwa_ Bu;dBx S܍$7yrE7e̿HcŔa/Wtt͍st7 Z~R,v{S;ˉ^bl;hn{7 ~LlWůƼ;雳]l\'i>_4`}Àf[_Np͔y Ʊy - }pWcm0`>jӯVvy2ʛl܋qwa=MyGY 4|Oin]mmFl|7#vk4+|Xkw*[cwxq?\q ͳm՛{aؾ ӿNj:tܛm\wy四aܾGz8SO:9Ig9N]#}I﩮`\|^<Dh= &8*_0]oj> !Mp'N!q[#eW{'{`.рteRˁns\'L ϲ9sNO89wW.qr\898/pr)acp_qr<)'NN!M9hgĚrUzBI 0$"P9D$/r;%i*TNP9&z /rz~ʱ%TN̏P9<@6ʁ%TP9WTT/r{*'vP9 o8dGr/yʹ~ *'ە7@rNC~9sio+W8\UrұUO0ދ6P9epʹ.Tiaruށ`)D +Bq JKS`j(rt!Su,xFf_Td*#lizG'.Tf l+I g!;njFۆO) 0 A2؎?z+-Tڮ ?$Y`RMq4T !$hyN/3j22e50Q4LFTHD[hs>mM2˔X'19K9S$[h[&CϦjD0R**(EX`5=\u_uj bSfD|%W [Tz3N|3|teuz`3Ik3IhQ g'쯼C)s)ϰp=9#eǓ#T\3.Tu IC^J!.Vd UBnR#5T]oKQUq ?5G8(dJaX #DP|IyNBPǫStСX^5opue1*ǯ&԰þ̪JY nh>%k R@$&XUHlMh?|K!$/ۻ9amm/^ ;iI)uBo šoku$j,>}+/'ח@@q[m͍jDF?c\G^wZ33|P]XtӚ<(=*r`B @}'AP-ȱRkr}1S l[,w%r)yS]8Uڌ6*y~tw"Z]hY}@Y}x 3-xQ}@,hS| p _jY#SЬXq0EO 4yC83R#72۰bd4Ó& <uVvܕNT%tH҄ՋAe sD02g-đ2\槚ӛv%E># ٗO p_=o%Kʦ`o *+WLҽ9sk*3f7q ,֐nBvbBڋk K*{ߔ,7瓹{N_};3kߋI'Mȕ|>uBmEjRtbBZstד86C.q Ε⿻ki&KHAy bOy@$WEy Og| HԘ5qN۬:]%ƪ>.Ȇpi(&)*-a!E=8Tb f5#p NO cVVx*z*{+P)ǚ:b*&M0^WŽ@-Uk@?' ׻I,γ36ܚZdG"1T|iUR:!'Z"-V'ݖ2.s eZ2䍎OC}]ax37l4^' nf7w-<@ToRpp<(>yO'IzM'9>swS\;-zK$!na,[j4s)67mp_YⳎ+ϳG>6u^r{E} Y?W,:}FxygNx?7{y؛e=M &fO3{'-87mbvB7e=XW] 7F|x]wOl']ie03/OEYEb-B}9x^YKʩ͉ek!nqއl QS`ց+f环UWO0&{m\>gRQ imTcjTW*plLXt^9N5⣨WjMS3ӒӍڽ.BD$OU#mه ]'T ) 噃 Qo~ݽUX38,% V fw05tªkpQ0EFmAnK5$/ &*wE or%zTp{SQNU 1%/%TpkemN =It~}՗AMNg%<t~S{2dN uL8/Semўn`WpΦ7u; 2f8O{3I8ӄLifoF Tp; -TpގN Vp}mi iHNr rP])8jܮx,'| ric&["},Z]76@*nMg.LQuNꗜz,1^0 "-63y}b&=U[ZQ-j\)*?qΪl?gUMmUΪ?UE>gU}џxlSVu3.sDf*D՝Ԗ)hsY< TS!.ghgnjϨ+$E|zMLm6ipm<\6xS&|HYD/N>g}K;Q28S^7vwnYKL9-Dj\5,:{=P'gT+y7鏬D xW̥W/%HkɇȺVK+>njo/`{3V Eŕng]M]mRNN?~ƥ~\$-ԙoJl"{htE7&Dd귮_ЪbzX^օwloV[eV鋱a/>ݥ.OVrop{Q<]{~2W/,X;м'9`yKmp>(iSO^o(] }/Sj n#uuNw؍YOc  8vzjʦ.v1r~(ӝL]e=ԧ!7%-jbnc>i/hfk[&)hbA7l:/[T #.p75 be#Ԥ7FHW$]NO+JK8#D?/on6s~< "rWGtuBsv6򇉎Ioݨz+Ji-,2o#X[y=~мO맱O!m߄Vo 7G"۫nǧ“B{Z81Ya%yskԸu9 ay~ 'cwj<ҝu~?}K{RYe{zI9KwˈO6.MS, -@T>*GԪ&!OӯK Hax\lhuBהKzd4VnʋzYT 9u@OE>ۜCvj{Te2'\c'roՏ+U 3A$uI@x\U#+qռ{[ir3)U3`o&ݐ2S }!4ZI(7o*$y[#@[4 eY5gksƵPI栀k*\}ШUDxPϚ q1ֳQ^ңQ^v<2w^wu-DI>OӃH.Ż1RCñtɉaPC[FH2 'Y.t)f"JneJe8k(Z@k!u]MCf˧Ae DD ÂkS 44 ˃]qpdvd@.YbSKc:'Y{5IyFV`KUΠX6qԵB4bpf"*fc$n4S~%4Wq  N=Bz2$1)gXckJT$NCBImrxpMu!D\?7A'͈:m@|3@N joi-گ G?$.)zvF$ <_ dn7iVch<,"m7cg?dl_3(&%m-϶>f.>Cg,!/LwS.>Lt) ~K<̚+Gz+E86< Rs8hpM6x\nvդ#b,.욄xbӴREӌu?MW|v7z'[z"4,{q~\b) 9\;x(M>vTfmdЦEw%׼~ުZ\d(a TwJ/LQS^oFٵqTXdZAwdo>of$㈿9'?olb\jq.݂y*QB*+)l,(J2>Nm(G !<3x NӋnpΟ8r@v`[ʯr^1U@ZP57$bQe"qw߉.;au;ٹ,@Q+Zm[֡7ٹ)K֞t$$([e+MPz%? p*pMtnsBqFvJ  'Zi .+iSs̱>SG'a1EIe`9&;k$@Kv"[(s2mP0毛ʕs,Z lZ\'$jA gGHk S{kY00+IĴPopEluD6; R󓹗Ev{y/w$U-C-,p2nm-e~$Bţ>1+|ͶT Hxlߧq3>8a1IХ.@Kk0D+n^^HvgWz4m$\tYoT@MA3턗We+~`SةLM H-pB^Im:8;e{~}ӮȉVե Pi-Oو.;!4ΨSf7[^Bȉ\NS7JR=9.z8ƴ6چfŞ ԜJ]WvP+V~m8E˻A4 e{]eT ⊔wM&g$ȚP2[^+׶<Zq\u;Oel!7&p} sFV&D첕r-Y΂ )oŘ-,V\B^ L k.[ul=tGҴufRj`N1n׶]Cǐe6Yy&ʂ0ι]vgr-uVs`ãOARjO> qvkBڏ~ Z PX1C)g3Iϝ貿s曺 ];^b[βvTWYy5kMo#*xL'fBGkvVRx*q *(plCzeO2?$1pn/}:'r%4Mq_?-yPTUV 3zʣ3c%7 W߮R,Xʘ򕊧MGcgO?*_ˡqA,r}hK^k'ٞ|`%DN¹S _*:!R7T!|li#v~"dI,$#5i!]J#5UNxs)`dc{X>b2W"4 zɋxt:@xh98hD{ѳfP{܄R>A{=nou&c~æy2aP:4ҋ,IΜ '?ftŻU?S[4?H/"a"ͩw8ԾFNa^0z+:i7J'Fn hEW,cCGY'Ih 6\mMTMnRwhCPVz:U}r΁V(?YPu'섉nRDIQuZera\\ƠlP K87+ג)3⼢j M@`lgu/܌EmӏoÊhQ1#.y!A<-J3)QK0 Ud5мQH62ؗR\֠0g6v=?Nb'|9w6Etܚ U&?AM%z+'9~<%(яHEv\wb洕]RgeTX4J#' pwͪ3j6SmAT͐U5!f3+C'tؼH39JXbSBz7VߦmДe :"﫛r Rʪ,W5PIS9뿷cʵĹ+iUW8# uŁH^ g+q= "!y4զ~mJj2cQk#ݪH8q4u8w߉:uh>_Kz#Hvz4WVN@V-Pj:4mURP_!U5- jMa=;AYkEu,/#3iQQ9 '.4GQGהWHufŪys1N 3j GfV>UqeL=}yCSt0^^㶮.O Szj0p#'e W*=uLBT$zR=;&ZM%tM0E5]W$赮-xg$!#oمryY.FRLXl,5F쫺 }-\I UsSk ST95_,)D=y dS 3K|XL1yN=F-ĜY*F!VFxy^ kyia gT(ض˖v+ xz]5nN$#tjVJ׿J.LP` ﹅湅Zک_xȘ)Kq*\.]6ulVfzY[Ŕ;U k'uV'{qݸSkv HVcԲ=[lhn]Y*EW1VpzEIy;?蠙azkJ\~vO /\Ts<&b6r;mq)רP+0Լ!4ar$. >j|]"VHr%Sj]mhjs^4zmZbtvw7o@6 jR$Qb5ݓ`@(ZݡR+hgH9=ʷluD2.^>h1H+2#JK`R8ڰjډ Z"8*X)6룮-ǂNa,pZ&I\ }6|wiNgp*mD: 9\ajIJ4NȣǏeCѰYu4G!iX5W&'J)>zsR9(}y2%mF}I_lY]cq1q`jI(KSiB}ϓ 1m57Mihç.xqW~W_[UUe?)"ohckio|lka;@WL)кx흿V{[@0kW`4)^ѵ_]{(i.E5&Չ:0xͿZ{o^!h޵u=w %̕OGmsHEjpZpqdm7#AU9cRUg.| tP_UdH.3j5)Ð`` 6%2zCLu0SzXtks+It!osj֎Wu-@_%~fR1H;qUm(L%q), @B+7* /ZBԅ];ɾP?;]Lׄx8ݯ*:REj8&_TԾ;&2-CQY&ůQ ߹H gɷhEe#;O4{b & jUHF_zVzO" `貽~F&<.ZlEۧ?[Pb{)ld퉅n?BД;!*ԥ9U&+k˰N]Wf@&Dw r4%S)@2 , 69=r{2:?jW"0:t'4dx&*(E۝9FoI-& ǖQ[hCohzԁaV<.>вLqF&y‘28!"kqAoc8u~FD#G A6M{B'EM@ـdK`!i8+TD+#g0:{nӕ*K#E;D9C &0 A;e%We7]ȶ"NUWr,+0+amŋ i/c[  >BWD300ƶFrȺu[ pG0f՛[q1k O>t,1нI]M;e'7;g&ʖ<E'LsȦc lГʣ䲑AEU囸~hc¬2 R}lvuY7m_/9貽qd#"AwOۙ#G;Ј)[9V`:`oDGC{:@!Rk Msa4 X&=p{gwO˜Ih!ۈ.;!fX2wVnk Ww+܉.0eE/Dp1/iƅ@1a!zFt^Wq)š-#t #$^aZF1䲑Aw_OB5I.AV1_E׈Leef'4ІX uG7fVGP,^() QvyJr7,T nJ 8Kx2itCqY3p"&k'tA9S:EE,.NET3iinvw:mGEh9~}{D#6`qpu"Ztoڜ WH 1i--Eݹ 2bv#SFs!X2?EJO YPmztע}h׵)*ao"0WK&r`9\Ai+m|mfk u_fTrM }(0Ο,`~lcկq5;dwh^g$OE4qEg@S| lh^ pf< 1E}c۞i֒<*Ԓ$ e~aiǎM [Xw%rxR3@ntQ=Ew/5, ml#$wxY&J5l\gp{ݫ$?(ld: Z_"\NwBMaK`f1V> ] ,H6PmRdIt܅4ip]Kr[:LP4¹]W&J m>aR -ƾbqlu%$SX(ޒMMMŖդ=TX,DwXżF]W&ѽɘ4q4l|Fiv$֨E0eUW MdܙAf6?%Hd,Y.9]9gpe*?XXKc4WW3 7,j ^7w+r"eѴM`V=b/;Q6v{` )r:37~qU46eHZ_D1̕ :Jm@)Q s8`oϤV5#`u t@~gUqBm,C]vB"xl 'څvK,,f[*Zނ)Uq+m7@.L;Or@V r5W)J:s\e҉_}`]0Z>BcP+/6LI3 ٜ] su|3PeO+qO)ռtXdSOVD? >Xc|Qt 3,"]ytQYH;[&U#US(uV@i ue L}6`d_䣍Ie2 -IPkUA3/ԲLuK`ʢLUhFn)ΖEmf:0OE=eͧSeּ">e+I S9xf0T /? lzT(s ķTq-tƶ2+Ym ] ibmȒG܏6ow}g47I|1p8ϒX/xD޵Q7K)~zR؞(K2TR2IiH~)?C0R'6rl Y(❫>.kwK:kXy roҋ o+LjjikYKzu˫m:Qv_̇@mURi9ʩ*/hݶ@w4͏~9ž"g7 n8OTWRl~l> +Oz%E2pYoP6INs94?3H@ p/K*0yd'IGWؘـS8M5ѹӇv?"yc~#{wLxaR`û?> f{]FS$ h>9{NSH{$6 p]j(fTZѤE̵yt%hɤR3}XS0@gw*"S"d5"xߪPv{0GoNZ6?I'+eʼnc_Z&~?-M+·\}.p0onQ~-CHA;2wsk.^i%lq֦AՂz¢5@V::]I0_%Qbk|<ܷI^O2?|Ly=d ft'uf) d,s_EfcTZӴn-xΣ$j e?ſy?GU*|ʦK2Vq3ʣ=4[% iB Zafh y?6mXjvѐ8{kNTp"h?zʻߒ.vΥDI~Hm%f .-70fhlRuN/wj9\`G ̕Kʣў9-rLHp:'dziNx>!<k`,2aԡRW'8;]֓:%N7#P  <˧&coڜw:1$y6HNaPu t=NW`Km~s~g :2RL):7NN!+ ) ӈf_~߀. /$L{ʸ#XƆ⤜NpԽ66 Qo_;AkuWzFh6|2R&ÜvLԪyBPtrҙ|l&)[nN^:I]i=a=^-Sd@` 1`,-s˔.%N;swME%j(wY@*-dly^wVLFOXAL!qZ);1Y"lX@VE*u\YNSH/KB4S>hi[sI!N[(1̨|3UyABRϨ6ljߛjg:wިUj?vVOARgf9k%ȴ ^8һ?jzFwUT=XNEdyGyWu{uϢT`fQ(_,d똪0U5s.6xz8sv)F(疥4bY(E01@n,dm~awG] I셑o+;BlUfpA"텗׮-f/OQP{K=yuƽʵ] " ,)XBSl-W^;T46+ AbM줿8 ^4V7wЕ}Dw4@ BX몰Tmz]S+Ĭ ̹ iom74kh ?|1\;xQ@b[VüM79{ L&RkSo@`"|*bƢgnyect]{k]M chZfj`#OjYzخ+B}쓭 5R)t}1J FBw$ڿ(AxyZpK0Bt(Ɣ~& Pp$7> ϴ'선hb3p8ʒ'' q!uuIPVv_٩甥ONN8ҼS8 \.kA1a,;e'ýz]C^ oOS9ڒVt ռSwV@ZwQ0b9@n`~E4 !uh)m\)A"|&Ap*U]u$~  w,LVI->ThZ"l aj.LM9(NvJ.K<܇5A^պ ^2t xAϢ첕biѰO,46tjԲ7f_ةIW/@.+),AZnX(OIcJg:gd~ jnaFt 1Mq#e.u3zBۄN0'< ,2hi#J| ;dGa%.wx^ʿzvi.C4׮VAkG.y"X2^)v[í >9{)l /]+]FzGqYY+-^lU϶ޛ fqsI@+W;C~Qcֽ &eYx՞ KH;ey1U%!Pg¶eFxsųK>S¬k,\毀LB4de8)[C#Zr& FJfDN3A0 ED4[ pwC*D:=;BɌ>w<$s eyx\< mNshD>&|t&nрoT=r)% " Ne2e{bD %4nGت@M(2MEH$Qণ.V s{.9VᳳzǻTljQGٸj n0?"AH) 2% ;&.\?q nܲH M͹ ]UE;ܨX 0HfW9O 1-B|:ɍzCxNQ2틅݇&cUe [k1(Y).hP}~ 38 c8K f&0|w|,#Jc<7M%zHN{']N+]x?05|Il<%D#'EdYMMAkȰ7@P> )2w!4f‚(L3cpr9 uY  3^=VDbf(<+kgA aPm:[kwN',Cᗊ̼4fscjIwjrQb(lhsݲKe"Fر9"~`c;16B~稸8sA]ڸŖCdcs%u*gc3Z~nI_uL< 1#;BD*X [Tt^%i'4j[K >u/lJ Ljc)sUٴ:@Y6Cn ɀRqΡcEĔD 5 !(Fǧ0^Z8Z0Dź$Fɥ*9xnGV#$ ̣M RfXV0we'l 5zcX'2wE d(c^)9qy%-Gi:0 NqNcBy'ltY7f ؟H#rȚ5(I&?"/[iqajJ{P,#4n8Rl.S- S]l*d5>'lgvF)_1a ׷5f/'~%TVwIiLJ"4l}s܊].Du&L,I< 6XIzmIDn)i7*J[9]m!bz,;ϠDJ*ޛ$m8'Lj[e%J*a$h'+A)A1<6 ,"k" lMBZjJ728%5f25meBn_-to.3|]pEL]SR3Pl .&:@JBۇDżSzԅaͷVEa0Ļ[ZJ*;UL9;dFۑM+;g^0~_!*fWm+lKa1V ?A|"1&*Yp]WYJ:g$ ܆>H{r-P\t(ǝm-P "#^seC>x}/rl7!|QQT-+X fEWN!&(Wjv$SvEe/Տ"7kM 7w͎܋-]c9Ht7ē~PgG[T0pTbF~S:iUh> 5T]U= .6B<ʬiX:<uþgp@^CG@јd/q66n8ˉkpIg犚fF+#IV}XF45ݡ;m'q)K R{_D~Uq}Ȝz +:HCN#z0k@>!^ZU&Ӳ]ć ۧy1J,Ԅ0F 3g1\šE8y嫝}f a('g6bu^,p,s YUg.8&1t[{[U,FίH/^)amo! >LlÞq "뼨$?.j%6˃4%y*oۇ2d˫W۫ ֝-ҖgOK:6f׌hE>_|ê@} sPuvU ..ٰH?C)2|NȢ8yL8d#? J ۠gq +g'}e&8yDu)]-Av2t"__eVMv 9(ⲳi}e%[Ӊ3J'GQAN (7sBMd~@@<[ٿ_e 33oS=Lgx -5qoW_{o:igho|Nљ9'lsa kWsk/љ'vs?<<ϡf\-slBCPE&?,!@FYUڔzU(GQ{;{%3 Eס(_(?` TSӰeTOFI,f U@y8#\#̶ 拽3 dLyP>t+ S@.3z+iUjzN7x$n:~8Cx՜}-?̎J^찓Y]>wc m*MF sIO*}ZYv^57ݽwOS_@IMbNx7R'oC0+yx*I8HWt@fxd,;w*B(w6;vxq%^d͙*}D;~q.}5Bp4Cz%0C[(=D\'.qe8a3Kngt)CUѰ(eJ*mZ)v/On29LTYSZT?3N'q}#ꏶ1mS'MyP_I~OsS<uB|y4Ai45q<3T4ZϷjgtiWͧ( 2Xl uA& @j{~믧^-2 Z`WCm1`"< 䘦lZyT9zp$Xb{kO_02N4(C@[ UJ* 2Mm P] ބ Uw{BY9֏mTAE ¥f FT"sѬ#Bl"c-i/u(` @ "dz`A&!H•Bv FV_m۔++ M]-v@$Tĭ2by14hA3uS`'_6=V^At h6Y)ee;lՈZSQSys8BR ?b<U . ryATJaf" tV C#E d`=As!a.Bl- Lcx%MP&![&5}Qƶԗ=mػ,ʡ-`Biqd0'ZrE~rT5Fq BҮ5i+˰nj8%yZ,Oo_1hMYMG)ܭҠ;onmbi*,4K/C['-{$T [In:b9VklS6BS{QU}뼛 F`ǩ?g[ߐH}ef􋽵3jNm߮!qk)~}n޿Jki @v| Wk?_*7E=a?ĚZyW/=7S9Y 7~ӎ'D96Ύ^N9OT<TU,-"NNjIN.Lj25= ᜇonMˮm} p~m1YTc$w85Pb'eɰB:Ï_T?7ʃ~ g,hF YRF&'٩pfRncwUcU7z1^?%i"uReջ u iABLab :\0 (*#^(> M=BʇM9 phRv40pH./Y`cEG%4; w l1x:w1Aehy&FĪ Bâd(VMDC:Y?WMճ3P(N?2Ŷ:5%5G30+PG &[GjՕqp,7 St__f F7|7e8Ck'3 24Vp:ʽOA6mMa~ ]ץ,=Js ? hu7{l%BS\t3CtLsN0 `ePJ VxM+-hBЇn]$!=xzs9wF:c+ܛQz7@Z J`FNmM/RVT6C8wq O7+#5s0,Ya8>('>0vtBUr5AϒnnM7ПARm7;m8飮OV&7qW#g ==Y+^"NQ(Ű} m66]؜(fTCnxj^f R=J͝~s9X v1p3'R /3DS V ~"]eYc]z4{Y&1O_Q7 *lÛ𳴔^S-t(VZ/"{\i%352 @F~Rz>vdѣBia2&~x/.JF:PR{xqFy\h2gK~A,Qyۻ_EwwE{ ~1U Kǜ~}=mc$7Ce 8*N棔""xN0:\7/T-h>`[\ 6T~KjF!9iiiTQdR~ݷ>;LL9@]݆t= zt@v{W%/}=2x.uq4DL$.”;ׯ98gҜr'@|U%'zMMZJ1_tuf˪˝eņ%So˛Clܩ6tA0Sdiv%@8,eSÆVӋd-̬ެ<%U!&|tL:e.Eh<̨=f.)tVC6ՉCl,cf`颁eJ+gu^4wS_ꐬ%XǚZ?S$ D{.2J)# u͙rhyhOM8A #ܘF>ߴvF7,EgCjFi-ФjѴ%i߬k-]ۏ"Kf Nٳ.3I1$߇ N8mte[lI2[+=JfJ~EcE2[m@vh1V$˦+3-- yz!aD޺pOmMf/iLf,u4IS*cw¡&YcKrwϬj?{Z.˓TEjermA"`%fqn&5/?ޫ$ ^$EKjLffb[KVvj"KZ`aF&Y+#϶)c: 8q=gsR za"BɼٝBϒNM23+GȠSD_d_7|IEd5J{v#r<}3=˹Jfڍٿnh$syy_H{QV8ad1rE1@ l[FYLZH%u;Dm#|jm'jGxb#FO#G|5cFe¡&!4¶,/яu역 tUzPn|U–Lz kIdШ)fqd/?9,p>}p̌kr}ld63Shӥ)sDέhݢɰq3j)} Q{;9m_i;v&8@,<]f.xZ8cu/tA}zhcQS5fa5 {1] KdnTỵoQYz5IDKmFdt%y}db7D.7M/Q6_1ue~}<;ϘbՌ ȳ_3(W湧O1"y ZȲ |xS06)-`̖c2V4y8 k+>G&;>?2}!2D)K4G\"Ѷ(o{TJ~ ]gJ|>˚ŐM&k-De ){kX3_SIy+kBQ,qZ#@?e%tVf_FᎸG-n6ѷP6ȥ^--UkFYKg/ImJGRM]fhF@[7'⻮Y"|#S8a?GL Svť6Y2KqYKGu'3sɪl)д´ FXWC o6osWsqP99dԘWr`LXױ~Z,_8#jUlU)q1N#NaO`ڣ* YvڀSKgFAlQT ]/LIm6 Si<h$On&Y("{4Izjy˦K;vRr:vc>^p?6[Z7J,n"Y?9l7EksԪXH3wRoUkQ :bHc~Cٱ]*7gQ+V)iḮ<Mݰzs&|J!F;h( Y@ԯN>$eHV~l$}$ǐ0CGO2XEGד\D[Z@Fk11<*ЙlhFUx޾M 0ΈNmˆ6d<u߶MFL|r/}{Z%AC#k *~=R|H8=ќ9ux(n^~ySe;-̘e Zg+\^(=*YCǃ5cTq2$ˇaC 'gpyp, EkeQxEYq& ]Y6:\nw$[_ W]sQ{˖)e+yC/cWԈ2leT| mf%1~e7eQyt >JG-L۷9:E&3p!1L.b}B5prKmnͲ%p;gێ>0e(tݳ "̶ڤk\h5paI')IJ˽j7I /'*nLeFP [b:LֲUd!2n|抻yt=p Fz6DߠNHSۡLدJ`zWv$k_7WEV涖&0Ŭױyەi/ϥ;"=)6wA .Z/| R8}kx2-˔9}rgܒ\y%U|LtE D2Q3  bbcB4O3>fUM̼A }'V#+.ZP2vS#KCY9Zdʕ"(ǖ;/i༺Xd5Vc-9%?hktѐ9N%N?^^󜀻?)9 0,$C.=ЃfHWݢ$&bѭ9|FMm~֥O.TjL;ςW$ u;Ώu(;MT&R [J+Eݍߪp*d0E&ăd^sᶏXXi򜡽vV,"Z(kp(sMY)[E)k)=ySF"FBSf[NODmy>ͧ0h)Yz$eF#Hj&0W2'J{g;à _>j$+c'n50>^_(TQj1S1 Tb&tMИDTm 0궝8Qi L1Ef>al"Bno#q'1`aIT'?PqvN`(b&t1SxzMB2;}G}+&Xh E2mU"xL6r!>+m.sLkѾkZ h׺ޢhXiۜDž#+OW?T5uֶۭl/ e !ɒ>ןE?*̶vpH̫͉dԑu l_w3w]~{ƻ{{ro'y4sthh ~ԾIqrw$qw#+8[=+8-qO/4/Ҏ}~*j4diwo sc;ȳH/]jE_ EQb=t>>) 5{)jS,΍ucͶGJ(8-st۴jJO.lSpFϊ[kL+V>qGw1хd(K@u.Nﯳ\;JH-Kz|oA[OkA; [ !tW+#^T)͛jU\nVeI>y5_vdm36ܤi3kT[eNaCֳ"Ȧi>N=ݰɰץZB(Ҥ"pPRz1SzvH=!;dhCݼCn~hoP7P7^懇ww[? >;Џ!t~w B褼?;!tߟBǁ:!AA!~, q;;NB:OCCm4 !!= !!: r} N[~!!':-XO5EGx+vv W0~O 3 4Ko$1Kg 4ޠo,3FH(f#ZX1vCsvgPl@A;^ f;¯7 O8_[G'lcj77URC!4g@Py5ޯh/>AOH#j,(ǹ Kr<0mfgx fDMt@F }2.FO 0+szEZb> 3u.n8ѭzG-Bs\EPW3Zq7ĽovӶ^{+PJ 塎F9~3F dLۊH+L Jh9'`+s;OVe kGr|߆=AΘCj;x'eٽo-yf6ؗ@G5QsmO=@o=%ݰ{CO co=\ff}3nvޚo=ycGz8Ψ=JϠ= y~Zg;n ? LYT= #Ez$=zLOQzt]koP=ݫy7F}@ķD1zFI-:$zK, f+ ?lP=cԨMF P##}ߦѬEYKAA1^{P8<<63z@}9vgMl0'o3tJ7:}F=\.@GX7Tݣбzq-=@{[GwAx ǻ,gΈ=jsW #18g%'2' S-%֣~HZjngۜ8gTi##vVGWX|h Ƕ3,yg%^w>=Uk`vB?=4I CJQ;1+xC FQt ZWNx(shhmjKT q v 8%Dc-QUWzb&U:"0_&=z ]E/KmyAxm6I*1葈íx( DZk [`ф|}ALΔ]p}=T#,BцT4&4H#CPɬ\&'KS}#}1ark6: 1dH\I8<>m G=4n*~PmׂkT%*]eѸDy A}xϒ S"*i8g%..Y]-xVerD^gQJ7BfT 2h%Q+>qka륹Pdz\J|ۥ $xRJW"xgR>zX,j*[.c!%˩NJI*%H =+,;XT<[zu\0E [e$gE;*}Ck%7mr !_nxγz;Q~<&*?f}vEi};4(\7ϙI:kiz4xvm)]Sϙ-4u[k }5eGS6L )vec) navit-0.5.0+dfsg.1/navit/xpm/country_VE.svgz000066400000000000000000000010341264204753600206570ustar00rootroot00000000000000D(zHcountry_VE.svgێ07Oa7f<6c;k ڐ6АkeV =6k-ڮjKKUx-gImWl}s~PYT9ƶ*fs`0>ayo$A J4*AHӲ-^=oulM7vA8-(!"mI#ARr:ELO}gb5oI#|, |SԞ/=VH$g8oC%GoBxsy:80Nhw9{mjIzrRQ1q#IsXZ@6}_-@…6Ղ2Snavit-0.5.0+dfsg.1/navit/xpm/country_VG.svgz000066400000000000000000000363201264204753600206670ustar00rootroot00000000000000F(zHcountry_VG.svg]ksW_/q-4~Q$OT$_RBВ#PȒyiږ1 }yG>b(й68Z m[ܾx|R̦u>̋?~Ho0j(Z8 *KOGJ*zE;fe^\ -.`"~>߸0Mf+~K4EYNʯrN‹d%%  vs}va?gkZ1 a`}pA.Ҡ:\E>q ͖M9|;<Ϸzb0,k,%\[SN ߇Ó?_C [xEJ|:,ƋItVtVħUZQ^ $.s}=g>\6Jd\_!G^)nl{h,>d8WpFrZ~IxQVKI7'Fz ש[u%nP^'|AiؕE?f@\NUC׳b[Ѱsʉųas6@-z=X_#Rw0@y7^bF<3^Sx2&iVO|Z<>n2z07ryӰ*4UM[6W͏-|%_7vHnKqoqp KeWea FE9 F- c>}>+Z֯hV8-De!E/p[)<p@m~ e?5h|=#s}ګ5(W`b%<#yme0Q1 &֛yUmٜɌ9[q^dZs׬s k-3YYI/ӂ*8L 4V[}~ ݺ-DY{{?M&gnP|&*xD_gv2tᙂOq8Ƥ+d1[7T}EZYPҜq{V)g (38Wq$wե|]48\sTW3H#jܙ㳔mam( j?Z[4[V'$\K7TcL&qFnԁ3'b>q#&FuhZ=>͡ش5w.fEpqsx29yEwXgd,}rC[rp04]f&Lno'I1Fr}'4^k) 'C.jӓ"/"!2dI:\`SHzrZ͘p3ZdĜ~!+ۑTxk[X±z3Y錇Td|IyFo\hl[jѓQӑ6zxF ͼNPo2 +ט8![ 8%)YwۙL ',*z{qVh7N O1*;DoЛ"yUZiDђlCcކAD*@ KPeN e&C2ӲYV4{n`"|ln'$p0tR*8"ue6ý57$skO wqzn͍э~sKY0h\! CǓ%bdи6Gt2q) FA 5ҕ*OmԾ&>g%7z|>f 7tψ!E*`V UX)0u82iZCrxZ褑Q'|)eƶۈm`DdˢeR@ pV#X:!9 nȄl 4dJO~|Pg@%1Hx4ZېH&|g\%pKiMX1v8r- !qHxF* 3n(Ȩ{56|@ͨ֔?<= GbؘN\@*UU(OZ:Ad24/Vz8ɃDjZLTAdbF]a\tca`ܐ'=]~-/E#buZB/-q8GB N0D zsF Bha }¡qj#I3B8Bx; GD 㠅D -LiaiaBzOg-LM8tGO `Aìer=>݆#g)rha"-i!/J'D -n- EW:/fx!8]c> /W!%s:JxxUM x;[`@2SѠ5ֆeԁ PfCiR?I(RЭ" TڅPn.=eua$)aلM"(t%'QJyHC}T*;2e)ha60::ɿ7IB \\KSABٖqPf`7$zά!:A"G?G HIev[cLZTH$'m$Ru=\ ͹ޓ?Q~A+T]8̓v^[wSG AHYA!μ6ܮlc3FWȢ/*Io[q3xKO#I0 uLGW,sEo V|@l*e)O%y36 8xAy"xZ-9[ '5 )vG,({Q~DaAHP2 kM`IҋLM.!g@5 Y퀹H -U\7D)IfRzU(b<.US"  icHt{D[6x$2YiE)Q mIޅ`"ш Ō-=^ʂA/uoWŭ.R*Lr\z? :(Vn> u4$U Ձj#z{b32 tg6D MLEh$5"Y|!sCw,TwwnyS r`QrnsdrK"@XQ֜eY1%@]5j /R&Yf<m>OIkKCBl&=)EL{N. wD/҃rʜD6אp4o^Fo` ^0j]zdמ~~f앿؝=j-c^ƩM>OmSrE [0p,ssc)XY^ӫ+;1z=VCz Ռ ;V& Bc - >sZFzP)ӫXu'myX@®7he;SIm!EZ5d,kբ.p) qqq >ޢgELjy!\S(.G%95:$J.ȇZjmI&93Ro[Aq4E.jc$tq ŮМKğt.>VT<ڰ0eKLVM]=\q(A7CmCxyK*Wok00uۦAKx`.{"h-[lg*:&D`G)]MM'9c'#yI5``M*W')PKDs[ti%>P`3nAG}2a.bץeI눾7\1ֈj )wnE4V"n<>#9 ;:2mW9:+a=`h,Kw ^R@Zf%#咤L#e3bQNvW`#3pwhyFvK;Od";}Q)'|~ȯO0ͦIM5sKDHHN;͓CQTI~\]Z \S錳k>2볫],-=qG^^[*K`TԪM+w>2R D P_&(ʺ-N&+E*hN눴G/Tr0ۛR؏FO癝K[.ds'4]H@~5z"g>qG hOפ]jCK#@}Ne0{/}/K"OuS7oÉJ%g؎¿Ս-'$8t qV])͞R |ts_<ILёkg?=t39n=}9*S@/K%A\c^s:_W }>v{%FeZI%yn>L{dx9W|hELmê% {C1o@\7اnK %/I>|%*^N}aȎMR$BF )qIذڧѻBTy}zU?7*lZj-Y( \r[ %dcH*wXifZGZ+d1UUW-??.K~t|] [_#j?bQcmk>J@?I@H,}qG:T~KaWZx{8=w8v䢭S  .?8i\gv/rJxRP6 SmHy%&Oں.d+6Dh<1t >NK5FɦBbG5'}dQ5"%v[DnN}BqۼТ(+,LwϤrR xwǠ8:ӾH1Qov"D` EV;f:}K)'(n UoR?K"^Mu$ŰV$9Q.K(=ZLJA4v a*wRQyΡ9 HўjRm%vQH(d&A~ڶ&Ka4W?rUyuHdrT?bf֎Ybߋ6I(I`cvUj̝zqN V!B.ȿ:V~#<+LFdя'RIGg2>7W_?߿Ca&Yser@1y@e&L=ÂRaҍ X<LZ=gxf4,wc0/o#Î2fxEgM$4,3%'5ztGV椿L6GSrc0[͕2lKZn0w*Yn[x̂yxO:tx lO]'ԁFn8pdwF5dTocխ/#*b7Q:h&k;V^u k41`2Y/\V't2 +^<ˬF؄%L#KN&R j);Ԩ0`D6"T__Ų3V e j;鱿̲*ZV6 q9`IDF* bfpBf".,jwj'L[ }4.tF}MK}wsDqՑM9>:r٘hxv(N'&u $2']!FA䉦l:$ŕQ#xZS7ܪd=hƅK+dWdF`2@~=3w-l7wR,+ǯe*9߸ěō6=ΫR0wՁa/7$[ aR iXK;Eu ^v^n<;$##]#mRc 7<Š'~ .x4Q;֔sDHúX=WТ+PK(h2@6#]1VGI|5֓ѣFm?ฝ|^a:ZW\"U([x#.q9ls1.@ΐnqokV%S4J/ _Z %^P3fbhجYg`"QW';HGNkxLaqDsߙ:IZz?_ZRz f0&fZw 2fciKlB1VVh6|3Fll66͔7_8'ܿF;^z5Fc'is4%, ao'{SbѺO`m =h+Fu/#=jIqf }ec 1=C&N$Mfg2(Lat&QXb$ˊKHW4beTabtIڝr1l 5+NCsBy& FgS9mˎ]+pf8E8 KP޻+1 zԍ1;%Ei/ 4 qr1 BK$>sj2tٱʅ1Ƞp!$R`Ef2Sܭe0eq,l>0d^c3i!8,N9c 'x5&3 u^H:8Cp3mpp A~`1٘D%| ;jW} MbM^*N',AjK*.R#RG^H.j-zLEU&+9W輦B D2)4]ۙjC(̢lڟIv@$VAV0oZA W32f] OCcxъ1V0N~ämcqDnc!Ɗv,k+rl̓cOp䣓I3ܞqtp6Oe`N;+X F4x#J1!}g's-!~tkL~[/nXRU=xFs Sn"nn:"+)s;a9vߔTW`+utuy%-Nj>#U@9ΖeTg^d&SN[$+G}wp2Iga5T~ |ُq7RuUdƁm!E$keVn-o 4 0)oANЁý+y0Y"P xiІeRz0j l[Q|1zQ"͘\1&#JpA>W7=0Uo(k;2&총d [٤ٶ'S+@St8ӽd;a23jv2n|5.18ډi˟ m(\`Ce#Z-aJ 1w;2Rm ŮSj2J\;0n^:"BIC,!q'MG+Rf qǰff\af=s3ɕ–=5dx#7MjD3lP1M,nybFngxѽv\!LWN*>kczcf|/|`^b+L?O"og/nXgH蝇:$l?tY|(DWb+.}|3u Ekn#߀MfoxZ8-=9Subv'!7A RXzHkt$GrZu.jR Ssznh3Rw#)ep Cb&[]<!uqW/KӐ>v63#X#9FA~xRÑeDB=O4z kQ7E]=@ mҊߴq2 cE0TvC Bpk$HK>CԾ{Sd+( [FBo.h`Я Av TjPg)ATnGl;b`x\oY/(̣'@Xwv]FJuD㸺:Ur"m~Z$+ٽFVgG@JjRWDŋwcڅ;dm}UҠShm KWwj @sFhUs5v.S=][ZrFDuR],QCƄy,pe*3OK{EpC?%*:x7obmbۮ$j7$Xe)tVP^.g`7xހbŏs7M4RKN%cosF {jN(1>-|!jHw+D~ GwCyoGyq Mns '-ܿ7}tm)&HҭVœ ծR*@ Q>ߥk-.ioQ|/ ?_6Z[navit-0.5.0+dfsg.1/navit/xpm/country_VI.svgz000066400000000000000000000221561264204753600206730ustar00rootroot00000000000000F(zHcountry_VI.svg\ioG_QKżJ`cb#BD&_EVddͬKQyFF8xj=_.Ύt~1]˳}q:j֛b6Z.O/z/M'~7oWr?lnNON@m듣?6Ǩ~U4x>M϶nnWWruy2WuجOtOŧwEմjaP9eN9FfbAU V(Nm_Jn+>_[O'7}[FvoN^~d[X젙m{bߋuL _`y|vvAzrz1Y,Bo^ bwIt?6˛Q+ѷW77o[!-_m 4=_]Bv˰];T5n>ۼ=;2z7aei |}~o&f’e[(8o/NOgz7?\,o;t3\/di.>4//ub7eM-jʔaOvky֯jNZ^na>< ԫa ,j>b?Zr!UMҭO[P$cw`GMV{^({dȍޘJY3:sѤ&[, |Qpxf! h 7X`e &jod\s iPzL: sQB>j#n/|KD:$#4*!2 %lh1Fkr2BQH}]cЊmhrz.Vd=W spRq*2ٸ T_@ ߆B!Bb\?hV2|^ $Blط33YO7Qto=>%`y=?(708^^-϶bSN5QtRj2S {4SQ`W X|{zi!:"$pY RrCV mDUKE\8#dCj [C}UK`(,!C{`)(H~B,DirU:%`*V DaUl*8QЍҲH%@` A`4Ջ@@胀 p.`4Ltv*-QM@ 1č)](~6caoݽuxk |AHg[tR0UA@ɚ 2IbS|rY=(`ƔZy(.!2 ?2E#acr^d1 j^=S)_ve旾oJv 7b͐QjHF#o~t77p q^qCv)AA`wEF4 h]a-8Qhp0+V-*'P< P h6 4dlŏpL)&(6D8ѶT;70QE /50`|2&Q)~E럠tR\Qx>tC,|LЃ?=c!*45\(+V <>:Pmx 4&Qs(np zÝw6ƔV^%'5ZL9ٕq/ hk ` V\88>Hp織Cy̴~UKa#њC=K]ޗqBF^AO䈵P RqRѪH\z*)1\-]D 0Xhz r4 SSSnM.|,&ʥ$BWE% S!l1Y~Ɗ0].~#NE^dFZ - 2d :i*K;`5O)"=ʌkghL;g\\MFaakpn61+,fiSSyOByEH#T뢫cPVSꘕN}l \KlG(*Q@>d l r` "1_x[4a"u0ňa-\}Ou`<ԃ1 QםJrĴ2AUK \׊E@ ;s^<\&g$SfLRǔ#4Z:;qL`KtB`!BUKA)yLe}"3i@|jjSnJ.1Q*i>C("3BӃO#295SJVָg?—'˳OqeÐëCE$ R\dZ%b4^|G˰$[tOI[z:chg|@JVAİ1}RJx\a(j7Á;K8 b^%OXJ|\7#Ïh@Ɗ-5?!R Ib.i3%J[FPf%%?^< %h nТ(Z1i'<<|lͯ8`i㘸ȲY2P6㊨ rkjn?xZ1l԰1Q#chdUy1/t40(mV͝`fYq9&#fjxjqW8rA7ʠ>N:2u)@J?%Пz@*=%kO @)'е~JWb%е}JW1j)tRzħzͳ)^BɋQO)Rl{1˝&IP,Pf$-ut15?/DX7$cF"hr݀>4PM3[y##H RN`xQqryo%wq܏୔~! J/uG<_}n1(5gor*0e=x3Rc%8w&"Ec)b 6M,\[x:'S(|m-\ŘxhnKCNURh4 ̴"ɷs6/aQ*R ;K r j y$EU5H"{K25qL:şxy)ޗk]1e9sx|Dgiym""/74#vbcvjBd䞫$$MRykϧ`4 c D3v~i0N4D(*y-WN)=c-=EbF^#d9RC1i=C&l7 3 oANCyCca(#U\}q nD_id*D hLjiA:H]mmi\ϼY98_ýTIshLA "+ ,VPX6] H!%X7ȓ$*2`(ZԁۦgGS]V䐗w'ش0j,dQ:eɸrxD_y< oٓQؓnw$od3SJx̡p,9zV;du^6c/US7U.\ƘM.q4$#~-[}l'Ҭ1% &+sXCw0A Pf[#C&Dt.8wm?h;ѡB͖L8(dC;"#ųRBma5q%7entr=00 t*4̗Qlx3S \bk&HVccJW-w0H#ILDZ?YKtT0_1ٕA d?77풦Cl|uwJ$;LvQ|]c>Zˑ)"psgQ/x&K"PfF>tRN݉ET+- d_pARg@Xoq2tR| HϺ&g8KaZ>AdV(]Ԗ{# .y)^_ > 7u* JW-2 Y"$]q6 t"\w1rPP<`JQ䱞Da8Bj Ē5$4_yAp~Q3f5Yh]U(]n~y%9/.Q*d&%eE &3PVGvbTtRt c&xsAT0IK(<<1VOE&rQ2NEOH14Scf+D/5a艎<#ItgJ^x]YJz3n}fBH|!^v]qg>ѵb;+FhcRKτ;ow`BQS`h293,>N\2㹜0<4I͂ll]0>r$Js4.{B"x$-E}~xgHmD7KԚ3d0vīd;_ L :M $*AB$^1a'Ic\12 |#l*[N&mUN2?D[M"{1?jaL"y;M|ШlR$,`L!@ R3]e؊>k$f)~ʛkUW=$h10Q yv?Ydf&JQa;>m]}y g]aaޯD+~R9{>/ۉ,A C= rSb]|=ȶ#hDglMF$TR|J @nzSɪ40 CM{mRvTU^i溒|hm'2. p33ij .UM}o.'$ԴC&BAtDe8b8*5io\0I㞊ZSU,ZأeMwPV>N$٧4PCٟH4ejQ3A"A2DͰ΃3f€{?J)]zȅTj7^tIOjSG{PQ5oLdGx/ށ5gՃEs(j"r`o:%SWzyB#Dϯ|)=̮xD!MPxbS6!dgWZ=rs%x~@:ӑ,U쨊Doi$ކh@XT@$]XՑ^kL[[W~wnX[iwdw'{K'>t/yKAB2V5]IV82ۉ]vNa~)f&C-˪6`(ՠ*}x3DHDg[ggG'[ZݖHB2#ZeU]sB2zRL\ 8Un;'(Bp.5-m(ؖIQ)Z/mFpGR'8?@Yw}gmgS 'ahSEf+byݸ9 IyRQVyT@#U 9qKO* $'QvGB ZFoM&hjjT'APk;X_` 1Zܩ+M-`:W/oJ:feP`TyxY%`J H-_45 krKQM# 1!յlLi@w@yxlY=saoJd*vΛΫa ߤ(!I֨zbqz^?Pah,DPDC9gW[t c83*RЁy9e{]JBıXɬ"wHG$&3vx$dCF.ig9Imj  vK{@XE_ +[pL`DNNo $ۿ B]Q15NdT"p ТSUYT'vjxOXOK{p@['I{To|`:*YeYӏȲPlzKZe|JDɊ#DLE刬o6cVɢVOLDѻ,}Y&]f4ѽi;gsƦfjgɢryޠbͧ.2F)D=(SPΨ8F" [-,%s[diw+*Sx&mUKH=/`/å̝U*Yt.SPfe DJ٢0LhSzEL$^CdiN;$M ,^aU5+:;{e'4縗8O$N Dc3+ANKho\M=R?\gM?R2NѲӖ'Ie[ N Eܔ*c 9vNp]#Tx: ק54a6}iY}{Zh>a V2Ui0:eYbnl>4rDuM2BH$0hj TJ${JF~6&4#@L!JJhYan6#"qD Jb |ԎaZ_{/6~Av*,Z@9it\1p{4[tJ{jܫڛ)3Z`uVn~}RiOfa-VyXPns%#B޼g62Asj혷)$z@?M sa]$٧$`@}oc'pt4tp qdsyd&Է_U]״ χSɗ ߃q荂>o3HSݝ #~yzfk_~{O[֬dM'=d/}+^&HJ2`= rfe;U|1ȩW#KG<"ϭ@`c4;S R~Y~d|C)|"~-j&"Dpow?^T*GfxdCygiHnavit-0.5.0+dfsg.1/navit/xpm/country_VN.svgz000066400000000000000000000006721264204753600206770ustar00rootroot00000000000000E(zHcountry_VN.svgQk0 KK4q u2[aiǞg+*Yo?َºAh4nCV6R?+A ZQ<Қ] 4C*2c2&]y7>'-UYLGPgQʍZ8+3]*5R;z_S1tK>qT8`@4n ;>3navit-0.5.0+dfsg.1/navit/xpm/country_VU.svgz000066400000000000000000000057651264204753600207160ustar00rootroot00000000000000D(zHcountry_VU.svgZmol %Ae.A!@P)Ҵ 8)x,)$'vqfgw^w䋯wǪ=rjUmS?gѱͮW}3?,U[m.f苻;We-eޮ yx:"P?˙M\Wms>}۝]vRfþro<_nWծqz,e[Se۱d[ CBB9R* 8>b|3 =5VJ`m41:);~C{vV}խ}njYv+qͶ:*hC]vw3gwU}{]Lt]^Tނu_{j,*ǎ҄B )v[MPL]mn&ft(Yb߂EYqfъVc]= hÌ6,\7mY~'Xj u4x9 گ׏wp.gtצScMM43glgl o⴯;(SۢnTEx<ܶ=Uӝ=,]P:CJ9&n2[Ƶæ{XL%=u7edZ=&O__nk(ª}spN9xèoB\n >YY3IզUr֒vsQ1(R!nnE<ܺ#χlIo$uFwf &RKYp SgYϽ3y4.5#$lqtmZf.z=|n\@7jcazIs^Wͪ9jwX*I,_ 2{({x лu{{}[7`x^=|W}fϷxxim6YՔ!dҀNĵΗI3 @jX "Ud|AY'ρ*f-ǫȥ3t*au^Zt٦lr?^E)ٞ#'R9m$ܒ~@]1&&ҢXܓlEyI 5%œ|◲/Jt?6^Ԁx1Ҥ10|'LHƐk cnoPEq N4U9Uvy'ߞ#Db(dLUME Hh|d>)Y43b:j09:4-Q|Rp0@V݄,"200`kXTٜ3/(ҘOذ,P++dXRu&]ጃ''5Te9eܗ_KC*6i/=9 n#ڟy1(]JeG_Mܚg\| ;bCՌc-)o1mH;Hf YgqΨ#M(å!_MhJjQ9V5RcP& knlX+Ӝ6scxLITbMolZSy5gp{VH&.$ t΀ab`aHwh7+tW.C,H?J}Lx>Y7Oђfnw*Ԅ,(L#ٗ ;ۯz0Sl!Y`X.eHc(Pg+S9 q/J@yf>4\.Q='Y|Eք*`Y%!rZc)g} ȭoQ#c:wbdH;59ƷU =V||Acl=Vizo1WtH\%2GA*8Fz8U1U ǽ=V `Lz `hē 6j<~(4Oj{j9_Rwc*#|nC%D3pZѐ*p/ŸW h8(ԈVK WRR6hcҐ_R|[h*xf sIgCnG}~'@2rfiTA\2irj ~UBPgHK1hH[\ޯ5M1i;Ѐ*I Fb@ +d@ΐ*hhHe@-:ң*TAk?|C;#dAO 0\byE b4< rԥ7ICiy|N 7L{\z?燋9 o_ sB%navit-0.5.0+dfsg.1/navit/xpm/country_WF.svgz000066400000000000000000000004211264204753600206600ustar00rootroot00000000000000F(zHcountry_WF.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_WS.svgz000066400000000000000000000016451264204753600207060ustar00rootroot00000000000000/(zHcountry_WS.svgVn6}WKZ)}MѶYt):;u@̜33"<|TΫMQL#k^/nej>qH9Z?9n=͕ص#w`aGi QҼ~Ũ%3۝y#YCڰ=tn7;=4HlGd-D/ #4Bd0 7rWҮ/07.渕cS~o~ؔ6{4eUfA7: L녶V!k$]0$;ⵔ۷_օڻ2Qn#~B[ ߬9r *fPk׬O^(]H=U@JGӅl>l4*+x}W6@ 8Jc?C4y[m0$a}'O 5wZV(vRSBc6#R?d WF?5Fp%wc+Zגw+%Ԩ?[T;H}Ipi:T} n­.?0H P&o*:$ I ԁK=exz;nvvt hMhu'gI[A$5M\n#wjw? 01XI}] he˥ 1MV`!,eߐ;%fw\efw navit-0.5.0+dfsg.1/navit/xpm/country_YE.svgz000066400000000000000000000005361264204753600206700ustar00rootroot00000000000000G(zHcountry_YE.svgQK0_qm;}ns DNeOk6${:Da%l.[8rИbEωd: l]/kX?ܭf@"ė q . {ڏj\všA׈ % e“ànlNF3`~Lv֕lK8t 2M9ڢ]K2\( NRKx3Q 8p%ognEFDBm8(iYF:Ӂkmsrɫt2;tWj<3Z 稓sxR%:(6navit-0.5.0+dfsg.1/navit/xpm/country_YT.svgz000066400000000000000000000004211264204753600207000ustar00rootroot00000000000000(zHcountry_YT.svguQk0_="S֪ =6m]*Mf/}{}//_ 9hKmj߮<.7e޴F J $ﳷt[{ ~D)bqC8别-PΝ}>mWOJ=%aҕ+d2~?ρtJ!JZ93$] t, | WhWU5v[z= |a`)XȤnavit-0.5.0+dfsg.1/navit/xpm/country_ZA.svgz000066400000000000000000000007211264204753600206610ustar00rootroot000000000000003(zHcountry_ZA.svgSMo WUJbmZT:ilbT &!ݯ$SM]/|Wv4B+bj+8?9RUQ#4<,#Uswjk7q윛DOz a%p`Q `,CS (Rl~Q[#QFoUsfʣbŀ&D>G=$%z£((D!5ug#V5b-,$p#~O]k#je,]-,_.gӾ>JnWn#,=ER̋rNZ <5pr~~ac4>'v$]*.Y鄭7&vx]j\mS= c>s1즽1Yc|[dwCɛa&ӵ+IYw.ajyX[J?Mnavit-0.5.0+dfsg.1/navit/xpm/country_ZM.svgz000066400000000000000000000125561264204753600207060ustar00rootroot00000000000000G(zHcountry_ZM.svgko\GrWpL/2dM|#D ز} X$@V էuy7?y=yzgw6mn^]߼|zo{Φۛӳ۳|ٓ_ルx9joqZ}&ͶZ}gn^V޽߯s~o{K ^iRKOvs5޾ݽ׏_ZoVgO>~ͩA^mrsĖEz]fwo6q84?Ԓӳݛ7jsVv-]>nlfw۷G]o.|#z_iؓ͋{B,YLxCWwy_?/no\ׯ/~{tΈ_o.6?lnn~97n\O˳5Y,)ͮҾccev%З?>=e]51ټWvݷ:Jm2k{{_|}?vh!T۩-kzr.}9-R(_mlvp>Kr(89 %Sq^>8t]˄yzr{wK!|1ҹǿ,bЂ%/ҜbnzU^n_zu]?oo.nqstBzJSqZfℒF=)騾3"SVCS}!͡P'>Z n.U=z>)C R*U3d )0 7V!ӿIKOm =IPCcTOڳ{$Ek/:c>tHF,=3 }a)6-ڬz;DK+S˳Oڴ)mRk0`A3WboW; fUgY\:dzUɘ֍1Y HKhMƹ*:tF"T2U+N> G߫5:e¸N}E-{2ļ":5])NfuDfStA]Rt Z*|kL0 EG9C%F9}9-':J$.=F cc<ȳ˒gxW{@<#%%fۍNJiZ>% _#R/q qXwo~Fw-NFvEwSK#Ld3,׭IuԢ%Di ʕpDm+k L(g!Q:M$ʕ8zHڙ^3I}fkBdWc3I؍{;=30SGYm DVYy4r@Y_O~ۮUXTFȥږ䬏qgo.̎9 Hb 0I쎱هG^d&4[cՋXUf&q$o~f/_Hg`(dBN_ڸH+椵qkm>qcg3w[R Wqr6r(F{g#4ORk&A {R8J#+~ ,?;9 sEBeX.B!ʚ~j;iR6 B YJ&p ĥb@%{It4&w.NN%8T%pHOC_]|&gh-q9H:'p͚b5M(z E*ug &a!I"beI 0 3 G;h $_L Ʉ P%dnNn0y/*`ȳFv5d/D &@Et.tFZ _SI"ݑSі@]aK2;!+ qEr+Y5ap"{$ N^pR:umq`fP|ć`L{ًvRG8OݟH[0t#pHY@+04Z^vSS&G>vki 3tI5ܷi)ʂn`/0HS J9ačꁁ7 >c̐lwQPF=##RF~pF+ĵU,TT oS}z}YSؤ> = fzq{#JH]|GB-` GD:`ʎ%mLؼCTU2 uݎw'v}Y¶Y_(y\}&&+E*%/~ h}yѣ9C0V2Pbzq#ӥG-fI8.tBRJYKvDdWW.܂;#h;l2W0`d_h 0X5 M>J Hud6h:n 8hX|7|&$Qڶ _*lJFڤh! M)4՗eDQό)ZMQkpn$A(Q4Gܹq2FaH`" <\˸n'BGcҒA Ef96JFH -i$Ü[tvPe&PTw#͒u=pJLd$GGιۄt$QhwuRUo98aěK;EZ5y.#28eN9aGScZ]-6(58D i)"-Rvyj jEZ) q@rwI*-y5Dqr4ZeGb Z2D*iZc)1RHo.=!+$.퐨fu*8D+Tb:f[o8ROI]m#T H˚"Q$b,`XV@gfah bi$5Y3[ 8 NInuHxfQdWbiM KgV.bɦФ4+w;`Mі[@U $;Ɋ@ua"bSdURm4[2إVLu9Rԁ\У5* ]S!'ج"ѾP7hZrVg 0eb3YzHZcU*h,d%tHhF> M:3SXxROXj01.j֪V/fr&Y5 :S[#m N -YHXt`ZL96i|T瀇Λ;eR V6;Ypmݲڑ%:7ܱ&ނn0"Uj3i>b40V\ěq ըYvu;Rr)y fP[A]0r:(K+b4z4UZ>9 :4F4Y~is)d,W-ӠNN9)jv)z* d$FeDXe`BBlJ*"I EzqZpENSXjbG!Y/􇹰pC!5R $B&58sFe[huĿA+#rAK#lKZ,ZU bk+ ֶFa&ydԂGaK7$z b RPGaudb"% fԂLm)[Vk0tףJOKq$YD7K4vO1x@!AclyÎk&@}ڂf8iȋKK)>>J:r}5bRL(ص]$),ΝP"0)~~ ~0K4ɦ ah h+ h 늕(ph| y)-)_D1Nbs`5Iء%]FaO*@S|Ew/:7 WAA]ZmhJxkUeS8-VHCz}޿t@* ]LH(7< `3k,A$^`Hj7k@uڊp2[$ljG,&Ne%0 ^_ ְcX0#dPq)^t!g,EV|,z N}90?2#:XtA@;ے @Hw))D-aӲ%'x$B',vy|척xXO 8 վxq ͟xIYS&&A]'ݘO>5PhaQ hMFoΒFԏQ>qg{eP %2%yrX,@+%H.ˀ''G2ޤPU? 'tZh'0UhVwq L|#xcpx3yF8P"h<#'DQx+k)7tVd/ۈ1aKn?o 0QXaZ:҉xXObtRJt/RY &0h~Lc?`7*$+ԡ[SbU DՕG~}=^)@?=ʼn̍4pT@/0K%R$uI,C{/0r#\{m%fy"\:unzs-W|8Kl>5ف4{(Wz=:<.C&C(5OZGlyHוRU~vFh"z=j"nk0jȐqjNdmffjv!T'gjj #Ɏ]/P+\ɓQKO͠?9^ԏ'qL=:M6{Ƿ?1TBQ4R]% m`˹ 3wyO77|}r7tz2ԙ՟GvLJ;"mҞWy[^v\?Ymf|uXތk?^w7ɸއ?c.żGi]|Y6v1p9c A7Z?pr*R|YuB?^vWE(\랽 %/kWl̥$y֞W?T6̏aY)GS&t9rw}- Q8mmt!;Ͷߝr'.2,6\uT<;sj<\L\wUJY똜JP@H.bx$$L /k d=$j<j q4dmd i6[rHRem6& G@J Q"jQ@Ss\rqzShc\t>`[YkD#'1U;eʱԞA\qU):gxU(c`m`0ɢc8U${4 >ubIf) JQ=#.H)Ѳ0ህ,[cj,AǪ U# 7 E\K SB: Y8eoR5ʊjvD*LYBci |~Xvna\Rz+QLլ_n(ru50~]yJ`p:a"U'8TUcz^ af"!u }sS+d׸bB7dRd.pfNxJ̀=Ph&:K?` image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/cursor.xml000066400000000000000000000036751264204753600177230ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/cursor2.png000066400000000000000000000015141264204753600177570ustar00rootroot00000000000000PNG  IHDRĴl;bKGDIDAT8O\Uϼ@k2-Fk7 v],4MѸjWv44jT1j-! T~ {00{s}܄.Dcq*++z0p gAs?0<\7~ C"@u`~RlkaA;v+ʑn&._̀K0zZD<#8B<~ywG04W*٭B!s8`}>F,:yIn}oĢSְ4THGrtk7]^jž$R0@k(?;y1|+N?ʲ~zM'uo' ڒ UDTsvyWfM9a 5แ.Kع"v!-|w&'WI5#},7@ ]#n\X չv{8q ^}"U`}%t6)6nHݔӊz[׫s73MZ$ظ."b+V(CgюsEA,z~[L7-k mH&<%vƢh"4;|?J̺[ Ra jԒ<+B1 XV( ,%rA,j`EtEB\,@DhTD image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/cursor450.png000066400000000000000000000014471264204753600201330ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KTQ8wldD) F 2 !Z$d h#rEA."A pW5f0M%IX0C3Χ·3N ssjR  B"ZsT$`@-2bcʨ v㌞v QR(.;7@K6VcYಈLX&X)3GσQSFix2~X+,,p>8>ZluڍJv"1&o^7s)k[8wK'LHԊ;O9y@D36蚖lD2Rh"1:bՌ*ƆW^h27ZxRMunuү\Ux41Z`/]h!zۈUEpoJ3 [V95NVXk7sC<+럙_؀f+_q*c-(Zt4懲>_pY<6#4b0 *YxY ًg/x$A"mh u|@{;y,dx*G|-2(ruzNȧu(aU\iW vj'#=?Uq{ lX|&τ(͆}:m;f;k*Zlg +IENDB`navit-0.5.0+dfsg.1/navit/xpm/cursor450.svg000066400000000000000000000144751264204753600201530ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/cursor675.png000066400000000000000000000017641264204753600201460ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<qIDAT8KlU?ĵ[jJ$iijHA*X - H @UU.hxH.ZEĆT;DMR5g image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/cursor_still.png000066400000000000000000000011621264204753600211030ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT81haﮡ^4УC1bA%8 ](TtP1["AH"e"RJ%&/]#o޽}{*$"s@!4&T՟U5a @NH@}p3|^9{|ެE?8GBDn/Yn Ks?hoඪnX,">ea slb&|hT5E>EVq_Yx=H3;= Ch ;[̸奓lvT qx^|Q3= \kԌ5Vs1Fq]<{Jt\P_0 ;Ӕ'=9o VkT_hF_MR ZKuh!xz-Ozp`{Um3nj{B!kC(ԞX)_ lX0 IENDB`navit-0.5.0+dfsg.1/navit/xpm/cursor_still.svg000066400000000000000000000160231264204753600211200ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/dam.svg000066400000000000000000000371521264204753600171430ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/danger.svg000066400000000000000000000101631264204753600176330ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/daymark.svg000066400000000000000000000126311264204753600200250ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/desktop_icons/000077500000000000000000000000001264204753600205155ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/xpm/desktop_icons/128x128/000077500000000000000000000000001264204753600214525ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/xpm/desktop_icons/128x128/navit.png000066400000000000000000000337331264204753600233120ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs B(xtIME㟹 IDATxye}{ẑ v ˀ $XE2*)RqIɉ-W\)+Ir)ؤ\RH)R"X `f/{w9?ιY1s;py$ \rJfb4DE9%/hPuNERbQ΃ Tﳠ| ϜS\x7JDDD2U %- +朒*4!2R[d9%DBgAb`sCAcBHr1I /LS+gUZݷ;i i"_D:86$ ".,DG1`F8:5%cMՁ/$ D>^ѦAۿ‘S g>rpDͯHUEs(rÀJZxnBmVJn(24"z׀$S PS[]^r b_$ȧxjyjoCUo!Ufs9Z b(yB+Jf-4Rk! $jsPXq$Z`7;XZ4SHQ+߹a,㏎sU~E>>C3ۦ q乲ka|/h̼#۶F%G?-ȈxGWz=/0#/  JC!Dfւ:0+]ef^?XZ8AQT?3+O^w Ï?)>cqa:(rGTf&:o}ޔ;H,Ϋ\y@ePcw~,` ""G+O0"UTUEvLg~,br̐Ps=Tk}@b.e/GQ~QAPu^k)s>@}WWPl1 ءn^넼 UTE|ȁ>)N y5jS›z0gvZC{k])/4* LP>ZD!אJ:~elQF VV|p>ZEUEDڪzuAv>`HSzp<VyC\b *:yar?;X*k VdKD]Wx}>AUUvmZ o*qc=|VD`knQ`/j/Sz #*RM{][ IGHko up^#]).NyWo*|ŷVI""$ 4!uX_2`% #mR#RxUa|47 Knn]BS^>7洦eV LL hj~@"FI\ :XEq07i q VC,SD-e:hr8@C \,t )*zr `W-xHY]jP_ Q[ 8AKc7ѾhyQY jZ= LnD`BV}Gm.j-Cݹ UF \Jdz &~FQa]>Z놋Zj\pἃBk0V) 2(Cv,*>(|,Һ{n^KUqUP宦=K8wijr)Orᴦmx)( ], rLYXP+6 "Xh|y E6Zr.@\Un&WbFF0G^ФKyiJZAEH<'q34 SN(D# ~D$`8UPUy -U=酟=gX|W:|)y^mT"*| $KȮF"< c$htZ4P5HpOĿF!=8ހ1@-׾$,J+\LiDn #:gT*zn40wB䅐>HSDXQe0PO iqđ,e_)(5Xz x ?c1@Kyrzŗ} kA1 i1H#<_xtM!#9)Sc)[R[SWU]RV; kgJzUq(ǑO)ܗx6MtB3_#Ś- z)D4*D܀Zϣ7d ūyfvuC)M*wJ+Xi$FIhJۖo2;&đ#q1ɛ$J ,ql#%͕,'Af$[OPq vg)ptZY Tףk5k=D/=VXYkKHbW@dDL ALLf=P:H,޲S@l?z ݶ9xw^`~004ce)i4 4ca Re3=t{ $$8%X[bbP@+I7 _*{C'ɭoۏ[0&<"e-e/A .: uy;o572j B#1D\bclG"4c0 ("GC np*R *ǝt)^~k?|zO>r^B0m?} יt&d'"  tG:wä,`=`/m벍(n߱]sG#XYSާV{䃬"b ai ͆h02T0go$NRGթ֨[t nPıOצ99b嵄Kd,&rيl1mm{VLވa3z$Lb\u#Yә$$y7|Ga[90Q旕U,uF!M2^gPOآveđ&AaV}ì z  dx\lWkӼ~j3Mo+AnAF&w1:18#cFh;XBUս~H N:Rg(O qƾ;3o"18=X\nIۃfڱ^zҎRFGȃG? J)RAJ\2l-*88^  =(FӻӜ^lK#ee[`jnV8ۦu$]4 iY o␠5]qUI X+U{1bC3a&&~^d WX'2t2~<3䉟4;҂юG%6`T ozG ֭7AÈPrV2~F r9<5Hr̎WZMacX\VWF;B Q$tZ~l3whQ|A[f*JYվ+T]x'wDF9rv^= RoMg7u+;L4#vM4uM;Bozje4K a)"X±wbڮ>%8ADHEbONRXG?sJ̚nql^P#"^?3?{xc lFo}bوee`$)g c#^ za(2GPȭ6Pz/g#1BAW_WfonnHNw _rpCCl, +w/zino؉l۝5 n ?юrGjΪ7"B8+x˕cvH||MAqg-:"9kN3=^eԤ&Ǽ \Eiy\?<$ Pu; d?"|dės0H2h}{Y+)8 צfčٮd6;9v7qUa/8W*t-̧tFBޯѰ^6($ p*r 3ci=N^Dw[ ,ԗ/P͆09mw,,A1iT}>3s@Dk|u4S=+X='4Xd /fD>$-t(nf|4 կA3=xɳf11qv%eiEqN8d( Pa4am͖JZM #i'pַu JeqjN*vf`)~j3.ǎn0|mڬFIeK$ϧ`H!8qŊPED©]a2苢g`:&t|G'q)؅p˧wYf Y?Qt`kw*,.[VEs3Gi3bO'3 qIMX8}a-f ĉxVSTxݺ aip3mM3pC 9TŎw2ь=©bӴIRK3vvN`n~jn#Lv>m1XE޽"KbZB0Pr% e~`C5|4r7tlm&3b,$ώ9A?Skli>u`&դ 0eP}Y)])(!^. ft 3UN6KiO8g}Йq)dmPdej2zY̮i33sۧX#-o\#32y'k(-Ј`i+JMZV2Ԧ:JHC뚮kND쎩wT^`께)/n?V| EڿE&-4Ȕps,ز`Ъ˱C]IyR,w^(9|}OPi)C:0">vI~kw[!bϼFf#~䁓^YY1mXm[}IVizZM^hDЈ aY:]_>@*(qXr!,gcDϫ:SmwGĚGmS6GH5GZ+(OIDAT < &DWN/ E;xפּ@ @;(c~? gaDΉ>>Kn#QWg |YҶo1ܲՐfp⬥_k#Nsw g+*'48| jFۆa|4bF[NӬǠTSm~fm/ >FlA1S~1F#;0ͻvPX7v4d˿rF~N.yBc"}y\-}~/H^e|G|ѣf@o)h;fdճh7SAr83p7ոfd)ۧ:+0.zV0RZ_Pd}T dQºrѓX}.Z'8 ?&؉:#LJʻvp@PZژQzN- o!/ ZGsˏhCJp-ܾygb>So~vvN{Drfɑӻ[3GBoO)IS"Wڱenֳun}\9[>sb&ks6nB>="Pv͎P};GP \|P%"X KgͬuJI5 vi$𳏽#{ɭٴ^ s_{TbvgRѶkڿ#`Uhy^IZFq|XoHHe߆7?:e1f0(xu͎"Í˭#{L${Tl)&v!ISy~].2*.de$lVɡ }x2$2v/Za>h,lb94t~M>[Xw;6s"޳gfv-+aYee5Y24& qܷe/,vؠFExԱڞ^diEA%~{DP 5dP\"oz76hy&奷V88 ESzkG@M9*rUzg=Ͼp)-\U^=3I;ؽH3vܺSNCع09Oh5^!->4y"鋚jfE /rMIwnX4#huf1_mg7] IW/\b&T7 Nd=FZSeK':å$c%x GEF NN>an^TKM:{Ǟ+"Hy4NS<~o}$ҭoiuٕCgBwxd-df~Gn#>|"S>F`Wkq4 tdl8ijj%dJ @yEK ( "|SdD pZQf=[b2< ]amPxP[ކ(H|&,^R!rI^k]A_)"-fT[ШB.3kL]p߷*UUUQ+/hoh_D&=}`z=P5Ќ /ZLϻ2^6j$9,=MO8@. TM-U!͕nHODamAcnc>h]z5΃oz̋Hep:S#-U3T۩fx}Oרq뙀=Jă{fgR]]%ʺ0Trb͠UrI]ƥ6&m~'i|,Y8&&Icw8U7Na(:v:|cjr?_0y$|]'$y{{U[c: ٗRN#A(:[;2N ;ytCO8i9+I#<_~yՁ%5"̮f:ĎrZ?O1oᜲo*wJ'|7 ά8/e?bf{ ¦FpeߪX ,љdÌkX7\w3m`YpwaSq` ދ11?;ǏgK'ׂy@h=-Vyt,5w|ߛWs_AJYZq,~_!K?hʠ X~RL%9@~W~7Np'^E%*YY:NYCKBm^ɵ0 ~:$Ώ8{_Hg o- 8<X?j:A!9)Ξ->肫-ݺj71 bސڥWw -'{v.P!ygz߆a|xW}gofAהCcaARV,C #4\lb+אxL3G*Ѫ[uV1 nܿs!N(,>e=ZxrUsIh,~ITr'/6rR7?"8bCL ?S hVZoIʳ, C"gse꧊-P=(U>Z-1$z֮SB+*2/G ylσh uܿY; nctFf,k!Ԫ_'3WD&QͪSM&ׄ rϠ֧ޮuM~טINi{o!Z+Cʹ-`.Nk%F,9>eY-zWuGxC99:lӭ}[f^\FrSw{[VIi8מ - XPB6Y4cnpZzeǟX6֪b2c>E39hC٢ j,f YCf?<{T[ċ'ch *舗N`s62|]a%ְshQ(ߙ8c}oby_WܩC닍Rqi hFC`a@r */v.bdˌ7RZ1Et}- Y9KdE4lZZ)XSCgjsDL5@l?37~+~dAm;{{CnUwp5_9Ho%.|ϡv QL_@ɻ/\5_6r88gO||6LOˎߐ2^8+Ź|.EECB( 1:||};Yx3g:Hy.b@7ttkzvdj%aCˎn1bGv_EiNΥ3>y?4qԸH[H.ߨ^RC$G{_?@Z@ DULw+1U0)޳7D10r. W]7u)¯rqc= k5 Ju㸀o`i|ၝ>ɯN,XwO/չ¼>CKXMuR 4a# es Ӯ7}]*Q?Q9.\ vS/ѥ/y(Pջk2cq`\z΀m%s6㫙Yw-|إ#51r =<_t,X j!Pa k\>^I_m]) n٭a*}/Y"鳥^ƒ L4#ˎo.8uZbVlbETW[CAPLDBG?$ lAQ㷷{ C]t\1j#Zvq%@ȭ0J|wSXh3fMVs92uJ6s!,ؠb3oUwa%Y1.vv JWك("guO:Ƣe~37=_x;{^EoT ଛ)/[r`~ ה{wHʆ<\ם0)3}ɞcvY:2l>+8<9'5#gm? h Kn^ra*Zû㿭!{#0ّꀹQ(8NS=D9mcvg/:_?&K{$I\ Jk67i尰X,UI,\ @>ꎒQ9a #MjO)FLXOӮ@9D 88 W9q/yi*$W2X\SE""_WsJ#}A.".0~T.wI[X\%pf_NV! nHC"*/ǾʩPVwgܲ 蘟i.P8x{U ՅyK7?7G4kW9aL֓P]PBE+O_j-['P~ '%hNEǥ{&XWG^z4,R+Ou-U] | Ey\α|e}剧V7oq0BIENDB`navit-0.5.0+dfsg.1/navit/xpm/desktop_icons/22x22/000077500000000000000000000000001264204753600212745ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/xpm/desktop_icons/22x22/navit.png000066400000000000000000000016741264204753600231330ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs B(xtIME&"w 7^3d/A-U0Q= r28) ND p!.]+vln1_.=gr(S.5H,UN߬>?_!"#oпa_B )S-Ʒؿ\!˿!pI"܋CЌ_~Wv’3W ʊAuU5vs^EmG`_#|>ZbP(ۭF.oP;]PUD9w6[6C!kE,@:!o,s`l(_Dq t k-=]-(٫gX{b"ۗIENDB`navit-0.5.0+dfsg.1/navit/xpm/desktop_icons/navit.desktop000066400000000000000000000006251264204753600232340ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=Navit Name[de]=Navit Name[fr]=Navit Comment=The open source vector based navigation program with routing engine Comment[de]=Ein vektorbasiertes Navigationsprogramm Comment[fr]=Le logiciel opensource de navigation vectorielle Exec=navit Icon=navit StartupNotify=true Terminal=false Type=Application Categories=GTK;Utility;Geography; GenericName=Navit GenericName[de]=Navit navit-0.5.0+dfsg.1/navit/xpm/drinking_water.svg000066400000000000000000000212221264204753600214000ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/dumping_station.xpm000066400000000000000000000041211264204753600216010ustar00rootroot00000000000000/* XPM */ static char * dumping_station_xpm[] = { "16 16 93 2", " c #899EBF", ". c #5170A1", "+ c #516FA2", "@ c #526FA1", "# c #748CB4", "$ c #516FA1", "% c #5270A1", "& c #AEBBD1", "* c #5C78A6", "= c #325692", "- c #5572A3", "; c #FBFCFD", "> c #FFFFFF", ", c #FEFEFE", "' c #F8F9FB", ") c #EEF1F6", "! c #DFE4EE", "~ c #E3E7EF", "{ c #F1F3F7", "] c #506EA0", "^ c #899BBD", "/ c #8399BD", "( c #A9B9D1", "_ c #C1CCDC", ": c #BDC9D9", "< c #8DA0C1", "[ c #8196BA", "} c #8498BC", "| c #6D86B0", "1 c #315693", "2 c #889CBE", "3 c #325593", "4 c #F8F9FA", "5 c #46679B", "6 c #879CBC", "7 c #9EAEC8", "8 c #47669B", "9 c #DCE2E9", "0 c #FFFFFE", "a c #FFFEFE", "b c #FDFEFE", "c c #FEFFFD", "d c #748DB6", "e c #DDE2EC", "f c #CFD6E3", "g c #B8C4D6", "h c #F9FAFC", "i c #325691", "j c #DAE0EB", "k c #FBFBFC", "l c #D2DBE5", "m c #C9D3E0", "n c #C3CDDC", "o c #F3F5F8", "p c #E1E6EE", "q c #9FAEC7", "r c #CCD5E1", "s c #CBD4E1", "t c #CAD3E0", "u c #5876A5", "v c #6D86AD", "w c #48679C", "x c #6F88B0", "y c #6983AC", "z c #49679C", "A c #E8ECF2", "B c #D6DEE8", "C c #4D6B9E", "D c #647DA9", "E c #5572A2", "F c #49679B", "G c #94A6C4", "H c #9CACC8", "I c #A0B0CA", "J c #D5DCE7", "K c #CAD3E1", "L c #BDC7DA", "M c #BDC8DA", "N c #DCE2EA", "O c #FFFEFF", "P c #5F7AA7", "Q c #AAB9D0", "R c #A1B2CD", "S c #7A91B5", "T c #375994", "U c #335792", "V c #FEFFFE", "W c #7990B5", "X c #AEBCD1", "Y c #98AAC5", "Z c #BCC7D8", "` c #FAFAFA", " . c #F3F3F3", " . + @ # @ @ + @ $ @ @ % % % & ", "* = = - ; > , ' > ) ! ~ { ] = ^ ", "* = = / ; ( _ > : < [ } > | 1 2 ", "* = 3 } 4 5 6 > 7 8 5 5 9 | 1 2 ", "* = 3 } 0 a b > , a a , c | 1 2 ", "* = d e > > > f g h > > c | 1 2 ", "* i j k l m n o p q r s t u 1 2 ", "v w x y z w z A B C D E z z F G ", "> > > > > > > > > > H I > > > > ", "> > > > > > > J K K L M K K N O ", "> > > > > > > P i i Q R = i S 0 ", "> > > > > > > P = = T U = = S V ", "> > > > > > > P = = = = = = W V ", "> > > > > > > X Y Y Y Y Y Y Z 0 ", "> > > > > > > V V V V V V V > > ", "` > > > > > > > > > > > > > > ."}; navit-0.5.0+dfsg.1/navit/xpm/emergency.svg000066400000000000000000000401251264204753600203520ustar00rootroot00000000000000 image/svg+xml en style="overflow:visible"> navit-0.5.0+dfsg.1/navit/xpm/exit.svg000066400000000000000000000150131264204753600173430ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/fastfood.svg000066400000000000000000000231001264204753600201730ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/firebrigade.svg000066400000000000000000000114311264204753600206350ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/flag_bk_tr.xpm000066400000000000000000000012221264204753600204660ustar00rootroot00000000000000/* XPM */ static char *flag_bk_tr[] = { "22 22 2 1 0 21", " c None", "+ c #000000", "+++++++ ", "+ +++++++++ ", "+ +++ +++++++++ ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ + ", "+ ++++++ +++ + ", "+ +++ ++++++ + ", "+ +++ +++ +++ ", "++++ +++ +++ ", "++++ +++ +++ ", "++++++++++ +++ + ", "+ +++++++++ + ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0+dfsg.1/navit/xpm/flag_bk_wh.xpm000066400000000000000000000012401264204753600204570ustar00rootroot00000000000000/* XPM */ static char *flag_bk_wh[]={ "22 22 3 1 0 21", " c None", "+ c #000000", "* c #ffffff", "+++++++ ", "+***+++++++++ ", "+***+++***+++++++++ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++***+++***+++**+ ", "+***++++++***+++**+ ", "+***+++***++++++**+ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++++++++***+++**+ ", "+ +++++++++**+ ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0+dfsg.1/navit/xpm/flag_bl_wh.xpm000066400000000000000000000012401264204753600204600ustar00rootroot00000000000000/* XPM */ static char *flag_bl_wh[]={ "22 22 3 1 0 21", " c None", "+ c #0000ff", "* c #ffffff", "+++++++ ", "+***+++++++++ ", "+***+++***+++++++++ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++***+++***+++**+ ", "+***++++++***+++**+ ", "+***+++***++++++**+ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++++++++***+++**+ ", "+ +++++++++**+ ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0+dfsg.1/navit/xpm/flag_wh_bk.xpm000066400000000000000000000012401264204753600204570ustar00rootroot00000000000000/* XPM */ static char *flag_bk_wh[]={ "22 22 3 1 0 21", " c None", "+ c #ffffff", "* c #000000", "+++++++ ", "+***+++++++++ ", "+***+++***+++++++++ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++***+++***+++**+ ", "+***++++++***+++**+ ", "+***+++***++++++**+ ", "+***+++***+++***+++ ", "++++******+++***+++ ", "++++***+++******+++ ", "++++++++++***+++**+ ", "+ +++++++++**+ ", "+ ++++++ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ ", "+ "}; navit-0.5.0+dfsg.1/navit/xpm/fountain.svg000066400000000000000000001042431264204753600202210ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/fuel.svg000066400000000000000000000215321264204753600173300ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gc_event.xpm000066400000000000000000000013071264204753600201720ustar00rootroot00000000000000/* XPM */ static char *gc_event[] = { /* columns rows colors chars-per-pixel */ "16 16 19 1", " c #393000", ". c #393041", "X c #396541", "o c #7B3041", "O c #7B6541", "+ c #7B008B", "@ c #7B308B", "# c #7B658B", "$ c #399541", "% c #7B9541", "& c #7B958B", "* c none", "= c #BD9541", "- c #838383", "; c #BD95B4", ": c #BDCAB4", "> c #FFCA8B", ", c #C5C5C5", "< c #FFFFFF", /* pixels */ "****************", "****************", "*****+$&&%o*****", "***$O>>>>>>=.***", "** >><<<<<<<>X**", "*X><<,,,,,,,<<.*", "*%><<--;;;;;<<:-", "*%><<<<,,,,,<<<+", "*%><<<<----;<<:-", "*o:<<<<<<<<<<< *", "** ,<<<<<<<<< **", "***#X;<<<<< c #7B958B", ", c #7B95B4", "< c #FF3000", "1 c none", "2 c #BD9500", "3 c #BDCA00", "4 c #FF9500", "5 c #FFCA00", "6 c #FFFF00", "7 c #838383", "8 c #BDCAB4", "9 c #FFFFFF", /* pixels */ "1111111111111111", "1111111111111111", "1111=;######%..1", "11- %2222222;3+1", "117;%%%%%%%;X:*1", "111@99&2456X 9*1", "111O-%4<4;;& 9$1", "11-;4<4;;;,9 @11", "1.#222X;-999o111", "1+;%%; 9999@1111", "1OX%X9&99>@11111", "1.9899&9X>111111", "1=:>:>X=11111111", "1111111111111111", "1111111111111111", "1111111111111111" }; navit-0.5.0+dfsg.1/navit/xpm/gc_mystery.xpm000066400000000000000000000012701264204753600205640ustar00rootroot00000000000000/* XPM */ static char *gc_mystery[] = { /* columns rows colors chars-per-pixel */ "16 16 18 1", " c black", ". c #000041", "X c #003041", "o c #396500", "O c #7B0041", "+ c #414141", "@ c #00308B", "# c #0030B4", "$ c #7B008B", "% c #7B658B", "& c #399500", "* c #009541", "= c #0095B4", "- c #7B95B4", "; c none", ": c #838383", "> c #BD95B4", ", c #C5C5C5", /* pixels */ ";;;;;;;;;;;;;;;;", ";;;;;:$$O:;;;;;;", ";;;;+X###%o;;;;;", ";;;:@#XX@#-o;;;;", ";;;*#X,;:@#-;;;;", ";;;*#%O;;X#%;;;;", ";;;>X#%,;X#&;;;;", ";;;;>*$;*#o;;;;;", ";;;;;;;+X+;;;;;;", ";;;;;;,X$;;;;;;;", ";;;;;;$ :;;;;;;;", ";;;;;;,+,;;;;;;;", ";;;;;:.#+:;;;;;;", ";;;;;:X=+:;;;;;;", ";;;;;;:$:;;;;;;;", ";;;;;;;;;;;;;;;;" }; navit-0.5.0+dfsg.1/navit/xpm/gc_question.xpm000066400000000000000000000007271264204753600207250ustar00rootroot00000000000000/* XPM */ static char *gc_question[] = { /* columns rows colors chars-per-pixel */ "16 16 3 1", " c black", ". c none", "X c #FFFFFF", /* pixels */ ".....XXXX.......", "....XX XX......", "....X X......", "....X X......", ".XXXXX XXXX....", "X X....", "X XXX..", "X XX X X.", ".X..X X", ".X..X X", "X XX X X.", "X XXX..", "X XX X....", "X X..X X....", "X XX X....", ".XXXXX..XXX....." }; navit-0.5.0+dfsg.1/navit/xpm/gc_reference.xpm000066400000000000000000000012741264204753600210120ustar00rootroot00000000000000/* XPM */ static char *gc_reference[] = { /* columns rows colors chars-per-pixel */ "16 16 18 1", " c #00656A", ". c #00658B", "X c #39658B", "o c #39958B", "O c #3995B4", "+ c #7B958B", "@ c #7B95B4", "# c #7BCAB4", "$ c #7BCAD5", "% c none", "& c #B4B4B4", "* c #BDCAD5", "= c #BDCAFF", "- c #C5C5C5", "; c #D5D5D5", ": c #FFFFD5", "> c #E6E6E6", ", c #FFFFFF", /* pixels */ "%%%%%%%%%%%%%%%%", "%%%%%**&$*;%%%%%", "%%%%@#*=;-#@%%%%", "%%%@*,>,>,>*@%%%", "%%@*,,,,,,>>*%%%", "%*#,,,>$*>,,>@;%", "%&*,,*o. O>,>**%", "%$>,>@.X..*,,;$%", "%&>,>@ .X $,,;*%", "%$*,:*X..o>,,*$%", "%*#,,;*@@;,,>#*%", "%%@*,,>>,,,,*@%%", "%%%@*,,,,,,*+%%%", "%%%%@#*>>*#@%%%%", "%%%%%*&&$&*%%%%%", "%%%%%%%%%%%%%%%%" }; navit-0.5.0+dfsg.1/navit/xpm/gc_stages.xpm000066400000000000000000000014051264204753600203360ustar00rootroot00000000000000/* XPM */ static char *gc_stages[] = { /* columns rows colors chars-per-pixel */ "16 16 23 1", " c black", ". c #802000", "X c #804000", "o c #A04000", "O c #A06000", "+ c #804040", "@ c #806040", "# c #A06040", "$ c #C06040", "% c #A08040", "& c #C08040", "* c #808080", "= c #A08080", "- c #A0A0A4", "; c #C08080", ": c #C0A080", "> c #E0A080", ", c #C0A0C0", "< c #C0C080", "1 c #C0C0C0", "2 c #C0DCC0", "3 c #FFFBF0", "4 c #FFFFFF", /* pixels */ " ", " 41-:3444434434 ", " 3#..#244444444 ", " 1X.X.;43444344 ", " 1X.X.%4442:=14 ", " 3@.oX%433#..@3 ", " 4:Xo##34-.X..1 ", " 43&#&:33:..XX1 ", " 442<33,31XXoX1 ", " 3441+X#42#OX$3 ", " 4443=&:33&&&>3 ", " 44433334333434 ", " 44434444,++*34 ", " 444444431%#:44 ", " 44444443332334 ", " " }; navit-0.5.0+dfsg.1/navit/xpm/gc_tradi.xpm000066400000000000000000000013051264204753600201520ustar00rootroot00000000000000/* XPM */ static char *gc_tradi[] = { /* columns rows colors chars-per-pixel */ "16 16 19 1", " c black", ". c #003000", "X c #393000", "o c #393041", "O c #396500", "+ c #396541", "@ c #414141", "# c #7B6541", "$ c #7B308B", "% c #7B658B", "& c #399541", "* c #7B9541", "= c #7B958B", "- c none", "; c #838383", ": c #BD95B4", "> c #BDCAB4", ", c #C5C5C5", "< c #FFFFFF", /* pixels */ "----------------", "----------------", "----------------", "-------%X+@++ -", "------oOOXO+oo+-", "----+@OXO*oo@>$-", "--&@*+#*@oo;<<=-", "-.@@@@@o ;<<<<*-", "-X@@@oo@<<<<<+--", "-+ oo@<%<<<:+---", "-X<,<<<#<<+-----", "-.<<<<<%=+------", "--&====+--------", "----------------", "----------------", "----------------" }; navit-0.5.0+dfsg.1/navit/xpm/gc_webcam.xpm000066400000000000000000000013631264204753600203110ustar00rootroot00000000000000/* XPM */ static char *gc_webcam[] = { /* columns rows colors chars-per-pixel */ "16 16 22 1", " c black", ". c #393000", "X c #393041", "o c #006500", "O c #396541", "+ c #7B3041", "@ c #414141", "# c #7B6541", "$ c #7B008B", "% c #7B308B", "& c #7B658B", "* c #7B9541", "= c #7B958B", "- c #7BCA8B", "; c #BD308B", ": c #BD30B4", "> c none", ", c #838383", "< c #BD95B4", "1 c #BDCAB4", "2 c #C5C5C5", "3 c #FFFFFF", /* pixels */ ">>>>>>:$$;>>>>>>", ">>>>>.1333=2>>>>", ">>>>.3322331,>>>", ">>>O33 @@ 13->>>", ">>>X3@2,&,X312>>", ">>>*3&2<<,X31,>>", ">>>O3#3,<< 3<,>>", ">>>O3<,3<@&3O,>>", ">>>,O32##<3<&>>>", ">>>>&X1333O+>>>>", ">>>>>>OXXO>>>>>>", ">>>>>>: @:>>>>>>", ">>>>>>:.=:>>>>>>", ">>>>>&*<=@%>>>>>", ">>>>oO<<>>>", ">>>>>>>>>>>>>>>>" }; navit-0.5.0+dfsg.1/navit/xpm/golf.svg000066400000000000000000000603761264204753600173350ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_about.svg000066400000000000000000000447771264204753600203730ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Dialog Information dialog info information navit-0.5.0+dfsg.1/navit/xpm/gui_actions.svg000066400000000000000000000541701264204753600207050ustar00rootroot00000000000000 image/svg+xml Games category August 2006 Andreas Nilsson http://www.gnome.org games entertainment fun joystick controller Jakub Steiner Lapo Calamandrei navit-0.5.0+dfsg.1/navit/xpm/gui_active.svg000066400000000000000000000221061264204753600205120ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_arrow_down.svg000066400000000000000000000044721264204753600214260ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_arrow_left.svg000066400000000000000000000044641264204753600214120ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_arrow_right.svg000066400000000000000000000044601264204753600215710ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_arrow_up.svg000066400000000000000000000044621264204753600211020ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_bookmark.svg000066400000000000000000000442271264204753600210540ustar00rootroot00000000000000 image/svg+xml New Bookmark text plaintext regular document Andreas Nilsson http://www.gnome.org Luca Ferretti Jakub Steiner Lapo Calamandrei December 2006 navit-0.5.0+dfsg.1/navit/xpm/gui_display.svg000066400000000000000000002323311264204753600207070ustar00rootroot00000000000000 image/svg+xml Computer Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> navit-0.5.0+dfsg.1/navit/xpm/gui_formerdests.svg000066400000000000000000000373561264204753600216110ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_fullscreen.svg000066400000000000000000000264141264204753600214070ustar00rootroot00000000000000 image/svg+xml View Fullscreen http://jimmac.musichall.cz Jakub Steiner window maximize fullscreen view navit-0.5.0+dfsg.1/navit/xpm/gui_help.svg000066400000000000000000000441171264204753600201750ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei navit-0.5.0+dfsg.1/navit/xpm/gui_home.svg000066400000000000000000000225641264204753600201770ustar00rootroot00000000000000 image/svg+xml Go Home go seek home Rodney Dawes Jakub Steiner navit-0.5.0+dfsg.1/navit/xpm/gui_inactive.svg000066400000000000000000000234761264204753600210540ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_leave_fullscreen.svg000066400000000000000000000432501264204753600225600ustar00rootroot00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore navit-0.5.0+dfsg.1/navit/xpm/gui_log.svg000066400000000000000000000311441264204753600200220ustar00rootroot00000000000000 image/svg+xml Justify fill October 2006 Andreas Nilsson http://www.gnome.org justify format align left navit-0.5.0+dfsg.1/navit/xpm/gui_map.svg000066400000000000000000001227631264204753600200260ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Web Browser navit-0.5.0+dfsg.1/navit/xpm/gui_maps.svg000066400000000000000000000473401264204753600202060ustar00rootroot00000000000000 image/svg+xml Map Map image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_menu.svg000066400000000000000000001656601264204753600202200ustar00rootroot00000000000000 image/svg+xml System Applications Jakub Steiner http://jimmac.musichall.cz system applications category navit-0.5.0+dfsg.1/navit/xpm/gui_minus.svg000066400000000000000000000051211264204753600203700ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_plus.svg000066400000000000000000000062701264204753600202260ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_quit.svg000066400000000000000000000170461264204753600202300ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/gui_rules.svg000066400000000000000000001073761264204753600204060ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei System Run run launch exec navit-0.5.0+dfsg.1/navit/xpm/gui_search.svg000066400000000000000000001637311264204753600205160ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_select_country.svg000066400000000000000000000234761264204753600223140ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_select_house_number.svg000066400000000000000000000234761264204753600233040ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_select_street.svg000066400000000000000000000221061264204753600221040ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_select_town.svg000066400000000000000000000234761264204753600216000ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_settings.svg000066400000000000000000000552251264204753600211070ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Desktop Preferences preferences desktop user settings navit-0.5.0+dfsg.1/navit/xpm/gui_sound.svg000066400000000000000000000742771264204753600204070ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Audio Volume High navit-0.5.0+dfsg.1/navit/xpm/gui_sound_32.xpm000066400000000000000000000115201264204753600206760ustar00rootroot00000000000000/* XPM */ static char *gui_sound______[] = { /* columns rows colors chars-per-pixel */ "32 32 166 2", " c black", ". c #030303", "X c #070707", "o c #03070C", "O c #050C15", "+ c #050C16", "@ c #141413", "# c #141514", "$ c #161615", "% c #141616", "& c #161716", "* c #171716", "= c #161818", "- c #171919", "; c #181818", ": c #191919", "> c #191A19", ", c #191B1B", "< c #1C1C1B", "1 c #1C1D1C", "2 c #1F201F", "3 c #222321", "4 c #232424", "5 c #232525", "6 c #242626", "7 c #252727", "8 c #272726", "9 c #282827", "0 c #272B2C", "q c #292A29", "w c #2D2E2D", "e c #2A2F30", "r c #2B2F30", "t c #303231", "y c #333533", "u c #343635", "i c #343636", "p c #373737", "a c #383A38", "s c #383A39", "d c #3B3C3A", "f c #393D3C", "g c #3C3E3D", "h c #3F3F3F", "j c #193A69", "k c #1B3F73", "l c #404040", "z c #404241", "x c #454544", "c c #444744", "v c #464645", "b c #454948", "n c #4A4B4A", "m c #4A4E4D", "M c #4E504F", "N c #50514E", "B c #4C5050", "V c #505452", "C c #555957", "Z c #575A56", "A c #595B56", "S c #585B5A", "D c #5C5D59", "F c #5D5E5B", "G c #5B5F5D", "H c #5C5C5C", "J c #5F605B", "K c #636561", "L c #606462", "P c #656564", "I c #656764", "U c #656866", "Y c #686A67", "T c #676A69", "R c #6B6D68", "E c #6E6F6D", "W c #6E6E6E", "Q c #737571", "! c #747874", "~ c #767A78", "^ c #7A7B7A", "/ c #787C7A", "( c #7B7E7A", ") c #7D7E7D", "_ c #7E7F7C", "` c #7D807B", "' c #7F817A", "] c #7F807E", "[ c #204A87", "{ c #838683", "} c #868686", "| c #898D89", " . c #8C8E8B", ".. c #8F938F", "X. c #91938A", "o. c #90918F", "O. c #949793", "+. c #959793", "@. c #959695", "#. c #969795", "$. c #959894", "%. c #9C9C9C", "&. c #9D9F9C", "*. c #9DA099", "=. c #A1A1A0", "-. c #A2A5A1", ";. c #A5A8A5", ":. c #A9ACA8", ">. c #ADAEAB", ",. c #AEB0AD", "<. c #B0B2AE", "1. c #B0B0B0", "2. c #B1B3B0", "3. c #B4B5B5", "4. c #B7B8B5", "5. c #BABDB6", "6. c #BBBEB7", "7. c #B9B9B8", "8. c #B9BAB9", "9. c #B9BABA", "0. c #BABABA", "q. c #BCBCBC", "w. c #BDC0B9", "e. c #BEC1BC", "r. c #BFC0BE", "t. c #BFC1BE", "y. c #C1C5BE", "u. c #C2C4BF", "i. c #C4C5C2", "p. c #C5C5C4", "a. c #C6C6C6", "s. c #C6C7C6", "d. c #C8C9C7", "f. c #CBCFC7", "g. c #CACBCA", "h. c #CDCFCD", "j. c #D0D1CF", "k. c #D1D3CE", "l. c #D1D4CD", "z. c #D1D2D1", "x. c #D2D2D1", "c. c #D3D5D1", "v. c #D5D6D5", "b. c #D9DAD8", "n. c #D9DAD9", "m. c #DCDCDA", "M. c #DDDEDD", "N. c #DFE0DD", "B. c #DFE1DE", "V. c #E0E1DF", "C. c #E1E2E0", "Z. c #E1E3E0", "A. c #E4E5E3", "S. c #E5E6E3", "D. c #E5E6E4", "F. c #E5E6E5", "G. c #E6E7E5", "H. c #E7E8E7", "J. c #E9E9E7", "K. c #EAEBEA", "L. c #ECEDEA", "P. c #EDEDEB", "I. c #EEEFED", "U. c #F0F0EF", "Y. c #FAFBFA", "T. c None", /* pixels */ "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.y.w.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.' f.w.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.I l.6.T.T.T.T.T.T.[ T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.n y.K.i.T.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.T.", "T.T.T.5.5.5.5.T.T.T.I 0.D I.q.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.T.T.", "T.T.T.C.A.S.V.T.N %.=.d ) M.<.T.T.T.[ T.T.T.T.[ T.T.T.T.[ T.T.T.", "T.T.T.A.5.5.V.Y 0.E } 7.O.n.:.T.T.T.T.[ T.T.T.[ T.T.T.T.[ T.T.T.", "T.T.Q U.c.k.F.2.v ^ q.a.#.x.-.T.T.T.T.[ T.T.T.T.T.T.T.T.[ T.T.T.", "T.K *.Y.P.J.K.E v ) <.x.#.d.$.T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.", "T.J X.H.m.m.F.a 8 w q 4 x y...U T.T.T.T.[ T.T.T.[ T.T.T.T.T.T.T.", "T.D ' V.i.i.M.y $ : < 1 z 3.| m T.T.T.T.[ T.T.T.[ T.T.T.T.T.T.T.", "T.A R n.>.>.v.B $ $ : 1 g ,.~ T.T.T.T.T.T.T.T.T.T.T.T.T.[ T.T.T.", "T.T.Z x.+.+.h.T 8 # - : a ;./ T.T.T.T.[ T.T.T.T.T.T.T.T.[ T.T.T.", "T.T.T.g.) ' a.i H i @ $ i *.L T.T.T.[ T.T.T.[ T.T.T.T.[ T.T.T.", "T. $ 0.a.a.3.- 8 l v = t #.J + k T.T.T.T.[ T.T.T.T.[ T.T.T.", " 0 r r 0 . : 4 g t .S + o T.T.[ T.T.T.T.T.T.T.T.T.", " X , a { B T.T.T.T.T.T.T.[ T.T.T.T.", " . 5 ( m j [ T.T.T.T.T.T.T.T.T.T.", " 7 ! b T.T.T.T.T.T.[ T.T.T.T.T.", "T. $ S f T.T.T.T.T.T.[ T.T.T.T.T.T.", "T.T. - . T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.", "T.T.T.T.T. T.T.T.T.T.T.T.T.T.[ T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", "T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T." }; navit-0.5.0+dfsg.1/navit/xpm/gui_sound_off.svg000066400000000000000000000673421264204753600212340ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Audio Volume High navit-0.5.0+dfsg.1/navit/xpm/gui_sound_off_32.xpm000066400000000000000000000113641264204753600215360ustar00rootroot00000000000000/* XPM */ static char *gui_sound_off______[] = { /* columns rows colors chars-per-pixel */ "32 32 160 2", " c black", ". c #030303", "X c #070707", "o c #141413", "O c #141514", "+ c #161615", "@ c #141616", "# c #161716", "$ c #171716", "% c #161818", "& c #171919", "* c #181818", "= c #191919", "- c #191A19", "; c #191B1B", ": c #1C1C1B", "> c #1C1D1C", ", c #1F201F", "< c #222321", "1 c #232424", "2 c #232525", "3 c #242626", "4 c #252727", "5 c #272726", "6 c #282827", "7 c #272B2C", "8 c #292A29", "9 c #2D2E2D", "0 c #2A2F30", "q c #2B2F30", "w c #303231", "e c #333533", "r c #343635", "t c #343636", "y c #373737", "u c #383A38", "i c #383A39", "p c #3B3C3A", "a c #393D3C", "s c #3C3E3D", "d c #3F3F3F", "f c #404040", "g c #404241", "h c #454544", "j c #444744", "k c #464645", "l c #454948", "z c #4A4B4A", "x c #4A4E4D", "c c #4E504F", "v c #50514E", "b c #4C5050", "n c #505452", "m c #555957", "M c #575A56", "N c #595B56", "B c #585B5A", "V c #5C5D59", "C c #5D5E5B", "Z c #5B5F5D", "A c #5C5C5C", "S c #5F605B", "D c #636561", "F c #606462", "G c #656564", "H c #656764", "J c #656866", "K c #686A67", "L c #676A69", "P c #6B6D68", "I c #6E6F6D", "U c #6E6E6E", "Y c #737571", "T c #747874", "R c #767A78", "E c #7A7B7A", "W c #787C7A", "Q c #7B7E7A", "! c #7D7E7D", "~ c #7E7F7C", "^ c #7D807B", "/ c #7F817A", "( c #7F807E", ") c #838683", "_ c #868686", "` c #898D89", "' c #8C8E8B", "] c #8F938F", "[ c #91938A", "{ c #90918F", "} c #949793", "| c #959793", " . c #959695", ".. c #969795", "X. c #959894", "o. c #9C9C9C", "O. c #9D9F9C", "+. c #9DA099", "@. c #A1A1A0", "#. c #A2A5A1", "$. c #A5A8A5", "%. c #A9ACA8", "&. c #ADAEAB", "*. c #AEB0AD", "=. c #B0B2AE", "-. c #B0B0B0", ";. c #B1B3B0", ":. c #B4B5B5", ">. c #B7B8B5", ",. c #BABDB6", "<. c #BBBEB7", "1. c #B9B9B8", "2. c #B9BAB9", "3. c #B9BABA", "4. c #BABABA", "5. c #BCBCBC", "6. c #BDC0B9", "7. c #BEC1BC", "8. c #BFC0BE", "9. c #BFC1BE", "0. c #C1C5BE", "q. c #C2C4BF", "w. c #C4C5C2", "e. c #C5C5C4", "r. c #C6C6C6", "t. c #C6C7C6", "y. c #C8C9C7", "u. c #CBCFC7", "i. c #CACBCA", "p. c #CDCFCD", "a. c #D0D1CF", "s. c #D1D3CE", "d. c #D1D4CD", "f. c #D1D2D1", "g. c #D2D2D1", "h. c #D3D5D1", "j. c #D5D6D5", "k. c #D9DAD8", "l. c #D9DAD9", "z. c #DCDCDA", "x. c #DDDEDD", "c. c #DFE0DD", "v. c #DFE1DE", "b. c #E0E1DF", "n. c #E1E2E0", "m. c #E1E3E0", "M. c #E4E5E3", "N. c #E5E6E3", "B. c #E5E6E4", "V. c #E5E6E5", "C. c #E6E7E5", "Z. c #E7E8E7", "A. c #E9E9E7", "S. c #EAEBEA", "D. c #ECEDEA", "F. c #EDEDEB", "G. c #EEEFED", "H. c #F0F0EF", "J. c #FAFBFA", "K. c None", /* pixels */ "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.0.6.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K./ u.6.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.H d.<.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.z 0.S.w.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.,.,.,.,.K.K.K.H 4.V G.5.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.n.M.N.b.K.v o.@.p ! x.=.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.M.,.,.b.K 4.I _ 1.} l.%.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.Y H.h.s.V.;.k E 5.r...g.#.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.D +.J.F.A.S.I k ! =.g...y.X.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.S [ Z.z.z.V.u 5 9 8 1 h 0.] J K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.V / b.w.w.x.e + = : > g :.` x K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.N P l.&.&.j.x + + = > s *.R K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.M g.| X.p.L 5 O & = u $.W K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.i.! / r.y A y O + t +.F K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K. O 4.r.r.:.& 5 s k % w ..S K.K.K.K.K.K.K.K.K.K.K.K.K.K.", " . 7 0 0 7 . = 1 f w ' B K.K.K.K.K.K.K.K.K.K.K.K.", " X ; u ) b K.K.K.K.K.K.K.K.K.K.K.K.", " . 2 Q x K.K.K.K.K.K.K.K.K.K.K.K.", " 4 T l K.K.K.K.K.K.K.K.K.K.K.K.", "K. + B a K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K. & . K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K. K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.", "K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K." }; navit-0.5.0+dfsg.1/navit/xpm/gui_stop.svg000066400000000000000000000205651264204753600202330ustar00rootroot00000000000000 image/svg+xml Stop Process December 2006 Jakub Steiner Andreas Nilsson stop halt navit-0.5.0+dfsg.1/navit/xpm/gui_strength_0.svg000066400000000000000000000056401264204753600213200ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_strength_1.svg000066400000000000000000000056621264204753600213250ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_strength_2.svg000066400000000000000000000057041264204753600213230ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_strength_3.svg000066400000000000000000000057261264204753600213300ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_strength_4.svg000066400000000000000000000057511264204753600213270ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_strength_5.svg000066400000000000000000000057721264204753600213330ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_tools.svg000066400000000000000000000352761264204753600204130ustar00rootroot00000000000000 image/svg+xml System Preferences Andreas Nilsson category system preferences settings control center Jakub Steiner navit-0.5.0+dfsg.1/navit/xpm/gui_town.svg000066400000000000000000000064231264204753600202320ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_vehicle.svg000066400000000000000000000120331264204753600206540ustar00rootroot00000000000000 image/svg+xml image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_vehicle_pedestrian.svg000066400000000000000000000051611264204753600230760ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/gui_zoom_in.svg000066400000000000000000000555751264204753600207310ustar00rootroot00000000000000 image/svg+xml Find document search find Lapo Calamandrei Jakub Steiner 2006-04-21 navit-0.5.0+dfsg.1/navit/xpm/gui_zoom_out.svg000066400000000000000000000552561264204753600211260ustar00rootroot00000000000000 image/svg+xml Find document search find Lapo Calamandrei Jakub Steiner 2006-04-21 navit-0.5.0+dfsg.1/navit/xpm/heliport.svg000066400000000000000000000031001264204753600202120ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/highway_exit.xpm000066400000000000000000000020551264204753600210720ustar00rootroot00000000000000/* XPM */ static char * highway_exit_xpm[] = { "16 16 46 1", " c None", ". c #035E9F", "+ c #77A8CB", "@ c #D4E3EE", "# c #337CB1", "$ c #CFE0EC", "% c #4688B8", "& c #8DB6D3", "* c #A5C5DC", "= c #488AB9", "- c #4588B8", "; c #B0CDE1", "> c #8EB7D4", ", c #DEEAF2", "' c #5C97C1", ") c #5592BE", "! c #7EACCE", "~ c #E6EFF5", "{ c #F5F8FB", "] c #2E79AF", "^ c #FFFFFF", "/ c #166AA6", "( c #EAF1F7", "_ c #8CB5D3", ": c #2674AC", "< c #83B0CF", "[ c #76A7CB", "} c #5894BF", "| c #FEFEFE", "1 c #1469A5", "2 c #0A63A2", "3 c #74A6CA", "4 c #EFF4F8", "5 c #3880B3", "6 c #EEF4F8", "7 c #72A5C9", "8 c #CADDEB", "9 c #ACCADF", "0 c #2272AB", "a c #3C82B4", "b c #3B81B4", "c c #045F9F", "d c #196CA7", "e c #1B6DA8", "f c #367EB2", "g c #1C6EA8", "................", "................", "................", "................", "................", "................", "+@@@#$%&*=@-@@@;", ">,').!~{])^/](_:", ">~<[.}|~1)^2.~3.", ">4;;56789)^2.~3.", "0aaa:bcdaeac.fg.", "................", "................", "................", "................", "................"}; navit-0.5.0+dfsg.1/navit/xpm/hindu.svg000066400000000000000000000255541264204753600175140ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/hospital.svg000066400000000000000000000072531264204753600202240ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/hotel.svg000066400000000000000000000124501264204753600175070ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/hunting_stand.xpm000066400000000000000000000006501264204753600212450ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 4 1", ". c None", "a c #000000", "b c #808080", "# c #c0c0c0", ".....#..........", ".....aaab#......", ".....aaaaaa.....", ".....aa..aa.....", ".....aaaaaa.....", ".....aaaaaa.....", ".....aaaaaa.....", ".....aaaaaa.....", "....aaaaaaa.....", "....aa....a.....", "...a.a....a.....", "...a.a....a.....", "..a..a....a.....", "..a..a....a.....", ".....a....a.....", "................"}; navit-0.5.0+dfsg.1/navit/xpm/information.svg000066400000000000000000000104151264204753600207200ustar00rootroot00000000000000 image/svg+xml i navit-0.5.0+dfsg.1/navit/xpm/islamic.svg000066400000000000000000000241011264204753600200110ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/jain.svg000066400000000000000000000250131264204753600173140ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/jewish.svg000066400000000000000000000234101264204753600176630ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/justice.svg000066400000000000000000000152751264204753600200520ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/level_crossing.xpm000066400000000000000000000014021264204753600214120ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 27 1", ". c None", "a c #cb0000", "# c #cc0000", "w c #cf1818", "b c #d01a1a", "y c #d85151", "d c #db5656", "x c #df7676", "c c #e07b7b", "s c #e19090", "e c #e49898", "v c #ecb8b8", "j c #ecbcbc", "p c #f0f0f0", "r c #f4f4f4", "o c #f5f5f5", "q c #f6f6f6", "l c #f7f7f7", "h c #f8f8f8", "k c #f9f9f9", "t c #faefef", "u c #fbfbfb", "f c #fcf3f3", "g c #fcfcfc", "m c #fdfdfd", "n c #fefefe", "i c #ffffff", "....#......#....", "...a#.....###...", "...a##...###....", "....#bc..d##....", "....efg.hij.....", ".....kilmno.....", "......niig......", "......gin.......", "......gin.......", ".....pniih......", ".....kiqgir.....", "....stu.hnv.....", "....#wx..ya#....", "...###...###....", "...##.....a##...", "....a......#...."}; navit-0.5.0+dfsg.1/navit/xpm/library.svg000066400000000000000000000131711264204753600200410ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/library.xpm000066400000000000000000000007321264204753600200450ustar00rootroot00000000000000/* XPM */ static char *library[] = { /* columns rows colors chars-per-pixel */ "8 16 12 1", " c black", ". c #404040", "X c #464646", "o c #808080", "O c #8F8F8F", "+ c #BCBCBC", "@ c #BFBFBF", "# c #DCDCDC", "$ c #FBFBFB", "% c #FCFCFC", "& c #FFFFFF", "* c None", /* pixels */ "*** * ", "** X&X ", "* @&&.o ", " @&@ @& ", " .. &@@ ", " && @.& ", " && &o@ ", " && O@@ ", " && @.@ ", " && #&& ", " && &&& ", " && &&. ", " && &X *", " && X **", " && ***", ". ****" }; navit-0.5.0+dfsg.1/navit/xpm/mark.svg000066400000000000000000000047431264204753600173340ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/memorial.svg000066400000000000000000002777631264204753600202250ustar00rootroot00000000000000 image/svg+xml en style="overflow:visible"> navit-0.5.0+dfsg.1/navit/xpm/memorial.xpm000066400000000000000000000015151264204753600202060ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 32 1", ". c None", "m c #625112", "f c #646464", "a c #707070", "l c #736118", "i c #957d1d", "# c #999999", "b c #9c9b95", "e c #9f9c92", "h c #a08723", "o c #a5a08b", "r c #aaa386", "A c #aba384", "z c #aca383", "g c #afa580", "D c #b0a67e", "s c #b1a77e", "u c #b2a77d", "w c #b2a77e", "k c #b3a87c", "j c #b4a97b", "t c #b5a97a", "B c #b7aa77", "n c #b8ab76", "y c #baac74", "x c #c4b269", "C c #c5b368", "v c #c6b368", "q c #d9b830", "p c #dab934", "c c #ddc04e", "d c #e2c349", ".......##.......", ".....######.....", "....#######a....", "....##bcde#f....", "....##ghij#f....", "....##klmn#f....", "....##opqr#f....", "....###st##f....", "....#######f....", "....#uvwxyzf....", "....#######f....", "....#ABCDvtf....", "....#######f....", "....#######f....", "....#######f....", "....#######f...."}; navit-0.5.0+dfsg.1/navit/xpm/menu.svg000066400000000000000000000065421264204753600173450ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/menu.xpm000066400000000000000000000227121264204753600173470ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "96 96 2 1", ". c None", "# c #808080", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "...........................................####.................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................................######................................................", "..........................######################................................................", ".........................#######################................................................", ".........................#######################................................................", ".........................#######################................................................", ".........................#######################................................................", "..........................######################................................................", "................................................######################..........................", "................................................#######################.........................", "................................................#######################.........................", "................................................#######################.........................", "................................................#######################.........................", "................................................######################..........................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", "................................................######..........................................", ".................................................####...........................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................"}; navit-0.5.0+dfsg.1/navit/xpm/military.svg000066400000000000000000000272711264204753600202350ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/mini_roundabout.svg000066400000000000000000000151661264204753600216010ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/museum.svg000066400000000000000000000146141264204753600177130ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_destination_bk.svg000066400000000000000000000103211264204753600222300ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_destination_wh.svg000066400000000000000000000105551264204753600222630ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_exit_left_bk.svg000066400000000000000000000066751264204753600217130ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_exit_left_wh.svg000066400000000000000000000067131264204753600217260ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_exit_right_bk.svg000066400000000000000000000066261264204753600220720ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_exit_right_wh.svg000066400000000000000000000066171264204753600221140ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_keep_left_bk.svg000066400000000000000000000054121264204753600216520ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_keep_left_wh.svg000066400000000000000000000054501264204753600216760ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_keep_right_bk.svg000066400000000000000000000054531264204753600220420ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_keep_right_wh.svg000066400000000000000000000054541264204753600220650ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_left_1.xpm000066400000000000000000000105361264204753600204220ustar00rootroot00000000000000/* XPM */ static char * turn_left_90_v2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " . ", " ............. . ", " ........................ ", " ................................. ", " ............................... ", " ............................ ", " .......................... ", " ........................ ", " ...................... ", " ...................... ", " ....................... ", " ........................ ", " ......................... ", " ......................... ", " .......................... ", " .......................... ", " .......................... ", " .......................... ", " ........................... ", " ....... ................. ", " ...... ................ ", " .... ................ ", " ... .............. ", " .. ............. ", " .. ............. ", " . ............ ", " ........... ", " ............ ", " ........... ", " ........... ", " .......... ", " .......... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... "}; navit-0.5.0+dfsg.1/navit/xpm/nav_left_1_32.xpm000066400000000000000000000024231264204753600207220ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ " .........................", ". ..............", ".. ...............", "... ................", ".... .................", "..... ...............", "...... .............", "....... ............", "........ ...........", "......... .........", ".......... .. .........", "........... .... ........", "............ ..... .......", "................... .......", "................... .......", ".................... .......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......", ".................... ......" }; navit-0.5.0+dfsg.1/navit/xpm/nav_left_1_bk.svg000066400000000000000000000011431264204753600210630ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_left_1_wh.svg000066400000000000000000000011431264204753600211050ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_left_2.xpm000066400000000000000000000105331264204753600204200ustar00rootroot00000000000000/* XPM */ static char * turn_left_v2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " ", " .. ", " ..... ", " ...... ", " ......... ", " ........... ", " ............. ", " ................ ", " ........................ ", " ................................. ", " ....................................... ", " ............................................. ", " ................................................. ", " ................................................... ", " .................................................. ", " ................................................ ", " .............................................. ", " ............................................ ", " ................ ....................... ", " ............. .................. ", " .......... ............... ", " ........ ............. ", " ..... ............. ", " ... ............ ", " ........... ", " .......... ", " ........... ", " .......... ", " .......... ", " .......... ", " .......... ", " ........... ", " ........... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " .......... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " ........... ", " .......... "}; navit-0.5.0+dfsg.1/navit/xpm/nav_left_2_32.xpm000066400000000000000000000024231264204753600207230ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ "............... ................", "............. ................", ".......... ................", "....... .................", "..... ...........", ".. ........", ". ......", ".. .....", "..... ....", "........ . ...", "........... ...... ..", ".............. ........ ..", "......................... ..", "......................... .", "......................... .", "......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", ".......................... .", "......................... .", "......................... .", "......................... .", "......................... .", ".......................... ." }; navit-0.5.0+dfsg.1/navit/xpm/nav_left_2_bk.svg000066400000000000000000000011431264204753600210640ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_left_2_wh.svg000066400000000000000000000011431264204753600211060ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_left_3_bk.svg000066400000000000000000000011451264204753600210670ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_left_3_wh.svg000066400000000000000000000011451264204753600211110ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_merge_left_bk.svg000066400000000000000000000066541264204753600220360ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_merge_left_wh.svg000066400000000000000000000066451264204753600220600ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_merge_right_bk.svg000066400000000000000000000066641264204753600222220ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_merge_right_wh.svg000066400000000000000000000066651264204753600222450ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/nav_right_1.xpm000066400000000000000000000105371264204753600206060ustar00rootroot00000000000000/* XPM */ static char * turn_right_90_v2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " .. ", " ............... ", " ......................... ", " ................................. ", " ............................... ", " ............................ ", " .......................... ", " ........................ ", " ...................... ", " ....................... ", " ....................... ", " ........................ ", " ......................... ", " ......................... ", " .......................... ", " .......................... ", " .......................... ", " ........................... ", " ........................... ", " ................. ....... ", " ................ ...... ", " ............... ..... ", " ............... ... ", " ............. ... ", " ............. .. ", " ............ . ", " ........... ", " ............ ", " ........... ", " ........... ", " .......... ", " .......... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", ".......... ", ".......... ", ".......... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... ", "........... "}; navit-0.5.0+dfsg.1/navit/xpm/nav_right_1_32.xpm000066400000000000000000000024231264204753600211050ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ ".................. .......", "........ ........", "........ .........", ".......... ..........", ".......... ...........", "........ ............", "....... .............", "..... ..............", ".... ...............", "... ................", ".. .. .................", ". .... ..................", ". ..... ...................", ". .........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ...........................", " ...........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " ..........................", " .........................." }; navit-0.5.0+dfsg.1/navit/xpm/nav_right_1_bk.svg000066400000000000000000000011421264204753600212450ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_right_1_wh.svg000066400000000000000000000011421264204753600212670ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_right_2.xpm000066400000000000000000000105331264204753600206030ustar00rootroot00000000000000/* XPM */ static char * turn_rightv2_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " . ", " .. ", " ..... ", " ...... ", " ......... ", " ............ ", " ............. ", " ................ ", " ........................ ", " ................................. ", " ....................................... ", " ............................................. ", " .................................................. ", " ................................................... ", " .................................................. ", " ................................................ ", " .............................................. ", " ............................................ ", " ....................... ............... ", " .................. ............ ", " ............... ......... ", " ............. ........ ", " ............. ..... ", " ........... ... ", " ........... ", " ........... ", " ........... ", " .......... ", " .......... ", " .......... ", "........... ", "........... ", "........... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... ", ".......... "}; navit-0.5.0+dfsg.1/navit/xpm/nav_right_2_32.xpm000066400000000000000000000024231264204753600211060ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ "............... ................", "............... ..............", "............... ...........", "................ ........", ".......... ......", "....... ...", "..... .", ".... ...", "... ......", ".. . .........", ". ...... ............", ". ........ ...............", ". ..........................", " ..........................", " ..........................", " ..........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ...........................", " ..........................." }; navit-0.5.0+dfsg.1/navit/xpm/nav_right_2_bk.svg000066400000000000000000000011421264204753600212460ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_right_2_wh.svg000066400000000000000000000011421264204753600212700ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_right_3_bk.svg000066400000000000000000000011451264204753600212520ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_right_3_wh.svg000066400000000000000000000011451264204753600212740ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l1_bk.svg000066400000000000000000000015141264204753600224710ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l1_wh.svg000066400000000000000000000015141264204753600225130ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l2_bk.svg000066400000000000000000000014701264204753600224730ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l2_wh.svg000066400000000000000000000014701264204753600225150ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l3_bk.svg000066400000000000000000000015141264204753600224730ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l3_wh.svg000066400000000000000000000015141264204753600225150ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l4_bk.svg000066400000000000000000000014661264204753600225020ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l4_wh.svg000066400000000000000000000014661264204753600225240ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l5_bk.svg000066400000000000000000000015131264204753600224740ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l5_wh.svg000066400000000000000000000015131264204753600225160ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l6_bk.svg000066400000000000000000000014671264204753600225050ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l6_wh.svg000066400000000000000000000014671264204753600225270ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l7_bk.svg000066400000000000000000000015141264204753600224770ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l7_wh.svg000066400000000000000000000015141264204753600225210ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l8_bk.svg000066400000000000000000000014701264204753600225010ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_l8_wh.svg000066400000000000000000000014701264204753600225230ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r1_bk.svg000066400000000000000000000015141264204753600224770ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r1_wh.svg000066400000000000000000000015141264204753600225210ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r2_bk.svg000066400000000000000000000014671264204753600225070ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r2_wh.svg000066400000000000000000000014671264204753600225310ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r3_bk.svg000066400000000000000000000015131264204753600225000ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r3_wh.svg000066400000000000000000000015131264204753600225220ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r4_bk.svg000066400000000000000000000014661264204753600225100ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r4_wh.svg000066400000000000000000000014661264204753600225320ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r5_bk.svg000066400000000000000000000015141264204753600225030ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r5_wh.svg000066400000000000000000000015141264204753600225250ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r6_bk.svg000066400000000000000000000014701264204753600225050ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r6_wh.svg000066400000000000000000000014701264204753600225270ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r7_bk.svg000066400000000000000000000015141264204753600225050ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r7_wh.svg000066400000000000000000000015141264204753600225270ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r8_bk.svg000066400000000000000000000014701264204753600225070ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_roundabout_r8_wh.svg000066400000000000000000000014701264204753600225310ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_straight.xpm000066400000000000000000000105341264204753600210730ustar00rootroot00000000000000/* XPM */ static char * turn_straight_sv_xpm[] = { "64 64 2 1", " c None", ". c #000000", " ", " . ", " . ", " .. ", " ... ", " .... ", " ..... ", " ..... ", " ...... ", " ....... ", " ....... ", " ........ ", " ......... ", " ......... ", " ........... ", " ........... ", " ............ ", " ............. ", " ............. ", " .............. ", " ............... ", " ............... ", " ................ ", " ................. ", " .................. ", " ................... ", " ................... ", " .................... ", " ..................... ", " ..................... ", " ...................... ", " ....................... ", " ....................... ", " ......................... ", " ......................... ", " .......................... ", " ........................... ", " .... ............ .... ", " .. ............ ... ", " . ............ . ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ............ ", " ........... "}; navit-0.5.0+dfsg.1/navit/xpm/nav_straight_32.xpm000066400000000000000000000024231264204753600213750ustar00rootroot00000000000000/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ " c #ffffff", ". c None", /* pixels */ "................................", "............... ................", ".............. ................", ".............. ...............", ".............. ...............", "............. ...............", "............. ..............", "............ ..............", "............ .............", "............ .............", "........... .............", "........... ............", "........... ............", ".......... ............", ".......... ...........", ".......... ...........", "......... ...........", "......... ..........", "........ ..........", "........ ... .. .........", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............", "............ .............." }; navit-0.5.0+dfsg.1/navit/xpm/nav_straight_bk.svg000066400000000000000000000011411264204753600215340ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_straight_wh.svg000066400000000000000000000011411264204753600215560ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_svg.html000066400000000000000000000042271264204753600202070ustar00rootroot00000000000000 Overview of Navit navigation icons

Overview of Navit navigation icons

navit-0.5.0+dfsg.1/navit/xpm/nav_turnaround_left_bk.svg000066400000000000000000000011511264204753600231230ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_turnaround_left_wh.svg000066400000000000000000000011511264204753600231450ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_turnaround_right_bk.svg000066400000000000000000000011511264204753600233060ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/nav_turnaround_right_wh.svg000066400000000000000000000011511264204753600233300ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/navit.svg000066400000000000000000000355631264204753600175270ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/navit_svg2png000077500000000000000000000030011264204753600203600ustar00rootroot00000000000000#!/bin/sh svgtopng() { case $svgtopng in *ksvgtopng|*ksvgtopng4) $svgtopng $* ;; *rsvg-convert) $svgtopng --width=$1 --height=$2 --output $4 $3 ;; *inkscape) $svgtopng --without-gui --export-width=$1 --export-height=$2 --export-png=$BUILDDIR/$4 $3 ;; *convert) $svgtopng -alpha on -background none $3 -resize $1x$2 $4 ;; esac } if [ "$OSTYPE" != "cygwin" -a "$OSTYPE" != "msys" ]; then ulimit -t 10 fi svgtopng=$1 png=$2 w=$3 h=$4 case "$png" in *_[1-9]*_[1-9]*.png) svg=${png%_*_*.png}; h=${png##*_} w=${png%_$h} h=${h%.png} w=${w##*_} ;; *) svg=${png%.png} ;; esac if [ ! -f $svg.svg -a ! -f $svg.svgz ] then svg="$SRCDIR/$svg" fi if [ -f $png -a ! -f $svg.svg ]; then # width and height seems to be defined as part of the file name touch $png else # use width and height from the svg image if [ -f $svg.svg ] then if [ -z "$w" ] then w=$(grep 'width="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*width="//' -e 's/[pxt]*".*//') fi if [ -z "$h" ] then h=$(grep 'height="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*height="//' -e 's/[pxt]*".*//') fi svgtopng $w $h $svg.svg $png elif [ -f $svg.svgz ] then gzip -dc <$svg.svgz >$svg.svg if [ -z "$w" ] then w=$(grep 'width="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*width="//' -e 's/[pxt]*".*//') fi if [ -z "$h" ] then h=$(grep 'height="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*height="//' -e 's/[pxt]*".*//') fi svgtopng $w $h $svg.svg $png rm -f $svg.svg fi fi exit 0 navit-0.5.0+dfsg.1/navit/xpm/osd_minus.png000066400000000000000000000005111264204753600203540ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME@tEXtCommentCreated with The GIMPd%nIDATxٱ 0 Wə.p^oI*+d:|kWb3.d}xjQp\ V՘$I}8orMuOZKwIENDB`navit-0.5.0+dfsg.1/navit/xpm/osd_plus.png000066400000000000000000000005411264204753600202070ustar00rootroot00000000000000PNG  IHDR@@iqbKGDC pHYs  tIME5k]1tEXtCommentCreated with The GIMPd%nIDATx 0 PNn 8Ъ$o8r9kHLPSӷe$(};of0 X%\[.{O-}WU 8s?NsUUX>B*)QpIENDB`navit-0.5.0+dfsg.1/navit/xpm/pagan.svg000066400000000000000000000121111264204753600174540ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/parking.svg000066400000000000000000000057231264204753600200340ustar00rootroot00000000000000 image/svg+xml P navit-0.5.0+dfsg.1/navit/xpm/pastafarian.svg000066400000000000000000000247261264204753600206760ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/peak.svg000066400000000000000000000113221264204753600173110ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/pharmacy.svg000066400000000000000000000067621264204753600202110ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/picnic.svg000066400000000000000000000123551264204753600176450ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/picnic.xpm000066400000000000000000000012051264204753600176420ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 15 20 1", ". c None", "d c #020202", "e c #080808", "q c #0c0c0c", "n c #161616", "i c #212121", "o c #282828", "k c #2a2a2a", "m c #2d2d2d", "f c #393939", "# c #424242", "p c #474747", "g c #4c4c4c", "b c #555555", "l c #686868", "j c #6a6a6a", "c c #757575", "h c #808080", "r c #838383", "a c #9a9a9a", "................", "................", "..#abbbbbbbbb#..", "...cdddddddde...", ".....fdggddh....", ".....id..dd.....", "....jdk..ldi....", "..mmednkmndemm..", ".odddddeddddddd.", "...pd#....#dd...", "...dq#.....mdl..", "..hdf......fdb..", "..rbc.......bb..", "................", "................"}; navit-0.5.0+dfsg.1/navit/xpm/police.svg000066400000000000000000000104731264204753600176520ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/post.svg000066400000000000000000000063411264204753600173630ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/potable_water.xpm000066400000000000000000000010601264204753600212240ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 13 1", ". c None", "# c #000000", "e c #0000a5", "h c #0000b2", "c c #0000cc", "d c #0000cd", "g c #0000d3", "b c #0000db", "k c #0000e8", "f c #0000e9", "j c #0000eb", "a c #0000ec", "i c #0000ff", "......####......", "........#.......", "...########.....", "...##########...", "...###########..", "............##..", "............##..", ".....aaab...##..", "....caaad...##..", "....eaaaa...##..", ".....faag.......", ".....gaah....i..", ".....gaa.....i..", "......jk........", "............ii..", "................"}; navit-0.5.0+dfsg.1/navit/xpm/public_office.xpm000066400000000000000000000010771264204753600211750ustar00rootroot00000000000000/* XPM */ static char * public_office_xpm[] = { "16 16 13 1", " c None", ". c #888888", "+ c #FFFFFF", "@ c #D5D5D5", "# c #5A5A5A", "$ c #E4E4E4", "% c #676767", "& c #000000", "* c #737373", "= c #C4C4C4", "- c #555555", "; c #C9C9C9", "> c #C1C1C1", " . ", " .+. ", " .+++. ", " .+@#$+. ", " .+%&*+. ", " .+=-;+....", ". . . .++++++++.", "..+.. .+>>>+>>+.", ".+++. .+>>>+>>+.", ".+>+. .++++++++.", ".+>+...+>>>+>>+.", ".++++++++++++++.", ".+>>>>+>>>>+>>+.", ".+>>>>+>>>>+>>+.", ".+++++++++++>>+.", "................"}; navit-0.5.0+dfsg.1/navit/xpm/rail_station.svg000066400000000000000000000070771264204753600210750ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/restaurant.svg000066400000000000000000000140441264204753600205650ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/restroom.xpm000066400000000000000000000046501264204753600202560ustar00rootroot00000000000000/* XPM */ static char * restroom_xpm[] = { "16 16 115 2", " c None", ". c #262CA6", "+ c #2C32A8", "@ c #6D71C2", "# c #3A3FAE", "$ c #2A30A8", "% c #8689CB", "& c #484DB4", "* c #3C42AF", "= c #9699D4", "- c #FEFEFE", "; c #CACBE8", "> c #2E34A9", ", c #E0E0F1", "' c #4E53B6", ") c #FCFCFD", "! c #EDEEF6", "~ c #2D33A9", "{ c #8286CB", "] c #FCFCFC", "^ c #ACAFDC", "/ c #484DB3", "( c #F6F7FA", "_ c #E4E5F3", ": c #2C31A8", "< c #484EB4", "[ c #A0A2D7", "} c #B4B6E0", "| c #A3A6D8", "1 c #4F54B6", "2 c #6065BD", "3 c #A8ABDB", "4 c #BBBDE2", "5 c #B2B4DF", "6 c #A1A4D8", "7 c #272DA6", "8 c #D0D1EA", "9 c #FFFEFE", "0 c #FFFFFF", "a c #FFFFFE", "b c #DADBEE", "c c #E1E1F1", "d c #BEBFE3", "e c #3D42AF", "f c #DFE0F0", "g c #E8E8F4", "h c #EEEFF7", "i c #CED0E9", "j c #474CB3", "k c #262CA5", "l c #E9EAF6", "m c #E7E8F4", "n c #E7E7F4", "o c #C6C6E6", "p c #7D80C9", "q c #B8B9E0", "r c #FEFEFD", "s c #AEB0DD", "t c #898CCE", "u c #AAADDC", "v c #A9ACDB", "w c #C8C9E8", "x c #BDBFE2", "y c #B6B9E0", "z c #B0B2DE", "A c #CBCDE8", "B c #AAACDB", "C c #CBCCE9", "D c #8184CA", "E c #C8C9E7", "F c #CED0EA", "G c #7A7EC8", "H c #E3E4F2", "I c #A8AADA", "J c #A7AADA", "K c #C5C7E6", "L c #343AAC", "M c #F9F9FB", "N c #3B41AE", "O c #3439AB", "P c #9B9ED5", "Q c #DDDEF0", "R c #777BC6", "S c #3036AA", "T c #4A50B4", "U c #A7AADB", "V c #DADBEF", "W c #E6E7F4", "X c #A9ACDC", "Y c #5156B7", "Z c #2F34AA", "` c #CCCEEA", " . c #F6F6FA", ".. c #767AC6", "+. c #AAADDB", "@. c #A5A8DA", "#. c #C0C2E4", "$. c #E0E1F0", "%. c #AAAEDC", "&. c #A6A9DA", "*. c #C0C3E5", "=. c #AAAEDB", "-. c #A7A9DA", ";. c #A0A3D6", ">. c #9598D3", ",. c #B8BAE0", "'. c #9498D2", "). c #C9CAE8", "!. c #F2F3F8", "~. c #7276C4", "{. c #282EA6", "]. c #2A2FA7", "^. c #292FA7", "/. c #7074C3", "(. c #4248B1", ". . + @ # . . $ % . . . & * . . ", ". . = - ; . . > , . . ' ) ! ~ . ", ". . { ] ^ . . > , . . / ( _ : . ", ". < [ } | 1 . > , . 2 3 4 5 6 ' ", "7 8 9 0 a b . > , . c 0 0 0 0 d ", "e f g 0 h i j > , k l m 0 a n o ", "p q - 0 r s t > , . g u 0 a v w ", "x y 0 0 0 z A > , . g u 0 a B C ", "D E 0 0 0 F G > , k H I 0 a J K ", "L M 0 0 0 ] N > , . O P Q M R S ", "T U Q V W X Y Z , . . P ` .... ", ". . +.@.#.. . > $.. . P ` .... ", ". . %.&.*.. . > , . . P ` .... ", ". . =.-.*.. . > , . . P ` .... ", ". . ;.>.,.. . > , . . '.).!.~.. ", ". . {.. ].. . ^./.. . S * (.+ . "}; navit-0.5.0+dfsg.1/navit/xpm/ruins.svg000066400000000000000000001346121264204753600175410ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/school.svg000066400000000000000000000112721264204753600176640ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/shelter.svg000066400000000000000000000217621264204753600200500ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/shelter.xpm000066400000000000000000000013061264204753600200450ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 23 1", ". c None", "g c #000000", "r c #010101", "f c #080808", "o c #0a0a0a", "p c #101010", "n c #111111", "j c #121212", "t c #202020", "u c #2e2e2e", "b c #303030", "s c #313131", "k c #333333", "e c #353535", "a c #373737", "q c #414141", "c c #444444", "m c #505050", "i c #525252", "h c #6c6c6c", "# c #6e6e6e", "l c #727272", "d c #7d7d7d", "................", "................", "................", "................", "................", "......#abc......", "....defggfeh....", "...ijggggggfkl..", ".mnggopqqpprggs.", ".tuagm.....faut.", "...mgm.....fm...", "...mgm.....fm...", "...mgm.....fm...", "...mgm.....fm...", "...mgm.....fm...", "................"}; navit-0.5.0+dfsg.1/navit/xpm/shinto.svg000066400000000000000000000255101264204753600177010ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/shop_apparel.svg000066400000000000000000000416411264204753600210550ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/shop_computer.svg000066400000000000000000000244451264204753600212720ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/shop_department.svg000066400000000000000000000525761264204753600216050ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/shopping.svg000066400000000000000000000157111264204753600202260ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/sikh.svg000066400000000000000000000345531264204753600173420ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/skiing.svg000066400000000000000000000260121264204753600176570ustar00rootroot00000000000000 image/svg+xml Hotel is near a ski area Hotel is near a ski area navit-0.5.0+dfsg.1/navit/xpm/sport.svg000066400000000000000000000076761264204753600175610ustar00rootroot00000000000000 image/svg+xml en image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/sport.xpm000066400000000000000000000022651264204753600175530ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "16 16 56 1", ". c None", "v c #000000", "V c #0c0c0c", "o c #121212", "Y c #131313", "C c #141414", "u c #191919", "F c #1e1e1e", "D c #232323", "c c #292929", "T c #2b2b2b", "1 c #2d2d2d", "g c #2e2e2e", "b c #2f2f2f", "K c #303030", "y c #343434", "d c #363636", "a c #393939", "B c #3b3b3b", "L c #3d3d3d", "k c #404040", "m c #414141", "f c #444444", "p c #454545", "U c #474747", "t c #494949", "n c #4d4d4d", "J c #4e4e4e", "j c #525252", "e c #575757", "# c #5a5a5a", "E c #5b5b5b", "w c #5d5d5d", "l c #676767", "x c #6d6d6d", "z c #6f6f6f", "r c #757575", "O c #787878", "Q c #7f7f7f", "G c #808080", "N c #878787", "R c #888888", "Z c #8a8a8a", "X c #8c8c8c", "W c #a7a7a7", "H c #adadad", "0 c #b3b3b3", "h c #b6b6b6", "I c #c5c5c5", "P c #c8c8c8", "S c #d6d6d6", "M c #dadada", "A c #dfdfdf", "i c #e8e8e8", "s c #fcfcfc", "q c #fefefe", "................", "................", "................", ".....#abcde.....", "....fghijklm....", "...nopqqrsqlt...", "...uvwxyvzABC...", "...DEqqFvvGxv...", "...HGqIJKLqMB...", "...NkBOqqOPQR...", "...BvvySspvTU...", "...#uVWhXvvY....", "....#LZ0hc1.....", "................", "................", "................"}; navit-0.5.0+dfsg.1/navit/xpm/stadium.svg000066400000000000000000000174221264204753600200460ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_calculating_bk.svg000066400000000000000000000073671264204753600227540ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_calculating_wh.svg000066400000000000000000000074001264204753600227620ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_no_destination_bk.svg000066400000000000000000000102301264204753600234620ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_no_destination_wh.svg000066400000000000000000000102451264204753600235120ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_no_route_bk.svg000066400000000000000000000036751264204753600223160ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_no_route_wh.svg000066400000000000000000000037401264204753600223310ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_position_wait_bk.svg000066400000000000000000000044651264204753600233520ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_position_wait_wh.svg000066400000000000000000000045171264204753600233720ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_recalculating_bk.svg000066400000000000000000000074001264204753600232670ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_recalculating_wh.svg000066400000000000000000000074101264204753600233120ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_routing_bk.svg000066400000000000000000000035601264204753600221440ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/status_routing_wh.svg000066400000000000000000000036121264204753600221640ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/swimming.svg000066400000000000000000000301671264204753600202330ustar00rootroot00000000000000 image/svg+xml Hotel has pool Hotel has pool navit-0.5.0+dfsg.1/navit/xpm/taoist.svg000066400000000000000000000162741264204753600177070ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/taxi.svg000066400000000000000000000125741264204753600173500ustar00rootroot00000000000000 image/svg+xml TA X I navit-0.5.0+dfsg.1/navit/xpm/tec_common.svg000066400000000000000000002640111264204753600205210ustar00rootroot00000000000000 image/svg+xml traffic light by http://commons.wikimedia.org/wiki/User:Manuel_Strehl camera by KDE e.V. navit-0.5.0+dfsg.1/navit/xpm/telephone.svg000066400000000000000000000077211264204753600203640ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/theater.svg000066400000000000000000000236521264204753600200360ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/theater.xpm000066400000000000000000000022141264204753600200320ustar00rootroot00000000000000/* XPM */ static char * theater_xpm[] = { "16 15 54 1", " c None", ". c #FFFFFF", "+ c #CFCFCF", "@ c #808080", "# c #D8D8D8", "$ c #F7F7F7", "% c #F5F5F5", "& c #DEDEDE", "* c #A2A2A2", "= c #393939", "- c #606060", "; c #9D9D9D", "> c #929292", ", c #E5E5E5", "' c #4F4F4F", ") c #5A5A5A", "! c #474747", "~ c #3F3F3F", "{ c #8B8B8B", "] c #979797", "^ c #767676", "/ c #E9E9E9", "( c #000000", "_ c #575757", ": c #494949", "< c #232323", "[ c #050505", "} c #2E2E2E", "| c #333333", "1 c #EBEBEB", "2 c #7D7D7D", "3 c #BABABA", "4 c #BEBEBE", "5 c #666666", "6 c #1D1D1D", "7 c #AAAAAA", "8 c #2B2B2B", "9 c #505050", "0 c #B7B7B7", "a c #272727", "b c #121212", "c c #161616", "d c #D6D6D6", "e c #9A9A9A", "f c #C3C3C3", "g c #6D6D6D", "h c #0A0A0A", "i c #343434", "j c #454545", "k c #6B6B6B", "l c #EEEEEE", "m c #787878", "n c #0C0C0C", "o c #CACACA", " ... ..++.", " .. .+@#$%&*=-.", ".;>. .,'')'!!)~%", ".{]^$./!(_(=@==%", ".{.*---:<][}}_|1", ".23*4.,567!83#94", "&2/>&/0)a^:@bc'3", "def3@#g='(}](h9/", ".g..),.$'}c]@ij%", ".k70_l*1<:@>7mk.", ".@7}fmk9{:2n8~+.", ".#g8(|_o.m:9=@. ", " .-7k_7. .*>d$ ", " .+9^)$ ... ", " .%/% "}; navit-0.5.0+dfsg.1/navit/xpm/toggle_fullscreen.svg000066400000000000000000000054001264204753600220740ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/toggle_fullscreen.xpm000066400000000000000000000227121264204753600221060ustar00rootroot00000000000000/* XPM */ static char *dummy[]={ "96 96 2 1", ". c None", "# c #808080", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "........................######################..................................................", "........................#######################.................................................", "........................#######################.................................................", "........................#######################.................................................", "........................#######################.................................................", "........................######################..................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", "........................######..................................................................", ".........................####...................................................................", "................................................................................................", "................................................................................................", "...................................................................####.........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................................######........................", "..................................................######################........................", ".................................................#######################........................", ".................................................#######################........................", ".................................................#######################........................", ".................................................#######################........................", "..................................................######################........................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................", "................................................................................................"}; navit-0.5.0+dfsg.1/navit/xpm/toilets.svg000066400000000000000000000137441264204753600200660ustar00rootroot00000000000000 image/svg+xml 26.06.2008 Jakub Klawiter toilet sign man woman navit-0.5.0+dfsg.1/navit/xpm/tower.xpm000066400000000000000000000010131264204753600175320ustar00rootroot00000000000000/* XPM */ static char *tower[] = { /* columns rows colors chars-per-pixel */ "10 16 13 1", " c black", ". c #131313", "X c #141414", "o c #1B1B1B", "O c #1E1E1E", "+ c #252525", "@ c #262626", "# c #363636", "$ c #404040", "% c #797979", "& c #AEAEAE", "* c #D7D7D7", "= c #FFFFFF", /* pixels */ "==========", "====%%====", "===& &===", "===&oo&===", "===* *===", "==== ====", "==== ====", "====##====", "====$#====", "====o@====", "====OO====", "====.X====", "====@@====", "====..====", "==== ====", "==== ====" }; navit-0.5.0+dfsg.1/navit/xpm/townhall.svg000066400000000000000000000240241264204753600202240ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/townhall.xpm000066400000000000000000000033071264204753600202320ustar00rootroot00000000000000/* XPM */ static char * townhall_xpm[] = { "16 18 88 1", " c None", ". c #BF0000", "+ c #CE0000", "@ c #A80000", "# c #C20000", "$ c #5C652F", "% c #5D6630", "& c #808C42", "* c #818D42", "= c #5B642F", "- c #5D662F", "; c #808C41", "> c #5B632E", ", c #111208", "' c #2B2F16", ") c #535A2A", "! c #535B2B", "~ c #535C2A", "{ c #545C2B", "] c #555C2B", "^ c #555D2B", "/ c #535B2A", "( c #292D14", "_ c #454C23", ": c #565F2C", "< c #5D6730", "[ c #5A632E", "} c #424822", "| c #363B1C", "1 c #414621", "2 c #4A5026", "3 c #484F25", "4 c #454B23", "5 c #495026", "6 c #484E25", "7 c #444922", "8 c #3A401D", "9 c #32361A", "0 c #484D2A", "a c #888888", "b c #66685F", "c c #4E542D", "d c #72736F", "e c #6C6E66", "f c #51582E", "g c #6E6E68", "h c #80807F", "i c #4C512B", "j c #272B14", "k c #6B743E", "l c #9E9E9E", "m c #7D7E76", "n c #75803C", "o c #8F8F8F", "p c #7E7E7A", "q c #7F8B41", "r c #81827E", "s c #6A743C", "t c #75716C", "u c #68665D", "v c #7C5A20", "w c #6E531E", "x c #33371E", "y c #505730", "z c #9A9A9A", "A c #75766E", "B c #58602D", "C c #78571E", "D c #684F1D", "E c #5C6430", "F c #7B7C78", "G c #989898", "H c #50572E", "I c #4B5227", "J c #5D6531", "K c #67695B", "L c #5A5D45", "M c #59602E", "N c #564A1F", "O c #554B20", "P c #5D6430", "Q c #5F624E", "R c #626454", "S c #5C6431", "T c #444A23", "U c #373C1C", "V c #434922", "W c #393E1D", " .+ ", " @# ", " ", " $% ", " $&**&= ", " -&******;> ", ",')!~~{{{{]^^/( ", "_:<<<<<<<<<<<<[}", " |123456}3578 ", " 90abcdefghij ", " klmnopqrls ", " klmnopqrls ", " klmnopqrls ", " klmntuqrls ", " klmnvwqrls ", " xyzABCDEFGH ", " IJKLMNOPQRST ", "UV_4444444444_VW"}; navit-0.5.0+dfsg.1/navit/xpm/traffic_signals.svg000066400000000000000000000131761264204753600215400ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/trailerpark.xpm000066400000000000000000000033221264204753600207170ustar00rootroot00000000000000/* XPM */ static char * trailerpark_xpm[] = { "16 16 91 1", " c #325692", ". c #335692", "+ c #335592", "@ c #325592", "# c #325591", "$ c #335690", "% c #335593", "& c #8195B7", "* c #BCC7D9", "= c #C4CEDE", "- c #CCD5E3", "; c #D3DAE3", "> c #D8DEE8", ", c #DDE3EB", "' c #DFE5EC", ") c #D9E1E9", "! c #D5DCE6", "~ c #D2D8E2", "{ c #CAD3E0", "] c #C1CCDB", "^ c #8D9FBD", "/ c #345590", "( c #F3F5F8", "_ c #FEFEFD", ": c #FDFEFD", "< c #FDFFFD", "[ c #FFFFFF", "} c #FEFFFE", "| c #FCFFFC", "1 c #FDFEFE", "2 c #DFE5EB", "3 c #F6F9FA", "4 c #C0C9DA", "5 c #3B5B94", "6 c #3A5B93", "7 c #B3C0D5", "8 c #FCFDFE", "9 c #3D5C92", "0 c #C9D1DE", "a c #335591", "b c #BCC8DA", "c c #B1BED4", "d c #FBFDFE", "e c #355791", "f c #C8D0DD", "g c #DFE4EB", "h c #CED6E1", "i c #6A83AC", "j c #6B83AC", "k c #C4CFDF", "l c #FFFFFE", "m c #FCFDFD", "n c #6C84AC", "o c #6A83AD", "p c #D6DCE4", "q c #FFFEFE", "r c #E0E6ED", "s c #99AAC5", "t c #D1DAE4", "u c #FEFEFE", "v c #355793", "w c #37588E", "x c #F6F8FA", "y c #F4F7F8", "z c #869AB9", "A c #E3EBF0", "B c #95A7C1", "C c #E0E5ED", "D c #DEE4EB", "E c #788FB7", "F c #A9BAD2", "G c #ADBBD1", "H c #91A4C2", "I c #C7D1DE", "J c #3D5F94", "K c #D0D7E2", "L c #7C92B6", "M c #8FA1C1", "N c #5C79A6", "O c #92A2C2", "P c #A6B5CB", "Q c #B7C2D4", "R c #C3CCDB", "S c #325693", "T c #3E5E98", "U c #546FA1", "V c #395994", "W c #7087B1", "X c #3F5F99", "Y c #345593", "Z c #345592", " . ++@#$%+++ ", " .&*=-;>,')!~{]^", " /(_:<:[}|<__:12", " $34567[89666502", " a3b+.c[de+.++fg", " a3hijklmniiiopg", " a3[[[}[[[[[[lqg", " a3[[[[l[l[[[[lg", " a3[[[[rstu[[[lg", "vwxuuuyzABCuuuuD", "EFGGGGHIJKLGGGGM", "NO PQR% S", "TU VWX S", " Y Z % S", " S", " ++++++++++++++."}; navit-0.5.0+dfsg.1/navit/xpm/unknown.svg000066400000000000000000000074371264204753600201040ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/viewpoint.svg000066400000000000000000000016641264204753600204250ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/wifi.svg000066400000000000000000000110261264204753600173300ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/worship.svg000066400000000000000000000171451264204753600200750ustar00rootroot00000000000000 image/svg+xml en navit-0.5.0+dfsg.1/navit/xpm/zipcode.svg000066400000000000000000000075641264204753600200430ustar00rootroot00000000000000 image/svg+xml ZIP navit-0.5.0+dfsg.1/navit/xpm/zoo.svg000066400000000000000000000022631264204753600172040ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xpm/zoom_in.svg000066400000000000000000000066501264204753600200530ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xpm/zoom_out.svg000066400000000000000000000072001264204753600202440ustar00rootroot00000000000000 image/svg+xml navit-0.5.0+dfsg.1/navit/xslt/000077500000000000000000000000001264204753600160375ustar00rootroot00000000000000navit-0.5.0+dfsg.1/navit/xslt/android.xslt000066400000000000000000000142001264204753600203700ustar00rootroot00000000000000 32 86400 1 android: 1 android , 1 -2 -1 navit-0.5.0+dfsg.1/navit/xslt/android_all_densities.xslt000066400000000000000000002101261264204753600232740ustar00rootroot00000000000000 1 1 32 android: 1 android navit-0.5.0+dfsg.1/navit/xslt/android_hdpi.xslt000066400000000000000000000020131264204753600213730ustar00rootroot00000000000000 1.33 1.5 2 470 32 32 64 10 0 navit-0.5.0+dfsg.1/navit/xslt/android_ldpi.xslt000066400000000000000000000020131264204753600213770ustar00rootroot00000000000000 1.33 0.7 2 250 32 48 64 2 -1 navit-0.5.0+dfsg.1/navit/xslt/android_mdpi.xslt000066400000000000000000000020101264204753600213750ustar00rootroot00000000000000 1.33 1 2 200 32 32 64 3 0 navit-0.5.0+dfsg.1/navit/xslt/binding_dbus.xslt000066400000000000000000000005751264204753600214110ustar00rootroot00000000000000 yes navit-0.5.0+dfsg.1/navit/xslt/cursor_scale.xslt000066400000000000000000000042451264204753600214440ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/default_plugins.xslt000066400000000000000000000022541264204753600221430ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/gui_gtk.xslt000066400000000000000000000017051264204753600204070ustar00rootroot00000000000000 no yes navit-0.5.0+dfsg.1/navit/xslt/iphone.xslt000066400000000000000000000032431264204753600202370ustar00rootroot00000000000000 86400 iphone: 1 iphone navit-0.5.0+dfsg.1/navit/xslt/map_sdcard_navitmap_bin.xslt000066400000000000000000000004451264204753600236020ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/map_secondary_sdcard_navitmap_bin.xslt000066400000000000000000000006661264204753600256560ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/navit_drag_bitmap.xslt000066400000000000000000000005611264204753600224270ustar00rootroot00000000000000 yes navit-0.5.0+dfsg.1/navit/xslt/null.xslt000066400000000000000000000005631264204753600177310ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/openmoko.xslt000066400000000000000000000007141264204753600206040ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/osd_android_minimum.xslt000066400000000000000000000052151264204753600227760ustar00rootroot00000000000000 1 1 navit-0.5.0+dfsg.1/navit/xslt/osd_enable_zoom.xslt000066400000000000000000000006241264204753600221140ustar00rootroot00000000000000 yes navit-0.5.0+dfsg.1/navit/xslt/osd_minimum.xslt000066400000000000000000000054421264204753600213000ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/pedestrian.xslt000066400000000000000000000024141264204753600211120ustar00rootroot00000000000000 1 navit-0.5.0+dfsg.1/navit/xslt/pedestrian_button.xslt000066400000000000000000000014601264204753600225050ustar00rootroot00000000000000 Pedestrian ]]> navit-0.5.0+dfsg.1/navit/xslt/pedestrian_plugin.xslt000066400000000000000000000010201264204753600224600ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/plugin_menu.xslt000066400000000000000000000014151264204753600212760ustar00rootroot00000000000000 Plugins Plugins ]]> navit-0.5.0+dfsg.1/navit/xslt/samplemap.xslt000066400000000000000000000005351264204753600207350ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/xslt/speech_espeak.xslt000066400000000000000000000005721264204753600215560ustar00rootroot00000000000000 espeak navit-0.5.0+dfsg.1/navit/xslt/vehicle_null.xslt000066400000000000000000000006171264204753600214300ustar00rootroot00000000000000 null: navit-0.5.0+dfsg.1/navit/xslt/windows.xslt000066400000000000000000000011741264204753600204500ustar00rootroot00000000000000 navit-0.5.0+dfsg.1/navit/zipfile.h000066400000000000000000000140721264204753600166640ustar00rootroot00000000000000/** * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __ZIPFILE_H__ #define __ZIPFILE_H__ #ifdef HAVE_PRAGMA_PACK #pragma pack(push) #pragma pack(1) #endif #ifdef __GNUC__ #define ATTRIBUTE_PACKED __attribute__ ((packed)) #else #define ATTRIBUTE_PACKED #endif #define zip_split_sig 0x08074b50 #define zip_split_sig_rev 0x504b0708 struct zip_split { int zipsplitsig; }; #define zip_lfh_sig 0x04034b50 #define zip_lfh_sig_rev 0x504b0304 //! ZIP local file header structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_lfh { int ziplocsig; //!< local file header signature short zipver; //!< minimum zip spec version needed to extract short zipgenfld; //!< general purpose flags short zipmthd; //!< compression method short ziptime; //!< file modification time short zipdate; //!< file modification date int zipcrc; //!< CRC-32 checksum unsigned int zipsize; //!< file size (after compression) unsigned int zipuncmp; //!< file size (uncompressed) unsigned short zipfnln; //!< file name length unsigned short zipxtraln; //!< extra filed length (unused?) char zipname[0]; //!< file name (length as given above) } ATTRIBUTE_PACKED; #define zip_cd_sig 0x02014b50 #define zip_cd_sig_rev 0x504b0102 //! ZIP central directory structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_cd { int zipcensig; //!< central directory signature char zipcver; //!< zip spec version of creating software char zipcos; //!< os compatibility of the file attribute information char zipcvxt; //!< minimum zip spec version needed to extract char zipcexos; //!< unused (?) short zipcflg; //!< general purpose flag short zipcmthd; //!< compression method short ziptim; //!< file modification time short zipdat; //!< file modification date int zipccrc; //!< CRC-32 checksum unsigned int zipcsiz; //!< file size (after compression) unsigned int zipcunc; //!< file size (uncompressed) unsigned short zipcfnl; //!< file name length unsigned short zipcxtl; //!< extra field length unsigned short zipccml; //!< comment length unsigned short zipdsk; //!< disk number of file unsigned short zipint; //!< internal attributes unsigned int zipext; //!< external attributes unsigned int zipofst; //!< offset to start of local file header char zipcfn[0]; //!< file name (length as given above) } ATTRIBUTE_PACKED; /** * @brief Placeholder value for size field in the central directory if * the size is 64bit. See the documentation for the Zip64 Extended * Information Extra Field. */ #define zip_size_64bit_placeholder 0xffffffff /** * @brief Header ID for extra field "ZIP64". */ #define zip_extra_header_id_zip64 0x0001 //! ZIP extra field structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_cd_ext { short tag; //!< extra field header ID short size; //!< extra field data size unsigned long long zipofst; //!< offset to start of local file header (only valid if the struct is for a ZIP64 extra field) } ATTRIBUTE_PACKED; struct zip_enc { short efield_header; short efield_size; short version; char vendor_id1,vendor_id2; char encryption_strength; short compress_method; } ATTRIBUTE_PACKED; #define zip_eoc_sig 0x6054b50 #define zip_eoc_sig_rev 0x504b0506 //! ZIP end of central directory structure. //! See the documentation of the ZIP format for the meaning //! of these fields. struct zip_eoc { int zipesig; /* end of central dir signature */ unsigned short zipedsk; /* number of this disk */ unsigned short zipecen; /* number of the disk with the start of the central directory */ unsigned short zipenum; /* total number of entries in the central directory on this disk */ unsigned short zipecenn; /* total number of entries in the central directory */ unsigned int zipecsz; /* size of the central directory */ unsigned int zipeofst; /* offset of start of central directory with respect to the starting disk number */ short zipecoml; /* .ZIP file comment length */ char zipecom[0]; /* .ZIP file comment */ } ATTRIBUTE_PACKED; #define zip64_eoc_sig 0x6064b50 #define zip64_eoc_sig_rev 0x504b0606 struct zip64_eoc { int zip64esig; /* zip64 end of central dir signature */ unsigned long long zip64esize; /* size of zip64 end of central directory record */ unsigned short zip64ever; /* version made by */ unsigned short zip64eneed; /* version needed to extract */ unsigned int zip64edsk; /* number of this disk */ unsigned int zip64ecen; /* number of the disk with the start of the central directory */ unsigned long long zip64enum; /* total number of entries in the central directory on this disk */ unsigned long long zip64ecenn; /* total number of entries in the central directory */ unsigned long long zip64ecsz; /* size of the central directory */ unsigned long long zip64eofst; /* offset of start of central directory with respect to the starting disk number */ char zip64ecom[0]; /* zip64 extensible data sector */ } ATTRIBUTE_PACKED; #define zip64_eocl_sig 0x07064b50 struct zip64_eocl { int zip64lsig; int zip64ldsk; long long zip64lofst; int zip74lnum; } ATTRIBUTE_PACKED; struct zip_alignment_check { int x[sizeof(struct zip_cd) == 46 ? 1:-1]; }; #ifdef HAVE_PRAGMA_PACK #pragma pack(pop) #endif #endif navit-0.5.0+dfsg.1/po/000077500000000000000000000000001264204753600143425ustar00rootroot00000000000000navit-0.5.0+dfsg.1/po/CMakeLists.txt000066400000000000000000000120111264204753600170750ustar00rootroot00000000000000FIND_PROGRAM(XGETTEXT xgettext) set(POTFILES ${PROJECT_SOURCE_DIR}/navit/main.c ${PROJECT_SOURCE_DIR}/navit/navigation.c ${PROJECT_SOURCE_DIR}/navit/navit.c ${PROJECT_SOURCE_DIR}/navit/popup.c ${PROJECT_SOURCE_DIR}/navit/country.c ${PROJECT_SOURCE_DIR}/navit/start_real.c ${PROJECT_SOURCE_DIR}/navit/route.c ${PROJECT_SOURCE_DIR}/navit/vehicle.c ${PROJECT_SOURCE_DIR}/navit/bookmarks.c ${PROJECT_SOURCE_DIR}/navit/gui/gtk/destination.c ${PROJECT_SOURCE_DIR}/navit/gui/gtk/gui_gtk_action.c ${PROJECT_SOURCE_DIR}/navit/gui/gtk/gui_gtk_poi.c ${PROJECT_SOURCE_DIR}/navit/gui/gtk/gui_gtk_statusbar.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_bookmark.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_command.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_html.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_menu.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_poi.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_search.c ${PROJECT_SOURCE_DIR}/navit/gui/internal/gui_internal_widget.c ${PROJECT_SOURCE_DIR}/navit/osd/core/osd_core.c ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitDialogs.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitGraphics.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/Navit.java ${PROJECT_SOURCE_DIR}/navit/android/src/org/navitproject/navit/NavitMapDownloader.java ${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.c ${CMAKE_CURRENT_BINARY_DIR}/strings_xml.c ) # Trick gettext to get translateable strings out of navit_shipped.xml ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.c DEPENDS ${PROJECT_SOURCE_DIR}/navit/navit_shipped.xml COMMAND ${CMAKE_COMMAND} -D SRC=${PROJECT_SOURCE_DIR}/navit/navit_shipped.xml -D DST=${CMAKE_CURRENT_BINARY_DIR}/navit_shipped.c -P ${PROJECT_SOURCE_DIR}/cmake/navit_xml_parser.cmake ) # Trick gettext to get translateable strings out of android strings.xml ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/strings_xml.c DEPENDS ${PROJECT_SOURCE_DIR}/navit/android/res/values/strings.xml COMMAND ${CMAKE_COMMAND} -D SRC=${PROJECT_SOURCE_DIR}/navit/android/res/values/strings.xml -D DST=${CMAKE_CURRENT_BINARY_DIR}/strings_xml.c -P ${PROJECT_SOURCE_DIR}/cmake/strings_xml_parser.cmake ) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/navit.pot DEPENDS ${POTFILES} COMMAND ${XGETTEXT} --no-location --default-domain=navit_tmp --add-comments --keyword=_ --keyword=_n --keyword=navit_nls_gettext --keyword=navit_nls_ngettext:1,2 ${POTFILES} COMMAND ${CMAKE_COMMAND} -DMATCHES="CHARSET" -DREPLACE="utf-8" -DSRC=${CMAKE_CURRENT_BINARY_DIR}/navit_tmp.po -DDST=${CMAKE_CURRENT_BINARY_DIR}/navit.pot -P ${PROJECT_SOURCE_DIR}/cmake/replace.cmake ) FILE(GLOB POIN_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.po.in") string(REPLACE ".po.in" "" LANGUAGES "${POIN_FILES}") foreach (LANG ${LANGUAGES}) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/navit.pot ${CMAKE_CURRENT_SOURCE_DIR}/${LANG}.po.in COMMAND ${CMAKE_COMMAND} -D SRC=${CMAKE_CURRENT_SOURCE_DIR}/${LANG}.po.in -D DST=${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po.tmp -DPACKAGE_STRING=${PACKAGE_STRING} -P ${PROJECT_SOURCE_DIR}/cmake/navit_po_version.cmake COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --no-fuzzy-matching --verbose --quiet -o "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po" "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po.tmp" ${CMAKE_CURRENT_BINARY_DIR}/navit.pot COMMAND ${CMAKE_COMMAND} -E remove "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po.tmp" ) endforeach(LANG ${LANGUAGES}) foreach (LANG ${LANGUAGES}) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check --verbose --statistics --output-file="${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo" "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po" COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/locale/${LANG}/LC_MESSAGES" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo" "${PROJECT_BINARY_DIR}/locale/${LANG}/LC_MESSAGES/navit.mo" ) SET(MOFILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo ${MOFILES}) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.mo DESTINATION ${LOCALE_DIR}/${LANG}/LC_MESSAGES RENAME navit.mo) endforeach(LANG ${LANGUAGES}) add_custom_target(locales ALL DEPENDS ${MOFILES}) navit-0.5.0+dfsg.1/po/Makefile.am000066400000000000000000000116561264204753600164070ustar00rootroot00000000000000CATALOGS = @MOFILES@ CLEANFILES = $(CATALOGS) navit.pot # keep this sorted EXTRA_DIST = @POIFILES@ \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDialogs.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitGraphics.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/Navit.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitMapDownloader.java \ $(top_srcdir)/navit/android/res/values/strings.xml POTFILES = \ $(top_srcdir)/navit/main.c \ $(top_srcdir)/navit/navigation.c \ $(top_srcdir)/navit/navit.c \ $(top_srcdir)/navit/popup.c \ $(top_srcdir)/navit/country.c \ $(top_srcdir)/navit/gui/gtk/destination.c \ $(top_srcdir)/navit/gui/gtk/gui_gtk_action.c \ $(top_srcdir)/navit/gui/gtk/gui_gtk_poi.c \ $(top_srcdir)/navit/gui/gtk/gui_gtk_statusbar.c \ $(top_srcdir)/navit/gui/internal/gui_internal.c \ $(top_srcdir)/navit/gui/internal/gui_internal_bookmark.c \ $(top_srcdir)/navit/gui/internal/gui_internal_command.c \ $(top_srcdir)/navit/gui/internal/gui_internal_html.c \ $(top_srcdir)/navit/gui/internal/gui_internal_menu.c \ $(top_srcdir)/navit/gui/internal/gui_internal_poi.c \ $(top_srcdir)/navit/gui/internal/gui_internal_search.c \ $(top_srcdir)/navit/gui/internal/gui_internal_widget.c \ $(top_srcdir)/navit/osd/core/osd_core.c \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDialogs.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitGraphics.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/Navit.java \ $(top_srcdir)/navit/android/src/org/navitproject/navit/NavitMapDownloader.java \ $(top_builddir)/navit/navit_shipped.c \ $(top_builddir)/navit/strings.c if XGETTEXT_GLADE POTFILES += $(top_builddir)/navit/navit_shipped.glade endif SUFFIXES = .po .mo .po.mo: dir=`basename $@ .mo` ;\ $(MSGFMT) --check --verbose --statistics --output-file=$@ $< && \ mkdir -p ../locale/$$dir/LC_MESSAGES && \ cp $@ ../locale/$$dir/LC_MESSAGES/navit.mo all: @MOFILES@ # Trick gettext to get translateable strings out of navit_shipped.xml $(top_builddir)/navit/navit_shipped.glade: $(top_srcdir)/navit/navit_shipped.xml sed -e "s/vehicleprofile/atkaction/" -e "s/name=/description=/" -e 's/$(top_builddir)/navit/navit_shipped.glade $(top_builddir)/navit/navit_shipped.c: $(top_srcdir)/navit/navit_shipped.xml sed -e 's/|//g' -e 's/^/|/' -e 's/$$/|/' -e 's/\(_("[^"]*")\)/| \1; |/g' -e 's/|[^|]*|//g' <$(top_srcdir)/navit/navit_shipped.xml >$(top_builddir)/navit/navit_shipped.c # Trick gettext to get translateable strings out of android/strings.xml $(top_builddir)/navit/strings.c: $(top_srcdir)/navit/android/res/values/strings.xml sed -e "s/\\\\'/'/g" -e 's%.*]*name="\(.*\)">\(.*\)%// Android resource: @strings/\1\n_("\2")%g' -e '\%^//%!d'<$(top_srcdir)/navit/android/res/values/strings.xml >$(top_builddir)/navit/strings.c @POFILES@: navit.pot sed 's/^"Project-Id-Version:.*/"Project-Id-Version: $(PACKAGE_STRING)\\n"/' < $(top_srcdir)/po/$@.in | $(MSGMERGE) --no-fuzzy-matching --verbose -o $(top_builddir)/po/$@ - navit.pot navit.pot: $(POTFILES) $(XGETTEXT) --no-location --default-domain=navit \ --add-comments --keyword=_ --keyword=_n --keyword=navit_nls_gettext --keyword=navit_nls_ngettext:1,2 $(POTFILES) if cmp -s navit.po navit.pot; then \ rm -f navit.po; \ else \ mv -f navit.po navit.pot; \ fi install-data-local: $(CATALOGS) $(mkinstalldirs) $(DESTDIR)$(datadir)/locale chmod 755 $(DESTDIR)$(datadir)/locale for n in $(CATALOGS) __DuMmY ; do \ if test "$$n" -a "$$n" != "__DuMmY" ; then \ l=`basename $$n .mo`; \ $(mkinstalldirs) $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ chmod 755 $(DESTDIR)$(datadir)/locale/$$l; \ chmod 755 $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ $(INSTALL_DATA) -m 644 $$n $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ fi; \ done uninstall-local: for n in $(CATALOGS) __DuMmY ; do \ if test "$$n" -a "$$n" != "__DuMmY" ; then \ l=`basename $$n .mo`; \ rm -f $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ fi; \ done distclean-local: rm -f $(top_builddir)/navit/navit_shipped.glade $(top_builddir)/navit/navit_shipped.c $(top_builddir)/navit/strings.c for n in $(CATALOGS) __DuMmY ; do \ if test "$$n" -a "$$n" != "__DuMmY" ; then \ l=`basename $$n .mo`; \ rm -f ../locale/$$l/LC_MESSAGES/navit.mo; \ rm -f $$l.po; \ fi; \ done navit-0.5.0+dfsg.1/po/af.po.in000066400000000000000000001223211264204753600156760ustar00rootroot00000000000000# Afrikaans translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Andre Hugo https://launchpad.net/~cortexhugo # KaZeR https://launchpad.net/~kazer # Kobus https://launchpad.net/~kobuswolf # Michael von Glasow https://launchpad.net/~michael-vonglasow # Stephan Wessels https://launchpad.net/~slwessels # Wimpie Hall https://launchpad.net/~gotek # mdhull https://launchpad.net/~mark-emsafrica msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Afrikaans \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: af\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Loop vanaf bron gids\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "verander '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulste" msgid "first" msgstr "eerste" msgid "second" msgstr "tweede" msgid "third" msgstr "derde" msgid "fourth" msgstr "vierde" msgid "fifth" msgstr "vyfde" msgid "sixth" msgstr "sesde" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulste uitgang" msgid "first exit" msgstr "eerste uitgang" msgid "second exit" msgstr "tweede uitgang" msgid "third exit" msgstr "derde uitgang" msgid "fourth exit" msgstr "vierde uitgang" msgid "fifth exit" msgstr "vyfde uitgang" msgid "sixth exit" msgstr "sesde uitgang" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "na %d meter" #, c-format msgid "%d.%d kilometers" msgstr "%d, %d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "na %d.%d kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "een kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "na een kilometer" msgstr[1] "na %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sin die %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sin die %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sin die %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sin die %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sin die %s in" msgid "When possible, please turn around" msgstr "Draai asseblief om wanneer moontlik" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Volg die pad vir die volgende %s" msgid "Enter the roundabout soon" msgstr "Gaan kortliks in die sirkel in" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Verlaat die sirkel by die %1$s %2$s" msgid "soon" msgstr "kortliks" msgid "now" msgstr "nou" msgid "then" msgstr "dan" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Neem die afrit %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Neem die afrit %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "by die afrit" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "regs" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "links" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "maklik " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "skerp " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Neem die %1$s pad na %2$s" #, c-format msgid "after %i roads" msgstr "na %i paaie" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Draai %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "draai dan om" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Draai om %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "draai dan om" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Draai om %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "dan het jy jou bestemming bereik." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Jy het jou bestemming bereik %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Afrit" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisie" msgid "Command" msgstr "Bevel" msgid "Length" msgstr "Lengte" msgid "km" msgstr "kilometer" msgid "m" msgstr "meter" msgid "Time" msgstr "Tyd" msgid "Destination Length" msgstr "Bestemming lengte" msgid "Destination Time" msgstr "Bestemming tyd" msgid "Roadbook" msgstr "Padkaart" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Stel as posisie" msgid "Set as destination" msgstr "Stel as bestemming" msgid "Add as bookmark" msgstr "Voeg as boekmerk by" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skerm koordinaat : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Verenigde Arabiese Emirate" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigue en Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanië" #. 051 msgid "Armenia" msgstr "Armenië" #. 530 msgid "Netherlands Antilles" msgstr "Nederland Antille" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentinië" #. 016 msgid "American Samoa" msgstr "Amerikaanse Samoa" #. 040 msgid "Austria" msgstr "Oostenryk" #. 036 msgid "Australia" msgstr "Australië" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Eiland" #. 031 msgid "Azerbaijan" msgstr "Azerbaidjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnië en Herzegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesj" #. 056 msgid "Belgium" msgstr "België" #. 854 msgid "Burkina Faso" msgstr "Boerkina Fasso" #. 100 msgid "Bulgaria" msgstr "Bulgarye" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Boeroendi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "St. Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Broenei" #. 068 msgid "Bolivia" msgstr "Bolivië" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilië" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhoetan" #. 074 msgid "Bouvet Island" msgstr "Bouveteiland" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Wit-Rusland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos- (Keeling) eilande" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratiese Republiek van die" #. 140 msgid "Central African Republic" msgstr "Sentraal-Afrikaanse Republiek" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Switserland" #. 384 msgid "Cote d'Ivoire" msgstr "Ivoorkus" #. 184 msgid "Cook Islands" msgstr "Cookeilande" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kameroen" #. 156 msgid "China" msgstr "Sjina" #. 170 msgid "Colombia" msgstr "Kolombië" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kaap Verdie" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Kerseiland" #. 196 msgid "Cyprus" msgstr "Siprus" #. 203 msgid "Czech Republic" msgstr "Tjeggiese Republiek" #. 276 msgid "Germany" msgstr "Duitsland" #. 262 msgid "Djibouti" msgstr "Djiboeti" #. 208 msgid "Denmark" msgstr "Denemarke" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikaanse Republiek" #. 012 msgid "Algeria" msgstr "Algerië" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Esland" #. 818 msgid "Egypt" msgstr "Egipte" #. 732 msgid "Western Sahara" msgstr "Wes-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanje" #. 231 msgid "Ethiopia" msgstr "Etiopië" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fidji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-eiland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesia, Federale state van" #. 234 msgid "Faroe Islands" msgstr "Faroëreilande" #. 250 msgid "France" msgstr "Frankryk" #. 266 msgid "Gabon" msgstr "Gaboen" #. 826 msgid "United Kingdom" msgstr "Verenigde Koninkryk" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgië" #. 254 msgid "French Guiana" msgstr "Frans-Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambië" #. 324 msgid "Guinea" msgstr "Guinië" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekwatoriaal-Guinee" #. 300 msgid "Greece" msgstr "Griekeland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgië en die Suid Sandwich Eilande" #. 320 msgid "Guatemala" msgstr "Gautemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinee-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Eiland en McDonald Eiland" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroasië" #. 332 msgid "Haiti" msgstr "Haïti" #. 348 msgid "Hungary" msgstr "Hongarye" #. 360 msgid "Indonesia" msgstr "Indonesië" #. 372 msgid "Ireland" msgstr "Ierland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man eiland" #. 356 msgid "India" msgstr "Indië" #. 086 msgid "British Indian Ocean Territory" msgstr "Brits Indiese oseaan gebiede" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Ysland" #. 380 msgid "Italy" msgstr "Italië" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanië" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Kambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts en Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Noord-Korea" #. 410 msgid "Korea, Republic of" msgstr "Suid-Korea" #. 414 msgid "Kuwait" msgstr "Koeweit" #. 136 msgid "Cayman Islands" msgstr "Kaaimanseilande" #. 398 msgid "Kazakhstan" msgstr "Kazakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberië" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litoue" #. 442 msgid "Luxembourg" msgstr "Luxenburg" #. 428 msgid "Latvia" msgstr "Letland" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldawië" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "St. Martin" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall-eilande" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Masedonië" #. 466 msgid "Mali" msgstr "Malie" #. 104 msgid "Myanmar" msgstr "Mianmar" #. 496 msgid "Mongolia" msgstr "Mongolië" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Noordmarianaeilande" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mouritanië" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldive" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Maleisië" #. 508 msgid "Mozambique" msgstr "Mosambiek" #. 516 msgid "Namibia" msgstr "Namibië" #. 540 msgid "New Caledonia" msgstr "Nieu-Kaledonië" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk-eiland" #. 566 msgid "Nigeria" msgstr "Nigerië" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Noorweë" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Naoeroe" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nieu-Seeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Frans Polinesië" #. 598 msgid "Papua New Guinea" msgstr "Papoea Nieu-Guinee" #. 608 msgid "Philippines" msgstr "Filippyne" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pole" #. 666 msgid "Saint Pierre and Miquelon" msgstr "St. Pierre en Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn Eilande" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestynse Gebied, Besette" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguaai" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roemenië" #. 688 msgid "Serbia" msgstr "Serwië" #. 643 msgid "Russian Federation" msgstr "Rusland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saoedi-Arabië" #. 090 msgid "Solomon Islands" msgstr "Solomon-eilande" #. 690 msgid "Seychelles" msgstr "Seychelle" #. 736 msgid "Sudan" msgstr "Soedan" #. 752 msgid "Sweden" msgstr "Swede" #. 702 msgid "Singapore" msgstr "Singapoer" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slovenië" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard en Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakye" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalië" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé en Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirië" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turkse en Caicos Eilande" #. 148 msgid "Chad" msgstr "Tsjaad" #. 260 msgid "French Southern Territories" msgstr "Franse Suidelike gebiede" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Oos-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisië" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkye" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad en Tobago" #. 798 msgid "Tuvalu" msgstr "Toewaloe" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanië" #. 804 msgid "Ukraine" msgstr "Oekraïne" #. 800 msgid "Uganda" msgstr "Oeganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Verenigde State Kleiner uitliggende eilande" #. 840 msgid "United States" msgstr "Vereenigde State" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Oesbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikaan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent en die Grenadine" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britse Maagde eilande" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikaanse Maagde eilande" #. 704 msgid "Viet Nam" msgstr "Viëtnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- en Futuna-eilande" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Suid-Afrika" #. 894 msgid "Zambia" msgstr "Zambië" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Onbekend, voeg is_in merkers by daai stede" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kaart punt" msgid "Car" msgstr "Kar" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Pos" msgid "Town" msgstr "Dorp" msgid "District" msgstr "Distrik" msgid "Street" msgstr "Straat" msgid "Number" msgstr "Nommer" msgid "Enter Destination" msgstr "Kies Bestemming" msgid "Zip Code" msgstr "Poskode" msgid "City" msgstr "Stad" msgid "District/Township" msgstr "Distrik/Kontrei" msgid "Map" msgstr "Kaart" msgid "Bookmark" msgstr "Boekmerk" msgid "Destination" msgstr "Bestemming" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Skerm" msgid "_Route" msgstr "Roete" msgid "_Former Destinations" msgstr "Voorige bestemmings" msgid "_Bookmarks" msgstr "Boekmerke" msgid "_Map" msgstr "Kaart" msgid "_Layout" msgstr "Uitleg" msgid "_Projection" msgstr "Skatting" msgid "_Vehicle" msgstr "Voertuig" msgid "Zoom_Out" msgstr "ZoomUit" msgid "Decrease zoom level" msgstr "Verminder zoom vlak" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "Vermeerder zoom vlak" msgid "_Recalculate" msgstr "Herbereken" msgid "Redraw map" msgstr "Teken kaart oor" msgid "_Info" msgstr "Inligting" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Toon adres soek skerm" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop Navigasie" msgid "Test" msgstr "Toets" msgid "_Quit" msgstr "_Sluit af" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Koppel aan Pad" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Skakel kaart orientasie na noord of voertuig" msgid "_Roadbook" msgstr "Padkaart" msgid "Show/hide route description" msgstr "Toon/verskuil roete beskrywing" msgid "_Autozoom" msgstr "Outozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Skakel Aan/af outomatiese zoom vlak verandering" msgid "_Fullscreen" msgstr "Volskerm" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "SO" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nee" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Roete %4.0fkm %02d:%02d aankomstyd" msgid "Route 0000km 0+00:00 ETA" msgstr "Roete 0000km 0+00:00 aankomstyd" msgid "Help" msgstr "Hulp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Besigtig in blaaier" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Strate" msgid "House numbers" msgstr "Huis Nommers" msgid "View Attributes" msgstr "Besigtig eienskappe" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Belangpunte" msgid "View on map" msgstr "Beloer op kaart" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Sny Boekmerk" msgid "Copy Bookmark" msgstr "Kopieer Boekmerk" msgid "Rename Bookmark" msgstr "Hernoem Boekmerk" msgid "Paste Bookmark" msgstr "Plaas Boekmerk" msgid "Delete Bookmark" msgstr "Verwyder Boekmerk" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Boekmerke" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Voeg Boekmerk Leger by" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Plaas boekmerk" #, c-format msgid "Bookmark %s" msgstr "Boekmerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Wys Satelliet Inligting" msgid " Elevation " msgstr " Hoogte " msgid " Azimuth " msgstr " Rigting " msgid "Show NMEA Data" msgstr "Wys NMEA data" msgid "car" msgstr "Motor" msgid "bike" msgstr "Motorfiets" msgid "pedestrian" msgstr "voetganger" #, c-format msgid "Current profile: %s" msgstr "Huidige Profiel: %s" #, c-format msgid "Change profile to: %s" msgstr "Verander profiel na: %s" msgid "Set as active" msgstr "Maak aktief" msgid "Show Satellite status" msgstr "Wys satelliet inligting" msgid "Show NMEA data" msgstr "Wys NMEA data" msgid "Add Bookmark" msgstr "Voeg Boekmerk by" msgid "Rename" msgstr "Hernoem" msgid "About Navit" msgstr "Rakende Navit" #. Authors msgid "By" msgstr "Skrywers" #. Contributors msgid "And all the Navit Team" msgstr "En die hele Navit Span" msgid "members and contributors." msgstr "lede en bydraers" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Voertuig" msgid "Rules" msgstr "Reëls" msgid "Lock on road" msgstr "Koppel aan pad" msgid "Northing" msgstr "Draai kaart noord" msgid "Map follows Vehicle" msgstr "Kaart volg voertuig" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kaarte" msgid "Layout" msgstr "Uitleg" msgid "Height Profile" msgstr "Hoë profiel" msgid "Route Description" msgstr "Roete Beskrywing" msgid "Show Locale" msgstr "Toon Lokalisering" msgid "Former Destinations" msgstr "Voorige bestemmings" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Boodskap" msgid "Back" msgstr "Terug" msgid "Back to map" msgstr "Terug kaart toe" msgid "Main Menu" msgstr "Hoofkieslys" msgid "House number" msgstr "Huis Nommer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Voertuig posisie" msgid "Main menu" msgstr "Hoofkieslys" msgid "" "Show\n" "Map" msgstr "" "Wys\n" "Kaart" msgid "Settings" msgstr "Instellings" msgid "Tools" msgstr "Gereedskap" msgid "Route" msgstr "Roete" msgid "About" msgstr "Rakende" msgid "Quit" msgstr "Verlaat" msgid "Actions" msgstr "Aksies" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "Navigasie" msgid "Display" msgstr "Skerm" msgid "Fullscreen" msgstr "Volskerm" msgid "Window Mode" msgstr "Venster Modus" msgid "Description" msgstr "Beskrywing" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "perd" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "verlaat dan die sirkel by die %1$s %2$s" navit-0.5.0+dfsg.1/po/ar.po.in000066400000000000000000001445441264204753600157250ustar00rootroot00000000000000# Arabic translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Magd Addin M. Almuntaser https://launchpad.net/~ttmtt-team # dargirov https://launchpad.net/~dargirov # drsaudi https://launchpad.net/~mon7b6 # metehyi https://launchpad.net/~metehyi msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: dargirov \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" "Language: ar\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "جاري التنفيذ من المجلد المصدر\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "وضع حالة '%s' إلى '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "(الرقم) صفر" msgid "first" msgstr "الأوّل" msgid "second" msgstr "الثّاني" msgid "third" msgstr "الثّالث" msgid "fourth" msgstr "الرّابع" msgid "fifth" msgstr "الخامس" msgid "sixth" msgstr "السادس" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "المخرج ذو الرقم صفر" msgid "first exit" msgstr "المخرج الأول" msgid "second exit" msgstr "المخرج الثاني" msgid "third exit" msgstr "المخرج الثالث" msgid "fourth exit" msgstr "المخرج الرابع" msgid "fifth exit" msgstr "المخرج الخامس" msgid "sixth exit" msgstr "المخرج السادس" #, c-format msgid "%d feet" msgstr "%dقدم" #, c-format msgid "in %d feet" msgstr "بعد %d قدم" #, c-format msgid "%d.%d miles" msgstr "%d.%d أميال" #, c-format msgid "in %d.%d miles" msgstr "بعد %d.%d أميال" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "مايل واحد" msgstr[1] "%d أميال" msgstr[2] "%d أميال" msgstr[3] "%d أميال" msgstr[4] "%d أميال" msgstr[5] "%d أميال" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "بعد مايل واحد" msgstr[1] "بعد %d أميال" msgstr[2] "بعد %d أميال" msgstr[3] "بعد %d أميال" msgstr[4] "بعد %d أميال" msgstr[5] "بعد %d أميال" #, c-format msgid "%d meters" msgstr "%d متر" #, c-format msgid "in %d meters" msgstr "بعد %d متر" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d كلم" #, c-format msgid "in %d.%d kilometers" msgstr "بعد %d%d كلم" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "كلم واحد" msgstr[1] "%d كلم" msgstr[2] "%d كلم" msgstr[3] "%d كلم" msgstr[4] "%d كلم" msgstr[5] "%d كلم" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "بعد كلم واحد" msgstr[1] "بعد %d كلم" msgstr[2] "بعد %d كلم" msgstr[3] "بعد %d كلم" msgstr[4] "بعد %d كلم" msgstr[5] "بعد %d كلم" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s إلى داخل الشارع %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sإلى داخل %s%s%s|صفة الذكر" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sإلى داخل %s%s%s|صفة الأنثى" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sإلى داخل %s%s%s|غير محدد الجنس" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s إلى داخل %s" msgid "When possible, please turn around" msgstr "حيث ممكن الرجاء اللف" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "تجاه %s" #, c-format msgid "Follow the road for the next %s" msgstr "تابع الطريق لل- %s التالية" msgid "Enter the roundabout soon" msgstr "قريباً الدخول إلى المستديرة" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "أخرج من المستديرة عند الــ %1$s %2$s" msgid "soon" msgstr "قريبا" msgid "now" msgstr "الآن" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "إلى اليمين" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "إلى اليسار" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "بسهولة " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "بكل شدة " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "خذ الطريق %1$s إلى ال%2$s" #, c-format msgid "after %i roads" msgstr "بعد %i طرقات" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "حوّل %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "و بعدها تكون قد وصلت إلى هدفك" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "لقد وصلت إلى هدفك %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "خروج" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "الموقع" msgid "Command" msgstr "الأمر" msgid "Length" msgstr "الطول" msgid "km" msgstr "كلم" msgid "m" msgstr "م." msgid "Time" msgstr "الوقت" msgid "Destination Length" msgstr "بُعد الهدف" msgid "Destination Time" msgstr "الوقت في مكان الوصول" msgid "Roadbook" msgstr "سجل خريطة الطريق" #, c-format msgid "Waypoint %d" msgstr "النقطة المرحلية %d" msgid "Visit before..." msgstr "تمت زيارته قبل..." msgid "Set as position" msgstr "عين كموقع حالي" msgid "Set as destination" msgstr "عيّن كهدف" msgid "Add as bookmark" msgstr "أضف كعلامة مراجعة" #, c-format msgid "Point 0x%x 0x%x" msgstr "الموقع 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "إحداثيات الشاشة :%d %d" #. 020 msgid "Andorra" msgstr "أندورا" #. 784 msgid "United Arab Emirates" msgstr "الإمارات العربيّة المتّحدة" #. 004 msgid "Afghanistan" msgstr "أفغانستان" #. 028 msgid "Antigua and Barbuda" msgstr "أنتيغوا وباربودا" #. 660 msgid "Anguilla" msgstr "أنغويلا" #. 008 msgid "Albania" msgstr "ألبانيا" #. 051 msgid "Armenia" msgstr "أرمينيا" #. 530 msgid "Netherlands Antilles" msgstr "الأنتيل الهولندية" #. 024 msgid "Angola" msgstr "أنغولا" #. 010 msgid "Antarctica" msgstr "أنتاركتيكا" #. 032 msgid "Argentina" msgstr "الأرجنتين" #. 016 msgid "American Samoa" msgstr "ساموا الأميركية" #. 040 msgid "Austria" msgstr "النمسا" #. 036 msgid "Australia" msgstr "أستراليا" #. 533 msgid "Aruba" msgstr "أروبا" #. 248 msgid "Aland Islands" msgstr "جزر أولان" #. 031 msgid "Azerbaijan" msgstr "أذربيجان" #. 070 msgid "Bosnia and Herzegovina" msgstr "البوسنة والهرسك" #. 052 msgid "Barbados" msgstr "بربادوس" #. 050 msgid "Bangladesh" msgstr "بنغلادش" #. 056 msgid "Belgium" msgstr "بلجيكا" #. 854 msgid "Burkina Faso" msgstr "بوركينا فاسو" #. 100 msgid "Bulgaria" msgstr "بلغاريا" #. 048 msgid "Bahrain" msgstr "البحرين" #. 108 msgid "Burundi" msgstr "بوروندي" #. 204 msgid "Benin" msgstr "البنين" #. 652 msgid "Saint Barthelemy" msgstr "سانت بارتيليمي" #. 060 msgid "Bermuda" msgstr "جزر البرمودا" #. 096 msgid "Brunei Darussalam" msgstr "بروناي دار السّلام" #. 068 msgid "Bolivia" msgstr "بوليفيا" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "البرازيل" #. 044 msgid "Bahamas" msgstr "جزر البهاما" #. 064 msgid "Bhutan" msgstr "بوتان" #. 074 msgid "Bouvet Island" msgstr "جزيرة بوفيت" #. 072 msgid "Botswana" msgstr "بوتسوانا" #. 112 msgid "Belarus" msgstr "روسيا البيضاء \\ بيلاروس" #. 084 msgid "Belize" msgstr "بيليز" #. 124 msgid "Canada" msgstr "كندا" #. 166 msgid "Cocos (Keeling) Islands" msgstr "جزر الكوكوس (كيلنك)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "جمهورية الكونغو الديمقراطيه" #. 140 msgid "Central African Republic" msgstr "جمهورية إفريقيا الوسطى" #. 178 msgid "Congo" msgstr "الكونغو" #. 756 msgid "Switzerland" msgstr "سويسرا" #. 384 msgid "Cote d'Ivoire" msgstr "ساحل العاج" #. 184 msgid "Cook Islands" msgstr "جزر كوك" #. 152 msgid "Chile" msgstr "تشيلي" #. 120 msgid "Cameroon" msgstr "الكامرون" #. 156 msgid "China" msgstr "الصين" #. 170 msgid "Colombia" msgstr "كولومبيا" #. 188 msgid "Costa Rica" msgstr "كوستاريكا" #. 192 msgid "Cuba" msgstr "كوبا" #. 132 msgid "Cape Verde" msgstr "الرأس الاخضر كاب فيردي" #. 531 msgid "Curacao" msgstr "كوروكاو" #. 162 msgid "Christmas Island" msgstr "جزر الكريسماس" #. 196 msgid "Cyprus" msgstr "قبرص" #. 203 msgid "Czech Republic" msgstr "جمهورية التشيك" #. 276 msgid "Germany" msgstr "ألمانيا" #. 262 msgid "Djibouti" msgstr "جيبوتي" #. 208 msgid "Denmark" msgstr "الدنمارك" #. 212 msgid "Dominica" msgstr "الدّومينيكا" #. 214 msgid "Dominican Republic" msgstr "جمهورية الدومينيكان" #. 012 msgid "Algeria" msgstr "الجزائر" #. 218 msgid "Ecuador" msgstr "الإكوادور" #. 233 msgid "Estonia" msgstr "أستونيا" #. 818 msgid "Egypt" msgstr "جمهورية مصر العربية" #. 732 msgid "Western Sahara" msgstr "الصحراء الغربية" #. 232 msgid "Eritrea" msgstr "أريتريا" #. 724 msgid "Spain" msgstr "إسبانيا" #. 231 msgid "Ethiopia" msgstr "الحبشة" #. 246 msgid "Finland" msgstr "فنلندا" #. 242 msgid "Fiji" msgstr "فيجي" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "جزر فولكلاند (مالفيناس)" #. 583 msgid "Micronesia, Federated States of" msgstr "ميكرونيزيا، ولايات ميكرونيزيا الفدرالية" #. 234 msgid "Faroe Islands" msgstr "جزر الفارو" #. 250 msgid "France" msgstr "فرنسا" #. 266 msgid "Gabon" msgstr "الغابون" #. 826 msgid "United Kingdom" msgstr "المملكة المتّحدة" #. 308 msgid "Grenada" msgstr "غرناطة" #. 268 msgid "Georgia" msgstr "جورجيا" #. 254 msgid "French Guiana" msgstr "جويانا الفرنسية" #. 831 msgid "Guernsey" msgstr "غويرنسي" #. 288 msgid "Ghana" msgstr "غانا" #. 292 msgid "Gibraltar" msgstr "جبل طارق" #. 304 msgid "Greenland" msgstr "جرينلاندا" #. 270 msgid "Gambia" msgstr "غامبيا" #. 324 msgid "Guinea" msgstr "غينيا" #. 312 msgid "Guadeloupe" msgstr "جوادلوب" #. 226 msgid "Equatorial Guinea" msgstr "غينيا الاستوائيه" #. 300 msgid "Greece" msgstr "اليونان" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "جورجيا الجنوبيّة و جزر ساندويتش الجنوبيّة" #. 320 msgid "Guatemala" msgstr "جواتيمالا" #. 316 msgid "Guam" msgstr "غوام" #. 624 msgid "Guinea-Bissau" msgstr "غينيا بيساو" #. 328 msgid "Guyana" msgstr "غيانا" #. 344 msgid "Hong Kong" msgstr "هونغ كونغ" #. 334 msgid "Heard Island and McDonald Islands" msgstr "جزيرة هيرد وجزر مَكْدونالد" #. 340 msgid "Honduras" msgstr "الهوندوراس" #. 191 msgid "Croatia" msgstr "كرواتيا" #. 332 msgid "Haiti" msgstr "هايتي" #. 348 msgid "Hungary" msgstr "المجر (هنغاريا)" #. 360 msgid "Indonesia" msgstr "إندونيسيا" #. 372 msgid "Ireland" msgstr "إيرلندا" #. 376 msgid "Israel" msgstr "فلسطين المحتلة" #. 833 msgid "Isle of Man" msgstr "جزيرة مان" #. 356 msgid "India" msgstr "الهند" #. 086 msgid "British Indian Ocean Territory" msgstr "مقاطعة المحيط الهندي البريطانيّة" #. 368 msgid "Iraq" msgstr "العراق" #. 364 msgid "Iran, Islamic Republic of" msgstr "إيران، الجمهوريّة الإسلاميّة الإيرانيّة" #. 352 msgid "Iceland" msgstr "آيسلندا" #. 380 msgid "Italy" msgstr "إيطاليا" #. 832 msgid "Jersey" msgstr "جيرسي" #. 388 msgid "Jamaica" msgstr "جامايكا" #. 400 msgid "Jordan" msgstr "الأردن" #. 392 msgid "Japan" msgstr "اليابان" #. 404 msgid "Kenya" msgstr "كينيا" #. 417 msgid "Kyrgyzstan" msgstr "قرغيزستان" #. 116 msgid "Cambodia" msgstr "كامبوديا" #. 296 msgid "Kiribati" msgstr "كيريباتي" #. 174 msgid "Comoros" msgstr "جزر القمر" #. 659 msgid "Saint Kitts and Nevis" msgstr "سانت كيتس ونيفيس" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "كوريا، جمهورية كوريا الشّعبيّة الدّيموقراطيّة" #. 410 msgid "Korea, Republic of" msgstr "كوريا، جمهوريّة كوريا" #. 414 msgid "Kuwait" msgstr "الكويت" #. 136 msgid "Cayman Islands" msgstr "جزر الكايمان" #. 398 msgid "Kazakhstan" msgstr "كازاخستان" #. 418 msgid "Lao People's Democratic Republic" msgstr "جمهوريّة لاو الدّيموقراطيّة الشّعبيّة" #. 422 msgid "Lebanon" msgstr "لبنان" #. 662 msgid "Saint Lucia" msgstr "سانت لوسيا" #. 438 msgid "Liechtenstein" msgstr "ليشتنشتاين" #. 144 msgid "Sri Lanka" msgstr "سريلانكا" #. 430 msgid "Liberia" msgstr "ليبريا" #. 426 msgid "Lesotho" msgstr "ليسوتو" #. 440 msgid "Lithuania" msgstr "ليثوانيا" #. 442 msgid "Luxembourg" msgstr "اللكسمبورغ" #. 428 msgid "Latvia" msgstr "لاتفيا" #. 434 msgid "Libya" msgstr "ليبيا" #. 504 msgid "Morocco" msgstr "المغرب" #. 492 msgid "Monaco" msgstr "موناكو" #. 498 msgid "Moldova, Republic of" msgstr "مولدوفا، جمهوريّة مولدوفا" #. 499 msgid "Montenegro" msgstr "المونتنيغرو" #. 663 msgid "Saint Martin (French part)" msgstr "سانت مارتين (القطاع الفرنسي)" #. 450 msgid "Madagascar" msgstr "مدغشقر" #. 584 msgid "Marshall Islands" msgstr "جزر المارشال" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "مقدونيا" #. 466 msgid "Mali" msgstr "مالي" #. 104 msgid "Myanmar" msgstr "مينامار" #. 496 msgid "Mongolia" msgstr "منغوليا" #. 446 msgid "Macao" msgstr "ماكاو" #. 580 msgid "Northern Mariana Islands" msgstr "جزر ماريانا الشّمالية" #. 474 msgid "Martinique" msgstr "مارتينيك" #. 478 msgid "Mauritania" msgstr "موريتانيا" #. 500 msgid "Montserrat" msgstr "مونتسيرات" #. 470 msgid "Malta" msgstr "مالطة" #. 480 msgid "Mauritius" msgstr "موريشيوس" #. 462 msgid "Maldives" msgstr "جزر المالديف" #. 454 msgid "Malawi" msgstr "مالاوي" #. 484 msgid "Mexico" msgstr "المكسيك" #. 458 msgid "Malaysia" msgstr "ماليزيا" #. 508 msgid "Mozambique" msgstr "الموزمبيق" #. 516 msgid "Namibia" msgstr "ناميبيا" #. 540 msgid "New Caledonia" msgstr "قلدونيا الجديدة" #. 562 msgid "Niger" msgstr "النّيجر" #. 574 msgid "Norfolk Island" msgstr "جزيرة نورفولك" #. 566 msgid "Nigeria" msgstr "نيجيريا" #. 558 msgid "Nicaragua" msgstr "نيكاراغوا" #. 528 msgid "Netherlands" msgstr "هولندا" #. 578 msgid "Norway" msgstr "النروج" #. 524 msgid "Nepal" msgstr "نيبال" #. 520 msgid "Nauru" msgstr "ناورو" #. 570 msgid "Niue" msgstr "نيوي" #. 554 msgid "New Zealand" msgstr "نيوزيلاندا" #. 512 msgid "Oman" msgstr "عُمان" #. 591 msgid "Panama" msgstr "باناما" #. 604 msgid "Peru" msgstr "البيرو" #. 258 msgid "French Polynesia" msgstr "بولينيزيا الفرنسية" #. 598 msgid "Papua New Guinea" msgstr "بابوا غينيا الجديدة" #. 608 msgid "Philippines" msgstr "الفلبّين" #. 586 msgid "Pakistan" msgstr "باكستان" #. 616 msgid "Poland" msgstr "بولونيا" #. 666 msgid "Saint Pierre and Miquelon" msgstr "سانت بيير وميكولون" #. 612 msgid "Pitcairn" msgstr "بتكايرن" #. 630 msgid "Puerto Rico" msgstr "بورتوريكو" #. 275 msgid "Palestinian Territory, Occupied" msgstr "فلسطين المحتلّة، الأراضي الفلسطينيّة المحتلّة" #. 620 msgid "Portugal" msgstr "البرتغال" #. 585 msgid "Palau" msgstr "بالاو" #. 600 msgid "Paraguay" msgstr "الباراغواي" #. 634 msgid "Qatar" msgstr "قطر" #. 638 msgid "Reunion" msgstr "ريونيون" #. 642 msgid "Romania" msgstr "رومانيا" #. 688 msgid "Serbia" msgstr "صربيا" #. 643 msgid "Russian Federation" msgstr "الإتّحاد الروسي" #. 646 msgid "Rwanda" msgstr "رواندا" #. 682 msgid "Saudi Arabia" msgstr "المملكة العربيّة السّعوديّة" #. 090 msgid "Solomon Islands" msgstr "جزر سليمان" #. 690 msgid "Seychelles" msgstr "السّيشل" #. 736 msgid "Sudan" msgstr "السودان" #. 752 msgid "Sweden" msgstr "السّويد" #. 702 msgid "Singapore" msgstr "سنغفورة" #. 654 msgid "Saint Helena" msgstr "سانت هيلينا" #. 705 msgid "Slovenia" msgstr "سلوفينيا" #. 744 msgid "Svalbard and Jan Mayen" msgstr "سفالبارد وجان مايان" #. 703 msgid "Slovakia" msgstr "سلوفاكيا" #. 694 msgid "Sierra Leone" msgstr "سيراليون" #. 674 msgid "San Marino" msgstr "سان مارينو" #. 686 msgid "Senegal" msgstr "السنيغال" #. 706 msgid "Somalia" msgstr "الصّومال" #. 740 msgid "Suriname" msgstr "سورينام" #. 728 msgid "South Sudan" msgstr "جنوب السودان" #. 678 msgid "Sao Tome and Principe" msgstr "ساو تومي وبرينسيبي" #. 222 msgid "El Salvador" msgstr "السلفادور" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "الجمهوريّة العربيّة السّوريّة" #. 748 msgid "Swaziland" msgstr "السّوازيلاند" #. 796 msgid "Turks and Caicos Islands" msgstr "جزر تركس وكايكوس" #. 148 msgid "Chad" msgstr "التشاد" #. 260 msgid "French Southern Territories" msgstr "المقاطعات الجنوبية الفرنسية" #. 768 msgid "Togo" msgstr "توغو" #. 764 msgid "Thailand" msgstr "تايلندا" #. 762 msgid "Tajikistan" msgstr "طاجكستان" #. 772 msgid "Tokelau" msgstr "توكلو" #. 626 msgid "Timor-Leste" msgstr "تيمور الشرقية" #. 795 msgid "Turkmenistan" msgstr "تركمانستان" #. 788 msgid "Tunisia" msgstr "تونس" #. 776 msgid "Tonga" msgstr "تونجا" #. 792 msgid "Turkey" msgstr "تركيا" #. 780 msgid "Trinidad and Tobago" msgstr "ترينيداد وتوباغو" #. 798 msgid "Tuvalu" msgstr "توفالو" #. 158 msgid "Taiwan, Province of China" msgstr "تايوان، محافظة صينية" #. 834 msgid "Tanzania, United Republic of" msgstr "تنزانيا، جمهوريّة تنزانيا المتّحدة" #. 804 msgid "Ukraine" msgstr "أوكرانيا" #. 800 msgid "Uganda" msgstr "اوغندا" #. 581 msgid "United States Minor Outlying Islands" msgstr "جزر الولايات المتحدة البعيدة الصغيرة" #. 840 msgid "United States" msgstr "الولايات المتّحدة الأمريكية" #. 858 msgid "Uruguay" msgstr "الأوروغواي" #. 860 msgid "Uzbekistan" msgstr "أوزبكستان" #. 336 msgid "Holy See (Vatican City State)" msgstr "الكرسي الرسولي (دولة الفاتيكان)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "سانت فنسنت والجرينادينز" #. 862 msgid "Venezuela" msgstr "فنزويلا" #. 092 msgid "Virgin Islands, British" msgstr "جزر فيرجن البريطانية" #. 850 msgid "Virgin Islands, U.S." msgstr "جزر فيرجن ، الولايات المتحدة" #. 704 msgid "Viet Nam" msgstr "الفييتنام" #. 548 msgid "Vanuatu" msgstr "فانواتو" #. 876 msgid "Wallis and Futuna" msgstr "واليس و فوتونا" #. 882 msgid "Samoa" msgstr "ساموا" #. 887 msgid "Yemen" msgstr "اليمن" #. 175 msgid "Mayotte" msgstr "مايوت" #. 710 msgid "South Africa" msgstr "جنوب إفريقيا" #. 894 msgid "Zambia" msgstr "زامبيا" #. 716 msgid "Zimbabwe" msgstr "زيمبابوي" msgid "* Unknown, add is_in tags to those cities" msgstr "* غير معروف، أضف تسميات is_in إلى تلك المدن" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "شارع غير معروف" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "فشلت في كتابة ملف علامات القراءة" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "النقطة على الخريطة" msgid "Car" msgstr "سيارة" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "الدولة" msgid "Postal" msgstr "بريدي" msgid "Town" msgstr "البلدة" msgid "District" msgstr "حي" msgid "Street" msgstr "الشارع" msgid "Number" msgstr "الرقم" msgid "Enter Destination" msgstr "أدخل الهدف" msgid "Zip Code" msgstr "الرمز البريدي" msgid "City" msgstr "المدينة" msgid "District/Township" msgstr "الحي/البلدة" msgid "Map" msgstr "الخريطة" msgid "Bookmark" msgstr "إشارة مرجعية" msgid "Destination" msgstr "الهدف" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "المظهار" msgid "_Route" msgstr "الطريق" msgid "_Former Destinations" msgstr "الأهداف السابقة" msgid "_Bookmarks" msgstr "إشارات مرجعية" msgid "_Map" msgstr "الخريطة" msgid "_Layout" msgstr "التصميم" msgid "_Projection" msgstr "الإسقاط" msgid "_Vehicle" msgstr "وسيلة التنقل" msgid "Zoom_Out" msgstr "صغّر الروئية" msgid "Decrease zoom level" msgstr "خفض مستوى التكبير" msgid "Zoom_In" msgstr "كبّر الروئية" msgid "Increase zoom level" msgstr "إرفع مستوى التكبير" msgid "_Recalculate" msgstr "إعادة الحساب" msgid "Redraw map" msgstr "أرسم الخريطو مجددا" msgid "_Info" msgstr "معلومات" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "إفتح حوار البحث عن عنوان" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "قف الملاحة" msgid "Test" msgstr "اختبار" msgid "_Quit" msgstr "_إنهاء" msgid "Quit the application" msgstr "أنهِ التطبيق" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "إقفال على الطريق" msgid "_Keep orientation to the North" msgstr "_حافظ على الإتجاه شمالا" msgid "Switches map orientation to the north or the vehicle" msgstr "تبديل اتجاه الخريطة إلى الشمال أو إلى السيارة" msgid "_Roadbook" msgstr "سجل خريطة الطريق" msgid "Show/hide route description" msgstr "أعرض/خبئ وصف الطريق" msgid "_Autozoom" msgstr "تكبير/تصغير تلقائي" msgid "Enable/disable automatic zoom level changing" msgstr "فعل\\عطل تغيير مستوى التقريب تلقائياً" msgid "_Fullscreen" msgstr "ملء الشاشة" msgid "Data" msgstr "المعطيات" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "ش." msgid "NE" msgstr "ش. ش." msgid "E" msgstr "ش." msgid "SE" msgstr "ج. ش." msgid "S" msgstr "ج." msgid "SW" msgstr "ج. غ." msgid "W" msgstr "غ." msgid "NW" msgstr "ش. غ." #. Android resource: @strings/no msgid "No" msgstr "لا" msgid "2D" msgstr "ثنائي الأبعاد" msgid "3D" msgstr "ثلاثي الأبعاد" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fكلم %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "الطريك 0000كلم 0+00:00 ETA" msgid "Help" msgstr "المساعدة" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "أعرض في المتصفح" msgid "Item type" msgstr "نوع العنصر" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "الشوارع" msgid "House numbers" msgstr "أرقام المنازل" msgid "View Attributes" msgstr "أعرض الصفات" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "مواقع ذات أهمية" msgid "View on map" msgstr "أعرض على الخريطة" msgid "Remove search results from the map" msgstr "أحذف نتائج البحث من الخريطة" msgid "Show results on the map" msgstr "أعرض النتائج على الخريطة" msgid "Cut Bookmark" msgstr "قص العلامة" msgid "Copy Bookmark" msgstr "انسخ علامة القرائة" msgid "Rename Bookmark" msgstr "إعادة تسمية العلامة" msgid "Paste Bookmark" msgstr "لصق العلامة" msgid "Delete Bookmark" msgstr "إحذف العلامة" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "إشارات مرجعية" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "احذف المجلد" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "إضافة علامة على المجلد" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "لصق العلامة" #, c-format msgid "Bookmark %s" msgstr "علّم %s كإشارة مرجعية" #, c-format msgid "Download %s" msgstr "تنزيل %s" msgid "Map Download" msgstr "تنزيل الخريطة" msgid "Active" msgstr "فعال" msgid "Download Enabled" msgstr "التنزيل فعال" msgid "Download completely" msgstr "نزّل كاملا" msgid "Show Satellite Status" msgstr "أعرض حالة القمر الإسطناعي" msgid " Elevation " msgstr " الإرتفاع " msgid " Azimuth " msgstr " السمت " msgid "Show NMEA Data" msgstr "أعرض المعطيات NMEA" msgid "car" msgstr "سيارة" msgid "bike" msgstr "دراجة" msgid "pedestrian" msgstr "مشاة" #, c-format msgid "Current profile: %s" msgstr "التعريف الحالي: %s" #, c-format msgid "Change profile to: %s" msgstr "غيّر التعريف إلى: %s" msgid "Set as active" msgstr "عيّن كــفعلي" msgid "Show Satellite status" msgstr "أعرض حالة القمر الإسطناعي" msgid "Show NMEA data" msgstr "أعرض المعطيات NMEA" msgid "Add Bookmark" msgstr "أضف إشارة مرجعية" msgid "Rename" msgstr "إعادة التسمية" msgid "About Navit" msgstr "عن Navit" #. Authors msgid "By" msgstr "حسب الكُتاب" #. Contributors msgid "And all the Navit Team" msgstr "وجميع فريق Navit" msgid "members and contributors." msgstr "الأعضاء والمساهمين ." msgid "Waypoints" msgstr "نقاط المراحل" msgid "Enter Coordinates" msgstr "أدخل الإحداثيات" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "أدخل الإحداثيات، مثلا:" msgid "Vehicle" msgstr "وسيلة التنقل" msgid "Rules" msgstr "القواعد" msgid "Lock on road" msgstr "إقفال على الطريق" msgid "Northing" msgstr "شمالي دائم" msgid "Map follows Vehicle" msgstr "الخريطة تتبع وسيلة التنقل" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "الخرائط" msgid "Layout" msgstr "التصميم" msgid "Height Profile" msgstr "لمحة عن الإرتفاع" msgid "Route Description" msgstr "وصف الطريق" msgid "Show Locale" msgstr "أعرض المحليات" msgid "Former Destinations" msgstr "الأهداف السابقة" msgid "- No former destinations available -" msgstr "- لا يوجد إتجاهات متوفرة -" msgid "Message" msgstr "الرسالة" msgid "Back" msgstr "السابق" msgid "Back to map" msgstr "إرجع إلى الخريطة" msgid "Main Menu" msgstr "اللائحة الرئيسية" msgid "House number" msgstr "رقم المنزل" msgid "Next" msgstr "التالي" msgid "Prev" msgstr "السابق" msgid "Return to route!" msgstr "إرجع إلى الطريق!" #. warning told msgid "Look out! Camera!" msgstr "إنتبه ! آلة تصوير" #. warning told msgid "Please decrease your speed" msgstr "ألرجاء خفض سرعتك" msgid "partial match" msgstr "تطابق جزئي" #. Android resource: @strings/address_search_button msgid "Search" msgstr "إبحث" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "البلدات" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "الطريق إلى هنا" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "الخرائط المنزلة" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "إلغاء" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "كامل القرة الأرضية" msgid "Africa" msgstr "إفريقيا" msgid "Canary Islands" msgstr "جزر الكناري" msgid "Asia" msgstr "آسيا" msgid "Korea" msgstr "كوريا" msgid "Taiwan" msgstr "تايوان" msgid "UAE+Other" msgstr "الإمارت العرية المتحدة و أخرى" msgid "Oceania" msgstr "أوقيانيا" msgid "Tasmania" msgstr "تسمانيا" msgid "Victoria" msgstr "فيكتوريا" msgid "New South Wales" msgstr "نيو ساوث ويلز" msgid "Europe" msgstr "أوروبا" msgid "Western Europe" msgstr "أوروبا الغربية" msgid "Azores" msgstr "جزر الأزور" msgid "BeNeLux" msgstr "بلجيكا هولاندة اللكسمبرغ" msgid "Alsace" msgstr "الألزاس" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "الوسط" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "كورسيكا" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "عاصمة فرنسا و ضواحيها" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "بيكاردي" msgid "Poitou-Charentes" msgstr "بواتو شارانت" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "رون-جبال الألب" msgid "Baden-Wuerttemberg" msgstr "بادن فورتمبيرغ" msgid "Bayern" msgstr "بافاريا" msgid "Mittelfranken" msgstr "فرانكن الوسطى" msgid "Niederbayern" msgstr "بافاريا السفلى" msgid "Oberbayern" msgstr "بافاريا العليا" msgid "Oberfranken" msgstr "فرانكن العليا" msgid "Oberpfalz" msgstr "بفالز العليا" msgid "Schwaben" msgstr "شفابن" msgid "Unterfranken" msgstr "فرانكن السفلى" msgid "Berlin" msgstr "برلين" msgid "Brandenburg" msgstr "براندنبورغ" msgid "Bremen" msgstr "بريمن" msgid "Hamburg" msgstr "هامبرغ" msgid "Hessen" msgstr "هسن" msgid "Mecklenburg-Vorpommern" msgstr "مكليمبورغ-فوربومرن" msgid "Niedersachsen" msgstr "نيدرزاكسن" msgid "Nordrhein-westfalen" msgstr "نوردراين-فيستفالن" msgid "Rheinland-Pfalz" msgstr "راينلاند-بفالز" msgid "Saarland" msgstr "زارلاند" msgid "Sachsen-Anhalt" msgstr "زاكسن-أنهلت" msgid "Sachsen" msgstr "ساكسونيا" msgid "Schleswig-Holstein" msgstr "شليسفيغ - هولشتاين" msgid "Thueringen" msgstr "تورينغن" msgid "Mallorca" msgstr "مايوركا" msgid "Galicia" msgstr "غاليسيا" msgid "Scandinavia" msgstr "سكندينافيا" msgid "England" msgstr "بريطانيا" msgid "Buckinghamshire" msgstr "باكينجهامشير" msgid "Cambridgeshire" msgstr "كامبريدجشاير" msgid "Cumbria" msgstr "كمبريا" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "هيريفوردشاير" msgid "Kent" msgstr "كنت" msgid "Lancashire" msgstr "لانكشاير" msgid "Leicestershire" msgstr "لايسسترشاير" msgid "Norfolk" msgstr "نورفولك" msgid "Nottinghamshire" msgstr "نوتينغمشاير" msgid "Oxfordshire" msgstr "أوكسفوردشاير" msgid "Shropshire" msgstr "شروبشاير" msgid "Somerset" msgstr "سومرست" msgid "South yorkshire" msgstr "يوركشاير الجنوبية" msgid "Suffolk" msgstr "سوفولك" msgid "Surrey" msgstr "سورّي" msgid "Wiltshire" msgstr "ويلتشايرر" msgid "Scotland" msgstr "أسكتلندا" msgid "Wales" msgstr "ويلز" msgid "Crete" msgstr "كريتا" msgid "North America" msgstr "أمريكا الشمالية" msgid "Alaska" msgstr "ألاسكا" msgid "Hawaii" msgstr "هاواي" msgid "USA" msgstr "الوﻻيات المتحدة الامريكية" msgid " (except Alaska and Hawaii)" msgstr " (بدون ألاسكا و هاواي)" msgid "Midwest" msgstr "وسط الغرب" msgid "Michigan" msgstr "ميشيغان" msgid "Ohio" msgstr "أوهايو" msgid "Northeast" msgstr "الشمال الشرقي" msgid "Massachusetts" msgstr "ماساتشوستس" msgid "Vermont" msgstr "فيرمونت" msgid "Pacific" msgstr "المحيط الهادئ" msgid "South" msgstr "الجنوب" msgid "Arkansas" msgstr "أركنساس" msgid "District of Columbia" msgstr "مقاطعة كولومبيا" msgid "Florida" msgstr "فلوريدا" msgid "Louisiana" msgstr "لويزيانا" msgid "Maryland" msgstr "ميريلاند" msgid "Mississippi" msgstr "ميسيسيبي" msgid "Oklahoma" msgstr "أوكلاهوما" msgid "Texas" msgstr "تكساس" msgid "Virginia" msgstr "فرجينيا" msgid "West Virginia" msgstr "غرب فيرجينيا" msgid "West" msgstr "الغرب" msgid "Arizona" msgstr "أريزونا" msgid "California" msgstr "كاليفورنيا" msgid "Colorado" msgstr "كولورادو" msgid "Idaho" msgstr "إداهو" msgid "Montana" msgstr "مونتانا" msgid "New Mexico" msgstr "نيو مكسيكو" msgid "Nevada" msgstr "نيفادا" msgid "Oregon" msgstr "أوريغون" msgid "Utah" msgstr "يوتاه" msgid "Washington State" msgstr "ولاية واشنطن" msgid "South+Middle America" msgstr "جنوب و وسط امريكا" msgid "Guyane Francaise" msgstr "غويانا الفرنسية" msgid "downloading" msgstr "يُنزّل" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "جاهز" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "لا يوجد مجال فارغ كافي" msgid "Error downloading map!" msgstr "خطأ أثناء تنزيل الخريطة!" msgid "Error writing map!" msgstr "خطأ عند كتابة الخريطة!" msgid "Map download aborted!" msgstr "تم إجهاض عملية التنزيل للخريطة !" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "زمن الوصول المتوقع" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "تنزيل الخريطة" msgid "Vehicle Position" msgstr "موقع وسيلة التنقل" msgid "Main menu" msgstr "اللائحة الرئيسية" msgid "" "Show\n" "Map" msgstr "" "أعرض\n" "الخريطة" msgid "Settings" msgstr "الإعدادات" msgid "Tools" msgstr "العدة" msgid "Route" msgstr "الطريق" msgid "About" msgstr "حوْل" msgid "Quit" msgstr "أخرج" msgid "Actions" msgstr "أفعال" msgid "" "Former\n" "Destinations" msgstr "" "الأهداف\n" "السابقة" msgid "Coordinates" msgstr "الإحداثيات" msgid "" "Stop\n" "Navigation" msgstr "قفّ" msgid "Display" msgstr "المظهار" msgid "Fullscreen" msgstr "ملء الشاشة" msgid "Window Mode" msgstr "نمط النافذة" msgid "Description" msgstr "الوصف" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "حالة القمر الأصطناعي" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "خيل/فرس" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "نعم" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "نافيت بدء التشغيل" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "مرحبا بك على نافيت" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "موافق" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "المعلومات الإضافية" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "تقريب" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "تبعيد" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "نزل الخرائط" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "أخرج من نافيت" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "النسخ الاحتياطي والاستعادة" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "حذف هذه الخريطة ؟" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "جاري التنزيل:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "خطأ عند تنزيل الخريطة." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "تم إجهاض عملية تنزيل الخريطة" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "الخرائط المحتوية على الموقع الحالي" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "البحث عن عنوان" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "أدخل الهدف" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "جاري البحث..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "لم يعثر على العنوان" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "جاري الحصول على نتائج البحث" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "جاري تحميل نتائج البحث" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "لم يتم العثور على نتائج" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "لم يتم إدخال أي نص" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "جاري تعيين الإتجاه إلى:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "اختر فعلاَ" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "الرجاء إدخال رقيقة أس دي" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "جاري النسخ الإحتياطي" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "جاري الإستعادة" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "فشل النسخ الإحتياطي" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "لم يعثر على نسخ إحتياطي" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "فشلت في الإستعادة" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "اكتمل النسخ الإحتياطي بنجاح" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "لم يعثر على النسخة الإحطياتية" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "إختر النسخ الإحتياطي" #. Android resource: @strings/backup msgid "Backup" msgstr "حفظ احتياطي" #. Android resource: @strings/restore msgid "Restore" msgstr "استعادة" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "ثم أخرج من المستديرة عند الــ%1$s %2$s" navit-0.5.0+dfsg.1/po/ast.po.in000066400000000000000000001227211264204753600161030ustar00rootroot00000000000000# Asturian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Xuacu Saturio https://launchpad.net/~xuacusk8 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Xuacu Saturio \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: ast\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando dende'l direutoriu fonte.\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "Conseñando '%s' como '%s'.\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "cero-ésimu" msgid "first" msgstr "primeru" msgid "second" msgstr "segundu" msgid "third" msgstr "terceru" msgid "fourth" msgstr "cuartu" msgid "fifth" msgstr "quintu" msgid "sixth" msgstr "sestu" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "cero-ésima salida" msgid "first exit" msgstr "primera salida" msgid "second exit" msgstr "segunda salida" msgid "third exit" msgstr "tercera salida" msgid "fourth exit" msgstr "cuarta salida" msgid "fifth exit" msgstr "quinta salida" msgid "sixth exit" msgstr "sesta salida" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "en %d metros" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d quilómetros" #, c-format msgid "in %d.%d kilometers" msgstr "en %d,%d quilómetros" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un quilómetru" msgstr[1] "%d quilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "nun quilómetru" msgstr[1] "en %d quilómetros" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "pal enllaz" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s pa la cai %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s pal %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s pa la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s pal %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s pa la %s" msgid "When possible, please turn around" msgstr "Cuando seya posible, de la vuelta" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Siga pela carretera los siguientes %s" msgid "Enter the roundabout soon" msgstr "Entre ceo na rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Dexe la rotonda pola %1$s %2$s" msgid "soon" msgstr "aína" msgid "now" msgstr "agora" msgid "then" msgstr "llueu" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Tome la salida %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "drecha" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "izquierda" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "selemente " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "enforma " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tome la carretera %1$s dica %2$s" #, c-format msgid "after %i roads" msgstr "tres %i carreteres" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Xire %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "llueu de la vuelta" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "De la vuelta %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "llueu de la vuelta" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "De la vuelta %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "siga" msgid "then you have reached your destination." msgstr "entós llegará al destín." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Llegó al destín %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Salida" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posición" msgid "Command" msgstr "Comandu" msgid "Length" msgstr "Llonxitú" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tiempu" msgid "Destination Length" msgstr "Distancia del destín" msgid "Destination Time" msgstr "Tiempu a destín" msgid "Roadbook" msgstr "Llibru de ruta" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Conseñar como posición" msgid "Set as destination" msgstr "Conseñar como destín" msgid "Add as bookmark" msgstr "Amestar marcador" #, c-format msgid "Point 0x%x 0x%x" msgstr "Puntu 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coord. pantalla : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emiratos Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afganistán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua y Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Holandeses" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Islles Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaiyán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "San Bartolomé" #. 060 msgid "Bermuda" msgstr "Bermudas" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhután" #. 074 msgid "Bouvet Island" msgstr "Islla Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorrusia" #. 084 msgid "Belize" msgstr "Belice" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Islles Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, República Democrática del" #. 140 msgid "Central African Republic" msgstr "República Centroafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suiza" #. 384 msgid "Cote d'Ivoire" msgstr "Costa de Marfil" #. 184 msgid "Cook Islands" msgstr "Islles Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camerún" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Islla Christmas" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Checa" #. 276 msgid "Germany" msgstr "Alemania" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Argelia" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Exiptu" #. 732 msgid "Western Sahara" msgstr "Sáhara Occidental" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "España" #. 231 msgid "Ethiopia" msgstr "Etiopía" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiyi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Islles Falkland (Malvines)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Estaos Federaos de" #. 234 msgid "Faroe Islands" msgstr "Islles Feroe" #. 250 msgid "France" msgstr "Francia" #. 266 msgid "Gabon" msgstr "Gabón" #. 826 msgid "United Kingdom" msgstr "Reinu Xuníu" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Xeorxia" #. 254 msgid "French Guiana" msgstr "Guyana Francesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Xibraltar" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Ecuatorial" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Islles Georgia del Sur y Sandwich del sur" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Islla Heard ya Islles McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croacia" #. 332 msgid "Haiti" msgstr "Haití" #. 348 msgid "Hungary" msgstr "Hungría" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Islla de Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Territoriu Oceánicu de la India Británica" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irán, República Islámica de" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Xordania" #. 392 msgid "Japan" msgstr "Xapón" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirguistán" #. 116 msgid "Cambodia" msgstr "Camboya" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts y Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea, República Popular Democrática de" #. 410 msgid "Korea, Republic of" msgstr "Corea, República de" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Islles Caimán" #. 398 msgid "Kazakhstan" msgstr "Kazakhstán" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, República Popular Democrática de" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Llucía" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marruecos" #. 492 msgid "Monaco" msgstr "Mónaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia, República de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Parte Francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Islles Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, antigua República Yugoslava de" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Islles Marianes del Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricio" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malasia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nueva Caledonia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Islla Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Holanda" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nueva Zelanda" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinesia Francesa" #. 598 msgid "Papua New Guinea" msgstr "Papúa Nueva Guinea" #. 608 msgid "Philippines" msgstr "Filipines" #. 586 msgid "Pakistan" msgstr "Paquistán" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre y Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina, Territoriu Ocupáu" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunión" #. 642 msgid "Romania" msgstr "Rumanía" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federación Rusa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudí" #. 090 msgid "Solomon Islands" msgstr "Islles Sólomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudán" #. 752 msgid "Sweden" msgstr "Suecia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard y Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslovaquia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leona" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Santo Tomé y Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "República Árabe de Siria" #. 748 msgid "Swaziland" msgstr "Suazilandia" #. 796 msgid "Turks and Caicos Islands" msgstr "Islles Caicos y Turks" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "Territorios Franceses del Sur" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "Tayikistán" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Oriental" #. 795 msgid "Turkmenistan" msgstr "Turkmenistán" #. 788 msgid "Tunisia" msgstr "Túnez" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquía" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad y Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Provincia de China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, República Xunía de" #. 804 msgid "Ukraine" msgstr "Ucrania" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Islles Perifériques Menores d'Estaos Xuníos" #. 840 msgid "United States" msgstr "Estaos Xuníos" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbequistán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sede (Ciudá Estáu del Vaticanu)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "San Vicente y les Granadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Islles Vírxenes, Britániques" #. 850 msgid "Virgin Islands, U.S." msgstr "Islles Vírxenes, EE.XX." #. 704 msgid "Viet Nam" msgstr "Viet Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis y Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sudáfrica" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabue" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconocíes, amestar etiquetes is_in a eses ciudaes" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Puntu del mapa" msgid "Car" msgstr "Coche" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Ciudá" msgid "District" msgstr "Distritu" msgid "Street" msgstr "Cai" msgid "Number" msgstr "Númberu" msgid "Enter Destination" msgstr "Escribir destín" msgid "Zip Code" msgstr "Códigu postal" msgid "City" msgstr "Ciudá" msgid "District/Township" msgstr "Distritu/Barriu" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destín" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Amosar" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Destinos anteriores" msgid "_Bookmarks" msgstr "Marcadores" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Disposición" msgid "_Projection" msgstr "Proyeición" msgid "_Vehicle" msgstr "Vehiculu" msgid "Zoom_Out" msgstr "Amenorgar" msgid "Decrease zoom level" msgstr "Amenorgar el nivel d'ampliación" msgid "Zoom_In" msgstr "Aumentar" msgid "Increase zoom level" msgstr "Aumentar el nivel d'ampliación" msgid "_Recalculate" msgstr "Recalcular" msgid "Redraw map" msgstr "Redibuxar el mapa" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Abre'l diálogu de guetar direición" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Parar navegación" msgid "Test" msgstr "Probar" msgid "_Quit" msgstr "_Colar" msgid "Quit the application" msgstr "Colar de l'aplicación" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Arcoxar carretera" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Conmuta la orientación del mapa al norte o al vehículu" msgid "_Roadbook" msgstr "Llibru de ruta" msgid "Show/hide route description" msgstr "Amosar/anubrir la descripción de la ruta" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Activar/desactivar el cambéu automáticu del nivel d'ampliación" msgid "_Fullscreen" msgstr "Pantalla completa" msgid "Data" msgstr "Datos" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Non" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d TED" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 TED" msgid "Help" msgstr "Aida" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ver nel navegador" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Cais" msgid "House numbers" msgstr "Númberos de portal" msgid "View Attributes" msgstr "Ver atributos" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "PDIs" msgid "View on map" msgstr "Ver nel mapa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Cortar marcador" msgid "Copy Bookmark" msgstr "Copiar marcador" msgid "Rename Bookmark" msgstr "Renomar marcador" msgid "Paste Bookmark" msgstr "Apegar marcador" msgid "Delete Bookmark" msgstr "Desaniciar marcador" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Marcadores" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Amestar carpeta de marcadores" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Apegar marcador" #, c-format msgid "Bookmark %s" msgstr "Marcador %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Amosar estáu de satélite" msgid " Elevation " msgstr " Altor " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Amosar datos NMEA" msgid "car" msgstr "coche" msgid "bike" msgstr "bici" msgid "pedestrian" msgstr "peatón" #, c-format msgid "Current profile: %s" msgstr "Perfil actual: %s" #, c-format msgid "Change profile to: %s" msgstr "Camudar perfil a: %s" msgid "Set as active" msgstr "Conseñar como activo" msgid "Show Satellite status" msgstr "Amosar estáu de satélite" msgid "Show NMEA data" msgstr "Amosar datos NMEA" msgid "Add Bookmark" msgstr "Amestar marcador" msgid "Rename" msgstr "Renomar" msgid "About Navit" msgstr "Tocante a Navit" #. Authors msgid "By" msgstr "Por" #. Contributors msgid "And all the Navit Team" msgstr "Y tou l'equipu de Navit" msgid "members and contributors." msgstr "miembros y collaboradores." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehiculu" msgid "Rules" msgstr "Regles" msgid "Lock on road" msgstr "Arcoxar a carretera" msgid "Northing" msgstr "Llatitú" msgid "Map follows Vehicle" msgstr "El mapa sigue al vehículu" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapes" msgid "Layout" msgstr "Disposición" msgid "Height Profile" msgstr "Perfil d'altures" msgid "Route Description" msgstr "Descripción de ruta" msgid "Show Locale" msgstr "Amosar local" msgid "Former Destinations" msgstr "Destinos anteriores" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mensax" msgid "Back" msgstr "Atrás" msgid "Back to map" msgstr "Tornar al mapa" msgid "Main Menu" msgstr "Menú principal" msgid "House number" msgstr "Númberu de portal" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posición del vehículu" msgid "Main menu" msgstr "Menú principal" msgid "" "Show\n" "Map" msgstr "" "Ver\n" "Mapa" msgid "Settings" msgstr "Axustes" msgid "Tools" msgstr "Ferramientes" msgid "Route" msgstr "Ruta" msgid "About" msgstr "Tocante a" msgid "Quit" msgstr "Colar" msgid "Actions" msgstr "Aiciones" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "Navegación" msgid "Display" msgstr "Amosar" msgid "Fullscreen" msgstr "Pantalla completa" msgid "Window Mode" msgstr "Mou ventana" msgid "Description" msgstr "Descripción" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "caballu" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "llueu dexe la rotonda pola %1$s %2$s" navit-0.5.0+dfsg.1/po/be.po.in000066400000000000000000001264041264204753600157040ustar00rootroot00000000000000# Belarusian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Anatoli Putseyeu https://launchpad.net/~st-shadow-by # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Belarusian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "Language: be\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "першы" msgid "second" msgstr "другі" msgid "third" msgstr "трэці" msgid "fourth" msgstr "чацьверты" msgid "fifth" msgstr "пяты" msgid "sixth" msgstr "шосты" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "першы выхад" msgid "second exit" msgstr "другі выхад" msgid "third exit" msgstr "трэці выхад" msgid "fourth exit" msgstr "чацвёрты выхад" msgid "fifth exit" msgstr "пяты выхад" msgid "sixth exit" msgstr "шосты выхад" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d метраў" #, c-format msgid "in %d meters" msgstr "праз %d метраў" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d кіламетраў" #, c-format msgid "in %d.%d kilometers" msgstr "праз %d.%d кіламетраў" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d кіламетр" msgstr[1] "%d кіламетраў" msgstr[2] "%d кіламетраў" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "Развярніцеся, калі будзе магчымасць" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "скора" msgid "now" msgstr "зараз" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "направа" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "налева" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "мацней " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Развярніцеся %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Развярніцеся %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Выхад" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Размяшчэнне" msgid "Command" msgstr "" msgid "Length" msgstr "Працягласць" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Час" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "Дадаць як закладку" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Злучаныя Арабскія Эміраты" #. 004 msgid "Afghanistan" msgstr "Афганістан" #. 028 msgid "Antigua and Barbuda" msgstr "Антыгуа і Барбуда" #. 660 msgid "Anguilla" msgstr "Ангілья" #. 008 msgid "Albania" msgstr "Албанія" #. 051 msgid "Armenia" msgstr "Арменія" #. 530 msgid "Netherlands Antilles" msgstr "Нідэрландскія Антыльскія астравы" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктыда" #. 032 msgid "Argentina" msgstr "Аргенціна" #. 016 msgid "American Samoa" msgstr "Усходняе Самоа" #. 040 msgid "Austria" msgstr "Аўстрыя" #. 036 msgid "Australia" msgstr "Аўстралія" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Аландскія астравы" #. 031 msgid "Azerbaijan" msgstr "Азербайджан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Боснія і Герцагавіна" #. 052 msgid "Barbados" msgstr "Барбадас" #. 050 msgid "Bangladesh" msgstr "Бангладэш" #. 056 msgid "Belgium" msgstr "Бельгія" #. 854 msgid "Burkina Faso" msgstr "Буркіна Фасо" #. 100 msgid "Bulgaria" msgstr "Балгарыя" #. 048 msgid "Bahrain" msgstr "Бахрэйн" #. 108 msgid "Burundi" msgstr "Бурундзі" #. 204 msgid "Benin" msgstr "Бенін" #. 652 msgid "Saint Barthelemy" msgstr "Сэнт-Бартелеми" #. 060 msgid "Bermuda" msgstr "Бэрмудзкія астравы" #. 096 msgid "Brunei Darussalam" msgstr "Брунэй Даруссалам" #. 068 msgid "Bolivia" msgstr "Балівія" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразілія" #. 044 msgid "Bahamas" msgstr "Багамскія астравы" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Востраў Буве" #. 072 msgid "Botswana" msgstr "Батсвана" #. 112 msgid "Belarus" msgstr "Беларусь" #. 084 msgid "Belize" msgstr "Бэліз" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Какосавыя (Кілінг) астравы" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Дэмакратычная Рэспубліка Конга" #. 140 msgid "Central African Republic" msgstr "Цэнтральнаафрыканская Рэспубліка" #. 178 msgid "Congo" msgstr "Конга" #. 756 msgid "Switzerland" msgstr "Швейцарыя" #. 384 msgid "Cote d'Ivoire" msgstr "Кот д'Івуар" #. 184 msgid "Cook Islands" msgstr "Астравы Кука" #. 152 msgid "Chile" msgstr "Чылі" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Кітай" #. 170 msgid "Colombia" msgstr "Калумбія" #. 188 msgid "Costa Rica" msgstr "Коста Рыка" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Каба Вэрдэ" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Востраў Раства" #. 196 msgid "Cyprus" msgstr "Кіпр" #. 203 msgid "Czech Republic" msgstr "Чэшская рэспубліка" #. 276 msgid "Germany" msgstr "Германія" #. 262 msgid "Djibouti" msgstr "Джыбуці" #. 208 msgid "Denmark" msgstr "Данія" #. 212 msgid "Dominica" msgstr "Дамініка" #. 214 msgid "Dominican Republic" msgstr "Дамініканская Рэспубліка" #. 012 msgid "Algeria" msgstr "Алжыр" #. 218 msgid "Ecuador" msgstr "Эквадор" #. 233 msgid "Estonia" msgstr "Эстонія" #. 818 msgid "Egypt" msgstr "Егіпет" #. 732 msgid "Western Sahara" msgstr "Заходняя Сахара" #. 232 msgid "Eritrea" msgstr "Эрытрэя" #. 724 msgid "Spain" msgstr "Іспанія" #. 231 msgid "Ethiopia" msgstr "Эфіопія" #. 246 msgid "Finland" msgstr "Фінляндыя" #. 242 msgid "Fiji" msgstr "Фіджы" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фальклендзкія (Мальвінскія) астравы" #. 583 msgid "Micronesia, Federated States of" msgstr "Фэдэратыўныя Штаты Мікранэзіі" #. 234 msgid "Faroe Islands" msgstr "Фарэрскія астравы" #. 250 msgid "France" msgstr "Францыя" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Вялікабрытанія" #. 308 msgid "Grenada" msgstr "Грэнада" #. 268 msgid "Georgia" msgstr "Грузія" #. 254 msgid "French Guiana" msgstr "Французская Гвіяна" #. 831 msgid "Guernsey" msgstr "Гернсі" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гібралтар" #. 304 msgid "Greenland" msgstr "Грэнландыя" #. 270 msgid "Gambia" msgstr "Гамбія" #. 324 msgid "Guinea" msgstr "Гвінея" #. 312 msgid "Guadeloupe" msgstr "Гвадэлупа" #. 226 msgid "Equatorial Guinea" msgstr "Экватарыяльная Гвінея" #. 300 msgid "Greece" msgstr "Грэцыя" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Паўднёвая Джорджыя і Паўднёвыя Сэндвічавыя выспы" #. 320 msgid "Guatemala" msgstr "Гватэмала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвінея-Бісаў" #. 328 msgid "Guyana" msgstr "Гаяна" #. 344 msgid "Hong Kong" msgstr "Ганконг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Востраў Херд і астравы МакДональд" #. 340 msgid "Honduras" msgstr "Гандурас" #. 191 msgid "Croatia" msgstr "Харватыя" #. 332 msgid "Haiti" msgstr "Гаіці" #. 348 msgid "Hungary" msgstr "Венгрыя" #. 360 msgid "Indonesia" msgstr "Інданэзія" #. 372 msgid "Ireland" msgstr "Ірландыя" #. 376 msgid "Israel" msgstr "Ізраіль" #. 833 msgid "Isle of Man" msgstr "Востраў Мэн" #. 356 msgid "India" msgstr "Індыя" #. 086 msgid "British Indian Ocean Territory" msgstr "Брытанская тэрыторыя ў Індыйскім акіяне" #. 368 msgid "Iraq" msgstr "Ірак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Ісламская Рэспубліка Іран" #. 352 msgid "Iceland" msgstr "Ісландыя" #. 380 msgid "Italy" msgstr "Італія" #. 832 msgid "Jersey" msgstr "Джэрсі" #. 388 msgid "Jamaica" msgstr "Ямайка" #. 400 msgid "Jordan" msgstr "Іарданія" #. 392 msgid "Japan" msgstr "Японія" #. 404 msgid "Kenya" msgstr "Кенія" #. 417 msgid "Kyrgyzstan" msgstr "Кыргыстан" #. 116 msgid "Cambodia" msgstr "Камбоджа" #. 296 msgid "Kiribati" msgstr "Кірыбаці" #. 174 msgid "Comoros" msgstr "Каморскія астравы" #. 659 msgid "Saint Kitts and Nevis" msgstr "Сэнт-Кітс і Нэвіс" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Карэйская Народна-Дэмакратычная Рэспубліка" #. 410 msgid "Korea, Republic of" msgstr "Рэспубліка Карэя" #. 414 msgid "Kuwait" msgstr "Кувейт" #. 136 msgid "Cayman Islands" msgstr "Кайманавы астравы" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаоская Народна-Дэмакратычная Рэспубліка" #. 422 msgid "Lebanon" msgstr "Ліван" #. 662 msgid "Saint Lucia" msgstr "Сэнт-Люсія" #. 438 msgid "Liechtenstein" msgstr "Ліхтэнштайн" #. 144 msgid "Sri Lanka" msgstr "Шры-Ланка" #. 430 msgid "Liberia" msgstr "Ліберыя" #. 426 msgid "Lesotho" msgstr "Лесота" #. 440 msgid "Lithuania" msgstr "Літва" #. 442 msgid "Luxembourg" msgstr "Люксембург" #. 428 msgid "Latvia" msgstr "Латвія" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Марока" #. 492 msgid "Monaco" msgstr "Манака" #. 498 msgid "Moldova, Republic of" msgstr "Малдова, Рэспубліка" #. 499 msgid "Montenegro" msgstr "Чарнагорыя" #. 663 msgid "Saint Martin (French part)" msgstr "Сэнт-Марцін (французская частка)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалавы астравы" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македонія, былая Югаслаўская рэспубліка" #. 466 msgid "Mali" msgstr "Малі" #. 104 msgid "Myanmar" msgstr "М'янма" #. 496 msgid "Mongolia" msgstr "Манголія" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Паўночныя Марыянскія астравы" #. 474 msgid "Martinique" msgstr "Марцініка" #. 478 msgid "Mauritania" msgstr "Маўрытанія" #. 500 msgid "Montserrat" msgstr "Мансэрат" #. 470 msgid "Malta" msgstr "Мальта" #. 480 msgid "Mauritius" msgstr "Маўрыкій" #. 462 msgid "Maldives" msgstr "Мальдыўскія астравы" #. 454 msgid "Malawi" msgstr "Малаві" #. 484 msgid "Mexico" msgstr "Мексіка" #. 458 msgid "Malaysia" msgstr "Малайзія" #. 508 msgid "Mozambique" msgstr "Мазамбік" #. 516 msgid "Namibia" msgstr "Намібія" #. 540 msgid "New Caledonia" msgstr "Новая Каледонія" #. 562 msgid "Niger" msgstr "Нігер" #. 574 msgid "Norfolk Island" msgstr "Востраў Норфалк" #. 566 msgid "Nigeria" msgstr "Нігерыя" #. 558 msgid "Nicaragua" msgstr "Нікарагуа" #. 528 msgid "Netherlands" msgstr "Нідэрланды" #. 578 msgid "Norway" msgstr "Нарвегія" #. 524 msgid "Nepal" msgstr "Нэпал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ніуе" #. 554 msgid "New Zealand" msgstr "Новая Зеландыя" #. 512 msgid "Oman" msgstr "Аман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Французская Палінезія" #. 598 msgid "Papua New Guinea" msgstr "Папуа–Новая Гвінэя" #. 608 msgid "Philippines" msgstr "Філіпіны" #. 586 msgid "Pakistan" msgstr "Пакістан" #. 616 msgid "Poland" msgstr "Польшча" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Сэнт-П'ер і Мікелон" #. 612 msgid "Pitcairn" msgstr "Піткэрн" #. 630 msgid "Puerto Rico" msgstr "Пуэрта Рыка" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестынская тэрыторыя, акупаваная" #. 620 msgid "Portugal" msgstr "Партугалія" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвай" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Рэюньён" #. 642 msgid "Romania" msgstr "Румынія" #. 688 msgid "Serbia" msgstr "Сербія" #. 643 msgid "Russian Federation" msgstr "Расійская Федэрацыя" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудаўская Аравія" #. 090 msgid "Solomon Islands" msgstr "Саламонавы Астравы" #. 690 msgid "Seychelles" msgstr "Сейшэльскія астравы" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Швецыя" #. 702 msgid "Singapore" msgstr "Сінгапур" #. 654 msgid "Saint Helena" msgstr "Востраў Святой Елены" #. 705 msgid "Slovenia" msgstr "Славенія" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Шпіцбэрген і Ян-Майен" #. 703 msgid "Slovakia" msgstr "Славакія" #. 694 msgid "Sierra Leone" msgstr "Сьера-Леонэ" #. 674 msgid "San Marino" msgstr "Сан-Марына" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Самалі" #. 740 msgid "Suriname" msgstr "Сурынам" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Сан-Томе і Прынсыпі" #. 222 msgid "El Salvador" msgstr "Сальвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Сірыйская Арабская Рэспубліка" #. 748 msgid "Swaziland" msgstr "Свазіленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Астравы Тэркс і Кайкас" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Французскія Паўднёвыя Тэрыторыі" #. 768 msgid "Togo" msgstr "Тога" #. 764 msgid "Thailand" msgstr "Тайланд" #. 762 msgid "Tajikistan" msgstr "Таджыкістан" #. 772 msgid "Tokelau" msgstr "Такелаў" #. 626 msgid "Timor-Leste" msgstr "Тымор-Лестэ" #. 795 msgid "Turkmenistan" msgstr "Туркменістан" #. 788 msgid "Tunisia" msgstr "Туніс" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турцыя" #. 780 msgid "Trinidad and Tobago" msgstr "Трынідад і Табага" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Кітайская правінцыя Тайвань" #. 834 msgid "Tanzania, United Republic of" msgstr "Злучаная Рэспубліка Танзанія" #. 804 msgid "Ukraine" msgstr "Украіна" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Знешнія Малыя Астравы (ЗША)" #. 840 msgid "United States" msgstr "Злучаныя Штаты Амерыкі" #. 858 msgid "Uruguay" msgstr "Уругвай" #. 860 msgid "Uzbekistan" msgstr "Узбекістан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ватыкан (Папскі Пасад)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Сэнт-Вінсэнт і Грэнадзіны" #. 862 msgid "Venezuela" msgstr "Венесуэла" #. 092 msgid "Virgin Islands, British" msgstr "Віргінскія астравы (Брытанія)" #. 850 msgid "Virgin Islands, U.S." msgstr "Віргінскія астравы (ЗША)" #. 704 msgid "Viet Nam" msgstr "В'етнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Астравы Уоліс і Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Емен" #. 175 msgid "Mayotte" msgstr "Маёта" #. 710 msgid "South Africa" msgstr "Паўднёва-Афрыканская Рэспубліка" #. 894 msgid "Zambia" msgstr "Замбія" #. 716 msgid "Zimbabwe" msgstr "Зімбабвэ" msgid "* Unknown, add is_in tags to those cities" msgstr "Невядома, дадайце is_in тэгі да гэтых гарадоў" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Аўтамабіль" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Краіна" msgid "Postal" msgstr "" msgid "Town" msgstr "Горад" msgid "District" msgstr "Раён" msgid "Street" msgstr "Вуліца" msgid "Number" msgstr "Нумар" msgid "Enter Destination" msgstr "Увядзіце пункт прызначэння" msgid "Zip Code" msgstr "Паштовы індэкс" msgid "City" msgstr "Горад" msgid "District/Township" msgstr "" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "Прызначэнне" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "Праверка" msgid "_Quit" msgstr "_Quit" msgid "Quit the application" msgstr "Выхад з дастасаваньня" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "Дадзеныя" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Не" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Даведка" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Вуліцы" msgid "House numbers" msgstr "Нумары дамоў" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "Праглядзець на мапе" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "Перайменаваць закладку" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "Выдаліць закладку" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Закладкі" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Паказаць статус спадарожнікаў" msgid " Elevation " msgstr " Вышыня " msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Паказаць дадзеныя NMEA" msgid "car" msgstr "аўтамабіль" msgid "bike" msgstr "веласіпед" msgid "pedestrian" msgstr "пешаход" #, c-format msgid "Current profile: %s" msgstr "Бягучы профіль: %s" #, c-format msgid "Change profile to: %s" msgstr "Змяніць профіль: %s" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "Дадаць закладку" msgid "Rename" msgstr "Перайменаваць" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "Правілы" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Мапы" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Паведамленне" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Назад на мапу" msgid "Main Menu" msgstr "Галоўнае меню" msgid "House number" msgstr "Нумар дому" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "Налады" msgid "Tools" msgstr "Інструменты" msgid "Route" msgstr "Шлях" msgid "About" msgstr "Аб праграме" msgid "Quit" msgstr "Выйсці" msgid "Actions" msgstr "Дзеянні" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "Поўнаэкранны рэжым" msgid "Window Mode" msgstr "" msgid "Description" msgstr "Апісанне" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/bg.po.in000066400000000000000000001324201264204753600157010ustar00rootroot00000000000000# Bulgarian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Alex Stanev https://launchpad.net/~realender # Alexander Atanasov https://launchpad.net/~aatanasov # Anton Todorov https://launchpad.net/~antod # Lyudmil Bonev https://launchpad.net/~bonev-j # MalamiR https://launchpad.net/~mamut-killer msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Alex Stanev \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: bg\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулев" msgid "first" msgstr "първи" msgid "second" msgstr "втори" msgid "third" msgstr "трети" msgid "fourth" msgstr "четвърти" msgid "fifth" msgstr "пети" msgid "sixth" msgstr "шести" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "няма изход" msgid "first exit" msgstr "първия изход" msgid "second exit" msgstr "втория изход" msgid "third exit" msgstr "третия изход" msgid "fourth exit" msgstr "четвъртия изход" msgid "fifth exit" msgstr "петия изход" msgid "sixth exit" msgstr "шестия изход" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d метра" #, c-format msgid "in %d meters" msgstr "след %d метра" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d километра" #, c-format msgid "in %d.%d kilometers" msgstr "след %d.%d километра" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "един километър" msgstr[1] "%d километра" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "след един километър" msgstr[1] "след %d километра" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "на рампата" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sпо улица %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sпо улица %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sпо улица %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sпо улица %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "Когато е възможно обърнете" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Следвайте пътя през следващите %s" msgid "Enter the roundabout soon" msgstr "Скоро навлизате в кръгово" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Навлизате в кръгово %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Излезте от кръговото на %1$s %2$s" msgid "soon" msgstr "скоро" msgid "now" msgstr "сега" msgid "then" msgstr "след това" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "надясно" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "наляво" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "леко " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "силно " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Тръгнете по %1$s път към %2$s" #, c-format msgid "after %i roads" msgstr "след %i пресечки" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Завийте %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "след това обърнете" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Обърнете %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "след това обърнете" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Обърнете %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "след това пристигате на местоназначението" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Достигнахте до целта %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Изход" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиция" msgid "Command" msgstr "Команда" msgid "Length" msgstr "Дължина" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Време" msgid "Destination Length" msgstr "Разстояние до целта" msgid "Destination Time" msgstr "Време до целта" msgid "Roadbook" msgstr "Пътна книга" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Установете като позиция" msgid "Set as destination" msgstr "Задай като цел" msgid "Add as bookmark" msgstr "Добави като Отметка" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Координати на екрана: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Обединени Арабски Емирства" #. 004 msgid "Afghanistan" msgstr "Афганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигуа и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангуила" #. 008 msgid "Albania" msgstr "Албания" #. 051 msgid "Armenia" msgstr "Армения" #. 530 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аржентина" #. 016 msgid "American Samoa" msgstr "Американска Самоа" #. 040 msgid "Austria" msgstr "Австрия" #. 036 msgid "Australia" msgstr "Австралия" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Айландски Острови" #. 031 msgid "Azerbaijan" msgstr "Азърбайджан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Белгия" #. 854 msgid "Burkina Faso" msgstr "Буркина Фасо" #. 100 msgid "Bulgaria" msgstr "България" #. 048 msgid "Bahrain" msgstr "Бахрейн" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Сен Бартелми" #. 060 msgid "Bermuda" msgstr "Бермудски острови" #. 096 msgid "Brunei Darussalam" msgstr "Бруней" #. 068 msgid "Bolivia" msgstr "Боливия" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразилия" #. 044 msgid "Bahamas" msgstr "Бахамски острови" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Остров Буве" #. 072 msgid "Botswana" msgstr "Ботсвана" #. 112 msgid "Belarus" msgstr "Беларус" #. 084 msgid "Belize" msgstr "Белийз" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосови Острови" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Демократична Република Конго" #. 140 msgid "Central African Republic" msgstr "Централна Африканска Република" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швейцария" #. 384 msgid "Cote d'Ivoire" msgstr "Кот Д'Ивоар" #. 184 msgid "Cook Islands" msgstr "Острови Кук" #. 152 msgid "Chile" msgstr "Чили" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Китай" #. 170 msgid "Colombia" msgstr "Колумбия" #. 188 msgid "Costa Rica" msgstr "Коста Рика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кейп Верде" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Коледни острови" #. 196 msgid "Cyprus" msgstr "Кипър" #. 203 msgid "Czech Republic" msgstr "Чешка република" #. 276 msgid "Germany" msgstr "Германия" #. 262 msgid "Djibouti" msgstr "Джибути" #. 208 msgid "Denmark" msgstr "Дания" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканска Република" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естония" #. 818 msgid "Egypt" msgstr "Египет" #. 732 msgid "Western Sahara" msgstr "Западна Сахара" #. 232 msgid "Eritrea" msgstr "Еритрея" #. 724 msgid "Spain" msgstr "Испания" #. 231 msgid "Ethiopia" msgstr "Етиопия" #. 246 msgid "Finland" msgstr "Финландия" #. 242 msgid "Fiji" msgstr "Фиджи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендски Острови (Малвини)" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронезия, Обединени щати" #. 234 msgid "Faroe Islands" msgstr "Острови Фаро" #. 250 msgid "France" msgstr "Франция" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Обединеното Кралство" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузия" #. 254 msgid "French Guiana" msgstr "Френска Гвиана" #. 831 msgid "Guernsey" msgstr "Гърнси" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренландия" #. 270 msgid "Gambia" msgstr "Гамбия" #. 324 msgid "Guinea" msgstr "Гвинея" #. 312 msgid "Guadeloupe" msgstr "Гваделупа" #. 226 msgid "Equatorial Guinea" msgstr "Екваториална Гвинея" #. 300 msgid "Greece" msgstr "Гърция" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Южна Джорджия и Южни Сандвичеви острови" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинея-Бисау" #. 328 msgid "Guyana" msgstr "Гаяна" #. 344 msgid "Hong Kong" msgstr "Хонг Конг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Острови Хърд и МакДоналд" #. 340 msgid "Honduras" msgstr "Хондурас" #. 191 msgid "Croatia" msgstr "Хърватска" #. 332 msgid "Haiti" msgstr "Хаити" #. 348 msgid "Hungary" msgstr "Унгария" #. 360 msgid "Indonesia" msgstr "Индонезия" #. 372 msgid "Ireland" msgstr "Ирландия" #. 376 msgid "Israel" msgstr "Израел" #. 833 msgid "Isle of Man" msgstr "Остров Ман" #. 356 msgid "India" msgstr "Индия" #. 086 msgid "British Indian Ocean Territory" msgstr "Британска територия в Индийския океан" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Ислямска република" #. 352 msgid "Iceland" msgstr "Исландия" #. 380 msgid "Italy" msgstr "Италия" #. 832 msgid "Jersey" msgstr "Джърси (остров)" #. 388 msgid "Jamaica" msgstr "Ямайка" #. 400 msgid "Jordan" msgstr "Йордания" #. 392 msgid "Japan" msgstr "Япония" #. 404 msgid "Kenya" msgstr "Кения" #. 417 msgid "Kyrgyzstan" msgstr "Киргизстан" #. 116 msgid "Cambodia" msgstr "Камбоджа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Комори" #. 659 msgid "Saint Kitts and Nevis" msgstr "Сейнт Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Корея, Демократична народна република" #. 410 msgid "Korea, Republic of" msgstr "Корея, Република" #. 414 msgid "Kuwait" msgstr "Кувейт" #. 136 msgid "Cayman Islands" msgstr "Кайманови острови" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаоска народнодемократична република" #. 422 msgid "Lebanon" msgstr "Ливан" #. 662 msgid "Saint Lucia" msgstr "Сейнт Лусия" #. 438 msgid "Liechtenstein" msgstr "Лихтенщайн" #. 144 msgid "Sri Lanka" msgstr "Шри Ланка" #. 430 msgid "Liberia" msgstr "Либерия" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литва" #. 442 msgid "Luxembourg" msgstr "Люксембург" #. 428 msgid "Latvia" msgstr "Латвия" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Мароко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдова, Република" #. 499 msgid "Montenegro" msgstr "Черна гора" #. 663 msgid "Saint Martin (French part)" msgstr "Свети Мартин (френска част)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалови острови" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македония, Бивша Югославска Република" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мианмарският съюз" #. 496 msgid "Mongolia" msgstr "Монголия" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Северни Мариански острови" #. 474 msgid "Martinique" msgstr "Мартиника" #. 478 msgid "Mauritania" msgstr "Мавритания" #. 500 msgid "Montserrat" msgstr "Монсерат" #. 470 msgid "Malta" msgstr "Малта" #. 480 msgid "Mauritius" msgstr "Мавриций" #. 462 msgid "Maldives" msgstr "Малдивски острови" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексико" #. 458 msgid "Malaysia" msgstr "Малайзия" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибия" #. 540 msgid "New Caledonia" msgstr "Нова Каледония" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Остров Норфолк" #. 566 msgid "Nigeria" msgstr "Нигерия" #. 558 msgid "Nicaragua" msgstr "Никарагуа" #. 528 msgid "Netherlands" msgstr "Кралство Холандия" #. 578 msgid "Norway" msgstr "Кралство Норвегия" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ниуе" #. 554 msgid "New Zealand" msgstr "Нова Зеландия" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Френска Полинезия" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинея" #. 608 msgid "Philippines" msgstr "Филипини" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Полша" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Свети Пиер и Микелон" #. 612 msgid "Pitcairn" msgstr "Острови Питкерн" #. 630 msgid "Puerto Rico" msgstr "Пуерто Рико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестинска територия, Окупирана" #. 620 msgid "Portugal" msgstr "Португалия" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвай" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реюнион" #. 642 msgid "Romania" msgstr "Румъния" #. 688 msgid "Serbia" msgstr "Сърбия" #. 643 msgid "Russian Federation" msgstr "Руска Федерация" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудитска Арабия" #. 090 msgid "Solomon Islands" msgstr "Соломонови острови" #. 690 msgid "Seychelles" msgstr "Сейшелски о-ви" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Швеция" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Света Елена" #. 705 msgid "Slovenia" msgstr "Словения" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Шпицберген и Ян Майен" #. 703 msgid "Slovakia" msgstr "Словакия" #. 694 msgid "Sierra Leone" msgstr "Сиера Леоне" #. 674 msgid "San Marino" msgstr "Сан Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалия" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принсипи" #. 222 msgid "El Salvador" msgstr "Ел Салвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Сирийска Арабска Република" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Острови Тюрк и Кайкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Френски Южни Територии" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Тайланд" #. 762 msgid "Tajikistan" msgstr "Таджикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Източен Тимор" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турция" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тайван, Китайска провинция" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзания, Обединена република" #. 804 msgid "Ukraine" msgstr "Украйна" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Малки далечни острови на САЩ" #. 840 msgid "United States" msgstr "Съединени Амеркански Щати" #. 858 msgid "Uruguay" msgstr "Уругвай" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ватикана" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Сейнт Винсънт и Гренадини" #. 862 msgid "Venezuela" msgstr "Венецуела" #. 092 msgid "Virgin Islands, British" msgstr "Британски Вирджински острови" #. 850 msgid "Virgin Islands, U.S." msgstr "Американски Вирджински острови" #. 704 msgid "Viet Nam" msgstr "Виетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Уолис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Йемен" #. 175 msgid "Mayotte" msgstr "Майот" #. 710 msgid "South Africa" msgstr "Република Южна Африка" #. 894 msgid "Zambia" msgstr "Замбия" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "* Неизвестен, добавете is_in осм тагове за тези градове" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карта" msgid "Car" msgstr "Автомобил" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "Държава" msgid "Postal" msgstr "Пощенски" msgid "Town" msgstr "Град" msgid "District" msgstr "Окръг" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Номер" msgid "Enter Destination" msgstr "Въведете мостоназначение" msgid "Zip Code" msgstr "Пощенски код" msgid "City" msgstr "Град" msgid "District/Township" msgstr "Община" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Отметка" msgid "Destination" msgstr "Местоназначение" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Показване" msgid "_Route" msgstr "Маршрут" msgid "_Former Destinations" msgstr "Предишни Местоназначения" msgid "_Bookmarks" msgstr "Отметки" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Изглед" msgid "_Projection" msgstr "Проекция" msgid "_Vehicle" msgstr "Превозно средство" msgid "Zoom_Out" msgstr "Отдалечи" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Приближи" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Преизчисляване" msgid "Redraw map" msgstr "Опресни картата" msgid "_Info" msgstr "Информация" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Отваря прозорец Търсене на адрес" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Спри Навигацията" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Изход" msgid "Quit the application" msgstr "Изход от приложението" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Придържай към пътя" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Пътна книга" msgid "Show/hide route description" msgstr "Покажи/скрий детайлите на маршрута" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "Разреши/забрани смяната на нивото на увеличение" msgid "_Fullscreen" msgstr "Цял екран" msgid "Data" msgstr "Данни" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "С" msgid "NE" msgstr "СИ" msgid "E" msgstr "И" msgid "SE" msgstr "ЮИ" msgid "S" msgstr "Ю" msgid "SW" msgstr "ЮЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Маршрут %4.0fкм %02d:%02d ОВП" msgid "Route 0000km 0+00:00 ETA" msgstr "Маршрут 0000fкм 0+00:00 ОВП" msgid "Help" msgstr "Помощ" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Виж в Браузър" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улици" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "Виж Атрибутите" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "Виж на картата" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Отметки" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Отметка %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Покажи Състояние на Сателити" msgid " Elevation " msgstr " Височина " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Покажи NMEA Данни" msgid "car" msgstr "автомобил" msgid "bike" msgstr "колело" msgid "pedestrian" msgstr "пешеходец" #, c-format msgid "Current profile: %s" msgstr "Текущ профил: %s" #, c-format msgid "Change profile to: %s" msgstr "Смени профил на: %s" msgid "Set as active" msgstr "Укажи като активен" msgid "Show Satellite status" msgstr "Покажи състояние на Сателити" msgid "Show NMEA data" msgstr "Покажи NMEA Данни" msgid "Add Bookmark" msgstr "Добави отметка" msgid "Rename" msgstr "Преименувай" msgid "About Navit" msgstr "За Navit" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Превозно средство" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Показвай на пътя" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "Картата следва Автомобила" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Карти" msgid "Layout" msgstr "Изглед" msgid "Height Profile" msgstr "Височинен профил" msgid "Route Description" msgstr "Описание на маршрута" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Предишни Местоназначения" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Съобщение" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Обратно към картата" msgid "Main Menu" msgstr "Основно меню" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Позиция на автомобил" msgid "Main menu" msgstr "Главно меню" msgid "" "Show\n" "Map" msgstr "" "Покажи\n" "Картата" msgid "Settings" msgstr "Настройки" msgid "Tools" msgstr "Инструменти" msgid "Route" msgstr "Маршрут" msgid "About" msgstr "Относно" msgid "Quit" msgstr "Излез" msgid "Actions" msgstr "Действия" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Спри\n" "Навигацията" msgid "Display" msgstr "Показване" msgid "Fullscreen" msgstr "Цял екран" msgid "Window Mode" msgstr "Режим Прозорец" msgid "Description" msgstr "Описание" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "кон" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "след това излезте от кръговото на %1$s %2$s" navit-0.5.0+dfsg.1/po/bs.po.in000066400000000000000000001106671264204753600157260ustar00rootroot00000000000000# Bosnian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Kenan https://launchpad.net/~kahrickenan # Michael von Glasow https://launchpad.net/~michael-vonglasow msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "Language: bs\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "postavke '%s' do '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulti" msgid "first" msgstr "prvi" msgid "second" msgstr "drugi" msgid "third" msgstr "treći" msgid "fourth" msgstr "četvrti" msgid "fifth" msgstr "peti" msgid "sixth" msgstr "šesti" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulti postojeći" msgid "first exit" msgstr "prvi izlaz" msgid "second exit" msgstr "drugi izlaz" msgid "third exit" msgstr "treći izlaz" msgid "fourth exit" msgstr "četveti izlaz" msgid "fifth exit" msgstr "peti izlaz" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metara" #, c-format msgid "in %d meters" msgstr "u %d metara" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometara" #, c-format msgid "in %d.%d kilometers" msgstr "u %d.%d kilometara" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometar" msgstr[1] "%d kilometara" msgstr[2] "%d kilometara" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "u %d kilometru" msgstr[1] "u %d kilometara" msgstr[2] "u %d kilometara" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "u rampu" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Izlaz" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/ca.po.in000066400000000000000000001244461264204753600157050ustar00rootroot00000000000000# Catalan translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Ferran Roig https://launchpad.net/~ferro9 # Frans https://launchpad.net/~francesc-galbany # Joan Montané https://launchpad.net/~jmontane # KaZeR https://launchpad.net/~kazer # Marc Coll Carrillo https://launchpad.net/~marc-coll-carrillo # Sergi Gomis https://launchpad.net/~paloky3 # Xevib https://launchpad.net/~xbarnada # beamspot https://launchpad.net/~benrouravkg # juliwoodbcn https://launchpad.net/~julianlozano # kualsevol https://launchpad.net/~ojuanv # peremayol@gmail.com https://launchpad.net/~peremayol msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Sergi Gomis \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: ca\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "S'està executant des del directori arrel\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "s'està establint '%s' a '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zeroèssim" msgid "first" msgstr "primera" msgid "second" msgstr "segona" msgid "third" msgstr "tercera" msgid "fourth" msgstr "quarta" msgid "fifth" msgstr "cinquena" msgid "sixth" msgstr "sisena" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "sortida zero" msgid "first exit" msgstr "primera sortida" msgid "second exit" msgstr "segona sortida" msgid "third exit" msgstr "tercera sortida" msgid "fourth exit" msgstr "quarta sortida" msgid "fifth exit" msgstr "cinquena sortida" msgid "sixth exit" msgstr "sisena sortida" #, c-format msgid "%d feet" msgstr "%d peus" #, c-format msgid "in %d feet" msgstr "en %d peus" #, c-format msgid "%d.%d miles" msgstr "%d.%d milles" #, c-format msgid "in %d.%d miles" msgstr "en %d.%d milles" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "una milla" msgstr[1] "%d milles" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "en una milla" msgstr[1] "en %d milles" #, c-format msgid "%d meters" msgstr "%d metres" #, c-format msgid "in %d meters" msgstr "d'aquí a %d metres" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d quilòmetres" #, c-format msgid "in %d.%d kilometers" msgstr "d'aquí a %d,%d quilòmetres" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un quilòmetre" msgstr[1] "%d quilòmetres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "d'aquí a un quilòmetre" msgstr[1] "d'aquí a %d quilòmetres" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sal carrer %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sal %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sa la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sa %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%scap a la %s" msgid "When possible, please turn around" msgstr "Quan sigui possible, doneu mitja volta" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "cap a %s" #, c-format msgid "Follow the road for the next %s" msgstr "Seguiu per la carretera durant els propers %s" msgid "Enter the roundabout soon" msgstr "Entreu a la rotonda vinent" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Entreu a la rotonda %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Deixeu la rotonda a la %1$s %2$s" msgid "soon" msgstr "aviat" msgid "now" msgstr "ara" msgid "then" msgstr "aleshores" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "a l'esquerra" msgid "on your right" msgstr "a la dreta" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Preneu la sortida %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Preneu la sortida %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "a l'intersecció" msgid "at exit" msgstr "a la sortida" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "dreta" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "esquerra" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "fàcilment " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "fortament " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Preneu el %1$s carrer a la %2$s" #, c-format msgid "after %i roads" msgstr "després de %i carrers" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Gireu %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "després, doneu mitja volta" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Doneu mitja volta %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "després, doneu mitja volta" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Doneu mitja volta %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "seguiu" msgid "then you have reached your destination." msgstr "aleshores heu arribat a destí" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Heu arribat a la destinació %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Intersecció" msgid "Exit" msgstr "Sortida" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posició" msgid "Command" msgstr "Ordre" msgid "Length" msgstr "Durada" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Temps" msgid "Destination Length" msgstr "Distància fins a destinació" msgid "Destination Time" msgstr "Temps fins a destinació" msgid "Roadbook" msgstr "Full de ruta" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "Visitar abans..." msgid "Set as position" msgstr "Estableix com a posició" msgid "Set as destination" msgstr "Estableix com a destinació" msgid "Add as bookmark" msgstr "Afegeix a les adreces d'interès" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordenades de pantalla : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Unió dels Emirats Àrabs" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albània" #. 051 msgid "Armenia" msgstr "Armènia" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Holandeses" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antàrtida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Àustria" #. 036 msgid "Australia" msgstr "Austràlia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Illes Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaitjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bòsnia i Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bèlgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgària" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benín" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthélemy" #. 060 msgid "Bermuda" msgstr "Illes Bermudes" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahames" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Illa Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorússia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canadà" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Illes Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, República Democràtica del" #. 140 msgid "Central African Republic" msgstr "República Centreafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suïssa" #. 384 msgid "Cote d'Ivoire" msgstr "Costa d'Ivori" #. 184 msgid "Cook Islands" msgstr "Illes Cook" #. 152 msgid "Chile" msgstr "Xile" #. 120 msgid "Cameroon" msgstr "Camerun" #. 156 msgid "China" msgstr "Xina" #. 170 msgid "Colombia" msgstr "Colòmbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cap Verd" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Illa Christmas" #. 196 msgid "Cyprus" msgstr "Xipre" #. 203 msgid "Czech Republic" msgstr "República Txeca" #. 276 msgid "Germany" msgstr "Alemanya" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Algèria" #. 218 msgid "Ecuador" msgstr "Equador" #. 233 msgid "Estonia" msgstr "Estònia" #. 818 msgid "Egypt" msgstr "Egipte" #. 732 msgid "Western Sahara" msgstr "Sàhara Occidental" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Espanya" #. 231 msgid "Ethiopia" msgstr "Etiòpia" #. 246 msgid "Finland" msgstr "Finlàndia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Illes Malvines" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronèsia, Estats Federats de" #. 234 msgid "Faroe Islands" msgstr "Illes Fèroe" #. 250 msgid "France" msgstr "França" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Regne Unit" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Geòrgia" #. 254 msgid "French Guiana" msgstr "Guaiana Francesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenlàndia" #. 270 msgid "Gambia" msgstr "Gàmbia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Equatorial" #. 300 msgid "Greece" msgstr "Grècia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Illes Geòrgia del Sud i Sandwich del Sud" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Illa Heard i Illes McDonald" #. 340 msgid "Honduras" msgstr "Hondures" #. 191 msgid "Croatia" msgstr "Croàcia" #. 332 msgid "Haiti" msgstr "Haití" #. 348 msgid "Hungary" msgstr "Hongria" #. 360 msgid "Indonesia" msgstr "Indonèsia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Illa de Man" #. 356 msgid "India" msgstr "Índia" #. 086 msgid "British Indian Ocean Territory" msgstr "Territori britànic de l'oceà Índic" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Islàndia" #. 380 msgid "Italy" msgstr "Itàlia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamàica" #. 400 msgid "Jordan" msgstr "Jordània" #. 392 msgid "Japan" msgstr "Japó" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirguizistan" #. 116 msgid "Cambodia" msgstr "Cambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts i Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea del Nord" #. 410 msgid "Korea, Republic of" msgstr "Corea del Sud" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Illes Caiman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Líban" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libèria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituània" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Letònia" #. 434 msgid "Libya" msgstr "Líbia" #. 504 msgid "Morocco" msgstr "Marroc" #. 492 msgid "Monaco" msgstr "Mònaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldàvia" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint-Martin (zona francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Illes Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedònia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongòlia" #. 446 msgid "Macao" msgstr "Macau" #. 580 msgid "Northern Mariana Islands" msgstr "Illes Marianes del nord" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritània" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Maurici" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mèxic" #. 458 msgid "Malaysia" msgstr "Malàisia" #. 508 msgid "Mozambique" msgstr "Moçambic" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nova Caledònia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Illa Norfolk" #. 566 msgid "Nigeria" msgstr "Nigèria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Països Baixos" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Zelanda" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panamà" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinèsia francesa" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Guinea" #. 608 msgid "Philippines" msgstr "Filipines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polònia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre i Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina (territori ocupat)" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Illa de la Reunió" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Sèrbia" #. 643 msgid "Russian Federation" msgstr "Rússia" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Aràbia Saudita" #. 090 msgid "Solomon Islands" msgstr "Illes Salomó" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suècia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovènia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard i Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslovàquia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somàlia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Sudan del Sud" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé i Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Síria" #. 748 msgid "Swaziland" msgstr "Swazilàndia" #. 796 msgid "Turks and Caicos Islands" msgstr "Illes Turks i Caicos" #. 148 msgid "Chad" msgstr "Txad" #. 260 msgid "French Southern Territories" msgstr "Territoris francesos del sud" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailàndia" #. 762 msgid "Tajikistan" msgstr "Tadjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Oriental" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunísia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinitat i Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzània" #. 804 msgid "Ukraine" msgstr "Ucraïna" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Illes perifèriques menors dels Estats Units" #. 840 msgid "United States" msgstr "Estats Units d'Amèrica" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ciutat del Vaticà" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent i les Grenadines" #. 862 msgid "Venezuela" msgstr "Veneçuela" #. 092 msgid "Virgin Islands, British" msgstr "Illes Verges Britàniques" #. 850 msgid "Virgin Islands, U.S." msgstr "Illes Verges Nord-americanes" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis i Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Iemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sud-àfrica" #. 894 msgid "Zambia" msgstr "Zàmbia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconegut, afegiu etiquetes is_in a aquestes ciutats" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "No s'ha trobat l'arxiu de configuració navit.xml, navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "Usant l'arxiu de configuració '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punt del mapa" msgid "Car" msgstr "Cotxe" msgid "Iso2" msgstr "iso2" msgid "Iso3" msgstr "iso3" msgid "Country" msgstr "Estat" msgid "Postal" msgstr "Codi postal" msgid "Town" msgstr "Població" msgid "District" msgstr "Districte" msgid "Street" msgstr "Adreça" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Introduïu una destinació" msgid "Zip Code" msgstr "Codi postal" msgid "City" msgstr "Ciutat" msgid "District/Township" msgstr "Districte/Municipi" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Adreça d'interès" msgid "Destination" msgstr "Destinació" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Pantalla" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Destinacions anteriors" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Disposició" msgid "_Projection" msgstr "Projecció" msgid "_Vehicle" msgstr "Vehicle" msgid "Zoom_Out" msgstr "Allunya" msgid "Decrease zoom level" msgstr "Allunya el zoom" msgid "Zoom_In" msgstr "Apropa" msgid "Increase zoom level" msgstr "Apropa el zoom" msgid "_Recalculate" msgstr "Recalcula" msgid "Redraw map" msgstr "Torna a dibuixar el mapa" msgid "_Info" msgstr "Informació" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Obre el diàleg de cercar adreces" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Atura la navegació" msgid "Test" msgstr "Prova" msgid "_Quit" msgstr "_Surt" msgid "Quit the application" msgstr "Surt de l'aplicació" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Alterna l'orientació del mapa cap al nord o cap al vehicle" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "Mostra/amaga la descripció de la ruta" msgid "_Autozoom" msgstr "Zoom automàtic" msgid "Enable/disable automatic zoom level changing" msgstr "Activar/desactivar zoom automàtic" msgid "_Fullscreen" msgstr "Pantalla completa" msgid "Data" msgstr "Dades" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "Jutjats" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d TEA" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 TEA" msgid "Help" msgstr "Ajuda" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Visualitza al navegador" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Carrers" msgid "House numbers" msgstr "Números de casa/portal" msgid "View Attributes" msgstr "Visualitza els atributs" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Punts d'interès" msgid "View on map" msgstr "Visualitza al mapa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Retalla el punt" msgid "Copy Bookmark" msgstr "Copia el punt" msgid "Rename Bookmark" msgstr "Canvia el nom de l'adreça d'interès" msgid "Paste Bookmark" msgstr "Enganxa el punt" msgid "Delete Bookmark" msgstr "Elimina l'adreça d'interès" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Adreces d'interés" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Afegeix carpeta de punts" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Enganxa el punt" #, c-format msgid "Bookmark %s" msgstr "Afegeix %s a les adreces d'interès" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Mostra l'estat del satèl·lit" msgid " Elevation " msgstr " Elevació " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Mostra les dades NMEA" msgid "car" msgstr "cotxe" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "vianant" #, c-format msgid "Current profile: %s" msgstr "Perfil actual: %s" #, c-format msgid "Change profile to: %s" msgstr "Canvia el perfil a: %s" msgid "Set as active" msgstr "Habilita" msgid "Show Satellite status" msgstr "Mostra l'estat del satèl·lit" msgid "Show NMEA data" msgstr "Mostra les dades NMEA" msgid "Add Bookmark" msgstr "Afegeix a les adreces d'interès" msgid "Rename" msgstr "Reanomena" msgid "About Navit" msgstr "Quant a Navit" #. Authors msgid "By" msgstr "Per" #. Contributors msgid "And all the Navit Team" msgstr "I tots els membres i col·laboradors" msgid "members and contributors." msgstr "de l'equip del Navit." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicle" msgid "Rules" msgstr "Regles" msgid "Lock on road" msgstr "Centra't a la carretera" msgid "Northing" msgstr "Orientació sempre al nord" msgid "Map follows Vehicle" msgstr "El mapa segueix el vehicle" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapes" msgid "Layout" msgstr "Disposició" msgid "Height Profile" msgstr "Perfil d'alçada" msgid "Route Description" msgstr "Descripció de la ruta" msgid "Show Locale" msgstr "Mostra la localitat" msgid "Former Destinations" msgstr "Destinacions anteriors" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Missatge" msgid "Back" msgstr "Enrere" msgid "Back to map" msgstr "Torna al mapa" msgid "Main Menu" msgstr "Menú principal" msgid "House number" msgstr "Número de casa/portal" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posició del vehicle" msgid "Main menu" msgstr "Menú principal" msgid "" "Show\n" "Map" msgstr "" "Mostra\n" "Mapa" msgid "Settings" msgstr "Configuració" msgid "Tools" msgstr "Eines" msgid "Route" msgstr "Ruta" msgid "About" msgstr "Quant a..." msgid "Quit" msgstr "Surt" msgid "Actions" msgstr "Accions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Atura la\n" "Navegació" msgid "Display" msgstr "Pantalla" msgid "Fullscreen" msgstr "Pantalla completa" msgid "Window Mode" msgstr "Mode de la finestra" msgid "Description" msgstr "Descripció" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cavall" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "aleshores deixeu la rotonda a la %1$s %2$s" navit-0.5.0+dfsg.1/po/ckb.po.in000066400000000000000000001077641264204753600160650ustar00rootroot00000000000000# Kurdish (Sorani) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # kosar https://launchpad.net/~kosar-belana msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2013-06-22 23:00+0000\n" "Last-Translator: kosar \n" "Language-Team: Kurdish (Sorani) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: ckb\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "یەكەم" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/cs.po.in000066400000000000000000001351531264204753600157240ustar00rootroot00000000000000# Čeština translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # 72ka https://launchpad.net/~2hp # Aleš Janda https://launchpad.net/~kyblicek # Ivan Kološ https://launchpad.net/~ivan-kolos # Jakuje https://launchpad.net/~jakuje # MMlosh https://launchpad.net/~mmlosh # Mike Crash https://launchpad.net/~mike-mikecrash # T.lama https://launchpad.net/~klacl # Tomas Kukol https://launchpad.net/~tomas-kukol # Vaclav Cerny https://launchpad.net/~vatoz # Vladimír Burian https://launchpad.net/~vburian # Vojtěch Látal https://launchpad.net/~vojtik # stritek https://launchpad.net/~stritek # talmik https://launchpad.net/~mikatom msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Jakuje \n" "Language-Team: Čeština\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Language: cs\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Běží ze zdrojového adresáře\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nastavuji '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nultý" msgid "first" msgstr "první" msgid "second" msgstr "druhý" msgid "third" msgstr "třetí" msgid "fourth" msgstr "čtvrtý" msgid "fifth" msgstr "pátý" msgid "sixth" msgstr "šestý" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nultý výjezd" msgid "first exit" msgstr "první výjezd" msgid "second exit" msgstr "druhý výjezd" msgid "third exit" msgstr "třetí výjezd" msgid "fourth exit" msgstr "čtvrtý výjezd" msgid "fifth exit" msgstr "pátý výjezd" msgid "sixth exit" msgstr "šestý výjezd" #, c-format msgid "%d feet" msgstr "%d stop" #, c-format msgid "in %d feet" msgstr "za %d stop" #, c-format msgid "%d.%d miles" msgstr "%d.%d mílí" #, c-format msgid "in %d.%d miles" msgstr "za %d.%d mílí" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d míle" msgstr[1] "%d míle" msgstr[2] "%d mílí" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "za %d míli" msgstr[1] "za %d míle" msgstr[2] "za %d mílí" #, c-format msgid "%d meters" msgstr "%d metrů" #, c-format msgid "in %d meters" msgstr "za %d metrů" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrů" #, c-format msgid "in %d.%d kilometers" msgstr "za %d.%d kilometrů" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometr" msgstr[1] "%d kilometry" msgstr[2] "%d kilometrů" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "za %d kilometr" msgstr[1] "za %d kilometry" msgstr[2] "za %d kilometrů" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$sna %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$sna %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sna %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sna %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sna %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "na přivadeč" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sdo %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sdo %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sdo %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sdo %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sna %s" msgid "When possible, please turn around" msgstr "Až to bude možné, otočte se" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Pokračujte po cestě dalších %s" msgid "Enter the roundabout soon" msgstr "Brzy najeďte na kruhový objezd" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Sjeďte na %1$s %2$s" msgid "soon" msgstr "brzy" msgid "now" msgstr "nyní" msgid "then" msgstr "pak" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "vpravo" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "vlevo" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "mírně " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "silně " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Jeďte na %1$s silnici %2$s" #, c-format msgid "after %i roads" msgstr "za %i silnice" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Zabočte %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "pak otočte se" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Otočte se %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "pak otočte se" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Otočte se %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "pak budete v cíli." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "%s dorazíte do cíle" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Ukončit" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Poloha" msgid "Command" msgstr "Příkaz" msgid "Length" msgstr "Délka" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Čas" msgid "Destination Length" msgstr "Cílová vzdálenost" msgid "Destination Time" msgstr "Cílový čas" msgid "Roadbook" msgstr "Itinerář" #, c-format msgid "Waypoint %d" msgstr "Bod trasy %d" msgid "Visit before..." msgstr "Navštívit nejdříve..." msgid "Set as position" msgstr "Použít jako pozici" msgid "Set as destination" msgstr "Nastavit jako cíl" msgid "Add as bookmark" msgstr "Použít jako záložku" #, c-format msgid "Point 0x%x 0x%x" msgstr "Bod 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Souřadnice obrazovky: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Spojené arabské emiráty" #. 004 msgid "Afghanistan" msgstr "Afghánistán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua a Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albánie" #. 051 msgid "Armenia" msgstr "Arménie" #. 530 msgid "Netherlands Antilles" msgstr "Nizozemské Antily" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Americká Samoa" #. 040 msgid "Austria" msgstr "Rakousko" #. 036 msgid "Australia" msgstr "Austrálie" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ålandy" #. 031 msgid "Azerbaijan" msgstr "Ázerbájdžán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna a Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladéš" #. 056 msgid "Belgium" msgstr "Belgie" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulharsko" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Svatý Bartoloměj" #. 060 msgid "Bermuda" msgstr "Bermudy" #. 096 msgid "Brunei Darussalam" msgstr "Brunej" #. 068 msgid "Bolivia" msgstr "Bolívie" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Svatý Eustach a Saba" #. 076 msgid "Brazil" msgstr "Brazílie" #. 044 msgid "Bahamas" msgstr "Bahamy" #. 064 msgid "Bhutan" msgstr "Bhútán" #. 074 msgid "Bouvet Island" msgstr "Bouvetův ostrov" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bělorusko" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosové (Keelingovy) ostrovy" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, demokratická republika" #. 140 msgid "Central African Republic" msgstr "Středoafrická republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švýcarsko" #. 384 msgid "Cote d'Ivoire" msgstr "Pobřeží slonoviny" #. 184 msgid "Cook Islands" msgstr "Cookovy ostrovy" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Čína" #. 170 msgid "Colombia" msgstr "Kolumbie" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kapverdy" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Vánoční ostrov" #. 196 msgid "Cyprus" msgstr "Kypr" #. 203 msgid "Czech Republic" msgstr "Česká republika" #. 276 msgid "Germany" msgstr "Německo" #. 262 msgid "Djibouti" msgstr "Džibutsko" #. 208 msgid "Denmark" msgstr "Dánsko" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikánská republika" #. 012 msgid "Algeria" msgstr "Alžírsko" #. 218 msgid "Ecuador" msgstr "Ekvádor" #. 233 msgid "Estonia" msgstr "Estonsko" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Západní Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Španělsko" #. 231 msgid "Ethiopia" msgstr "Etiopie" #. 246 msgid "Finland" msgstr "Finsko" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandy (Malvíny)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronésie, federativní státy" #. 234 msgid "Faroe Islands" msgstr "Faerské ostrovy" #. 250 msgid "France" msgstr "Francie" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Spojené království" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzie" #. 254 msgid "French Guiana" msgstr "Francouzská Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grónsko" #. 270 msgid "Gambia" msgstr "Gambie" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Rovníková Guinea" #. 300 msgid "Greece" msgstr "Řecko" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Jižní Georgie a Jižní Sandwichovy ostrovy" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hongkong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardův a McDonaldovy ostrovy" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Chorvatsko" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Maďarsko" #. 360 msgid "Indonesia" msgstr "Indonésie" #. 372 msgid "Ireland" msgstr "Irsko" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Ostrov Man" #. 356 msgid "India" msgstr "Indie" #. 086 msgid "British Indian Ocean Territory" msgstr "Britské indickooceánské území" #. 368 msgid "Iraq" msgstr "Irák" #. 364 msgid "Iran, Islamic Republic of" msgstr "Írán, islámská republika" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Itálie" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordánsko" #. 392 msgid "Japan" msgstr "Japonsko" #. 404 msgid "Kenya" msgstr "Keňa" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstán" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komory" #. 659 msgid "Saint Kitts and Nevis" msgstr "Svatý Kryštof a Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korejská lidově demokratická republika" #. 410 msgid "Korea, Republic of" msgstr "Korejská republika" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanské ostrovy" #. 398 msgid "Kazakhstan" msgstr "Kazachstán" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoská lidově demokratická republika" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Svatá Lucie" #. 438 msgid "Liechtenstein" msgstr "Lichtenštejnsko" #. 144 msgid "Sri Lanka" msgstr "Srí Lanka" #. 430 msgid "Liberia" msgstr "Libérie" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litva" #. 442 msgid "Luxembourg" msgstr "Lucembursko" #. 428 msgid "Latvia" msgstr "Lotyšsko" #. 434 msgid "Libya" msgstr "Libye" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavská republika" #. 499 msgid "Montenegro" msgstr "Černá Hora" #. 663 msgid "Saint Martin (French part)" msgstr "Svatý Martin (francouzská část)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallovy ostrovy" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonie, bývalá jugoslávská republika" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolsko" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Severní Mariany" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mauritánie" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricius" #. 462 msgid "Maldives" msgstr "Maledivy" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malajsie" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibie" #. 540 msgid "New Caledonia" msgstr "Nová Kaledonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkský ostrov" #. 566 msgid "Nigeria" msgstr "Nigérie" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Nizozemsko" #. 578 msgid "Norway" msgstr "Norsko" #. 524 msgid "Nepal" msgstr "Nepál" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nový Zéland" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francouzská Polynésie" #. 598 msgid "Papua New Guinea" msgstr "Papua Nová Guinea" #. 608 msgid "Philippines" msgstr "Filipíny" #. 586 msgid "Pakistan" msgstr "Pákistán" #. 616 msgid "Poland" msgstr "Polsko" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Svatý Pierre a Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairnovy ostrovy" #. 630 msgid "Puerto Rico" msgstr "Portoriko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinské území, okupované" #. 620 msgid "Portugal" msgstr "Portugalsko" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Rumunsko" #. 688 msgid "Serbia" msgstr "Srbsko" #. 643 msgid "Russian Federation" msgstr "Ruská federace" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saúdská Arábie" #. 090 msgid "Solomon Islands" msgstr "Šalamounovy ostrovy" #. 690 msgid "Seychelles" msgstr "Seychely" #. 736 msgid "Sudan" msgstr "Súdán" #. 752 msgid "Sweden" msgstr "Švédsko" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Svatá Helena" #. 705 msgid "Slovenia" msgstr "Slovinsko" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Špicberky a Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovensko" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somálsko" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Jižní Súdán" #. 678 msgid "Sao Tome and Principe" msgstr "Svatý Tomáš a Princův ostrov" #. 222 msgid "El Salvador" msgstr "Salvádor" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Svatý Martin (nizozemská část)" #. 760 msgid "Syrian Arab Republic" msgstr "Syrská arabská republika" #. 748 msgid "Swaziland" msgstr "Svazijsko" #. 796 msgid "Turks and Caicos Islands" msgstr "Ostrovy Turks a Caicos" #. 148 msgid "Chad" msgstr "Čad" #. 260 msgid "French Southern Territories" msgstr "Francouzská jižní a antarktická území" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thajsko" #. 762 msgid "Tajikistan" msgstr "Tádžikistán" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Východní Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistán" #. 788 msgid "Tunisia" msgstr "Tunisko" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turecko" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad a Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tchaj-wan, provincie Číny" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanie, sjednocená republika" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Drobné odlehlé ostrovy Spojených států" #. 840 msgid "United States" msgstr "Spojené státy" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Svatý stolec (Vatikánský městský stát)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Svatý Vincenc a Grenadiny" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britské Panenské ostrovy" #. 850 msgid "Virgin Islands, U.S." msgstr "Americké Panenské ostrovy" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu (Nové Hebridy)" #. 876 msgid "Wallis and Futuna" msgstr "Wallis a Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Jihoafrická republika" #. 894 msgid "Zambia" msgstr "Zambie" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Není známo, přidejte is_in atributy do těchto měst" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Nenalezen konfigurační soubor navit.xml a navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Chyba při zpracování konfiguračního souboru '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Používáte konfigurační soubor '% s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Chyba: Nenalezena žádná konfigurace v konfiguračním souboru '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Interní selhání inicializace, končím. Zkontrolujte předchozí chybové " "zprávy.\n" msgid "unknown street" msgstr "neznámá ulice" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Nepojmenované vozidlo" msgid "Failed to write bookmarks file" msgstr "Nepodařilo se zapsat do souboru s záložkama" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Bod na mapě" msgid "Car" msgstr "Automobil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Země" msgid "Postal" msgstr "Poštovní" msgid "Town" msgstr "Město" msgid "District" msgstr "Kraj/Okres" msgid "Street" msgstr "Ulice" msgid "Number" msgstr "Číslo" msgid "Enter Destination" msgstr "Zadejte cíl" msgid "Zip Code" msgstr "PSČ" msgid "City" msgstr "Město" msgid "District/Township" msgstr "Kraj/Okres" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Záložka" msgid "Destination" msgstr "Cíl" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Zobrazit" msgid "_Route" msgstr "Trasa" msgid "_Former Destinations" msgstr "Minulé cíle" msgid "_Bookmarks" msgstr "Záložky" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Rozvržení" msgid "_Projection" msgstr "Projekce" msgid "_Vehicle" msgstr "Vozidlo" msgid "Zoom_Out" msgstr "Zmenšit" msgid "Decrease zoom level" msgstr "Zmenší zvětšení" msgid "Zoom_In" msgstr "Zvětšit" msgid "Increase zoom level" msgstr "Zvýší zvětšení" msgid "_Recalculate" msgstr "Přepočítat" msgid "Redraw map" msgstr "Překreslí mapu" msgid "_Info" msgstr "Informace" msgid "Set _destination" msgstr "Nastavit _cíl" msgid "Opens address search dialog" msgstr "Otevře vyhledávání adres" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "Otevře dialog vyhledávání POI" msgid "_Stop Navigation" msgstr "Přestat navigovat" msgid "Test" msgstr "Vyzkoušet" msgid "_Quit" msgstr "_Konec" msgid "Quit the application" msgstr "Zavře aplikaci" msgid "Show position _cursor" msgstr "Zobrazit pozici _kurzoru" msgid "_Lock on Road" msgstr "Jet jen po silnici" msgid "_Keep orientation to the North" msgstr "_Orientovat na sever" msgid "Switches map orientation to the north or the vehicle" msgstr "Přepíná orientaci mapy podle směru vozidla nebo severu" msgid "_Roadbook" msgstr "Itinerář" msgid "Show/hide route description" msgstr "Zobrazí/skryje popis cesty" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Povolí/zakáže automatické změny úrovně zoomu" msgid "_Fullscreen" msgstr "Celá obrazovka" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "Lékárna" msgid "Restaurant" msgstr "Restaurace" msgid "Restaurant. Fast food" msgstr "Restaurace. Rychlé občerstvení" msgid "Hotel" msgstr "Hotel" msgid "Car parking" msgstr "Parkoviště" msgid "Fuel station" msgstr "Čerpací stanice" msgid "Bank" msgstr "Banka" msgid "Hospital" msgstr "Nemocnice" msgid "Cinema" msgstr "Kino" msgid "Train station" msgstr "Vlaková stanice" msgid "School" msgstr "Škola" msgid "Police" msgstr "Policie" msgid "Justice" msgstr "" msgid "Taxi" msgstr "Taxi" msgid "Shopping" msgstr "Nakupování" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Nastav cíl na %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Posuň mapu na %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "Nastav další zastavení na %ld, %ld \n" msgid "POI search" msgstr "Vyhledávání POI" msgid "Select a category" msgstr "Vyberte kategorii" msgid "Select a distance to look for (km)" msgstr "Vyberte vzdálenost ve které hledat (km)" msgid "Select a POI" msgstr "Vyberte POI" msgid " " msgstr " " msgid "Category" msgstr "Kategorie" msgid "Direction" msgstr "Směr" msgid "Distance(m)" msgstr "Vzdálenost (m)" msgid "Name" msgstr "Název" msgid "Visit Before" msgstr "Navštívit před" msgid "N" msgstr "S" msgid "NE" msgstr "SV" msgid "E" msgstr "V" msgid "SE" msgstr "JV" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trasa %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Trasa 0000km 0+00:00 ETA" msgid "Help" msgstr "Nápověda" #, c-format msgid "Waypoint %s" msgstr "Bod trasy %s" msgid "Select waypoint to insert the new one before" msgstr "Vyberte bod trasy pro vložení nového před něho" msgid "View in Browser" msgstr "Zobrazit v prohlížeči" msgid "Item type" msgstr "Typ položky" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "Čísla domů" msgid "View Attributes" msgstr "Zobrazit atributy" msgid "Set as position (and deactivate vehicle)" msgstr "Nastavit jako polohu (a deaktivovat vozidlo)" msgid "POIs" msgstr "Body zájmu" msgid "View on map" msgstr "Zobrazit na mapě" msgid "Remove search results from the map" msgstr "Odstranit výsledky hledání z mapy" msgid "Show results on the map" msgstr "Zobrazit výsledky na mapě" msgid "Cut Bookmark" msgstr "Vyjmout záložku" msgid "Copy Bookmark" msgstr "Kopírovat záložku" msgid "Rename Bookmark" msgstr "Přejmenovat záložku" msgid "Paste Bookmark" msgstr "Vložit záložku" msgid "Delete Bookmark" msgstr "Smazat záložku" msgid "Delete waypoint" msgstr "Smazat bod trasy" msgid "Bookmarks" msgstr "Záložky" msgid "Bookmarks as waypoints" msgstr "Záložky jako body trasy" msgid "Save waypoints" msgstr "Uložit body trasy" msgid "Replace with waypoints" msgstr "Nahradit body na trase" msgid "Delete Folder" msgstr "Smazat složku" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Přidat složku záložek" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Vložit záložku" #, c-format msgid "Bookmark %s" msgstr "Záložka %s" #, c-format msgid "Download %s" msgstr "Stáhnout %s" msgid "Map Download" msgstr "Mapa ke stažení" msgid "Active" msgstr "Aktivní" msgid "Download Enabled" msgstr "Stahování povoleno" msgid "Download completely" msgstr "Stáhnuto kompletní" msgid "Show Satellite Status" msgstr "Ukázat stav satelitu" msgid " Elevation " msgstr " Převýšení " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Ukázat NMEA data" msgid "car" msgstr "auto" msgid "bike" msgstr "kolo" msgid "pedestrian" msgstr "chodec" #, c-format msgid "Current profile: %s" msgstr "Aktuální profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Změnit profil na: %s" msgid "Set as active" msgstr "Nastavit jako aktivní" msgid "Show Satellite status" msgstr "Ukázat stav satelitu" msgid "Show NMEA data" msgstr "Ukázat NMEA data" msgid "Add Bookmark" msgstr "Přidat značku" msgid "Rename" msgstr "Přejmenovat" msgid "About Navit" msgstr "O Navitu" #. Authors msgid "By" msgstr "Od" #. Contributors msgid "And all the Navit Team" msgstr "A další z Navit týmu" msgid "members and contributors." msgstr "členové a přispívající" msgid "Waypoints" msgstr "Body trasy" msgid "Enter Coordinates" msgstr "Zadejte souřadnice" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Zeměpisná délka a šířka" msgid "Enter coordinates, for example:" msgstr "Zadejte souřadnice, například:" msgid "Vehicle" msgstr "Vozidlo" msgid "Rules" msgstr "Pravidla" msgid "Lock on road" msgstr "Uchytit na cestu" msgid "Northing" msgstr "Severně" msgid "Map follows Vehicle" msgstr "Mapa sleduje vozidlo" msgid "Plan with Waypoints" msgstr "Plán s bodama trasy" msgid "Maps" msgstr "Mapy" msgid "Layout" msgstr "Rozvržení" msgid "Height Profile" msgstr "Výškový profil" msgid "Route Description" msgstr "Popis trasy" msgid "Show Locale" msgstr "Zobrazit jazyk" msgid "Former Destinations" msgstr "Minulé cíle" msgid "- No former destinations available -" msgstr "- Minulé cíle nejsou dostupné -" msgid "Message" msgstr "Zpráva" msgid "Back" msgstr "Zpět" msgid "Back to map" msgstr "Zpět na mapu" msgid "Main Menu" msgstr "Hlavní menu" msgid "House number" msgstr "Číslo domu" msgid "Next" msgstr "Další" msgid "Prev" msgstr "Předchozí" msgid "Return to route!" msgstr "Vraťte se zpět!" #. warning told msgid "Look out! Camera!" msgstr "Podívejte se! Kamera!" #. warning told msgid "Please decrease your speed" msgstr "Prosím snižte rychlost" msgid "partial match" msgstr "Částečná shoda" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Vyhledat" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Města" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Cestovat sem" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Mapová data (c) přispěvatelé OpenStreetMap, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Stažené mapy" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Storno" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Celá planeta" msgid "Africa" msgstr "Afrika" msgid "Canary Islands" msgstr "Kanárské ostrovy" msgid "Asia" msgstr "Asie" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "Spojené arabské emiráty+ostatní" msgid "Oceania" msgstr "Oceánie" msgid "Tasmania" msgstr "Tasmánie" msgid "Victoria" msgstr "Viktorie" msgid "New South Wales" msgstr "Nový Jižní Wales" msgid "Europe" msgstr "Evropa" msgid "Western Europe" msgstr "Západní Evropa" msgid "Azores" msgstr "Azory" msgid "BeNeLux" msgstr "Benelux" msgid "Alsace" msgstr "Alsasko" msgid "Aquitaine" msgstr "Akvitánie" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Dolní Normandie" msgid "Bourgogne" msgstr "Burgundsko" msgid "Bretagne" msgstr "Bretaň" msgid "Centre" msgstr "Střed" msgid "Champagne-Ardenne" msgstr "Champagne-Ardennes" msgid "Corse" msgstr "Korsika" msgid "Franche-Comte" msgstr "Franche-Comté" msgid "Haute-Normandie" msgstr "Horní Normandie" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lotrinsko" msgid "Midi-Pyrenees" msgstr "Jižní Pyreneje" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Pikardie" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provensálsko-Alpy-Azurové pobřeží" msgid "Rhone-Alpes" msgstr "Rhone-Alpy" msgid "Baden-Wuerttemberg" msgstr "Baden-Württembersko" msgid "Bayern" msgstr "Bavorsko" msgid "Mittelfranken" msgstr "Střední Franky" msgid "Niederbayern" msgstr "Dolní Bavorsko" msgid "Oberbayern" msgstr "Horní Bavorsko" msgid "Oberfranken" msgstr "Horní Franky" msgid "Oberpfalz" msgstr "Horní Falcko" msgid "Schwaben" msgstr "Švábsko" msgid "Unterfranken" msgstr "Dolní Franky" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "Braniborsko" msgid "Bremen" msgstr "Brémy" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hessensko" msgid "Mecklenburg-Vorpommern" msgstr "Meklenbursko-Pomořansko" msgid "Niedersachsen" msgstr "Dolní Sasko" msgid "Nordrhein-westfalen" msgstr "Severní Porýní-Vestfálsko" msgid "Rheinland-Pfalz" msgstr "Porýnsko-Falcko" msgid "Saarland" msgstr "Sársko" msgid "Sachsen-Anhalt" msgstr "Sasko-Anhaltsko" msgid "Sachsen" msgstr "Sasko" msgid "Schleswig-Holstein" msgstr "Šlesvicko-Holštýnsko" msgid "Thueringen" msgstr "Thueringen" msgid "Mallorca" msgstr "Mallorca" msgid "Galicia" msgstr "Galície" msgid "Scandinavia" msgstr "Skandinávie" msgid "England" msgstr "Anglie" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "Východní Yorkshire a Hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Jižní Yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Skotsko" msgid "Wales" msgstr "Wales" msgid "Crete" msgstr "Kréta" msgid "North America" msgstr "Severní Amerika" msgid "Alaska" msgstr "Aljaška" msgid "Hawaii" msgstr "Havaj" msgid "USA" msgstr "USA" msgid " (except Alaska and Hawaii)" msgstr " (mimo Aljašky a Havaje)" msgid "Midwest" msgstr "Středozápad" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Severovýchod" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Tichý oceán" msgid "South" msgstr "Jih" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Washington D.C." msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginie" msgid "West Virginia" msgstr "Západní Virginie" msgid "West" msgstr "Západ" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Kalifornie" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nové Mexico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Stát Washington" msgid "South+Middle America" msgstr "Jižní+Střední Amerika" msgid "Guyane Francaise" msgstr "Francouzská Guyana" msgid "downloading" msgstr "stahuji" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "mapa připravena" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Není dostatek volného místa" msgid "Error downloading map!" msgstr "Chyba při stahování mapy!" msgid "Error writing map!" msgstr "Chyba při zápisu mapy!" msgid "Map download aborted!" msgstr "Stahování mapy přerušeno!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Zbývající čas" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Mapa ke stažení" msgid "Vehicle Position" msgstr "Poloha vozidla" msgid "Main menu" msgstr "Hlavní menu" msgid "" "Show\n" "Map" msgstr "" "Ukázat\n" "mapu" msgid "Settings" msgstr "Nastavení" msgid "Tools" msgstr "Nástroje" msgid "Route" msgstr "Trasa" msgid "About" msgstr "O programu" msgid "Quit" msgstr "Konec" msgid "Actions" msgstr "Akce" msgid "" "Former\n" "Destinations" msgstr "" "Minulé\n" "cíle" msgid "Coordinates" msgstr "Souřadnice" msgid "" "Stop\n" "Navigation" msgstr "" "Ukonči\n" "Navigaci" msgid "Display" msgstr "Zobrazit" msgid "Fullscreen" msgstr "Celá obrazovka" msgid "Window Mode" msgstr "V okně" msgid "Description" msgstr "Popis" msgid "" "Drop last \n" "Waypoint" msgstr "" "Zrušit minulý \n" "bod trasy" msgid "" "Drop next \n" "Waypoint" msgstr "" "Zrušit příští \n" " bod trasy" msgid "Satellite Status" msgstr "Stav satelitu" msgid "NMEA Data" msgstr "NMEA Data" msgid "car_shortest" msgstr "auto nejkratší" msgid "car_avoid_tolls" msgstr "auto bez mýtného" msgid "car_pedantic" msgstr "auto puntičkářské" msgid "horse" msgstr "kůň" msgid "Truck" msgstr "kamión" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Ano" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Startuje Navit" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit běží" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Vítejte v Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Děkujeme za instalaci Navit!\n" "\n" "Pro začátek, vyberte \"Stáhnout mapy\" z menu pro stažení map. Poznámka: " "Velikost souboru map mohou být velké (>50MB) - wifi připojení je " "doporučeno.\n" "\n" "Mapdata: (c) OpenStreetMap a přispěvovatelé\n" "\n" "Užijte si Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Další informace" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Přiblížit" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Oddálit" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Stáhnout mapy" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Přepnout Body zájmu (POIs = Points of Interest)" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Ukončit Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Zálohovat / Obnovit" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Smazat tuto mapu?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Stahuji:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Chyba při stahování map." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Stahování map přerušeno" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Žádné umístění. Zkuste znovu po opravě umístění." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mapy obsahující nynější umístění" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Hledat dle adresy" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Zadejte cíl" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Shoda částí adresy" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Vyhledávám..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adresa nebyla nalezena" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Výsledky hledání" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Načítání výsledku vyhledávání" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Výsledky nenalezeny." #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Text nebyl zadán" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Nastavení cíle v:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Vyberte akci" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Prosím vložte SD kartu" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Zálohuji..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Obnovuji..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Nezdařilo se vytvořit adresář pro zálohu" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Záloha se nezdařila" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Záloha nenalezena" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Obnova se nezdařila" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Záloha byla úspěšná" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Obnova byla úspěšná.\n" "Restartujte prosím Navit." #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Záloha nenalezena" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Obnova selhala" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Vyberte zálohu" #. Android resource: @strings/backup msgid "Backup" msgstr "Zálohování" #. Android resource: @strings/restore msgid "Restore" msgstr "Obnova" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "pak sjeďte na %1$s %2$s" navit-0.5.0+dfsg.1/po/cy.po.in000066400000000000000000001105071264204753600157260ustar00rootroot00000000000000# Welsh translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Michael von Glasow https://launchpad.net/~michael-vonglasow # Padi Phillips https://launchpad.net/~padi # Simon Hewison https://launchpad.net/~simon-hewison-6 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Welsh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? " "2 : 3;\n" "Language: cy\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "allanfa gyntaf" msgid "second exit" msgstr "allanfa ail" msgid "third exit" msgstr "allanfa trydydd" msgid "fourth exit" msgstr "allanfa pedwerydd" msgid "fifth exit" msgstr "allanfa pumed" msgid "sixth exit" msgstr "allanfa chweched" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un cilometr" msgstr[1] "%d cilometr" msgstr[2] "%d cilometr" msgstr[3] "%d cilometr" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Dilynwch yr heol am y %s nesaf" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "yn fuan" msgid "now" msgstr "nawr" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "yn cryf " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Allanfa" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/da.po.in000066400000000000000000001230271264204753600157000ustar00rootroot00000000000000# Danish translation for Navit translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Fennek https://launchpad.net/~ng-fennek # Glenn https://launchpad.net/~glenn-mh-dk # Jørgen Elgaard Larsen https://launchpad.net/~jel-elgaard # Kennet https://launchpad.net/~kharpsoe # Lasse Luttermann https://launchpad.net/~lasse-luttermann # Mads Konradsen https://launchpad.net/~mads-hk # Ole Carlsen https://launchpad.net/~ole-carlsen-web # Tomas Groth https://launchpad.net/~tomasgroth # Uffe Kjems https://launchpad.net/~uffekjems msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Lasse Luttermann \n" "Language-Team: Glenn Sommer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: da\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Kører fra kildekode mappen\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "sætter '%s' til '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulte" msgid "first" msgstr "første" msgid "second" msgstr "anden" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjerde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjette" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulte afkørsel" msgid "first exit" msgstr "første afkørsel" msgid "second exit" msgstr "anden afkørsel" msgid "third exit" msgstr "tredje afkørsel" msgid "fourth exit" msgstr "fjerde afkørsel" msgid "fifth exit" msgstr "femte afkørsel" msgid "sixth exit" msgstr "sjette afkørsel" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "om %d.%d kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "én kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om én kilometer" msgstr[1] "om %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "op på rampen" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sind i %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sind i %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sind i %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sind i %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sind i %s" msgid "When possible, please turn around" msgstr "Når muligt, vend venligst om" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Følg vejen de næste %s" msgid "Enter the roundabout soon" msgstr "Kør snart ind i rundkørslen" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Kør ind i rundkørslen %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Forlad rundkørslen ved den %1$s %2$s" msgid "soon" msgstr "snart" msgid "now" msgstr "nu" msgid "then" msgstr "så" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Tag den afkørslen %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Tag den afkørslen %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "højre" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "venstre" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "blødt " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "skarpt " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tag den %1$s vej til %2$s" #, c-format msgid "after %i roads" msgstr "efter %i veje" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Drej %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "vend så om" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Vend om %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "vend så om" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Vend om %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "følg" msgid "then you have reached your destination." msgstr "og så ankommer du til din destination" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Du er fremme ved destinationen %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Motorvejskryds" msgid "Exit" msgstr "Afkørsel" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Længde" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tid" msgid "Destination Length" msgstr "Længde til destinationen" msgid "Destination Time" msgstr "Tid til destinationen" msgid "Roadbook" msgstr "Vejbog" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Sæt som position" msgid "Set as destination" msgstr "Sæt som destination" msgid "Add as bookmark" msgstr "Tilføj som bogmærke" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skærm koordinater %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Forenede Arabiske Emirater" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" #. 530 msgid "Netherlands Antilles" msgstr "Nederlandske Antiller" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikansk Samoa" #. 040 msgid "Austria" msgstr "Østrig" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ålands Øerne" #. 031 msgid "Azerbaijan" msgstr "Aserbajdsjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "St Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetøen" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Hviderusland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocosøerne (Keelingøerne)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Den Demokratiske Republik" #. 140 msgid "Central African Republic" msgstr "Centralafrikanske Republik" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Svejts" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbenskysten" #. 184 msgid "Cook Islands" msgstr "Cook-øerne" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Columbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island (Indiske Ocean)" #. 196 msgid "Cyprus" msgstr "Cypern" #. 203 msgid "Czech Republic" msgstr "Tjekkiet" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikanske Republik" #. 012 msgid "Algeria" msgstr "Algeriet" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypten" #. 732 msgid "Western Sahara" msgstr "Vestsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Etiopien" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøerne" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien, de forenede stater af" #. 234 msgid "Faroe Islands" msgstr "Færøerne" #. 250 msgid "France" msgstr "Frankrig" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannien" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Fransk Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ækvatorialguinea" #. 300 msgid "Greece" msgstr "Grækenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sydgeorgien og Sydsandwichøerne" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard-øen og McDonald-øerne" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Det britiske territorium i Indiske Ocean" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Den Islamiske Republik" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. 116 msgid "Cambodia" msgstr "Cambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comorerne" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sankt Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Den Demokratiske Folkerepublik" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republikken" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Cayman-øerne" #. 398 msgid "Kazakhstan" msgstr "Kasakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Letland" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republikken" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Sankt Marin (Fransk del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall-øerne" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonien, Den Tidligere Jugoslaviske Republik" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar (Burma)" #. 496 msgid "Mongolia" msgstr "Mongoliet" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nordmarianerne" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiverne" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ny Kaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk-øen" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Holland" #. 578 msgid "Norway" msgstr "Norge" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Filippinerne" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Sankt Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palæstinensiske Territorie, Det Besatte" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romænien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Rusland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabien" #. 090 msgid "Solomon Islands" msgstr "Salomon-øerne" #. 690 msgid "Seychelles" msgstr "Seychellerne" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sankt Helena" #. 705 msgid "Slovenia" msgstr "Slovenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakiet" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé og Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Den arabiske republik Syrien" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøerne" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Fransk sydlige territorier" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Tyrkiet" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Den Kinesiske Provins" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, Den Forenede Republik" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "USA, mindre omliggende øer" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sankt Vincent og Grenadinerne" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britiske jomfruøer" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikanske Jomfruøer" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis og Futunaøerne" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sydafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Ukendt, tilføj is_in mærke til disse byer" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kort punkt" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "By" msgid "District" msgstr "Område" msgid "Street" msgstr "Gade" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Indtast destination" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "By" msgid "District/Township" msgstr "Distrikt" msgid "Map" msgstr "Kort" msgid "Bookmark" msgstr "Bogmærke" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Vis" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "Tidligere destinationer" msgid "_Bookmarks" msgstr "Bogmærker" msgid "_Map" msgstr "Kort" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Visning" msgid "_Vehicle" msgstr "Køretøj" msgid "Zoom_Out" msgstr "Zoom ud" msgid "Decrease zoom level" msgstr "Sænk zoom niveau" msgid "Zoom_In" msgstr "Zoom ind" msgid "Increase zoom level" msgstr "Øg zoom niveau" msgid "_Recalculate" msgstr "Genberegn" msgid "Redraw map" msgstr "Gentegn kort" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Åbner adressesøgning" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop Navigation" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Afslut" msgid "Quit the application" msgstr "Afslut programmet" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Stop Navigation" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Skifter kort-orientering mellem nord og følg køretøjet" msgid "_Roadbook" msgstr "Vejbog" msgid "Show/hide route description" msgstr "Vis/gem rute-beskrivelse" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Aktivér/deaktivér automatisk zoom niveauændring" msgid "_Fullscreen" msgstr "Fuldskærm" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NØ" msgid "E" msgstr "Ø" msgid "SE" msgstr "SØ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nej" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rute %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Rute 0000km 0+00:00 ETA" msgid "Help" msgstr "Hjælp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vis i Browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gader" msgid "House numbers" msgstr "Hus numre" msgid "View Attributes" msgstr "Vis attributter" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POI" msgid "View on map" msgstr "Vis på kort" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Klip bogmærke" msgid "Copy Bookmark" msgstr "Kopiér bogmærke" msgid "Rename Bookmark" msgstr "Omdøb bogmærke" msgid "Paste Bookmark" msgstr "Indsæt bogmærke" msgid "Delete Bookmark" msgstr "Slet bogmærke" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bogmærker" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Tilføj bogmærkemappe" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Indsæt bogmærke" #, c-format msgid "Bookmark %s" msgstr "Bogmærke %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vis satellit status" msgid " Elevation " msgstr " højde " msgid " Azimuth " msgstr " azimut " msgid "Show NMEA Data" msgstr "Vis NMEA data" msgid "car" msgstr "Bil" msgid "bike" msgstr "cykel" msgid "pedestrian" msgstr "fodgænger" #, c-format msgid "Current profile: %s" msgstr "Aktuel profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Skift profil til: %s" msgid "Set as active" msgstr "Sæt til aktiv" msgid "Show Satellite status" msgstr "Vis satellit status" msgid "Show NMEA data" msgstr "Vis NMEA data" msgid "Add Bookmark" msgstr "Tilføj Bogmærke" msgid "Rename" msgstr "Omdøb" msgid "About Navit" msgstr "Om Navit" #. Authors msgid "By" msgstr "Af" #. Contributors msgid "And all the Navit Team" msgstr "Og hele Navit-holdets" msgid "members and contributors." msgstr "medlemmer og bidragsydere." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Køretøj" msgid "Rules" msgstr "Regler" msgid "Lock on road" msgstr "Lås til vej" msgid "Northing" msgstr "mod nord" msgid "Map follows Vehicle" msgstr "Kort følger køretøj" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kort" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Lodret profil" msgid "Route Description" msgstr "Route Beskrivelse" msgid "Show Locale" msgstr "Vis Lokale" msgid "Former Destinations" msgstr "Tidligere destinationer" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Meddelelse" msgid "Back" msgstr "Tilbage" msgid "Back to map" msgstr "Tilbage til kort" msgid "Main Menu" msgstr "Hovedmenu" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Køretøjsposition" msgid "Main menu" msgstr "Hovedmenu" msgid "" "Show\n" "Map" msgstr "" "Vis\n" "Kort" msgid "Settings" msgstr "Indstillinger" msgid "Tools" msgstr "Værktøj" msgid "Route" msgstr "Rute" msgid "About" msgstr "Om" msgid "Quit" msgstr "Luk" msgid "Actions" msgstr "Funktioner" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "Navigation" msgid "Display" msgstr "Vis" msgid "Fullscreen" msgstr "Fuldskærm" msgid "Window Mode" msgstr "Vinduestilstand" msgid "Description" msgstr "Beskrivelse" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hest" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "forlad så rundkørslen ved den %1$s %2$s" navit-0.5.0+dfsg.1/po/de.po.in000066400000000000000000001423111264204753600157010ustar00rootroot00000000000000# German translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Achim Behrens https://launchpad.net/~k1l # Artem Anufrij https://launchpad.net/~artem-anufrij # Bernhard Reiter https://launchpad.net/~ockham-razor # Christian Moll https://launchpad.net/~christian-chrmoll # Clemens Kiener https://launchpad.net/~clemens-kiener # Dennis Gohert https://launchpad.net/~info-degoist # Ettore Atalan https://launchpad.net/~atalanttore # Fred https://launchpad.net/~jelk # Fume https://launchpad.net/~fume # KaZeR https://launchpad.net/~kazer # Kamikaaze https://launchpad.net/~kamikaazewiesel # Keruskerfuerst https://launchpad.net/~arminmohring # Konsti K. https://launchpad.net/~konstantin-koehring # Lars Hennig https://launchpad.net/~elhennig # Lukas Bögelein https://launchpad.net/~lukas-boegelein # MUrks https://launchpad.net/~tabstop # Manuel Hohmann https://launchpad.net/~mhohmann # Mathias Klein https://launchpad.net/~ma-klein # Paulodile https://launchpad.net/~stuff4tschaka # Roadrunner IN https://launchpad.net/~online # Robotaxi https://launchpad.net/~robotaxi # Roschkor https://launchpad.net/~bound-one2000 # S.E. https://launchpad.net/~stephan-evert # Stefan Sordon https://launchpad.net/~stefan-sordon # Thuttle https://launchpad.net/~archibald-thuttle # Tobias Bannert https://launchpad.net/~toba # Usul https://launchpad.net/~usul1 # everyone https://launchpad.net/~anonymus1338 # lopho https://launchpad.net/~lopho # metehyi https://launchpad.net/~metehyi # singesang https://launchpad.net/~singesang # spaetz https://launchpad.net/~spaetz # vsandre https://launchpad.net/~riedel-andre msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-09-14 07:17+0000\n" "Last-Translator: Mathias Klein \n" "Language-Team: Martin Schaller \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: de\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Aus dem Quellverzeichnis starten\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setze '%s' auf '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullte" msgid "first" msgstr "erste" msgid "second" msgstr "zweite" msgid "third" msgstr "dritte" msgid "fourth" msgstr "vierte" msgid "fifth" msgstr "fünfte" msgid "sixth" msgstr "sechste" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullten Ausfahrt" msgid "first exit" msgstr "ersten Ausfahrt" msgid "second exit" msgstr "zweiten Ausfahrt" msgid "third exit" msgstr "dritten Ausfahrt" msgid "fourth exit" msgstr "vierten Ausfahrt" msgid "fifth exit" msgstr "fünften Ausfahrt" msgid "sixth exit" msgstr "sechsten Ausfahrt" #, c-format msgid "%d feet" msgstr "%d Fuss" #, c-format msgid "in %d feet" msgstr "In %d Fuss" #, c-format msgid "%d.%d miles" msgstr "%d,%d Meilen" #, c-format msgid "in %d.%d miles" msgstr "in %d,%d Meilen" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "eine Meile" msgstr[1] "%d Meilen" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "In einer Meile" msgstr[1] "In %d Meilen" #, c-format msgid "%d meters" msgstr "%d Meter" #, c-format msgid "in %d meters" msgstr "In %d Metern" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d Kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "In %d,%d Kilometern" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "einen Kilometer" msgstr[1] "%d Kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "In einem Kilometer" msgstr[1] "In %d Kilometern" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$sauf die %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$sauf die Straße %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sauf den %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sauf die %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sauf das %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "auf die Auffahrt" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sauf die Straße %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sauf den %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sauf die %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sauf das %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sauf die %s" # msgid "When possible, please turn around" msgstr "Wenn möglich, bitte wenden" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "Richtung %s" #, c-format msgid "Follow the road for the next %s" msgstr "Dem Straßenverlauf %s folgen" msgid "Enter the roundabout soon" msgstr "Demnächst in den Kreisverkehr einfahren" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "%s in den Kreisverkehr einfahren" msgid "then enter the roundabout" msgstr "dann in den Kreisverkehr einfahren" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Verlassen Sie den Kreisverkehr an der %1$s %2$s" msgid "soon" msgstr "Demnächst" msgid "now" msgstr "Jetzt" msgid "then" msgstr "dann" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "dann%1$s auffahren" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Fahren Sie %1$s%2$s auf" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "dann%1$s auffahren" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Fahren Sie %1$s%2$s auf" msgid "on your left" msgstr "links" msgid "on your right" msgstr "rechts" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "%3$s nehmen Sie %2$s die Ausfahrt %1$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "%2$s nehmen Sie %1$s die Ausfahrt %3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "am Autobahnknoten" msgid "at exit" msgstr "an der Ausfahrt" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "dann%1$s geradeaus fahren" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "%1$s%2$s geradeaus fahren%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "dann rechts halten%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "%1$s rechts halten%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "dann links halten%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "%1$s links halten%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "rechts" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "links" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "leicht " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "scharf " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "dann die %1$s Straße %2$s abbiegen" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Die %1$s Straße %2$s abbiegen" #, c-format msgid "after %i roads" msgstr "nach %i Straßen" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s %1$s%2$s abbiegen%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "dann wenden" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Wenden Sie %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "dann wenden" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Wenden Sie %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "folgen" msgid "then you have reached your destination." msgstr "dann haben Sie Ihr Ziel erreicht." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "%s haben Sie Ihr Ziel erreicht" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Autobahnknoten" msgid "Exit" msgstr "Ausfahrt" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Standort" msgid "Command" msgstr "Anweisung" msgid "Length" msgstr "Länge" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Zeit" msgid "Destination Length" msgstr "Verbleibende Strecke zum Ziel" msgid "Destination Time" msgstr "Fahrzeit zum Ziel" msgid "Roadbook" msgstr "Wegbeschreibung" #, c-format msgid "Waypoint %d" msgstr "Wegpunkt %d" msgid "Visit before..." msgstr "Als Wegpunkt setzen vor..." msgid "Set as position" msgstr "Als Standort setzen" msgid "Set as destination" msgstr "Als Ziel setzen" msgid "Add as bookmark" msgstr "Als Lesezeichen aufnehmen" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Bildschirm %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Vereinigte Arabische Emirate" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua und Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" # #. 530 msgid "Netherlands Antilles" msgstr "Niederländische Antillen" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentinien" #. 016 msgid "American Samoa" msgstr "Amerikanisch-Samoa" #. 040 msgid "Austria" msgstr "Österreich" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Aserbaidschan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien und Herzegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesch" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivien" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius und Saba" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetinsel" #. 072 msgid "Botswana" msgstr "Botsuana" #. 112 msgid "Belarus" msgstr "Weißrussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosinseln" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratische Republik" #. 140 msgid "Central African Republic" msgstr "Zentralafrikanische Republik" #. 178 msgid "Congo" msgstr "Republik Kongo" #. 756 msgid "Switzerland" msgstr "Schweiz" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbeinküste" #. 184 msgid "Cook Islands" msgstr "Cookinseln" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "China, Volksrepublik" #. 170 msgid "Colombia" msgstr "Kolumbien" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kapverdische Inseln" #. 531 msgid "Curacao" msgstr "Curaçao" #. 162 msgid "Christmas Island" msgstr "Weihnachtsinsel" #. 196 msgid "Cyprus" msgstr "Zypern" #. 203 msgid "Czech Republic" msgstr "Tschechische Republik" #. 276 msgid "Germany" msgstr "Deutschland" #. 262 msgid "Djibouti" msgstr "Dschibuti" #. 208 msgid "Denmark" msgstr "Dänemark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikanische Republik" #. 012 msgid "Algeria" msgstr "Algerien" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Ägypten" #. 732 msgid "Western Sahara" msgstr "Westsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Äthiopien" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fidschi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandinseln" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien" #. 234 msgid "Faroe Islands" msgstr "Färöer" #. 250 msgid "France" msgstr "Frankreich" #. 266 msgid "Gabon" msgstr "Gabun" #. 826 msgid "United Kingdom" msgstr "Vereinigtes Königreich" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Französisch-Guayana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Äquatorialguinea" #. 300 msgid "Greece" msgstr "Griechenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Südgeorgien und die Südlichen Sandwichinseln" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hongkong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- und McDonald-Inseln" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Insel Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Britisches Territorium im Indischen Ozean" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamische Republik" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanien" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. 116 msgid "Cambodia" msgstr "Kambodscha" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoren" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts und Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Demokratische Volksrepublik" #. 410 msgid "Korea, Republic of" msgstr "Südkorea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kaimaninseln" #. 398 msgid "Kazakhstan" msgstr "Kasachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, Demokratische Volksrepublik" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libya" msgstr "Lybien" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldawien" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint-Martin (franz. Teil)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallinseln" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Mazedonien, ehem. jugoslawische Republik" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Burma" #. 496 msgid "Mongolia" msgstr "Mongolei" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nördliche Marianen" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediven" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Neukaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkinsel" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Niederlande" #. 578 msgid "Norway" msgstr "Norwegen" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Neuseeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Französisch-Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua-Neuguinea" #. 608 msgid "Philippines" msgstr "Philippinen" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre und Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairninseln" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palästinensische Autonomiegebiete" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Rumänien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Russische Föderation" #. 646 msgid "Rwanda" msgstr "Ruanda" # #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabien" #. 090 msgid "Solomon Islands" msgstr "Salomonen" #. 690 msgid "Seychelles" msgstr "Seychellen" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Schweden" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slowenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard und Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakei" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "Südsudan" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé und Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (niederl. Teil)" #. 760 msgid "Syrian Arab Republic" msgstr "Syrien, Arabische Republik" #. 748 msgid "Swaziland" msgstr "Swasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- und Caicosinseln" #. 148 msgid "Chad" msgstr "Tschad" #. 260 msgid "French Southern Territories" msgstr "Französische Süd- und Antarktisgebiete" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadschikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Osttimor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türkei" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad und Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Republik China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania, Vereinigte Republik" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "Vereinigte Staaten von Amerika" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstadt" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent und die Grenadinen" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britische Jungferninseln" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikanische Jungferninseln" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis und Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Südafrika" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Simbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "*Unbekannt, füge Etikett \"ist in\" zu diesen Städten hinzu" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" "navit Verwendung:\n" "navit [Option] [configfile]\n" "\t-c : benutze als Konfigurationsdatei, anstatt der " "Standardkonfigurationsdatei.\n" "\t-d : setze den globalen debug-level auf (0=Fehler, 1=Warnung, " "2=Info, 3=Debug).\n" "\tEinstellungen der Konfigurationsdatei werden weiterhin gültig sein, wenn " "sie einen höheren Wert angeben.\n" "\t-h: zeige diesen Hilfetext und beende.\n" "\t-v: zeige die Version und beende.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Keine Konfigurations-Datei navit.xml oder navit.xml.local gefunden\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Fehler beim Parsen der Konfigurations-Datei '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Benutze Konfigurations-Datei '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Fehler: Keine Konfiguration in der Datei '%s' gefunden\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Interne Initialisierung fehlgeschlagen, Programm wird beendet. Frühere " "Fehler beachten.\n" msgid "unknown street" msgstr "unbekannte Straße" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Namenloses Fahrzeug" msgid "Failed to write bookmarks file" msgstr "Lesezeichen-Datei konnte nicht geschrieben werden" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartenpunkt" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" # msgid "Postal" msgstr "PLZ" msgid "Town" msgstr "Ort" msgid "District" msgstr "Gegend" msgid "Street" msgstr "Straße" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Reiseziel eingeben" msgid "Zip Code" msgstr "Postleitzahl" msgid "City" msgstr "Stadt" msgid "District/Township" msgstr "Ortsteil/Gemeinde" msgid "Map" msgstr "Karte" msgid "Bookmark" msgstr "Lesezeichen" msgid "Destination" msgstr "Reiseziel" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Anzeige" msgid "_Route" msgstr "_Route" msgid "_Former Destinations" msgstr "_Vorherige Ziele" msgid "_Bookmarks" msgstr "_Lesezeichen" msgid "_Map" msgstr "_Karte" msgid "_Layout" msgstr "_Erscheinungsbild" msgid "_Projection" msgstr "_Projektion" msgid "_Vehicle" msgstr "_Fahrzeug" msgid "Zoom_Out" msgstr "Ver_kleinern" msgid "Decrease zoom level" msgstr "Verkleinern" msgid "Zoom_In" msgstr "Ver_größern" msgid "Increase zoom level" msgstr "Vergrößern" msgid "_Recalculate" msgstr "_Neu berechnen" msgid "Redraw map" msgstr "Karte neuzeichnen" msgid "_Info" msgstr "_Info" msgid "Set _destination" msgstr "Als _Ziel setzen" msgid "Opens address search dialog" msgstr "Öffnet Adresssuche-Dialog" msgid "_POI search" msgstr "_POI Suche" msgid "Opens POI search dialog" msgstr "Öffnet POI Suche" msgid "_Stop Navigation" msgstr "Navigation be_enden" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Beenden" msgid "Quit the application" msgstr "Die Anwendung beenden" msgid "Show position _cursor" msgstr "Positions_marke zeigen" msgid "_Lock on Road" msgstr "Auf Straße _zeigen" msgid "_Keep orientation to the North" msgstr "_Nordorientierung" msgid "Switches map orientation to the north or the vehicle" msgstr "" "Die Kartenorientierung zwischen Norden und Fahrzeugausrichtung wechseln" msgid "_Roadbook" msgstr "_Wegbeschreibung" msgid "Show/hide route description" msgstr "Routenbeschreibung anzeigen/schließen" msgid "_Autozoom" msgstr "_automatischer Zoom" msgid "Enable/disable automatic zoom level changing" msgstr "Automatischen Zoom einschalten/ausschalten" msgid "_Fullscreen" msgstr "_Vollbild" msgid "Data" msgstr "Daten" msgid "Pharmacy" msgstr "Apotheke" msgid "Restaurant" msgstr "Restaurant" msgid "Restaurant. Fast food" msgstr "Fast-Food Restaurant" msgid "Hotel" msgstr "Hotel" msgid "Car parking" msgstr "Parkplatz" msgid "Fuel station" msgstr "Tankstelle" msgid "Bank" msgstr "Bank" msgid "Hospital" msgstr "Krankenhaus" msgid "Cinema" msgstr "Kino" msgid "Train station" msgstr "Bahnhof" msgid "School" msgstr "Schule" msgid "Police" msgstr "Polizei" msgid "Justice" msgstr "Gericht" msgid "Taxi" msgstr "Taxi" msgid "Shopping" msgstr "Einkaufen" msgid "Distance from screen center (km)" msgstr "Entfernung vom Bildschirmmittelpunkt (km)" #, c-format msgid "POI %s. %s" msgstr "POI %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Setze Ziel auf %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Setze Karte auf %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "POI Suche" msgid "Select a category" msgstr "Eine Kategorie auswählen" msgid "Select a distance to look for (km)" msgstr "Wählen Sie eine Suchdistanz (km)" msgid "Select a POI" msgstr "Wählen Sie ein POI" msgid " " msgstr " " msgid "Category" msgstr "Kategorie" msgid "Direction" msgstr "Richtung" msgid "Distance(m)" msgstr "Entfernung (m)" msgid "Name" msgstr "Bezeichnung" msgid "Visit Before" msgstr "vorherige Ziele" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "SO" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nein" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Hilfe" #, c-format msgid "Waypoint %s" msgstr "Wegpunkt %s" msgid "Select waypoint to insert the new one before" msgstr "Auswählen, wovor der Wegpunkt eingefügt werden soll" msgid "View in Browser" msgstr "Im Browser anzeigen" msgid "Item type" msgstr "Elementtyp" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Straßen" msgid "House numbers" msgstr "Hausnummern" msgid "View Attributes" msgstr "Attribute anzeigen" msgid "Set as position (and deactivate vehicle)" msgstr "Als Position setzen (und Fahrzeug deaktivieren)" msgid "POIs" msgstr "Interessante Kartenpunkte" msgid "View on map" msgstr "Auf der Karte zeigen" msgid "Remove search results from the map" msgstr "Suchergebnisse aus Karte löschen" msgid "Show results on the map" msgstr "Ergebnisse in Karte anzeigen" msgid "Cut Bookmark" msgstr "Lesezeichen ausschneiden" msgid "Copy Bookmark" msgstr "Lesezeichen kopieren" msgid "Rename Bookmark" msgstr "Lesezeichen umbenennen" msgid "Paste Bookmark" msgstr "Lesezeichen einfügen" msgid "Delete Bookmark" msgstr "Lesezeichen löschen" msgid "Delete waypoint" msgstr "Wegpunkt löschen" msgid "Bookmarks" msgstr "Lesezeichen" msgid "Bookmarks as waypoints" msgstr "Lesezeichen als Wegpunkte" msgid "Save waypoints" msgstr "Wegpunkte abspeichern" msgid "Replace with waypoints" msgstr "Durch Wegpunkte ersetzen" msgid "Delete Folder" msgstr "Ordner löschen" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Lesezeichen-Ordner hinzufügen" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Lesezeichen einfügen" #, c-format msgid "Bookmark %s" msgstr "Lesezeichen %s" #, c-format msgid "Download %s" msgstr "%s herunterladen" msgid "Map Download" msgstr "Kartendownload" msgid "Active" msgstr "Aktiv" msgid "Download Enabled" msgstr "Download aktiviert" msgid "Download completely" msgstr "Komplett herunterladen" msgid "Show Satellite Status" msgstr "Satellitenstatus anzeigen" msgid " Elevation " msgstr " Höhe " msgid " Azimuth " msgstr " Längengrad " msgid "Show NMEA Data" msgstr "zeige NMEA Daten" msgid "car" msgstr "Auto" msgid "bike" msgstr "Fahrrad" msgid "pedestrian" msgstr "Fußgänger" #, c-format msgid "Current profile: %s" msgstr "Aktuelles Profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Profil ändern nach: %s" msgid "Set as active" msgstr "Als Aktiv setzen" msgid "Show Satellite status" msgstr "Satellitenstatus anzeigen" msgid "Show NMEA data" msgstr "NMEA Daten anzeigen" msgid "Add Bookmark" msgstr "Lesezeichen hinzufügen" msgid "Rename" msgstr "Umbenennen" msgid "About Navit" msgstr "Über Navit" #. Authors msgid "By" msgstr "Von" #. Contributors msgid "And all the Navit Team" msgstr "Und das ganze Navit Team" msgid "members and contributors." msgstr "Mitglieder und Mitarbeiter" msgid "Waypoints" msgstr "Wegpunkte" msgid "Enter Coordinates" msgstr "Koordinaten eingeben" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Breitengrad Längengrad" msgid "Enter coordinates, for example:" msgstr "Koordinaten eingeben, z.B.:" msgid "Vehicle" msgstr "Fahrzeug" msgid "Rules" msgstr "Regeln" msgid "Lock on road" msgstr "Auf Straße zeigen" msgid "Northing" msgstr "Einnorden" msgid "Map follows Vehicle" msgstr "Karte folgt Fahrzeug" msgid "Plan with Waypoints" msgstr "Planung mit Wegpunkten" msgid "Maps" msgstr "Karten" msgid "Layout" msgstr "Erscheinungsbild" msgid "Height Profile" msgstr "Höhenprofil" msgid "Route Description" msgstr "Wegbeschreibung" msgid "Show Locale" msgstr "Lokalisierung anzeigen" msgid "Former Destinations" msgstr "Vorherige Ziele" msgid "- No former destinations available -" msgstr "- Keine vorherigen Ziele -" msgid "Message" msgstr "Benachrichtigung" msgid "Back" msgstr "Zurück" msgid "Back to map" msgstr "Zurück zur Karte" msgid "Main Menu" msgstr "Hauptmenü" msgid "House number" msgstr "Hausnummer" msgid "Next" msgstr "Vor" msgid "Prev" msgstr "Zurück" msgid "Return to route!" msgstr "Zurück zur Route!" #. warning told msgid "Look out! Camera!" msgstr "Achtung Blitzer!" #. warning told msgid "Please decrease your speed" msgstr "Bitte Geschwindigkeit verringern" msgid "partial match" msgstr "ungefähr" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Suche" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Städte" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Ziel setzen" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Kartendaten (c) von OpenStreetMap unter ODbL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" "Der Speicherpfad für die Karte ist nicht verfügbar.\n" "Setzen Sie eine SD Karte ein und starten Sie Navit erneut\n" "oder wählen Sie einen anderen Pfad aus." msgid "Downloaded maps" msgstr "Heruntergeladene Karten" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" "Entschuldigung. Derzeit untestützen wir auf Android keine Karten die größer " "als 3,8Gigabyte sind. Bitte wählen Sie eine kleinere Karte aus." msgid "Cancel" msgstr "Abbrechen" msgid "filenamePath" msgstr "Dateipfad" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" "Karten-Speicherort ist %s\n" "Starten Sie Navit erneut." msgid "Whole Planet" msgstr "Ganze Welt" msgid "Africa" msgstr "Afrika" msgid "Canary Islands" msgstr "Kanarische Inseln" msgid "Asia" msgstr "Asien" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "Vereinigte Arabische Emirate+weitere" msgid "Oceania" msgstr "Ozeanien" msgid "Tasmania" msgstr "Tasmanien" msgid "Victoria" msgstr "Victoria" msgid "New South Wales" msgstr "New South Wales" msgid "Europe" msgstr "Europa" msgid "Western Europe" msgstr "West-Europa" msgid "Azores" msgstr "Azoren" msgid "BeNeLux" msgstr "Beneluxländer" msgid "Alsace" msgstr "Elsass" msgid "Aquitaine" msgstr "Aquitanien" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Basse-Normandie" msgid "Bourgogne" msgstr "Burgund" msgid "Bretagne" msgstr "Bretagne" msgid "Centre" msgstr "Centre" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Korsika" msgid "Franche-Comte" msgstr "Freie Grafschaft" msgid "Haute-Normandie" msgstr "Haute Normandie" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lothringen" msgid "Midi-Pyrenees" msgstr "Midi-Pyrenäen" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Picardie" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provence-Alpes-Cote-d-Azur" msgid "Rhone-Alpes" msgstr "Rhone-Alpen" msgid "Baden-Wuerttemberg" msgstr "Baden-Württemberg" msgid "Bayern" msgstr "Bayern" msgid "Mittelfranken" msgstr "Mittelfranken" msgid "Niederbayern" msgstr "Niederbayern" msgid "Oberbayern" msgstr "Oberbayern" msgid "Oberfranken" msgstr "Oberfranken" msgid "Oberpfalz" msgstr "Oberpfalz" msgid "Schwaben" msgstr "Schwaben" msgid "Unterfranken" msgstr "Unterfranken" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "Brandenburg" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hessen" msgid "Mecklenburg-Vorpommern" msgstr "Mecklenburg-Vorpommern" msgid "Niedersachsen" msgstr "Niedersachsen" msgid "Nordrhein-westfalen" msgstr "Nordrhein-Westfalen" msgid "Rheinland-Pfalz" msgstr "Rheinland-Pfalz" msgid "Saarland" msgstr "Saarland" msgid "Sachsen-Anhalt" msgstr "Sachsen-Anhalt" msgid "Sachsen" msgstr "Sachsen" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Thüringen" msgid "Mallorca" msgstr "Mallorca" msgid "Galicia" msgstr "Galicien" msgid "Scandinavia" msgstr "Skandinavien" msgid "England" msgstr "England" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "East Yorkshire und Hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "South yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Schottland" msgid "Wales" msgstr "Wales" msgid "Crete" msgstr "Kreta" msgid "North America" msgstr "Nordamerika" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawaii" msgid "USA" msgstr "USA" msgid " (except Alaska and Hawaii)" msgstr " (außer Alaska und Hawaii)" msgid "Midwest" msgstr "Mittlerer Westen" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Nordosten" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pazifik" msgid "South" msgstr "Süd" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "District of Columbia" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginia" msgid "West Virginia" msgstr "West Virginia" msgid "West" msgstr "West" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Kalifornien" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "New Mexico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Washington State" msgid "South+Middle America" msgstr "Süd+Mittel-Amerika" msgid "Guyane Francaise" msgstr "Französisch-Guayana" msgid "downloading" msgstr "wird heruntergeladen" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "Fertig in" msgid "Media selected for map storage is not available" msgstr "" "Der eingestellte Speicherort für das Kartenmaterial ist nicht verfügbar." #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Nicht genug freier Speicher" msgid "Error downloading map!" msgstr "Fehler beim Kartendownload" msgid "Error writing map!" msgstr "Fehler beim speichern der Karte!" msgid "Map download aborted!" msgstr "Kartendownload abgebrochen!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Fertig in" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Kartendownload" msgid "Vehicle Position" msgstr "Fahrzeugposition" msgid "Main menu" msgstr "Hauptmenü" msgid "" "Show\n" "Map" msgstr "" "Karte\n" "anzeigen" msgid "Settings" msgstr "Einstellungen" msgid "Tools" msgstr "Werkzeuge" msgid "Route" msgstr "Route" msgid "About" msgstr "Über" msgid "Quit" msgstr "Beenden" msgid "Actions" msgstr "Aktionen" msgid "" "Former\n" "Destinations" msgstr "" "Vorherige\n" "Ziele" msgid "Coordinates" msgstr "Koordinaten" msgid "" "Stop\n" "Navigation" msgstr "" "Navigation\n" "beenden" msgid "Display" msgstr "Darstellung" msgid "Fullscreen" msgstr "Vollbildmodus" msgid "Window Mode" msgstr "Fenstermodus" msgid "Description" msgstr "Beschreibung" msgid "" "Drop last \n" "Waypoint" msgstr "" "Letzten Wegpunkt\n" "entfernen" msgid "" "Drop next \n" "Waypoint" msgstr "" "Nächsten Wegpunkt\n" "entfernen" msgid "Satellite Status" msgstr "Satellitenstatus" msgid "NMEA Data" msgstr "NMEA Daten" msgid "car_shortest" msgstr "Auto kürzeste" msgid "car_avoid_tolls" msgstr "Auto ohne Maut" msgid "car_pedantic" msgstr "Auto genau" msgid "horse" msgstr "Pferd" msgid "Truck" msgstr "LKW" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Ja" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit gestartet" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit läuft" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Willkommen bei Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Vielen Dank für die Installation von Navit!\n" "\n" "Bitte zuerst im Menu \"Karten herunterladen\" auswählen und eine Karte für " "die gewünschte Region herunterladen. Die Kartendatei ist sehr groß, bitte " "Flatrate oder ähnliches aktivieren!\n" "\n" "Kartendaten: (c) OpenStreetMap contributors\n" "\n" "Viel Spaß mit Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Mehr Infos" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Vergrößern" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Verkleinern" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Karten herunterladen" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "POI ein/aus" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Navit beenden" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Sichern / Wiederherstellen" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "Kartenort festlegen" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Diese Karte löschen?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Laden:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Fehler beim Kartendownload" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Download der Karte abgebrochen" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Position noch nicht bekannt." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Karten passend zur aktuellen Position" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Adresse suchen" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Ziel eingeben" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Ungefähr" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Suche läuft..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Keine Adresse gefunden" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "lade Suchergebnisse" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Lädt Suchergebnisse" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Suche liefert kein Ergebnis!" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Keine Eingabe" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Neues Fahrziel:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Bitte auswählen" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Bitte eine SD Karte einlegen" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Sichern..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Wiederherstellung läuft …" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Sicherungsverzeichnis konnte nicht erstellt werden" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Sicherung fehlgeschlagen" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Keine Sicherung gefunden" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Fehler beim Wiederherstellen" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Sicherung erfolgreich" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Sicherung Erfolgreich\n" "Navit bitte neustarten" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Backup nicht gefunden" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Wiederherstellen fehlgeschlagen" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Backup auswählen" #. Android resource: @strings/backup msgid "Backup" msgstr "Sichern" #. Android resource: @strings/restore msgid "Restore" msgstr "Wiederherstellen" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "System-Sprachausgabedaten sind nicht verfügbar" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" "Navit kann jede text-to-speech Engine nutzen, die installiert ist. Die " "derzeit angewählte Engine kann Ihre Sprache nicht wiedergeben. Soll das " "System den Voice-Download Dialog öffnen?" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "anschließend verlassen Sie den Kreisverkehr an der %1$s %2$s" #, c-format #~ msgid "in %d m" #~ msgstr "in %d m" #, c-format #~ msgid "%d m" #~ msgstr "%d m" navit-0.5.0+dfsg.1/po/de_CH.po.in000066400000000000000000001077741264204753600162710ustar00rootroot00000000000000# German (Switzerland) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2010-05-18 08:49+0000\n" "Last-Translator: \n" "Language-Team: German (Switzerland) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: de_CH\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/el.po.in000066400000000000000000001363771264204753600157300ustar00rootroot00000000000000# Greek translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # Roadrunner IN https://launchpad.net/~online # aitolos https://launchpad.net/~yang-hellug # alichani https://launchpad.net/~alichani # okiroi https://launchpad.net/~g-theodoroy # vassilis https://launchpad.net/~kagemarou msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: el\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Λειτουργία από τον πηγαίο κατάλογο\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ρύθμιση '%s' στο'%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "τρέχουσα" msgid "first" msgstr "πρώτος" msgid "second" msgstr "δεύτερος" msgid "third" msgstr "τρίτη" msgid "fourth" msgstr "τέταρτος" msgid "fifth" msgstr "πέμπτος" msgid "sixth" msgstr "έκτος" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "τρέχουσα έξοδο" msgid "first exit" msgstr "πρώτη έξοδο" msgid "second exit" msgstr "δεύτερη έξοδο" msgid "third exit" msgstr "τρίτη έξοδο" msgid "fourth exit" msgstr "τέταρτη έξοδο" msgid "fifth exit" msgstr "πέμπτη έξοδο" msgid "sixth exit" msgstr "έκτη έξοδο" #, c-format msgid "%d feet" msgstr "%d πόδια" #, c-format msgid "in %d feet" msgstr "σε %d πόδια" #, c-format msgid "%d.%d miles" msgstr "%d.%d μίλια" #, c-format msgid "in %d.%d miles" msgstr "σε %d.%d μίλια" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "ένα μίλι" msgstr[1] "%d μίλια" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "σε ένα μίλι" msgstr[1] "σε %d μίλια" #, c-format msgid "%d meters" msgstr "%d μέτρα" #, c-format msgid "in %d meters" msgstr "σε %d μέτρα" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d χιλιόμετρα" #, c-format msgid "in %d.%d kilometers" msgstr "σε %d %d χιλιόμετρα" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "Ένα χιλιόμετρο" msgstr[1] "%d χιλιόμετρα" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "σε ένα χιλιόμετρο" msgstr[1] "σε %d χιλιόμετρα" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "στη ράμπα" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sστην οδό %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sστον %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sστην %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sστο %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sστην %s" msgid "When possible, please turn around" msgstr "Όταν είναι δυνατόν, κάνε αναστροφή" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Ακολουθήστε το δρόμο για τα επόμενα %s" msgid "Enter the roundabout soon" msgstr "Μπές στη κυκλική πορεία άμεσα" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Εξοδος απο την κυκλική πορεία στην %1$s %2$s" msgid "soon" msgstr "σύντομα" msgid "now" msgstr "τώρα" msgid "then" msgstr "και" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "δεξιά" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "αριστερά" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "ελαφρά " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "κλειστά " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Πάρτε τον %1$s δρόμο για το %2$s" #, c-format msgid "after %i roads" msgstr "μετά από %i δρόμους" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Στρίψτε %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "και κάνε αναστροφή" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Κάνε αναστροφή %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "και κάνε αναστροφή" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Κάνε αναστροφή %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "τότε έχετε φτάσει στον προορισμό σας." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Φτάσατε στον προορισμό σας %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Εξοδος" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Θέση" msgid "Command" msgstr "Εντολή" msgid "Length" msgstr "Μήκος" msgid "km" msgstr "χλμ" msgid "m" msgstr "μ" msgid "Time" msgstr "Χρόνος" msgid "Destination Length" msgstr "Απόσταση Προορισμού" msgid "Destination Time" msgstr "Χρόνος που απομένει" msgid "Roadbook" msgstr "Οδηγίες Διαδρομής" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Ορισμός ως αφετηρία" msgid "Set as destination" msgstr "Ορισμός ως προορισμός" msgid "Add as bookmark" msgstr "Προσθήκη ως σελιδοδείκτης" #, c-format msgid "Point 0x%x 0x%x" msgstr "Σημείο 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Συντεταγμένες οθόνης : %d %d" #. 020 msgid "Andorra" msgstr "Ανδόρα" #. 784 msgid "United Arab Emirates" msgstr "Ηνωμένα Αραβικά Εμιράτα" #. 004 msgid "Afghanistan" msgstr "Αφγανιστάν" #. 028 msgid "Antigua and Barbuda" msgstr "Αντίγκουα και Μπαρμπούντα" #. 660 msgid "Anguilla" msgstr "Ανγκίλα" #. 008 msgid "Albania" msgstr "Αλβανία" #. 051 msgid "Armenia" msgstr "Αρμενία" #. 530 msgid "Netherlands Antilles" msgstr "Ολλανδικές Αντίλλες" #. 024 msgid "Angola" msgstr "Ανγκόλα" #. 010 msgid "Antarctica" msgstr "Ανταρκτική" #. 032 msgid "Argentina" msgstr "Αργεντινή" #. 016 msgid "American Samoa" msgstr "Αμερικανική Σαμόα" #. 040 msgid "Austria" msgstr "Αυστρία" #. 036 msgid "Australia" msgstr "Αυστραλία" #. 533 msgid "Aruba" msgstr "Αρούμπα" #. 248 msgid "Aland Islands" msgstr "Νήσοι Όλαντ" #. 031 msgid "Azerbaijan" msgstr "Αζερμπαϊτζάν" #. 070 msgid "Bosnia and Herzegovina" msgstr "Βοσνία-Ερζεγοβίνη" #. 052 msgid "Barbados" msgstr "Μπαρμπέιντος" #. 050 msgid "Bangladesh" msgstr "Μπαγκλαντές" #. 056 msgid "Belgium" msgstr "Βέλγιο" #. 854 msgid "Burkina Faso" msgstr "Μπουρκίνα Φάσο" #. 100 msgid "Bulgaria" msgstr "Βουλγαρία" #. 048 msgid "Bahrain" msgstr "Μπαχρέιν" #. 108 msgid "Burundi" msgstr "Μπουρουντί" #. 204 msgid "Benin" msgstr "Μπενίν" #. 652 msgid "Saint Barthelemy" msgstr "Αγιος Βαρθολομαίος" #. 060 msgid "Bermuda" msgstr "Βερμούδες" #. 096 msgid "Brunei Darussalam" msgstr "Μπρουνέι Νταρουσαλάμ" #. 068 msgid "Bolivia" msgstr "Βολιβία" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Βραζιλία" #. 044 msgid "Bahamas" msgstr "Μπαχάμες" #. 064 msgid "Bhutan" msgstr "Μπουτάν" #. 074 msgid "Bouvet Island" msgstr "Νήσος Μπουβέ" #. 072 msgid "Botswana" msgstr "Μποτσουάνα" #. 112 msgid "Belarus" msgstr "Λευκορωσία" #. 084 msgid "Belize" msgstr "Μπελίζ" #. 124 msgid "Canada" msgstr "Καναδάς" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Νήσοι Κόκος (Κήλινγκ)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Δημοκρατία του Κονγκό" #. 140 msgid "Central African Republic" msgstr "Δημοκρατία Κεντρικής Αφρικής" #. 178 msgid "Congo" msgstr "Κονγκό" #. 756 msgid "Switzerland" msgstr "Ελβετία" #. 384 msgid "Cote d'Ivoire" msgstr "Ακτή Ελεφαντοστού" #. 184 msgid "Cook Islands" msgstr "Νήσοι Κουκ" #. 152 msgid "Chile" msgstr "Χιλή" #. 120 msgid "Cameroon" msgstr "Καμερούν" #. 156 msgid "China" msgstr "Κίνα" #. 170 msgid "Colombia" msgstr "Κολομβία" #. 188 msgid "Costa Rica" msgstr "Κόστα Ρίκα" #. 192 msgid "Cuba" msgstr "Κούβα" #. 132 msgid "Cape Verde" msgstr "Πράσινο Ακρωτήριο" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Νήσοι Χριστουγέννων" #. 196 msgid "Cyprus" msgstr "Κύπρος" #. 203 msgid "Czech Republic" msgstr "Δημοκρατία της Τσεχίας" #. 276 msgid "Germany" msgstr "Γερμανία" #. 262 msgid "Djibouti" msgstr "Τζιμπουτί" #. 208 msgid "Denmark" msgstr "Δανία" #. 212 msgid "Dominica" msgstr "Ντομίνικα" #. 214 msgid "Dominican Republic" msgstr "Δομινικανή Δημοκρατία" #. 012 msgid "Algeria" msgstr "Αλγερία" #. 218 msgid "Ecuador" msgstr "Εκουαδόρ" #. 233 msgid "Estonia" msgstr "Εσθονία" #. 818 msgid "Egypt" msgstr "Αίγυπτος" #. 732 msgid "Western Sahara" msgstr "Δυτική Σαχάρα" #. 232 msgid "Eritrea" msgstr "Ερυθραία" #. 724 msgid "Spain" msgstr "Ισπανία" #. 231 msgid "Ethiopia" msgstr "Αιθιοπία" #. 246 msgid "Finland" msgstr "Φινλανδία" #. 242 msgid "Fiji" msgstr "Νησιά Φίτζι" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Νήσοι Φώκλαντ (Μαλβίνες)" #. 583 msgid "Micronesia, Federated States of" msgstr "Μικρονησία, Ομόσπονδες Πολιτείες της" #. 234 msgid "Faroe Islands" msgstr "Νήσοι Φερόε" #. 250 msgid "France" msgstr "Γαλλία" #. 266 msgid "Gabon" msgstr "Γκαμπόν" #. 826 msgid "United Kingdom" msgstr "Ηνωμένο Βασίλειο" #. 308 msgid "Grenada" msgstr "Γρενάδα" #. 268 msgid "Georgia" msgstr "Γεωργία" #. 254 msgid "French Guiana" msgstr "Γαλλική Γουινέα" #. 831 msgid "Guernsey" msgstr "Νήσος Guernsey" #. 288 msgid "Ghana" msgstr "Γκάνα" #. 292 msgid "Gibraltar" msgstr "Γιβραλτάρ" #. 304 msgid "Greenland" msgstr "Γροιλανδία" #. 270 msgid "Gambia" msgstr "Γκάμπια" #. 324 msgid "Guinea" msgstr "Γουινέα" #. 312 msgid "Guadeloupe" msgstr "Γουαδελούπη" #. 226 msgid "Equatorial Guinea" msgstr "Ισημερινή Γουινέα" #. 300 msgid "Greece" msgstr "Ελλάδα" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Νότια Τζόρτζια και Νότιοι νήσοι Σάντουιτς" #. 320 msgid "Guatemala" msgstr "Γουατεμάλα" #. 316 msgid "Guam" msgstr "Γκουάμ" #. 624 msgid "Guinea-Bissau" msgstr "Γουινέα-Μπισσάου" #. 328 msgid "Guyana" msgstr "Γουιάνα" #. 344 msgid "Hong Kong" msgstr "Χονγκ Κονγκ" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Νήσος Χερντ και Νήσοι ΜακΝτόναλντ" #. 340 msgid "Honduras" msgstr "Ονδούρα" #. 191 msgid "Croatia" msgstr "Κροατία" #. 332 msgid "Haiti" msgstr "Αϊτή" #. 348 msgid "Hungary" msgstr "Ουγγαρία" #. 360 msgid "Indonesia" msgstr "Ινδονησία" #. 372 msgid "Ireland" msgstr "Ιρλανδία" #. 376 msgid "Israel" msgstr "Ισραήλ" #. 833 msgid "Isle of Man" msgstr "Αϊλ οφ Μαν" #. 356 msgid "India" msgstr "Ινδία" #. 086 msgid "British Indian Ocean Territory" msgstr "Βρετανικά Εδάφη Ινδικού Ωκεανού" #. 368 msgid "Iraq" msgstr "Ιράκ" #. 364 msgid "Iran, Islamic Republic of" msgstr "Ισλαμική Δημοκρατία του Ιράν" #. 352 msgid "Iceland" msgstr "Ισλανδία" #. 380 msgid "Italy" msgstr "Ιταλία" #. 832 msgid "Jersey" msgstr "Τζέρσεϋ" #. 388 msgid "Jamaica" msgstr "Τζαμάικα" #. 400 msgid "Jordan" msgstr "Ιορδανία" #. 392 msgid "Japan" msgstr "Ιαπωνία" #. 404 msgid "Kenya" msgstr "Κένυα" #. 417 msgid "Kyrgyzstan" msgstr "Κιργκιστάν" #. 116 msgid "Cambodia" msgstr "Καμπότζη" #. 296 msgid "Kiribati" msgstr "Κιριμπάτι" #. 174 msgid "Comoros" msgstr "Κομόρες" #. 659 msgid "Saint Kitts and Nevis" msgstr "Σαιντ Κίτς και Νέβις" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Κορέα, Λαϊκη Δημοκρατία της" #. 410 msgid "Korea, Republic of" msgstr "Κορέα, Δημοκρατία της" #. 414 msgid "Kuwait" msgstr "Κουβέιτ" #. 136 msgid "Cayman Islands" msgstr "Νήσοι Κέυμαν" #. 398 msgid "Kazakhstan" msgstr "Καζακστάν" #. 418 msgid "Lao People's Democratic Republic" msgstr "Λαϊκή Δημοκρατία του Λάος" #. 422 msgid "Lebanon" msgstr "Λίβανος" #. 662 msgid "Saint Lucia" msgstr "Αγία Λουκία" #. 438 msgid "Liechtenstein" msgstr "Λίχτενσταϊν" #. 144 msgid "Sri Lanka" msgstr "Σρι Λάνκα" #. 430 msgid "Liberia" msgstr "Λιβερία" #. 426 msgid "Lesotho" msgstr "Λεσότο" #. 440 msgid "Lithuania" msgstr "Λιθουανία" #. 442 msgid "Luxembourg" msgstr "Λουξεμβούργο" #. 428 msgid "Latvia" msgstr "Λεττονία" #. 434 msgid "Libya" msgstr "Λιβύη" #. 504 msgid "Morocco" msgstr "Μαρόκο" #. 492 msgid "Monaco" msgstr "Μονακό" #. 498 msgid "Moldova, Republic of" msgstr "Δημοκρατία της Μολδαβίας" #. 499 msgid "Montenegro" msgstr "Μαυροβούνιο" #. 663 msgid "Saint Martin (French part)" msgstr "Άγιος Μαρτίνος (Γαλλικό τμήμα)" #. 450 msgid "Madagascar" msgstr "Μαδαγασκάρη" #. 584 msgid "Marshall Islands" msgstr "Νήσοι Μάρσαλ" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Π.Γ.Δ.Μ." #. 466 msgid "Mali" msgstr "Μάλι" #. 104 msgid "Myanmar" msgstr "Μιανμάρ" #. 496 msgid "Mongolia" msgstr "Μογγολία" #. 446 msgid "Macao" msgstr "Μακάο" #. 580 msgid "Northern Mariana Islands" msgstr "Νήσοι Βόρειες Μαριάνες" #. 474 msgid "Martinique" msgstr "Μαρτινίκα" #. 478 msgid "Mauritania" msgstr "Μαυριτανία" #. 500 msgid "Montserrat" msgstr "Μοντσεράτ" #. 470 msgid "Malta" msgstr "Μάλτα" #. 480 msgid "Mauritius" msgstr "Μαυρίκιος" #. 462 msgid "Maldives" msgstr "Μαλδίβες" #. 454 msgid "Malawi" msgstr "Μαλάουι" #. 484 msgid "Mexico" msgstr "Μεξικό" #. 458 msgid "Malaysia" msgstr "Μαλαισία" #. 508 msgid "Mozambique" msgstr "Μοζαμβίκη" #. 516 msgid "Namibia" msgstr "Ναμίμπια" #. 540 msgid "New Caledonia" msgstr "Νέα Καληδονία" #. 562 msgid "Niger" msgstr "Νίγηρας" #. 574 msgid "Norfolk Island" msgstr "Νήσοι Νόρφολκ" #. 566 msgid "Nigeria" msgstr "Νιγηρία" #. 558 msgid "Nicaragua" msgstr "Νικαράγουα" #. 528 msgid "Netherlands" msgstr "Ολλανδία" #. 578 msgid "Norway" msgstr "Νορβηγία" #. 524 msgid "Nepal" msgstr "Νεπάλ" #. 520 msgid "Nauru" msgstr "Ναουρού" #. 570 msgid "Niue" msgstr "Νιούε" #. 554 msgid "New Zealand" msgstr "Νέα Ζηλανδία" #. 512 msgid "Oman" msgstr "Ομάν" #. 591 msgid "Panama" msgstr "Παναμάς" #. 604 msgid "Peru" msgstr "Περού" #. 258 msgid "French Polynesia" msgstr "Γαλλική Πολυνησία" #. 598 msgid "Papua New Guinea" msgstr "Παπούα-Νέα Γουινέα" #. 608 msgid "Philippines" msgstr "Φιλιππίνες" #. 586 msgid "Pakistan" msgstr "Πακιστάν" #. 616 msgid "Poland" msgstr "Πολωνία" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Σεν Πιερ και Μικελόν" #. 612 msgid "Pitcairn" msgstr "Πίτκερν" #. 630 msgid "Puerto Rico" msgstr "Πόρτο Ρίκο" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Κατεχόμενα Παλαιστινιακά Εδάφη" #. 620 msgid "Portugal" msgstr "Πορτογαλία" #. 585 msgid "Palau" msgstr "Παλάου" #. 600 msgid "Paraguay" msgstr "Παραγουάη" #. 634 msgid "Qatar" msgstr "Κατάρ" #. 638 msgid "Reunion" msgstr "Ρεουνιόν" #. 642 msgid "Romania" msgstr "Ρουμανία" #. 688 msgid "Serbia" msgstr "Σερβία" #. 643 msgid "Russian Federation" msgstr "Ρωσική Ομοσπονδία" #. 646 msgid "Rwanda" msgstr "Ρουάντα" #. 682 msgid "Saudi Arabia" msgstr "Σαουδική Αραβία" #. 090 msgid "Solomon Islands" msgstr "Νήσοι Σολομώντος" #. 690 msgid "Seychelles" msgstr "Σεϋχέλλες" #. 736 msgid "Sudan" msgstr "Σουδάν" #. 752 msgid "Sweden" msgstr "Σουηδία" #. 702 msgid "Singapore" msgstr "Σινγκαπούρη" #. 654 msgid "Saint Helena" msgstr "Νήσος Αγίας Ελένης" #. 705 msgid "Slovenia" msgstr "Σλοβενία" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Νήσοι Σβάλμπαρντ και Γιαν Μάγιεν" #. 703 msgid "Slovakia" msgstr "Σλοβακία" #. 694 msgid "Sierra Leone" msgstr "Σιέρα Λεόνε" #. 674 msgid "San Marino" msgstr "Άγιος Μαρίνος" #. 686 msgid "Senegal" msgstr "Σενεγάλη" #. 706 msgid "Somalia" msgstr "Σομαλία" #. 740 msgid "Suriname" msgstr "Σουρινάμ" #. 728 msgid "South Sudan" msgstr "Νότιο Σουδάν" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome και Principe" #. 222 msgid "El Salvador" msgstr "Ελ Σαλβαδόρ" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Αραβική Δημοκρατία της Συρίας" #. 748 msgid "Swaziland" msgstr "Σουαζιλάνδη" #. 796 msgid "Turks and Caicos Islands" msgstr "Νήσοι Τούρκς και Καΐκος" #. 148 msgid "Chad" msgstr "Τσαντ" #. 260 msgid "French Southern Territories" msgstr "Γαλλικές Νότιες Περιοχές" #. 768 msgid "Togo" msgstr "Τόγκο" #. 764 msgid "Thailand" msgstr "Ταϊλάνδη" #. 762 msgid "Tajikistan" msgstr "Τατζικιστάν" #. 772 msgid "Tokelau" msgstr "Τοκελάου" #. 626 msgid "Timor-Leste" msgstr "Τιμόρ-Λέστε" #. 795 msgid "Turkmenistan" msgstr "Τουρκμενιστάν" #. 788 msgid "Tunisia" msgstr "Τυνησία" #. 776 msgid "Tonga" msgstr "Τόνγκα" #. 792 msgid "Turkey" msgstr "Τουρκία" #. 780 msgid "Trinidad and Tobago" msgstr "Τρίνινταντ και Τομπάγκο" #. 798 msgid "Tuvalu" msgstr "Τουβάλου" #. 158 msgid "Taiwan, Province of China" msgstr "Ταϊβάν, Επαρχία της Κίνας" #. 834 msgid "Tanzania, United Republic of" msgstr "Τανζανία, Ενωμένη Δημοκρατία της" #. 804 msgid "Ukraine" msgstr "Ουκρανία" #. 800 msgid "Uganda" msgstr "Ουγκάντα" #. 581 msgid "United States Minor Outlying Islands" msgstr "Απομακρυσμένες Νησίδες των Ηνωμένων Πολιτειών" #. 840 msgid "United States" msgstr "Ηνωμένες Πολιτείες της Αμερικής" #. 858 msgid "Uruguay" msgstr "Ουρουγουάη" #. 860 msgid "Uzbekistan" msgstr "Ουζμπεκιστάν" #. 336 msgid "Holy See (Vatican City State)" msgstr "Αγία Έδρα (Κράτος της Πόλης του Βατικανού)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Άγιος Βικέντιος και Γρεναδίνες" #. 862 msgid "Venezuela" msgstr "Βενεζουέλα" #. 092 msgid "Virgin Islands, British" msgstr "Παρθένοι Νήσοι, Βρετανικές" #. 850 msgid "Virgin Islands, U.S." msgstr "Παρθένοι Νήσοι, Η.Π.A." #. 704 msgid "Viet Nam" msgstr "Βιετνάμ" #. 548 msgid "Vanuatu" msgstr "Βανουάτου" #. 876 msgid "Wallis and Futuna" msgstr "Νήσοι Γουόλις και Φουτούνα" #. 882 msgid "Samoa" msgstr "Σαμόα" #. 887 msgid "Yemen" msgstr "Υεμένη" #. 175 msgid "Mayotte" msgstr "Μαγιότ" #. 710 msgid "South Africa" msgstr "Νότιος Αφρική" #. 894 msgid "Zambia" msgstr "Ζάμπια" #. 716 msgid "Zimbabwe" msgstr "Ζιμπάμπουε" msgid "* Unknown, add is_in tags to those cities" msgstr "* Άγνωστη, προσθέστε ετικέτες is_in σε αυτές τις πόλεις" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "άγνωστος δρόμος" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Σημείο Χάρτη" msgid "Car" msgstr "Αυτοκίνητο" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Χώρα" msgid "Postal" msgstr "Ταχυδρομική" msgid "Town" msgstr "Πόλη" msgid "District" msgstr "Επαρχία" msgid "Street" msgstr "Οδός" msgid "Number" msgstr "Αριθμός" msgid "Enter Destination" msgstr "Εισάγετε προορισμό" msgid "Zip Code" msgstr "Ταχ. Κώδικας" msgid "City" msgstr "Πόλη" msgid "District/Township" msgstr "Επαρχία/Οικισμός" msgid "Map" msgstr "Χάρτης" msgid "Bookmark" msgstr "Σελιδοδείκτης" msgid "Destination" msgstr "Προορισμός" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Προβολή" msgid "_Route" msgstr "Διαδρομή" msgid "_Former Destinations" msgstr "Προγενέστερες διαδρομές" msgid "_Bookmarks" msgstr "Σελιδοδείκτες" msgid "_Map" msgstr "Χάρτης" msgid "_Layout" msgstr "Διάταξη" msgid "_Projection" msgstr "Προβολή :" msgid "_Vehicle" msgstr "Όχημα" msgid "Zoom_Out" msgstr "Σμίκρυνση" msgid "Decrease zoom level" msgstr "Μείωση κλίμακας εστίασης" msgid "Zoom_In" msgstr "Μεγέθυνση" msgid "Increase zoom level" msgstr "Αυξηση κλίμακας εστίασης" msgid "_Recalculate" msgstr "Επαναϋπολογισμός" msgid "Redraw map" msgstr "Επανασχεδίαση χάρτη" msgid "_Info" msgstr "Πληροφορίες" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Ανοιγμα διαλόγου αναζήτησης διεύθυνσης" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Διακοπή πλοήγησης" msgid "Test" msgstr "Δοκιμή" msgid "_Quit" msgstr "_Έξοδος" msgid "Quit the application" msgstr "Έξοδος από την εφαρμογή" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Κλείδωμα στο δρόμο" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Εναλάσει το προσανατολισμό του χάρτη στο βορά ή στο αυτοκίνητο" msgid "_Roadbook" msgstr "Οδηγίες Διαδρομής" msgid "Show/hide route description" msgstr "Εμφάνιση/απόκρυψη περιγραφής δρομολογίου" msgid "_Autozoom" msgstr "Αυτόματο Ζουμ" msgid "Enable/disable automatic zoom level changing" msgstr "(Απ)ενεργοποίηση αυτόματης αλλαγής εστίασης" msgid "_Fullscreen" msgstr "Πλήρης Οθόνη" msgid "Data" msgstr "Δεδομένα" msgid "Pharmacy" msgstr "Φαρμακείο" msgid "Restaurant" msgstr "Εστιατόριο" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "Ξενοδοχείο" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "Βενζινάδικο" msgid "Bank" msgstr "Τράπεζα" msgid "Hospital" msgstr "Νοσοκομείο" msgid "Cinema" msgstr "Κινηματογράφος" msgid "Train station" msgstr "Σταθμός τρένου" msgid "School" msgstr "Σχολείο" msgid "Police" msgstr "Αστυνομία" msgid "Justice" msgstr "" msgid "Taxi" msgstr "Ταξί" msgid "Shopping" msgstr "Αγορές" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "Επιλέξτε μια κατηγορία" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "Β" msgid "NE" msgstr "ΒΑ" msgid "E" msgstr "Α" msgid "SE" msgstr "ΝΑ" msgid "S" msgstr "Ν" msgid "SW" msgstr "ΝΔ" msgid "W" msgstr "Δ" msgid "NW" msgstr "ΒΔ" #. Android resource: @strings/no msgid "No" msgstr "Όχι" msgid "2D" msgstr "2Δ" msgid "3D" msgstr "3Δ" msgid "OT" msgstr "ΟΤ" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Διαδρομή %4.0fχλμ Χρόνος που απομένει %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Διαδρομή 0000χλμ Χρόνος που απομένει 0+00:00" msgid "Help" msgstr "Βοήθεια" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Επισκόπηση σε Φυλλομετρητή" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Οδοί" msgid "House numbers" msgstr "Αριθμοί σπιτιών" msgid "View Attributes" msgstr "Προβολή Ιδιοτήτων" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Σημεία Ενδιαφέροντος" msgid "View on map" msgstr "Προβολή στο χάρτη" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Αποκοπή Σελιδοδείκτη" msgid "Copy Bookmark" msgstr "Αντιγραφή Σελιδοδείκτη" msgid "Rename Bookmark" msgstr "Μετονομασία Σελιδοδείκτη" msgid "Paste Bookmark" msgstr "Επικόληση Σελιδοδείκτη" msgid "Delete Bookmark" msgstr "Διαγραφή Σελιδοδείκτη" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Σελιδοδείκτες" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Πρόσθεση φακέλου Σελιδοδείκτη" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Επικόληση σελιδοδείκτη" #, c-format msgid "Bookmark %s" msgstr "Σελιδοδείκτης %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Εμφάνιση Κατάστασης Δορυφόρων" msgid " Elevation " msgstr " Υψόμετρο " msgid " Azimuth " msgstr " Αζιμούθιο " msgid "Show NMEA Data" msgstr "Εμφάνιση Δεδομένων ΝΜΕΑ" msgid "car" msgstr "αυτοκίνητο" msgid "bike" msgstr "ποδήλατο" msgid "pedestrian" msgstr "Πεζός" #, c-format msgid "Current profile: %s" msgstr "Τρέχον προφίλ: %s" #, c-format msgid "Change profile to: %s" msgstr "Αλλαγή προφίλ σε: %s" msgid "Set as active" msgstr "Καθορισμός ως ενεργό" msgid "Show Satellite status" msgstr "Εμφάνιση Κατάστασης Δορυφόρων" msgid "Show NMEA data" msgstr "Εμφάνιση δεδομένων ΝΜΕΑ" msgid "Add Bookmark" msgstr "Προσθήκη σελιδοδείκτη" msgid "Rename" msgstr "Μετονομασία" msgid "About Navit" msgstr "Περί του Navit" #. Authors msgid "By" msgstr "Από" #. Contributors msgid "And all the Navit Team" msgstr "Και όλη την ομάδα του Navit" msgid "members and contributors." msgstr "μέλη και συνεισφέροντες" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Όχημα" msgid "Rules" msgstr "Κανόνες" msgid "Lock on road" msgstr "Κλείδωμα στο δρόμο" msgid "Northing" msgstr "Χάρτης στο βορρά" msgid "Map follows Vehicle" msgstr "Ο χάρτης ακολουθεί το Όχημα" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Χάρτες" msgid "Layout" msgstr "Διάταξη" msgid "Height Profile" msgstr "Ύψος προφίλ" msgid "Route Description" msgstr "Περιγραφή Διαδρομής" msgid "Show Locale" msgstr "Eμφάνιση Εντοπιότητας" msgid "Former Destinations" msgstr "Προγενέστερες διαδρομές" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Μήνυμα" msgid "Back" msgstr "Προηγ." msgid "Back to map" msgstr "Πίσω στο χάρτη" msgid "Main Menu" msgstr "Κύριο Μενού" msgid "House number" msgstr "Αριθμός σπιτιού" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Θέση Οχήματος" msgid "Main menu" msgstr "Κύριο Μενού" msgid "" "Show\n" "Map" msgstr "" "Εμφάνιση\n" "Χάρτη" msgid "Settings" msgstr "Ρυθμίσεις" msgid "Tools" msgstr "Εργαλεία" msgid "Route" msgstr "Διαδρομή" msgid "About" msgstr "Περί" msgid "Quit" msgstr "Έξοδος" msgid "Actions" msgstr "Ενέργειες" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "Διακοπή" msgid "Display" msgstr "Προβολή" msgid "Fullscreen" msgstr "Πλήρης Οθόνη" msgid "Window Mode" msgstr "Λειτουργία παραθύρων" msgid "Description" msgstr "Περιγραφή" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "άλογο" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "και βγείτε απο την κυκλική πορεία στην %1$s %2$s" navit-0.5.0+dfsg.1/po/en.po.in000066400000000000000000001117041264204753600157150ustar00rootroot00000000000000# English translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 02:23+0200\n" "PO-Revision-Date: 2015-05-14 13:03+0200\n" "Last-Translator: Michael von Glasow \n" "Language-Team: English \n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Running from source directory\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setting '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zeroth" msgid "first" msgstr "first" msgid "second" msgstr "second" msgid "third" msgstr "third" msgid "fourth" msgstr "fourth" msgid "fifth" msgstr "fifth" msgid "sixth" msgstr "sixth" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zeroth exit" msgid "first exit" msgstr "first exit" msgid "second exit" msgstr "second exit" msgid "third exit" msgstr "third exit" msgid "fourth exit" msgstr "fourth exit" msgid "fifth exit" msgstr "fifth exit" msgid "sixth exit" msgstr "sixth exit" #, c-format msgid "%d m" msgstr "%d m" #, c-format msgid "in %d m" msgstr "in %d m" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d meters" msgstr "%d meters" #, c-format msgid "in %d meters" msgstr "in %d meters" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometers" #, c-format msgid "in %d.%d kilometers" msgstr "in %d.%d kilometers" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "one kilometer" msgstr[1] "%d kilometers" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in one kilometer" msgstr[1] "in %d kilometers" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sonto %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "onto the motorway ramp" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sinto %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinto the %s" msgid "When possible, please turn around" msgstr "When possible, please turn around" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Follow the road for the next %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "then leave the roundabout at the %1$s %2$s" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "soon" msgid "now" msgstr "now" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Merge %1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Merge %1$s%2$s" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "right" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "left" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "easily " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "strongly " #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Take the %1$s road to the %2$s" #, c-format msgid "after %i roads" msgstr "after %i roads" #. cave: no else - may come from 'if (skip_roads)' above ! #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Turn %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Make a U-turn %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Make a U-turn %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give usefull info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "then you have reached your destination." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "You have reached your destination %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Interchange" msgid "Exit" msgstr "Exit" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); #. gui_internal_widget_append(wb, w); #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); #. gui_internal_widget_append(w, we); msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/en_AU.po.in000066400000000000000000001221541264204753600163030ustar00rootroot00000000000000# English (Australia) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Athol Mullen https://launchpad.net/~athol-mullen # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: English (Australia) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: en_AU\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Running from source directory\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setting '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zeroth" msgid "first" msgstr "first" msgid "second" msgstr "second" msgid "third" msgstr "third" msgid "fourth" msgstr "fourth" msgid "fifth" msgstr "fifth" msgid "sixth" msgstr "sixth" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zeroth exit" msgid "first exit" msgstr "first exit" msgid "second exit" msgstr "second exit" msgid "third exit" msgstr "third exit" msgid "fourth exit" msgstr "fourth exit" msgid "fifth exit" msgstr "fifth exit" msgid "sixth exit" msgstr "sixth exit" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metres" #, c-format msgid "in %d meters" msgstr "in %d metres" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometres" #, c-format msgid "in %d.%d kilometers" msgstr "in %d.%d kilometres" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "one kilometre" msgstr[1] "%d kilometres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in one kilometre" msgstr[1] "in %d kilometres" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sonto %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "onto the motorway ramp" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sinto %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinto the %s" msgid "When possible, please turn around" msgstr "When possible, please turn around" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Follow the road for the next %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "soon" msgid "now" msgstr "now" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Merge %1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Merge %1$s%2$s" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "right" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "left" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "easily " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "strongly " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Take the %1$s road to the %2$s" #, c-format msgid "after %i roads" msgstr "after %i roads" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Turn %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Make a U-turn %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Make a U-turn %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "then you will have reached your destination" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "You have reached your destination %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Interchange" msgid "Exit" msgstr "Exit" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Command" msgid "Length" msgstr "Length" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Time" msgid "Destination Length" msgstr "Destination Length" msgid "Destination Time" msgstr "Destination Time" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Set as position" msgid "Set as destination" msgstr "Set as destination" msgid "Add as bookmark" msgstr "Add as bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Screen coord : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgium" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Island" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarus" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Democratic Republic of the" #. 140 msgid "Central African Republic" msgstr "Central African Republic" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Switzerland" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire (Ivory Coast)" #. 184 msgid "Cook Islands" msgstr "Cook Islands" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroon" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Czech Republic" #. 276 msgid "Germany" msgstr "Germany" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominican Republic" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Western Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spain" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Federated States of" #. 234 msgid "Faroe Islands" msgstr "Faroe Islands" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "United Kingdom" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "French Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. 300 msgid "Greece" msgstr "Greece" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungary" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Ireland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamic Republic of" #. 352 msgid "Iceland" msgstr "Iceland" #. 380 msgid "Italy" msgstr "Italy" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Cambodia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Democratic People's Republic of" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republic of" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Cayman Islands" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Lao People's Democratic Republic" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Morocco" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republic of" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (French part)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Marshall Islands" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, the former Yugoslav Republic of" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "New Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Island" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Netherlands" #. 578 msgid "Norway" msgstr "Norway" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "French Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinian Territory, Occupied" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russian Federation" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Solomon Islands" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sweden" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrian Arab Republic" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "French Southern Territories" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkey" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Province of China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, United Republic of" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "United States" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Islands, British" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "South Africa" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Unknown, add is_in tags to those cities" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Map Point" msgid "Car" msgstr "Car" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Country" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Town" msgid "District" msgstr "District" msgid "Street" msgstr "Street" msgid "Number" msgstr "Number" msgid "Enter Destination" msgstr "Enter Destination" msgid "Zip Code" msgstr "Post Code" msgid "City" msgstr "City" msgid "District/Township" msgstr "District/Township" msgid "Map" msgstr "Map" msgid "Bookmark" msgstr "Bookmark" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Display" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Former Destinations" msgid "_Bookmarks" msgstr "Bookmarks" msgid "_Map" msgstr "Map" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Vehicle" msgid "Zoom_Out" msgstr "ZoomOut" msgid "Decrease zoom level" msgstr "Decrease zoom level" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "Increase zoom level" msgid "_Recalculate" msgstr "Recalculate" msgid "Redraw map" msgstr "Redraw map" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "Set destination" msgid "Opens address search dialog" msgstr "Opens address search dialogue" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop Navigation" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quit" msgid "Quit the application" msgstr "Quit the application" msgid "Show position _cursor" msgstr "Show position cursor" msgid "_Lock on Road" msgstr "Lock on Road" msgid "_Keep orientation to the North" msgstr "Keep orientation to the North" msgid "Switches map orientation to the north or the vehicle" msgstr "Switches map orientation to the north or the vehicle" msgid "_Roadbook" msgstr "Roadbook" msgid "Show/hide route description" msgstr "Show/hide route description" msgid "_Autozoom" msgstr "AutoZoom" msgid "Enable/disable automatic zoom level changing" msgstr "Enable/disable automatic zoom level changing" msgid "_Fullscreen" msgstr "FullScreen" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Help" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "View in Browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Streets" msgid "House numbers" msgstr "House numbers" msgid "View Attributes" msgstr "View Attributes" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "View on map" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Cut Bookmark" msgid "Copy Bookmark" msgstr "Copy Bookmark" msgid "Rename Bookmark" msgstr "Rename Bookmark" msgid "Paste Bookmark" msgstr "Paste Bookmark" msgid "Delete Bookmark" msgstr "Delete Bookmark" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bookmarks" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Add Bookmark folder" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Paste bookmark" #, c-format msgid "Bookmark %s" msgstr "Bookmark %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Show Satellite Status" msgid " Elevation " msgstr " Elevation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Show NMEA Data" msgid "car" msgstr "car" msgid "bike" msgstr "bike" msgid "pedestrian" msgstr "pedestrian" #, c-format msgid "Current profile: %s" msgstr "Current profile: %s" #, c-format msgid "Change profile to: %s" msgstr "Change profile to: %s" msgid "Set as active" msgstr "Set as active" msgid "Show Satellite status" msgstr "Show Satellite status" msgid "Show NMEA data" msgstr "Show NMEA data" msgid "Add Bookmark" msgstr "Add Bookmark" msgid "Rename" msgstr "Rename" msgid "About Navit" msgstr "About Navit" #. Authors msgid "By" msgstr "By" #. Contributors msgid "And all the Navit Team" msgstr "And all the Navit Team" msgid "members and contributors." msgstr "members and contributors." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicle" msgid "Rules" msgstr "Rules" msgid "Lock on road" msgstr "Lock on road" msgid "Northing" msgstr "Northing" msgid "Map follows Vehicle" msgstr "Map follows vehicle" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Maps" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Height Profile" msgid "Route Description" msgstr "Route Description" msgid "Show Locale" msgstr "Show Locale" msgid "Former Destinations" msgstr "Former Destinations" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Message" msgid "Back" msgstr "Back" msgid "Back to map" msgstr "Back to map" msgid "Main Menu" msgstr "Main Menu" msgid "House number" msgstr "House number" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Vehicle Position" msgid "Main menu" msgstr "Main menu" msgid "" "Show\n" "Map" msgstr "" "Show\n" "Map" msgid "Settings" msgstr "Settings" msgid "Tools" msgstr "Tools" msgid "Route" msgstr "Route" msgid "About" msgstr "About" msgid "Quit" msgstr "Quit" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "Navigation" msgid "Display" msgstr "Display" msgid "Fullscreen" msgstr "FullScreen" msgid "Window Mode" msgstr "Window Mode" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "horse" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/en_CA.po.in000066400000000000000000001213031264204753600162540ustar00rootroot00000000000000# English (Canada) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Frank Bax https://launchpad.net/~drw06g0w-qaens-52bk9e55 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:57+0000\n" "Last-Translator: Frank Bax \n" "Language-Team: English (Canada) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: en_CA\n" msgid "Running from source directory\n" msgstr "Running from source directory\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setting '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zeroth" msgid "first" msgstr "first" msgid "second" msgstr "second" msgid "third" msgstr "third" msgid "fourth" msgstr "fourth" msgid "fifth" msgstr "fifth" msgid "sixth" msgstr "sixth" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zeroth exit" msgid "first exit" msgstr "first exit" msgid "second exit" msgstr "second exit" msgid "third exit" msgstr "third exit" msgid "fourth exit" msgstr "fourth exit" msgid "fifth exit" msgstr "fifth exit" msgid "sixth exit" msgstr "sixth exit" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meters" #, c-format msgid "in %d meters" msgstr "in %d meters" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometres" #, c-format msgid "in %d.%d kilometers" msgstr "in %d.%d kilometres" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "one kilometre" msgstr[1] "%d kilometres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in one kilometre" msgstr[1] "in %d kilometres" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sonto %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "onto the motorway ramp" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sinto %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinto the %s" msgid "When possible, please turn around" msgstr "When possible, please turn around" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Follow the road for the next %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "soon" msgid "now" msgstr "now" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Merge %1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Merge %1$s%2$s" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "right" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "left" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "easily " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "strongly " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Take the %1$s road to the %2$s" #, c-format msgid "after %i roads" msgstr "after %i roads" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Turn %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Make a U-turn %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Make a U-turn %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "then you have reached your destination." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "You have reached your destination %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Interchange" msgid "Exit" msgstr "Exit" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Command" msgid "Length" msgstr "Length" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Time" msgid "Destination Length" msgstr "Destination Length" msgid "Destination Time" msgstr "Destination Time" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Set as position" msgid "Set as destination" msgstr "Set as destination" msgid "Add as bookmark" msgstr "Add as bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Screen coord : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgium" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Island" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarus" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Democratic Republic of the" #. 140 msgid "Central African Republic" msgstr "Central African Republic" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Switzerland" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire (Ivory Coast)" #. 184 msgid "Cook Islands" msgstr "Cook Islands" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroon" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Czech Republic" #. 276 msgid "Germany" msgstr "Germany" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominican Republic" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Western Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spain" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Federated States of" #. 234 msgid "Faroe Islands" msgstr "Faroe Islands" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "United Kingdom" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "French Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. 300 msgid "Greece" msgstr "Greece" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungary" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Ireland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamic Republic of" #. 352 msgid "Iceland" msgstr "Iceland" #. 380 msgid "Italy" msgstr "Italy" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Cambodia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Democratic People's Republic of" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republic of" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Cayman Islands" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Lao People's Democratic Republic" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Morocco" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republic of" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (French part)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Marshall Islands" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, the former Yugoslav Republic of" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "New Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Island" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Netherlands" #. 578 msgid "Norway" msgstr "Norway" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "French Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinian Territory, Occupied" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russian Federation" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Solomon Islands" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sweden" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrian Arab Republic" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "French Southern Territories" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkey" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Province of China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, United Republic of" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "United States" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Islands, British" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. 704 msgid "Viet Nam" msgstr "Viet Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "South Africa" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Unknown, add is_in tags to those cities" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Map Point" msgid "Car" msgstr "Car" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Country" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Town" msgid "District" msgstr "District" msgid "Street" msgstr "Street" msgid "Number" msgstr "Number" msgid "Enter Destination" msgstr "Enter Destination" msgid "Zip Code" msgstr "Postal Code" msgid "City" msgstr "City" msgid "District/Township" msgstr "District/Township" msgid "Map" msgstr "Map" msgid "Bookmark" msgstr "Bookmark" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "Decrease zoom level" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "Increase zoom level" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "Redraw map" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Opens address search dialog" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quit" msgid "Quit the application" msgstr "Quit the application" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Switches map orientation to the north or the vehicle" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "Show/hide route description" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "Enable/disable automatic zoom level changing" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Help" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "View in Browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Streets" msgid "House numbers" msgstr "House numbers" msgid "View Attributes" msgstr "View Attributes" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "View on map" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Cut Bookmark" msgid "Copy Bookmark" msgstr "Copy Bookmark" msgid "Rename Bookmark" msgstr "Rename Bookmark" msgid "Paste Bookmark" msgstr "Paste Bookmark" msgid "Delete Bookmark" msgstr "Delete Bookmark" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bookmarks" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Add Bookmark folder" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Paste bookmark" #, c-format msgid "Bookmark %s" msgstr "Bookmark %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Show Satellite Status" msgid " Elevation " msgstr " Elevation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Show NMEA Data" msgid "car" msgstr "car" msgid "bike" msgstr "bike" msgid "pedestrian" msgstr "pedestrian" #, c-format msgid "Current profile: %s" msgstr "Current profile: %s" #, c-format msgid "Change profile to: %s" msgstr "Change profile to: %s" msgid "Set as active" msgstr "Set as active" msgid "Show Satellite status" msgstr "Show Satellite status" msgid "Show NMEA data" msgstr "Show NMEA data" msgid "Add Bookmark" msgstr "Add Bookmark" msgid "Rename" msgstr "Rename" msgid "About Navit" msgstr "About Navit" #. Authors msgid "By" msgstr "By" #. Contributors msgid "And all the Navit Team" msgstr "And all the Navit Team" msgid "members and contributors." msgstr "members and contributors." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicle" msgid "Rules" msgstr "Rules" msgid "Lock on road" msgstr "Lock on road" msgid "Northing" msgstr "Northing" msgid "Map follows Vehicle" msgstr "Map follows Vehicle" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Maps" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Height Profile" msgid "Route Description" msgstr "Route Description" msgid "Show Locale" msgstr "Show Locale" msgid "Former Destinations" msgstr "Former Destinations" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Message" msgid "Back" msgstr "Back" msgid "Back to map" msgstr "Back to map" msgid "Main Menu" msgstr "Main Menu" msgid "House number" msgstr "House number" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Vehicle Position" msgid "Main menu" msgstr "Main menu" msgid "" "Show\n" "Map" msgstr "Show" msgid "Settings" msgstr "Settings" msgid "Tools" msgstr "Tools" msgid "Route" msgstr "Route" msgid "About" msgstr "About" msgid "Quit" msgstr "Quit" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "Stop" msgid "Display" msgstr "Display" msgid "Fullscreen" msgstr "Fullscreen" msgid "Window Mode" msgstr "Window Mode" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "horse" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/en_GB.po.in000066400000000000000000001353471264204753600162760ustar00rootroot00000000000000# English (United Kingdom) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Andi Chandler https://launchpad.net/~bing # Jeff Bailes https://launchpad.net/~thepizzaking # Kaustav Das Modak https://launchpad.net/~kaustav-dasmodak # Matthew Gall https://launchpad.net/~matthewgall # Roadrunner IN https://launchpad.net/~online # Stephen Irons https://launchpad.net/~stephen-irons # half_monkey https://launchpad.net/~d-r-williams-01 # jan https://launchpad.net/~jandegr1 # lopho https://launchpad.net/~lopho msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-08-29 12:36+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: en_GB\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Running from source directory\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setting '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zeroth" msgid "first" msgstr "first" msgid "second" msgstr "second" msgid "third" msgstr "third" msgid "fourth" msgstr "fourth" msgid "fifth" msgstr "fifth" msgid "sixth" msgstr "sixth" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zeroth exit" msgid "first exit" msgstr "first exit" msgid "second exit" msgstr "second exit" msgid "third exit" msgstr "third exit" msgid "fourth exit" msgstr "fourth exit" msgid "fifth exit" msgstr "fifth exit" msgid "sixth exit" msgstr "sixth exit" #, c-format msgid "%d feet" msgstr "%d feet" #, c-format msgid "in %d feet" msgstr "in %d feet" #, c-format msgid "%d.%d miles" msgstr "%d.%d miles" #, c-format msgid "in %d.%d miles" msgstr "in %d.%d miles" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "one mile" msgstr[1] "%d miles" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "in one mile" msgstr[1] "in %d miles" #, c-format msgid "%d meters" msgstr "%d metres" #, c-format msgid "in %d meters" msgstr "in %d metres" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometres" #, c-format msgid "in %d.%d kilometers" msgstr "in %d.%d kilometres" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "one kilometre" msgstr[1] "%d kilometres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in one kilometre" msgstr[1] "in %d kilometres" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$sonto the %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sonto %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sonto %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "onto the slip road" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sinto %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sinto %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sonto the %s" msgid "When possible, please turn around" msgstr "When possible, please turn around" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "towards %s" #, c-format msgid "Follow the road for the next %s" msgstr "Follow the road for the next %s" msgid "Enter the roundabout soon" msgstr "Enter the roundabout soon" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Enter the roundabout %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Leave the roundabout at the %1$s %2$s" msgid "soon" msgstr "soon" msgid "now" msgstr "now" msgid "then" msgstr "then" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Merge %1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "then merge%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Merge %1$s%2$s" msgid "on your left" msgstr "on your left" msgid "on your right" msgstr "on your right" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Take exit %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Take the exit %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "at interchange" msgid "at exit" msgstr "at exit" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "then continue straight%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "Continue straight %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "then keep right%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "Keep right %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "then keep left%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "Keep left %1$s%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "right" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "left" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "slightly " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "strongly " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Take the %1$s road to the %2$s" #, c-format msgid "after %i roads" msgstr "after %i roads" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Turn %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Make a U-turn %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "then make a U-turn" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Make a U-turn %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "follow" msgid "then you have reached your destination." msgstr "then you have reached your destination" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "You have reached your destination %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Interchange" msgid "Exit" msgstr "Exit" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Command" msgid "Length" msgstr "Length" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Time" msgid "Destination Length" msgstr "Destination Length" msgid "Destination Time" msgstr "Destination Time" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "Waypoint %d" msgid "Visit before..." msgstr "Visit before..." msgid "Set as position" msgstr "Set as position" msgid "Set as destination" msgstr "Set as destination" msgid "Add as bookmark" msgstr "Add as bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Screen coord : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgium" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius and Saba" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Island" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarus" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Democratic Republic of the" #. 140 msgid "Central African Republic" msgstr "Central African Republic" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Switzerland" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Cook Islands" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroon" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Christmas Island" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Czech Republic" #. 276 msgid "Germany" msgstr "Germany" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominican Republic" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Western Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spain" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Federated States of" #. 234 msgid "Faroe Islands" msgstr "Faroe Islands" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "United Kingdom" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "French Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. 300 msgid "Greece" msgstr "Greece" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungary" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Ireland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamic Republic of" #. 352 msgid "Iceland" msgstr "Iceland" #. 380 msgid "Italy" msgstr "Italy" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Cambodia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Democratic People's Republic of" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republic of" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Cayman Islands" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Lao People's Democratic Republic" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "Libya" #. 504 msgid "Morocco" msgstr "Morocco" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republic of" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (French part)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Marshall Islands" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, the former Yugoslav Republic of" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "New Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Island" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Netherlands" #. 578 msgid "Norway" msgstr "Norway" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "French Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinian Territory, Occupied" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russian Federation" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Solomon Islands" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sweden" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "South Sudan" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (Dutch part)" #. 760 msgid "Syrian Arab Republic" msgstr "Syrian Arab Republic" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "French Southern Territories" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkey" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Province of China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, United Republic of" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "United States" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Islands, British" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "South Africa" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Unknown, add is_in tags to those cities" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "No config file navit.xml, navit.xml.local found\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Error parsing config file '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Using config file '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Error: No configuration found in config file '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Internal initialisation failed, exiting. Check previous error messages.\n" msgid "unknown street" msgstr "unknown street" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Unnamed vehicle" msgid "Failed to write bookmarks file" msgstr "Failed to write bookmarks file" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Map Point" msgid "Car" msgstr "Car" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Country" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Town" msgid "District" msgstr "District" msgid "Street" msgstr "Street" msgid "Number" msgstr "Number" msgid "Enter Destination" msgstr "Enter Destination" msgid "Zip Code" msgstr "Post Code" msgid "City" msgstr "City" msgid "District/Township" msgstr "District/Township" msgid "Map" msgstr "Map" msgid "Bookmark" msgstr "Bookmark" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Display" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Former Destinations" msgid "_Bookmarks" msgstr "Bookmarks" msgid "_Map" msgstr "Map" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Vehicle" msgid "Zoom_Out" msgstr "ZoomOut" msgid "Decrease zoom level" msgstr "Decrease zoom level" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "Increase zoom level" msgid "_Recalculate" msgstr "Recalculate" msgid "Redraw map" msgstr "Redraw map" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "Set _destination" msgid "Opens address search dialog" msgstr "Opens address search dialogue" msgid "_POI search" msgstr "_POI search" msgid "Opens POI search dialog" msgstr "Opens POI search dialogue" msgid "_Stop Navigation" msgstr "Stop navigation" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quit" msgid "Quit the application" msgstr "Quit the application" msgid "Show position _cursor" msgstr "Show position _cursor" msgid "_Lock on Road" msgstr "Lock on road" msgid "_Keep orientation to the North" msgstr "_Keep orientation to the North" msgid "Switches map orientation to the north or the vehicle" msgstr "Switches map orientation to the north or the vehicle" msgid "_Roadbook" msgstr "Roadbook" msgid "Show/hide route description" msgstr "Show/hide route description" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Enable/disable automatic zoom level changing" msgid "_Fullscreen" msgstr "Fullscreen" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "Pharmacy" msgid "Restaurant" msgstr "Restaurant" msgid "Restaurant. Fast food" msgstr "Restaurant. Fast food" msgid "Hotel" msgstr "Hotel" msgid "Car parking" msgstr "Car parking" msgid "Fuel station" msgstr "Fuel station" msgid "Bank" msgstr "Bank" msgid "Hospital" msgstr "Hospital" msgid "Cinema" msgstr "Cinema" msgid "Train station" msgstr "Railway station" msgid "School" msgstr "School" msgid "Police" msgstr "Police" msgid "Justice" msgstr "Justice" msgid "Taxi" msgstr "Taxi" msgid "Shopping" msgstr "Shopping" msgid "Distance from screen center (km)" msgstr "Distance from screen centre (km)" #, c-format msgid "POI %s. %s" msgstr "POI %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Set destination to %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Set map to %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "Set next visit to %ld, %ld \n" msgid "POI search" msgstr "POI search" msgid "Select a category" msgstr "Select a category" msgid "Select a distance to look for (km)" msgstr "Select a distance to look for (km)" msgid "Select a POI" msgstr "Select a POI" msgid " " msgstr " " msgid "Category" msgstr "Category" msgid "Direction" msgstr "Direction" msgid "Distance(m)" msgstr "Distance(m)" msgid "Name" msgstr "Name" msgid "Visit Before" msgstr "Visit Before" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "QT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Help" #, c-format msgid "Waypoint %s" msgstr "Waypoint %s" msgid "Select waypoint to insert the new one before" msgstr "Select waypoint to insert the new one before" msgid "View in Browser" msgstr "View in browser" msgid "Item type" msgstr "Item type" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Streets" msgid "House numbers" msgstr "House numbers" msgid "View Attributes" msgstr "View attributes" msgid "Set as position (and deactivate vehicle)" msgstr "Set as position (and deactivate vehicle)" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "View on map" msgid "Remove search results from the map" msgstr "Remove search results from the map" msgid "Show results on the map" msgstr "Show results on the map" msgid "Cut Bookmark" msgstr "Cut bookmark" msgid "Copy Bookmark" msgstr "Copy bookmark" msgid "Rename Bookmark" msgstr "Rename bookmark" msgid "Paste Bookmark" msgstr "Paste bookmark" msgid "Delete Bookmark" msgstr "Delete bookmark" msgid "Delete waypoint" msgstr "Delete waypoint" msgid "Bookmarks" msgstr "Bookmarks" msgid "Bookmarks as waypoints" msgstr "Bookmarks as waypoints" msgid "Save waypoints" msgstr "Save waypoints" msgid "Replace with waypoints" msgstr "Replace with waypoints" msgid "Delete Folder" msgstr "Delete Folder" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Add bookmark folder" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Paste bookmark" #, c-format msgid "Bookmark %s" msgstr "Bookmark %s" #, c-format msgid "Download %s" msgstr "Download %s" msgid "Map Download" msgstr "Map Download" msgid "Active" msgstr "Active" msgid "Download Enabled" msgstr "Download Enabled" msgid "Download completely" msgstr "Download completely" msgid "Show Satellite Status" msgstr "Show satellite status" msgid " Elevation " msgstr " Elevation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Show NMEA data" msgid "car" msgstr "car" msgid "bike" msgstr "bike" msgid "pedestrian" msgstr "pedestrian" #, c-format msgid "Current profile: %s" msgstr "Current profile: %s" #, c-format msgid "Change profile to: %s" msgstr "Change profile to: %s" msgid "Set as active" msgstr "Set as active" msgid "Show Satellite status" msgstr "Show satellite status" msgid "Show NMEA data" msgstr "Show NMEA data" msgid "Add Bookmark" msgstr "Add bookmark" msgid "Rename" msgstr "Rename" msgid "About Navit" msgstr "About Navit" #. Authors msgid "By" msgstr "By" #. Contributors msgid "And all the Navit Team" msgstr "And all the Navit Team" msgid "members and contributors." msgstr "members and contributors." msgid "Waypoints" msgstr "Waypoints" msgid "Enter Coordinates" msgstr "Enter Coordinates" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Latitude Longitude" msgid "Enter coordinates, for example:" msgstr "Enter coordinates, for example:" msgid "Vehicle" msgstr "Vehicle" msgid "Rules" msgstr "Rules" msgid "Lock on road" msgstr "Lock on road" msgid "Northing" msgstr "Orient map North" msgid "Map follows Vehicle" msgstr "Map follows vehicle" msgid "Plan with Waypoints" msgstr "Plan with Waypoints" msgid "Maps" msgstr "Maps" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Height Profile" msgid "Route Description" msgstr "Route Description" msgid "Show Locale" msgstr "Show Locale" msgid "Former Destinations" msgstr "Former Destinations" msgid "- No former destinations available -" msgstr "- No former destinations available -" msgid "Message" msgstr "Message" msgid "Back" msgstr "Back" msgid "Back to map" msgstr "Back to map" msgid "Main Menu" msgstr "Main Menu" msgid "House number" msgstr "House number" msgid "Next" msgstr "Next" msgid "Prev" msgstr "Prev" msgid "Return to route!" msgstr "Return to route!" #. warning told msgid "Look out! Camera!" msgstr "Look out! Camera!" #. warning told msgid "Please decrease your speed" msgstr "Please decrease your speed" msgid "partial match" msgstr "partial match" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Search" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Towns" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Route to here" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Map data (c) OpenStreetMap contributors, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgid "Downloaded maps" msgstr "Downloaded maps" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgid "Cancel" msgstr "Cancel" msgid "filenamePath" msgstr "filenamePath" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" "New location set to %s\n" "Restart Navit to apply the changes." msgid "Whole Planet" msgstr "Whole Planet" msgid "Africa" msgstr "Africa" msgid "Canary Islands" msgstr "Canary Islands" msgid "Asia" msgstr "Asia" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "UAE+Other" msgid "Oceania" msgstr "Oceania" msgid "Tasmania" msgstr "Tasmania" msgid "Victoria" msgstr "Victoria" msgid "New South Wales" msgstr "New South Wales" msgid "Europe" msgstr "Europe" msgid "Western Europe" msgstr "Western Europe" msgid "Azores" msgstr "Azores" msgid "BeNeLux" msgstr "BeNeLux" msgid "Alsace" msgstr "Alsace" msgid "Aquitaine" msgstr "Aquitaine" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Basse-Normandie" msgid "Bourgogne" msgstr "Bourgogne" msgid "Bretagne" msgstr "Bretagne" msgid "Centre" msgstr "Centre" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Corse" msgid "Franche-Comte" msgstr "Franche-Comte" msgid "Haute-Normandie" msgstr "Haute-Normandie" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lorraine" msgid "Midi-Pyrenees" msgstr "Midi-Pyrenees" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Picardie" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provence-Alpes-Cote-d-Azur" msgid "Rhone-Alpes" msgstr "Rhone-Alpes" msgid "Baden-Wuerttemberg" msgstr "Baden-Wuerttemberg" msgid "Bayern" msgstr "Bayern" msgid "Mittelfranken" msgstr "Mittelfranken" msgid "Niederbayern" msgstr "Niederbayern" msgid "Oberbayern" msgstr "Oberbayern" msgid "Oberfranken" msgstr "Oberfranken" msgid "Oberpfalz" msgstr "Oberpfalz" msgid "Schwaben" msgstr "Schwaben" msgid "Unterfranken" msgstr "Unterfranken" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "Brandenburg" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hessen" msgid "Mecklenburg-Vorpommern" msgstr "Mecklenburg-Vorpommern" msgid "Niedersachsen" msgstr "Niedersachsen" msgid "Nordrhein-westfalen" msgstr "Nordrhein-westfalen" msgid "Rheinland-Pfalz" msgstr "Rheinland-Pfalz" msgid "Saarland" msgstr "Saarland" msgid "Sachsen-Anhalt" msgstr "Sachsen-Anhalt" msgid "Sachsen" msgstr "Sachsen" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Thueringen" msgid "Mallorca" msgstr "Mallorca" msgid "Galicia" msgstr "Galicia" msgid "Scandinavia" msgstr "Scandinavia" msgid "England" msgstr "England" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "East Yorkshire with Hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "South Yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Scotland" msgid "Wales" msgstr "Wales" msgid "Crete" msgstr "Crete" msgid "North America" msgstr "North America" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawaii" msgid "USA" msgstr "USA" msgid " (except Alaska and Hawaii)" msgstr " (except Alaska and Hawaii)" msgid "Midwest" msgstr "Midwest" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Northeast" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacific" msgid "South" msgstr "South" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "District of Columbia" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginia" msgid "West Virginia" msgstr "West Virginia" msgid "West" msgstr "West" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "California" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "New Mexico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Washington State" msgid "South+Middle America" msgstr "South+Middle America" msgid "Guyane Francaise" msgstr "Guyane Francaise" msgid "downloading" msgstr "downloading" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "ready" msgid "Media selected for map storage is not available" msgstr "Media selected for map storage is not available" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Not enough free space" msgid "Error downloading map!" msgstr "Error downloading map!" msgid "Error writing map!" msgstr "Error writing map!" msgid "Map download aborted!" msgstr "Map download aborted!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "ETA" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Map download" msgid "Vehicle Position" msgstr "Vehicle Position" msgid "Main menu" msgstr "Main Menu" msgid "" "Show\n" "Map" msgstr "Show Map" msgid "Settings" msgstr "Settings" msgid "Tools" msgstr "Tools" msgid "Route" msgstr "Route" msgid "About" msgstr "About" msgid "Quit" msgstr "Quit" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" "Former\n" "Destinations" msgid "Coordinates" msgstr "Coordinates" msgid "" "Stop\n" "Navigation" msgstr "Stop" msgid "Display" msgstr "Display" msgid "Fullscreen" msgstr "Fullscreen" msgid "Window Mode" msgstr "Window Mode" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" "Drop last \n" "Waypoint" msgid "" "Drop next \n" "Waypoint" msgstr "" "Drop next \n" "Waypoint" msgid "Satellite Status" msgstr "Satellite Status" msgid "NMEA Data" msgstr "NMEA Data" msgid "car_shortest" msgstr "car_shortest" msgid "car_avoid_tolls" msgstr "car_avoid_tolls" msgid "car_pedantic" msgstr "car_pedantic" msgid "horse" msgstr "horse" msgid "Truck" msgstr "Truck" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Yes" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit started" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit running" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Welcome to Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map file size may be large (>50MB) - a WiFi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "More info" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Zoom in" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Zoom out" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Download maps" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Toggle POIs" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Exit Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Backup / Restore" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "Set map location" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Delete this map?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Downloading:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Error downloading map." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Map download aborted" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "No location. Reopen after location fix." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Maps containing current location" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Address search" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Enter destination" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Match partial address" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Searching..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Address not found" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Getting search results" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Loading search results" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "No results found" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "No text entered" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Setting destination to:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Choose an action" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Please insert an SD Card" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Backing up..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Restoring..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Failed to create backup directory" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Backup failed" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "No backup found" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Failed to restore" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Backup successful" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Restore Successful\n" "Please restart Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Backup not found" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Restore failed" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Select backup" #. Android resource: @strings/backup msgid "Backup" msgstr "Backup" #. Android resource: @strings/restore msgid "Restore" msgstr "Restore" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "System text to speech engine data is missing" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "then leave the roundabout at the %1$s %2$s" navit-0.5.0+dfsg.1/po/eo.po.in000066400000000000000000001221321264204753600157130ustar00rootroot00000000000000# Esperanto translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Lucas Larson https://launchpad.net/~lucaslarson # Michael Moroni https://launchpad.net/~airon90 # Michael von Glasow https://launchpad.net/~michael-vonglasow # OlivierWeb https://launchpad.net/~olivierweb msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: eo\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Rulanta el fontdosierujo\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "agordanta '%s' kiel '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nula" msgid "first" msgstr "unua" msgid "second" msgstr "dua" msgid "third" msgstr "tria" msgid "fourth" msgstr "kvara" msgid "fifth" msgstr "kvina" msgid "sixth" msgstr "sesa" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nula eliro" msgid "first exit" msgstr "unua eliro" msgid "second exit" msgstr "dua eliro" msgid "third exit" msgstr "tria eliro" msgid "fourth exit" msgstr "kvara eliro" msgid "fifth exit" msgstr "kvina eliro" msgid "sixth exit" msgstr "sesa eliro" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metroj" #, c-format msgid "in %d meters" msgstr "en %d metrojn" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrojn" #, c-format msgid "in %d.%d kilometers" msgstr "en %d.%d kilometrojn" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "unu kilometro" msgstr[1] "%d kilometroj" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "en unu kilometron" msgstr[1] "en %d kilometrojn" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "al la ramplon" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sal la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sal la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sal la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sal la %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sal la %s" msgid "When possible, please turn around" msgstr "Kiam eble, bonvole ĉirkaŭturnu" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Sekvu la straton ĝis la sekva %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Lasu la trafikcirklon ĉe la %1$s %2$s" msgid "soon" msgstr "baldaŭ" msgid "now" msgstr "nun" msgid "then" msgstr "do" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "dekstren" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "maldekstren" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "facile " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "forte " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Turnu %2$s ĉe la strato %1$s" #, c-format msgid "after %i roads" msgstr "post %i stratoj" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Turnu %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "do ĉirkaŭturnu" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Ĉirkaŭturnu %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "do ĉirkaŭturnu" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Ĉirkaŭturnu %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "sekvu" msgid "then you have reached your destination." msgstr "do vi atingis la celon" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Vi atingis la celon %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Eliro" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozicio" msgid "Command" msgstr "Komando" msgid "Length" msgstr "Longo" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Horo" msgid "Destination Length" msgstr "Distanco de celo" msgid "Destination Time" msgstr "Tempo por celo" msgid "Roadbook" msgstr "Vojprotokolo" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Agordi kiel pozicio" msgid "Set as destination" msgstr "Agordi kiel celo" msgid "Add as bookmark" msgstr "Aldoni kiel legosigno" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekrankoordinatoj : %d %d" #. 020 msgid "Andorra" msgstr "Andoro" #. 784 msgid "United Arab Emirates" msgstr "Unuiĝintaj Arabaj Emirlandoj" #. 004 msgid "Afghanistan" msgstr "Afganio" #. 028 msgid "Antigua and Barbuda" msgstr "Antigvo-Barbudo" #. 660 msgid "Anguilla" msgstr "Angvilo" #. 008 msgid "Albania" msgstr "Albanio" #. 051 msgid "Armenia" msgstr "Armenio" #. 530 msgid "Netherlands Antilles" msgstr "Nederlandaj antiloj" #. 024 msgid "Angola" msgstr "Angolo" #. 010 msgid "Antarctica" msgstr "Antarkto" #. 032 msgid "Argentina" msgstr "Argentino" #. 016 msgid "American Samoa" msgstr "Usona Samoo" #. 040 msgid "Austria" msgstr "Aŭstrio" #. 036 msgid "Australia" msgstr "Aŭstralio" #. 533 msgid "Aruba" msgstr "Arubo" #. 248 msgid "Aland Islands" msgstr "Alando" #. 031 msgid "Azerbaijan" msgstr "Azerbajĝano" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnio kaj Hercegovino" #. 052 msgid "Barbados" msgstr "Barbado" #. 050 msgid "Bangladesh" msgstr "Bangladeŝo" #. 056 msgid "Belgium" msgstr "Belgio" #. 854 msgid "Burkina Faso" msgstr "Burkino" #. 100 msgid "Bulgaria" msgstr "Bulgario" #. 048 msgid "Bahrain" msgstr "Barejno" #. 108 msgid "Burundi" msgstr "Burundio" #. 204 msgid "Benin" msgstr "Benino" #. 652 msgid "Saint Barthelemy" msgstr "Sankta Bartolomeo" #. 060 msgid "Bermuda" msgstr "Bermudo" #. 096 msgid "Brunei Darussalam" msgstr "Brunejo" #. 068 msgid "Bolivia" msgstr "Bolivio" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilo" #. 044 msgid "Bahamas" msgstr "Bahamoj" #. 064 msgid "Bhutan" msgstr "Butano" #. 074 msgid "Bouvet Island" msgstr "Buvet-insulo" #. 072 msgid "Botswana" msgstr "Bocvano" #. 112 msgid "Belarus" msgstr "Belorusio" #. 084 msgid "Belize" msgstr "Belizo" #. 124 msgid "Canada" msgstr "Kanado" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosinsuloj" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratia Respubliko de" #. 140 msgid "Central African Republic" msgstr "Centr-Afrika Respubliko" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Svislando" #. 384 msgid "Cote d'Ivoire" msgstr "Ebur-Bordo" #. 184 msgid "Cook Islands" msgstr "Kukinsuloj" #. 152 msgid "Chile" msgstr "Ĉilio" #. 120 msgid "Cameroon" msgstr "Kamerunio" #. 156 msgid "China" msgstr "Ĉinio" #. 170 msgid "Colombia" msgstr "Kolombio" #. 188 msgid "Costa Rica" msgstr "Kostariko" #. 192 msgid "Cuba" msgstr "Kubo" #. 132 msgid "Cape Verde" msgstr "Kabo-Verdo" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Kristnaskinsulo" #. 196 msgid "Cyprus" msgstr "Kipro" #. 203 msgid "Czech Republic" msgstr "Ĉeĥio" #. 276 msgid "Germany" msgstr "Germanio" #. 262 msgid "Djibouti" msgstr "Ĝibutio" #. 208 msgid "Denmark" msgstr "Danio" #. 212 msgid "Dominica" msgstr "Dominiko" #. 214 msgid "Dominican Republic" msgstr "Domingo" #. 012 msgid "Algeria" msgstr "Alĝerio" #. 218 msgid "Ecuador" msgstr "Ekvadoro" #. 233 msgid "Estonia" msgstr "Estonio" #. 818 msgid "Egypt" msgstr "Egiptio" #. 732 msgid "Western Sahara" msgstr "Okcidenta Saharo" #. 232 msgid "Eritrea" msgstr "Eritreo" #. 724 msgid "Spain" msgstr "Hispanio" #. 231 msgid "Ethiopia" msgstr "Etiopio" #. 246 msgid "Finland" msgstr "Finnlando" #. 242 msgid "Fiji" msgstr "Fiĝioj" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Insuloj Falklandoj-Malvinoj" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezio, Federaciaj Ŝtatoj de" #. 234 msgid "Faroe Islands" msgstr "Ferooj" #. 250 msgid "France" msgstr "Francio" #. 266 msgid "Gabon" msgstr "Gabono" #. 826 msgid "United Kingdom" msgstr "Unuiĝinta Reĝlando" #. 308 msgid "Grenada" msgstr "Grenado" #. 268 msgid "Georgia" msgstr "Kartvelio" #. 254 msgid "French Guiana" msgstr "Franca Gviano" #. 831 msgid "Guernsey" msgstr "Gernezejo" #. 288 msgid "Ghana" msgstr "Ganao" #. 292 msgid "Gibraltar" msgstr "Ĝibraltaro" #. 304 msgid "Greenland" msgstr "Gronlando" #. 270 msgid "Gambia" msgstr "Gambio" #. 324 msgid "Guinea" msgstr "Gvineo" #. 312 msgid "Guadeloupe" msgstr "Gvadelupo" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatora Gvineo" #. 300 msgid "Greece" msgstr "Grekio" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sud-Georgio kaj Sud-Sandviĉinsuloj" #. 320 msgid "Guatemala" msgstr "Gvatemalo" #. 316 msgid "Guam" msgstr "Gvamo" #. 624 msgid "Guinea-Bissau" msgstr "Gvineo-Bisaŭo" #. 328 msgid "Guyana" msgstr "Gujano" #. 344 msgid "Hong Kong" msgstr "Honkongo" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Herda kaj Makdonaldaj insuloj" #. 340 msgid "Honduras" msgstr "Honduro" #. 191 msgid "Croatia" msgstr "Kroatio" #. 332 msgid "Haiti" msgstr "Haitio" #. 348 msgid "Hungary" msgstr "Hungario" #. 360 msgid "Indonesia" msgstr "Indonezio" #. 372 msgid "Ireland" msgstr "Irlando" #. 376 msgid "Israel" msgstr "Israelo" #. 833 msgid "Isle of Man" msgstr "Manksinsulo" #. 356 msgid "India" msgstr "Barato" #. 086 msgid "British Indian Ocean Territory" msgstr "Brita Hindoceana Teritorio" #. 368 msgid "Iraq" msgstr "Irako" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irano, Islama Respubliko" #. 352 msgid "Iceland" msgstr "Islando" #. 380 msgid "Italy" msgstr "Italio" #. 832 msgid "Jersey" msgstr "Ĵerzejo" #. 388 msgid "Jamaica" msgstr "Jamajko" #. 400 msgid "Jordan" msgstr "Jordanio" #. 392 msgid "Japan" msgstr "Japanio" #. 404 msgid "Kenya" msgstr "Kenjo" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizio" #. 116 msgid "Cambodia" msgstr "Kamboĝo" #. 296 msgid "Kiribati" msgstr "Kiribato" #. 174 msgid "Comoros" msgstr "Komoroj" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sankta Kristoforo kaj Neviso" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Koreio, Demokrata Popola Respubliko de" #. 410 msgid "Korea, Republic of" msgstr "Koreio, Respubliko de" #. 414 msgid "Kuwait" msgstr "Kuvajto" #. 136 msgid "Cayman Islands" msgstr "Kajmana Insularo" #. 398 msgid "Kazakhstan" msgstr "Kazaĥio" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoso, Popola Demokrata Respubliko de" #. 422 msgid "Lebanon" msgstr "Libano" #. 662 msgid "Saint Lucia" msgstr "Sankta Lucio" #. 438 msgid "Liechtenstein" msgstr "Liĥtenŝtejno" #. 144 msgid "Sri Lanka" msgstr "Sri-Lanko" #. 430 msgid "Liberia" msgstr "Liberio" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litovio" #. 442 msgid "Luxembourg" msgstr "Luksemburgo" #. 428 msgid "Latvia" msgstr "Latvio" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavio, Respubliko de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Sankta-Marteno (franca parto)" #. 450 msgid "Madagascar" msgstr "Madagaskaro" #. 584 msgid "Marshall Islands" msgstr "Marŝala Insularo" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonio, eksa Jugoslava Respubliko de" #. 466 msgid "Mali" msgstr "Malio" #. 104 msgid "Myanmar" msgstr "Birmo" #. 496 msgid "Mongolia" msgstr "Mongolio" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Nord-Marianoj" #. 474 msgid "Martinique" msgstr "Martiniko" #. 478 msgid "Mauritania" msgstr "Maŭritanio" #. 500 msgid "Montserrat" msgstr "Moncerato" #. 470 msgid "Malta" msgstr "Malto" #. 480 msgid "Mauritius" msgstr "Maŭricio" #. 462 msgid "Maldives" msgstr "Maldivoj" #. 454 msgid "Malawi" msgstr "Malavio" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Malajzio" #. 508 msgid "Mozambique" msgstr "Mozambiko" #. 516 msgid "Namibia" msgstr "Namibio" #. 540 msgid "New Caledonia" msgstr "Nov-Kaledonio" #. 562 msgid "Niger" msgstr "Niĝero" #. 574 msgid "Norfolk Island" msgstr "Norfolkinsulo" #. 566 msgid "Nigeria" msgstr "Nigerio" #. 558 msgid "Nicaragua" msgstr "Nikaragvo" #. 528 msgid "Netherlands" msgstr "Nederlando" #. 578 msgid "Norway" msgstr "Norvegio" #. 524 msgid "Nepal" msgstr "Nepalo" #. 520 msgid "Nauru" msgstr "Nauro" #. 570 msgid "Niue" msgstr "Niuo" #. 554 msgid "New Zealand" msgstr "Nov-Zelando" #. 512 msgid "Oman" msgstr "Omano" #. 591 msgid "Panama" msgstr "Panamo" #. 604 msgid "Peru" msgstr "Peruo" #. 258 msgid "French Polynesia" msgstr "Franca Polinezio" #. 598 msgid "Papua New Guinea" msgstr "Papuo-Nov-Gvineo" #. 608 msgid "Philippines" msgstr "Filipinoj" #. 586 msgid "Pakistan" msgstr "Pakistano" #. 616 msgid "Poland" msgstr "Pollando" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Sankta-Piero kaj Mikelono" #. 612 msgid "Pitcairn" msgstr "Pitkarna Insularo" #. 630 msgid "Puerto Rico" msgstr "Porto-Riko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinaj teritorioj, Okupita" #. 620 msgid "Portugal" msgstr "Portugalio" #. 585 msgid "Palau" msgstr "Palaŭo" #. 600 msgid "Paraguay" msgstr "Paragvajo" #. 634 msgid "Qatar" msgstr "Kataro" #. 638 msgid "Reunion" msgstr "Reunio" #. 642 msgid "Romania" msgstr "Rumanio" #. 688 msgid "Serbia" msgstr "Serbio" #. 643 msgid "Russian Federation" msgstr "Rusa Federacio" #. 646 msgid "Rwanda" msgstr "Ruando" #. 682 msgid "Saudi Arabia" msgstr "Sauda Arabio" #. 090 msgid "Solomon Islands" msgstr "Salomonoj" #. 690 msgid "Seychelles" msgstr "Sejŝeloj" #. 736 msgid "Sudan" msgstr "Sudano" #. 752 msgid "Sweden" msgstr "Svedio" #. 702 msgid "Singapore" msgstr "Singapuro" #. 654 msgid "Saint Helena" msgstr "Sankta Heleno" #. 705 msgid "Slovenia" msgstr "Slovenio" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbardo kaj Jan-Majen-insulo" #. 703 msgid "Slovakia" msgstr "Slovakio" #. 694 msgid "Sierra Leone" msgstr "Siera-Leono" #. 674 msgid "San Marino" msgstr "San-Marino" #. 686 msgid "Senegal" msgstr "Senegalio" #. 706 msgid "Somalia" msgstr "Somalio" #. 740 msgid "Suriname" msgstr "Surinamo" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao-Tomeo kaj Principeo" #. 222 msgid "El Salvador" msgstr "Salvadoro" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirio, Araba Respubliko de" #. 748 msgid "Swaziland" msgstr "Svazilando" #. 796 msgid "Turks and Caicos Islands" msgstr "Turkoj kaj Kajkoj" #. 148 msgid "Chad" msgstr "Ĉado" #. 260 msgid "French Southern Territories" msgstr "Francaj Sudaj Teritorioj" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tajlando" #. 762 msgid "Tajikistan" msgstr "Taĝikio" #. 772 msgid "Tokelau" msgstr "Tokelao" #. 626 msgid "Timor-Leste" msgstr "Orienta Timoro" #. 795 msgid "Turkmenistan" msgstr "Turkmenio" #. 788 msgid "Tunisia" msgstr "Tunizio" #. 776 msgid "Tonga" msgstr "Tongo" #. 792 msgid "Turkey" msgstr "Turkio" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidado kaj Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalo" #. 158 msgid "Taiwan, Province of China" msgstr "Tajvano, Provinco de Ĉinio" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanio, Unuiĝinta Respubliko de" #. 804 msgid "Ukraine" msgstr "Ukrainio" #. 800 msgid "Uganda" msgstr "Ugando" #. 581 msgid "United States Minor Outlying Islands" msgstr "Usonaj Malgrandaj Insuloj" #. 840 msgid "United States" msgstr "Usono" #. 858 msgid "Uruguay" msgstr "Urugvajo" #. 860 msgid "Uzbekistan" msgstr "Uzbekio" #. 336 msgid "Holy See (Vatican City State)" msgstr "Sankta Seĝo (Vatikano)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sankta Vincento kaj la Grenadinoj" #. 862 msgid "Venezuela" msgstr "Venezuelo" #. 092 msgid "Virgin Islands, British" msgstr "Virgulininsuloj, Britaj" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgulininsuloj, Usonaj" #. 704 msgid "Viet Nam" msgstr "Vjetnamio" #. 548 msgid "Vanuatu" msgstr "Vanuatuo" #. 876 msgid "Wallis and Futuna" msgstr "Valiso kaj Futuno" #. 882 msgid "Samoa" msgstr "Samoo" #. 887 msgid "Yemen" msgstr "Jemeno" #. 175 msgid "Mayotte" msgstr "Majoto" #. 710 msgid "South Africa" msgstr "Sud-Afriko" #. 894 msgid "Zambia" msgstr "Zambio" #. 716 msgid "Zimbabwe" msgstr "Zimbabvo" msgid "* Unknown, add is_in tags to those cities" msgstr "* Nekonata, aldonu etikedon is_in al ĉi tiuj urboj" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punktoj de mapoj" msgid "Car" msgstr "Aŭtomobilo" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Lando" msgid "Postal" msgstr "Poŝta" msgid "Town" msgstr "Urbeto" msgid "District" msgstr "Distrikto" msgid "Street" msgstr "Vojo" msgid "Number" msgstr "Numero" msgid "Enter Destination" msgstr "Enigu celon" msgid "Zip Code" msgstr "ZIP-kodo" msgid "City" msgstr "Urbo" msgid "District/Township" msgstr "Distrikto/Urbaro" msgid "Map" msgstr "Mapo" msgid "Bookmark" msgstr "Legosigno" msgid "Destination" msgstr "Celo" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "Legosignoj" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "Malaltigi pligrandigon" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "Altigi pligrandigon" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "Redesegni mapon" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Ĝi malfermas dialogon por serĉi adreson" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "Testi" msgid "_Quit" msgstr "Ĉ_esigi" msgid "Quit the application" msgstr "Ĉesigi la aplikaĵon" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Ŝalti orientiĝon de mapoj al nordo aŭ al vehiklo" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "Montri/kaŝi la priskribon de irvojo" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "Ŝalti aŭtomata ŝanĝo de nivelo de grandigo" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "Datumoj" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NOr" msgid "E" msgstr "Or" msgid "SE" msgstr "SOr" msgid "S" msgstr "S" msgid "SW" msgstr "SOk" msgid "W" msgstr "Ok" msgid "NW" msgstr "NOk" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Alia" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Irvojo %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Irvojo 0000km 0+00:00 ETA" msgid "Help" msgstr "Helpo" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vidi en retumilo" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Vojoj" msgid "House numbers" msgstr "Domnumeroj" msgid "View Attributes" msgstr "Vidi ecojn" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "PDI" msgid "View on map" msgstr "Vidi en mapo" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Eltondi legosignon" msgid "Copy Bookmark" msgstr "Kopii legosignon" msgid "Rename Bookmark" msgstr "Alinomigi legosignon" msgid "Paste Bookmark" msgstr "Alglui legosignon" msgid "Delete Bookmark" msgstr "Forigi legosignon" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Legosignoj" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Aldoni legosignujon" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Alglui legosignon" #, c-format msgid "Bookmark %s" msgstr "Legosigni %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Montri staton de satelitoj" msgid " Elevation " msgstr " Altitudo " msgid " Azimuth " msgstr " Azimuto " msgid "Show NMEA Data" msgstr "Montri NMEA-datumojn" msgid "car" msgstr "aŭto" msgid "bike" msgstr "biciklo" msgid "pedestrian" msgstr "piediranto" #, c-format msgid "Current profile: %s" msgstr "Aktuala profilo: %s" #, c-format msgid "Change profile to: %s" msgstr "Ŝanĝi profilo al: %s" msgid "Set as active" msgstr "Agordi kiel aktiva" msgid "Show Satellite status" msgstr "Montri staton de satelitoj" msgid "Show NMEA data" msgstr "Montri NMEA-datumojn" msgid "Add Bookmark" msgstr "Aldoni legosignon" msgid "Rename" msgstr "Alinomigi" msgid "About Navit" msgstr "Pri Navit" #. Authors msgid "By" msgstr "De" #. Contributors msgid "And all the Navit Team" msgstr "kaj la tuta Navit-skipo" msgid "members and contributors." msgstr "anoj kaj kontribuantoj." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehiklo" msgid "Rules" msgstr "Reguloj" msgid "Lock on road" msgstr "Ŝlosi al vojo" msgid "Northing" msgstr "Nordado" msgid "Map follows Vehicle" msgstr "Mapo sekvas vehiklon" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapoj" msgid "Layout" msgstr "Aranĝo" msgid "Height Profile" msgstr "Altimetrio" msgid "Route Description" msgstr "Priskribo de irvojo" msgid "Show Locale" msgstr "Montri lokaĵaron" msgid "Former Destinations" msgstr "Eksaj celoj" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mesaĝo" msgid "Back" msgstr "Malantaŭen" msgid "Back to map" msgstr "Reen al mapo" msgid "Main Menu" msgstr "Ĉefa menuo" msgid "House number" msgstr "Domnumero" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Pozicio de vehiklo" msgid "Main menu" msgstr "Ĉefa menuo" msgid "" "Show\n" "Map" msgstr "" "Montri\n" "mapon" msgid "Settings" msgstr "Agordoj" msgid "Tools" msgstr "Iloj" msgid "Route" msgstr "Irvojo" msgid "About" msgstr "Pri" msgid "Quit" msgstr "Eliri" msgid "Actions" msgstr "Agoj" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Haltigi\n" "navigadon" msgid "Display" msgstr "Montri" msgid "Fullscreen" msgstr "Tutekrane" msgid "Window Mode" msgstr "Fenestra reĝimo" msgid "Description" msgstr "Priskribo" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "ĉevalo" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "do lasu la trafikcirklon ĉe la %1$s %2$s" navit-0.5.0+dfsg.1/po/es.po.in000066400000000000000000001357731264204753600157360ustar00rootroot00000000000000# Spanish translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Benjamín Valero Espinosa https://launchpad.net/~benjavalero # David A Páez https://launchpad.net/~orlsend # DiegoJ https://launchpad.net/~diegojromerolopez # Emilio Gomez Fernandez https://launchpad.net/~egofer # Feder Sáiz https://launchpad.net/~federsaiz-deactivatedaccount # Inaki Saez https://launchpad.net/~inaki-saez # Jonay https://launchpad.net/~jonay-santana # KaZeR https://launchpad.net/~kazer # Luis Alejandro Rangel Sánchez https://launchpad.net/~xlarsx # Michael von Glasow https://launchpad.net/~michael-vonglasow # Paco Molinero https://launchpad.net/~franciscomol # Ricardo Jurado https://launchpad.net/~ricky131313 # agerio https://launchpad.net/~agerio # iceman75 https://launchpad.net/~javier-orejarena # juliwoodbcn https://launchpad.net/~julianlozano # marZiano https://launchpad.net/~m3marte # pataquets https://launchpad.net/~pataquets # singesang https://launchpad.net/~singesang msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Chris Eubank \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: es\n" msgid "Running from source directory\n" msgstr "Ejecutando desde el directorio fuente\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "configurando '%s' a '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "cero" msgid "first" msgstr "primera" msgid "second" msgstr "segunda" msgid "third" msgstr "tercera" msgid "fourth" msgstr "cuarta" msgid "fifth" msgstr "quinta" msgid "sixth" msgstr "sexta" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "salida cero" msgid "first exit" msgstr "primera salida" msgid "second exit" msgstr "segunda salida" msgid "third exit" msgstr "tercera salida" msgid "fourth exit" msgstr "cuarta salida" msgid "fifth exit" msgstr "quinta salida" msgid "sixth exit" msgstr "sexta salida" #, c-format msgid "%d feet" msgstr "%d pies" #, c-format msgid "in %d feet" msgstr "en %d pies" #, c-format msgid "%d.%d miles" msgstr "%d,%d millas" #, c-format msgid "in %d.%d miles" msgstr "en %d,%d millas" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "una milla" msgstr[1] "%d millas" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "en una milla" msgstr[1] "en %d millas" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "en %d metros" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilómetros" #, c-format msgid "in %d.%d kilometers" msgstr "en %d,%d kilómetros" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilómetro" msgstr[1] "%d kilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "en un kilómetro" msgstr[1] "en %d kilómetros" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$sen la %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$sen la carretera %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sen el %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sen la %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sen la carretera %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "en el carril de entrada" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sen la calle %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sen el %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sen la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sen la calle %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sen la %s" msgid "When possible, please turn around" msgstr "Dé la vuelta cuando sea posible" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "hacia %s" #, c-format msgid "Follow the road for the next %s" msgstr "Continúe en esta carretera durante %s" msgid "Enter the roundabout soon" msgstr "Entre en la próxima rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Salga de la rotonda por la %1$s %2$s" msgid "soon" msgstr "próximamente" msgid "now" msgstr "ahora" msgid "then" msgstr "luego" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "luego entre%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Entre%2$s %1$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "luego entre%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Entre%2$s %1$s" msgid "on your left" msgstr "a la izquierda" msgid "on your right" msgstr "a la derecha" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Tome la salida %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Tome la salida %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "al enlace" msgid "at exit" msgstr "a la salida" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "luego continúe todo recto%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "Continúe todo recto %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "luego manténgase por la derecha%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "Manténgase por la derecha %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "luego manténgase por la izquierda%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "Manténgase por la izquierda %1$s%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "a la derecha" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "a la izquierda" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "ligeramente " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "bruscamente " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tome la %1$s carretera %2$s" #, c-format msgid "after %i roads" msgstr "después de %i carreteras" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Gire %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "luego dé la vuelta" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Dé la vuelta %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "luego dé la vuelta" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Dé la vuelta %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "continúe" msgid "then you have reached your destination." msgstr "entonces ha llegado a su destino." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Ha llegado a su destino %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Enlace" msgid "Exit" msgstr "Salida" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posición" msgid "Command" msgstr "Orden" msgid "Length" msgstr "Longitud" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tiempo" msgid "Destination Length" msgstr "Distancia a destino" msgid "Destination Time" msgstr "Tiempo a destino" msgid "Roadbook" msgstr "Guía" #, c-format msgid "Waypoint %d" msgstr "Punto de paso %d" msgid "Visit before..." msgstr "Visitar antes" msgid "Set as position" msgstr "Definir como origen" msgid "Set as destination" msgstr "Definir como destino" msgid "Add as bookmark" msgstr "Agregar como favorito" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordenadas de pantalla : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emiratos Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afganistán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua y Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antillas Holandesas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Islas de Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbaiyán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benín" #. 652 msgid "Saint Barthelemy" msgstr "San Bartolomé" #. 060 msgid "Bermuda" msgstr "Bermudas" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, San Eustaquio y Saba" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bután" #. 074 msgid "Bouvet Island" msgstr "Isla Bouvet" #. 072 msgid "Botswana" msgstr "Botsuana" #. 112 msgid "Belarus" msgstr "Bielorrusia" #. 084 msgid "Belize" msgstr "Belice" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Islas de Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, República Democrática del" #. 140 msgid "Central African Republic" msgstr "República Centroafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suiza" #. 384 msgid "Cote d'Ivoire" msgstr "Costa de Marfil" #. 184 msgid "Cook Islands" msgstr "Islas Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camerún" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "Curaçao" #. 162 msgid "Christmas Island" msgstr "Isla Natividad" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Checa" #. 276 msgid "Germany" msgstr "Alemania" #. 262 msgid "Djibouti" msgstr "República de Yibuti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Argelia" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipto" #. 732 msgid "Western Sahara" msgstr "Sahara Occidental" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "España" #. 231 msgid "Ethiopia" msgstr "Etiopía" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiyi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Islas Malvinas" #. 583 msgid "Micronesia, Federated States of" msgstr "Estados Federados de Micronesia" #. 234 msgid "Faroe Islands" msgstr "Islas Feroe" #. 250 msgid "France" msgstr "Francia" #. 266 msgid "Gabon" msgstr "Gabón" #. 826 msgid "United Kingdom" msgstr "Reino Unido" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guayana Francesa" #. 831 msgid "Guernsey" msgstr "Guernesey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Ecuatorial" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Islas Georgias del Sur y Sandwich del Sur" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guayana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Islas Heard y McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croacia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungría" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isla de Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Territorio Británico en el Océano Indico" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irán" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japón" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirguistán" #. 116 msgid "Cambodia" msgstr "Camboya" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoras" #. 659 msgid "Saint Kitts and Nevis" msgstr "San Cristóbal y Nieves" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea, República Democrática Popular de" #. 410 msgid "Korea, Republic of" msgstr "Corea, República de" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Islas Caimán" #. 398 msgid "Kazakhstan" msgstr "Kazajstán" #. 418 msgid "Lao People's Democratic Republic" msgstr "República Democrática Popular Lao" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Lucía" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libya" msgstr "Libia" #. 504 msgid "Morocco" msgstr "Marruecos" #. 492 msgid "Monaco" msgstr "Mónaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia, República de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "San Martín (zona francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Islas Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Antigua República Yugoslava de Macedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Islas Marianas del Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricio" #. 462 msgid "Maldives" msgstr "Maldivas" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malasia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nueva Caledonia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Isla Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Países Bajos" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nueva Zelanda" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinesia Francesa" #. 598 msgid "Papua New Guinea" msgstr "Papúa Nueva Guinea" #. 608 msgid "Philippines" msgstr "Filipinas" #. 586 msgid "Pakistan" msgstr "Pakistán" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "San Pedro y Miquelón" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Territorio Palestino Ocupado" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Catar" #. 638 msgid "Reunion" msgstr "Reunión" #. 642 msgid "Romania" msgstr "Rumania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federación de Rusia" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudita" #. 090 msgid "Solomon Islands" msgstr "Islas Salomón" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudán" #. 752 msgid "Sweden" msgstr "Suecia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard y Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslovaquia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leona" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Sudán del Sur" #. 678 msgid "Sao Tome and Principe" msgstr "Santo Tomé y Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "San Martín (parte holandesa)" #. 760 msgid "Syrian Arab Republic" msgstr "República Árabe de Siria" #. 748 msgid "Swaziland" msgstr "Suazilandia" #. 796 msgid "Turks and Caicos Islands" msgstr "Islas Turcas y Caicos" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "Territorios Australes Franceses" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "Tayikistán" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Oriental" #. 795 msgid "Turkmenistan" msgstr "Turkmenistán" #. 788 msgid "Tunisia" msgstr "Túnez" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquía" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad y Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwán, Provincia de China" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, República Unida de" #. 804 msgid "Ukraine" msgstr "Ucrania" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Islas Ultramarinas Menores de los Estados Unidos" #. 840 msgid "United States" msgstr "Estados Unidos" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sede (Ciudad Estado del Vaticano)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "San Vicente y las Granadinas" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Islas Vírgenes, Británicas" #. 850 msgid "Virgin Islands, U.S." msgstr "Islas Vírgenes, EE.UU." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis y Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sudáfrica" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabue" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconocido, añadir etiquetas is_in a estas ciudades" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "No hay fichero de configuración navit.xml, encontrado navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Error cargando el fichero de configuración '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Usando el fichero de configuración '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Inicialización interna fallida, saliendo. Compruebe mensajes previos de " "error\n" msgid "unknown street" msgstr "calle desconocida" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Vehículo sin nombre" msgid "Failed to write bookmarks file" msgstr "Error al escribir el fichero de marcadores" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punto del Mapa" msgid "Car" msgstr "Coche" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Pueblo" msgid "District" msgstr "Distrito" msgid "Street" msgstr "Calle" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Introducir destino" msgid "Zip Code" msgstr "Código postal" msgid "City" msgstr "Ciudad" msgid "District/Township" msgstr "Distrito" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destino" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Visualizar" msgid "_Route" msgstr "_Ruta" msgid "_Former Destinations" msgstr "Destinos _anteriores" msgid "_Bookmarks" msgstr "_Favoritos" msgid "_Map" msgstr "_Mapa" msgid "_Layout" msgstr "D_iseño" msgid "_Projection" msgstr "_Proyección" msgid "_Vehicle" msgstr "_Vehículo" msgid "Zoom_Out" msgstr "A_lejar" msgid "Decrease zoom level" msgstr "Reducir el nivel de zoom" msgid "Zoom_In" msgstr "A_umentar" msgid "Increase zoom level" msgstr "Aumentar el nivel de zoom" msgid "_Recalculate" msgstr "_Recalcular" msgid "Redraw map" msgstr "Redibujar mapa" msgid "_Info" msgstr "_Información" msgid "Set _destination" msgstr "_Fijar destino" msgid "Opens address search dialog" msgstr "Abre el dialogo de busqueda de dirección" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "_Detener navegación" msgid "Test" msgstr "Prueba" msgid "_Quit" msgstr "_Salir" msgid "Quit the application" msgstr "Salir de la aplicación" msgid "Show position _cursor" msgstr "_Mostrar posición del cursor" msgid "_Lock on Road" msgstr "_Bloqueo en la ruta" msgid "_Keep orientation to the North" msgstr "Mantener _orientación al Norte" msgid "Switches map orientation to the north or the vehicle" msgstr "Cambia la orientación del mapa entre el norte y el vehículo" msgid "_Roadbook" msgstr "Guía" msgid "Show/hide route description" msgstr "Mostrar/ocultar descripción de la ruta" msgid "_Autozoom" msgstr "_Autoampliar" msgid "Enable/disable automatic zoom level changing" msgstr "Activa/desactiva nivel de zoom automático" msgid "_Fullscreen" msgstr "Pantalla completa" msgid "Data" msgstr "Datos" msgid "Pharmacy" msgstr "Farmacia" msgid "Restaurant" msgstr "Restaurante" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "Hotel" msgid "Car parking" msgstr "Estacionamiento" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "Cine" msgid "Train station" msgstr "" msgid "School" msgstr "Escuela" msgid "Police" msgstr "Policía" msgid "Justice" msgstr "Juzgado" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d TEL" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 TEL" msgid "Help" msgstr "Ayuda" #, c-format msgid "Waypoint %s" msgstr "Punto de destino %s" msgid "Select waypoint to insert the new one before" msgstr "Escoja el punto de destino para insertar antes el nuevo" msgid "View in Browser" msgstr "Ver en el navegador" msgid "Item type" msgstr "Tipo de objeto" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Calles" msgid "House numbers" msgstr "Números de portal" msgid "View Attributes" msgstr "Ver atributos" msgid "Set as position (and deactivate vehicle)" msgstr "Definir como origen (y desactivar el vehículo)" msgid "POIs" msgstr "PDIs" msgid "View on map" msgstr "Ver en el mapa" msgid "Remove search results from the map" msgstr "Quitar los resultados de búsqueda del mapa" msgid "Show results on the map" msgstr "Mostrar los resultados en el mapa" msgid "Cut Bookmark" msgstr "Cortar marcador" msgid "Copy Bookmark" msgstr "Copiar marcador" msgid "Rename Bookmark" msgstr "Renombrar marcador" msgid "Paste Bookmark" msgstr "Pegar marcador" msgid "Delete Bookmark" msgstr "Eliminar marcador" msgid "Delete waypoint" msgstr "Borrar punto de paso" msgid "Bookmarks" msgstr "Favoritos" msgid "Bookmarks as waypoints" msgstr "Marcadores como puntos de ruta" msgid "Save waypoints" msgstr "Guardar puntos de ruta" msgid "Replace with waypoints" msgstr "Sustituir con puntos de paso" msgid "Delete Folder" msgstr "Borrar carpeta" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Añadir carpeta de marcadores" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Pegar marcador" #, c-format msgid "Bookmark %s" msgstr "Marcador %s" #, c-format msgid "Download %s" msgstr "Descargar %s" msgid "Map Download" msgstr "Descargar mapa" msgid "Active" msgstr "Activo" msgid "Download Enabled" msgstr "Derscaga activada" msgid "Download completely" msgstr "Descargar completo" msgid "Show Satellite Status" msgstr "Mostrar estado de satélite" msgid " Elevation " msgstr " Elevación " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Mostar datos NMEA" msgid "car" msgstr "Coche" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "peatón" #, c-format msgid "Current profile: %s" msgstr "Perfil actual: %s" #, c-format msgid "Change profile to: %s" msgstr "Cambiar perfil a: %s" msgid "Set as active" msgstr "Establecer como activo" msgid "Show Satellite status" msgstr "Mostrar estado de satélite" msgid "Show NMEA data" msgstr "Mostar datos NMEA" msgid "Add Bookmark" msgstr "Añadir marcador" msgid "Rename" msgstr "Renombrar" msgid "About Navit" msgstr "Acerca de Navit" #. Authors msgid "By" msgstr "Por" #. Contributors msgid "And all the Navit Team" msgstr "Y todo el equipo de Navit" msgid "members and contributors." msgstr "miembros y colaboradores" msgid "Waypoints" msgstr "Puntos de paso" msgid "Enter Coordinates" msgstr "Introduzca coordenadas" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "Introduzca coordenadas, por ejemplo:" msgid "Vehicle" msgstr "Vehículo" msgid "Rules" msgstr "Reglas" msgid "Lock on road" msgstr "Bloqueo en la ruta" msgid "Northing" msgstr "Hacia el Norte" msgid "Map follows Vehicle" msgstr "El mapa sigue al vehículo" msgid "Plan with Waypoints" msgstr "Plan con puntos de ruta" msgid "Maps" msgstr "Mapas" msgid "Layout" msgstr "Diseño" msgid "Height Profile" msgstr "Perfil de altura" msgid "Route Description" msgstr "Descripción de ruta" msgid "Show Locale" msgstr "Mostrar locale" msgid "Former Destinations" msgstr "Destinos anteriores" msgid "- No former destinations available -" msgstr "- No hay destinos anteriores -" msgid "Message" msgstr "Mensaje" msgid "Back" msgstr "Atrás" msgid "Back to map" msgstr "Volver al mapa" msgid "Main Menu" msgstr "Menú principal" msgid "House number" msgstr "Número de portal" msgid "Next" msgstr "Siguiente" msgid "Prev" msgstr "Anterior" msgid "Return to route!" msgstr "Vuelva a la ruta" #. warning told msgid "Look out! Camera!" msgstr "¡Atención! Radar" #. warning told msgid "Please decrease your speed" msgstr "Reduzca velocidad por favor" msgid "partial match" msgstr "Coincidencia parcial" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Búsqueda" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Ciudades" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Ruta hasta aquí" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Datos de Mapa (c) contribuyentes de OpenStreetMap, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Mapas descargados" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Cancelar" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Todo el Planeta" msgid "Africa" msgstr "África" msgid "Canary Islands" msgstr "Islas Canarias" msgid "Asia" msgstr "Asia" msgid "Korea" msgstr "Corea" msgid "Taiwan" msgstr "Taiwán" msgid "UAE+Other" msgstr "Emiratos Árabes Unidos + Otros" msgid "Oceania" msgstr "Oceanía" msgid "Tasmania" msgstr "Tasmania" msgid "Victoria" msgstr "Victoria" msgid "New South Wales" msgstr "Nueva Gales del Sur" msgid "Europe" msgstr "Europa" msgid "Western Europe" msgstr "Europa Occidental" msgid "Azores" msgstr "Azores" msgid "BeNeLux" msgstr "Benelux" msgid "Alsace" msgstr "Alsacia" msgid "Aquitaine" msgstr "Aquitania" msgid "Auvergne" msgstr "Auvernia" msgid "Basse-Normandie" msgstr "Baja Normandía" msgid "Bourgogne" msgstr "Borgoña" msgid "Bretagne" msgstr "Bretaña" msgid "Centre" msgstr "Centro" msgid "Champagne-Ardenne" msgstr "Champaña - Ardenas" msgid "Corse" msgstr "Córcega" msgid "Franche-Comte" msgstr "Franco Condado" msgid "Haute-Normandie" msgstr "Alta Normandía" msgid "Ile-de-France" msgstr "Isla de Francia" msgid "Languedoc-Roussillon" msgstr "Languedoc - Rosellón" msgid "Limousin" msgstr "Limusina" msgid "Lorraine" msgstr "Lorena" msgid "Midi-Pyrenees" msgstr "Midi - Pirineos" msgid "Nord-pas-de-Calais" msgstr "Paso Norte de Calais" msgid "Pays-de-la-Loire" msgstr "Países del Loira" msgid "Picardie" msgstr "Paradía" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Alpes - Costa Azul" msgid "Rhone-Alpes" msgstr "Rhone - Alpes" msgid "Baden-Wuerttemberg" msgstr "Baden-Wuerttemberg" msgid "Bayern" msgstr "Baviera" msgid "Mittelfranken" msgstr "Franconia Media" msgid "Niederbayern" msgstr "Baja Baviera" msgid "Oberbayern" msgstr "Alta Baviera" msgid "Oberfranken" msgstr "Alta Franconia" msgid "Oberpfalz" msgstr "Alto Palatinado" msgid "Schwaben" msgstr "Schawben" msgid "Unterfranken" msgstr "Baja Franconia" msgid "Berlin" msgstr "Berlín" msgid "Brandenburg" msgstr "Brandenburgo" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburgo" msgid "Hessen" msgstr "Hessen" msgid "Mecklenburg-Vorpommern" msgstr "Mecklemburgo-Pomerania" msgid "Niedersachsen" msgstr "Niedersachsen" msgid "Nordrhein-westfalen" msgstr "Renania del Norte-Westfalia" msgid "Rheinland-Pfalz" msgstr "Renania del Norte-Westfalia" msgid "Saarland" msgstr "Sarre" msgid "Sachsen-Anhalt" msgstr "Sajonia-Anhalt" msgid "Sachsen" msgstr "Sachsen" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Turingia" msgid "Mallorca" msgstr "Mallorca" msgid "Galicia" msgstr "Galicia" msgid "Scandinavia" msgstr "Escandinavia" msgid "England" msgstr "Inglaterra" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "Yorkshire Este con Hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Yorkshire Sur" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Escocia" msgid "Wales" msgstr "Gales" msgid "Crete" msgstr "Creta" msgid "North America" msgstr "Norteamérica" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawái" msgid "USA" msgstr "Estados Unidos de Norteamérica" msgid " (except Alaska and Hawaii)" msgstr " (excepto Alaska y Hawái)" msgid "Midwest" msgstr "Medio-Oeste" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Noreste" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacífico" msgid "South" msgstr "Sur" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Distrito de Columbia" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Luisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Tejas" msgid "Virginia" msgstr "Virginia" msgid "West Virginia" msgstr "Virginia Occidental" msgid "West" msgstr "Oeste" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "California" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nuevo Méjico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregón" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Estado de Washington" msgid "South+Middle America" msgstr "Suramérica + Centroamérica" msgid "Guyane Francaise" msgstr "Guayana Francesa" msgid "downloading" msgstr "descargando" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "listo" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "No hay suficiente espacio libre" msgid "Error downloading map!" msgstr "Error al descargar el mapa" msgid "Error writing map!" msgstr "Error al guardar el mapa" msgid "Map download aborted!" msgstr "Descarga del mapa interrumpida" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Tiempo estimado" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Mapa descargado" msgid "Vehicle Position" msgstr "Posición del vehículo" msgid "Main menu" msgstr "Menú principal" msgid "" "Show\n" "Map" msgstr "" "Mostrar\n" "Mapa" msgid "Settings" msgstr "Configuración" msgid "Tools" msgstr "Herramientas" msgid "Route" msgstr "Ruta" msgid "About" msgstr "Acerca de" msgid "Quit" msgstr "Salir" msgid "Actions" msgstr "Acciones" msgid "" "Former\n" "Destinations" msgstr "" "Destinos\n" "anteriores" msgid "Coordinates" msgstr "Coordenadas" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "Navegación" msgid "Display" msgstr "Visualizar" msgid "Fullscreen" msgstr "Pantalla completa" msgid "Window Mode" msgstr "Modo ventana" msgid "Description" msgstr "Descripción" msgid "" "Drop last \n" "Waypoint" msgstr "" "Quitar último \n" "Punto de ruta" msgid "" "Drop next \n" "Waypoint" msgstr "" "Quitar el siguiente \n" "Punto de ruta" msgid "Satellite Status" msgstr "Estado Satélites" msgid "NMEA Data" msgstr "Datos NMEA" msgid "car_shortest" msgstr "automovil_ruta_mas_corta" msgid "car_avoid_tolls" msgstr "automovil_evitar_peajes" msgid "car_pedantic" msgstr "Carro_sabelotodo" msgid "horse" msgstr "caballo" msgid "Truck" msgstr "Camión" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Sí" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Iniciado Navit" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit ejecutándose" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Bienvenido a Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Gracias por instalar Navit!\n" "\n" "Para iniciar, seleccione \"Descarga de mapas\" del menú para descargar un " "mapa. Nota: El tamaño del mapa puede ser grande (>50 MB) - se recomienda una " "conexión Wi-Fi.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Disfruta de Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Más información" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Ampliar" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Reducir" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Descargar mapas" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Alternar POIs" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Salir de Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Respaldar / Restaurar" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "¿Borrar este mapa?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Descargando:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Error descargando mapa" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Descarga de mapa interrumpida" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Sin localización. Reabra tras fijar localización." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mapas que contienen localización actual" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Búsqueda por dirección" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Introduzca destino" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Coincidencia parcial en la dirección" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Buscando…" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Dirección no encontrada" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Resultados de la búsqueda" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Cargando resultados de la búsqueda" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Sin resultados" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "No se introdujo texto" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Configurando destino a:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Elija una acción" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Por favor, introduzca una tarjeta SD" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Creando copia de seguridad" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Recuperando..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Error al crear directorio de respaldo" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "La copia de seguridad falló" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "No se ha encontrado copia de seguridad" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Fallo al restaurar" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Copia de seguridad realizada" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Restaurado con éxito\n" "Por favor, reinicie Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Copia de seguridad no encontrada" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Restauración fallida" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Seleccione copia de seguridad" #. Android resource: @strings/backup msgid "Backup" msgstr "Copia de seguridad" #. Android resource: @strings/restore msgid "Restore" msgstr "Restaurar" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "después salga de la rotonda por la %1$s %2$s" navit-0.5.0+dfsg.1/po/et.po.in000066400000000000000000001333711264204753600157270ustar00rootroot00000000000000# Estonian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Andres Kaaber https://launchpad.net/~imapi # Jalakas https://launchpad.net/~jalakas # Manuel Hohmann https://launchpad.net/~mhohmann # lyyser https://launchpad.net/~lyyser # thucar https://launchpad.net/~rait msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-12-22 07:09+0000\n" "Last-Translator: Manuel Hohmann \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: et\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Lähtekataloogist käivitamine\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "määran '%s'-i '%s'-ks\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullis" msgid "first" msgstr "esimene" msgid "second" msgstr "teine" msgid "third" msgstr "kolmas" msgid "fourth" msgstr "neljas" msgid "fifth" msgstr "viies" msgid "sixth" msgstr "kuues" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullindast mahasõidust" msgid "first exit" msgstr "esimesest mahasõidust" msgid "second exit" msgstr "teisest mahasõidust" msgid "third exit" msgstr "kolmandast mahasõidust" msgid "fourth exit" msgstr "neljandast mahasõidust" msgid "fifth exit" msgstr "viiendast mahasõidust" msgid "sixth exit" msgstr "kuuendast mahasõidust" #, c-format msgid "%d feet" msgstr "%d jalga" #, c-format msgid "in %d feet" msgstr "%d jala pärast" #, c-format msgid "%d.%d miles" msgstr "%d.%d miili" #, c-format msgid "in %d.%d miles" msgstr "%d.%d miili pärast" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "üks miil" msgstr[1] "%d miili" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "ühe miili pärast" msgstr[1] "%d miili pärast" #, c-format msgid "%d meters" msgstr "%d meetrit" #, c-format msgid "in %d meters" msgstr "%d meetri pärast" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilomeetrit" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d kilomeetri pärast" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "üks kilomeeter" msgstr[1] "%d kilomeetrit" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ühe kilomeetri pärast" msgstr[1] "%d kilomeetri pärast" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "kaldteele" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s %s%s%s tänavale" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s %s%s%s tänavale" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s %s%s%s tänavale" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s %s%s%s tänavale" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%steele %s" msgid "When possible, please turn around" msgstr "Kui võimalik, palun pööra ümber" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Mööda teed järgmised %s" msgid "Enter the roundabout soon" msgstr "Sõida varsti ringteele" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Sõida ringteele %s" msgid "then enter the roundabout" msgstr "siis sõida ringteele" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Lahku ringteelt %1$s %2$s" msgid "soon" msgstr "varsti" msgid "now" msgstr "nüüd" msgid "then" msgstr "siis" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "vasakul pool" msgid "on your right" msgstr "paremal pool" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "paremale" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "vasakule" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "laugelt " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "järsult " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Vali %1$s tee, mis viib %2$s" #, c-format msgid "after %i roads" msgstr "pärast %i teed" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Pööra %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "siis pööra ümber" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Pööra ümber %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "siis pööra ümber" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Pööra ümber %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "siis oled jõudnud sihtpunkti." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Sa oled jõudnud sihtpunkti %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Mahasõit" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Asukoht" msgid "Command" msgstr "Käsklus" msgid "Length" msgstr "Pikkus" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Aeg" msgid "Destination Length" msgstr "Sihtkoha kaugus" msgid "Destination Time" msgstr "Kohalejõudmise aeg" msgid "Roadbook" msgstr "Teekonna raamat" #, c-format msgid "Waypoint %d" msgstr "Teekonnapunkt %d" msgid "Visit before..." msgstr "Külasta enne..." msgid "Set as position" msgstr "Määra asukohaks" msgid "Set as destination" msgstr "Määra sihtpunktiks" msgid "Add as bookmark" msgstr "Lisa järjehoidjasse" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekraani koordinaadid: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Araabia Ühendemiraadid" #. 004 msgid "Afghanistan" msgstr "Afganistaan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua ja Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albaania" #. 051 msgid "Armenia" msgstr "Armeenia" #. 530 msgid "Netherlands Antilles" msgstr "Hollandi Antillid" #. 024 msgid "Angola" msgstr "Angoola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentiina" #. 016 msgid "American Samoa" msgstr "Ameerika Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Austraalia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Alandi saared" #. 031 msgid "Azerbaijan" msgstr "Azerbaidžaan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia ja Hertsegoviina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benini" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Boliivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius ja Saba" #. 076 msgid "Brazil" msgstr "Brasiilia" #. 044 msgid "Bahamas" msgstr "Bahama saared" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouveti saar" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Valgevene" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kookosesaared" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo Demokraatlik Vabariik" #. 140 msgid "Central African Republic" msgstr "Kesk-Aafrika Vabariik" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Šveits" #. 384 msgid "Cote d'Ivoire" msgstr "Elevandiluu rannik" #. 184 msgid "Cook Islands" msgstr "Cooki saared" #. 152 msgid "Chile" msgstr "Tšiili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Hiina" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuuba" #. 132 msgid "Cape Verde" msgstr "Roheneeme saared" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Jõulusaar" #. 196 msgid "Cyprus" msgstr "Küpros" #. 203 msgid "Czech Republic" msgstr "Tšehhi Vabariik" #. 276 msgid "Germany" msgstr "Saksamaa" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Taani" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikaani Vabariik" #. 012 msgid "Algeria" msgstr "Alžeeria" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Eesti" #. 818 msgid "Egypt" msgstr "Egiptus" #. 732 msgid "Western Sahara" msgstr "Lääne-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Hispaania" #. 231 msgid "Ethiopia" msgstr "Etioopia" #. 246 msgid "Finland" msgstr "Soome" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandi (Malviini) saared" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikroneesia Liiduriigid" #. 234 msgid "Faroe Islands" msgstr "Fääri saared" #. 250 msgid "France" msgstr "Prantsusmaa" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Suurbritannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Prantsuse Guajaana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Gröönimaa" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatoriaal-Guinea" #. 300 msgid "Greece" msgstr "Kreeka" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Lõuna-Georgia ja Lõuna-Sandwichi saared" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guajaana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardi ja McDonaldi saarte ala" #. 340 msgid "Honduras" msgstr "Honduuras" #. 191 msgid "Croatia" msgstr "Horvaatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungari" #. 360 msgid "Indonesia" msgstr "Indoneesia" #. 372 msgid "Ireland" msgstr "Iirimaa" #. 376 msgid "Israel" msgstr "Iisrael" #. 833 msgid "Isle of Man" msgstr "Man'i saar" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Briti India ookeani territoorium" #. 368 msgid "Iraq" msgstr "Iraak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iraani Islamivabariik" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Itaalia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordaania" #. 392 msgid "Japan" msgstr "Jaapan" #. 404 msgid "Kenya" msgstr "Keenia" #. 417 msgid "Kyrgyzstan" msgstr "Kõrgõstan" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoorid" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts ja Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea Rahvademokraatlik Vabariik" #. 410 msgid "Korea, Republic of" msgstr "Korea Vabariik" #. 414 msgid "Kuwait" msgstr "Kuveit" #. 136 msgid "Cayman Islands" msgstr "Kaimani saared" #. 398 msgid "Kazakhstan" msgstr "Kasashtan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laose Demokraatlik Rahvavabariik" #. 422 msgid "Lebanon" msgstr "Liibanon" #. 662 msgid "Saint Lucia" msgstr "Santa Lucía" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libeeria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Leedu" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Läti" #. 434 msgid "Libya" msgstr "Liibüa" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova Vabariik" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "St. Martin (Prantsuse osa)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalli saared" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedoonia, endine Jugoslaavia vabariik" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongoolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Põhja-Mariaani saared" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Marutaania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiivid" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mehhiko" #. 458 msgid "Malaysia" msgstr "Malaisia" #. 508 msgid "Mozambique" msgstr "Mosambiik" #. 516 msgid "Namibia" msgstr "Namiibia" #. 540 msgid "New Caledonia" msgstr "Uus Kaledoonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolki saar" #. 566 msgid "Nigeria" msgstr "Nigeeria" #. 558 msgid "Nicaragua" msgstr "Nikaraagua" #. 528 msgid "Netherlands" msgstr "Holland" #. 578 msgid "Norway" msgstr "Norra" #. 524 msgid "Nepal" msgstr "Nepaal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Uus-Meremaa" #. 512 msgid "Oman" msgstr "Omaan" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peruu" #. 258 msgid "French Polynesia" msgstr "Prantsuse Polüneesia" #. 598 msgid "Papua New Guinea" msgstr "Paapua Uus-Guinea" #. 608 msgid "Philippines" msgstr "Filipiinid" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poola" #. 666 msgid "Saint Pierre and Miquelon" msgstr "St. Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestiina okupeeritud ala" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumeenia" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Venemaa" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Araabia" #. 090 msgid "Solomon Islands" msgstr "Saalomoni saared" #. 690 msgid "Seychelles" msgstr "Seišellid" #. 736 msgid "Sudan" msgstr "Sudaan" #. 752 msgid "Sweden" msgstr "Rootsi" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Sloveenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ja Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakkia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somaalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Lõuna-Sudaan" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome ja Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (Hollandi osa)" #. 760 msgid "Syrian Arab Republic" msgstr "Süüria Araabia Vabariik" #. 748 msgid "Swaziland" msgstr "Svaasimaa" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks ja Caicose saared" #. 148 msgid "Chad" msgstr "Tšaad" #. 260 msgid "French Southern Territories" msgstr "Prantsuse Lõunaalad" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tai" #. 762 msgid "Tajikistan" msgstr "Tadžikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Ida-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tuneesia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türgi" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad ja Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansaania Ühendvabariik" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Ühendriikide hajasaared" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Püha Tool (Vatikan)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent ja Grenadines" #. 862 msgid "Venezuela" msgstr "Venetsueela" #. 092 msgid "Virgin Islands, British" msgstr "Neitsisaared, Briti" #. 850 msgid "Virgin Islands, U.S." msgstr "Neitsisaared, USA" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis ja Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jeemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Lõuna-Aafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Tundmatu, lisa \"is_in\" märge neile linnadele" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Ei leidnud konfiguratsioonifaile navit.xml, navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Viga seadistusfaili lugemisel '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Kasutame seadistusfaili: '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Programmi käivitamine ebaõnnestus. Programmist väljutakse. Kontrolli " "eelnevaid veateateid.\n" msgid "unknown street" msgstr "nimetu tänav" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Nimetu sõiduk" msgid "Failed to write bookmarks file" msgstr "Järjehoidjate faili kirjutamine ebaõnnestus" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kaardipunkt" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Riik" msgid "Postal" msgstr "Postiindeks" msgid "Town" msgstr "Asula" msgid "District" msgstr "Linnaosa" msgid "Street" msgstr "Tänav" msgid "Number" msgstr "Number" msgid "Enter Destination" msgstr "Sisesta sihtpunkt" msgid "Zip Code" msgstr "Postiindeks" msgid "City" msgstr "Linn" msgid "District/Township" msgstr "Linnaosa" msgid "Map" msgstr "Kaart" msgid "Bookmark" msgstr "Järjehoidja" msgid "Destination" msgstr "Sihtpunkt" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Kuva" msgid "_Route" msgstr "_Teekond" msgid "_Former Destinations" msgstr "_Eelmine sihtkoht" msgid "_Bookmarks" msgstr "_Järjehoidjad" msgid "_Map" msgstr "_Kaart" msgid "_Layout" msgstr "_Paigutus" msgid "_Projection" msgstr "_Projektsioon" msgid "_Vehicle" msgstr "_Liiklusvahend" msgid "Zoom_Out" msgstr "Vähenda" msgid "Decrease zoom level" msgstr "Suurendustaseme vähendamine" msgid "Zoom_In" msgstr "Suurenda" msgid "Increase zoom level" msgstr "Suurendustaseme tõstmine" msgid "_Recalculate" msgstr "Arvuta uuesti" msgid "Redraw map" msgstr "Kaardi uuestijoonistamine" msgid "_Info" msgstr "_Teave" msgid "Set _destination" msgstr "Sihtpunkti _määramine" msgid "Opens address search dialog" msgstr "Ava aadressiotsingu aken" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "_Peata navigeerimine" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Välju" msgid "Quit the application" msgstr "Rakenduse sulgemine" msgid "Show position _cursor" msgstr "Positsiooni_kursori näitamine" msgid "_Lock on Road" msgstr "_Lukusta tee peale" msgid "_Keep orientation to the North" msgstr "_Hoia põhjasuunda orienteerituna" msgid "Switches map orientation to the north or the vehicle" msgstr "Vahetab kaardi suuna põhjasuunda või sõiduki järgi" msgid "_Roadbook" msgstr "_Teekonna raamat" msgid "Show/hide route description" msgstr "Näita/peida teekonna kirjeldust" msgid "_Autozoom" msgstr "_Automaatne suurendus" msgid "Enable/disable automatic zoom level changing" msgstr "Luba/keela automaatne suurenduse muutmine" msgid "_Fullscreen" msgstr "_Täisekraan" msgid "Data" msgstr "Andmed" msgid "Pharmacy" msgstr "Apteek" msgid "Restaurant" msgstr "Restoran" msgid "Restaurant. Fast food" msgstr "Restoran. Kiirtoit" msgid "Hotel" msgstr "Hotell" msgid "Car parking" msgstr "Autoparkla" msgid "Fuel station" msgstr "Bensiinijaam" msgid "Bank" msgstr "Pank" msgid "Hospital" msgstr "Haigla" msgid "Cinema" msgstr "Kino" msgid "Train station" msgstr "Raudteejaam" msgid "School" msgstr "Kool" msgid "Police" msgstr "Politsei" msgid "Justice" msgstr "" msgid "Taxi" msgstr "Takso" msgid "Shopping" msgstr "kauplus" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "POI otsing" msgid "Select a category" msgstr "Vali kategooria" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "Vali POI" msgid " " msgstr " " msgid "Category" msgstr "Kategooria" msgid "Direction" msgstr "Suund" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "Nimi" msgid "Visit Before" msgstr "Külasta enne" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nr" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Teekond %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Teekond 0000km 0+00:00 ETA" msgid "Help" msgstr "Abiinfo" #, c-format msgid "Waypoint %s" msgstr "Teekonnapunkt %s" msgid "Select waypoint to insert the new one before" msgstr "Vali teekonnapunkt, mille ette salvestada" msgid "View in Browser" msgstr "Näita brauseris" msgid "Item type" msgstr "Tüüp" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Tänavad" msgid "House numbers" msgstr "Maja numbrid" msgid "View Attributes" msgstr "Näita omadusi" msgid "Set as position (and deactivate vehicle)" msgstr "Määra asukohaks (ja deaktiveeri sõiduk)" msgid "POIs" msgstr "Huvipunktid" msgid "View on map" msgstr "Näita kaardil" msgid "Remove search results from the map" msgstr "Eemalda otsingutulemused kaardilt" msgid "Show results on the map" msgstr "Näita tulemusi kaardil" msgid "Cut Bookmark" msgstr "Lõika järjehoidja" msgid "Copy Bookmark" msgstr "Kopeeri järjehoidja" msgid "Rename Bookmark" msgstr "Järjehoidja ümbernimetamine" msgid "Paste Bookmark" msgstr "Aseta järjehoidja" msgid "Delete Bookmark" msgstr "Kustuta järjehoidja" msgid "Delete waypoint" msgstr "Kustuta teekonnapunkt" msgid "Bookmarks" msgstr "Järjehoidjad" msgid "Bookmarks as waypoints" msgstr "Järjehoidjad teekonnapunktidena" msgid "Save waypoints" msgstr "Teekonnapunktide salvestamine" msgid "Replace with waypoints" msgstr "Asenda teekonnapunktidega" msgid "Delete Folder" msgstr "Kustuta kaust" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Lisa järjehoidja kaust" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Aseta järjehoidja" #, c-format msgid "Bookmark %s" msgstr "Järjehoidja %s" #, c-format msgid "Download %s" msgstr "Lae alla %s" msgid "Map Download" msgstr "Kaardi allalaadimine" msgid "Active" msgstr "Aktiivne" msgid "Download Enabled" msgstr "Allalaadimine lubatud" msgid "Download completely" msgstr "Lae täielikult alla" msgid "Show Satellite Status" msgstr "Näita satelliidi andmeid" msgid " Elevation " msgstr " Kõrgus " msgid " Azimuth " msgstr " Asimuut " msgid "Show NMEA Data" msgstr "Näita NMEA andmeid" msgid "car" msgstr "Auto" msgid "bike" msgstr "Jalgratas" msgid "pedestrian" msgstr "Jalakäija" #, c-format msgid "Current profile: %s" msgstr "Praegune profiil: %s" #, c-format msgid "Change profile to: %s" msgstr "Muuda profiili: %s" msgid "Set as active" msgstr "Määra aktiivseks" msgid "Show Satellite status" msgstr "Näita" msgid "Show NMEA data" msgstr "Näita NMEA andmeid" msgid "Add Bookmark" msgstr "Lisa järjehoidja" msgid "Rename" msgstr "Ümbernimetamine" msgid "About Navit" msgstr "Programmist Navit" #. Authors msgid "By" msgstr "Autorid" #. Contributors msgid "And all the Navit Team" msgstr "Ja kogu Navit meeskond" msgid "members and contributors." msgstr "liikmed ja kaasautorid." msgid "Waypoints" msgstr "Teekonnapunktid" msgid "Enter Coordinates" msgstr "Sisesta koordinaadid" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Laiuskraad Pikkuskraad" msgid "Enter coordinates, for example:" msgstr "Sisesta koordinaadid, näiteks:" msgid "Vehicle" msgstr "Liiklusvahend" msgid "Rules" msgstr "Reeglid" msgid "Lock on road" msgstr "Lukusta teele" msgid "Northing" msgstr "Põhjasuund" msgid "Map follows Vehicle" msgstr "Kaart järgib sõidukit" msgid "Plan with Waypoints" msgstr "Plaan koos teekonnapunktidega" msgid "Maps" msgstr "Kaardid" msgid "Layout" msgstr "Paigutus" msgid "Height Profile" msgstr "Kõrgusprofiil" msgid "Route Description" msgstr "Teekonna kirjeldus" msgid "Show Locale" msgstr "Lokaadi näitamine" msgid "Former Destinations" msgstr "Eelmised sihtpunktid" msgid "- No former destinations available -" msgstr "- Endiseid sihtkohti pole saadaval -" msgid "Message" msgstr "Sõnum" msgid "Back" msgstr "Tagasi" msgid "Back to map" msgstr "Tagasi kaardile" msgid "Main Menu" msgstr "Põhimenüü" msgid "House number" msgstr "Maja number" msgid "Next" msgstr "Järgmine" msgid "Prev" msgstr "Eeelm." msgid "Return to route!" msgstr "Mine tagasi teele!" #. warning told msgid "Look out! Camera!" msgstr "Ettevaatust! Kaamera!" #. warning told msgid "Please decrease your speed" msgstr "Palun vähenda kiirust!" msgid "partial match" msgstr "osaline kattuvus" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Otsing" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Linnad" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Teekond siia" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Kaardi andmed (c) OpenStreetMap kaasautorid, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Allalaetud kaardid" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Keeldu" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Kogu planeet" msgid "Africa" msgstr "Aafrika" msgid "Canary Islands" msgstr "Kannari saared" msgid "Asia" msgstr "Aasia" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Taivan" msgid "UAE+Other" msgstr "Araabia Ühendemiraadid + muud" msgid "Oceania" msgstr "Okeaania" msgid "Tasmania" msgstr "Tasmaania" msgid "Victoria" msgstr "Victoria" msgid "New South Wales" msgstr "Uus-Lõuna-Wales" msgid "Europe" msgstr "Euroopa" msgid "Western Europe" msgstr "Lääne Euroopa" msgid "Azores" msgstr "Assoorid" msgid "BeNeLux" msgstr "BeNeLux" msgid "Alsace" msgstr "Alsace" msgid "Aquitaine" msgstr "Akvitaania" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Basse-Normandie" msgid "Bourgogne" msgstr "Burgundia" msgid "Bretagne" msgstr "Bretagne" msgid "Centre" msgstr "Keskdepartemang" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Korsika" msgid "Franche-Comte" msgstr "Franche-Comte" msgid "Haute-Normandie" msgstr "Haute-Normandie" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lorraine" msgid "Midi-Pyrenees" msgstr "Midi-Pyrenees" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Picardie" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provence-Alpes-Cote-d-Azur" msgid "Rhone-Alpes" msgstr "Rhone-Alpes" msgid "Baden-Wuerttemberg" msgstr "Baden-Wuerttemberg" msgid "Bayern" msgstr "Bayern" msgid "Mittelfranken" msgstr "Kesk-Frangimaa" msgid "Niederbayern" msgstr "Niederbayern" msgid "Oberbayern" msgstr "Oberbayern" msgid "Oberfranken" msgstr "Oberfranken" msgid "Oberpfalz" msgstr "Oberpfalz" msgid "Schwaben" msgstr "Schwaben" msgid "Unterfranken" msgstr "Unterfranken" msgid "Berlin" msgstr "Berliin" msgid "Brandenburg" msgstr "Brandenburg" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hessen" msgid "Mecklenburg-Vorpommern" msgstr "Mecklenburg-Vorpommern" msgid "Niedersachsen" msgstr "Niedersachsen" msgid "Nordrhein-westfalen" msgstr "Nordrhein-westfalen" msgid "Rheinland-Pfalz" msgstr "Rheinland-Pfalz" msgid "Saarland" msgstr "Saarimaa" msgid "Sachsen-Anhalt" msgstr "Sachsen-Anhalt" msgid "Sachsen" msgstr "Sachsen" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Thueringen" msgid "Mallorca" msgstr "Mallorca" msgid "Galicia" msgstr "Galicia" msgid "Scandinavia" msgstr "Skandinaavia" msgid "England" msgstr "Inglismaa" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "Ida Yorkshire koos põhjaga" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Lõuna-Yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Šotimaa" msgid "Wales" msgstr "Wales" msgid "Crete" msgstr "Kreeta" msgid "North America" msgstr "Põhja-Ameerika" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Havai" msgid "USA" msgstr "USA" msgid " (except Alaska and Hawaii)" msgstr " (välja arvatud Alaska ja Hawaii)" msgid "Midwest" msgstr "Kesklääs" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Kirre" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Vaikne ookean" msgid "South" msgstr "Lõuna" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Columbia ringkond" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginia" msgid "West Virginia" msgstr "Lääne-Virginia" msgid "West" msgstr "Lääs" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "California" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "New Mexico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Washingtoni osariik" msgid "South+Middle America" msgstr "Lõuna+Kesk-Ameerika" msgid "Guyane Francaise" msgstr "Prantsuse Guajaana" msgid "downloading" msgstr "allalaadimine" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "valmis" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Pole piisavalt vaba ruumi!" msgid "Error downloading map!" msgstr "Viga kaardi allalaadimisel!" msgid "Error writing map!" msgstr "Viga kaardi kirjutamisel!" msgid "Map download aborted!" msgstr "Kaardi allaladimine katkestatud!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "ETA" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Kaardi allaladimine" msgid "Vehicle Position" msgstr "Sõiduki asukoht" msgid "Main menu" msgstr "Põhimenüü" msgid "" "Show\n" "Map" msgstr "" "Näita\n" "Kaarti" msgid "Settings" msgstr "Seaded" msgid "Tools" msgstr "Tööriistad" msgid "Route" msgstr "Teekond" msgid "About" msgstr "Programmist" msgid "Quit" msgstr "Välju" msgid "Actions" msgstr "Tegevused" msgid "" "Former\n" "Destinations" msgstr "" "Eelnevad\n" "Sihtpunktid" msgid "Coordinates" msgstr "Koordinaadid" msgid "" "Stop\n" "Navigation" msgstr "" "Peata\n" "Navigeerimine" msgid "Display" msgstr "Ekraan" msgid "Fullscreen" msgstr "Täisekraan" msgid "Window Mode" msgstr "Aknarežiim" msgid "Description" msgstr "Kirjeldus" msgid "" "Drop last \n" "Waypoint" msgstr "" "Eemalda eelmine\n" "teekonnapunkt" msgid "" "Drop next \n" "Waypoint" msgstr "" "Eemalda järgmine\n" "teekonnapunkt" msgid "Satellite Status" msgstr "Satelliidi olek" msgid "NMEA Data" msgstr "NMEA Andmed" msgid "car_shortest" msgstr "Auto - Lühim tee" msgid "car_avoid_tolls" msgstr "Auto - Tollide vältimine" msgid "car_pedantic" msgstr "Auto - Pedantne" msgid "horse" msgstr "Hobune" msgid "Truck" msgstr "Veok" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Jah" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit käivitaud" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit töötab" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Teretulemast Navitit kasutama" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Täname, et paigaldasid programmi Navit!\n" "\n" "Alustuseks saate kaarte alla laadida menüüst \"Kaartide allalaadimine\". " "Märkus: kaardi fail võib olla suur (>50 MB) - WiFi ühendus on soovitatav.\n" "\n" "Kaardiandmed: (c) OpenStreetMap kaasautorid\n" "\n" "Naudi programmi kasutamist!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "Olgu" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Rohkem infot" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Suurenda" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Vähenda" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Kaartide allalaadimine" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Huvipunktide lülitamine" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Välju Navitist" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Loo varukoopia/taasta" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Kustuta see kaart?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Allalaadimine:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Viga kaardi allalaadimisel." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Kaardi allalaadimine katkestatud." #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Asukohta pole. Ava uuest pärast asukoha parandust." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Kaart sisaldab praegust asukohta" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Aadressiotsing" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Sisesta sihtkoht" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Sobita osaline aadress" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Otsimine ..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Aadressi ei leitud" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Otsingutulemuste hankimine" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Otsingutulemuste laadimine" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Tulemusi ei leitud" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Teksti pole sisestatud" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Sihtkohaks määramine:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Vali tegevus" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Palun sisesta SD kaart" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Varundamine..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Taastamine..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Varukoopia kausta loomine ebaõnnestus" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Varundamine ebaõnnestus" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Varukoopiat ei leitud" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Taastamine ebaõnnestus" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Varundamine õnnestus" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Taastamine oli edukas\n" "Palun taaskäivita Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Varukoopiat ei leitud" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Taastamine ebaõnnestus" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Vali varukoopia" #. Android resource: @strings/backup msgid "Backup" msgstr "Varundamine" #. Android resource: @strings/restore msgid "Restore" msgstr "Taasta" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "siis lahku ringteelt %1$s %2$s" navit-0.5.0+dfsg.1/po/eu.po.in000066400000000000000000001225541264204753600157310ustar00rootroot00000000000000# Basque translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Inaki Saez https://launchpad.net/~inaki-saez # mikel https://launchpad.net/~mikel85 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Inaki Saez \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: eu\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Iturburu direktoriotik ari\\n\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' '%s'ra ezartzen\\n\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "lehen" msgid "second" msgstr "bigarren" msgid "third" msgstr "hirugarren" msgid "fourth" msgstr "laugarren" msgid "fifth" msgstr "boskarren" msgid "sixth" msgstr "seigarren" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zerogarren irteera" msgid "first exit" msgstr "lehenengo irteera" msgid "second exit" msgstr "bigarren irteera" msgid "third exit" msgstr "hirugarren irteera" msgid "fourth exit" msgstr "laugarren irteera" msgid "fifth exit" msgstr "boskarren" msgid "sixth exit" msgstr "seigarren irteera" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metro" #, c-format msgid "in %d meters" msgstr "%d metrotan" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilometro" #, c-format msgid "in %d.%d kilometers" msgstr "%d,%d kilometrotan" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "kilometro bat" msgstr[1] "%d kilometro" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "kilometro batean" msgstr[1] "%d kilometrotan" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "maldan" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s %s %s %s kalean" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s %s%s%s-an" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s %s%s%s-an" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s %s%s%s-en" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s %s-an" msgid "When possible, please turn around" msgstr "Ahal duzunean eman itzulia, mesedez" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Jarraitu bidean urrengo %s-arte" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Irten errotondatik %1$s-ean %2$s" msgid "soon" msgstr "hurrengotan" msgid "now" msgstr "orain" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "eskuina" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "ezkerra" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "pizka bat " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "gogorki " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Hartu %1$s bidea %2$s-ean" #, c-format msgid "after %i roads" msgstr "%i bideen ondoren" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Biratu %1$s%2$s-ra %3$s%4$s-tan" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "dagoeneko helburura iritsi zara" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "%s helburura iritsi zara" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Irteera" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "kokalekua" msgid "Command" msgstr "Agindua" msgid "Length" msgstr "Luzera" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Denbora" msgid "Destination Length" msgstr "Helbururaino urruntasuna" msgid "Destination Time" msgstr "Helbururaino denbora" msgid "Roadbook" msgstr "Gida" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Kolekua finkatu" msgid "Set as destination" msgstr "Heburuz hautatu" msgid "Add as bookmark" msgstr "Nahikotzat gehitu" #, c-format msgid "Point 0x%x 0x%x" msgstr "Puntu 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Pantaila koordenatuak: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Arabiar Emirerri Batuak" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua eta Barbuda" #. 660 msgid "Anguilla" msgstr "Angila" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Herbeheren Antillak" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikar Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland uharteak" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia-Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgika" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "San Bartolome" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Bruneiko Sultanerria" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Uhartea" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorrusia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Uharteak" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongoko Errepublika Demokratikoa" #. 140 msgid "Central African Republic" msgstr "Ertafrikar Errepublika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Suitza" #. 384 msgid "Cote d'Ivoire" msgstr "Bolikosta" #. 184 msgid "Cook Islands" msgstr "Cook uharteak" #. 152 msgid "Chile" msgstr "Txile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Txina" #. 170 msgid "Colombia" msgstr "Kolonbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Uhartea" #. 196 msgid "Cyprus" msgstr "Txipre" #. 203 msgid "Czech Republic" msgstr "Txekiar Errepublika" #. 276 msgid "Germany" msgstr "Alemania" #. 262 msgid "Djibouti" msgstr "Djibuti" #. 208 msgid "Denmark" msgstr "Danimarka" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikar Errepublika" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipto" #. 732 msgid "Western Sahara" msgstr "Mendebaldeko Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Espainia" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Malvinak Uharteak (Falkland Uharteak)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesiako Estatu Federatuak" #. 234 msgid "Faroe Islands" msgstr "Faroe Uharteak" #. 250 msgid "France" msgstr "Frantzia" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Erresuma Batua" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guayana Frantsesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Ginea" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekuatore Ginea" #. 300 msgid "Greece" msgstr "Grezia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Hegoaldeko Georgia eta Hegoaldeko Sandwich Uharteak" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Ginea-Bissau" #. 328 msgid "Guyana" msgstr "Guayana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Uhartea eta McDonald Uharteak" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroazia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungaria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man Uhartea" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Indiako Ozeanoko Britainiar Lurraldea" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Errepublika Islamikoa" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japonia" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizistan" #. 116 msgid "Cambodia" msgstr "Kanbodia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoroak" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts eta Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Herri-errepublika Demokratikoa (Ipar Korea)" #. 410 msgid "Korea, Republic of" msgstr "Korea, Errepublika (Hego Korea)" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kaiman Uharteak" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos Herri Errepublika Demokratikoa" #. 422 msgid "Lebanon" msgstr "Libano" #. 662 msgid "Saint Lucia" msgstr "Santa Luzia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxenburgo" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia, errepublika" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Frantziar zatia)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall Uharteak" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Mazedonia, Antzineko Jugoslabiar Errepublika" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Ipar Mariana Uharteak" #. 474 msgid "Martinique" msgstr "Martinika" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Maurizio" #. 462 msgid "Maldives" msgstr "Maldibak" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malasia" #. 508 msgid "Mozambique" msgstr "Mozambike" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Kaledonia Berria" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Uhartea" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Herbehereak" #. 578 msgid "Norway" msgstr "Norvegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Zelanda Berria" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Polinesia Frantsesa" #. 598 msgid "Papua New Guinea" msgstr "Papua Ginea Berria" #. 608 msgid "Philippines" msgstr "Filipinak" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre eta Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinar Lurralde Okupatuak" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Errumania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Errusiako Federazioa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Solomon Uharteak" #. 690 msgid "Seychelles" msgstr "Seychelleak" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suedia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard eta Jan Mayen Uharteak" #. 703 msgid "Slovakia" msgstr "Eslovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leona" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome eta Printze" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Siriako Arabiar Errepublika" #. 748 msgid "Swaziland" msgstr "Swazilandia" #. 796 msgid "Turks and Caicos Islands" msgstr "Turk eta Caico uharteak" #. 148 msgid "Chad" msgstr "Txad" #. 260 msgid "French Southern Territories" msgstr "Hegoaldeko Lurralde Frantsesak" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Ekialdeko Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad eta Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Txinako Errepublika" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzaniako Errepublika Batua" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Estatu Batuetako Itsas Bestaldeko Uharte Txikiak" #. 840 msgid "United States" msgstr "Estatu Batuak" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanoko hiria" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent eta Grenadinak" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Birgina Uharteak, Britainarrak" #. 850 msgid "Virgin Islands, U.S." msgstr "Birjina Uharteak, A.E.B." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis eta Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Hegoafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Ezezaguna, gehitu -en_dago etiketak hiri hauentzat" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Mapako puntua" msgid "Car" msgstr "Berebila" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Herrialdea" msgid "Postal" msgstr "Posta" msgid "Town" msgstr "Herria" msgid "District" msgstr "Barrutia" msgid "Street" msgstr "Kalea" msgid "Number" msgstr "Zenbakia" msgid "Enter Destination" msgstr "Sartu helburua" msgid "Zip Code" msgstr "Posta-kodea" msgid "City" msgstr "Hiria" msgid "District/Township" msgstr "Auzoa" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Gogokoa" msgid "Destination" msgstr "Helburua" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Bistaratzea" msgid "_Route" msgstr "Ibilbidea" msgid "_Former Destinations" msgstr "Aurreko Helburuak" msgid "_Bookmarks" msgstr "Gogokoak" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Antolaketa" msgid "_Projection" msgstr "Proiekzioa" msgid "_Vehicle" msgstr "Ibilgailua" msgid "Zoom_Out" msgstr "Hurrundu" msgid "Decrease zoom level" msgstr "Txikitu zooma" msgid "Zoom_In" msgstr "Hurbildu" msgid "Increase zoom level" msgstr "Handitu zooma" msgid "_Recalculate" msgstr "Birkalkulatu" msgid "Redraw map" msgstr "Mapa Birmargotu" msgid "_Info" msgstr "Datuak" msgid "Set _destination" msgstr "Helburua ezarri" msgid "Opens address search dialog" msgstr "Ireki helbidea bilatzeko lehioa" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Nabigazioa Gelditu" msgid "Test" msgstr "Saiatu" msgid "_Quit" msgstr "_Irten" msgid "Quit the application" msgstr "Irten programatik" msgid "Show position _cursor" msgstr "Erakutsi kurtsore kokalekua" msgid "_Lock on Road" msgstr "Bidean oztopoa" msgid "_Keep orientation to the North" msgstr "Iparralderantz begira" msgid "Switches map orientation to the north or the vehicle" msgstr "Maparen norabidea iparralde edo berebilaren artean aldatu" msgid "_Roadbook" msgstr "Gida" msgid "Show/hide route description" msgstr "Erakutsi/ezkutatu hibilbidearen berri" msgid "_Autozoom" msgstr "Autohanditu" msgid "Enable/disable automatic zoom level changing" msgstr "Zoom automatikoa onartu/debekatu" msgid "_Fullscreen" msgstr "Pantaila osoa" msgid "Data" msgstr "Datuak" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "I" msgid "NE" msgstr "IE" msgid "E" msgstr "E" msgid "SE" msgstr "HE" msgid "S" msgstr "H" msgid "SW" msgstr "HM" msgid "W" msgstr "M" msgid "NW" msgstr "IM" #. Android resource: @strings/no msgid "No" msgstr "Ez" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ibilide %4.0fkm %02d:%02d EDI" msgid "Route 0000km 0+00:00 ETA" msgstr "Ibilbide 0000km 0+00:00 EDI" msgid "Help" msgstr "Laguntza" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ikusi nabigatzailean" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Kaleak" msgid "House numbers" msgstr "Etxebizitza zenbakiak" msgid "View Attributes" msgstr "Atributoak erakutsi" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "PIak" msgid "View on map" msgstr "Mapan Ikusi" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Moztu Gogokoa" msgid "Copy Bookmark" msgstr "Kopiatu Gogokoa" msgid "Rename Bookmark" msgstr "Gogokoa berrizendatu" msgid "Paste Bookmark" msgstr "Itsatsi Gogokoa" msgid "Delete Bookmark" msgstr "Ezabatu Gogokoa" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Gogokoak" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Gehitu Gogokoen direktorioa" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Itsatsi gogokoa" #, c-format msgid "Bookmark %s" msgstr "%s marka" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Sateliteen egoera erakutsi" msgid " Elevation " msgstr " Garaiera " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "NMEA datuak erakutsi" msgid "car" msgstr "berebila" msgid "bike" msgstr "bizikleta" msgid "pedestrian" msgstr "oinezkoa" #, c-format msgid "Current profile: %s" msgstr "Oraingo profila: %s" #, c-format msgid "Change profile to: %s" msgstr "Profila aldatu: %s-ra" msgid "Set as active" msgstr "Lanean ezarri" msgid "Show Satellite status" msgstr "Sateliteen egoera erakutsi" msgid "Show NMEA data" msgstr "NMEA datuak erakutsi" msgid "Add Bookmark" msgstr "Gogokoa gehitu" msgid "Rename" msgstr "Izena aldatu" msgid "About Navit" msgstr "Naviti buruz" #. Authors msgid "By" msgstr "Egileak" #. Contributors msgid "And all the Navit Team" msgstr "Eta Navit talde osoa" msgid "members and contributors." msgstr "partaide eta laguntzaileak." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Ibilgailua" msgid "Rules" msgstr "Arauak" msgid "Lock on road" msgstr "Bidean oztopoa" msgid "Northing" msgstr "Iparrerantz" msgid "Map follows Vehicle" msgstr "Mapak ibilgailua jarraitzen du" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapak" msgid "Layout" msgstr "Antolaketa" msgid "Height Profile" msgstr "Garaiera ikusi" msgid "Route Description" msgstr "Ibilbidearen nondik-norakoa" msgid "Show Locale" msgstr "Locale erakutsi" msgid "Former Destinations" msgstr "Aurreko Helburuak" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mezua" msgid "Back" msgstr "Atzera" msgid "Back to map" msgstr "Mapara itzuli" msgid "Main Menu" msgstr "Menu nagusia" msgid "House number" msgstr "Etxebizitza zenbakia" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Berebilaren kokalekua" msgid "Main menu" msgstr "Menu nagusia" msgid "" "Show\n" "Map" msgstr "" "Mapa\n" "Erakutsi" msgid "Settings" msgstr "Ezarpenak" msgid "Tools" msgstr "Tresnak" msgid "Route" msgstr "Ibilbidea" msgid "About" msgstr "Honi buruz" msgid "Quit" msgstr "Irten" msgid "Actions" msgstr "Ekintzak" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Nabigazioa\n" "Gelditu" msgid "Display" msgstr "Bistaratzea" msgid "Fullscreen" msgstr "Pantaila osoa" msgid "Window Mode" msgstr "Lehio modua" msgid "Description" msgstr "Zehazketa" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "zaldia" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "gero, irten errotondatik %1$s-ean %2$s" navit-0.5.0+dfsg.1/po/fa.po.in000066400000000000000000001131771264204753600157070ustar00rootroot00000000000000# Persian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Michael von Glasow https://launchpad.net/~michael-vonglasow # reza ghasemirad https://launchpad.net/~regh778 # the_cephalex https://launchpad.net/~ali-rashidi msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: fa\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "نخست" msgid "second" msgstr "دوم" msgid "third" msgstr "سوم" msgid "fourth" msgstr "چهارم" msgid "fifth" msgstr "پنجم" msgid "sixth" msgstr "ششم" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "هفتم" msgid "first exit" msgstr "نخستین راه" msgid "second exit" msgstr "دومین راه" msgid "third exit" msgstr "سومین راه" msgid "fourth exit" msgstr "چهارمین راه" msgid "fifth exit" msgstr "پنحمین راه" msgid "sixth exit" msgstr "ششمین راه" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "%d فوت" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d متر" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "به سوی شیب" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "هنگامیکه توانستید برگردید." #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "به زودی به فلکه بروید" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "به زودی" msgid "now" msgstr "اکنون" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "راست" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "چپ" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "به آسانی " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "به سختی " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "سپس شما به خواستگاه خود رسیده اید." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "بیرون" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "جایگاه" msgid "Command" msgstr "دستور" msgid "Length" msgstr "درازا" msgid "km" msgstr "کیلومتر" msgid "m" msgstr "متر" msgid "Time" msgstr "زمان" msgid "Destination Length" msgstr "درازای خواستگاه" msgid "Destination Time" msgstr "زمان خواستگاه" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "تنظیم جایگاه" msgid "Set as destination" msgstr "تنظیم برای خواستگاه" msgid "Add as bookmark" msgstr "افزودن به فهرست" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "امارات متحده‌ی عربی" #. 004 msgid "Afghanistan" msgstr "افغانستان" #. 028 msgid "Antigua and Barbuda" msgstr "اَنتیگا و باربودا" #. 660 msgid "Anguilla" msgstr "آنگولا" #. 008 msgid "Albania" msgstr "آلبانی" #. 051 msgid "Armenia" msgstr "ارمنستان" #. 530 msgid "Netherlands Antilles" msgstr "آنتیل هلند" #. 024 msgid "Angola" msgstr "آنگولا" #. 010 msgid "Antarctica" msgstr "آنتارکتیکا" #. 032 msgid "Argentina" msgstr "آرژانتین" #. 016 msgid "American Samoa" msgstr "سومای امریکا" #. 040 msgid "Austria" msgstr "اتریش" #. 036 msgid "Australia" msgstr "استرالیا" #. 533 msgid "Aruba" msgstr "آروبا" #. 248 msgid "Aland Islands" msgstr "جزایر الند" #. 031 msgid "Azerbaijan" msgstr "آذربایجان" #. 070 msgid "Bosnia and Herzegovina" msgstr "بوسنی و هرزگوین" #. 052 msgid "Barbados" msgstr "بارابادوس" #. 050 msgid "Bangladesh" msgstr "بنگلادش" #. 056 msgid "Belgium" msgstr "بلژیک" #. 854 msgid "Burkina Faso" msgstr "بورکینافاسو" #. 100 msgid "Bulgaria" msgstr "بلغارستان" #. 048 msgid "Bahrain" msgstr "بحرین" #. 108 msgid "Burundi" msgstr "بوروندی" #. 204 msgid "Benin" msgstr "بنین" #. 652 msgid "Saint Barthelemy" msgstr "سن بارتلمی" #. 060 msgid "Bermuda" msgstr "برمودا" #. 096 msgid "Brunei Darussalam" msgstr "برونئی دارالسلام" #. 068 msgid "Bolivia" msgstr "بولیوی" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "برزیل" #. 044 msgid "Bahamas" msgstr "باهاماس" #. 064 msgid "Bhutan" msgstr "بوتان" #. 074 msgid "Bouvet Island" msgstr "جزیره‌ی بووت" #. 072 msgid "Botswana" msgstr "بوتسوانا" #. 112 msgid "Belarus" msgstr "بلاروس" #. 084 msgid "Belize" msgstr "بلیز" #. 124 msgid "Canada" msgstr "کانادا" #. 166 msgid "Cocos (Keeling) Islands" msgstr "جزایر کوکوس" #. 180 msgid "Congo, Democratic Republic of the" msgstr "کنگو، جمهوری دموکراتیک" #. 140 msgid "Central African Republic" msgstr "جمهوری افریقای مرکزی" #. 178 msgid "Congo" msgstr "کونگو" #. 756 msgid "Switzerland" msgstr "سوئیس" #. 384 msgid "Cote d'Ivoire" msgstr "ساحل عاج" #. 184 msgid "Cook Islands" msgstr "جزایر کوک" #. 152 msgid "Chile" msgstr "شیلی" #. 120 msgid "Cameroon" msgstr "کامرون" #. 156 msgid "China" msgstr "چین" #. 170 msgid "Colombia" msgstr "کلمبیا" #. 188 msgid "Costa Rica" msgstr "کاستاریکا" #. 192 msgid "Cuba" msgstr "کوبا" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "قبرس" #. 203 msgid "Czech Republic" msgstr "جمهوری چک" #. 276 msgid "Germany" msgstr "آلمان" #. 262 msgid "Djibouti" msgstr "جیبوتی" #. 208 msgid "Denmark" msgstr "دانمارک" #. 212 msgid "Dominica" msgstr "دومینیکا" #. 214 msgid "Dominican Republic" msgstr "جمهوری دومنیکن" #. 012 msgid "Algeria" msgstr "الجزایر" #. 218 msgid "Ecuador" msgstr "اکوادور" #. 233 msgid "Estonia" msgstr "استونی" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/fi.po.in000066400000000000000000001230431264204753600157100ustar00rootroot00000000000000# Finnish translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Eero https://launchpad.net/~eero+launchpad # Elias Julkunen https://launchpad.net/~eliasj # Jiri Grönroos https://launchpad.net/~jiri-gronroos # Mikko Virkkilä https://launchpad.net/~virkkila # Ossi Berg https://launchpad.net/~fso-polonez # Roadrunner IN https://launchpad.net/~online # Timo Jyrinki https://launchpad.net/~timo-jyrinki msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Ossi Berg \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: fi\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Ajetaan lähdehakemistosta\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "asetetaan '%s' arvoon '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nollas" msgid "first" msgstr "ensimmäinen" msgid "second" msgstr "toinen" msgid "third" msgstr "kolmas" msgid "fourth" msgstr "neljäs" msgid "fifth" msgstr "viides" msgid "sixth" msgstr "kuudes" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nollannesta liittymästä" msgid "first exit" msgstr "ensimmäisestä liittymästä" msgid "second exit" msgstr "toisesta liittymästä" msgid "third exit" msgstr "kolmannesta liittymästä" msgid "fourth exit" msgstr "neljännestä liittymästä" msgid "fifth exit" msgstr "viidennestä liittymästä" msgid "sixth exit" msgstr "kuudennesta liittymästä" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metriä" #, c-format msgid "in %d meters" msgstr "%d metrin päästä" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometriä" #, c-format msgid "in %d.%d kilometers" msgstr "%d,%d kilometrin päästä" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "yksi kilometri" msgstr[1] "%d kilometriä" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "Yhden kilometrin päästä" msgstr[1] "%d kilometrin päästä" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "rampille" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%skadulle %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%skadulle %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%skadulle %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%skadulle %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%stielle %s" msgid "When possible, please turn around" msgstr "Kun mahdollista, tee u-käännös" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Seuraa tätä tietä %s" msgid "Enter the roundabout soon" msgstr "Liity liikenneympyrään pian" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "pian" msgid "now" msgstr "nyt" msgid "then" msgstr "sitten" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "oikealle" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "vasemmalle" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "loivasti " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "jyrkästi " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Valitse %1$s tie suuntaan %2$s" #, c-format msgid "after %i roads" msgstr "%i tien jälkeen" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Käänny %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "tee sitten u-käännös" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Tee u-käännös %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "tee sitten u-käännös" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Tee u-käännös %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "sitten olet perillä." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Olet saavuttanut kohteesi %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Poistumistie" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Sijainti" msgid "Command" msgstr "Komento" msgid "Length" msgstr "Pituus" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Aika" msgid "Destination Length" msgstr "Kohde" msgid "Destination Time" msgstr "Kohde" msgid "Roadbook" msgstr "Ohjeistaja" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Aseta sijainniksi" msgid "Set as destination" msgstr "Aseta kohteeksi" msgid "Add as bookmark" msgstr "Lisää kirjanmerkiksi" #, c-format msgid "Point 0x%x 0x%x" msgstr "Piste 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ruutu %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Yhdistyneet Arabiemiirikunnat" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua ja Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Alankomaiden Antillit" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Etelänapamanner" #. 032 msgid "Argentina" msgstr "Argentiina" #. 016 msgid "American Samoa" msgstr "Amerikan Samoa" #. 040 msgid "Austria" msgstr "Itävalta" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ahvenanmaa" #. 031 msgid "Azerbaijan" msgstr "Azerbaizan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia ja Hertsegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilia" #. 044 msgid "Bahamas" msgstr "Bahamasaaret" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet'n saari" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Valko-Venäjä" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kookossaaret (Keeling-saaret)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongon tasavalta" #. 140 msgid "Central African Republic" msgstr "Keski-Afrikan tasavalta" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Sveitsi" #. 384 msgid "Cote d'Ivoire" msgstr "Norsunluurannikko" #. 184 msgid "Cook Islands" msgstr "Cook-saaret" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kiina" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Joulusaari" #. 196 msgid "Cyprus" msgstr "Kypros" #. 203 msgid "Czech Republic" msgstr "Tsekin tasavalta" #. 276 msgid "Germany" msgstr "Saksa" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Tanska" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikaaninen tasavalta" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Viro" #. 818 msgid "Egypt" msgstr "Egypti" #. 732 msgid "Western Sahara" msgstr "Länsi-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Espanja" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Suomi" #. 242 msgid "Fiji" msgstr "Fidzi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-saaret (Malvinas-saaret)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesian liittovaltio" #. 234 msgid "Faroe Islands" msgstr "Färsaaret" #. 250 msgid "France" msgstr "Ranska" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Iso-Britannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Ranskan Guinea" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönlanti" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Päiväntasaajan Guinea" #. 300 msgid "Greece" msgstr "Kreikka" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Etelä-Georgia ja Eteläiset Sandwichsaaret" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardin saari ja McDonaldin saaret" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Unkari" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanti" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Mansaari" #. 356 msgid "India" msgstr "Intia" #. 086 msgid "British Indian Ocean Territory" msgstr "Brittiläinen Intian valtameren alue" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iranin islamilainen tasavalta" #. 352 msgid "Iceland" msgstr "Islanti" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japani" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodza" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorit" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts ja Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Pohjois-Korea" #. 410 msgid "Korea, Republic of" msgstr "Etelä-Korea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Caymansaaret" #. 398 msgid "Kazakhstan" msgstr "Kazakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laosin demokraattinen tasavalta" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Liettua" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint-Martin (Ranskan osa)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallinsaaret" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Entinen Jugoslavian tasavalta Makedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Pohjois-Mariaanit" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediivit" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Malesia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Uusi-Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkinsaaret" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Alankomaat" #. 578 msgid "Norway" msgstr "Norja" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Uusi-Seelanti" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Ranskan Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua Uusi-Guinea" #. 608 msgid "Philippines" msgstr "Filippiinit" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Puola" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre ja Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestiinalaisalueet, miehitetyt" #. 620 msgid "Portugal" msgstr "Portugali" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Venäjä" #. 646 msgid "Rwanda" msgstr "Ruanda" # #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. 090 msgid "Solomon Islands" msgstr "Salomonsaaret" #. 690 msgid "Seychelles" msgstr "Seychellit" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Ruotsi" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ja Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome ja Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syyrian arabitasavalta" #. 748 msgid "Swaziland" msgstr "Swazimaa" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- ja Caicossaaret" #. 148 msgid "Chad" msgstr "Tšad" #. 260 msgid "French Southern Territories" msgstr "Ranskan eteläiset alueet" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thaimaa" #. 762 msgid "Tajikistan" msgstr "Tadzikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Itä-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkki" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad ja Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Kiinan maakunta" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania, yhdistynyt tasavalta" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Yhdysvaltojen Tyynenmeren erillissaaret" #. 840 msgid "United States" msgstr "Yhdysvallat" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikaanivaltio (Pyhä Istuin)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent ja Grenadiinit" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Neitsytsaaret, brittiläiset" #. 850 msgid "Virgin Islands, U.S." msgstr "Neitsytsaaret, Yhdysvaltojen" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- ja Futunasaaret" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Etelä-Afrikka" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Tuntematon, lisätä is_in koodit näistä kaupungeista" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Karttapiste" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Maa" # msgid "Postal" msgstr "Postinumero" msgid "Town" msgstr "Paikkakunta" # msgid "District" msgstr "Alue" msgid "Street" msgstr "Katu" msgid "Number" msgstr "Numero" # msgid "Enter Destination" msgstr "Anna kohde" msgid "Zip Code" msgstr "Postinumero" msgid "City" msgstr "Kaupunki" msgid "District/Township" msgstr "Maakunta" msgid "Map" msgstr "Kartta" msgid "Bookmark" msgstr "Kirjanmerkki" msgid "Destination" msgstr "Kohde" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Näyttö" msgid "_Route" msgstr "Reitti" msgid "_Former Destinations" msgstr "Aiemmat kohteet" msgid "_Bookmarks" msgstr "Kirjanmerkit" msgid "_Map" msgstr "Kartta" msgid "_Layout" msgstr "Pohja" msgid "_Projection" msgstr "Projektio" msgid "_Vehicle" msgstr "Kulkuneuvo" msgid "Zoom_Out" msgstr "Loitonna" msgid "Decrease zoom level" msgstr "Loitonna" msgid "Zoom_In" msgstr "Lähennä" msgid "Increase zoom level" msgstr "Lähennä" msgid "_Recalculate" msgstr "Laske uudelleen" msgid "Redraw map" msgstr "Piirrä kartta uudelleen" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Avaa osoitehaun ikkunan" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Lopeta navigointi" msgid "Test" msgstr "Testi" msgid "_Quit" msgstr "Sulje" msgid "Quit the application" msgstr "Lopeta sovellus" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lukitse tiehen" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Vaihtaa kartan asentoa pohjoisen ja kulkuvälineen suunnan välillä" msgid "_Roadbook" msgstr "Ohjeistaja" msgid "Show/hide route description" msgstr "Näytä/piillota reitin kuvaus" msgid "_Autozoom" msgstr "Autom. suurennus" msgid "Enable/disable automatic zoom level changing" msgstr "" "Ota automaattinen lähennystason muuttaminen käyttöön tai pois käytöstä" msgid "_Fullscreen" msgstr "Koko ruutu" msgid "Data" msgstr "Tieto" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Ei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Reitti %4.0fkm, arvioitu aika %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Reitti 0000km, arvioitu aika 0+00:00" msgid "Help" msgstr "Ohje" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Näytä selaimessa" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Kadut" msgid "House numbers" msgstr "Talojen numerot" msgid "View Attributes" msgstr "Näytä ominaisuudet" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIt" msgid "View on map" msgstr "Näytä kartalla" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Leikkaa kirjanmerkki" msgid "Copy Bookmark" msgstr "Kopioi kirjanmerkki" msgid "Rename Bookmark" msgstr "Nimeä kirjanmerkki uudelleen" msgid "Paste Bookmark" msgstr "Liitä kirjanmerkki" msgid "Delete Bookmark" msgstr "Poista kirjanmerkki" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Kirjanmerkit" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Lisää kirjanmerkkikansio" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Liitä kirjanmerkki" #, c-format msgid "Bookmark %s" msgstr "Tee kirjanmerkki %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Näytä satelliittien tila" msgid " Elevation " msgstr " Korkeus " msgid " Azimuth " msgstr " Atsimuutti " msgid "Show NMEA Data" msgstr "Näytä NMEA-tiedot" msgid "car" msgstr "auto" msgid "bike" msgstr "Pyörän" msgid "pedestrian" msgstr "jalankulkijoiden" #, c-format msgid "Current profile: %s" msgstr "Nykyinen profiili: %s" #, c-format msgid "Change profile to: %s" msgstr "Muuta profiilin: %s" msgid "Set as active" msgstr "Aseta aktiiviseksi" msgid "Show Satellite status" msgstr "Näytä satelliittien tila" msgid "Show NMEA data" msgstr "Näytä NMEA-tiedot" msgid "Add Bookmark" msgstr "Lisää kirjanmerkki" msgid "Rename" msgstr "Nimeä uudelleen" msgid "About Navit" msgstr "Tietoja - Navit" #. Authors msgid "By" msgstr "Tekijä" #. Contributors msgid "And all the Navit Team" msgstr "sekä koko Navit-tiimi" msgid "members and contributors." msgstr "jäsenet ja osallistujat." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Kulkuneuvo" msgid "Rules" msgstr "Säännöt" msgid "Lock on road" msgstr "Lukitse tiehen" msgid "Northing" msgstr "Pohjoinen ylhäällä" msgid "Map follows Vehicle" msgstr "Kartta seuraa ajoneuvoa" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kartat" msgid "Layout" msgstr "Pohja" msgid "Height Profile" msgstr "Korkeusprofiili" msgid "Route Description" msgstr "Reitin kuvaus" msgid "Show Locale" msgstr "Näytä maa-asetusto" msgid "Former Destinations" msgstr "Aiemmat kohteet" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Viesti" msgid "Back" msgstr "Takaisin" msgid "Back to map" msgstr "Takaisin karttaan" msgid "Main Menu" msgstr "Päävalikko" msgid "House number" msgstr "Talon numero" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Ajoneuvon sijainti" msgid "Main menu" msgstr "Päävalikko" msgid "" "Show\n" "Map" msgstr "" "Näytä\n" "kartta" msgid "Settings" msgstr "Asetukset" msgid "Tools" msgstr "Työkalut" msgid "Route" msgstr "Reitti" msgid "About" msgstr "Tietoja" msgid "Quit" msgstr "Lopeta" msgid "Actions" msgstr "Toiminnat" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Lopeta\n" "Suunnistus" msgid "Display" msgstr "Näyttö" msgid "Fullscreen" msgstr "Koko ruutu" msgid "Window Mode" msgstr "Ikkunatila" msgid "Description" msgstr "Kuvaus" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hevonen" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/fil.po.in000066400000000000000000001110021264204753600160540ustar00rootroot00000000000000# Filipino translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # chito https://launchpad.net/~cnuarin msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: chito \n" "Language-Team: Filipino \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "Language: fil\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "pang-apat" msgid "fifth" msgstr "pang-lima" msgid "sixth" msgstr "pang-anim" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "unang labasan" msgid "second exit" msgstr "pangalawang labasan" msgid "third exit" msgstr "pangatlong labasan" msgid "fourth exit" msgstr "pang-apat na labasan" msgid "fifth exit" msgstr "panglimang labasan" msgid "sixth exit" msgstr "pang-anim na labasan" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometro" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d kilometro" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "%d kilometro" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "sa loob ng isang kilometro" msgstr[1] "sa loob ng %d kilometro" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s sa kalyeng %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s sa kalyeng %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s sa kalyeng %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s sa kalyeng %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "Kung maari ay bumalik" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Sundan ang kalye sa susunod na %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Lisanin ang rotonda sa may %1$s %2$s" msgid "soon" msgstr "" msgid "now" msgstr "ngayon na" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "kanan" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "Kaliwa" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "ng marahan " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Labasan" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "pagkatapos ay lumabas sa rotonda sa may %1$s %2$s" navit-0.5.0+dfsg.1/po/fo.po.in000066400000000000000000001221241264204753600157150ustar00rootroot00000000000000# Faroese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Cyberish https://launchpad.net/~cyberish # Gunleif Joensen https://launchpad.net/~gunleif msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Cyberish \n" "Language-Team: Faroese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: fo\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Koyrur frá keldumappuni\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setur '%s' til '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullta" msgid "first" msgstr "fyrsti" msgid "second" msgstr "annar" msgid "third" msgstr "triði" msgid "fourth" msgstr "fjórði" msgid "fifth" msgstr "fimti" msgid "sixth" msgstr "sætti" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "sjeyndi" msgid "first exit" msgstr "fyrsta avkoyring" msgid "second exit" msgstr "onnur avkoyring" msgid "third exit" msgstr "triða avkoyring" msgid "fourth exit" msgstr "fjórða avkoyring" msgid "fifth exit" msgstr "fimta avkoyring" msgid "sixth exit" msgstr "sætta avkoyring" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metrar" #, c-format msgid "in %d meters" msgstr "um %d metrar" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrar" #, c-format msgid "in %d.%d kilometers" msgstr "um %d.%d kilometrar" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ein kilometur" msgstr[1] "%d kilometrar" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "um ein kilometur" msgstr[1] "um %d kilometrar" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "uppá rampuna" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sinná gøtuna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sinná %s%s%sur" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sinná %s%s%sa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sinná %s%s%si" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinná %s" msgid "When possible, please turn around" msgstr "Vend um skótast tilber" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "fylg vegnum tær næstu %s" msgid "Enter the roundabout soon" msgstr "Um lítið bil verður koyrt inní rundkoyringina" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Far so út úr rundkoyring við %1$s %2$s" msgid "soon" msgstr "skjótt" msgid "now" msgstr "nú" msgid "then" msgstr "so" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "Høgra" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "Vinstra" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "lætt " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "knapt " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "tak tann %1$s vegin til %2$s" #, c-format msgid "after %i roads" msgstr "eftir %i vegir" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "dreya %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "vend so um" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Vend um %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "vend so um" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Vend um %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "tá hevur tú nátt tínum ferðamáli" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Tú hevur nátt tínum ferðamáli %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Avkoyring" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Stað" msgid "Command" msgstr "Boð" msgid "Length" msgstr "Longd" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tíð" msgid "Destination Length" msgstr "Longd til ferðamál" msgid "Destination Time" msgstr "Tíð til málið" msgid "Roadbook" msgstr "Vegbók" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Set sum stað" msgid "Set as destination" msgstr "Set sum ferðamál" msgid "Add as bookmark" msgstr "legg til sum bókamerkið" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "SKíggja krosspunkt : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Sameindu Arabisku Emuraturnar" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikanskt Samoa" #. 040 msgid "Austria" msgstr "Eysturríki" #. 036 msgid "Australia" msgstr "Avstralia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Áland" #. 031 msgid "Azerbaijan" msgstr "Aserbajdsjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesj" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Barain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilia" #. 044 msgid "Bahamas" msgstr "Bahamasoyggjar" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Bouvet oyggjin" #. 072 msgid "Botswana" msgstr "Botsvana" #. 112 msgid "Belarus" msgstr "Hvítarussland" #. 084 msgid "Belize" msgstr "Belis" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyggjarnar" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, tann demokratiska lýðveldið" #. 140 msgid "Central African Republic" msgstr "Miðafrikalýðveldið" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Sveis" #. 384 msgid "Cote d'Ivoire" msgstr "Fílabeinsstrondin" #. 184 msgid "Cook Islands" msgstr "Cookoyggjarnar" #. 152 msgid "Chile" msgstr "Kili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Kolombia" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Grønhøvdaoyggjarnar" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Jólaoyggjin" #. 196 msgid "Cyprus" msgstr "Kýpros" #. 203 msgid "Czech Republic" msgstr "Kekkia" #. 276 msgid "Germany" msgstr "Týskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmørk" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Domingo lýðveldið" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egyptaland" #. 732 msgid "Western Sahara" msgstr "Vestur Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsoyggjarnar" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesia, tær sameindu statirnir av" #. 234 msgid "Faroe Islands" msgstr "Føroyar" #. 250 msgid "France" msgstr "Frakland" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Stórabretland" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Fransk Guinea" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvator Guinea" #. 300 msgid "Greece" msgstr "Grikkaland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Suður Georgia og Suður Sandwich oyggjarnar" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Gujana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- og McDonald-oyggjarnar" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Írland" #. 376 msgid "Israel" msgstr "Ísrael" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Bretskt-indiska sjóøki" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamiska lýveldi av" #. 352 msgid "Iceland" msgstr "Ísland" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jameika" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenja" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisia" #. 116 msgid "Cambodia" msgstr "Kambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorooyggjarnar" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Tað Demokratiska Folkalýveldi" #. 410 msgid "Korea, Republic of" msgstr "Korea, Lýveldi" #. 414 msgid "Kuwait" msgstr "Kuvait" #. 136 msgid "Cayman Islands" msgstr "Cayman oyggjarnar" #. 398 msgid "Kazakhstan" msgstr "Kasakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lusia" #. 438 msgid "Liechtenstein" msgstr "Liktenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litava" #. 442 msgid "Luxembourg" msgstr "Luksemborg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldovia, Lýveldi" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Franski parturin)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalloyggjarnar" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, tað fyrrverandi Jugoslaviska Lýveldi" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar (Burma)" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Norður Mariana oyggjarnar" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Móritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Móritius" #. 462 msgid "Maldives" msgstr "Maldivuoyggjarnar" #. 454 msgid "Malawi" msgstr "Malavi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Maleisia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ný Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk oyggjin" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Niðurlond" #. 578 msgid "Norway" msgstr "Noreg" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Ný Sæland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua Nýguinea" #. 608 msgid "Philippines" msgstr "Filipsoyggjar" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pólland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn oyggjar" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguei" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion oyggin" #. 642 msgid "Romania" msgstr "Rumenia" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arábia" #. 090 msgid "Solomon Islands" msgstr "Sálomonoyggjarnar" #. 690 msgid "Seychelles" msgstr "Seyskelloyggjarnar" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Svøríki" #. 702 msgid "Singapore" msgstr "Singapor" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome og Prinsipi" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sýria" #. 748 msgid "Swaziland" msgstr "Svasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks og Caicos oyggjarnar" #. 148 msgid "Chad" msgstr "Kjad" #. 260 msgid "French Southern Territories" msgstr "Fraklands suður øki" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadsjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkaland" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taivan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania, Sameinda lýveldi av" #. 804 msgid "Ukraine" msgstr "Ukreina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "USA umkringliggjandi oyggjar" #. 840 msgid "United States" msgstr "Sambandsríki Amerika" #. 858 msgid "Uruguay" msgstr "Uruguei" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanríkið" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vinsent og Grenadinoyggjar" #. 862 msgid "Venezuela" msgstr "Venesuela" #. 092 msgid "Virgin Islands, British" msgstr "jomfrúðoyggjarnar, Bretsku" #. 850 msgid "Virgin Islands, U.S." msgstr "jomfrúðoyggjarnar, U.S" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- og Futunaoyggjarnar" #. 882 msgid "Samoa" msgstr "Sámoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotta" #. 710 msgid "South Africa" msgstr "Suðurafrika" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Simbabvi" msgid "* Unknown, add is_in tags to those cities" msgstr "* Ókent, knýt is_in tag til hasar býirnar" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kort Punkt" msgid "Car" msgstr "Bilur" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Adressa" msgid "Town" msgstr "Bygd" msgid "District" msgstr "Distrikt" msgid "Street" msgstr "Gøta" msgid "Number" msgstr "Nummar" msgid "Enter Destination" msgstr "Slá inn ferðamál" msgid "Zip Code" msgstr "Postnr." msgid "City" msgstr "Býur" msgid "District/Township" msgstr "Distrikt/Kommuna" msgid "Map" msgstr "Kort" msgid "Bookmark" msgstr "Bókamerki" msgid "Destination" msgstr "Ferðamál" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Skíggji" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Gomul Ferðamál" msgid "_Bookmarks" msgstr "Bókamerki" msgid "_Map" msgstr "Kort" msgid "_Layout" msgstr "Snið" msgid "_Projection" msgstr "Sýning" msgid "_Vehicle" msgstr "Akfar" msgid "Zoom_Out" msgstr "ZoomOut" msgid "Decrease zoom level" msgstr "Lækka zoom stig" msgid "Zoom_In" msgstr "ZoomIn" msgid "Increase zoom level" msgstr "hækka zoom stig" msgid "_Recalculate" msgstr "Umrokna" msgid "Redraw map" msgstr "Endurtekna kort" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Opnar bústaðar leiting" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stegga Navigering" msgid "Test" msgstr "Roynd" msgid "_Quit" msgstr "_Gevst" msgid "Quit the application" msgstr "Lat forrit aftur" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Læs til veg" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Vegbók" msgid "Show/hide route description" msgstr "Sýn/fjal leiða frágreiðing" msgid "_Autozoom" msgstr "Sjálvvirkið zoom" msgid "Enable/disable automatic zoom level changing" msgstr "Gilda/ógilda sjálvvirkandi broyting av surristig" msgid "_Fullscreen" msgstr "Fullur skermur" msgid "Data" msgstr "Dáta" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d Tíðarmeting" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 Tíðarmeting" msgid "Help" msgstr "Hjálp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vís í kagara" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gøtur" msgid "House numbers" msgstr "Húsanummur" msgid "View Attributes" msgstr "Vís eginleikar" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Áhugaverd støð" msgid "View on map" msgstr "Vís á mappu" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Klipp bókamerki" msgid "Copy Bookmark" msgstr "Avrita bókamerki" msgid "Rename Bookmark" msgstr "Nýnevn bókamerki" msgid "Paste Bookmark" msgstr "Klistra bókamerki" msgid "Delete Bookmark" msgstr "Strika bókamerki" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bókamerki" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Legg bókamerkjamappu afturat" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Klistra bókamerki" #, c-format msgid "Bookmark %s" msgstr "Bókamerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vís Satilit Støðu" msgid " Elevation " msgstr " Hædd " msgid " Azimuth " msgstr " Breidd " msgid "Show NMEA Data" msgstr "Vís NMEA Dáta" msgid "car" msgstr "bilur" msgid "bike" msgstr "Súkla" msgid "pedestrian" msgstr "fótgangari" #, c-format msgid "Current profile: %s" msgstr "Núverandi profilur %s" #, c-format msgid "Change profile to: %s" msgstr "Broyt profil til: %s" msgid "Set as active" msgstr "Set sum virkið" msgid "Show Satellite status" msgstr "Vís Satelit støðu" msgid "Show NMEA data" msgstr "Vís NMEA dáta" msgid "Add Bookmark" msgstr "Legg bókamerki afturat" msgid "Rename" msgstr "Nýnevna" msgid "About Navit" msgstr "Um Navit" #. Authors msgid "By" msgstr "Av" #. Contributors msgid "And all the Navit Team" msgstr "Og alt Navit liðið" msgid "members and contributors." msgstr "limir og stuðulsveitarir" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Akfar" msgid "Rules" msgstr "Reglur" msgid "Lock on road" msgstr "Læs til veg" msgid "Northing" msgstr "Mót norðan" msgid "Map follows Vehicle" msgstr "Kort fylgur akfari" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kort" msgid "Layout" msgstr "Snið" msgid "Height Profile" msgstr "Hæddar profilur" msgid "Route Description" msgstr "Rutulýsing" msgid "Show Locale" msgstr "Staðarlýsing" msgid "Former Destinations" msgstr "Gomul Ferðamál" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Boð" msgid "Back" msgstr "Aftur" msgid "Back to map" msgstr "Aftur til kort" msgid "Main Menu" msgstr "Høvuðsvalmynd" msgid "House number" msgstr "Húsanummur" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Akfars stað" msgid "Main menu" msgstr "Høvuðsvalmynd" msgid "" "Show\n" "Map" msgstr "Vís Kort" msgid "Settings" msgstr "Setingar" msgid "Tools" msgstr "Tól" msgid "Route" msgstr "Ruta" msgid "About" msgstr "Um" msgid "Quit" msgstr "Enda" msgid "Actions" msgstr "Gerðir" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "Enda navigering" msgid "Display" msgstr "Skíggji" msgid "Fullscreen" msgstr "Fullur skermur" msgid "Window Mode" msgstr "Vindeyga støða" msgid "Description" msgstr "Frágreiðing" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hestur" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "far so út úr rundkoyring við %1$s %2$s" navit-0.5.0+dfsg.1/po/fr.po.in000066400000000000000000001411631264204753600157240ustar00rootroot00000000000000# French (fr) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Arnaud https://launchpad.net/~arnaud-lemeur # Breizh_Punisher https://launchpad.net/~lemeura # Deuchnord https://launchpad.net/~jerome-logiciels-id # Elodie https://launchpad.net/~elodie # Fred https://launchpad.net/~jelk # Gaël Ecorchard https://launchpad.net/~galou-breizh # Jean-Marc https://launchpad.net/~m-balthazar # Jérôme BLUM https://launchpad.net/~jblum # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # Roadrunner IN https://launchpad.net/~online # Thibault Lemaitre https://launchpad.net/~thibault.lemaitre # Thjazi https://launchpad.net/~pa2l # alexb38 https://launchpad.net/~alexb38 # alfred002 https://launchpad.net/~alfred002 # boism https://launchpad.net/~boism # cyp https://launchpad.net/~cyprien-d # mercier133 https://launchpad.net/~mercierdamien # metehyi https://launchpad.net/~metehyi # pierre https://launchpad.net/~pmghost4 # quent57 https://launchpad.net/~quent57 # tuxi https://launchpad.net/~tux-i # yannick56 https://launchpad.net/~yleny msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-11-25 21:48+0000\n" "Last-Translator: Jean-Marc \n" "Language-Team: KaZeR \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "Language: fr\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Éxecution depuis le dossier d'origine\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "Paramètre « %s » changé en « %s »\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "prochaine" msgid "first" msgstr "première" msgid "second" msgstr "deuxième" msgid "third" msgstr "troisième" msgid "fourth" msgstr "quatrième" msgid "fifth" msgstr "cinquième" msgid "sixth" msgstr "sixième" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "prochaine sortie" msgid "first exit" msgstr "première sortie" msgid "second exit" msgstr "deuxième sortie" msgid "third exit" msgstr "troisième sortie" msgid "fourth exit" msgstr "quatrième sortie" msgid "fifth exit" msgstr "cinquième sortie" msgid "sixth exit" msgstr "sixième sortie" #, c-format msgid "%d feet" msgstr "%d pieds" #, c-format msgid "in %d feet" msgstr "dans %d pieds" #, c-format msgid "%d.%d miles" msgstr "%d.%d miles" #, c-format msgid "in %d.%d miles" msgstr "dans %d.%d miles" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "un mile" msgstr[1] "%d miles" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "dans un mile" msgstr[1] "dans %d miles" #, c-format msgid "%d meters" msgstr "%d mètres" #, c-format msgid "in %d meters" msgstr "dans %d mètres" #, c-format msgid "%d.%d kilometers" msgstr "%d kilomètres %d" #, c-format msgid "in %d.%d kilometers" msgstr "dans %d kilomètres %d" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilomètre" msgstr[1] "%d kilomètres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "dans un kilomètre" msgstr[1] "dans %d kilomètres" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$svers %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$svers %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$svers le %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$svers la %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$svers l'%2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "et prendre la bretelle" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%ssur %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%ssur le %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%ssur la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%ssur l'%s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%svers la %s" msgid "When possible, please turn around" msgstr "Dès que possible, faites demi-tour" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "vers %s" #, c-format msgid "Follow the road for the next %s" msgstr "Suivez la route sur %s" msgid "Enter the roundabout soon" msgstr "Préparez vous à vous engager dans le rond-point" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "%s Entrez dans le rond-point" msgid "then enter the roundabout" msgstr "puis engagez-vous dans le rond-point" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Sortez du rond-point à la %1$s %2$s" msgid "soon" msgstr "bientôt" msgid "now" msgstr "maintenant" msgid "then" msgstr "puis" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "Puis prendre à droite %1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "%1$s prendre à droite %2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "Puis prendre à gauche %1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "%1$s prendre à gauche %2$s" msgid "on your left" msgstr "sur votre gauche" msgid "on your right" msgstr "sur votre droite" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Prenez la sortie %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Prenez la sortie %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "à l'èchangeur" msgid "at exit" msgstr "à la sortie" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "puis continuez tout droit %1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "%1$s continuez tout droit %2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "puis restez sur les voies de droite %1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "%1$s Restez sur les voies de droite %2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "puis restez sur les voies de gauche %1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "%1$s Restez sur les voies de gauche %2$s%3$s" # tournez à droite #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "à droite" # tournez à gauche #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "à gauche" # utilisé pour les changements de voie pour les sorties? #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "légèrement " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "fortement " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "puis prenez la %1$s route à %2$s" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Empreintez la %1$s rue en direction de %2$s" #, c-format msgid "after %i roads" msgstr "après %i rues" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s, tournez %1$s%2$s %4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "puis faites demi-tour" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Faites demi-tour %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "puis faites demi-tour" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Faites demi-tour %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "suivre" msgid "then you have reached your destination." msgstr "puis vous arriverez à destination" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Vous êtes arrivé à destination %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Echangeur" msgid "Exit" msgstr "Sortie" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Commande" msgid "Length" msgstr "Distance" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Durée" msgid "Destination Length" msgstr "Distance à parcourir" msgid "Destination Time" msgstr "Temps de parcours" msgid "Roadbook" msgstr "Carnet de route" #, c-format msgid "Waypoint %d" msgstr "Etape %d" msgid "Visit before..." msgstr "Visiter d'abord..." msgid "Set as position" msgstr "Définir comme position" msgid "Set as destination" msgstr "Définir comme destination" msgid "Add as bookmark" msgstr "Ajouter aux favoris" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coord. à l'écran : %d %d" #. 020 msgid "Andorra" msgstr "Andorre" #. 784 msgid "United Arab Emirates" msgstr "Émirats Arabes Unis" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua et Barbuda" #. 660 msgid "Anguilla" msgstr "Anguille" #. 008 msgid "Albania" msgstr "Albanie" #. 051 msgid "Armenia" msgstr "Arménie" #. 530 msgid "Netherlands Antilles" msgstr "Antilles néerlandaises" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctique" #. 032 msgid "Argentina" msgstr "Argentine" #. 016 msgid "American Samoa" msgstr "Samoa américaines" #. 040 msgid "Austria" msgstr "Autriche" #. 036 msgid "Australia" msgstr "Australie" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland, îles" #. 031 msgid "Azerbaijan" msgstr "Azerbaïdjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnie Herzégovine" #. 052 msgid "Barbados" msgstr "Barbades" #. 050 msgid "Bangladesh" msgstr "Bengladesh" #. 056 msgid "Belgium" msgstr "Belgique" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarie" #. 048 msgid "Bahrain" msgstr "Bahreïn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudes" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivie" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Saint-Eustache et Saba" #. 076 msgid "Brazil" msgstr "Brésil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhoutan" #. 074 msgid "Bouvet Island" msgstr "Îles Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Biélorussie" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Îles Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Répulique démocratique du Congo" #. 140 msgid "Central African Republic" msgstr "République Centrafricaine" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suisse" #. 384 msgid "Cote d'Ivoire" msgstr "Côte d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Îles Cook" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Cameroun" #. 156 msgid "China" msgstr "Chine" #. 170 msgid "Colombia" msgstr "Colombie" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cap Vert" #. 531 msgid "Curacao" msgstr "Curaçao" #. 162 msgid "Christmas Island" msgstr "Île Christmas" #. 196 msgid "Cyprus" msgstr "Chypre" #. 203 msgid "Czech Republic" msgstr "République Tchèque" #. 276 msgid "Germany" msgstr "Allemagne" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danemark" #. 212 msgid "Dominica" msgstr "Dominique" #. 214 msgid "Dominican Republic" msgstr "République Dominicaine" #. 012 msgid "Algeria" msgstr "Algérie" #. 218 msgid "Ecuador" msgstr "Équateur" #. 233 msgid "Estonia" msgstr "Estonie" #. 818 msgid "Egypt" msgstr "Égypte" #. 732 msgid "Western Sahara" msgstr "Sahara occidental" #. 232 msgid "Eritrea" msgstr "Erythrée" #. 724 msgid "Spain" msgstr "Espagne" #. 231 msgid "Ethiopia" msgstr "Ethiopie" #. 246 msgid "Finland" msgstr "Finlande" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Îles Malouines" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronésie, États fédérés de" #. 234 msgid "Faroe Islands" msgstr "Îles Féroé" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Royaume-Uni" #. 308 msgid "Grenada" msgstr "Grenade" #. 268 msgid "Georgia" msgstr "Géorgie" #. 254 msgid "French Guiana" msgstr "Guyanne française" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambie" #. 324 msgid "Guinea" msgstr "Guinée" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinée équatoriale" #. 300 msgid "Greece" msgstr "Grèce" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Géorgie du Sud et Îles Sandwich du Sud" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinée-Bissau" #. 328 msgid "Guyana" msgstr "Guyane" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Îles Heard-et-McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatie" #. 332 msgid "Haiti" msgstr "Haïti" #. 348 msgid "Hungary" msgstr "Hongrie" #. 360 msgid "Indonesia" msgstr "Indonésie" #. 372 msgid "Ireland" msgstr "Irlande" #. 376 msgid "Israel" msgstr "Israël" #. 833 msgid "Isle of Man" msgstr "Ile de Man" #. 356 msgid "India" msgstr "Inde" #. 086 msgid "British Indian Ocean Territory" msgstr "Territoire britannique de l'océan Indien" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, République islamique d'" #. 352 msgid "Iceland" msgstr "Islande" #. 380 msgid "Italy" msgstr "Italie" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaïque" #. 400 msgid "Jordan" msgstr "Jordanie" #. 392 msgid "Japan" msgstr "Japon" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghizstan" #. 116 msgid "Cambodia" msgstr "Cambodge" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint-Christophe-et-Niévès" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corée, République populaire démocratique de" #. 410 msgid "Korea, Republic of" msgstr "Corée, République de" #. 414 msgid "Kuwait" msgstr "Koweït" #. 136 msgid "Cayman Islands" msgstr "Îles Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Sainte-Lucie" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuanie" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Lettonie" #. 434 msgid "Libya" msgstr "Libye" #. 504 msgid "Morocco" msgstr "Maroc" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, République de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Îles Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macédoine" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolie" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Îles Mariannes du Nord" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritanie" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malte" #. 480 msgid "Mauritius" msgstr "Île Maurice" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexique" #. 458 msgid "Malaysia" msgstr "Malaisie" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibie" #. 540 msgid "New Caledonia" msgstr "Nouvelle Calédonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Île Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Pays-Bas" #. 578 msgid "Norway" msgstr "Norvège" #. 524 msgid "Nepal" msgstr "Népal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nouvelle-Zélande" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Pérou" #. 258 msgid "French Polynesia" msgstr "Polynésie Française" #. 598 msgid "Papua New Guinea" msgstr "Papouasie-Nouvelle-Guinée" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pologne" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre-et-Miquelon" #. 612 msgid "Pitcairn" msgstr "Îles Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Territoire palestinien, occupé" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roumanie" #. 688 msgid "Serbia" msgstr "Serbie" #. 643 msgid "Russian Federation" msgstr "Russie" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arabie Saoudite" #. 090 msgid "Solomon Islands" msgstr "Îles Salomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Soudan" #. 752 msgid "Sweden" msgstr "Suède" #. 702 msgid "Singapore" msgstr "Singapour" #. 654 msgid "Saint Helena" msgstr "Sainte Hélène" #. 705 msgid "Slovenia" msgstr "Slovénie" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard et Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovaquie" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "Saint-Marin" #. 686 msgid "Senegal" msgstr "Sénégal" #. 706 msgid "Somalia" msgstr "Somalie" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Soudan du Sud" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé-et-Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Saint-Martin (partie néerlandaise)" #. 760 msgid "Syrian Arab Republic" msgstr "Syrie" #. 748 msgid "Swaziland" msgstr "Souaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Îles Turques et Caïques" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Terres australes françaises" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailande" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisie" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquie" #. 780 msgid "Trinidad and Tobago" msgstr "Trinité et Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taïwan, province de Chine" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanie, République unie de" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Îles mineures éloignées des États-Unis" #. 840 msgid "United States" msgstr "États-Unis" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Ouzbékistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Saint-Siège (état de la cité du Vatican)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint-Vincent-et-les Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Îles Vierges britanniques" #. 850 msgid "Virgin Islands, U.S." msgstr "Îles Vierges des États-Unis" #. 704 msgid "Viet Nam" msgstr "Viêt Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis et Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yémen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Afrique du Sud" #. 894 msgid "Zambia" msgstr "Zambie" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Inconnu, ajoutez des étiquettes d'is_in à ces villes" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Pas de fichier de configuration navit.xml, navit.xml.local trouvé\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "erreur d'analyse du fichier de configuration '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "utilisation du fichier '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Erreur: Configuration non trouvée dans le fichier '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "initialisation interne échouée, arrêt de l'exécution. Vérifiez les messages " "d'erreurs précédents.\n" msgid "unknown street" msgstr "rue inconnue" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Véhicule sans nom" msgid "Failed to write bookmarks file" msgstr "Échec lors de l'écriture du fichier des favoris" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Point sur la carte" msgid "Car" msgstr "Voiture" msgid "Iso2" msgstr "iso2" msgid "Iso3" msgstr "iso3" msgid "Country" msgstr "Pays" msgid "Postal" msgstr "Code postal" msgid "Town" msgstr "Ville" msgid "District" msgstr "Quartier" msgid "Street" msgstr "Rue" msgid "Number" msgstr "Numéro" msgid "Enter Destination" msgstr "Entrez une destination" msgid "Zip Code" msgstr "Code postal" msgid "City" msgstr "Ville" msgid "District/Township" msgstr "Canton" msgid "Map" msgstr "Carte" msgid "Bookmark" msgstr "Favoris" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Affichage" msgid "_Route" msgstr "Itinéraire" msgid "_Former Destinations" msgstr "Destinations précédentes" msgid "_Bookmarks" msgstr "Favoris" msgid "_Map" msgstr "Carte" msgid "_Layout" msgstr "Thème" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Véhicule" msgid "Zoom_Out" msgstr "Zoom arrière" msgid "Decrease zoom level" msgstr "Réduire le zoom" msgid "Zoom_In" msgstr "Zoom avant" msgid "Increase zoom level" msgstr "Augmenter le zoom" msgid "_Recalculate" msgstr "Recalcul de l'itinéraire" msgid "Redraw map" msgstr "Redessiner la carte" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "Fixer _destination" msgid "Opens address search dialog" msgstr "Ouvrir la fenêtre de recherche d'adresse" msgid "_POI search" msgstr "recherche de points d'intérêt" msgid "Opens POI search dialog" msgstr "Ouvrir la recherche des points d'intérêts" msgid "_Stop Navigation" msgstr "Annuler le trajet" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quitter" msgid "Quit the application" msgstr "Quitter l'application" msgid "Show position _cursor" msgstr "Montrer la position _curseur" msgid "_Lock on Road" msgstr "Coller à la route" msgid "_Keep orientation to the North" msgstr "Garder l'orientation au Nord" msgid "Switches map orientation to the north or the vehicle" msgstr "Changer l'orientation de la carte pour nord ou véhicule" msgid "_Roadbook" msgstr "Carnet de route" msgid "Show/hide route description" msgstr "Montrer/Masquer la description de la route" msgid "_Autozoom" msgstr "Zoom automatique" msgid "Enable/disable automatic zoom level changing" msgstr "Activer/désactiver le changement automatique du zoom" msgid "_Fullscreen" msgstr "Plein écran" msgid "Data" msgstr "Données" msgid "Pharmacy" msgstr "Pharmacie" msgid "Restaurant" msgstr "Restaurant" msgid "Restaurant. Fast food" msgstr "Restauration rapide" msgid "Hotel" msgstr "Hôtel" msgid "Car parking" msgstr "Parking" msgid "Fuel station" msgstr "Station-service" msgid "Bank" msgstr "Banque" msgid "Hospital" msgstr "Hôpital" msgid "Cinema" msgstr "Cinéma" msgid "Train station" msgstr "Gare" msgid "School" msgstr "École" msgid "Police" msgstr "Poste de police" msgid "Justice" msgstr "Police" msgid "Taxi" msgstr "Taxi" msgid "Shopping" msgstr "Courses" msgid "Distance from screen center (km)" msgstr "Distance du centre de l'ecran (Kilomètre)" #, c-format msgid "POI %s. %s" msgstr "point d'intérêt %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Définir la destination vers %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "sélectionner la carte de %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "recherche de point d'intérêt" msgid "Select a category" msgstr "Sélectionnez une catégorie" msgid "Select a distance to look for (km)" msgstr "Sélectionnez une distance à chercher (km)" msgid "Select a POI" msgstr "Sélectionnez un point d'intérêt" msgid " " msgstr " " msgid "Category" msgstr "Catégorie" msgid "Direction" msgstr "Direction" msgid "Distance(m)" msgstr "Distance (m)" msgid "Name" msgstr "Nom" msgid "Visit Before" msgstr "Visitez avant" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Non" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Autre" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trajet restant %4.0f km heure d'arrivée estimée %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Trajet 0000 km temps estimé 0+00:00" msgid "Help" msgstr "Aide" #, c-format msgid "Waypoint %s" msgstr "Étape %s" msgid "Select waypoint to insert the new one before" msgstr "Sélectionner l'étape avant laquelle insérer" msgid "View in Browser" msgstr "Voir dans le navigateur" msgid "Item type" msgstr "Type d'objet" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Rues" msgid "House numbers" msgstr "Numéros de maison" msgid "View Attributes" msgstr "Voir les attributs" msgid "Set as position (and deactivate vehicle)" msgstr "Définir comme position (et désactiver véhicule)" msgid "POIs" msgstr "Points d'intérêt" msgid "View on map" msgstr "Voir sur la carte" msgid "Remove search results from the map" msgstr "Supprimer les résultats de la carte" msgid "Show results on the map" msgstr "Montrer les résultats sur la carte" msgid "Cut Bookmark" msgstr "Couper le signet" msgid "Copy Bookmark" msgstr "Copier le signet" msgid "Rename Bookmark" msgstr "Renommer le signet" msgid "Paste Bookmark" msgstr "Insérer le signet" msgid "Delete Bookmark" msgstr "Supprimer le signet" msgid "Delete waypoint" msgstr "Supprimer l'étape" msgid "Bookmarks" msgstr "Favoris" msgid "Bookmarks as waypoints" msgstr "Favoris comme points de passage" msgid "Save waypoints" msgstr "Sauvegarder les points de passage" msgid "Replace with waypoints" msgstr "Remplacer par des étapes" msgid "Delete Folder" msgstr "Supprimer le dossier" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Ajouter un dossier de signets" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Insérer le signet" #, c-format msgid "Bookmark %s" msgstr "Ajouter %s aux favoris" #, c-format msgid "Download %s" msgstr "Télécharger %s" msgid "Map Download" msgstr "Télécharger la carte" msgid "Active" msgstr "Actif" msgid "Download Enabled" msgstr "Téléchargement activé" msgid "Download completely" msgstr "Télécharger completement" msgid "Show Satellite Status" msgstr "Afficher les infos satellite" msgid " Elevation " msgstr " Elévation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Afficher les données NMEA" msgid "car" msgstr "voiture" msgid "bike" msgstr "vélo" msgid "pedestrian" msgstr "piéton" #, c-format msgid "Current profile: %s" msgstr "Profil actuel : %s" #, c-format msgid "Change profile to: %s" msgstr "Définir le profil à : %s" msgid "Set as active" msgstr "Activer" msgid "Show Satellite status" msgstr "Afficher les infos satellite" msgid "Show NMEA data" msgstr "Afficher les données NMEA" msgid "Add Bookmark" msgstr "Ajouter au favoris" msgid "Rename" msgstr "Renommer" msgid "About Navit" msgstr "A propos de Navit" #. Authors msgid "By" msgstr "par" #. Contributors msgid "And all the Navit Team" msgstr "Et tous les membres du projet Navit" msgid "members and contributors." msgstr "membres et contributeurs" msgid "Waypoints" msgstr "Étapes" msgid "Enter Coordinates" msgstr "Saisissez les coordonnées" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Latitude Longitude" msgid "Enter coordinates, for example:" msgstr "Saisissez les coordonnées, par exemple :" msgid "Vehicle" msgstr "Véhicule" msgid "Rules" msgstr "Règles" msgid "Lock on road" msgstr "Coller à la route" msgid "Northing" msgstr "Orientation toujours au Nord" msgid "Map follows Vehicle" msgstr "La carte suit le véhicule" msgid "Plan with Waypoints" msgstr "Définir avec points de passage" msgid "Maps" msgstr "Cartes" msgid "Layout" msgstr "Thème" msgid "Height Profile" msgstr "Profil de hauteur" msgid "Route Description" msgstr "Description de la route" msgid "Show Locale" msgstr "Afficher la locale" msgid "Former Destinations" msgstr "Destinations précédentes" msgid "- No former destinations available -" msgstr "- Pas de destinations précedentes -" msgid "Message" msgstr "Message" msgid "Back" msgstr "Retour" msgid "Back to map" msgstr "Retourner à la carte" msgid "Main Menu" msgstr "Menu principal" msgid "House number" msgstr "Numéro de maison" msgid "Next" msgstr "Suivant" msgid "Prev" msgstr "Précédent" msgid "Return to route!" msgstr "Retournez sur la route" #. warning told msgid "Look out! Camera!" msgstr "Attention ! Contrôle radar !" #. warning told msgid "Please decrease your speed" msgstr "Veuillez ralentir" msgid "partial match" msgstr "correspondance partielle" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Chercher" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Villes" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Conduire ici" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Données cartographiques (c) OpenStreetMap contributors, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Cartes téléchargées" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Annuler" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "redémarrer Navit pour appliquer les modifications" msgid "Whole Planet" msgstr "Terre entière" msgid "Africa" msgstr "Afrique" msgid "Canary Islands" msgstr "Îles Canaries" msgid "Asia" msgstr "Asie" msgid "Korea" msgstr "Corée" msgid "Taiwan" msgstr "Taïwan" msgid "UAE+Other" msgstr "EAU+Autres" msgid "Oceania" msgstr "Océanie" msgid "Tasmania" msgstr "Tasmanie" msgid "Victoria" msgstr "Victoria" msgid "New South Wales" msgstr "Nouvelle-Galles du Sud" msgid "Europe" msgstr "Europe" msgid "Western Europe" msgstr "Europe de l'Ouest" msgid "Azores" msgstr "Açores" msgid "BeNeLux" msgstr "BeNeLux" msgid "Alsace" msgstr "Alsace" msgid "Aquitaine" msgstr "Aquitaine" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Basse-Normandie" msgid "Bourgogne" msgstr "Bourgogne" msgid "Bretagne" msgstr "Bretagne" msgid "Centre" msgstr "Centre" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Corse" msgid "Franche-Comte" msgstr "Franche-Comté" msgid "Haute-Normandie" msgstr "Haute-Normandie" msgid "Ile-de-France" msgstr "Île-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lorraine" msgid "Midi-Pyrenees" msgstr "Midi-Pyrénées" msgid "Nord-pas-de-Calais" msgstr "Nord-Pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Picardie" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provence-Alpes-Côte d'Azur" msgid "Rhone-Alpes" msgstr "Rhône-Alpes" msgid "Baden-Wuerttemberg" msgstr "Bade-Wurtemberg" msgid "Bayern" msgstr "Bavière" msgid "Mittelfranken" msgstr "Moyenne-Franconie" msgid "Niederbayern" msgstr "Basse-Bavière" msgid "Oberbayern" msgstr "Basse-Bavière" msgid "Oberfranken" msgstr "Haute-Franconie" msgid "Oberpfalz" msgstr "Haut-Palatinat" msgid "Schwaben" msgstr "Souabe" msgid "Unterfranken" msgstr "Basse-Franconie" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "Brandebourg" msgid "Bremen" msgstr "Brême" msgid "Hamburg" msgstr "Hambourg" msgid "Hessen" msgstr "Hesse" msgid "Mecklenburg-Vorpommern" msgstr "Mecklembourg-Poméranie occidentale" msgid "Niedersachsen" msgstr "Basse-Saxe" msgid "Nordrhein-westfalen" msgstr "Rhénanie-du-Nord - Westphalie" msgid "Rheinland-Pfalz" msgstr "Rhénanie-Palatinat" msgid "Saarland" msgstr "Sarre" msgid "Sachsen-Anhalt" msgstr "Saxe-Anhalt" msgid "Sachsen" msgstr "Saxe" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Thuringe" msgid "Mallorca" msgstr "Majorque" msgid "Galicia" msgstr "Galice" msgid "Scandinavia" msgstr "Scandinavie" msgid "England" msgstr "Angleterre" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbrie" msgid "East yorkshire with hull" msgstr "Hull & Yorkshire de l'Est" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Yorkshire de l'Ouest" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Écosse" msgid "Wales" msgstr "Pays de Galles" msgid "Crete" msgstr "Crète" msgid "North America" msgstr "Amérique du Nord" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawaï" msgid "USA" msgstr "États-Unis" msgid " (except Alaska and Hawaii)" msgstr " (sans Alaska et Hawaï)" msgid "Midwest" msgstr "Midwest" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Nord-Est" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacifique" msgid "South" msgstr "Sud" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "District de Columbia" msgid "Florida" msgstr "Floride" msgid "Louisiana" msgstr "Louisiane" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginie" msgid "West Virginia" msgstr "Virginie-Occidentale" msgid "West" msgstr "Ouest" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Californie" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nouveau-Mexique" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "État de Washington" msgid "South+Middle America" msgstr "Amérique (Centrale et Sud)" msgid "Guyane Francaise" msgstr "Guyane Française" msgid "downloading" msgstr "transfert en cours" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "prêt" msgid "Media selected for map storage is not available" msgstr "" "Le support sélectionné pour le stockage de la carte n'est pas disponible" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Pas assez d'espace libre" msgid "Error downloading map!" msgstr "Erreur de téléchargement de carte !" msgid "Error writing map!" msgstr "Erreur d'écriture de carte !" msgid "Map download aborted!" msgstr "Téléchargement de carte abondonné !" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Temps restant" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Carte téléchargement" msgid "Vehicle Position" msgstr "Position du véhicule" msgid "Main menu" msgstr "Menu principal" msgid "" "Show\n" "Map" msgstr "" "Afficher\n" "la carte" msgid "Settings" msgstr "Configuration" msgid "Tools" msgstr "Outils" msgid "Route" msgstr "Itinéraire" msgid "About" msgstr "À propos" msgid "Quit" msgstr "Quitter" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" "Destinations\n" "précédentes" msgid "Coordinates" msgstr "Coordonnées" msgid "" "Stop\n" "Navigation" msgstr "" "Arrêter\n" "la navigation" msgid "Display" msgstr "Affichage" msgid "Fullscreen" msgstr "Plein écran" msgid "Window Mode" msgstr "Mode fenêtré" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" "Sauter le dernier \n" "Point de passage" msgid "" "Drop next \n" "Waypoint" msgstr "" "Sauter le prochain \n" "point de passage" msgid "Satellite Status" msgstr "Etat des satellites" msgid "NMEA Data" msgstr "Données NMEA" msgid "car_shortest" msgstr "voiture _le plus court" msgid "car_avoid_tolls" msgstr "voiture _sans péage" msgid "car_pedantic" msgstr "voiture_detaillée" msgid "horse" msgstr "cheval" msgid "Truck" msgstr "Camion" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Oui" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit commencé" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit exécute" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Bienvenue chez Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Nous vous remercions d'avoir installé Navit!\n" "\n" "Pour commencer, sélectionnez \"Télécharger des cartes\" du menu et " "télechargez une carte de votre région. Les cartes sont volumineuses, donc il " "est préférable d'avoir une connection internet illimitée!\n" "\n" "Cartes: (c) OpenStreetMap contributors\n" "\n" "Amusez-vous avec Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Plus d'infos" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Zoom-avant" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Zoom-arrière" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Télécharger des cartes" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Basculer POIs" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Quittez Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Sauvegarde / Restauration" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "sélectionner le chemin de la carte" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Supprimer cette carte?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Télécharger:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Erreur de téléchargement carte" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Carte télécharger avortée" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Pas de géolocalisation. Relancez après obtention d'un signal GPS" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Cartes couvrant la position actuelle" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Cherchez adresse" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Entrez votre destination" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Correspondance partielle" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Recherche..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adresse introuvable" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Obtenir des résultats de recherche" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Chargement des résultats de recherche" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Aucun résultat trouvé" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Aucun texte entré" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Destination fixée à:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Choisir une action" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Veuillez insérer une carte SD" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Sauvegarde..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Restauration..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Impossible de créer le dossier de sauvegarde" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Échec de la sauvegarde" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Pas de sauvegarde trouvée" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Échec de la restauration" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Sauvegarde terminée avec succès" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Restauration réussie\n" "Veuillez redémarrer Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Sauvegarde introuvable" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Échec de la restauration" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Sélectionner la sauvegarde" #. Android resource: @strings/backup msgid "Backup" msgstr "Sauvegarder" #. Android resource: @strings/restore msgid "Restore" msgstr "Restaurer" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "puis sortez du rond-point à la %1$s %2$s" #, c-format #~ msgid "in %d m" #~ msgstr "dans %d m" #, c-format #~ msgid "%d m" #~ msgstr "%d m" navit-0.5.0+dfsg.1/po/fr_CH.po.in000066400000000000000000001231521264204753600162740ustar00rootroot00000000000000# French/Switzerland translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: KaZeR \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "Language: fr_CH\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Execution depuis le dossier d'origine\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' mis à '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zéroième" msgid "first" msgstr "première" msgid "second" msgstr "deuxième" msgid "third" msgstr "troisième" msgid "fourth" msgstr "quatrième" msgid "fifth" msgstr "cinquième" msgid "sixth" msgstr "sixième" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "la zéroième sortie" msgid "first exit" msgstr "la première sortie" msgid "second exit" msgstr "la deuxième sortie" msgid "third exit" msgstr "la troisième sortie" msgid "fourth exit" msgstr "la quatrième sortie" msgid "fifth exit" msgstr "la cinquième sortie" msgid "sixth exit" msgstr "la sixième sortie" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d mètres" #, c-format msgid "in %d meters" msgstr "dans %d mètres" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilomètres" #, c-format msgid "in %d.%d kilometers" msgstr "dans %d.%d kilomètres" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilomètre" msgstr[1] "%d kilomètres" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "dans un kilomètre" msgstr[1] "dans %d kilomètres" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$svers %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$svers %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$svers le %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$svers la %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$svers l'%2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "vers la bretelle" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%ssur %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%ssur le %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%ssur la %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%ssur l'%s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%svers la %s" msgid "When possible, please turn around" msgstr "Dès que possible, faites demi-tour" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "vers %s" #, c-format msgid "Follow the road for the next %s" msgstr "Suivez la route sur %s" msgid "Enter the roundabout soon" msgstr "Préparez vous à vous engager dans le rond-point" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Sortez du rond-point à la %1$s %2$s" msgid "soon" msgstr "bientôt" msgid "now" msgstr "maintenant" msgid "then" msgstr "puis" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Prenez la sortie %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Prenez la sortie %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "à l'èchangeur" msgid "at exit" msgstr "à la sortie" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" # tournez à droite #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "à droite" # tournez à gauche #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "à gauche" # utilisé pour les changements de voie pour les sorties? #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "légèrement " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "fortement " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Prenez la %1$s route vers la %2$s" #, c-format msgid "after %i roads" msgstr "après %i rues" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "puis faites demi-tour" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Faites demi-tour %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "puis faites demi-tour" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Faites demi-tour %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "suivez" msgid "then you have reached your destination." msgstr "ensuite vous serez à destination" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Vous êtes arrivé à destination %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Echangeur" msgid "Exit" msgstr "Sortie" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Commande" msgid "Length" msgstr "Distance" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Durée" msgid "Destination Length" msgstr "Distance à parcourir" msgid "Destination Time" msgstr "Temps de parcours" msgid "Roadbook" msgstr "Carnet de route" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Définir comme position" msgid "Set as destination" msgstr "Définir comme destination" msgid "Add as bookmark" msgstr "Ajouter aux favoris" #, c-format msgid "Point 0x%x 0x%x" msgstr "Point 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coord. à l'écran : %d %d" #. 020 msgid "Andorra" msgstr "Andorre" #. 784 msgid "United Arab Emirates" msgstr "Émirats Arabes Unis" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua et Barbuda" #. 660 msgid "Anguilla" msgstr "Anguille" #. 008 msgid "Albania" msgstr "Albanie" #. 051 msgid "Armenia" msgstr "Arménie" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Néérlandaises" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctique" #. 032 msgid "Argentina" msgstr "Argentine" #. 016 msgid "American Samoa" msgstr "Samoa américaines" #. 040 msgid "Austria" msgstr "Autriche" #. 036 msgid "Australia" msgstr "Australie" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland, îles" #. 031 msgid "Azerbaijan" msgstr "Azerbaïdjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnie Herzégovine" #. 052 msgid "Barbados" msgstr "Barbades" #. 050 msgid "Bangladesh" msgstr "Bengladesh" #. 056 msgid "Belgium" msgstr "Belgique" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarie" #. 048 msgid "Bahrain" msgstr "Bahreïn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudes" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivie" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brésil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhoutan" #. 074 msgid "Bouvet Island" msgstr "Îles Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Biélorussie" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Iles Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Répulique démocratique du Congo" #. 140 msgid "Central African Republic" msgstr "République Centrafricaine" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suisse" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Îles Cook" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Cameroun" #. 156 msgid "China" msgstr "Chine" #. 170 msgid "Colombia" msgstr "Colombie" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cap Vert" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Île Christmas" #. 196 msgid "Cyprus" msgstr "Chypre" #. 203 msgid "Czech Republic" msgstr "République Tchèque" #. 276 msgid "Germany" msgstr "Allemagne" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danemark" #. 212 msgid "Dominica" msgstr "Dominique" #. 214 msgid "Dominican Republic" msgstr "République Dominicaine" #. 012 msgid "Algeria" msgstr "Algérie" #. 218 msgid "Ecuador" msgstr "Equateur" #. 233 msgid "Estonia" msgstr "Estonie" #. 818 msgid "Egypt" msgstr "Égypte" #. 732 msgid "Western Sahara" msgstr "Sahara occidental" #. 232 msgid "Eritrea" msgstr "Erythrée" #. 724 msgid "Spain" msgstr "Espagne" #. 231 msgid "Ethiopia" msgstr "Ethiopie" #. 246 msgid "Finland" msgstr "Finlande" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Les Malouines (les Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronésie, États fédérés de" #. 234 msgid "Faroe Islands" msgstr "Îles Feroe" #. 250 msgid "France" msgstr "France" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Royaume-Uni" #. 308 msgid "Grenada" msgstr "Grenade" #. 268 msgid "Georgia" msgstr "Géorgie" #. 254 msgid "French Guiana" msgstr "Guyanne française" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambie" #. 324 msgid "Guinea" msgstr "Guinée" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Guinée équatoriale" #. 300 msgid "Greece" msgstr "Grèce" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Géorgie du Sud et Îles Sandwich du Sud" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinée-Bissau" #. 328 msgid "Guyana" msgstr "Guyane" #. 344 msgid "Hong Kong" msgstr "Hong-kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard, Île et McDonald, Îles" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatie" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hongrie" #. 360 msgid "Indonesia" msgstr "Indonésie" #. 372 msgid "Ireland" msgstr "Irlande" #. 376 msgid "Israel" msgstr "Israël" #. 833 msgid "Isle of Man" msgstr "Ile de Man" #. 356 msgid "India" msgstr "Inde" #. 086 msgid "British Indian Ocean Territory" msgstr "Océan Indien, Territoire britannique de l'" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, République islamique d'" #. 352 msgid "Iceland" msgstr "Islande" #. 380 msgid "Italy" msgstr "Italie" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaique" #. 400 msgid "Jordan" msgstr "Jordanie" #. 392 msgid "Japan" msgstr "Japon" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghizstan" #. 116 msgid "Cambodia" msgstr "Cambodge" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores, Les" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts et Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corée, République populaire démocratique de" #. 410 msgid "Korea, Republic of" msgstr "Corée, République de" #. 414 msgid "Kuwait" msgstr "Koweït" #. 136 msgid "Cayman Islands" msgstr "Îles Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Sainte-Lucie" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuanie" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Lettonie" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroc" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, République de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Îles Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macédoine" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolie" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Îles Mariannes du Nord" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritanie" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malte" #. 480 msgid "Mauritius" msgstr "Iles Maurice" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexique" #. 458 msgid "Malaysia" msgstr "Malaisie" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibie" #. 540 msgid "New Caledonia" msgstr "Nouvelle Calédonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Île Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Pays-Bas" #. 578 msgid "Norway" msgstr "Norvège" #. 524 msgid "Nepal" msgstr "Népal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nouvelle-Zélande" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Pérou" #. 258 msgid "French Polynesia" msgstr "Polynésie Française" #. 598 msgid "Papua New Guinea" msgstr "Papouasie-Nouvelle-Guinée" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Pologne" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre-et-Miquelon" #. 612 msgid "Pitcairn" msgstr "Îles Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestine" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roumanie" #. 688 msgid "Serbia" msgstr "Serbie" #. 643 msgid "Russian Federation" msgstr "Russie" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arabie Saoudite" #. 090 msgid "Solomon Islands" msgstr "Îles Solomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suède" #. 702 msgid "Singapore" msgstr "Singapour" #. 654 msgid "Saint Helena" msgstr "Sainte Hélène" #. 705 msgid "Slovenia" msgstr "Slovènie" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard et île Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovaquie" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "Saint-Marin" #. 686 msgid "Senegal" msgstr "Sénégal" #. 706 msgid "Somalia" msgstr "Somalie" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé-et-Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrie" #. 748 msgid "Swaziland" msgstr "Souaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Îles Turques et Caïques" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Terres australes françaises" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailande" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisie" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquie" #. 780 msgid "Trinidad and Tobago" msgstr "Trinité et Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, province de la Chine" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanie, République unie de" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Îles périphériques mineures des Etats-Unis" #. 840 msgid "United States" msgstr "États-Unis" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Ouzbékistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Saint-Siège (état de la cité du Vatican)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint-Vincent-et-les Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Îles Vierges britanniques" #. 850 msgid "Virgin Islands, U.S." msgstr "Îles Vierges des États-Unis" #. 704 msgid "Viet Nam" msgstr "Viêt Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis et Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Afrique du Sud" #. 894 msgid "Zambia" msgstr "Zambie" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Inconnu, ajoutez des étiquettes d'is_in à ces villes" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Point sur la carte" msgid "Car" msgstr "Voiture" msgid "Iso2" msgstr "iso2" msgid "Iso3" msgstr "iso3" msgid "Country" msgstr "Pays" msgid "Postal" msgstr "Code postal" msgid "Town" msgstr "Ville" msgid "District" msgstr "Quartier" msgid "Street" msgstr "Rue" msgid "Number" msgstr "Numéro" msgid "Enter Destination" msgstr "Entrez une destination" msgid "Zip Code" msgstr "Code postal" msgid "City" msgstr "Ville" msgid "District/Township" msgstr "Canton" msgid "Map" msgstr "Carte" msgid "Bookmark" msgstr "Favoris" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Affichage" msgid "_Route" msgstr "Itinéraire" msgid "_Former Destinations" msgstr "Destinations précédentes" msgid "_Bookmarks" msgstr "Favoris" msgid "_Map" msgstr "Carte" msgid "_Layout" msgstr "Thème" msgid "_Projection" msgstr "Projection" msgid "_Vehicle" msgstr "Véhicule" msgid "Zoom_Out" msgstr "Zoom arrière" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zoom avant" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Recalculer" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Annuler le trajet" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Quitter" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Coller à la route" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Carnet de route" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Zoom automatique" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Plein écran" msgid "Data" msgstr "Données" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Non" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Autre" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trajet restant %4.0f km heure d'arrivée estimée %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Trajet 0000 km temps estimé 0+00:00" msgid "Help" msgstr "Aide" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Voir dans le navigateur" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Rues" msgid "House numbers" msgstr "Numéros de maison" msgid "View Attributes" msgstr "Voir les attributs" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Points d'intérêt" msgid "View on map" msgstr "Voir sur la carte" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Favoris" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Ajouter %s aux favoris" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Afficher les infos satellite" msgid " Elevation " msgstr " Elévation " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Afficher les données NMEA" msgid "car" msgstr "voiture" msgid "bike" msgstr "vélo" msgid "pedestrian" msgstr "piéton" #, c-format msgid "Current profile: %s" msgstr "Profil actuel : %s" #, c-format msgid "Change profile to: %s" msgstr "Définir le profil à : %s" msgid "Set as active" msgstr "Activer" msgid "Show Satellite status" msgstr "Afficher les infos satellite" msgid "Show NMEA data" msgstr "Afficher les données NMEA" msgid "Add Bookmark" msgstr "Ajouter au favoris" msgid "Rename" msgstr "" msgid "About Navit" msgstr "A propos de Navit" #. Authors msgid "By" msgstr "Développé par" #. Contributors msgid "And all the Navit Team" msgstr "Et tous les membres du projet Navit" msgid "members and contributors." msgstr "membres et contributeurs" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Véhicule" msgid "Rules" msgstr "Règles" msgid "Lock on road" msgstr "Coller à la route" msgid "Northing" msgstr "Orientation toujours au Nord" msgid "Map follows Vehicle" msgstr "La carte suit le véhicule" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Cartes" msgid "Layout" msgstr "Thème" msgid "Height Profile" msgstr "Profil de hauteur" msgid "Route Description" msgstr "Description de la route" msgid "Show Locale" msgstr "Afficher la locale" msgid "Former Destinations" msgstr "Destinations précédentes" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Message" msgid "Back" msgstr "Retour" msgid "Back to map" msgstr "Retourner à la carte" msgid "Main Menu" msgstr "Menu principal" msgid "House number" msgstr "Numéro de maison" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Position du véhicule" msgid "Main menu" msgstr "Menu principal" msgid "" "Show\n" "Map" msgstr "" "Afficher\n" "la carte" msgid "Settings" msgstr "Configuration" msgid "Tools" msgstr "Outils" msgid "Route" msgstr "Itinéraire" msgid "About" msgstr "À propos" msgid "Quit" msgstr "Quitter" msgid "Actions" msgstr "Actions" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Arrêter\n" "La navigation" msgid "Display" msgstr "Affichage" msgid "Fullscreen" msgstr "Plein écran" msgid "Window Mode" msgstr "Mode fenêtré" msgid "Description" msgstr "Description" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cheval" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "puis sortez du rond-point à la %1$s %2$s" navit-0.5.0+dfsg.1/po/fy.po.in000066400000000000000000001077401264204753600157360ustar00rootroot00000000000000# Frisian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # 205 https://launchpad.net/~205-z msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2011-08-12 12:18+0000\n" "Last-Translator: 205 \n" "Language-Team: Frisian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: fy\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "Earste" msgid "second" msgstr "twadde" msgid "third" msgstr "" msgid "fourth" msgstr "fjirde" msgid "fifth" msgstr "fyfde" msgid "sixth" msgstr "sechste" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hynder" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/gl.po.in000066400000000000000000001212151264204753600157130ustar00rootroot00000000000000# Galician translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Iván Pérez https://launchpad.net/~ivan.perez-keera.es # Miguel Anxo Bouzada https://launchpad.net/~mbouzada # Xosé https://launchpad.net/~ubuntu-galizaweb # andreout https://launchpad.net/~andre-outeiro msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: andreout \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: gl\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando desde o directorio fonte.\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "Establecendo '%s' a '%s'.\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "cero-ésimo" msgid "first" msgstr "primeiro" msgid "second" msgstr "segundo" msgid "third" msgstr "terceiro" msgid "fourth" msgstr "cuarto" msgid "fifth" msgstr "quinto" msgid "sixth" msgstr "sexto" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "cero-ésimo" msgid "first exit" msgstr "primeria saída" msgid "second exit" msgstr "segunda saída" msgid "third exit" msgstr "terceria saída" msgid "fourth exit" msgstr "cuarta saída" msgid "fifth exit" msgstr "quinta saída" msgid "sixth exit" msgstr "sexta saída" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "en %d metros" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d quilómetros" #, c-format msgid "in %d.%d kilometers" msgstr "en %d.%d quilómetros" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un quilómetro" msgstr[1] "%d quilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "nun quilómetro" msgstr[1] "en %d quilómetros" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "na rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s na rúa %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s no %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s na %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s no %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s na %s" msgid "When possible, please turn around" msgstr "Cando sexa posible, dea a volta" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Siga a estrada durante os próximos %s" msgid "Enter the roundabout soon" msgstr "Métase pronto na rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Saia da rotonda pola %1$s %2$s" msgid "soon" msgstr "cedo" msgid "now" msgstr "agora" msgid "then" msgstr "logo" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Tome a saida %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Tome a saida %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "á dereita" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "á esquerda" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "suavemente " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "bruscamente " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Tome a estrada %1$s cara o %2$s" #, c-format msgid "after %i roads" msgstr "despois de %i estradas" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Xire %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "logo dea a volta" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Dea a volta %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "logo dea a volta" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Dea a volta %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "despois xa chega ao seu destino" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Chegou ao seu destino %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Saída" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posición" msgid "Command" msgstr "Orde" msgid "Length" msgstr "Duración" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tempo" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Definir como posición" msgid "Set as destination" msgstr "Definir como destino" msgid "Add as bookmark" msgstr "Engadir como marcador" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emiratos Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afganistán" #. 028 msgid "Antigua and Barbuda" msgstr "Antiga e Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antillas Holandesas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártida" #. 032 msgid "Argentina" msgstr "Arxentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Illas Aland" #. 031 msgid "Azerbaijan" msgstr "Acerbaixán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia e Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélxica" #. 854 msgid "Burkina Faso" msgstr "Burquina Faso" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "Barein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "San Bartolomeu" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bután" #. 074 msgid "Bouvet Island" msgstr "Illa Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorusia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Illas Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, República Democrática do" #. 140 msgid "Central African Republic" msgstr "República Centroafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suíza" #. 384 msgid "Cote d'Ivoire" msgstr "Costa do Marfín" #. 184 msgid "Cook Islands" msgstr "Illas Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camerún" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Illa de Nadal" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Checa" #. 276 msgid "Germany" msgstr "Alemaña" #. 262 msgid "Djibouti" msgstr "Xibuti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Alxeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Exipto" #. 732 msgid "Western Sahara" msgstr "Sahara Occidental" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "España" #. 231 msgid "Ethiopia" msgstr "Etiopía" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fixi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Illas Falkland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Estados Federados de" #. 234 msgid "Faroe Islands" msgstr "Illas Feroe" #. 250 msgid "France" msgstr "Franza" #. 266 msgid "Gabon" msgstr "Gabón" #. 826 msgid "United Kingdom" msgstr "Reino Unido" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Xeorxia" #. 254 msgid "French Guiana" msgstr "Guaiana Francesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Xibraltar" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guiné" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guiné Ecuatorial" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Xeorxia do Sul e Illas Sandwich do Sul" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guiné-Bisau" #. 328 msgid "Guyana" msgstr "Guaiana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Illa Heard e Illas McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croacia" #. 332 msgid "Haiti" msgstr "Haití" #. 348 msgid "Hungary" msgstr "Hungría" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Illa de Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Territorio Británico do Océano Índico" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irán, República Islámica de" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Xamaica" #. 400 msgid "Jordan" msgstr "Xordania" #. 392 msgid "Japan" msgstr "Xapón" #. 404 msgid "Kenya" msgstr "Quenia" #. 417 msgid "Kyrgyzstan" msgstr "Quirguicistán" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts e Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea, República Democrática Popular de" #. 410 msgid "Korea, Republic of" msgstr "Corea, República de" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Illas Caimán" #. 398 msgid "Kazakhstan" msgstr "Casaquistán" #. 418 msgid "Lao People's Democratic Republic" msgstr "República Democrática Popular de Lao" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Lucía" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marrocos" #. 492 msgid "Monaco" msgstr "Mónaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia, República de" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "San Martiño (parte francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Illas Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, antiga República Iugoslava de" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macau" #. 580 msgid "Northern Mariana Islands" msgstr "Illas Marianas do Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricio" #. 462 msgid "Maldives" msgstr "Maldivas" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malasia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nova Caledonia" #. 562 msgid "Niger" msgstr "Níxer" #. 574 msgid "Norfolk Island" msgstr "Illa de Norfolk" #. 566 msgid "Nigeria" msgstr "Nixeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Países Baixos" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Celanda" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinesia Francesa" #. 598 msgid "Papua New Guinea" msgstr "Papúa Nova Guiné" #. 608 msgid "Philippines" msgstr "Filipinas" #. 586 msgid "Pakistan" msgstr "Paquistán" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "San Pedro e Miguelón" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Territorios Palestinos, Ocupados" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunión" #. 642 msgid "Romania" msgstr "Rumanía" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federación Rusa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudí" #. 090 msgid "Solomon Islands" msgstr "Illas Salomón" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudán" #. 752 msgid "Sweden" msgstr "Suecia" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslovaquia" #. 694 msgid "Sierra Leone" msgstr "Serra Leoa" #. 674 msgid "San Marino" msgstr "San Mariño" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "República Árabe Siria" #. 748 msgid "Swaziland" msgstr "Suazilandia" #. 796 msgid "Turks and Caicos Islands" msgstr "Illas Turks e Caicos" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "Territorios Franceses do Sur" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "Taxiquistán" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turcomenistán" #. 788 msgid "Tunisia" msgstr "Tunicia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquía" #. 780 msgid "Trinidad and Tobago" msgstr "Trindade e Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Provincia de China" #. 834 msgid "Tanzania, United Republic of" msgstr "República Unida de Tanzania" #. 804 msgid "Ukraine" msgstr "Ucraína" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Illas Exteriores Menores dos Estados Unidos da América" #. 840 msgid "United States" msgstr "Estados Unidos de América" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbequistán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sé (Estado da Cidade do Vaticano)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "San Vicente e as Granadinas" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Illas Virxes, Británicas" #. 850 msgid "Virgin Islands, U.S." msgstr "Illas Virxes, EE.UU." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Iemen" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "Sudáfrica" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Coche" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Vila" msgid "District" msgstr "Distrito" msgid "Street" msgstr "Rúa" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Introduza o destino" msgid "Zip Code" msgstr "Código postal" msgid "City" msgstr "Cidade" msgid "District/Township" msgstr "Concello" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destino" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "Diminuír a ampliación" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "Aumentar a ampliación" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "Redebuxar o mapa" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "Probar" msgid "_Quit" msgstr "_Saír" msgid "Quit the application" msgstr "Saír do aplicativo" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "Datos" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "NL" msgid "E" msgstr "L" msgid "SE" msgstr "SL" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Non" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Axuda" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Ver no navegador" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Rúas" msgid "House numbers" msgstr "Números de portal" msgid "View Attributes" msgstr "Ver os atributos" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POI" msgid "View on map" msgstr "Ver no mapa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "Mudar o nome do marcador" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "Borrar o marcador" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Marcadores" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Marcador %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Mostrar o estado do satélite" msgid " Elevation " msgstr " Elevación " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "coche" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "peón" #, c-format msgid "Current profile: %s" msgstr "Perfil actual: %s" #, c-format msgid "Change profile to: %s" msgstr "Alterar o perfil para: %s" msgid "Set as active" msgstr "Definir como activo" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "Engadir un marcador" msgid "Rename" msgstr "Mudar o nome" msgid "About Navit" msgstr "Acerca do Navit" #. Authors msgid "By" msgstr "Por" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehículo" msgid "Rules" msgstr "Regras" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mapas" msgid "Layout" msgstr "Disposición" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Destinos anteriores" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mensaxe" msgid "Back" msgstr "Recuar" msgid "Back to map" msgstr "Voltar ao mapa" msgid "Main Menu" msgstr "Menú principal" msgid "House number" msgstr "Número de casa" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "Roteiro" msgid "About" msgstr "" msgid "Quit" msgstr "Saír" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Parar a\n" "navegación" msgid "Display" msgstr "Visualizar" msgid "Fullscreen" msgstr "Pantalla completa" msgid "Window Mode" msgstr "Modo de xanela" msgid "Description" msgstr "Descrición" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cabalo" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "logo saia da rotonda pola %1$s %2$s" navit-0.5.0+dfsg.1/po/he.po.in000066400000000000000000001276531264204753600157210ustar00rootroot00000000000000# Hebrew translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Evgeniy Ginzburg https://launchpad.net/~nad-oby # KaZeR https://launchpad.net/~kazer # Liel Fridman https://launchpad.net/~lielft # Nadav https://launchpad.net/~nadavz # Yaron https://launchpad.net/~sh-yaron # rintintin https://launchpad.net/~yonatanhak-gmail msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: he\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "מופעל מתיקיית המקור\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "הגדרת '%s' ל־'%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "במקום ה־0" msgid "first" msgstr "ראשון" msgid "second" msgstr "שני" msgid "third" msgstr "שלישי" msgid "fourth" msgstr "רביעי" msgid "fifth" msgstr "חמישי" msgid "sixth" msgstr "שישי" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "היציאה ה-0" msgid "first exit" msgstr "היציאה הראשונה" msgid "second exit" msgstr "היציאה השנייה" msgid "third exit" msgstr "היציאה השלישית" msgid "fourth exit" msgstr "היציאה הרביעית" msgid "fifth exit" msgstr "היציאה החמישית" msgid "sixth exit" msgstr "היציאה השישית" #, c-format msgid "%d feet" msgstr "%d רגל" #, c-format msgid "in %d feet" msgstr "בעוד %d רגל" #, c-format msgid "%d.%d miles" msgstr "%d.%d מיילים" #, c-format msgid "in %d.%d miles" msgstr "בעוד %d.%d מיילים" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "מייל אחד" msgstr[1] "%d מיילים" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "בעוד מייל אחד" msgstr[1] "בעוד %d מיילם" #, c-format msgid "%d meters" msgstr "%d מטרים" #, c-format msgid "in %d meters" msgstr "בעוד %d מטרים" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d קילומטרים" #, c-format msgid "in %d.%d kilometers" msgstr "בעוד %d.%d קילומטרים" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "קילומטר אחד" msgstr[1] "%d קילומטרים" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "בעוד קילומטר אחד" msgstr[1] "בעוד %d קילומטרים" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "אל הרמפה" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s אל רחוב %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s אל רחוב %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s אל רחוב %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s אל רחוב %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sאל תוך ה%s" msgid "When possible, please turn around" msgstr "כשיתאפשר לך, פנה חזרה" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "המשך בדרך זו למשך %s" msgid "Enter the roundabout soon" msgstr "הכנס לכיכר הקרובה" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "צא מהכיכר ב%1$s %2$s" msgid "soon" msgstr "בקרוב" msgid "now" msgstr "כעת" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "ימינה" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "שמאלה" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "מעט " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "בצורה חדה " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "קח את הכביש ה%1$s אל %2$s" #, c-format msgid "after %i roads" msgstr "לאחר %i כבישים" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "פנה %1$s %2$s %4$s %3$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "ואז הגעת ליעד." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "הגעת ליעדך %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "יציאה" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "מיקום" msgid "Command" msgstr "פקודה" msgid "Length" msgstr "אורך" msgid "km" msgstr "ק\"מ" msgid "m" msgstr "מ'" msgid "Time" msgstr "זמן" msgid "Destination Length" msgstr "מרחק ליעד" msgid "Destination Time" msgstr "זמן ליעד" msgid "Roadbook" msgstr "הוראות נסיעה" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "קבע כמיקום נוכחי" msgid "Set as destination" msgstr "קבע כיעד" msgid "Add as bookmark" msgstr "צור סימניה למקום זה" #, c-format msgid "Point 0x%x 0x%x" msgstr "נקודה 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "קואורדינטת מסך: %d %d" #. 020 msgid "Andorra" msgstr "אנדורה" #. 784 msgid "United Arab Emirates" msgstr "איחוד האמירויות הערביות" #. 004 msgid "Afghanistan" msgstr "אפגניסטן" #. 028 msgid "Antigua and Barbuda" msgstr "אנטיגואה וברבודה" #. 660 msgid "Anguilla" msgstr "אנגווילה" #. 008 msgid "Albania" msgstr "אלבניה" #. 051 msgid "Armenia" msgstr "ארמניה" #. 530 msgid "Netherlands Antilles" msgstr "האנטילים ההולנדיים" #. 024 msgid "Angola" msgstr "אנגולה" #. 010 msgid "Antarctica" msgstr "אנטארקטיקה" #. 032 msgid "Argentina" msgstr "ארגנטינה" #. 016 msgid "American Samoa" msgstr "סמואה האמריקאית" #. 040 msgid "Austria" msgstr "אוסטריה" #. 036 msgid "Australia" msgstr "אוסטרליה" #. 533 msgid "Aruba" msgstr "ארובה" #. 248 msgid "Aland Islands" msgstr "איי אלאנדה" #. 031 msgid "Azerbaijan" msgstr "אזרבייג'אן" #. 070 msgid "Bosnia and Herzegovina" msgstr "בוסניה והרצגובינה" #. 052 msgid "Barbados" msgstr "ברבדוס" #. 050 msgid "Bangladesh" msgstr "בנגלדש" #. 056 msgid "Belgium" msgstr "בלגיה" #. 854 msgid "Burkina Faso" msgstr "בורקינה פאסו" #. 100 msgid "Bulgaria" msgstr "בולגריה" #. 048 msgid "Bahrain" msgstr "בחריין" #. 108 msgid "Burundi" msgstr "בורונדי" #. 204 msgid "Benin" msgstr "בנין" #. 652 msgid "Saint Barthelemy" msgstr "סנט ברתלמי" #. 060 msgid "Bermuda" msgstr "ברמודה" #. 096 msgid "Brunei Darussalam" msgstr "סולטנות ברוניי" #. 068 msgid "Bolivia" msgstr "בוליביה" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "ברזיל" #. 044 msgid "Bahamas" msgstr "איי בהאמה" #. 064 msgid "Bhutan" msgstr "בהוטאן" #. 074 msgid "Bouvet Island" msgstr "אי בובט" #. 072 msgid "Botswana" msgstr "בוטסואנה" #. 112 msgid "Belarus" msgstr "בלרוס" #. 084 msgid "Belize" msgstr "בליז" #. 124 msgid "Canada" msgstr "קנדה" #. 166 msgid "Cocos (Keeling) Islands" msgstr "איי קוקוס (קילינג)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "הרפובליקה הדמוקרטית של קונגו" #. 140 msgid "Central African Republic" msgstr "רפובליקת מרכז אפריקה" #. 178 msgid "Congo" msgstr "קונגו" #. 756 msgid "Switzerland" msgstr "שוויץ" #. 384 msgid "Cote d'Ivoire" msgstr "חוף השנהב" #. 184 msgid "Cook Islands" msgstr "איי קוק" #. 152 msgid "Chile" msgstr "צ'ילה" #. 120 msgid "Cameroon" msgstr "קמרון" #. 156 msgid "China" msgstr "סין" #. 170 msgid "Colombia" msgstr "קולומביה" #. 188 msgid "Costa Rica" msgstr "קוסטה ריקה" #. 192 msgid "Cuba" msgstr "קובה" #. 132 msgid "Cape Verde" msgstr "קייפ ורדה" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "אי כריסמס" #. 196 msgid "Cyprus" msgstr "קפריסין" #. 203 msgid "Czech Republic" msgstr "צ'כיה" #. 276 msgid "Germany" msgstr "גרמניה" #. 262 msgid "Djibouti" msgstr "ג'יבוטי" #. 208 msgid "Denmark" msgstr "דנמרק" #. 212 msgid "Dominica" msgstr "דומיניקה" #. 214 msgid "Dominican Republic" msgstr "הרפובליקה הדומיניקנית" #. 012 msgid "Algeria" msgstr "אלג'יריה" #. 218 msgid "Ecuador" msgstr "אקוודור" #. 233 msgid "Estonia" msgstr "אסטוניה" #. 818 msgid "Egypt" msgstr "מצרים" #. 732 msgid "Western Sahara" msgstr "סהרה המערבית" #. 232 msgid "Eritrea" msgstr "אריתריאה" #. 724 msgid "Spain" msgstr "ספרד" #. 231 msgid "Ethiopia" msgstr "אתיופיה" #. 246 msgid "Finland" msgstr "פינלנד" #. 242 msgid "Fiji" msgstr "פיג'י" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "איי פוקלנד" #. 583 msgid "Micronesia, Federated States of" msgstr "מיקרונזיה" #. 234 msgid "Faroe Islands" msgstr "איי פארו" #. 250 msgid "France" msgstr "צרפת" #. 266 msgid "Gabon" msgstr "גבון" #. 826 msgid "United Kingdom" msgstr "אנגליה" #. 308 msgid "Grenada" msgstr "גרנדה" #. 268 msgid "Georgia" msgstr "גאורגיה" #. 254 msgid "French Guiana" msgstr "גיאנה הצרפתית" #. 831 msgid "Guernsey" msgstr "גרנזי" #. 288 msgid "Ghana" msgstr "גאנה" #. 292 msgid "Gibraltar" msgstr "גיברלטר" #. 304 msgid "Greenland" msgstr "גרינלנד" #. 270 msgid "Gambia" msgstr "גמביה" #. 324 msgid "Guinea" msgstr "גינאה" #. 312 msgid "Guadeloupe" msgstr "גוואדלופ" #. 226 msgid "Equatorial Guinea" msgstr "גינאה המשוונית" #. 300 msgid "Greece" msgstr "יוון" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "איי ג'ורג'יה הדרומית ואיי סנדוויץ' הדרומיים" #. 320 msgid "Guatemala" msgstr "גואטמלה" #. 316 msgid "Guam" msgstr "גואם" #. 624 msgid "Guinea-Bissau" msgstr "גיניאה ביסאו" #. 328 msgid "Guyana" msgstr "גיאנה" #. 344 msgid "Hong Kong" msgstr "הונג קונג" #. 334 msgid "Heard Island and McDonald Islands" msgstr "האי הרד ואיי מקדונלד" #. 340 msgid "Honduras" msgstr "הונדורס" #. 191 msgid "Croatia" msgstr "קרואטיה" #. 332 msgid "Haiti" msgstr "האיטי" #. 348 msgid "Hungary" msgstr "הונגריה" #. 360 msgid "Indonesia" msgstr "אינדונזיה" #. 372 msgid "Ireland" msgstr "אירלנד" #. 376 msgid "Israel" msgstr "ישראל" #. 833 msgid "Isle of Man" msgstr "האי מאן" #. 356 msgid "India" msgstr "הודו" #. 086 msgid "British Indian Ocean Territory" msgstr "הטריטוריה הבריטית באוקיינוס ההודי" #. 368 msgid "Iraq" msgstr "עיראק" #. 364 msgid "Iran, Islamic Republic of" msgstr "אירן" #. 352 msgid "Iceland" msgstr "איסלנד" #. 380 msgid "Italy" msgstr "איטליה" #. 832 msgid "Jersey" msgstr "ג'רסי" #. 388 msgid "Jamaica" msgstr "ג'מייקה" #. 400 msgid "Jordan" msgstr "ירדן" #. 392 msgid "Japan" msgstr "יפן" #. 404 msgid "Kenya" msgstr "קניה" #. 417 msgid "Kyrgyzstan" msgstr "קירגיסטן" #. 116 msgid "Cambodia" msgstr "קמבודיה" #. 296 msgid "Kiribati" msgstr "קיריבאטי" #. 174 msgid "Comoros" msgstr "איי קומורו" #. 659 msgid "Saint Kitts and Nevis" msgstr "סנט קיטס ונוויס" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "קוריאה הצפונית" #. 410 msgid "Korea, Republic of" msgstr "קוריאה הדרומית" #. 414 msgid "Kuwait" msgstr "כווית" #. 136 msgid "Cayman Islands" msgstr "איי קיימן" #. 398 msgid "Kazakhstan" msgstr "קזחסטן" #. 418 msgid "Lao People's Democratic Republic" msgstr "לאוס" #. 422 msgid "Lebanon" msgstr "לבנון" #. 662 msgid "Saint Lucia" msgstr "סנט לוסיה" #. 438 msgid "Liechtenstein" msgstr "ליכטנשטיין" #. 144 msgid "Sri Lanka" msgstr "סרי לנקה" #. 430 msgid "Liberia" msgstr "ליבריה" #. 426 msgid "Lesotho" msgstr "לסוטו" #. 440 msgid "Lithuania" msgstr "ליטא" #. 442 msgid "Luxembourg" msgstr "לוקסמבורג" #. 428 msgid "Latvia" msgstr "לטביה" #. 434 msgid "Libya" msgstr "לוב" #. 504 msgid "Morocco" msgstr "מרוקו" #. 492 msgid "Monaco" msgstr "מונקו" #. 498 msgid "Moldova, Republic of" msgstr "מולדובה" #. 499 msgid "Montenegro" msgstr "מונטנגרו" #. 663 msgid "Saint Martin (French part)" msgstr "סנט מרטיו (החלק הצרפתי)" #. 450 msgid "Madagascar" msgstr "מדגסקר" #. 584 msgid "Marshall Islands" msgstr "איי מרשל" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "מקדוניה" #. 466 msgid "Mali" msgstr "מאלי" #. 104 msgid "Myanmar" msgstr "מיאנמר" #. 496 msgid "Mongolia" msgstr "מונגוליה" #. 446 msgid "Macao" msgstr "מקאו" #. 580 msgid "Northern Mariana Islands" msgstr "איי מריאנה הצפוניים" #. 474 msgid "Martinique" msgstr "מרטיניק" #. 478 msgid "Mauritania" msgstr "מאוריטניה" #. 500 msgid "Montserrat" msgstr "מונטסראט" #. 470 msgid "Malta" msgstr "מלטה" #. 480 msgid "Mauritius" msgstr "מאוריציוס" #. 462 msgid "Maldives" msgstr "האיים המלדיביים" #. 454 msgid "Malawi" msgstr "מלאווי" #. 484 msgid "Mexico" msgstr "מקסיקו" #. 458 msgid "Malaysia" msgstr "מלזיה" #. 508 msgid "Mozambique" msgstr "מוזמביק" #. 516 msgid "Namibia" msgstr "נמיביה" #. 540 msgid "New Caledonia" msgstr "קלדוניה החדשה" #. 562 msgid "Niger" msgstr "ניז'ר" #. 574 msgid "Norfolk Island" msgstr "האי נורפוק" #. 566 msgid "Nigeria" msgstr "ניגריה" #. 558 msgid "Nicaragua" msgstr "ניקרגואה" #. 528 msgid "Netherlands" msgstr "הולנד" #. 578 msgid "Norway" msgstr "נורבגיה" #. 524 msgid "Nepal" msgstr "נפאל" #. 520 msgid "Nauru" msgstr "נאורו" #. 570 msgid "Niue" msgstr "ניואה" #. 554 msgid "New Zealand" msgstr "ניו-זילנד" #. 512 msgid "Oman" msgstr "עומן" #. 591 msgid "Panama" msgstr "פנמה" #. 604 msgid "Peru" msgstr "פרו" #. 258 msgid "French Polynesia" msgstr "פולינזיה הצרפתית" #. 598 msgid "Papua New Guinea" msgstr "פפואה גינאה החדשה" #. 608 msgid "Philippines" msgstr "הפיליפינים" #. 586 msgid "Pakistan" msgstr "פקיסטן" #. 616 msgid "Poland" msgstr "פולין" #. 666 msgid "Saint Pierre and Miquelon" msgstr "סנט פייר ומיקלון" #. 612 msgid "Pitcairn" msgstr "פיטקרן" #. 630 msgid "Puerto Rico" msgstr "פורטו ריקו" #. 275 msgid "Palestinian Territory, Occupied" msgstr "פלסטין" #. 620 msgid "Portugal" msgstr "פורטוגל" #. 585 msgid "Palau" msgstr "פלאו" #. 600 msgid "Paraguay" msgstr "פראגוואי" #. 634 msgid "Qatar" msgstr "קטאר" #. 638 msgid "Reunion" msgstr "ריוניון" #. 642 msgid "Romania" msgstr "רומניה" #. 688 msgid "Serbia" msgstr "סרביה" #. 643 msgid "Russian Federation" msgstr "רוסיה" #. 646 msgid "Rwanda" msgstr "רואנדה" #. 682 msgid "Saudi Arabia" msgstr "ערב הסעודית" #. 090 msgid "Solomon Islands" msgstr "איי שלמה" #. 690 msgid "Seychelles" msgstr "איי סיישל" #. 736 msgid "Sudan" msgstr "סודן" #. 752 msgid "Sweden" msgstr "שבדיה" #. 702 msgid "Singapore" msgstr "סינגפור" #. 654 msgid "Saint Helena" msgstr "סנט הלנה" #. 705 msgid "Slovenia" msgstr "סלובניה" #. 744 msgid "Svalbard and Jan Mayen" msgstr "סוולבראד ויאן מאיין" #. 703 msgid "Slovakia" msgstr "סלובקיה" #. 694 msgid "Sierra Leone" msgstr "סיירה ליאונה" #. 674 msgid "San Marino" msgstr "סן מרינו" #. 686 msgid "Senegal" msgstr "סנגל" #. 706 msgid "Somalia" msgstr "סומליה" #. 740 msgid "Suriname" msgstr "סורינאם" #. 728 msgid "South Sudan" msgstr "דרום סודן" #. 678 msgid "Sao Tome and Principe" msgstr "סאו תומה ופרינסיפה" #. 222 msgid "El Salvador" msgstr "אל סלוודור" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "סוריה" #. 748 msgid "Swaziland" msgstr "סווזילנד" #. 796 msgid "Turks and Caicos Islands" msgstr "איי טורקס וקאיקוס" #. 148 msgid "Chad" msgstr "צ'אד" #. 260 msgid "French Southern Territories" msgstr "הטריטוריות הדרום צרפתיות" #. 768 msgid "Togo" msgstr "טוגו" #. 764 msgid "Thailand" msgstr "תאילנד" #. 762 msgid "Tajikistan" msgstr "טג'יקיסטן" #. 772 msgid "Tokelau" msgstr "טוקלאו" #. 626 msgid "Timor-Leste" msgstr "טימור מזרח" #. 795 msgid "Turkmenistan" msgstr "טורקמניסטן" #. 788 msgid "Tunisia" msgstr "טוניסיה" #. 776 msgid "Tonga" msgstr "טונגה" #. 792 msgid "Turkey" msgstr "טורקיה" #. 780 msgid "Trinidad and Tobago" msgstr "טרינידד וטובגו" #. 798 msgid "Tuvalu" msgstr "טובלו" #. 158 msgid "Taiwan, Province of China" msgstr "טאיוואן" #. 834 msgid "Tanzania, United Republic of" msgstr "טנזניה" #. 804 msgid "Ukraine" msgstr "אוקראינה" #. 800 msgid "Uganda" msgstr "אוגנדה" #. 581 msgid "United States Minor Outlying Islands" msgstr "איים מזעריים ומרוחקים השייכים לארה\"ב" #. 840 msgid "United States" msgstr "ארצות הברית" #. 858 msgid "Uruguay" msgstr "אורוגוואי" #. 860 msgid "Uzbekistan" msgstr "אוזבקיסטן" #. 336 msgid "Holy See (Vatican City State)" msgstr "וותיקן" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "סנט וינסנט והגרנדינים" #. 862 msgid "Venezuela" msgstr "ונצואלה" #. 092 msgid "Virgin Islands, British" msgstr "איי הבתולה (בריטיים)" #. 850 msgid "Virgin Islands, U.S." msgstr "איי הבתולה (ארה\"ב)" #. 704 msgid "Viet Nam" msgstr "וייטנאם" #. 548 msgid "Vanuatu" msgstr "ונואטו" #. 876 msgid "Wallis and Futuna" msgstr "ואליס ופוטונה" #. 882 msgid "Samoa" msgstr "סמואה" #. 887 msgid "Yemen" msgstr "תימן" #. 175 msgid "Mayotte" msgstr "מיוט" #. 710 msgid "South Africa" msgstr "דרום אפריקה" #. 894 msgid "Zambia" msgstr "זמביה" #. 716 msgid "Zimbabwe" msgstr "זימבבואה" msgid "* Unknown, add is_in tags to those cities" msgstr "*לא ידוע,הוסף תגי is_in לערים אלו" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "נקודה במפה" msgid "Car" msgstr "מכונית" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "ארץ" msgid "Postal" msgstr "דואר" msgid "Town" msgstr "עיירה" msgid "District" msgstr "מחוז" msgid "Street" msgstr "רחוב" msgid "Number" msgstr "מס'" msgid "Enter Destination" msgstr "הכנס יעד" msgid "Zip Code" msgstr "מיקוד" msgid "City" msgstr "עיר" msgid "District/Township" msgstr "מחוז/איזור העיר" msgid "Map" msgstr "מפה" msgid "Bookmark" msgstr "סימניה" msgid "Destination" msgstr "יעד" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "תצוגה" msgid "_Route" msgstr "מסלול" msgid "_Former Destinations" msgstr "יעדים קודמים" msgid "_Bookmarks" msgstr "סימניות" msgid "_Map" msgstr "מפה" msgid "_Layout" msgstr "מערך" msgid "_Projection" msgstr "תכנון" msgid "_Vehicle" msgstr "רכב (ׂGPS)" msgid "Zoom_Out" msgstr "התרחק" msgid "Decrease zoom level" msgstr "התרחקות" msgid "Zoom_In" msgstr "התקרב" msgid "Increase zoom level" msgstr "התקרבות" msgid "_Recalculate" msgstr "חשב מחדש" msgid "Redraw map" msgstr "צייר מפה מחדש" msgid "_Info" msgstr "מידע" msgid "Set _destination" msgstr "הגדרת י_עד" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "עצור ניווט" msgid "Test" msgstr "בדיקה" msgid "_Quit" msgstr "_יציאה" msgid "Quit the application" msgstr "סגור יישום" msgid "Show position _cursor" msgstr "הצגת _סמן המיקום" msgid "_Lock on Road" msgstr "הנעל על הדרך" msgid "_Keep orientation to the North" msgstr "קיבוע הכיוון ל_צפון" msgid "Switches map orientation to the north or the vehicle" msgstr "החלפת כיווניות המפה לצפון או לפי כיוון הרכב" msgid "_Roadbook" msgstr "הוראות נסיעה" msgid "Show/hide route description" msgstr "הצגה/הסתרה של תיאור המסלול" msgid "_Autozoom" msgstr "זום אוטומטי" msgid "Enable/disable automatic zoom level changing" msgstr "הפעלה/נטרול של שינוי אוטומטי של רמת תקריב" msgid "_Fullscreen" msgstr "מסך מלא" msgid "Data" msgstr "מידע" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "צ'" msgid "NE" msgstr "צפון מזרח" msgid "E" msgstr "מז'" msgid "SE" msgstr "דרום מזרח" msgid "S" msgstr "ד'" msgid "SW" msgstr "דרום מערב" msgid "W" msgstr "מע'" msgid "NW" msgstr "צפון מערב" #. Android resource: @strings/no msgid "No" msgstr "לא" msgid "2D" msgstr "דו-מימד" msgid "3D" msgstr "תלת מימד" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "נשארו עוד %4.0f ק\"מ, זמן הגעה משוער %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "מסלול 0000ק\"מ 0+00:00 זמן הגעה משוער" msgid "Help" msgstr "עזרה" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "צפה בדפדפן אינטרנט" msgid "Item type" msgstr "סוג הפריט" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "רחובות" msgid "House numbers" msgstr "מספרי בתים" msgid "View Attributes" msgstr "צפה בתכונות" msgid "Set as position (and deactivate vehicle)" msgstr "הגדרה כמיקום (ונטרול הרכב)" msgid "POIs" msgstr "נ\"צ" msgid "View on map" msgstr "צפה במפה" msgid "Remove search results from the map" msgstr "הסרת תוצאות החיפוש מהמפה" msgid "Show results on the map" msgstr "הצגת תוצאות במפה" msgid "Cut Bookmark" msgstr "גזור סימניה" msgid "Copy Bookmark" msgstr "העתק סימניה" msgid "Rename Bookmark" msgstr "שנה שם סימנייה" msgid "Paste Bookmark" msgstr "הדבק סימניה" msgid "Delete Bookmark" msgstr "מחק סימניה" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "סימניות" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "מחיקת תיקייה" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "הוספת תיקיית סימניות" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "הדבק סימניה" #, c-format msgid "Bookmark %s" msgstr "סימנייה %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "הורדת מפה" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "הצגת מצב הלוויינים" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "הצגת נתוני NMEA" msgid "car" msgstr "מכונית" msgid "bike" msgstr "אופניים" msgid "pedestrian" msgstr "הולך רגל" #, c-format msgid "Current profile: %s" msgstr "פרופיל נוכחי: %s" #, c-format msgid "Change profile to: %s" msgstr "שנה את הפרופיל ל: %s" msgid "Set as active" msgstr "הגדרה כפעיל" msgid "Show Satellite status" msgstr "הצגת מצב הלוויינים" msgid "Show NMEA data" msgstr "הצגת נתוני NMEA" msgid "Add Bookmark" msgstr "הוסף סימניה" msgid "Rename" msgstr "עריכת שם" msgid "About Navit" msgstr "אודות Navit" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "וכל הצוות של Navit" msgid "members and contributors." msgstr "חברים ותורמים." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "נא להזין נקודות ציון" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "רכב (ׂGPS)" msgid "Rules" msgstr "כללים" msgid "Lock on road" msgstr "נעול על הדרך" msgid "Northing" msgstr "הצפנה" msgid "Map follows Vehicle" msgstr "מפה עוקבת אחר הרכב" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "מפות" msgid "Layout" msgstr "מערך" msgid "Height Profile" msgstr "פרופיל גובה" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "יעדים קודמים" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "הודעה" msgid "Back" msgstr "חזרה" msgid "Back to map" msgstr "חזור למפה" msgid "Main Menu" msgstr "תפריט ראשי" msgid "House number" msgstr "מספר בית" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "מיקום רכב" msgid "Main menu" msgstr "תפריט ראשי" msgid "" "Show\n" "Map" msgstr "" "הצגת\n" "מפה" msgid "Settings" msgstr "הגדרות" msgid "Tools" msgstr "כלים" msgid "Route" msgstr "מסלול" msgid "About" msgstr "אודות" msgid "Quit" msgstr "יציאה" msgid "Actions" msgstr "פעולות" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "עצור\n" "ניווט" msgid "Display" msgstr "תצוגה" msgid "Fullscreen" msgstr "מסך מלא" msgid "Window Mode" msgstr "מצב חלון" msgid "Description" msgstr "תיאור" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "אחר כך צא מהכיכר ב%1$s %2$s" navit-0.5.0+dfsg.1/po/hi.po.in000066400000000000000000001120671264204753600157160ustar00rootroot00000000000000# Hindi translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # desh deep https://launchpad.net/~singhdeepdesh msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Hindi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: hi\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "pehla nikas" msgid "second exit" msgstr "dusra nikas" msgid "third exit" msgstr "teesra nikas" msgid "fourth exit" msgstr "chautha nikas" msgid "fifth exit" msgstr "panchwa nikas" msgid "sixth exit" msgstr "chatha nikas" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meters" #, c-format msgid "in %d meters" msgstr "%d meters mein" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometero mein" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d kilometero mein" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ek kilometer" msgstr[1] "%d kilometero" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ek kilometer mein" msgstr[1] "%d kilometero mein" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "dhalan mein" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%ssheher mein %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%ssheher mein %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%ssheher mein %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%ssheher mein %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "जब संभव हो, कृपया चारों ओर मोड़" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "अगले%s के लिए सड़क का पालन करें" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "%1$s %2$s के राउंडअबाउट छोड़ें" msgid "soon" msgstr "जल्दी" msgid "now" msgstr "अब" msgid "then" msgstr "तो" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "दायाँ" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "बांया" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "आसानी से " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "दृढ़ता से " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "%1$s %2$s के लिए सड़क ले लो" #, c-format msgid "after %i roads" msgstr "%i के बाद सड़कों" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "तो चारों ओर मोड़" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "चारों ओर मोड़ %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "तो चारों ओर मोड़" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "चारों ओर मोड़ %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Nikas" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "तो %1$s %2$s के राउंडअबाउट छोड़" navit-0.5.0+dfsg.1/po/hr.po.in000066400000000000000000001222011264204753600157160ustar00rootroot00000000000000# Croatian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Marjan Vrban https://launchpad.net/~mvrban # gogo https://launchpad.net/~trebelnik-stefina # klajo https://launchpad.net/~klaudio msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: gogo \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "Language: hr\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Starta iz izvorne mape\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "postavka '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulti" msgid "first" msgstr "prvi" msgid "second" msgstr "drugi" msgid "third" msgstr "treći" msgid "fourth" msgstr "četvrti" msgid "fifth" msgstr "peti" msgid "sixth" msgstr "šesti" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulti izlaz" msgid "first exit" msgstr "prvi izlaz" msgid "second exit" msgstr "drugi izlaz" msgid "third exit" msgstr "treći izlaz" msgid "fourth exit" msgstr "četvrti izlaz" msgid "fifth exit" msgstr "peti izlaz" msgid "sixth exit" msgstr "šesti izlaz" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metara" #, c-format msgid "in %d meters" msgstr "za %d metara" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometara" #, c-format msgid "in %d.%d kilometers" msgstr "za %d.%d kilometara" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometar" msgstr[1] "%d kilometara" msgstr[2] "%d kilometara" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "za %d kilometar" msgstr[1] "za %d kilometara" msgstr[2] "za %d kilometara" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "na rampu" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%su ulicu %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%su %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%su %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%su %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%su %s" msgid "When possible, please turn around" msgstr "Ako je moguće okrenite se" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Pratite cestu za idući %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Napustite kružni tok na %1$s %2$s" msgid "soon" msgstr "uskoro" msgid "now" msgstr "sada" msgid "then" msgstr "onda" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "desno" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "lijevo" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "jednostavno " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "teško " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Vozite cestom %1$s do %2$s" #, c-format msgid "after %i roads" msgstr "nakon %i ceste" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Krenite %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "onda okrenite se" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Okrenite se %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "onda okrenite se" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Okrenite se %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "nakon toga ste stigli do cilja" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Stigli ste na cilj %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Izlaz" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozicija" msgid "Command" msgstr "Naredba" msgid "Length" msgstr "Dužina" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Vrijeme" msgid "Destination Length" msgstr "Duljina odredišta" msgid "Destination Time" msgstr "Vrijeme dolaska" msgid "Roadbook" msgstr "Cestovni dnevnik" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Namjestite poziciju" msgid "Set as destination" msgstr "Namjestite odredište" msgid "Add as bookmark" msgstr "Dodajte zabilješku" #, c-format msgid "Point 0x%x 0x%x" msgstr "Točka 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinate ekrana : %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Ujedinjeni Arapski Emirati" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albanija" #. 051 msgid "Armenia" msgstr "Armenija" #. 530 msgid "Netherlands Antilles" msgstr "Nizozemski Antili" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Američki Samoa" #. 040 msgid "Austria" msgstr "Austrija" #. 036 msgid "Australia" msgstr "Australija" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Alandski otoci" #. 031 msgid "Azerbaijan" msgstr "Azerbejdžan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna i Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeš" #. 056 msgid "Belgium" msgstr "Belgija" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bugarska" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Sveti Bartolomej" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunej Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivija" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Otok Bouvet" #. 072 msgid "Botswana" msgstr "Bocvana" #. 112 msgid "Belarus" msgstr "Bjelorusija" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosovi (Keeling) otoci" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Demokratska republika Kongo" #. 140 msgid "Central African Republic" msgstr "Srednjoafrička Republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švicarska" #. 384 msgid "Cote d'Ivoire" msgstr "Obala Bjelokosti" #. 184 msgid "Cook Islands" msgstr "Cookovi otoci" #. 152 msgid "Chile" msgstr "Čile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Kolumbija" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Zelenortski otoci" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Božićni otoci" #. 196 msgid "Cyprus" msgstr "Cipar" #. 203 msgid "Czech Republic" msgstr "Češka Republika" #. 276 msgid "Germany" msgstr "Njemačka" #. 262 msgid "Djibouti" msgstr "Džibuti" #. 208 msgid "Denmark" msgstr "Danska" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikanska Republika" #. 012 msgid "Algeria" msgstr "Alžir" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estonija" #. 818 msgid "Egypt" msgstr "Egipat" #. 732 msgid "Western Sahara" msgstr "Zapadna Sahara" #. 232 msgid "Eritrea" msgstr "Eritreja" #. 724 msgid "Spain" msgstr "Španjolska" #. 231 msgid "Ethiopia" msgstr "Etiopija" #. 246 msgid "Finland" msgstr "Finska" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandski otoci (Malvini)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezija" #. 234 msgid "Faroe Islands" msgstr "Otočje Faroe" #. 250 msgid "France" msgstr "Francuska" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Velika Britanija" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzija" #. 254 msgid "French Guiana" msgstr "Francuska Gvajana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grenland" #. 270 msgid "Gambia" msgstr "Gambija" #. 324 msgid "Guinea" msgstr "Gvineja" #. 312 msgid "Guadeloupe" msgstr "Gvadalupa" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorska Gvineja" #. 300 msgid "Greece" msgstr "Grčka" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Južna Georgija i Južno Sandwich Otočje" #. 320 msgid "Guatemala" msgstr "Gvatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gvineja-Bissau" #. 328 msgid "Guyana" msgstr "Gvajana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Otok Heard i MacDonaldovi otoci" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Hrvatska" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Mađarska" #. 360 msgid "Indonesia" msgstr "Indonezija" #. 372 msgid "Ireland" msgstr "Irska" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Indija" #. 086 msgid "British Indian Ocean Territory" msgstr "Britanski Teritorij Indijskog Oceana" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italija" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenija" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komori" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sveti Kitts i Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Sjeverna Koreja" #. 410 msgid "Korea, Republic of" msgstr "Južna Koreja" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanski otoci" #. 398 msgid "Kazakhstan" msgstr "Kazahstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Sveta Lucija" #. 438 msgid "Liechtenstein" msgstr "Lihtenštajn" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberija" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litva" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Latvija" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Crna Gora" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (francuski dio)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Maršalovi otoci" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonija" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mjanmar" #. 496 msgid "Mongolia" msgstr "Mongolija" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Sjeverno Marijansko Otočje" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritanija" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricijus" #. 462 msgid "Maldives" msgstr "Maledivi" #. 454 msgid "Malawi" msgstr "Malavi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "Malezija" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibija" #. 540 msgid "New Caledonia" msgstr "Nova Kaledonija" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Otočje" #. 566 msgid "Nigeria" msgstr "Nigerija" #. 558 msgid "Nicaragua" msgstr "Nikaragva" #. 528 msgid "Netherlands" msgstr "Nizozemska" #. 578 msgid "Norway" msgstr "Norveška" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Novi Zeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francuska Polinezija" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Gvineja" #. 608 msgid "Philippines" msgstr "Filipini" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poljska" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre i Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragvaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumunjska" #. 688 msgid "Serbia" msgstr "Srbija" #. 643 msgid "Russian Federation" msgstr "Ruska Federacija" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudijska Arabija" #. 090 msgid "Solomon Islands" msgstr "Solomonski otoci" #. 690 msgid "Seychelles" msgstr "Sejšeli" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Švedska" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Sveta Helena" #. 705 msgid "Slovenia" msgstr "Slovenija" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard i Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovačka" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalija" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sv. Toma i Princip" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirijska Arapska Republika" #. 748 msgid "Swaziland" msgstr "Svazi" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks i Caicos Otočje" #. 148 msgid "Chad" msgstr "Čad" #. 260 msgid "French Southern Territories" msgstr "Francuski Južni Teritoriji" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tajland" #. 762 msgid "Tajikistan" msgstr "Tadžikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Istočni TImor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunis" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turska" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad i Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Kineska Pokrajina Tajvan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanija" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Sjedinjene države jezera Minor Outlying" #. 840 msgid "United States" msgstr "Sjedinjene države" #. 858 msgid "Uruguay" msgstr "Urugvaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikan (država Vatikanskog grada)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sveti Vincent i Grenadini" #. 862 msgid "Venezuela" msgstr "Venecuela" #. 092 msgid "Virgin Islands, British" msgstr "Djevičansko Otočje" #. 850 msgid "Virgin Islands, U.S." msgstr "Djevičansko otočje, SAD" #. 704 msgid "Viet Nam" msgstr "Vijetnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis i Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Majote" #. 710 msgid "South Africa" msgstr "Južna Afrika" #. 894 msgid "Zambia" msgstr "Zambija" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "* Nepoznato, dodajte is_in oznake za te gradove" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Točka karte" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Država" msgid "Postal" msgstr "Poštanski" msgid "Town" msgstr "Grad" msgid "District" msgstr "Područje" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Broj" msgid "Enter Destination" msgstr "Ubacite odredište" msgid "Zip Code" msgstr "Poštanski broj" msgid "City" msgstr "Grad" msgid "District/Township" msgstr "okrug/gradsko područje" msgid "Map" msgstr "Karta" msgid "Bookmark" msgstr "Oznaka" msgid "Destination" msgstr "Odredište" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Ekran" msgid "_Route" msgstr "Ruta" msgid "_Former Destinations" msgstr "Nekadašnji odredište" msgid "_Bookmarks" msgstr "Oznake" msgid "_Map" msgstr "Karta" msgid "_Layout" msgstr "Izgled" msgid "_Projection" msgstr "Projekcija" msgid "_Vehicle" msgstr "Vozilo" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "Smanji nivo zooma" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "Povećaj nivo zooma" msgid "_Recalculate" msgstr "Ponovno izračunaj" msgid "Redraw map" msgstr "Ponovo nacrtaj kartu" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Otvara dijalog za pretragu adresa" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stop navigaciju" msgid "Test" msgstr "Provjera" msgid "_Quit" msgstr "_Izlaz" msgid "Quit the application" msgstr "Izlaz iz aplikacije" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Mijenja orjentaciju karte prema sjeveru ili vozilu" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "Pokaži/sakrij opis rute" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "Omogući/onemogući automatski zoom" msgid "_Fullscreen" msgstr "_Cijeli zaslon" msgid "Data" msgstr "Podaci" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "S" msgid "NE" msgstr "SI" msgid "E" msgstr "I" msgid "SE" msgstr "JI" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ruta %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Ruta 0000km 0+00:00 ETA" msgid "Help" msgstr "Pomoć" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vidi u pregledniku" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "kućni broja" msgid "View Attributes" msgstr "Vidi detalje" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Gledaj na kartu" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Izreži zabilješku" msgid "Copy Bookmark" msgstr "Kopiraj zabilješku" msgid "Rename Bookmark" msgstr "Preimenuj zabilješku" msgid "Paste Bookmark" msgstr "Zalijepi zabilješku" msgid "Delete Bookmark" msgstr "Obriši zabilješku" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Oznake" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Dodaj mapu zabilješki" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Zalijepi zabilješku" #, c-format msgid "Bookmark %s" msgstr "Zabilješka %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Pokaži status satelita" msgid " Elevation " msgstr " Nadmorska visina " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Pokaži NMEA podatke" msgid "car" msgstr "auto" msgid "bike" msgstr "biciklo" msgid "pedestrian" msgstr "pješak" #, c-format msgid "Current profile: %s" msgstr "Trenutni profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Mijenjaj profil na: %s" msgid "Set as active" msgstr "Odredi kao aktivno" msgid "Show Satellite status" msgstr "Pokaži status satelita" msgid "Show NMEA data" msgstr "Pokaži NMEA podatke" msgid "Add Bookmark" msgstr "Dodaj oznaku" msgid "Rename" msgstr "Preimenuj" msgid "About Navit" msgstr "Sve od Navit" #. Authors msgid "By" msgstr "Od" #. Contributors msgid "And all the Navit Team" msgstr "I sav Navit tim" msgid "members and contributors." msgstr "članovi i doprinositelji" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vozilo" msgid "Rules" msgstr "Pravila" msgid "Lock on road" msgstr "Drži na cesti" msgid "Northing" msgstr "Sjevereno" msgid "Map follows Vehicle" msgstr "Karta prati vozilo" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Karte" msgid "Layout" msgstr "Izgled" msgid "Height Profile" msgstr "Visinski profil" msgid "Route Description" msgstr "Opis rute" msgid "Show Locale" msgstr "Pokaži mjesto" msgid "Former Destinations" msgstr "Nekadašnji odredište" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Poruka" msgid "Back" msgstr "Natrag" msgid "Back to map" msgstr "Vrati kartu" msgid "Main Menu" msgstr "Glavni meni" msgid "House number" msgstr "Kućni broj" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Pozicija vozila" msgid "Main menu" msgstr "Glavni izbornik" msgid "" "Show\n" "Map" msgstr "" "Pokaži\n" "kartu" msgid "Settings" msgstr "Postavke" msgid "Tools" msgstr "Alati" msgid "Route" msgstr "Ruta" msgid "About" msgstr "O programu" msgid "Quit" msgstr "Izlaz" msgid "Actions" msgstr "Akcije" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "navigaciju" msgid "Display" msgstr "Ekran" msgid "Fullscreen" msgstr "Cijeli ekran" msgid "Window Mode" msgstr "Prozorski način" msgid "Description" msgstr "Opis" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "konj" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "onda napustite kružni tok na %1$s %2$s" navit-0.5.0+dfsg.1/po/hu.po.in000066400000000000000000001334401264204753600157300ustar00rootroot00000000000000# Hungarian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Bernath Marci https://launchpad.net/~bernath-marci # György Balló https://launchpad.net/~ballogy # KaZeR https://launchpad.net/~kazer # Nagy Attila https://launchpad.net/~tylla-at-launchpad-net # WintermuteHun https://launchpad.net/~wintermute-valodi # dandor https://launchpad.net/~dandorfs # kalmarzs https://launchpad.net/~kalmarzs msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: György Balló \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: hu\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Futtatás a forráskönyvtárból\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' beállítása erre: '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulladik" msgid "first" msgstr "első" msgid "second" msgstr "második" msgid "third" msgstr "harmadik" msgid "fourth" msgstr "negyedik" msgid "fifth" msgstr "ötödik" msgid "sixth" msgstr "hatodik" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulladik kijáraton" msgid "first exit" msgstr "első kijáraton" msgid "second exit" msgstr "második kijáraton" msgid "third exit" msgstr "harmadik kijáraton" msgid "fourth exit" msgstr "negyedik kijáraton" msgid "fifth exit" msgstr "ötödik kijáraton" msgid "sixth exit" msgstr "hatodik kijáraton" #, c-format msgid "%d feet" msgstr "%d láb" #, c-format msgid "in %d feet" msgstr "%d láb múlva" #, c-format msgid "%d.%d miles" msgstr "%d.%d mérföld" #, c-format msgid "in %d.%d miles" msgstr "%d.%d mérföld múlva" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "egy mérföld" msgstr[1] "%d mérföld" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "egy mérföld múlva" msgstr[1] "%d mérföld múlva" #, c-format msgid "%d meters" msgstr "%d méter" #, c-format msgid "in %d meters" msgstr "%d méter után" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilométer" #, c-format msgid "in %d.%d kilometers" msgstr "%d,%d kilométer után" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "egy kilométer" msgstr[1] "%d kilométer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "egy kilométer után" msgstr[1] "%d kilométer után" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "a felhajtóra" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sa(z) %s%s%s utcába" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sa(z) %s%s%s útra" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sa(z) %s%s%s útra" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sa(z) %s%s%s útra" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%shajtson rá a(z) %s útra" msgid "When possible, please turn around" msgstr "Amint lehet, fordujon meg" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Haladjon az úton a következő %sig" msgid "Enter the roundabout soon" msgstr "Hajtson be a körforgalomba hamarosan." #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Hagyja el a körforgalmat a(z) %1$s %2$s" msgid "soon" msgstr "hamarosan" msgid "now" msgstr "most" msgid "then" msgstr "aztán" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "jobbra" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "balra" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "enyhén " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "élesen " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "A(z) %1$s útnál forduljon %2$s" #, c-format msgid "after %i roads" msgstr "%i út után" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Forduljon %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "aztán fordujon meg" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Fordujon meg %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "aztán fordujon meg" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Fordujon meg %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "majd eléri az úticélját." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Elérte az úticélját: %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Kijárat" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozíció" msgid "Command" msgstr "Utasítás" msgid "Length" msgstr "Hossz" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Idő" msgid "Destination Length" msgstr "Távolság a céltól" msgid "Destination Time" msgstr "Menetidő" msgid "Roadbook" msgstr "Útikalauz" #, c-format msgid "Waypoint %d" msgstr "Útvonalpont %d" msgid "Visit before..." msgstr "Meglátogatás ez előtt..." msgid "Set as position" msgstr "Beállítás pozícióként" msgid "Set as destination" msgstr "Beállítás úticélként" msgid "Add as bookmark" msgstr "Hozzáadás a könyvjelzőkhöz" #, c-format msgid "Point 0x%x 0x%x" msgstr "Pont 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Képernyő koordinátái: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Egyesült Arab Emirátusok" #. 004 msgid "Afghanistan" msgstr "Afganisztán" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua és Barbuda" #. 660 msgid "Anguilla" msgstr "Angola" #. 008 msgid "Albania" msgstr "Albánia" #. 051 msgid "Armenia" msgstr "Örményország" #. 530 msgid "Netherlands Antilles" msgstr "Holland Antillák" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktisz" #. 032 msgid "Argentina" msgstr "Argentína" #. 016 msgid "American Samoa" msgstr "Amerikai Szamoa" #. 040 msgid "Austria" msgstr "Ausztria" #. 036 msgid "Australia" msgstr "Ausztrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland-sziget" #. 031 msgid "Azerbaijan" msgstr "Azerbajdzsán" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosznia és Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Banglades" #. 056 msgid "Belgium" msgstr "Belgium" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgária" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudák" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Szultanátus" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazília" #. 044 msgid "Bahamas" msgstr "Bahamák" #. 064 msgid "Bhutan" msgstr "Bhután" #. 074 msgid "Bouvet Island" msgstr "Bouvet-sziget" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Fehéroroszország" #. 084 msgid "Belize" msgstr "Belizé" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) -szigetek" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongói Demokratikus Köztársaság" #. 140 msgid "Central African Republic" msgstr "Közép-afrikai Köztársaság" #. 178 msgid "Congo" msgstr "Kongó" #. 756 msgid "Switzerland" msgstr "Svájc" #. 384 msgid "Cote d'Ivoire" msgstr "Elefántcsontpart" #. 184 msgid "Cook Islands" msgstr "Cook-szigetek" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kína" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Zöldfoki-szigetek" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Karácsony-szigetek" #. 196 msgid "Cyprus" msgstr "Ciprus" #. 203 msgid "Czech Republic" msgstr "Csehország" #. 276 msgid "Germany" msgstr "Németország" #. 262 msgid "Djibouti" msgstr "Dzsibuti" #. 208 msgid "Denmark" msgstr "Dánia" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikai Köztársaság" #. 012 msgid "Algeria" msgstr "Algéria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Észtország" #. 818 msgid "Egypt" msgstr "Egyiptom" #. 732 msgid "Western Sahara" msgstr "Nyugat-Szahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanyolország" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Finnország" #. 242 msgid "Fiji" msgstr "Fidzsi-szigetek" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-szigetek" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronéz Államszövetség" #. 234 msgid "Faroe Islands" msgstr "Feröer-szigetek" #. 250 msgid "France" msgstr "Franciaország" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Egyesült Királyság" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Grúzia" #. 254 msgid "French Guiana" msgstr "Francia Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghána" #. 292 msgid "Gibraltar" msgstr "Gibraltár" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Egyenlítői Guinea" #. 300 msgid "Greece" msgstr "Görögország" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Dél-Georgia és Déli-Sandwich-szigetek" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hongkong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard-sziget és McDonald-szigetek" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Horvátország" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Magyarország" #. 360 msgid "Indonesia" msgstr "Indonézia" #. 372 msgid "Ireland" msgstr "Írország" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Man sziget" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Brit Indiai Óceáni Terület" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irán" #. 352 msgid "Iceland" msgstr "Izland" #. 380 msgid "Italy" msgstr "Olaszország" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordánia" #. 392 msgid "Japan" msgstr "Japán" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizisztán" #. 116 msgid "Cambodia" msgstr "Kambodzsa" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comore-szigetek" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts és Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Koreai Demokratikus Népköztársaság" #. 410 msgid "Korea, Republic of" msgstr "Koreai Köztársaság" #. 414 msgid "Kuwait" msgstr "Kuvait" #. 136 msgid "Cayman Islands" msgstr "Kajmán-szigetek" #. 398 msgid "Kazakhstan" msgstr "Kazahsztán" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoszi Demokratikus Népköztársaság" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litvánia" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettország" #. 434 msgid "Libya" msgstr "Líbia" #. 504 msgid "Morocco" msgstr "Marokkó" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldáv Köztársaság" #. 499 msgid "Montenegro" msgstr "Montenegró" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (francia oldal)" #. 450 msgid "Madagascar" msgstr "Madagaszkár" #. 584 msgid "Marshall Islands" msgstr "Marsall-szigetek" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedónia, korábban Jugoszláv Köztársaság" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongólia" #. 446 msgid "Macao" msgstr "Makaó" #. 580 msgid "Northern Mariana Islands" msgstr "Északi Mariana-szigetek" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritánia" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Málta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldív-szigetek" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexikó" #. 458 msgid "Malaysia" msgstr "Malajzia" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Új-Kaledónia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk-sziget" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Hollandia" #. 578 msgid "Norway" msgstr "Norvégia" #. 524 msgid "Nepal" msgstr "Nepál" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Új-Zéland" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francia Polinézia" #. 598 msgid "Papua New Guinea" msgstr "Pápua Új-Guinea" #. 608 msgid "Philippines" msgstr "Fülöp-szigetek" #. 586 msgid "Pakistan" msgstr "Pakisztán" #. 616 msgid "Poland" msgstr "Lengyelország" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre és Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn-szigetek" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palesztin Megszállt Területek" #. 620 msgid "Portugal" msgstr "Portugália" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Románia" #. 688 msgid "Serbia" msgstr "Szerbia" #. 643 msgid "Russian Federation" msgstr "Orosz Föderáció" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Szaúd-Arábia" #. 090 msgid "Solomon Islands" msgstr "Salamon-szigetek" #. 690 msgid "Seychelles" msgstr "Seychelles-szigetek" #. 736 msgid "Sudan" msgstr "Szudán" #. 752 msgid "Sweden" msgstr "Svédország" #. 702 msgid "Singapore" msgstr "Szingapúr" #. 654 msgid "Saint Helena" msgstr "Szent Ilona" #. 705 msgid "Slovenia" msgstr "Szlovénia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard-szigetek és Jan Mayen-sziget" #. 703 msgid "Slovakia" msgstr "Szlovákia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Szenegál" #. 706 msgid "Somalia" msgstr "Szomália" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "Dél-Szudán" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé és Príncipe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Szíriai Arab Köztársaság" #. 748 msgid "Swaziland" msgstr "Szváziföld" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks és Caicos-szigetek" #. 148 msgid "Chad" msgstr "Csád" #. 260 msgid "French Southern Territories" msgstr "Francia déli területek" #. 768 msgid "Togo" msgstr "Togó" #. 764 msgid "Thailand" msgstr "Thaiföld" #. 762 msgid "Tajikistan" msgstr "Tadzsikisztán" #. 772 msgid "Tokelau" msgstr "Tokelau-szigetek" #. 626 msgid "Timor-Leste" msgstr "Kelet-Timor" #. 795 msgid "Turkmenistan" msgstr "Türkmenisztán" #. 788 msgid "Tunisia" msgstr "Tunézia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Törökország" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad és Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tajvan, Kínai Tartomány" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzániai Egyesült Köztársaság" #. 804 msgid "Ukraine" msgstr "Ukrajna" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Amerikai Csendes-óceáni-szigetek" #. 840 msgid "United States" msgstr "Egyesült Államok" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Üzbegisztán" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikán" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent és a Grenadines-szigetek" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin-szigetek (brit)" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin-szigetek (USA)" #. 704 msgid "Viet Nam" msgstr "Vietnám" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis és Futuna" #. 882 msgid "Samoa" msgstr "Szamoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Dél-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "*Ismeretlen, is_in címkék hozzáadása ezekhez a városokhoz" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Nem található konfigurációs állomány (navit.xml, navit.xml.local)\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "A konfigurációs állomány '%s' elemzése közben hiba történt: %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "A következő konfigurációs állomány használata: %s\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Belső inicializálás sikertelen, kilépés. Ellenőrizze az előző " "hibaüzeneteket.\n" msgid "unknown street" msgstr "ismeretlen utca" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Névtelen jármű" msgid "Failed to write bookmarks file" msgstr "Hiba történt a könyvjelző állomány írása közben" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Térképpont" msgid "Car" msgstr "Autó" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Ország" msgid "Postal" msgstr "Ir. szám" msgid "Town" msgstr "Város" msgid "District" msgstr "Kerület" msgid "Street" msgstr "Utca" msgid "Number" msgstr "Házszám" msgid "Enter Destination" msgstr "Úticél megadása" msgid "Zip Code" msgstr "Irányítószám" msgid "City" msgstr "Város" msgid "District/Township" msgstr "Kerület/Környék" msgid "Map" msgstr "Térkép" msgid "Bookmark" msgstr "Könyvjelző" msgid "Destination" msgstr "Úticél" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Megjelenítés" msgid "_Route" msgstr "Útvonal" msgid "_Former Destinations" msgstr "Korábbi úticélok" msgid "_Bookmarks" msgstr "Könyvjelzők" msgid "_Map" msgstr "Térkép" msgid "_Layout" msgstr "Elrendezés" msgid "_Projection" msgstr "Vetület" msgid "_Vehicle" msgstr "Jármű" msgid "Zoom_Out" msgstr "Távolítás" msgid "Decrease zoom level" msgstr "Távolítás" msgid "Zoom_In" msgstr "Közelítés" msgid "Increase zoom level" msgstr "Közelítés" msgid "_Recalculate" msgstr "Újratervezés" msgid "Redraw map" msgstr "Térkép újrarajzolása" msgid "_Info" msgstr "Információk" msgid "Set _destination" msgstr "Cél beállítása" msgid "Opens address search dialog" msgstr "Címkeresés" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Navigálás vége" msgid "Test" msgstr "Teszt" msgid "_Quit" msgstr "_Kilépés" msgid "Quit the application" msgstr "Kilépés az alkalmazásból" msgid "Show position _cursor" msgstr "Helyzetjelző megjelenítése" msgid "_Lock on Road" msgstr "Rögzítés az úthoz" msgid "_Keep orientation to the North" msgstr "A tájolás észak felé tartása" msgid "Switches map orientation to the north or the vehicle" msgstr "Térkép rögzítése északra vagy a jármű irányához" msgid "_Roadbook" msgstr "Útikalauz" msgid "Show/hide route description" msgstr "Útvonal leírás megjelenítése/elrejtése" msgid "_Autozoom" msgstr "Ráközelítés" msgid "Enable/disable automatic zoom level changing" msgstr "Automatikus közelítés engedélyezése/tiltása" msgid "_Fullscreen" msgstr "Teljes képernyő" msgid "Data" msgstr "Adat" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "É" msgid "NE" msgstr "ÉK" msgid "E" msgstr "K" msgid "SE" msgstr "DK" msgid "S" msgstr "D" msgid "SW" msgstr "DNy" msgid "W" msgstr "Ny" msgid "NW" msgstr "ÉNy" #. Android resource: @strings/no msgid "No" msgstr "Nincs" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Útvonal hossza: %4.0fkm, becsült menetidő: %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Útvonal hossza 0000km, becsült menetidő: 0+00:00" msgid "Help" msgstr "Súgó" #, c-format msgid "Waypoint %s" msgstr "Útvonalpont %s" msgid "Select waypoint to insert the new one before" msgstr "Válassza ki az útvonalpontot amely elé beszúrja az újat" msgid "View in Browser" msgstr "Megtekintés böngészőben" msgid "Item type" msgstr "Elem típusa" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Utcák" msgid "House numbers" msgstr "Házszámok" msgid "View Attributes" msgstr "Attribútumok megjelenítése" msgid "Set as position (and deactivate vehicle)" msgstr "Beállítás pozícióként (és jármű kikapcsolása)" msgid "POIs" msgstr "POI-k" msgid "View on map" msgstr "Megtekintés térképen" msgid "Remove search results from the map" msgstr "Keresési találatok eltávolítása a térképről" msgid "Show results on the map" msgstr "Keresési találatok mutatása a térképen" msgid "Cut Bookmark" msgstr "Könyvjelző kivágása" msgid "Copy Bookmark" msgstr "Könyvjelző másolása" msgid "Rename Bookmark" msgstr "Könyvjelző átnevezése" msgid "Paste Bookmark" msgstr "Könyvjelző beillesztése" msgid "Delete Bookmark" msgstr "Könyvjelző törlése" msgid "Delete waypoint" msgstr "Útvonalpont törlése" msgid "Bookmarks" msgstr "Könyvjelzők" msgid "Bookmarks as waypoints" msgstr "Könyvjelzők mint útvonalpontok" msgid "Save waypoints" msgstr "Útvonalpontok mentése" msgid "Replace with waypoints" msgstr "Helyettesítés útvonalpontokkal" msgid "Delete Folder" msgstr "Mappa törlése" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Könyvjelző mappa létrehozása" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Könyvjelző beillesztése" #, c-format msgid "Bookmark %s" msgstr "%s hozzáadása a könyvjelzőkhöz" #, c-format msgid "Download %s" msgstr "Letöltés %s" msgid "Map Download" msgstr "Térkép letöltés" msgid "Active" msgstr "Aktív" msgid "Download Enabled" msgstr "Letöltés engedélyezve" msgid "Download completely" msgstr "Teljes letöltés" msgid "Show Satellite Status" msgstr "Műhold státusz" msgid " Elevation " msgstr " Magasság " msgid " Azimuth " msgstr " Irány " msgid "Show NMEA Data" msgstr "NMEA adatok" msgid "car" msgstr "autós" msgid "bike" msgstr "kerékpáros" msgid "pedestrian" msgstr "gyalogos" #, c-format msgid "Current profile: %s" msgstr "Jelenlegi profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Profil módosítása erre: %s" msgid "Set as active" msgstr "Aktívra állítás" msgid "Show Satellite status" msgstr "Műhold státusz" msgid "Show NMEA data" msgstr "NMEA adatok" msgid "Add Bookmark" msgstr "Könyvjelző hozzáadása" msgid "Rename" msgstr "Átnevezés" msgid "About Navit" msgstr "A Navit névjegye" #. Authors msgid "By" msgstr "Készítők" #. Contributors msgid "And all the Navit Team" msgstr "És az egész Navit Team" msgid "members and contributors." msgstr "tagok és hozzájárulók" msgid "Waypoints" msgstr "Útvonalpontok" msgid "Enter Coordinates" msgstr "Koordináták megadása" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "Koordináták megadása, pl:" msgid "Vehicle" msgstr "Jármű" msgid "Rules" msgstr "Szabályok" msgid "Lock on road" msgstr "Rögzítés az úthoz" msgid "Northing" msgstr "Észak felé" msgid "Map follows Vehicle" msgstr "A térkép követi a járművet" msgid "Plan with Waypoints" msgstr "Tervezés útvonalpontokkal" msgid "Maps" msgstr "Térképek" msgid "Layout" msgstr "Elrendezés" msgid "Height Profile" msgstr "Magassági profil" msgid "Route Description" msgstr "Útvonalleírás" msgid "Show Locale" msgstr "Hely megjelenítése" msgid "Former Destinations" msgstr "Korábbi úticélok" msgid "- No former destinations available -" msgstr "- Nincsenek előző célpontok -" msgid "Message" msgstr "Üzenet" msgid "Back" msgstr "Vissza" msgid "Back to map" msgstr "Vissza a térképhez" msgid "Main Menu" msgstr "Főmenü" msgid "House number" msgstr "Házszám" msgid "Next" msgstr "Következő" msgid "Prev" msgstr "Előző" msgid "Return to route!" msgstr "Vissza az útvonalra!" #. warning told msgid "Look out! Camera!" msgstr "Vigyázz, kamera!" #. warning told msgid "Please decrease your speed" msgstr "Lassíts!" msgid "partial match" msgstr "részleges egyezés" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Keres" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Városok" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Útvonal ide" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Térkép adatok (c) OpenStreeMap közreműködők, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Letöltött térképek" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Mégse" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Teljes bolygó" msgid "Africa" msgstr "Afrika" msgid "Canary Islands" msgstr "Kanári-szigetek" msgid "Asia" msgstr "Ázsia" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Tajvan" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "Óceánia" msgid "Tasmania" msgstr "Tasmánia" msgid "Victoria" msgstr "Viktória" msgid "New South Wales" msgstr "Új-Dél-Wales" msgid "Europe" msgstr "Európa" msgid "Western Europe" msgstr "Nyugat-Európa" msgid "Azores" msgstr "Azori-szigetek" msgid "BeNeLux" msgstr "BeneLux" msgid "Alsace" msgstr "Elzász" msgid "Aquitaine" msgstr "Aquitania" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Alsó-Normandia" msgid "Bourgogne" msgstr "Burgundia" msgid "Bretagne" msgstr "Bretagne" msgid "Centre" msgstr "Közép" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Korzika" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "Felső-Normandia" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lotaringia" msgid "Midi-Pyrenees" msgstr "Midi-Pyrenees" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Pikárdia" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provence-Alpes-Cote-d-Azur" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "Baden-Württemberg" msgid "Bayern" msgstr "Bajorország" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "Niederbayern" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "Brandenburg" msgid "Bremen" msgstr "Bréma" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "Alsó-Szászország" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "Saar-vidék" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "Szászország" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "Türingia" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "Skandinávia" msgid "England" msgstr "Anglia" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "Észak-Amerika" msgid "Alaska" msgstr "Alaszka" msgid "Hawaii" msgstr "" msgid "USA" msgstr "Amerikai Egyesült Államok" msgid " (except Alaska and Hawaii)" msgstr " (kivéve Alaszka és Hawaii)" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "Dél és Közép-Amerika" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "letöltés" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "kész" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Kevés a szabad terület" msgid "Error downloading map!" msgstr "Hiba térképletöltés közben!" msgid "Error writing map!" msgstr "Hiba a térkép mentése közben!" msgid "Map download aborted!" msgstr "Térképletöltés megszakítva!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Becsült hátralévő idő" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Térképletöltés" msgid "Vehicle Position" msgstr "Jármű helyzete" msgid "Main menu" msgstr "Főmenü" msgid "" "Show\n" "Map" msgstr "" "Térkép\n" "megjelenítése" msgid "Settings" msgstr "Beállítások" msgid "Tools" msgstr "Eszközök" msgid "Route" msgstr "Útvonal" msgid "About" msgstr "Névjegy" msgid "Quit" msgstr "Kilépés" msgid "Actions" msgstr "Műveletek" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "Koordináták" msgid "" "Stop\n" "Navigation" msgstr "" "Navigáció\n" "leállítása" msgid "Display" msgstr "Megjelenítés" msgid "Fullscreen" msgstr "Teljes képernyő" msgid "Window Mode" msgstr "Ablak mód" msgid "Description" msgstr "Leírás" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "Műhold állapot" msgid "NMEA Data" msgstr "NMEA adat" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "ló" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Igen" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit elindult" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit fut" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Üdvözli önt a Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Köszönjük hogy feltelepítette a Navit-ot!\n" "\n" "Kezdésnek válassza a \"Térképletöltés\"-t a menüből térkép letöltéséhez. " "Megj: a térkép mérete nagy lehet (> 50 MB) - WiFi kapcsolat javasolt.\n" "\n" "Térképadatok: (c) OpenStreeMap közreműködők\n" "\n" "Használja élvezettel, Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "További információ" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Nagyítás" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Kicsinyítés" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Térképletöltés" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "POIk ki/bekapcsolása" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Kilépés" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Mentés / Visszaállítás" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Töröljük ezt a térképet?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Letöltés:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Hiba történt a térképletöltés közben." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Térképletöltés megszabítva" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Nincs helymeghatározás. Indítsa újra sikeres helymeghatározás után." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Térképek az aktuális helyzettel" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Címkeresés" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Célbevitel" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Cím részleges egyezés" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Keresés..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Cím nem található" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Keresési találatok lekérése" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Keresési találatok betöltése" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Nincs találat" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Nincs keresési kifejezés" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Cél beállítása:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Válasszon műveletet." #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Kérem helyezzen be egy SD kártyát" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Biztonsági mentés..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Visszaállítás..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Nem sikerült a biztonsági mentés könyvtárát létrehozni" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "A mentés sikertelen" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Nem található biztonsági mentés" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Sikertelen visszaállítás" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "A mentés sikeres" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Visszaállítás sikeres\n" "Kérem indítsa újra a Navit-ot" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Biztonsági mentés nem található" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "A visszaállítás sikertelen" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Biztonsági mentés kiválasztása" #. Android resource: @strings/backup msgid "Backup" msgstr "Biztonsági mentés" #. Android resource: @strings/restore msgid "Restore" msgstr "Visszaállítás" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "majd hagyja el a körforgalmat a(z) %1$s %2$s" navit-0.5.0+dfsg.1/po/id.po.in000066400000000000000000001177351264204753600157210ustar00rootroot00000000000000# Indonesian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Joel-apobae.com https://launchpad.net/~amanda2000 # KaZeR https://launchpad.net/~kazer # M Bambang I https://launchpad.net/~mbi-lawang # Michael von Glasow https://launchpad.net/~michael-vonglasow # Steve Kartantya https://launchpad.net/~jack-haz msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: id\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "penataan '%s' ke '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "ke nol" msgid "first" msgstr "pertama" msgid "second" msgstr "kedua" msgid "third" msgstr "ketiga" msgid "fourth" msgstr "keempat" msgid "fifth" msgstr "kelima" msgid "sixth" msgstr "keenam" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "exit pertama" msgid "second exit" msgstr "exit kedua" msgid "third exit" msgstr "exit ketiga" msgid "fourth exit" msgstr "exit keempat" msgid "fifth exit" msgstr "exit kelima" msgid "sixth exit" msgstr "exit keenam" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "dalam %d meter" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "dalam %d.%d kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "dalam %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "menuju jalur yang melandai" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%smenuju ke %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%smenuju ke %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%smenuju ke %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%smenuju ke %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%smenuju ke %s" msgid "When possible, please turn around" msgstr "Bila memungkinkan, balik arah" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "ikuti jalan untuk ke tujuan berikutnya %s" msgid "Enter the roundabout soon" msgstr "segera memasuki bundaran" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Tinggalkan bundaran pada %1$s %2$s" msgid "soon" msgstr "segera" msgid "now" msgstr "saat ini" msgid "then" msgstr "kemudian" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "kanan" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "Kiri" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "dengan mudah " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "Sangat " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ambil %1$s jalan ke %2$s" #, c-format msgid "after %i roads" msgstr "setelah %i jalan" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Beloklah %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "kemudian balik arah" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Balik arah %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "kemudian balik arah" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Balik arah %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "kini anda telah sampai pada tujuan" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "anda telah sampai pada tujuan %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Keluar" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisi" msgid "Command" msgstr "Perintah" msgid "Length" msgstr "" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "" msgid "Destination Length" msgstr "Jarak ke tujuan" msgid "Destination Time" msgstr "Waktu di tujuan" msgid "Roadbook" msgstr "Panduan perjalanan" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Tetapkan sebagai posisi" msgid "Set as destination" msgstr "Tetapkan sebagai tujuan" msgid "Add as bookmark" msgstr "Tambahkan sebagai penunjuk" #, c-format msgid "Point 0x%x 0x%x" msgstr "Titik 0X%x 0X%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinat dilayar :%d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Uni Emirat Arab" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua dan Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antilles Belanda" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Kepulauan Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia dan Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilia" #. 044 msgid "Bahamas" msgstr "Kepulauan Bahama" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Pulau Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarusia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kepulauan Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Republik Demokrat Kongo" #. 140 msgid "Central African Republic" msgstr "Republik Afrika Tengah" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Swiss" #. 384 msgid "Cote d'Ivoire" msgstr "Pantai Gading" #. 184 msgid "Cook Islands" msgstr "Kepulauan Cook" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Kolombia" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Tanjung Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Pulau Christmas" #. 196 msgid "Cyprus" msgstr "Siprus" #. 203 msgid "Czech Republic" msgstr "Republik Ceko" #. 276 msgid "Germany" msgstr "Jerman" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Republik Dominikan" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Mesir" #. 732 msgid "Western Sahara" msgstr "Sahara Barat" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanyol" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Kepulauan Fakland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "Kepulauan Faroe" #. 250 msgid "France" msgstr "Perancis" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Inggris" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guiana Perancis" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Jibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "Yunani" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Pulau Heard dan Kepulauan McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hongaria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlandia" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Republik Islam Iran" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Jepang" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Kamboja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoro" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea Utara" #. 410 msgid "Korea, Republic of" msgstr "Korea Selatan" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kepulauan Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Santa Lusia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Republik Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Kepulauan Mashall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Kaledonia Baru" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Pulau Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Belanda" #. 578 msgid "Norway" msgstr "Norwegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "Selandia Baru" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "Philipina" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polandia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federasi Rusia" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arab Saudi" #. 090 msgid "Solomon Islands" msgstr "Kepulauan Salomon" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Swedia" #. 702 msgid "Singapore" msgstr "Singapura" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Republik Arab Siria" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turki" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad dan Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "Amerika Serikat" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "Viet Nam" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yaman" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "Afika Selatan" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Letak pada peta" msgid "Car" msgstr "Mibil" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "Negara" msgid "Postal" msgstr "Pos" msgid "Town" msgstr "Kota" msgid "District" msgstr "" msgid "Street" msgstr "Jalan" msgid "Number" msgstr "Nomer" msgid "Enter Destination" msgstr "Masukan Tujuan" msgid "Zip Code" msgstr "kode Pos" msgid "City" msgstr "kota" msgid "District/Township" msgstr "" msgid "Map" msgstr "Peta" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "Tujuan" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Tampilan" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "Peta" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "Proyeksi" msgid "_Vehicle" msgstr "Kendaraan" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Menghitung ulang" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Informasi" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Navigasi berhenti" msgid "Test" msgstr "Tes" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Panduan perjalanan" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "AutoZoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Layar penuh" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "Utara" msgid "NE" msgstr "Timur Laut" msgid "E" msgstr "Timur" msgid "SE" msgstr "Tenggara" msgid "S" msgstr "Selatan" msgid "SW" msgstr "Barat Daya" msgid "W" msgstr "Barat" msgid "NW" msgstr "Barat Laut" #. Android resource: @strings/no msgid "No" msgstr "Tidak" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rute %4.0fkm %02d:%02d Perkiraan waktu kedatangan" msgid "Route 0000km 0+00:00 ETA" msgstr "Rute 0000km 0+00:00 Perkiraan waktu kedatangan" msgid "Help" msgstr "Bantuan" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "jalan" msgid "House numbers" msgstr "Nomor Rumah" msgid "View Attributes" msgstr "Lihat atribut" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Lihat pada peta" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Hapus penanda" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Penanda %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Status Satelit" msgid " Elevation " msgstr " Elevasi " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Data NMEA" msgid "car" msgstr "mobil" msgid "bike" msgstr "sepeda" msgid "pedestrian" msgstr "pejalan kaki" #, c-format msgid "Current profile: %s" msgstr "Profil saat ini: %s" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "Diaktifkan" msgid "Show Satellite status" msgstr "Status Satelit" msgid "Show NMEA data" msgstr "Data NMEA" msgid "Add Bookmark" msgstr "Tambah Penanda" msgid "Rename" msgstr "" msgid "About Navit" msgstr "Tentang Navit" #. Authors msgid "By" msgstr "Oleh" #. Contributors msgid "And all the Navit Team" msgstr "Dan seluruh anggota tim Navit" msgid "members and contributors." msgstr "para anggota dan kontributor" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Kendaraan" msgid "Rules" msgstr "Aturan - aturan" msgid "Lock on road" msgstr "Kunci pada jalan" msgid "Northing" msgstr "Keutara" msgid "Map follows Vehicle" msgstr "Peta mengikuti kendaraan" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Peta - peta" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "Profil ketinggian" msgid "Route Description" msgstr "Deskripsi rute" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Pesan" msgid "Back" msgstr "Kembali" msgid "Back to map" msgstr "Kembali ke Peta" msgid "Main Menu" msgstr "Menu Utama" msgid "House number" msgstr "Nomer rumah" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Posisi kendaraan" msgid "Main menu" msgstr "Menu Utama" msgid "" "Show\n" "Map" msgstr "" "Tampilan\n" "Map" msgid "Settings" msgstr "Pengaturan" msgid "Tools" msgstr "Peralatan" msgid "Route" msgstr "Rute" msgid "About" msgstr "Tentang" msgid "Quit" msgstr "Berhenti" msgid "Actions" msgstr "Tindakan-tindakan" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Navigasi\n" "Berhenti" msgid "Display" msgstr "Tampilan" msgid "Fullscreen" msgstr "Layar penuh" msgid "Window Mode" msgstr "" msgid "Description" msgstr "Deskripsi" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "kuda" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "kemudian tinggalkan bundaran pada %1$s %2$s" navit-0.5.0+dfsg.1/po/it.po.in000066400000000000000000001367441264204753600157420ustar00rootroot00000000000000# Italian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # AndreaCr https://launchpad.net/~andij-cr # Davide Gobbi https://launchpad.net/~hobbie # Marco Ciampa https://launchpad.net/~ciampix # Marco Lazzaroni https://launchpad.net/~marcolazzaroni # Matteo Zaffo '80 https://launchpad.net/~zaffo80 # MeltingShell https://launchpad.net/~meltingshell # Michael von Glasow https://launchpad.net/~michael-vonglasow # Michele Olivo https://launchpad.net/~micheleolivo # Niccolo Rigacci https://launchpad.net/~niccolo # Stefano Angeleri https://launchpad.net/~weltall # Stemby https://launchpad.net/~carlo-stemberger # amedeo https://launchpad.net/~amedeo-lanza # b3784098 https://launchpad.net/~b3784098 # ernia https://launchpad.net/~monghitri # giardia https://launchpad.net/~fabriziosm # jackyes https://launchpad.net/~jackthebest # tomas https://launchpad.net/~tracks-tomyt msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:58+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: it\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Esecuzione dalla cartella di compilazione\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "impostazione di '%s' a '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "primo" msgid "second" msgstr "secondo" msgid "third" msgstr "terzo" msgid "fourth" msgstr "quarto" msgid "fifth" msgstr "quinto" msgid "sixth" msgstr "sesto" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "Uscita zero" msgid "first exit" msgstr "prima uscita" msgid "second exit" msgstr "seconda uscita" msgid "third exit" msgstr "terza uscita" msgid "fourth exit" msgstr "quarta uscita" msgid "fifth exit" msgstr "quinta uscita" msgid "sixth exit" msgstr "sesta uscita" #, c-format msgid "%d feet" msgstr "%d piedi" #, c-format msgid "in %d feet" msgstr "tra %d piedi" #, c-format msgid "%d.%d miles" msgstr "%d.%d miglia" #, c-format msgid "in %d.%d miles" msgstr "tra %d.%d miglia" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "un miglio" msgstr[1] "%d miglia" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "tra un miglio" msgstr[1] "tra %d miglia" #, c-format msgid "%d meters" msgstr "%d metri" #, c-format msgid "in %d meters" msgstr "tra %d metri" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d chilometri" #, c-format msgid "in %d.%d kilometers" msgstr "tra %d,%d chilometri" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un chilometro" msgstr[1] "%d chilometri" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "tra un chilometro" msgstr[1] "tra %d chilometri" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$ssulla %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$ssulla strada %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$ssul %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$ssulla %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$ssulla strada %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "nella rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sin %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sin %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sin %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sin %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sin %s" msgid "When possible, please turn around" msgstr "Appena possibile, invertire il senso di marcia" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "verso %s" #, c-format msgid "Follow the road for the next %s" msgstr "Seguire la strada per i prossimi %s" msgid "Enter the roundabout soon" msgstr "Tra poco si entrerà in rotonda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Alla rotonda prendere la %1$s %2$s" msgid "soon" msgstr "tra poco" msgid "now" msgstr "adesso" msgid "then" msgstr "poi" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "poi entrare%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Entrare %1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "poi entrare%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Entrare %1$s%2$s" msgid "on your left" msgstr "a sinistra" msgid "on your right" msgstr "a destra" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Prendere l'uscita %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Prendere l'uscita %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "all'intersezione" msgid "at exit" msgstr "all'uscita" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "poi procedere dritto%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "Procedere dritto %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "poi tenere la destra%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "Tenere la destra %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "poi tenere la sinistra%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "Tenere la sinistra %1$s%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "destra" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "sinistra" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "leggermente " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "decisamente " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Prendere la %1$s strada a %2$s" #, c-format msgid "after %i roads" msgstr "tra %i strade" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Svoltare %1$s %2$s %3$s %4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "poi invertire il senso di marcia" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Invertire il senso di marcia %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "poi invertire il senso di marcia" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Invertire il senso di marcia %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "seguire" msgid "then you have reached your destination." msgstr "poi sarete arrivati a destinazione" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Siete arrivati a destinazione %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Intersezione" msgid "Exit" msgstr "Uscita" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posizione" msgid "Command" msgstr "Indicazione" msgid "Length" msgstr "Distanza" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tempo" msgid "Destination Length" msgstr "Distanza all'arrivo" msgid "Destination Time" msgstr "Orario di arrivo" msgid "Roadbook" msgstr "Quaderno di viaggio" #, c-format msgid "Waypoint %d" msgstr "Waypoint %d" msgid "Visit before..." msgstr "Visitare prima..." msgid "Set as position" msgstr "Imposta come posizione" msgid "Set as destination" msgstr "Imposta come destinazione" msgid "Add as bookmark" msgstr "Aggiungi come segnalibro" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punto 0x%x, 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordinate schermo: %d, %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emirati Arabi Uniti" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua e Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antille olandesi" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartide" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americane" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Isole Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbaigian" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia - Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgio" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius e Saba" #. 076 msgid "Brazil" msgstr "Brasile" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Isola Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorussia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Isole Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Repubblica Democratica del" #. 140 msgid "Central African Republic" msgstr "Repubblica Centrafricana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Svizzera" #. 384 msgid "Cote d'Ivoire" msgstr "Costa d'Avorio" #. 184 msgid "Cook Islands" msgstr "Isole Cook" #. 152 msgid "Chile" msgstr "Cile" #. 120 msgid "Cameroon" msgstr "Camerun" #. 156 msgid "China" msgstr "Cina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Capo Verde" #. 531 msgid "Curacao" msgstr "Curaçao" #. 162 msgid "Christmas Island" msgstr "Isola di Natale" #. 196 msgid "Cyprus" msgstr "Cipro" #. 203 msgid "Czech Republic" msgstr "Repubblica Ceca" #. 276 msgid "Germany" msgstr "Germania" #. 262 msgid "Djibouti" msgstr "Gibuti" #. 208 msgid "Denmark" msgstr "Danimarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Repubblica Dominicana" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egitto" #. 732 msgid "Western Sahara" msgstr "Sahara Occidentale" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spagna" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Figi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Isole Falkland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Stati Federati di Micronesia" #. 234 msgid "Faroe Islands" msgstr "Isole Fær Øer" #. 250 msgid "France" msgstr "Francia" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Regno Unito" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guyana Francese" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibilterra" #. 304 msgid "Greenland" msgstr "Groenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadalupa" #. 226 msgid "Equatorial Guinea" msgstr "Guinea Equatoriale" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia del Sud e Isole delle Sandwich meridionali" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Isole Heard e McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croazia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungheria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israele" #. 833 msgid "Isle of Man" msgstr "Isola di Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Territorio Britannico dell'Oceano Indiano" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Repubblica Islamica dell'" #. 352 msgid "Iceland" msgstr "Islanda" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Giamaica" #. 400 msgid "Jordan" msgstr "Giordania" #. 392 msgid "Japan" msgstr "Giappone" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghizistan" #. 116 msgid "Cambodia" msgstr "Cambogia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comore" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts e Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Corea, Repubblica Democratica Popolare di" #. 410 msgid "Korea, Republic of" msgstr "Corea, Repubblica di" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Isole Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakistan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, Repubblica popolare democratica del" #. 422 msgid "Lebanon" msgstr "Libano" #. 662 msgid "Saint Lucia" msgstr "Santa Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Lussemburgo" #. 428 msgid "Latvia" msgstr "Lettonia" #. 434 msgid "Libya" msgstr "Libia" #. 504 msgid "Morocco" msgstr "Marocco" #. 492 msgid "Monaco" msgstr "Principato di Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavia" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint-Martin (parte francese)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Isole Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Repubblica di Macedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Isole Marianne Settentrionali" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldive" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Messico" #. 458 msgid "Malaysia" msgstr "Malesia" #. 508 msgid "Mozambique" msgstr "Mozambico" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nuova Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Isola Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Olanda" #. 578 msgid "Norway" msgstr "Norvegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nuova Zelanda" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Perù" #. 258 msgid "French Polynesia" msgstr "Polinesia francese" #. 598 msgid "Papua New Guinea" msgstr "Papua Nuova Guinea" #. 608 msgid "Philippines" msgstr "Filippine" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre e Miquelon" #. 612 msgid "Pitcairn" msgstr "Isole Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portogallo" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Isola della Riunione" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federazione Russa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudita" #. 090 msgid "Solomon Islands" msgstr "Isole Salomone" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Svezia" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sant'Elena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovacchia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "Sudan del Sud" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (parte danese)" #. 760 msgid "Syrian Arab Republic" msgstr "Siria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks e Caicos" #. 148 msgid "Chad" msgstr "Ciad" #. 260 msgid "French Southern Territories" msgstr "Terre Australi e Antartiche Francesi" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailandia" #. 762 msgid "Tajikistan" msgstr "Tagikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Est" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turchia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad e Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ucraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Isole minori esterne degli Stati Uniti" #. 840 msgid "United States" msgstr "Stati Uniti" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Città del Vaticano" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent e Grenadine" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Isole Vergini britanniche" #. 850 msgid "Virgin Islands, U.S." msgstr "Isole Vergini americane" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sudafrica" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Sconosciuto, aggiungi tag is_in a quelle città" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "Non è stato trovato alcun file di configurazione navit.xml, navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Errore nel parsing del file di configurazione '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Usando il file di configurazione '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Errore: Nessuna configurazione trovata nel file config '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Inizializzazione interna fallita, uscendo. Controlla i messaggi di errore " "precedenti.\n" msgid "unknown street" msgstr "strada sconosciuta" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Veicolo senza nome" msgid "Failed to write bookmarks file" msgstr "Fallita scrittura file luogo preferito" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punto sulla mappa" msgid "Car" msgstr "Automobile" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Nazione" msgid "Postal" msgstr "Postale" msgid "Town" msgstr "Centro abitato" msgid "District" msgstr "Regione" msgid "Street" msgstr "Via" msgid "Number" msgstr "Numero" msgid "Enter Destination" msgstr "Inserire la destinazione" msgid "Zip Code" msgstr "C.A.P." msgid "City" msgstr "Città" msgid "District/Township" msgstr "Regione/provincia" msgid "Map" msgstr "Mappa" msgid "Bookmark" msgstr "Posto" msgid "Destination" msgstr "Destinazione" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visualizza" msgid "_Route" msgstr "Percorso" msgid "_Former Destinations" msgstr "Destinazioni precedenti" msgid "_Bookmarks" msgstr "_Luoghi preferiti" msgid "_Map" msgstr "Mappa" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Proiezione" msgid "_Vehicle" msgstr "Veicolo" msgid "Zoom_Out" msgstr "Zoom -" msgid "Decrease zoom level" msgstr "Riduci zoom" msgid "Zoom_In" msgstr "Zoom +" msgid "Increase zoom level" msgstr "Aumenta zoom" msgid "_Recalculate" msgstr "Ricalcola" msgid "Redraw map" msgstr "Ridisegna la mappa" msgid "_Info" msgstr "Informazioni" msgid "Set _destination" msgstr "Imposta_destinazione" msgid "Opens address search dialog" msgstr "Apri la finestra di ricerca indirizzo" msgid "_POI search" msgstr "_Ricerca POI" msgid "Opens POI search dialog" msgstr "Apri la finestra di ricerca POI" msgid "_Stop Navigation" msgstr "Interrompi la navigazione" msgid "Test" msgstr "Prova" msgid "_Quit" msgstr "_Esci" msgid "Quit the application" msgstr "Esci dal programma" msgid "Show position _cursor" msgstr "Mostra posizione_cursore" msgid "_Lock on Road" msgstr "Prosegui su questa strada" msgid "_Keep orientation to the North" msgstr "_Mantieni orientamento verso Nord" msgid "Switches map orientation to the north or the vehicle" msgstr "" "Cambia l'orientamento della mappa tra il nord e la direzione del veicolo" msgid "_Roadbook" msgstr "Quaderno di viaggio" msgid "Show/hide route description" msgstr "Visualizza/Nascondi la decrizione del percorso" msgid "_Autozoom" msgstr "Zoom automatico" msgid "Enable/disable automatic zoom level changing" msgstr "Abilita/disabilita il cambiamento automatico del livello di zoom" msgid "_Fullscreen" msgstr "Schermo intero" msgid "Data" msgstr "Dati" msgid "Pharmacy" msgstr "Farmacia" msgid "Restaurant" msgstr "Ristorante" msgid "Restaurant. Fast food" msgstr "Ristorante. Fast food" msgid "Hotel" msgstr "Albergo" msgid "Car parking" msgstr "Parcheggio per auto" msgid "Fuel station" msgstr "Benzinaio" msgid "Bank" msgstr "Banca" msgid "Hospital" msgstr "Ospedale" msgid "Cinema" msgstr "Cinema" msgid "Train station" msgstr "Stazione ferroviaria" msgid "School" msgstr "Scuola" msgid "Police" msgstr "Polizia" msgid "Justice" msgstr "Tribunale" msgid "Taxi" msgstr "Taxi" msgid "Shopping" msgstr "Negozi" msgid "Distance from screen center (km)" msgstr "Distanza dal centro dello schermo (km)" #, c-format msgid "POI %s. %s" msgstr "POI %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Imposta la destinazione a %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Imposta la mappa a %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "Imposta la prossima tappa a %ld, %ld \n" msgid "POI search" msgstr "Ricerca POI" msgid "Select a category" msgstr "Selezionare una categoria" msgid "Select a distance to look for (km)" msgstr "Selezionare la distanza in cui cercare (km)" msgid "Select a POI" msgstr "Selezionare un POI" msgid " " msgstr " " msgid "Category" msgstr "Categoria" msgid "Direction" msgstr "Direzione" msgid "Distance(m)" msgstr "Distanza (m)" msgid "Name" msgstr "Nome" msgid "Visit Before" msgstr "Visita prima" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "No" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Percorso %4.0f km, %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Percorso 0000 km, 00:00 ETA" msgid "Help" msgstr "Aiuto" #, c-format msgid "Waypoint %s" msgstr "Waypoint %s" msgid "Select waypoint to insert the new one before" msgstr "Selezionare waypoint per inserire il nuovo prima" msgid "View in Browser" msgstr "Visualizza nel browser" msgid "Item type" msgstr "Tipo elemento" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Strade" msgid "House numbers" msgstr "Numeri civici" msgid "View Attributes" msgstr "Visualizza attributi" msgid "Set as position (and deactivate vehicle)" msgstr "Impostare come posizione (e disattivare veicolo)" msgid "POIs" msgstr "Punti d'interesse" msgid "View on map" msgstr "Visualizza sulla mappa" msgid "Remove search results from the map" msgstr "Elimina i risultati della ricerca dalla mappa" msgid "Show results on the map" msgstr "Mostra risultati sulla mappa" msgid "Cut Bookmark" msgstr "Taglia posto" msgid "Copy Bookmark" msgstr "Copia posto" msgid "Rename Bookmark" msgstr "Rinomina posto" msgid "Paste Bookmark" msgstr "Incolla posto" msgid "Delete Bookmark" msgstr "Cancella posto" msgid "Delete waypoint" msgstr "Cancella waypoint" msgid "Bookmarks" msgstr "Luoghi preferiti" msgid "Bookmarks as waypoints" msgstr "Luoghi preferiti come waypoints" msgid "Save waypoints" msgstr "Salva waypoints" msgid "Replace with waypoints" msgstr "Rimpiazza con waypoint" msgid "Delete Folder" msgstr "Elimina Cartella" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Aggiungere una cartella di posti" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Incolla posto" #, c-format msgid "Bookmark %s" msgstr "Posto %s" #, c-format msgid "Download %s" msgstr "Scarica %s" msgid "Map Download" msgstr "Scarica Mappa" msgid "Active" msgstr "Attivo" msgid "Download Enabled" msgstr "Scaricamento abilitato" msgid "Download completely" msgstr "Scarica completamente" msgid "Show Satellite Status" msgstr "Mostra stato satellite" msgid " Elevation " msgstr " Elevazione " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Mostra dati NMEA" msgid "car" msgstr "Automobile" msgid "bike" msgstr "Bicicletta" msgid "pedestrian" msgstr "Pedone" #, c-format msgid "Current profile: %s" msgstr "Profilo corrente: %s" #, c-format msgid "Change profile to: %s" msgstr "Cambia profilo con: %s" msgid "Set as active" msgstr "Imposta come attivo" msgid "Show Satellite status" msgstr "Mostra stato satellite" msgid "Show NMEA data" msgstr "Mostra dati NMEA" msgid "Add Bookmark" msgstr "Aggiungere un posto" msgid "Rename" msgstr "Rinomina" msgid "About Navit" msgstr "Info su Navit" #. Authors msgid "By" msgstr "di" #. Contributors msgid "And all the Navit Team" msgstr "e tutta la squadra Navit" msgid "members and contributors." msgstr "membri e contributori." msgid "Waypoints" msgstr "Waypoints" msgid "Enter Coordinates" msgstr "Inserire Coordinate" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Latitudine Longitudine" msgid "Enter coordinates, for example:" msgstr "Inserire coordinate, ad esempio:" msgid "Vehicle" msgstr "Veicolo" msgid "Rules" msgstr "Regole" msgid "Lock on road" msgstr "Blocca sulla strada" msgid "Northing" msgstr "Visione verso nord" msgid "Map follows Vehicle" msgstr "La mappa segue il veicolo" msgid "Plan with Waypoints" msgstr "Pianifica con Waypoints" msgid "Maps" msgstr "Mappe" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Altimetria" msgid "Route Description" msgstr "Descrizione del percorso" msgid "Show Locale" msgstr "Mostra la localizzazione" msgid "Former Destinations" msgstr "Destinazioni precedenti" msgid "- No former destinations available -" msgstr "-Nessuna destinazione precedente disponibile-" msgid "Message" msgstr "Messaggio" msgid "Back" msgstr "Indietro" msgid "Back to map" msgstr "Torna alla mappa" msgid "Main Menu" msgstr "Menù principale" msgid "House number" msgstr "Numero civico" msgid "Next" msgstr "Successivo" msgid "Prev" msgstr "Precedente" msgid "Return to route!" msgstr "Ritornare sul percorso!" #. warning told msgid "Look out! Camera!" msgstr "Attenzione! Autovelox!" #. warning told msgid "Please decrease your speed" msgstr "Prego rallenta" msgid "partial match" msgstr "corrispondemza parziale" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Cerca" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Paesini" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Percorso per questo punto" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Dati Mappa (c) Contributori OpenStreetMap, licenza ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Mappe scaricate" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Annulla" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Intero Pianeta" msgid "Africa" msgstr "Africa" msgid "Canary Islands" msgstr "Isole Canarie" msgid "Asia" msgstr "Asia" msgid "Korea" msgstr "Corea" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "Emirati Arabi Uniti+altro" msgid "Oceania" msgstr "Oceania" msgid "Tasmania" msgstr "Tasmania" msgid "Victoria" msgstr "Victoria" msgid "New South Wales" msgstr "Nuovo Galles del Sud" msgid "Europe" msgstr "Europa" msgid "Western Europe" msgstr "Europa occidentale" msgid "Azores" msgstr "Azzorre" msgid "BeNeLux" msgstr "BeNeLux" msgid "Alsace" msgstr "Alsazia" msgid "Aquitaine" msgstr "Aquitania" msgid "Auvergne" msgstr "Alvernia" msgid "Basse-Normandie" msgstr "Bassa Normandia" msgid "Bourgogne" msgstr "Borgogna" msgid "Bretagne" msgstr "Bretagna" msgid "Centre" msgstr "Centro" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Corsica" msgid "Franche-Comte" msgstr "Franca Contea" msgid "Haute-Normandie" msgstr "Alta Normandia" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Linguadoca-Rossiglione" msgid "Limousin" msgstr "Limosino" msgid "Lorraine" msgstr "Lorena" msgid "Midi-Pyrenees" msgstr "Midi-Pirenei" msgid "Nord-pas-de-Calais" msgstr "Nord-Passo di Calais" msgid "Pays-de-la-Loire" msgstr "Paesi della Loira" msgid "Picardie" msgstr "Picardia" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provenza-Alpi-Costa Azzurra" msgid "Rhone-Alpes" msgstr "Rodano-Alpi" msgid "Baden-Wuerttemberg" msgstr "Baden-Wuerttemberg" msgid "Bayern" msgstr "Baviera" msgid "Mittelfranken" msgstr "Media Franconia" msgid "Niederbayern" msgstr "Bassa Baviera" msgid "Oberbayern" msgstr "Alta Baviera" msgid "Oberfranken" msgstr "Alta Franconia" msgid "Oberpfalz" msgstr "Alto Palatinato" msgid "Schwaben" msgstr "Svevia" msgid "Unterfranken" msgstr "Bassa Franconia" msgid "Berlin" msgstr "Berlino" msgid "Brandenburg" msgstr "Brandeburgo" msgid "Bremen" msgstr "Brema" msgid "Hamburg" msgstr "Amburgo" msgid "Hessen" msgstr "Assia" msgid "Mecklenburg-Vorpommern" msgstr "Meclemburgo-Pomerania Anteriore" msgid "Niedersachsen" msgstr "Bassa Sassonia" msgid "Nordrhein-westfalen" msgstr "Renania Settentrionale-Vestfalia" msgid "Rheinland-Pfalz" msgstr "Renania-Palatinato" msgid "Saarland" msgstr "Saarland" msgid "Sachsen-Anhalt" msgstr "Sassonia-Anhalt" msgid "Sachsen" msgstr "Sassonia" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Turingia" msgid "Mallorca" msgstr "Maiorca" msgid "Galicia" msgstr "Galizia" msgid "Scandinavia" msgstr "Scandinavia" msgid "England" msgstr "Inghilterra" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "East yorkshire with hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "South yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Scozia" msgid "Wales" msgstr "Galles" msgid "Crete" msgstr "Creta" msgid "North America" msgstr "America del Nord" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawaii" msgid "USA" msgstr "Stati Uniti d'America" msgid " (except Alaska and Hawaii)" msgstr " (eccetto Alaska e Hawaii)" msgid "Midwest" msgstr "Stati Uniti medio occidentali" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Stati Uniti d'America nord-orientali" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacific" msgid "South" msgstr "Stati Uniti d'America meridionali" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "District of Columbia" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginia" msgid "West Virginia" msgstr "Virginia Occidentale" msgid "West" msgstr "Stati Uniti d'America occidentali" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "California" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nuovo Messico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Washington (stato)" msgid "South+Middle America" msgstr "America Centrale" msgid "Guyane Francaise" msgstr "Guyana francese" msgid "downloading" msgstr "download in corso" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "pronto" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Spazio libero non sufficiente" msgid "Error downloading map!" msgstr "Errore nello scaricamento della mappa!" msgid "Error writing map!" msgstr "Errore nel salvataggio della mappa!" msgid "Map download aborted!" msgstr "Scaricamento mappa annullato!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Tempo stimato" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Scaricamento mappa" msgid "Vehicle Position" msgstr "Posizione del veicolo" msgid "Main menu" msgstr "Menù principale" msgid "" "Show\n" "Map" msgstr "" "Mostra\n" "Mappa" msgid "Settings" msgstr "Impostazioni" msgid "Tools" msgstr "Strumenti" msgid "Route" msgstr "Percorso" msgid "About" msgstr "Info" msgid "Quit" msgstr "Esci" msgid "Actions" msgstr "Azioni" msgid "" "Former\n" "Destinations" msgstr "" "Destinazioni\n" "precedenti" msgid "Coordinates" msgstr "Coordinate" msgid "" "Stop\n" "Navigation" msgstr "Stop" msgid "Display" msgstr "Visualizza" msgid "Fullscreen" msgstr "Schermo intero" msgid "Window Mode" msgstr "Modalità finestra" msgid "Description" msgstr "Descrizione" msgid "" "Drop last \n" "Waypoint" msgstr "" "Togli l'ultimo \n" "Waypoint" msgid "" "Drop next \n" "Waypoint" msgstr "" "Togli il prossimo \n" "Waypoint" msgid "Satellite Status" msgstr "Stato dei Satelliti" msgid "NMEA Data" msgstr "Dati NMEA" msgid "car_shortest" msgstr "Automobile (strada più corta)" msgid "car_avoid_tolls" msgstr "Automobile (evita pedaggi)" msgid "car_pedantic" msgstr "Automobile (include strade minori)" msgid "horse" msgstr "Cavallo" msgid "Truck" msgstr "Mezzi pesanti/Camion" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Si" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit partito" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit in funzione" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Benvenuti in Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Grazie per aver installato Navit!\n" "\n" "Per iniziare, seleziona \"Scarica mappe\" dal menu per scaricare una mappa. " "Nota: Il file scaricato potrebbe essere grande (>50MB) - si consiglia una " "connessione wifi.\n" "\n" "Dati mappe: (c) Contributori OpenStreetMap\n" "\n" "Divertiti con Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Maggiori informazioni" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Ingrandisci" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Riduci" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Scarica mappe" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Mostra/nascondi POI" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Esci da Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Backup / Ripristino" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Cancellare questa mappa?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Download in corso:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Errore nello scaricamento della mappa" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Scaricamento mappa annullato" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Nessuna posizione. Riaprire dopo il fix della posizione." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mappe contenenti la posizione attuale" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Cerca indirizzo" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Inserisci destinazione" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Confronta indirizzo parziale" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Ricerca in corso..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Indirizzo non trovato" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Recupero risultati ricerca" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Caricamento risultati ricerca" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Nessun risultato trovato" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Non è stato immesso alcun testo" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Imposto destinazione su:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Scegliere un'azione" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Per favore inserire una memory card SD" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Backup in corso..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Ripristino in corso..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Creazione directory di backup fallita" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Backup fallito" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Nessun Backup trovato" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Ripristino fallito" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Backup avvenuto con successo" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Ripristino avvenuto con successo\n" "Per favore riavviare Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Backup non trovato" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Ripristino fallito" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Selezionare il backup" #. Android resource: @strings/backup msgid "Backup" msgstr "Backup" #. Android resource: @strings/restore msgid "Restore" msgstr "Ripristino" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "e alla rotonda prendere la %1$s %2$s" navit-0.5.0+dfsg.1/po/ja.po.in000066400000000000000000001204421264204753600157040ustar00rootroot00000000000000# Japanese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # MontBlanc https://launchpad.net/~osm-gatinho msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2013-09-28 01:43+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: ja\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d メートル" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "まもなく" msgid "now" msgstr "今" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "右" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "左" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "目的地の%sにつきました" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "コマンド" msgid "Length" msgstr "" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "現在地として設定" msgid "Set as destination" msgstr "目的地として設定" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "アンドラ" #. 784 msgid "United Arab Emirates" msgstr "アラブ首長国連邦" #. 004 msgid "Afghanistan" msgstr "アフガニスタン" #. 028 msgid "Antigua and Barbuda" msgstr "アンティグア・バーブーダ" #. 660 msgid "Anguilla" msgstr "アンギラ" #. 008 msgid "Albania" msgstr "アルバニア" #. 051 msgid "Armenia" msgstr "アルメニア" #. 530 msgid "Netherlands Antilles" msgstr "オランダ領アンティル" #. 024 msgid "Angola" msgstr "アンゴラ" #. 010 msgid "Antarctica" msgstr "南極" #. 032 msgid "Argentina" msgstr "アルゼンチン" #. 016 msgid "American Samoa" msgstr "アメリカ領サモア" #. 040 msgid "Austria" msgstr "オーストリア" #. 036 msgid "Australia" msgstr "オーストラリア" #. 533 msgid "Aruba" msgstr "アルバ" #. 248 msgid "Aland Islands" msgstr "オーランド諸島" #. 031 msgid "Azerbaijan" msgstr "アゼルバイジャン" #. 070 msgid "Bosnia and Herzegovina" msgstr "ボスニア・ヘルツェゴビナ" #. 052 msgid "Barbados" msgstr "バルバドス" #. 050 msgid "Bangladesh" msgstr "バングラデシュ" #. 056 msgid "Belgium" msgstr "ベルギー" #. 854 msgid "Burkina Faso" msgstr "ブルキナファソ" #. 100 msgid "Bulgaria" msgstr "ブルガリア" #. 048 msgid "Bahrain" msgstr "バーレーン" #. 108 msgid "Burundi" msgstr "ブルンジ" #. 204 msgid "Benin" msgstr "ベナン" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "バミューダ諸島" #. 096 msgid "Brunei Darussalam" msgstr "ブルネイ・ダルサラーム" #. 068 msgid "Bolivia" msgstr "ボリビア" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "ブラジル" #. 044 msgid "Bahamas" msgstr "バハマ" #. 064 msgid "Bhutan" msgstr "ブータン" #. 074 msgid "Bouvet Island" msgstr "ブーベ島" #. 072 msgid "Botswana" msgstr "ボツワナ" #. 112 msgid "Belarus" msgstr "ベラルーシ" #. 084 msgid "Belize" msgstr "ベリーズ" #. 124 msgid "Canada" msgstr "カナダ" #. 166 msgid "Cocos (Keeling) Islands" msgstr "ココス (キーリング) 諸島" #. 180 msgid "Congo, Democratic Republic of the" msgstr "コンゴ民主共和国" #. 140 msgid "Central African Republic" msgstr "中央アフリカ共和国" #. 178 msgid "Congo" msgstr "コンゴ" #. 756 msgid "Switzerland" msgstr "スイス" #. 384 msgid "Cote d'Ivoire" msgstr "コートジボアール" #. 184 msgid "Cook Islands" msgstr "クック諸島" #. 152 msgid "Chile" msgstr "チリ" #. 120 msgid "Cameroon" msgstr "カメルーン" #. 156 msgid "China" msgstr "中国" #. 170 msgid "Colombia" msgstr "コロンビア" #. 188 msgid "Costa Rica" msgstr "コスタリカ" #. 192 msgid "Cuba" msgstr "キューバ" #. 132 msgid "Cape Verde" msgstr "カーボベルデ" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "クリスマス島" #. 196 msgid "Cyprus" msgstr "キプロス" #. 203 msgid "Czech Republic" msgstr "チェコ共和国" #. 276 msgid "Germany" msgstr "ドイツ" #. 262 msgid "Djibouti" msgstr "ジブチ" #. 208 msgid "Denmark" msgstr "デンマーク" #. 212 msgid "Dominica" msgstr "ドミニカ" #. 214 msgid "Dominican Republic" msgstr "ドミニカ共和国" #. 012 msgid "Algeria" msgstr "アルジェリア" #. 218 msgid "Ecuador" msgstr "エクアドル" #. 233 msgid "Estonia" msgstr "エストニア" #. 818 msgid "Egypt" msgstr "エジプト" #. 732 msgid "Western Sahara" msgstr "西サハラ" #. 232 msgid "Eritrea" msgstr "エリトリア" #. 724 msgid "Spain" msgstr "スペイン" #. 231 msgid "Ethiopia" msgstr "エチオピア" #. 246 msgid "Finland" msgstr "フィンランド" #. 242 msgid "Fiji" msgstr "フィジー" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "フォークランド諸島 (マルビナス)" #. 583 msgid "Micronesia, Federated States of" msgstr "ミクロネシア連邦邦国" #. 234 msgid "Faroe Islands" msgstr "フェロー諸島" #. 250 msgid "France" msgstr "フランス" #. 266 msgid "Gabon" msgstr "ガボン" #. 826 msgid "United Kingdom" msgstr "イギリス" #. 308 msgid "Grenada" msgstr "グレナダ" #. 268 msgid "Georgia" msgstr "グルジア" #. 254 msgid "French Guiana" msgstr "フランス領ギアナ" #. 831 msgid "Guernsey" msgstr "ガーンジー島" #. 288 msgid "Ghana" msgstr "ガーナ" #. 292 msgid "Gibraltar" msgstr "ジブラルタル" #. 304 msgid "Greenland" msgstr "グリーンランド" #. 270 msgid "Gambia" msgstr "ガンビア" #. 324 msgid "Guinea" msgstr "ギニア" #. 312 msgid "Guadeloupe" msgstr "グアドループ島" #. 226 msgid "Equatorial Guinea" msgstr "赤道ギニア" #. 300 msgid "Greece" msgstr "ギリシャ" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "南ジョージア島・南サンドイッチ諸島" #. 320 msgid "Guatemala" msgstr "グアテマラ" #. 316 msgid "Guam" msgstr "グアム" #. 624 msgid "Guinea-Bissau" msgstr "ギニアビサウ" #. 328 msgid "Guyana" msgstr "ガイアナ" #. 344 msgid "Hong Kong" msgstr "香港" #. 334 msgid "Heard Island and McDonald Islands" msgstr "ハード島とマクドナルド諸島" #. 340 msgid "Honduras" msgstr "ホンジュラス" #. 191 msgid "Croatia" msgstr "クロアチア" #. 332 msgid "Haiti" msgstr "ハイチ" #. 348 msgid "Hungary" msgstr "ハンガリー" #. 360 msgid "Indonesia" msgstr "インドネシア" #. 372 msgid "Ireland" msgstr "アイルランド" #. 376 msgid "Israel" msgstr "イスラエル" #. 833 msgid "Isle of Man" msgstr "マン島" #. 356 msgid "India" msgstr "インド" #. 086 msgid "British Indian Ocean Territory" msgstr "イギリス領インド洋地域" #. 368 msgid "Iraq" msgstr "イラク" #. 364 msgid "Iran, Islamic Republic of" msgstr "イラン・イスラム共和国" #. 352 msgid "Iceland" msgstr "アイスランド" #. 380 msgid "Italy" msgstr "イタリア" #. 832 msgid "Jersey" msgstr "ジャージー島" #. 388 msgid "Jamaica" msgstr "ジャマイカ" #. 400 msgid "Jordan" msgstr "ヨルダン" #. 392 msgid "Japan" msgstr "日本" #. 404 msgid "Kenya" msgstr "ケニア" #. 417 msgid "Kyrgyzstan" msgstr "キルギス" #. 116 msgid "Cambodia" msgstr "カンボジア" #. 296 msgid "Kiribati" msgstr "キリバス共和国" #. 174 msgid "Comoros" msgstr "コモロ" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "朝鮮民主主義人民共和国" #. 410 msgid "Korea, Republic of" msgstr "大韓民国 (韓国)" #. 414 msgid "Kuwait" msgstr "クウェート" #. 136 msgid "Cayman Islands" msgstr "ケイマン諸島" #. 398 msgid "Kazakhstan" msgstr "カザフスタン" #. 418 msgid "Lao People's Democratic Republic" msgstr "ラオス人民民主共和国" #. 422 msgid "Lebanon" msgstr "レバノン" #. 662 msgid "Saint Lucia" msgstr "セントルシア" #. 438 msgid "Liechtenstein" msgstr "リヒテンシュタイン" #. 144 msgid "Sri Lanka" msgstr "スリランカ" #. 430 msgid "Liberia" msgstr "リベリア" #. 426 msgid "Lesotho" msgstr "レソト" #. 440 msgid "Lithuania" msgstr "リトアニア" #. 442 msgid "Luxembourg" msgstr "ルクセンブルク" #. 428 msgid "Latvia" msgstr "ラトビア" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "モロッコ" #. 492 msgid "Monaco" msgstr "モナコ" #. 498 msgid "Moldova, Republic of" msgstr "モルドバ共和国" #. 499 msgid "Montenegro" msgstr "モンテネグロ" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "マダガスカル" #. 584 msgid "Marshall Islands" msgstr "マーシャル諸島" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "マリ" #. 104 msgid "Myanmar" msgstr "ミャンマー" #. 496 msgid "Mongolia" msgstr "モンゴル" #. 446 msgid "Macao" msgstr "マカオ" #. 580 msgid "Northern Mariana Islands" msgstr "北マリアナ諸島連邦" #. 474 msgid "Martinique" msgstr "マルティニク" #. 478 msgid "Mauritania" msgstr "モーリタニア" #. 500 msgid "Montserrat" msgstr "モントセラト" #. 470 msgid "Malta" msgstr "マルタ" #. 480 msgid "Mauritius" msgstr "モーリシャス" #. 462 msgid "Maldives" msgstr "モルディブ" #. 454 msgid "Malawi" msgstr "マラウイ" #. 484 msgid "Mexico" msgstr "メキシコ" #. 458 msgid "Malaysia" msgstr "マレーシア" #. 508 msgid "Mozambique" msgstr "モザンビーク" #. 516 msgid "Namibia" msgstr "ナミビア" #. 540 msgid "New Caledonia" msgstr "ニューカレドニア" #. 562 msgid "Niger" msgstr "ニジェール" #. 574 msgid "Norfolk Island" msgstr "ノーフォーク島" #. 566 msgid "Nigeria" msgstr "ナイジェリア" #. 558 msgid "Nicaragua" msgstr "ニカラグア" #. 528 msgid "Netherlands" msgstr "オランダ" #. 578 msgid "Norway" msgstr "ノルウェー" #. 524 msgid "Nepal" msgstr "ネパール" #. 520 msgid "Nauru" msgstr "ナウル語" #. 570 msgid "Niue" msgstr "ニウエ" #. 554 msgid "New Zealand" msgstr "ニュージーランド" #. 512 msgid "Oman" msgstr "オマーン" #. 591 msgid "Panama" msgstr "パナマ" #. 604 msgid "Peru" msgstr "ペルー" #. 258 msgid "French Polynesia" msgstr "フランス領ポリネシア" #. 598 msgid "Papua New Guinea" msgstr "パプアニューギニア" #. 608 msgid "Philippines" msgstr "フィリピン" #. 586 msgid "Pakistan" msgstr "パキスタン" #. 616 msgid "Poland" msgstr "ポーランド" #. 666 msgid "Saint Pierre and Miquelon" msgstr "サンピエールエミクロン" #. 612 msgid "Pitcairn" msgstr "ピトケルン" #. 630 msgid "Puerto Rico" msgstr "プエルトリコ" #. 275 msgid "Palestinian Territory, Occupied" msgstr "パレスチナ占領地区" #. 620 msgid "Portugal" msgstr "ポルトガル" #. 585 msgid "Palau" msgstr "パラオ" #. 600 msgid "Paraguay" msgstr "パラグアイ" #. 634 msgid "Qatar" msgstr "カタール" #. 638 msgid "Reunion" msgstr "レユニオン" #. 642 msgid "Romania" msgstr "ルーマニア" #. 688 msgid "Serbia" msgstr "セルビア" #. 643 msgid "Russian Federation" msgstr "ロシア連邦" #. 646 msgid "Rwanda" msgstr "ルワンダ" #. 682 msgid "Saudi Arabia" msgstr "サウジアラビア" #. 090 msgid "Solomon Islands" msgstr "ソロモン諸島" #. 690 msgid "Seychelles" msgstr "セーシェル" #. 736 msgid "Sudan" msgstr "スーダン" #. 752 msgid "Sweden" msgstr "スウェーデン" #. 702 msgid "Singapore" msgstr "シンガポール" #. 654 msgid "Saint Helena" msgstr "セントヘレナ" #. 705 msgid "Slovenia" msgstr "スロベニア" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "スロバキア" #. 694 msgid "Sierra Leone" msgstr "シエラレオネ" #. 674 msgid "San Marino" msgstr "サンマリノ" #. 686 msgid "Senegal" msgstr "セネガル" #. 706 msgid "Somalia" msgstr "ソマリア" #. 740 msgid "Suriname" msgstr "スリナム" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "サントメ・プリンシペ" #. 222 msgid "El Salvador" msgstr "エルサルバドル" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "シリアアラブ共和国" #. 748 msgid "Swaziland" msgstr "スワジランド" #. 796 msgid "Turks and Caicos Islands" msgstr "タークス諸島・カイコス諸島" #. 148 msgid "Chad" msgstr "チャド" #. 260 msgid "French Southern Territories" msgstr "仏領極南諸島" #. 768 msgid "Togo" msgstr "トーゴ" #. 764 msgid "Thailand" msgstr "タイ" #. 762 msgid "Tajikistan" msgstr "タジキスタン" #. 772 msgid "Tokelau" msgstr "トケラウ" #. 626 msgid "Timor-Leste" msgstr "東ティモール" #. 795 msgid "Turkmenistan" msgstr "トルクメニスタン" #. 788 msgid "Tunisia" msgstr "チュニジア" #. 776 msgid "Tonga" msgstr "トンガ" #. 792 msgid "Turkey" msgstr "トルコ" #. 780 msgid "Trinidad and Tobago" msgstr "トリニダード・トバゴ" #. 798 msgid "Tuvalu" msgstr "ツバル" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "タニザニア連合共和国" #. 804 msgid "Ukraine" msgstr "ウクライナ" #. 800 msgid "Uganda" msgstr "ウガンダ" #. 581 msgid "United States Minor Outlying Islands" msgstr "合衆国領有小離島" #. 840 msgid "United States" msgstr "アメリカ合衆国" #. 858 msgid "Uruguay" msgstr "ウルグアイ" #. 860 msgid "Uzbekistan" msgstr "ウズベキスタン" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "ベネズエラ" #. 092 msgid "Virgin Islands, British" msgstr "イギリス領ヴァージン諸島" #. 850 msgid "Virgin Islands, U.S." msgstr "アメリカ領ヴァージン諸島" #. 704 msgid "Viet Nam" msgstr "ベトナム" #. 548 msgid "Vanuatu" msgstr "バヌアツ" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "サモア" #. 887 msgid "Yemen" msgstr "イエメン" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "南アフリカ" #. 894 msgid "Zambia" msgstr "ザンビア" #. 716 msgid "Zimbabwe" msgstr "ジンバブエ" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "国" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "目的地を入力" msgid "Zip Code" msgstr "郵便番号" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "地図" msgid "Bookmark" msgstr "ブックマーク" msgid "Destination" msgstr "目的地" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "ルート" msgid "_Former Destinations" msgstr "前の目的地" msgid "_Bookmarks" msgstr "ブックマーク" msgid "_Map" msgstr "地図" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "ズームアウト" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ズームイン" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "再計算" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "案内中止" msgid "Test" msgstr "テスト" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "全画面表示" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "北" msgid "NE" msgstr "北東" msgid "E" msgstr "東" msgid "SE" msgstr "南東" msgid "S" msgstr "南" msgid "SW" msgstr "南西" msgid "W" msgstr "西" msgid "NW" msgstr "北西" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "ブックマーク" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "前の目的地" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "ルート" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "全画面表示" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/jv.po.in000066400000000000000000001127221264204753600157330ustar00rootroot00000000000000# Javanese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Leonardus Priyo Handono https://launchpad.net/~leonardus-ymail # Michael von Glasow https://launchpad.net/~michael-vonglasow msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Javanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 0;\n" "Language: jv\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "now" msgstr "saiki" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "metu kapisan" msgid "second exit" msgstr "metu kapindho" msgid "third exit" msgstr "metu katelu" msgid "fourth exit" msgstr "metu kapapat" msgid "fifth exit" msgstr "metu kalimo" msgid "sixth exit" msgstr "metu kaenem" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "ing %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s ing dalan %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sing dalan %s" msgid "When possible, please turn around" msgstr "Yen biso, mutero" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Tetep ing dalan iki nganti %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Metu soko puteran ing cawang kaping %1$s %2$s" msgid "soon" msgstr "sedhelo maneh" msgid "then" msgstr "terus" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "nengen" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "ngiwa" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "kanthi gampang " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Jupuk dalan kaping %1$s ing %2$s" #, c-format msgid "after %i roads" msgstr "sakwise %i dalan" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "terus panjenengan tekan tujuan" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Metu" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "dunung" msgid "Command" msgstr "perintah" msgid "Length" msgstr "Amba" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Wektu" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "Wektu tekan tujuan" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "Dadekno tujuan" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "Titik 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinat layar : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua lan Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Londo" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antartika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Amerika" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Pulo Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia lan Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Santo Bartolomeus" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahama" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarusia" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "Republik Afrika Tengah" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Swiss" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Cina" #. 170 msgid "Colombia" msgstr "Kolombia" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Pulau Natal" #. 196 msgid "Cyprus" msgstr "Siprus" #. 203 msgid "Czech Republic" msgstr "Republik Czech" #. 276 msgid "Germany" msgstr "Jerman" #. 262 msgid "Djibouti" msgstr "Jibouti" #. 208 msgid "Denmark" msgstr "Denmark" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Republik Dominika" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Mesir" #. 732 msgid "Western Sahara" msgstr "Sahara Kulon" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanyol" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "Perancis" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroasia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungaria" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irlandia" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Republik Islam Iran" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Yordania" #. 392 msgid "Japan" msgstr "Jepang" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "terus metu soko puteran ing cawang kaping %1$s %2$s" navit-0.5.0+dfsg.1/po/kk.po.in000066400000000000000000001077251264204753600157300ustar00rootroot00000000000000# Kazakh translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2010-02-24 19:32+0000\n" "Last-Translator: \n" "Language-Team: Kazakh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: kk\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/kn.po.in000066400000000000000000001077741264204753600157370ustar00rootroot00000000000000# Kannada translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Mahesh Venom https://launchpad.net/~mahesh-venom-73 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2014-06-21 16:42+0000\n" "Last-Translator: Mahesh Venom \n" "Language-Team: Kannada \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: kn\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "ಮೊದಲ" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "Aarane" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/ko.po.in000066400000000000000000001177611264204753600157350ustar00rootroot00000000000000# Korean translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Seungjun, Lee https://launchpad.net/~cybercorean msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 21:39+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: ko\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "첫번째" msgid "second" msgstr "두번째" msgid "third" msgstr "세번째" msgid "fourth" msgstr "네번째" msgid "fifth" msgstr "다섯번째" msgid "sixth" msgstr "여섯번재" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "첫번째 출구" msgid "second exit" msgstr "두번째 출구" msgid "third exit" msgstr "세번째 출구" msgid "fourth exit" msgstr "네번째 출구" msgid "fifth exit" msgstr "다섯번째 출구" msgid "sixth exit" msgstr "여섯번째 출구" #, c-format msgid "%d feet" msgstr "%d 피트" #, c-format msgid "in %d feet" msgstr "%d 피트 후에" #, c-format msgid "%d.%d miles" msgstr "%d.%d 마일" #, c-format msgid "in %d.%d miles" msgstr "%d.%d 마일 후에" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d 마일" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "%d 마일 후에" #, c-format msgid "%d meters" msgstr "%d 미터" #, c-format msgid "in %d meters" msgstr "%d 미터 후에" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d 킬로미터" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d 킬로미터 후에" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d 킬로미터" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "%d 킬로미터 후에" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s %s 방향으로" msgid "When possible, please turn around" msgstr "가능하면 유턴하세요" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "다음 %s 까지 직진하세요" msgid "Enter the roundabout soon" msgstr "로타리에 곧 진입합니다" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "%s 로타리에 진입합니다" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "곧" msgid "now" msgstr "지금" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "우" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "좌" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "약간 " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "크게 " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "%1$s 번째 출구에서 %2$s 로 나가세요" #, c-format msgid "after %i roads" msgstr "%i 도로 이후에" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s%4$s %1$s%2$s 회전 하세요" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "목적지에 도착하였습니다." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "%s 목적지에 도착합니다" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "명령" msgid "Length" msgstr "" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "지점으로설정" msgid "Set as destination" msgstr "목적지로설정" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "안도라" #. 784 msgid "United Arab Emirates" msgstr "아랍에미리트연방" #. 004 msgid "Afghanistan" msgstr "아프가니스탄" #. 028 msgid "Antigua and Barbuda" msgstr "앤티가 바부다" #. 660 msgid "Anguilla" msgstr "안길라" #. 008 msgid "Albania" msgstr "알바니아" #. 051 msgid "Armenia" msgstr "아르메니아" #. 530 msgid "Netherlands Antilles" msgstr "앤틸러스제도" #. 024 msgid "Angola" msgstr "앙골라" #. 010 msgid "Antarctica" msgstr "남극" #. 032 msgid "Argentina" msgstr "아르헨티나" #. 016 msgid "American Samoa" msgstr "아메리칸사모아" #. 040 msgid "Austria" msgstr "오스트리아" #. 036 msgid "Australia" msgstr "오스트레일리아" #. 533 msgid "Aruba" msgstr "아루바" #. 248 msgid "Aland Islands" msgstr "올란드제도" #. 031 msgid "Azerbaijan" msgstr "아제르바이잔" #. 070 msgid "Bosnia and Herzegovina" msgstr "보스니아・헤르체고비나" #. 052 msgid "Barbados" msgstr "바베이도스" #. 050 msgid "Bangladesh" msgstr "방글라데시" #. 056 msgid "Belgium" msgstr "벨기에" #. 854 msgid "Burkina Faso" msgstr "부르키나파소" #. 100 msgid "Bulgaria" msgstr "불가리아" #. 048 msgid "Bahrain" msgstr "바레인" #. 108 msgid "Burundi" msgstr "부룬디" #. 204 msgid "Benin" msgstr "베닌" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "버뮤다제도" #. 096 msgid "Brunei Darussalam" msgstr "브루나이" #. 068 msgid "Bolivia" msgstr "볼리비아" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "브라질" #. 044 msgid "Bahamas" msgstr "바하마" #. 064 msgid "Bhutan" msgstr "부탄" #. 074 msgid "Bouvet Island" msgstr "부베섬島" #. 072 msgid "Botswana" msgstr "보츠와나" #. 112 msgid "Belarus" msgstr "벨라루스" #. 084 msgid "Belize" msgstr "벨리즈" #. 124 msgid "Canada" msgstr "캐나다" #. 166 msgid "Cocos (Keeling) Islands" msgstr "코코아 (킬링) 제도" #. 180 msgid "Congo, Democratic Republic of the" msgstr "콩고민주공화국" #. 140 msgid "Central African Republic" msgstr "중앙아프리카공화국" #. 178 msgid "Congo" msgstr "콩고" #. 756 msgid "Switzerland" msgstr "스위스" #. 384 msgid "Cote d'Ivoire" msgstr "코트디부아르" #. 184 msgid "Cook Islands" msgstr "쿡제도" #. 152 msgid "Chile" msgstr "칠레" #. 120 msgid "Cameroon" msgstr "카메룬" #. 156 msgid "China" msgstr "중국" #. 170 msgid "Colombia" msgstr "콜롬비아" #. 188 msgid "Costa Rica" msgstr "코스타리카" #. 192 msgid "Cuba" msgstr "쿠바" #. 132 msgid "Cape Verde" msgstr "카보베르데" #. 531 msgid "Curacao" msgstr "퀴라소" #. 162 msgid "Christmas Island" msgstr "크리스마스섬" #. 196 msgid "Cyprus" msgstr "키프로스" #. 203 msgid "Czech Republic" msgstr "체코공화국" #. 276 msgid "Germany" msgstr "독일" #. 262 msgid "Djibouti" msgstr "지부티" #. 208 msgid "Denmark" msgstr "덴마크" #. 212 msgid "Dominica" msgstr "도미니카" #. 214 msgid "Dominican Republic" msgstr "도미니카공화국" #. 012 msgid "Algeria" msgstr "알제리" #. 218 msgid "Ecuador" msgstr "에콰도르" #. 233 msgid "Estonia" msgstr "에스토니아" #. 818 msgid "Egypt" msgstr "이집트" #. 732 msgid "Western Sahara" msgstr "서사하라" #. 232 msgid "Eritrea" msgstr "에리트레아" #. 724 msgid "Spain" msgstr "스페인" #. 231 msgid "Ethiopia" msgstr "에티오피아" #. 246 msgid "Finland" msgstr "핀란드" #. 242 msgid "Fiji" msgstr "피지" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "포클랜드제도 (말비나스)" #. 583 msgid "Micronesia, Federated States of" msgstr "미크로네시아연방국" #. 234 msgid "Faroe Islands" msgstr "파로제도" #. 250 msgid "France" msgstr "프랑스" #. 266 msgid "Gabon" msgstr "가봉" #. 826 msgid "United Kingdom" msgstr "영국" #. 308 msgid "Grenada" msgstr "그레나다" #. 268 msgid "Georgia" msgstr "조지아" #. 254 msgid "French Guiana" msgstr "프랑스령기아나" #. 831 msgid "Guernsey" msgstr "건지섬" #. 288 msgid "Ghana" msgstr "가나" #. 292 msgid "Gibraltar" msgstr "지브롤터" #. 304 msgid "Greenland" msgstr "그린란드" #. 270 msgid "Gambia" msgstr "감비아" #. 324 msgid "Guinea" msgstr "기니" #. 312 msgid "Guadeloupe" msgstr "과달루페섬" #. 226 msgid "Equatorial Guinea" msgstr "적도기니" #. 300 msgid "Greece" msgstr "그리스" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "남조지아섬・남샌드위치제도" #. 320 msgid "Guatemala" msgstr "과테말라" #. 316 msgid "Guam" msgstr "괌" #. 624 msgid "Guinea-Bissau" msgstr "기니비소" #. 328 msgid "Guyana" msgstr "가이아나" #. 344 msgid "Hong Kong" msgstr "홍콩" #. 334 msgid "Heard Island and McDonald Islands" msgstr "허드맥도날드제도" #. 340 msgid "Honduras" msgstr "온두라스" #. 191 msgid "Croatia" msgstr "크로아티아" #. 332 msgid "Haiti" msgstr "아이티" #. 348 msgid "Hungary" msgstr "헝가리" #. 360 msgid "Indonesia" msgstr "인도네시아" #. 372 msgid "Ireland" msgstr "아일랜드" #. 376 msgid "Israel" msgstr "이스라엘" #. 833 msgid "Isle of Man" msgstr "맨섬" #. 356 msgid "India" msgstr "인도" #. 086 msgid "British Indian Ocean Territory" msgstr "영국령인도양지역" #. 368 msgid "Iraq" msgstr "이라크" #. 364 msgid "Iran, Islamic Republic of" msgstr "이란공화국" #. 352 msgid "Iceland" msgstr "아이슬란드" #. 380 msgid "Italy" msgstr "이탈리아" #. 832 msgid "Jersey" msgstr "저지섬" #. 388 msgid "Jamaica" msgstr "자메이카" #. 400 msgid "Jordan" msgstr "요르단" #. 392 msgid "Japan" msgstr "일본" #. 404 msgid "Kenya" msgstr "케냐" #. 417 msgid "Kyrgyzstan" msgstr "키르기스탄" #. 116 msgid "Cambodia" msgstr "캄보디아" #. 296 msgid "Kiribati" msgstr "키리바시" #. 174 msgid "Comoros" msgstr "코모로" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "조선민주주의인민공화국" #. 410 msgid "Korea, Republic of" msgstr "대한민국" #. 414 msgid "Kuwait" msgstr "쿠웨이트" #. 136 msgid "Cayman Islands" msgstr "카이만제도" #. 398 msgid "Kazakhstan" msgstr "카자흐스탄" #. 418 msgid "Lao People's Democratic Republic" msgstr "라오스인민민주공화국" #. 422 msgid "Lebanon" msgstr "레바논" #. 662 msgid "Saint Lucia" msgstr "세인트루시아" #. 438 msgid "Liechtenstein" msgstr "리히텐슈타인" #. 144 msgid "Sri Lanka" msgstr "스리랑카" #. 430 msgid "Liberia" msgstr "라이베리아" #. 426 msgid "Lesotho" msgstr "레소토" #. 440 msgid "Lithuania" msgstr "리투아니아" #. 442 msgid "Luxembourg" msgstr "룩셈부르크" #. 428 msgid "Latvia" msgstr "라트비아" #. 434 msgid "Libya" msgstr "리비아" #. 504 msgid "Morocco" msgstr "모로코" #. 492 msgid "Monaco" msgstr "모나코" #. 498 msgid "Moldova, Republic of" msgstr "몰도바공화국" #. 499 msgid "Montenegro" msgstr "몬테네그로" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "마다가스카르" #. 584 msgid "Marshall Islands" msgstr "마셜제도" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "마케도니아" #. 466 msgid "Mali" msgstr "말리" #. 104 msgid "Myanmar" msgstr "미얀마" #. 496 msgid "Mongolia" msgstr "몽골" #. 446 msgid "Macao" msgstr "마카오" #. 580 msgid "Northern Mariana Islands" msgstr "북마리아나제도" #. 474 msgid "Martinique" msgstr "마르티니크" #. 478 msgid "Mauritania" msgstr "모리타니아" #. 500 msgid "Montserrat" msgstr "몬세라트" #. 470 msgid "Malta" msgstr "말타" #. 480 msgid "Mauritius" msgstr "모리셔스" #. 462 msgid "Maldives" msgstr "몰디브" #. 454 msgid "Malawi" msgstr "말라위" #. 484 msgid "Mexico" msgstr "멕시코" #. 458 msgid "Malaysia" msgstr "말레이지아" #. 508 msgid "Mozambique" msgstr "모잠비크" #. 516 msgid "Namibia" msgstr "나미비다" #. 540 msgid "New Caledonia" msgstr "뉴칼레도니아" #. 562 msgid "Niger" msgstr "니제르" #. 574 msgid "Norfolk Island" msgstr "노포크섬" #. 566 msgid "Nigeria" msgstr "나이지리아" #. 558 msgid "Nicaragua" msgstr "니카라과" #. 528 msgid "Netherlands" msgstr "네덜란드" #. 578 msgid "Norway" msgstr "노르웨이" #. 524 msgid "Nepal" msgstr "네팔" #. 520 msgid "Nauru" msgstr "나우루" #. 570 msgid "Niue" msgstr "니우에" #. 554 msgid "New Zealand" msgstr "뉴질랜드" #. 512 msgid "Oman" msgstr "오만" #. 591 msgid "Panama" msgstr "파나마" #. 604 msgid "Peru" msgstr "페루" #. 258 msgid "French Polynesia" msgstr "프랑스령폴리네시아" #. 598 msgid "Papua New Guinea" msgstr "파푸아뉴기니" #. 608 msgid "Philippines" msgstr "필리핀" #. 586 msgid "Pakistan" msgstr "파키스탄" #. 616 msgid "Poland" msgstr "폴란드" #. 666 msgid "Saint Pierre and Miquelon" msgstr "생피에르미클롱" #. 612 msgid "Pitcairn" msgstr "핏케언제도" #. 630 msgid "Puerto Rico" msgstr "푸에르토리코" #. 275 msgid "Palestinian Territory, Occupied" msgstr "팔레스타인영토" #. 620 msgid "Portugal" msgstr "포르투갈" #. 585 msgid "Palau" msgstr "팔라우" #. 600 msgid "Paraguay" msgstr "파라과이" #. 634 msgid "Qatar" msgstr "카타르" #. 638 msgid "Reunion" msgstr "레위니옹" #. 642 msgid "Romania" msgstr "루마니아" #. 688 msgid "Serbia" msgstr "세르비아" #. 643 msgid "Russian Federation" msgstr "러시아연방" #. 646 msgid "Rwanda" msgstr "르완다" #. 682 msgid "Saudi Arabia" msgstr "사우디아라비아" #. 090 msgid "Solomon Islands" msgstr "솔로몬제도" #. 690 msgid "Seychelles" msgstr "세이셸" #. 736 msgid "Sudan" msgstr "수단" #. 752 msgid "Sweden" msgstr "스웨덴" #. 702 msgid "Singapore" msgstr "싱가포르" #. 654 msgid "Saint Helena" msgstr "세인트헬레나" #. 705 msgid "Slovenia" msgstr "슬로베니아" #. 744 msgid "Svalbard and Jan Mayen" msgstr "스발바르얀마옌" #. 703 msgid "Slovakia" msgstr "슬로바키아" #. 694 msgid "Sierra Leone" msgstr "시에라리온" #. 674 msgid "San Marino" msgstr "산마리노" #. 686 msgid "Senegal" msgstr "세네갈" #. 706 msgid "Somalia" msgstr "소말리아" #. 740 msgid "Suriname" msgstr "수리남" #. 728 msgid "South Sudan" msgstr "남수단" #. 678 msgid "Sao Tome and Principe" msgstr "상투메・프린시페" #. 222 msgid "El Salvador" msgstr "엘살바도르" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "신트마르턴 (네덜란드)" #. 760 msgid "Syrian Arab Republic" msgstr "시리아" #. 748 msgid "Swaziland" msgstr "스와질란드" #. 796 msgid "Turks and Caicos Islands" msgstr "터커스케이커스제도" #. 148 msgid "Chad" msgstr "차드" #. 260 msgid "French Southern Territories" msgstr "프랑스령남부와남극지역" #. 768 msgid "Togo" msgstr "토고" #. 764 msgid "Thailand" msgstr "태국" #. 762 msgid "Tajikistan" msgstr "타지키스탄" #. 772 msgid "Tokelau" msgstr "토켈라우" #. 626 msgid "Timor-Leste" msgstr "동티모르" #. 795 msgid "Turkmenistan" msgstr "투르크메니스탄" #. 788 msgid "Tunisia" msgstr "튀니지" #. 776 msgid "Tonga" msgstr "통가" #. 792 msgid "Turkey" msgstr "터키" #. 780 msgid "Trinidad and Tobago" msgstr "트리니다드・토바고" #. 798 msgid "Tuvalu" msgstr "투발루" #. 158 msgid "Taiwan, Province of China" msgstr "대만" #. 834 msgid "Tanzania, United Republic of" msgstr "탄자니아연합공화국" #. 804 msgid "Ukraine" msgstr "우크라이나" #. 800 msgid "Uganda" msgstr "우간다" #. 581 msgid "United States Minor Outlying Islands" msgstr "미국령군소제도" #. 840 msgid "United States" msgstr "미국" #. 858 msgid "Uruguay" msgstr "우루과이" #. 860 msgid "Uzbekistan" msgstr "우즈베키스탄" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "베네수엘라" #. 092 msgid "Virgin Islands, British" msgstr "영국령버진제도" #. 850 msgid "Virgin Islands, U.S." msgstr "미국령버진제도" #. 704 msgid "Viet Nam" msgstr "베트남" #. 548 msgid "Vanuatu" msgstr "바누아투" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "사모아" #. 887 msgid "Yemen" msgstr "예멘" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "남아프리카" #. 894 msgid "Zambia" msgstr "잠비아" #. 716 msgid "Zimbabwe" msgstr "짐바브웨" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "나라" msgid "Postal" msgstr "" msgid "Town" msgstr "마을" msgid "District" msgstr "지역" msgid "Street" msgstr "거리" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "목적지입력" msgid "Zip Code" msgstr "우편번호" msgid "City" msgstr "도시" msgid "District/Township" msgstr "" msgid "Map" msgstr "지도" msgid "Bookmark" msgstr "북마크" msgid "Destination" msgstr "목적지" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "경로" msgid "_Former Destinations" msgstr "이전목적지" msgid "_Bookmarks" msgstr "북마크" msgid "_Map" msgstr "지도" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "줌아웃" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "줌인" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "재계산" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "안내중지" msgid "Test" msgstr "테스트" msgid "_Quit" msgstr "종료" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "전체화면" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "북" msgid "NE" msgstr "복동" msgid "E" msgstr "동" msgid "SE" msgstr "남동" msgid "S" msgstr "남" msgid "SW" msgstr "남서" msgid "W" msgstr "서" msgid "NW" msgstr "북서" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "경유지 %s" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "북마크" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "이전목적지" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "경로" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "전체화면" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/ku.po.in000066400000000000000000001101041264204753600157230ustar00rootroot00000000000000# Kurdish translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # kosar https://launchpad.net/~kosar-belana msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2013-06-22 22:57+0000\n" "Last-Translator: kosar \n" "Language-Team: Kurdish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: ku\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "یەكەم" msgid "second" msgstr "دووەم" msgid "third" msgstr "سێیەم" msgid "fourth" msgstr "چوارەم" msgid "fifth" msgstr "پێنجەم" msgid "sixth" msgstr "شەشەم" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d كیلۆمەتر" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "ئێستا" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "ڕاست" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "چەپ" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/lb.po.in000066400000000000000000001111141264204753600157030ustar00rootroot00000000000000# Luxembourgish translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Kevin G https://launchpad.net/~kev912002 # MaXaM https://launchpad.net/~maxschaal msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: MaXaM \n" "Language-Team: Luxembourgish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: lb\n" msgid "Running from source directory\n" msgstr "Aus dem Quellverzeechnis starten\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setz '%s' op '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullt" msgid "first" msgstr "éischt" msgid "second" msgstr "Zweet" msgid "third" msgstr "drett" msgid "fourth" msgstr "véiert" msgid "fifth" msgstr "fëneft" msgid "sixth" msgstr "sechst" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullt Ausfahrt" msgid "first exit" msgstr "Éischt Ausfahrt" msgid "second exit" msgstr "Zweet Ausfahrt" msgid "third exit" msgstr "Drett Ausfahrt" msgid "fourth exit" msgstr "veiert Ausfahrt" msgid "fifth exit" msgstr "feneft Ausfahrt" msgid "sixth exit" msgstr "sechst Ausfahrt" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d Meter" #, c-format msgid "in %d meters" msgstr "An %d Meter" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d Kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "An %d,%d Kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "Een Kilometer" msgstr[1] "%d Kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "An engem Kilometer" msgstr[1] "An %d Kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$sop d' %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$sop d' Stross %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sop den %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sop d' %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sop d' %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "op d' Opfahrt" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sop d' Stross %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sop den %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sop d' %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sop d' %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sop d' %s" msgid "When possible, please turn around" msgstr "Wann meiglech, wannechglift dreinen" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "riets" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "lenks" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "liicht " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "schaarf " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Dreinen %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Dreinen %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Verdeeler" msgid "Exit" msgstr "Ausfaart" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/lt.po.in000066400000000000000000001306551264204753600157400ustar00rootroot00000000000000# Lithuanian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Aidas Kasparas https://launchpad.net/~a-kasparas # KaZeR https://launchpad.net/~kazer # Mantas Kriaučiūnas https://launchpad.net/~mantas # Michael von Glasow https://launchpad.net/~michael-vonglasow # Rytis Ūsalis https://launchpad.net/~rytis-usalis # laimonas https://launchpad.net/~laimonas-mockus msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Lithuanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "(n%100<10 || n%100>=20) ? 1 : 2;\n" "Language: lt\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Paleidžiama pradiniame aplanke\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nustatau iš '%s' į '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulinis" msgid "first" msgstr "pirmas" msgid "second" msgstr "antras" msgid "third" msgstr "trečias" msgid "fourth" msgstr "ketvirtas" msgid "fifth" msgstr "penktas" msgid "sixth" msgstr "šeštas" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulinis išvažiavimas" msgid "first exit" msgstr "pirmas išvažiavimas" msgid "second exit" msgstr "antras išvažiavimas" msgid "third exit" msgstr "trečias išvažiavimas" msgid "fourth exit" msgstr "ketvirtas išvažiavimas" msgid "fifth exit" msgstr "penktas išvažiavimas" msgid "sixth exit" msgstr "šeštas išvažiavimas" #, c-format msgid "%d feet" msgstr "%d pėdos" #, c-format msgid "in %d feet" msgstr "už %d pėdų" #, c-format msgid "%d.%d miles" msgstr "%d.%d mylios" #, c-format msgid "in %d.%d miles" msgstr "už %d.%d mylių" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d mylia" msgstr[1] "%d mylios" msgstr[2] "%d mylių" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "už %d mylios" msgstr[1] "už %d mylių" msgstr[2] "už %d mylių" #, c-format msgid "%d meters" msgstr "%d metrai" #, c-format msgid "in %d meters" msgstr "už %d metrų" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d km." #, c-format msgid "in %d.%d kilometers" msgstr "už %d.%d kilometrų" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometras" msgstr[1] "%d kilometrai" msgstr[2] "%d kilometrai" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "už %d kilometro" msgstr[1] "už %d kilometrų" msgstr[2] "už %d kilometrų" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$sį %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$sį %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$sį %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$sį %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$sį %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "į rampą" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sį %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sį %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sį %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sį %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sį %s" msgid "When possible, please turn around" msgstr "Kai įmanoma, apsisukite" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "link %s" #, c-format msgid "Follow the road for the next %s" msgstr "Laikykitės kelio sekančius %s" msgid "Enter the roundabout soon" msgstr "Netrukus įsukite į žiedą" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Įsukite į žiedą %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Išsukite iš žiedo %1$s išvažiavime %2$s" msgid "soon" msgstr "netrukus" msgid "now" msgstr "dabar" msgid "then" msgstr "tada" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "tada užvažiuokite už%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Užvažiuokite už%1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "tada užvažiuokite už%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Užvažiuokite už%1$s%2$s" msgid "on your left" msgstr "kairėje" msgid "on your right" msgstr "dešinėje" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Išvažiuokite per išvažiavimą %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Išvažiuokite per išvažiavimą %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "sankryžoje" msgid "at exit" msgstr "išvažiavime" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "tada laikykitės dešinės%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "Laikykitės dešinės %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "tada laikykitės kairės%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "Laikykitės kairės %1$s%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "dešinėn" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "kairėn" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "lengvai " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "stipriai " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Važiuokite %1$s keliu į %2$s" #, c-format msgid "after %i roads" msgstr "už %i kelių" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Pasukite %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "tada apsisukite" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Apsisukite %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "tada apsisukite" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Apsisukite %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "laikykitės kelio" msgid "then you have reached your destination." msgstr "tada jūs pasiekėte kelionės tikslą." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Jūs pasiekėte tikslą %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Sankryža" msgid "Exit" msgstr "Išvažiavimas" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozicija" msgid "Command" msgstr "Komanda" msgid "Length" msgstr "Ilgis" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Laikas" msgid "Destination Length" msgstr "Atvykimo ilgis" msgid "Destination Time" msgstr "Atvykimo laikas" msgid "Roadbook" msgstr "Kelionės knyga" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "Lankyti prieš..." msgid "Set as position" msgstr "Nustatyti poziciją" msgid "Set as destination" msgstr "Nustatyti tikslą" msgid "Add as bookmark" msgstr "Pridėti žymę" #, c-format msgid "Point 0x%x 0x%x" msgstr "Taškas 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekrano koordinatės : %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Jungtiniai Arabų Emyratai" #. 004 msgid "Afghanistan" msgstr "Afganistanas" #. 028 msgid "Antigua and Barbuda" msgstr "Antigva ir Barbuda" #. 660 msgid "Anguilla" msgstr "Angilija" #. 008 msgid "Albania" msgstr "Albanija" #. 051 msgid "Armenia" msgstr "Armėnija" #. 530 msgid "Netherlands Antilles" msgstr "Olandijos Antilai" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikos Samoa" #. 040 msgid "Austria" msgstr "Austrija" #. 036 msgid "Australia" msgstr "Australija" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Alandų salos" #. 031 msgid "Azerbaijan" msgstr "Azerbaidžanas" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnija ir Hercegovina" #. 052 msgid "Barbados" msgstr "Barbadosas" #. 050 msgid "Bangladesh" msgstr "Bangladešas" #. 056 msgid "Belgium" msgstr "Belgija" #. 854 msgid "Burkina Faso" msgstr "Burkina Fasas" #. 100 msgid "Bulgaria" msgstr "Bulgarija" #. 048 msgid "Bahrain" msgstr "Bahreinas" #. 108 msgid "Burundi" msgstr "Burundis" #. 204 msgid "Benin" msgstr "Beninas" #. 652 msgid "Saint Barthelemy" msgstr "Švento Baltramiejaus sala" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunėjaus Darusalamas" #. 068 msgid "Bolivia" msgstr "Bolivija" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilija" #. 044 msgid "Bahamas" msgstr "Bahamos" #. 064 msgid "Bhutan" msgstr "Butanas" #. 074 msgid "Bouvet Island" msgstr "Buvė sala" #. 072 msgid "Botswana" msgstr "Botsvana" #. 112 msgid "Belarus" msgstr "Gudija" #. 084 msgid "Belize" msgstr "Belizas" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosų (Keelingo) salos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo Demokratinė Respublika" #. 140 msgid "Central African Republic" msgstr "Centrinės Afrikos Respublika" #. 178 msgid "Congo" msgstr "Kongas" #. 756 msgid "Switzerland" msgstr "Šveicarija" #. 384 msgid "Cote d'Ivoire" msgstr "Dramblio Kaulo Krantas" #. 184 msgid "Cook Islands" msgstr "Kuko salos" #. 152 msgid "Chile" msgstr "Čilė" #. 120 msgid "Cameroon" msgstr "Kamerūnas" #. 156 msgid "China" msgstr "Kinija" #. 170 msgid "Colombia" msgstr "Kolumbija" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Žaliasis Kyšulys" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Kalėdų sala" #. 196 msgid "Cyprus" msgstr "Kipras" #. 203 msgid "Czech Republic" msgstr "Čekija" #. 276 msgid "Germany" msgstr "Vokietija" #. 262 msgid "Djibouti" msgstr "Džibutis" #. 208 msgid "Denmark" msgstr "Danija" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikos Respublika" #. 012 msgid "Algeria" msgstr "Alžyras" #. 218 msgid "Ecuador" msgstr "Ekvadoras" #. 233 msgid "Estonia" msgstr "Estija" #. 818 msgid "Egypt" msgstr "Egiptas" #. 732 msgid "Western Sahara" msgstr "Vakarų Sachara" #. 232 msgid "Eritrea" msgstr "Eritrėja" #. 724 msgid "Spain" msgstr "Ispanija" #. 231 msgid "Ethiopia" msgstr "Etiopija" #. 246 msgid "Finland" msgstr "Suomija" #. 242 msgid "Fiji" msgstr "Fidžis" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklando (Malvinų) salos" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezijos Federacinės Valstijos" #. 234 msgid "Faroe Islands" msgstr "Farerų salos" #. 250 msgid "France" msgstr "Prancūzija" #. 266 msgid "Gabon" msgstr "Gabonas" #. 826 msgid "United Kingdom" msgstr "Jungtinė Karalystė" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzija" #. 254 msgid "French Guiana" msgstr "Prancūzijos Gviana" #. 831 msgid "Guernsey" msgstr "Guernsis" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltaras" #. 304 msgid "Greenland" msgstr "Grenlandija" #. 270 msgid "Gambia" msgstr "Gambija" #. 324 msgid "Guinea" msgstr "Gvinėja" #. 312 msgid "Guadeloupe" msgstr "Gvadelupa" #. 226 msgid "Equatorial Guinea" msgstr "Pusiaujo Gvinėja" #. 300 msgid "Greece" msgstr "Graikija" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Pietų Georgijos ir Pietų Sandwicho salos" #. 320 msgid "Guatemala" msgstr "Gvatemala" #. 316 msgid "Guam" msgstr "Guamas" #. 624 msgid "Guinea-Bissau" msgstr "Bisau-Gvinėja" #. 328 msgid "Guyana" msgstr "Gajana" #. 344 msgid "Hong Kong" msgstr "Honk Kongas" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardo ir McDonaldo salos" #. 340 msgid "Honduras" msgstr "Hondūras" #. 191 msgid "Croatia" msgstr "Kroatija" #. 332 msgid "Haiti" msgstr "Haitis" #. 348 msgid "Hungary" msgstr "Vengrija" #. 360 msgid "Indonesia" msgstr "Indonezija" #. 372 msgid "Ireland" msgstr "Airija" #. 376 msgid "Israel" msgstr "Izraelis" #. 833 msgid "Isle of Man" msgstr "Meno sala" #. 356 msgid "India" msgstr "Indija" #. 086 msgid "British Indian Ocean Territory" msgstr "Indijos vandenyno britų sritis" #. 368 msgid "Iraq" msgstr "Irakas" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iranas" #. 352 msgid "Iceland" msgstr "Islandija" #. 380 msgid "Italy" msgstr "Italija" #. 832 msgid "Jersey" msgstr "Džersis" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanas" #. 392 msgid "Japan" msgstr "Japonija" #. 404 msgid "Kenya" msgstr "Kenija" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizija" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribatis" #. 174 msgid "Comoros" msgstr "Komorai" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sent Kitsas ir Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korėjos Demokratinė Respublika" #. 410 msgid "Korea, Republic of" msgstr "Korėjos Respublika" #. 414 msgid "Kuwait" msgstr "Kuveitas" #. 136 msgid "Cayman Islands" msgstr "Kaimanų salos" #. 398 msgid "Kazakhstan" msgstr "Kazachija" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laosas" #. 422 msgid "Lebanon" msgstr "Libanas" #. 662 msgid "Saint Lucia" msgstr "Šventoji Liucija" #. 438 msgid "Liechtenstein" msgstr "Lichtenšteinas" #. 144 msgid "Sri Lanka" msgstr "Šri Lanka" #. 430 msgid "Liberia" msgstr "Liberija" #. 426 msgid "Lesotho" msgstr "Lesotas" #. 440 msgid "Lithuania" msgstr "Lietuva" #. 442 msgid "Luxembourg" msgstr "Liuksemburgas" #. 428 msgid "Latvia" msgstr "Latvija" #. 434 msgid "Libya" msgstr "Libija" #. 504 msgid "Morocco" msgstr "Marokas" #. 492 msgid "Monaco" msgstr "Monakas" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Juodkalnija" #. 663 msgid "Saint Martin (French part)" msgstr "San Martenas (Prancūzijos dalis)" #. 450 msgid "Madagascar" msgstr "Madagaskaras" #. 584 msgid "Marshall Islands" msgstr "Maršalo salos" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonija" #. 466 msgid "Mali" msgstr "Malis" #. 104 msgid "Myanmar" msgstr "Mianmaras" #. 496 msgid "Mongolia" msgstr "Mongolija" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Šiaurės Marianų salos" #. 474 msgid "Martinique" msgstr "Martinika" #. 478 msgid "Mauritania" msgstr "Mauritanija" #. 500 msgid "Montserrat" msgstr "Montserratas" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricijus" #. 462 msgid "Maldives" msgstr "Maldyvai" #. 454 msgid "Malawi" msgstr "Malavis" #. 484 msgid "Mexico" msgstr "Meksika" #. 458 msgid "Malaysia" msgstr "Malaizija" #. 508 msgid "Mozambique" msgstr "Mozambikas" #. 516 msgid "Namibia" msgstr "Namibija" #. 540 msgid "New Caledonia" msgstr "Naujoji Kaledonija" #. 562 msgid "Niger" msgstr "Nigeris" #. 574 msgid "Norfolk Island" msgstr "Norfolko sala" #. 566 msgid "Nigeria" msgstr "Nigerija" #. 558 msgid "Nicaragua" msgstr "Nikaragva" #. 528 msgid "Netherlands" msgstr "Nyderlandai" #. 578 msgid "Norway" msgstr "Norvegija" #. 524 msgid "Nepal" msgstr "Nepalas" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niujė" #. 554 msgid "New Zealand" msgstr "Naujoji Zelandija" #. 512 msgid "Oman" msgstr "Omanas" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Prancūzijos Polinezija" #. 598 msgid "Papua New Guinea" msgstr "Papua Naujoji Gvinėja" #. 608 msgid "Philippines" msgstr "Filipinai" #. 586 msgid "Pakistan" msgstr "Pakistanas" #. 616 msgid "Poland" msgstr "Lenkija" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Sen Pjeras ir Mikelonas" #. 612 msgid "Pitcairn" msgstr "Pitkernas" #. 630 msgid "Puerto Rico" msgstr "Puerto Riko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Okupuota Palestinos teritorija" #. 620 msgid "Portugal" msgstr "Portugalija" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragvajus" #. 634 msgid "Qatar" msgstr "Kataras" #. 638 msgid "Reunion" msgstr "Reunionas" #. 642 msgid "Romania" msgstr "Rumunija" #. 688 msgid "Serbia" msgstr "Serbija" #. 643 msgid "Russian Federation" msgstr "Rusijos Federacija" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudo Arabija" #. 090 msgid "Solomon Islands" msgstr "Saliamono salos" #. 690 msgid "Seychelles" msgstr "Seišeliai" #. 736 msgid "Sudan" msgstr "Sudanas" #. 752 msgid "Sweden" msgstr "Švedija" #. 702 msgid "Singapore" msgstr "Singapūras" #. 654 msgid "Saint Helena" msgstr "Šventoji Elena" #. 705 msgid "Slovenia" msgstr "Slovėnija" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbardo ir Jan Majen salos" #. 703 msgid "Slovakia" msgstr "Slovakija" #. 694 msgid "Sierra Leone" msgstr "Siera Leonė" #. 674 msgid "San Marino" msgstr "San Marinas" #. 686 msgid "Senegal" msgstr "Senegalas" #. 706 msgid "Somalia" msgstr "Somalis" #. 740 msgid "Suriname" msgstr "Surinamas" #. 728 msgid "South Sudan" msgstr "Pietų Sudanas" #. 678 msgid "Sao Tome and Principe" msgstr "San Tomė ir Prinsipė" #. 222 msgid "El Salvador" msgstr "Salvadoras" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirijos Arabų Respublika" #. 748 msgid "Swaziland" msgstr "Svazilendas" #. 796 msgid "Turks and Caicos Islands" msgstr "Turkso ir Caicoso salos" #. 148 msgid "Chad" msgstr "Čadas" #. 260 msgid "French Southern Territories" msgstr "Prancūzijos Pietų sritys" #. 768 msgid "Togo" msgstr "Togas" #. 764 msgid "Thailand" msgstr "Tailandas" #. 762 msgid "Tajikistan" msgstr "Tadžikija" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Rytų Timoras" #. 795 msgid "Turkmenistan" msgstr "Turkmėnija" #. 788 msgid "Tunisia" msgstr "Tunisas" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkija" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidadas ir Tobagas" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taivanas, Kinijos provincija" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanija" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "JAV mažosios aplinkinės salos" #. 840 msgid "United States" msgstr "JAV" #. 858 msgid "Uruguay" msgstr "Urugvajus" #. 860 msgid "Uzbekistan" msgstr "Uzbekija" #. 336 msgid "Holy See (Vatican City State)" msgstr "Šventasis Sostas (Vatikano Miesto Valstybė)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sent Vinsentas ir Grenadinai" #. 862 msgid "Venezuela" msgstr "Venesuela" #. 092 msgid "Virgin Islands, British" msgstr "Mergelių salos, Jungtinė Karalystė" #. 850 msgid "Virgin Islands, U.S." msgstr "Mergelių salos, JAV" #. 704 msgid "Viet Nam" msgstr "Vietnamas" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallisas ir Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemenas" #. 175 msgid "Mayotte" msgstr "Majotas" #. 710 msgid "South Africa" msgstr "Pietų Afrika" #. 894 msgid "Zambia" msgstr "Zambija" #. 716 msgid "Zimbabwe" msgstr "Zimbabvė" msgid "* Unknown, add is_in tags to those cities" msgstr "* Nežinomas, pridėti is_in žodžius į šiuos miestus" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "Naudojamas konfigūracijos failas „%s”\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "nežinoma gatvė" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Bevardė transporto priemonė" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Vieta žemėlapyje" msgid "Car" msgstr "Automobilis" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Šalis:" msgid "Postal" msgstr "Pašto" msgid "Town" msgstr "Miestas" msgid "District" msgstr "Rajonas" msgid "Street" msgstr "Gatvė:" msgid "Number" msgstr "Numeris" msgid "Enter Destination" msgstr "Įveskite kelionės tikslą" msgid "Zip Code" msgstr "Pašto kodas" msgid "City" msgstr "Miestas" msgid "District/Township" msgstr "Rajonas/miestas" msgid "Map" msgstr "Žemėlapis" msgid "Bookmark" msgstr "Pažymėti" msgid "Destination" msgstr "Kelionės tikslas" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Rodyti" msgid "_Route" msgstr "Parinkti kelią" msgid "_Former Destinations" msgstr "Ankstesni tikslai" msgid "_Bookmarks" msgstr "Adresynas" msgid "_Map" msgstr "Žemėlapis" msgid "_Layout" msgstr "Išdėstymas" msgid "_Projection" msgstr "Projekcija" msgid "_Vehicle" msgstr "Transporto priemonė" msgid "Zoom_Out" msgstr "Sumažinti" msgid "Decrease zoom level" msgstr "Sumažinti mastelį" msgid "Zoom_In" msgstr "Padidinti" msgid "Increase zoom level" msgstr "Padidinti mastelį" msgid "_Recalculate" msgstr "Perskaičiuoti" msgid "Redraw map" msgstr "Perpiešti žemėlapį" msgid "_Info" msgstr "Informacija" msgid "Set _destination" msgstr "Nustatyti _tikslą" msgid "Opens address search dialog" msgstr "Atidaro adreso paieškos dialogą" msgid "_POI search" msgstr "Lankytinų vietų paieška" msgid "Opens POI search dialog" msgstr "Atidaro lankytinų vietų paieškos dialogą" msgid "_Stop Navigation" msgstr "Stabdyti navigaciją" msgid "Test" msgstr "Bandymas" msgid "_Quit" msgstr "_Išeiti" msgid "Quit the application" msgstr "Uždaryti programą" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Sekti kelią" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Perjungia žemėlapio orientaciją į šiaurę arba į judėjimo kryptį." msgid "_Roadbook" msgstr "Kelionės knyga" msgid "Show/hide route description" msgstr "Rodyti/slėpti maršruto aprašymą" msgid "_Autozoom" msgstr "Automatinis didinimas" msgid "Enable/disable automatic zoom level changing" msgstr "Įjungia/išjungia automatinį mastelio keitimą" msgid "_Fullscreen" msgstr "Visas ekranas" msgid "Data" msgstr "Duomenys" msgid "Pharmacy" msgstr "Vaistinė" msgid "Restaurant" msgstr "Restoranas" msgid "Restaurant. Fast food" msgstr "Valgykla. Greitas maistas" msgid "Hotel" msgstr "Viešbutis" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "Degalinė" msgid "Bank" msgstr "Bankas" msgid "Hospital" msgstr "Ligoninė" msgid "Cinema" msgstr "Kino teatras" msgid "Train station" msgstr "Geležinkelio stotis" msgid "School" msgstr "Mokykla" msgid "Police" msgstr "Policija" msgid "Justice" msgstr "Teismas" msgid "Taxi" msgstr "Taksi" msgid "Shopping" msgstr "Parduotuvė" msgid "Distance from screen center (km)" msgstr "Atstumas nuo ekrano vidaus (km)" #, c-format msgid "POI %s. %s" msgstr "Lankytina vieta %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Nustatyti tikslą į %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Nustatyti žemėlapį į %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "Lankytinų vietų paieška" msgid "Select a category" msgstr "Pasirinkite kategoriją" msgid "Select a distance to look for (km)" msgstr "Išrinkite atstumą, kuriame ieškoti (km)" msgid "Select a POI" msgstr "Išrinkite lankytiną vietą" msgid " " msgstr " " msgid "Category" msgstr "Kategorija" msgid "Direction" msgstr "Kryptis" msgid "Distance(m)" msgstr "Atstumas (m)" msgid "Name" msgstr "Vardas" msgid "Visit Before" msgstr "Aplankyi prieš" msgid "N" msgstr "Š" msgid "NE" msgstr "ŠR" msgid "E" msgstr "R" msgid "SE" msgstr "PR" msgid "S" msgstr "P" msgid "SW" msgstr "PV" msgid "W" msgstr "V" msgid "NW" msgstr "ŠV" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Liko kelio %4.0fkm %02d:%02d atvykimo laikas" msgid "Route 0000km 0+00:00 ETA" msgstr "Liko kelio 0000km 0+00:00 atvykimo laikas" msgid "Help" msgstr "Žinynas" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Peržiūrėti naršyklėje" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gatvės" msgid "House numbers" msgstr "Namų numeriai" msgid "View Attributes" msgstr "Rodyti savybes" msgid "Set as position (and deactivate vehicle)" msgstr "Nustatyti poziciją (išjungdamas transporto priemonę)" msgid "POIs" msgstr "Lankytinos vietos" msgid "View on map" msgstr "Rodyti žemėlapyje" msgid "Remove search results from the map" msgstr "Pašalinti paieškos rezultatas nuo žemėlapio" msgid "Show results on the map" msgstr "Rodyti rezultatus žemelapyje" msgid "Cut Bookmark" msgstr "Iškirpti žymą" msgid "Copy Bookmark" msgstr "Kopijuoti žymą" msgid "Rename Bookmark" msgstr "Pervadinti žymą" msgid "Paste Bookmark" msgstr "Įterpti žymą" msgid "Delete Bookmark" msgstr "Pašalinti žymą" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Adresynas" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "Pašalinti katalogą" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Pridėti žymų aplanką" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Įterpti žymą" #, c-format msgid "Bookmark %s" msgstr "Pasižymėti %s" #, c-format msgid "Download %s" msgstr "Atsisiųsti %s" msgid "Map Download" msgstr "" msgid "Active" msgstr "Aktyvus" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Parodyti palydovų būseną" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Rodyti NMEA duomenis" msgid "car" msgstr "automobilis" msgid "bike" msgstr "dviratis" msgid "pedestrian" msgstr "pėstysis" #, c-format msgid "Current profile: %s" msgstr "Dabartinis profilis: %s" #, c-format msgid "Change profile to: %s" msgstr "Keisti profilį į: %s" msgid "Set as active" msgstr "Aktyvuoti" msgid "Show Satellite status" msgstr "Parodyti palydovų būseną" msgid "Show NMEA data" msgstr "Parodyti NMEA duomenis" msgid "Add Bookmark" msgstr "Pridėti žymą" msgid "Rename" msgstr "Pervadinti" msgid "About Navit" msgstr "Apie Navit" #. Authors msgid "By" msgstr "Sukūrė" #. Contributors msgid "And all the Navit Team" msgstr "Ir visa Navit komanda" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "Įvėskite koordinates" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Platuma Ilguma" msgid "Enter coordinates, for example:" msgstr "Įvėskitė koordinates, pvz.:" msgid "Vehicle" msgstr "Transporto priemonė" msgid "Rules" msgstr "Taisyklės" msgid "Lock on road" msgstr "Sekti kelią" msgid "Northing" msgstr "Į šiaurę" msgid "Map follows Vehicle" msgstr "Sekti transporto priemonę" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Žemėlapiai" msgid "Layout" msgstr "Išdėstymas" msgid "Height Profile" msgstr "Aukščio profilis" msgid "Route Description" msgstr "Maršruto aprašymas" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Ankstesni tikslai" msgid "- No former destinations available -" msgstr "- Nėra ankstesnių tikslų -" msgid "Message" msgstr "Žinutė" msgid "Back" msgstr "Grįžti" msgid "Back to map" msgstr "Grįžti į žemėlapį" msgid "Main Menu" msgstr "Pagrindinis meniu" msgid "House number" msgstr "Namo numeris" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "Grįžti į maršrutą!" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "Prašom sumažinti greitį" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Paieška" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Miestai" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Maršrutas iki čia" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Atsisiųsti žemėlapiai" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "Bavarija" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "Notingemšyras" msgid "Oxfordshire" msgstr "Oksfordšyras" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "Škotija" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "Virdžinija" msgid "West Virginia" msgstr "Vakarų Virdžinija" msgid "West" msgstr "" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Kalifornija" msgid "Colorado" msgstr "Koloradas" msgid "Idaho" msgstr "" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Naujoji Meksika" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregonas" msgid "Utah" msgstr "Juta" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "siunčiama" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Nepakanka laisvos vietos" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Liko laiko" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Transporto priemonės vieta" msgid "Main menu" msgstr "Pagrindinis meniu" msgid "" "Show\n" "Map" msgstr "" "Rodyti\n" "žemėlapį" msgid "Settings" msgstr "Parinktys" msgid "Tools" msgstr "Įrankiai" msgid "Route" msgstr "Parinkti kelią" msgid "About" msgstr "Apie" msgid "Quit" msgstr "Išeiti" msgid "Actions" msgstr "Veiksmai" msgid "" "Former\n" "Destinations" msgstr "" "Ankstesni\n" "tikslai" msgid "Coordinates" msgstr "Koordinatės" msgid "" "Stop\n" "Navigation" msgstr "" "Stabdyti\n" "navigaciją" msgid "Display" msgstr "Rodyti" msgid "Fullscreen" msgstr "Visas ekranas" msgid "Window Mode" msgstr "Langų režimas" msgid "Description" msgstr "Aprašas" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "Palydovų būsena" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "Automobilis (trumpiausias maršrutas)" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "arklys" msgid "Truck" msgstr "Sunkvežimis" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Taip" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Veikia Navit" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Sveikiname paleidus Navit navigaciją" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "Gerai" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Daugiau informacijos" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Padidinti" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Sumažinti" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Atsisiųsti žemėlapius" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Rodyti/slėpti lankytinas vietas" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Išeiti iš Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Pašalinti šį žemėlapį?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Siunčiama:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Adresų paieška" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Įveskite tikslą" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Ieškoma..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adresas nerastas" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Įkeliami paieškos rezultatai" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Nieko nerasta" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Neįrašėte jokio teksto" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Pasirinkite veiksmą" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Įdėkite SD kortelę (laikmeną)" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Daroma atsarginė kopija..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Atkuriama..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Nerasta atsarginių kopijų" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Atsarginė kopija padaryta" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Atsarginė kopija neaptikta" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Pasirinkite atsarginę kopiją" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "tada išsukite iš žiedo %1$s išvažiavime %2$s" navit-0.5.0+dfsg.1/po/lv.po.in000066400000000000000000001333061264204753600157360ustar00rootroot00000000000000# Latvian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Janis https://launchpad.net/~janis-zl # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # Stendec https://launchpad.net/~stendec # sieks https://launchpad.net/~sieks msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Latvian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" "Language: lv\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Darbojas no saknes mapes\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "iestata '%s' uz '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nultais" msgid "first" msgstr "pirmais" msgid "second" msgstr "otrais" msgid "third" msgstr "trešais" msgid "fourth" msgstr "ceturtais" msgid "fifth" msgstr "piektais" msgid "sixth" msgstr "sestais" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nultā izeja" msgid "first exit" msgstr "pirmā izeja" msgid "second exit" msgstr "otrā izeja" msgid "third exit" msgstr "trešā izeja" msgid "fourth exit" msgstr "ceturtā izeja" msgid "fifth exit" msgstr "piektā izeja" msgid "sixth exit" msgstr "sestā izeja" #, c-format msgid "%d feet" msgstr "%d pēdas" #, c-format msgid "in %d feet" msgstr "pēc %d pēdām" #, c-format msgid "%d.%d miles" msgstr "%d.%d jūdzes" #, c-format msgid "in %d.%d miles" msgstr "pēc %d.%d jūdzēm" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d jūdze" msgstr[1] "%d jūdzes" msgstr[2] "%d jūdzes" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "pēc %d jūdzes" msgstr[1] "pēc %d jūdzēm" msgstr[2] "pēc %d jūdzēm" #, c-format msgid "%d meters" msgstr "%d metri" #, c-format msgid "in %d meters" msgstr "pēc %d metriem" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometri" #, c-format msgid "in %d.%d kilometers" msgstr "pēc %d.%d kilometr(a,iem" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometru" msgstr[1] "%d kilometrus" msgstr[2] "%d kilometri" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "pēc %d kilometra" msgstr[1] "pēc %d kilometriem" msgstr[2] "pēc %d kilometriem" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "uz uzbrauktuves" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%suz %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%suz %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%suz %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%suz %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "Uz %spagriezties pa %s" msgid "When possible, please turn around" msgstr "Kad iespējams apgriezieties" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Turpiniet pa šo ceļu %s" msgid "Enter the roundabout soon" msgstr "Drīzumā uzbraukt uz apļa" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Nobraukt no apļa pa %1$s %2$s" msgid "soon" msgstr "drīz" msgid "now" msgstr "tagad" msgid "then" msgstr "pēc tam" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "nobrauktuvē" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "pa labi" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "pa kreisi" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "nedaudz " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "strauji " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Pagriežaties %1$s ceļā pa %2$s" #, c-format msgid "after %i roads" msgstr "pēc %i ceļiem" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Pagriezties %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "pēc tam apgriezieties" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Apgriezieties %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "pēc tam apgriezieties" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Apgriezieties %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "turpiniet" msgid "then you have reached your destination." msgstr "tad Jūs sasniegsiet glamērķi" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Jūs esat sasniedzis galamērķi %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Nobrauktuve" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozīcija" msgid "Command" msgstr "Komanda" msgid "Length" msgstr "Garums" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Laiks" msgid "Destination Length" msgstr "Ceļš līdz galamērķim" msgid "Destination Time" msgstr "Ierašanās laiks" msgid "Roadbook" msgstr "Ceļa grāmata" #, c-format msgid "Waypoint %d" msgstr "Pieturvieta %d" msgid "Visit before..." msgstr "Doties caur..." msgid "Set as position" msgstr "Uzstādīt kā atrašanos" msgid "Set as destination" msgstr "Iestatīt kā galamēķi" msgid "Add as bookmark" msgstr "Pievienot grāmatzīmi" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkts 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekrāna koordinātas: %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Apvienotie Arābu Emirāti" #. 004 msgid "Afghanistan" msgstr "Afganistāna" #. 028 msgid "Antigua and Barbuda" msgstr "Antigva un Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Albānija" #. 051 msgid "Armenia" msgstr "Armēnija" #. 530 msgid "Netherlands Antilles" msgstr "Nīderlandes Antiļu salas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktīda" #. 032 msgid "Argentina" msgstr "Argentīna" #. 016 msgid "American Samoa" msgstr "Austrumsamoa" #. 040 msgid "Austria" msgstr "Austrija" #. 036 msgid "Australia" msgstr "Austrālija" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ālandu salas" #. 031 msgid "Azerbaijan" msgstr "Azerbaidžāna" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnija un Hercogovina" #. 052 msgid "Barbados" msgstr "Barbadosa" #. 050 msgid "Bangladesh" msgstr "Bangladeša" #. 056 msgid "Belgium" msgstr "Beļģija" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgārija" #. 048 msgid "Bahrain" msgstr "Bahreina" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benina" #. 652 msgid "Saint Barthelemy" msgstr "Svētā Bartalameja sala" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Bruneja Darusalama" #. 068 msgid "Bolivia" msgstr "Bolīvija" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazīlija" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butāna" #. 074 msgid "Bouvet Island" msgstr "Buvē Sala" #. 072 msgid "Botswana" msgstr "Botsvāna" #. 112 msgid "Belarus" msgstr "Baltkrievija" #. 084 msgid "Belize" msgstr "Beliza" #. 124 msgid "Canada" msgstr "Kanāda" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosu (Kīlinga) salas" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo Demokrātiskā Republika" #. 140 msgid "Central African Republic" msgstr "Centrālāfrikas Republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Šveice" #. 384 msgid "Cote d'Ivoire" msgstr "Kotdivuāra (Ziloņkaula krasts)" #. 184 msgid "Cook Islands" msgstr "Kuka salas" #. 152 msgid "Chile" msgstr "Čīle" #. 120 msgid "Cameroon" msgstr "Kamerūna" #. 156 msgid "China" msgstr "Ķīna" #. 170 msgid "Colombia" msgstr "Kolumbija" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kaboverde" #. 531 msgid "Curacao" msgstr "Kurakao" #. 162 msgid "Christmas Island" msgstr "Ziemsvētku Sala" #. 196 msgid "Cyprus" msgstr "Kipra" #. 203 msgid "Czech Republic" msgstr "Čehijas Republika" #. 276 msgid "Germany" msgstr "Vācija" #. 262 msgid "Djibouti" msgstr "Džibuti" #. 208 msgid "Denmark" msgstr "Dānija" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikānas Republika" #. 012 msgid "Algeria" msgstr "Alžīrija" #. 218 msgid "Ecuador" msgstr "Ekvadora" #. 233 msgid "Estonia" msgstr "Igaunija" #. 818 msgid "Egypt" msgstr "Ēģipte" #. 732 msgid "Western Sahara" msgstr "Rietumu Sahāra" #. 232 msgid "Eritrea" msgstr "Eritreja" #. 724 msgid "Spain" msgstr "Spānija" #. 231 msgid "Ethiopia" msgstr "Etiopija" #. 246 msgid "Finland" msgstr "Somija" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Folklenda (Malvinu) salas" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronēzijas Federatīvās Valstis" #. 234 msgid "Faroe Islands" msgstr "Fēru salas" #. 250 msgid "France" msgstr "Francija" #. 266 msgid "Gabon" msgstr "Gabona" #. 826 msgid "United Kingdom" msgstr "Lielbritānija" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzija" #. 254 msgid "French Guiana" msgstr "Franču Gviāna" #. 831 msgid "Guernsey" msgstr "Gērnsija" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltārs" #. 304 msgid "Greenland" msgstr "Grenlande" #. 270 msgid "Gambia" msgstr "Gambija" #. 324 msgid "Guinea" msgstr "Gvineja" #. 312 msgid "Guadeloupe" msgstr "Gvadelupa" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatoriālā Gvineja" #. 300 msgid "Greece" msgstr "Grieķija" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Dienviddžordžija un Dienvidsendviču salas" #. 320 msgid "Guatemala" msgstr "Gvatemala" #. 316 msgid "Guam" msgstr "Guama" #. 624 msgid "Guinea-Bissau" msgstr "Gvineja-Bisau" #. 328 msgid "Guyana" msgstr "Gajāna" #. 344 msgid "Hong Kong" msgstr "Honkonga" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Hērda un Makdonalda salas" #. 340 msgid "Honduras" msgstr "Hondurasa" #. 191 msgid "Croatia" msgstr "Horvātija" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungārija" #. 360 msgid "Indonesia" msgstr "Indonēzija" #. 372 msgid "Ireland" msgstr "Īrija" #. 376 msgid "Israel" msgstr "Izraēla" #. 833 msgid "Isle of Man" msgstr "Menas sala" #. 356 msgid "India" msgstr "Indija" #. 086 msgid "British Indian Ocean Territory" msgstr "Indijas Okeāna Britu Teritorija" #. 368 msgid "Iraq" msgstr "Irāka" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irāna" #. 352 msgid "Iceland" msgstr "Īslande" #. 380 msgid "Italy" msgstr "Itālija" #. 832 msgid "Jersey" msgstr "Džersija" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordāna" #. 392 msgid "Japan" msgstr "Japāna" #. 404 msgid "Kenya" msgstr "Kenija" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizstāna" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoras" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sentkitsa un Nevisa" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Ziemeļkoreja" #. 410 msgid "Korea, Republic of" msgstr "Dienvidkoreja" #. 414 msgid "Kuwait" msgstr "Kuveita" #. 136 msgid "Cayman Islands" msgstr "Kaimanu Salas" #. 398 msgid "Kazakhstan" msgstr "Kazahstāna" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laosa" #. 422 msgid "Lebanon" msgstr "Libāna" #. 662 msgid "Saint Lucia" msgstr "Sentlūsija" #. 438 msgid "Liechtenstein" msgstr "Lihtenšteina" #. 144 msgid "Sri Lanka" msgstr "Šrilanka" #. 430 msgid "Liberia" msgstr "Libērija" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lietuva" #. 442 msgid "Luxembourg" msgstr "Luksemburga" #. 428 msgid "Latvia" msgstr "Latvija" #. 434 msgid "Libya" msgstr "Lībija" #. 504 msgid "Morocco" msgstr "Maroka" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Melnkalne" #. 663 msgid "Saint Martin (French part)" msgstr "Senmartēna" #. 450 msgid "Madagascar" msgstr "Madagaskara" #. 584 msgid "Marshall Islands" msgstr "Māršala salas" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Maķedonija" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mjanma" #. 496 msgid "Mongolia" msgstr "Mongolija" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Ziemeļu Marianas salas" #. 474 msgid "Martinique" msgstr "Martinika" #. 478 msgid "Mauritania" msgstr "Mauritānija" #. 500 msgid "Montserrat" msgstr "Montserata" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Maurīcija" #. 462 msgid "Maldives" msgstr "Maldīvu salas" #. 454 msgid "Malawi" msgstr "Malāvija" #. 484 msgid "Mexico" msgstr "Meksika" #. 458 msgid "Malaysia" msgstr "Malaizija" #. 508 msgid "Mozambique" msgstr "Mozambika" #. 516 msgid "Namibia" msgstr "Namībija" #. 540 msgid "New Caledonia" msgstr "Jaunkaledonija" #. 562 msgid "Niger" msgstr "Nigēra" #. 574 msgid "Norfolk Island" msgstr "Norfolkas sala" #. 566 msgid "Nigeria" msgstr "Nigērija" #. 558 msgid "Nicaragua" msgstr "Nikaragva" #. 528 msgid "Netherlands" msgstr "Nīderlande" #. 578 msgid "Norway" msgstr "Norvēģija" #. 524 msgid "Nepal" msgstr "Nepāla" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Jaunzēlande" #. 512 msgid "Oman" msgstr "Omāna" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Franču Polinēzija" #. 598 msgid "Papua New Guinea" msgstr "Papua Jaungvineja" #. 608 msgid "Philippines" msgstr "Filipīnas" #. 586 msgid "Pakistan" msgstr "Pakistāna" #. 616 msgid "Poland" msgstr "Polija" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Senpjēra un Mikelona" #. 612 msgid "Pitcairn" msgstr "Pitkērna" #. 630 msgid "Puerto Rico" msgstr "Porto Riko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestīna" #. 620 msgid "Portugal" msgstr "Portugāle" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragvaja" #. 634 msgid "Qatar" msgstr "Katara" #. 638 msgid "Reunion" msgstr "Reinjona" #. 642 msgid "Romania" msgstr "Rumānija" #. 688 msgid "Serbia" msgstr "Serbija" #. 643 msgid "Russian Federation" msgstr "Krievija" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saūda Arābija" #. 090 msgid "Solomon Islands" msgstr "Zālamana salas" #. 690 msgid "Seychelles" msgstr "Seišelas" #. 736 msgid "Sudan" msgstr "Sudāna" #. 752 msgid "Sweden" msgstr "Zviedrija" #. 702 msgid "Singapore" msgstr "Singapūra" #. 654 msgid "Saint Helena" msgstr "Svētās Helēnas Sala" #. 705 msgid "Slovenia" msgstr "Slovēnija" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbāra un Jana Majena sala" #. 703 msgid "Slovakia" msgstr "Slovākija" #. 694 msgid "Sierra Leone" msgstr "Sjerraleone" #. 674 msgid "San Marino" msgstr "Sanmarīno" #. 686 msgid "Senegal" msgstr "Senegāla" #. 706 msgid "Somalia" msgstr "Somālija" #. 740 msgid "Suriname" msgstr "Surinama" #. 728 msgid "South Sudan" msgstr "Dienvidsudāna" #. 678 msgid "Sao Tome and Principe" msgstr "Santome un Prinsipi" #. 222 msgid "El Salvador" msgstr "Salvadora" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sintmartēna" #. 760 msgid "Syrian Arab Republic" msgstr "Sīrija" #. 748 msgid "Swaziland" msgstr "Svazilenda" #. 796 msgid "Turks and Caicos Islands" msgstr "Tērksas un Kaikosas" #. 148 msgid "Chad" msgstr "Čada" #. 260 msgid "French Southern Territories" msgstr "Francijas Dienvidjūru Zemes" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Taizeme" #. 762 msgid "Tajikistan" msgstr "Tadžikistāna" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Austrumtimora" #. 795 msgid "Turkmenistan" msgstr "Turkmenistāna" #. 788 msgid "Tunisia" msgstr "Tunisija" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turcija" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidada un Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taivāna" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzānija" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "ASV Mazās Aizjūras Salas" #. 840 msgid "United States" msgstr "Savienotās Valstis" #. 858 msgid "Uruguay" msgstr "Urugvaja" #. 860 msgid "Uzbekistan" msgstr "Uzbekistāna" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikāns" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sentvinsenta un Grenadīnas" #. 862 msgid "Venezuela" msgstr "Venecuēla" #. 092 msgid "Virgin Islands, British" msgstr "Virdžīnas Salas, Britu" #. 850 msgid "Virgin Islands, U.S." msgstr "Virdžīnu salas, ASV" #. 704 msgid "Viet Nam" msgstr "Vjetnama" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Volisa un Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemena" #. 175 msgid "Mayotte" msgstr "Majota" #. 710 msgid "South Africa" msgstr "Dienvidāfrika" #. 894 msgid "Zambia" msgstr "Zambija" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "* Nezināms, pievienot is_in tagus šīm pilsētām" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Nav atrasti konfigurācijas faili - navit.xml, navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Kļūdu analīzes iestatijumu fails '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Izmanto '%s' iestatījumu failu\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Iekšējā inicializācija neizdevās, beidzē. Skatiet iepriekšējos kļūdu " "ziņojumus.\n" msgid "unknown street" msgstr "nezināma iela" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Nosnosaukts transporta līdzeklis" msgid "Failed to write bookmarks file" msgstr "Neizdevās atjaunināt grāmatzīmju failu" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punkts uz Kartes" msgid "Car" msgstr "Automašīna" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "Valsts" msgid "Postal" msgstr "Pasta" msgid "Town" msgstr "Pilsēta" msgid "District" msgstr "Rajons" msgid "Street" msgstr "Iela" msgid "Number" msgstr "Numurs" msgid "Enter Destination" msgstr "Izvēlies galamērķi" msgid "Zip Code" msgstr "Pasta indekss" msgid "City" msgstr "Pilsēta" msgid "District/Township" msgstr "Rajons/Pārvaldes rajons" msgid "Map" msgstr "Karte" msgid "Bookmark" msgstr "Grāmatzīme" msgid "Destination" msgstr "Galamērķis" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Ekrāns" msgid "_Route" msgstr "_Maršruts" msgid "_Former Destinations" msgstr "_Nesenais Galamērķis" msgid "_Bookmarks" msgstr "_Grāmatzīmes" msgid "_Map" msgstr "_Karte" msgid "_Layout" msgstr "_Izklājums" msgid "_Projection" msgstr "_Projekcija" msgid "_Vehicle" msgstr "_Transporta līdzeklis" msgid "Zoom_Out" msgstr "_Attālināt" msgid "Decrease zoom level" msgstr "Samazināt tuvinājumu" msgid "Zoom_In" msgstr "_Pietuviāt" msgid "Increase zoom level" msgstr "Palielināt tuvinājumu" msgid "_Recalculate" msgstr "_Pārrēķināt" msgid "Redraw map" msgstr "Pārzīmēt karti" msgid "_Info" msgstr "_Informācija" msgid "Set _destination" msgstr "Iestatīt _galamēķi" msgid "Opens address search dialog" msgstr "Atvērt adreses meklēšanas dialogu" msgid "_POI search" msgstr "I_P neklēšana" msgid "Opens POI search dialog" msgstr "Atver IP meklēšanas dialogu" msgid "_Stop Navigation" msgstr "_Apturēt Navigāciju" msgid "Test" msgstr "Tests" msgid "_Quit" msgstr "_Iziet" msgid "Quit the application" msgstr "Iziet no aplikācijas" msgid "Show position _cursor" msgstr "Rādīt atrašanās _kursoru" msgid "_Lock on Road" msgstr "_Piesaistīt Ceļam" msgid "_Keep orientation to the North" msgstr "_Saglabāt orientāciju uz Ziemeļiem" msgid "Switches map orientation to the north or the vehicle" msgstr "Mainīt kartes orientāciju uz ziemeļiem vai transportlīdzekli" msgid "_Roadbook" msgstr "_Ceļagrāmata" msgid "Show/hide route description" msgstr "Rādīt/slēpt maršruta aprakstu" msgid "_Autozoom" msgstr "_Autotālummiņa" msgid "Enable/disable automatic zoom level changing" msgstr "Ieslēgt/izslēgt automātisku tālummaiņu" msgid "_Fullscreen" msgstr "_Pilnekrāns" msgid "Data" msgstr "Dati" msgid "Pharmacy" msgstr "Farmācija" msgid "Restaurant" msgstr "Restorāns" msgid "Restaurant. Fast food" msgstr "Restorāns. Bistro" msgid "Hotel" msgstr "Viesnīca" msgid "Car parking" msgstr "Auto novietne" msgid "Fuel station" msgstr "Benzīntanks" msgid "Bank" msgstr "Banka" msgid "Hospital" msgstr "Slimnīca" msgid "Cinema" msgstr "Kino" msgid "Train station" msgstr "Vilcienu stacija" msgid "School" msgstr "Skola" msgid "Police" msgstr "Policija" msgid "Justice" msgstr "Tiesībsargi" msgid "Taxi" msgstr "Taksometrs" msgid "Shopping" msgstr "Iepirkšanās" msgid "Distance from screen center (km)" msgstr "Attālums no ekrāna centra (km)" #, c-format msgid "POI %s. %s" msgstr "IP %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Iestatīt galamērķi - %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Iestatīt karti %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "Iestatīt nākamo apmeklējumu %ld, %ld \n" msgid "POI search" msgstr "IP meklēšana" msgid "Select a category" msgstr "Izvēlieties kategoriju" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "Izvēlaties IP" msgid " " msgstr " " msgid "Category" msgstr "Kategorija" msgid "Direction" msgstr "Norādes" msgid "Distance(m)" msgstr "Attālums (m)" msgid "Name" msgstr "Vārds" msgid "Visit Before" msgstr "Apmeklēt vispirms" msgid "N" msgstr "Z" msgid "NE" msgstr "ZA" msgid "E" msgstr "A" msgid "SE" msgstr "DA" msgid "S" msgstr "D" msgid "SW" msgstr "DR" msgid "W" msgstr "R" msgid "NW" msgstr "ZR" #. Android resource: @strings/no msgid "No" msgstr "Nē" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Ceļš %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Ceļš 0000km 0+00:00 ETA" msgid "Help" msgstr "Palīdzība" #, c-format msgid "Waypoint %s" msgstr "Pieturpunkti %s" msgid "Select waypoint to insert the new one before" msgstr "Izvēlaties pieturpunktu lai ievietotu kā jaunu" msgid "View in Browser" msgstr "Rādīt pārlūkā" msgid "Item type" msgstr "Vienības veids" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ielas" msgid "House numbers" msgstr "Mājas numuri" msgid "View Attributes" msgstr "Rādīt Atribūtus" msgid "Set as position (and deactivate vehicle)" msgstr "Iestatīt kā atrašanos (un atspējot Tr. Līdzekli)" msgid "POIs" msgstr "IP" msgid "View on map" msgstr "Apskatīties kartē" msgid "Remove search results from the map" msgstr "Noņem meklētos rezultātus no kartes" msgid "Show results on the map" msgstr "Rādīt rezultātus uz kartes" msgid "Cut Bookmark" msgstr "izgriezt grāmatzīmi" msgid "Copy Bookmark" msgstr "Kopēt grāmatzīmi" msgid "Rename Bookmark" msgstr "Pārdēvēt grāmatzīmi" msgid "Paste Bookmark" msgstr "Ielīmēt grāmatzīmi" msgid "Delete Bookmark" msgstr "Dzēst grāmatzīmi" msgid "Delete waypoint" msgstr "Dzēst pieturvietu" msgid "Bookmarks" msgstr "Grāmatzīmes" msgid "Bookmarks as waypoints" msgstr "Grāmatzīmes kā pieturvietas" msgid "Save waypoints" msgstr "Saglabāt pieturvietas" msgid "Replace with waypoints" msgstr "Aizvietot ar pieturvietām" msgid "Delete Folder" msgstr "Dzēst mapi" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Pievienot grāmatzīmju mapi" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Ielīmēt grāmatzīmi" #, c-format msgid "Bookmark %s" msgstr "Grāmatzīmes %s" #, c-format msgid "Download %s" msgstr "Lejuplādē %s" msgid "Map Download" msgstr "Karšu lejuplāde" msgid "Active" msgstr "Aktīvs" msgid "Download Enabled" msgstr "Lejupielāde aktivizēta" msgid "Download completely" msgstr "Lejupielāde pabeigta" msgid "Show Satellite Status" msgstr "Rādit satelītu informāciju" msgid " Elevation " msgstr " Augstums " msgid " Azimuth " msgstr " Azimuts " msgid "Show NMEA Data" msgstr "Rādit NMEA informāciju" msgid "car" msgstr "auto" msgid "bike" msgstr "velosipēds" msgid "pedestrian" msgstr "gājējs" #, c-format msgid "Current profile: %s" msgstr "Pašreizējais profils: %s" #, c-format msgid "Change profile to: %s" msgstr "Mainīt profilu uz: %s" msgid "Set as active" msgstr "Iestatīt kā aktīvu" msgid "Show Satellite status" msgstr "Rādīt saelītu statusu" msgid "Show NMEA data" msgstr "Rādīt NMEA datus" msgid "Add Bookmark" msgstr "Pievienot grāmatzīmi" msgid "Rename" msgstr "Pārsaukt" msgid "About Navit" msgstr "Par Navit" #. Authors msgid "By" msgstr "Autori:" #. Contributors msgid "And all the Navit Team" msgstr "Un visa Navit komanda" msgid "members and contributors." msgstr "biedri un atbalstītāji" msgid "Waypoints" msgstr "Pieturpunkti" msgid "Enter Coordinates" msgstr "Ievadiet Koordinātes" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "Ievadiet koordinātes, piemēram:" msgid "Vehicle" msgstr "Transportlīdzeklis" msgid "Rules" msgstr "Noteikumi" msgid "Lock on road" msgstr "Piesaistīt ceļam" msgid "Northing" msgstr "Uz ziemeīem" msgid "Map follows Vehicle" msgstr "Karte seko mašīnai" msgid "Plan with Waypoints" msgstr "Plānot ar pieturvietām" msgid "Maps" msgstr "Kartes" msgid "Layout" msgstr "Izklājums" msgid "Height Profile" msgstr "Augstuma profils" msgid "Route Description" msgstr "Maršruta apraksts" msgid "Show Locale" msgstr "Rādīt Lokāles" msgid "Former Destinations" msgstr "Nesenie galamērķi" msgid "- No former destinations available -" msgstr "- Nav neseno galamērķu -" msgid "Message" msgstr "Ziņa" msgid "Back" msgstr "Atpakaļ" msgid "Back to map" msgstr "Atpakaļ uz karti" msgid "Main Menu" msgstr "Galvenā izvēlne" msgid "House number" msgstr "Mājas numurs" msgid "Next" msgstr "Nākamais" msgid "Prev" msgstr "Iepriekšējais" msgid "Return to route!" msgstr "Atgriezties uz ceļa!" #. warning told msgid "Look out! Camera!" msgstr "Uzmanību! Kamera!" #. warning told msgid "Please decrease your speed" msgstr "Lūdzu samaziet atrāmu" msgid "partial match" msgstr "daļēja sakritība" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Meklēt" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Pilsētas" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Ceļš uz šejieni" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Karte (c) OpenStreetMap contributors, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Lejuplādētās kartes" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Atcelt" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Visa Planēta" msgid "Africa" msgstr "Āfrika" msgid "Canary Islands" msgstr "Kanāriju salas" msgid "Asia" msgstr "Āzija" msgid "Korea" msgstr "Koreja" msgid "Taiwan" msgstr "Taivāna" msgid "UAE+Other" msgstr "AAE+Citi" msgid "Oceania" msgstr "Okeānija" msgid "Tasmania" msgstr "Tasmānija" msgid "Victoria" msgstr "Viktorija" msgid "New South Wales" msgstr "Jaunā Dienvidvelsa" msgid "Europe" msgstr "Eiropa" msgid "Western Europe" msgstr "Rietumeiropa" msgid "Azores" msgstr "Azoru salas" msgid "BeNeLux" msgstr "Beneluksa" msgid "Alsace" msgstr "Alsace" msgid "Aquitaine" msgstr "Akvitāna" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Basse-Normandija" msgid "Bourgogne" msgstr "Bourgogne" msgid "Bretagne" msgstr "Britānija" msgid "Centre" msgstr "Centrs" msgid "Champagne-Ardenne" msgstr "Šampanja-Ardene" msgid "Corse" msgstr "Korse" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "Limuzīns" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "Bajerna" msgid "Mittelfranken" msgstr "Mitelfarkena" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "Švābene" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "Berlīne" msgid "Brandenburg" msgstr "Brandenburga" msgid "Bremen" msgstr "Brēmene" msgid "Hamburg" msgstr "Hamburga" msgid "Hessen" msgstr "Hessene" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "Maljorka" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "Skandināvija" msgid "England" msgstr "Anglija" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "Kembridžšīra" msgid "Cumbria" msgstr "Kumbrija" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "Eseksa" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "Kenta" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "Norfolka" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "Oksfordšīre" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "Somerseta" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "Skotija" msgid "Wales" msgstr "Velsa" msgid "Crete" msgstr "Krēta" msgid "North America" msgstr "Ziemeļamerika" msgid "Alaska" msgstr "Aļaska" msgid "Hawaii" msgstr "Havaju salas" msgid "USA" msgstr "ASV" msgid " (except Alaska and Hawaii)" msgstr " (izņemt Aļasku un Havajas)" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "Mičigana" msgid "Ohio" msgstr "Ohaio" msgid "Northeast" msgstr "Ziemeļaustrumu" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "Vermonta" msgid "Pacific" msgstr "Klusais okeāns" msgid "South" msgstr "Dienvidi" msgid "Arkansas" msgstr "Arkanzasa" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Luiziana" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "Misisipi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Teksasa" msgid "Virginia" msgstr "Virdžīnija" msgid "West Virginia" msgstr "Rietumvirdžīnija" msgid "West" msgstr "Rietumi" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Kalifornija" msgid "Colorado" msgstr "Kolorado" msgid "Idaho" msgstr "Aidaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregona" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "lejupielādē" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "gatavs" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Nav brīvas vietas" msgid "Error downloading map!" msgstr "Kļūda lejuplādējot karti!" msgid "Error writing map!" msgstr "Kļūda rakstot karti!" msgid "Map download aborted!" msgstr "Kartes lejupielāde atcelta!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Atlikušais laiks" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Kartes lejuplāde" msgid "Vehicle Position" msgstr "Mašinas pozīcija" msgid "Main menu" msgstr "Galvenā izvēlne" msgid "" "Show\n" "Map" msgstr "" "Rādīt\n" "Karti" msgid "Settings" msgstr "Iestatījumi" msgid "Tools" msgstr "Rīki" msgid "Route" msgstr "Maršruts" msgid "About" msgstr "Par" msgid "Quit" msgstr "Iziet" msgid "Actions" msgstr "Darbības" msgid "" "Former\n" "Destinations" msgstr "" "Nesenie\n" "Galamērķi" msgid "Coordinates" msgstr "Koordinātas" msgid "" "Stop\n" "Navigation" msgstr "" "Apturēt\n" "Navigaciju" msgid "Display" msgstr "Ekrāns" msgid "Fullscreen" msgstr "Pilnekrāns" msgid "Window Mode" msgstr "Loga režīms" msgid "Description" msgstr "Apraksts" msgid "" "Drop last \n" "Waypoint" msgstr "" "Atcelt pēdējo \n" "Pieturvietu" msgid "" "Drop next \n" "Waypoint" msgstr "" "Atcelt nākamo \n" "Pieturvietu" msgid "Satellite Status" msgstr "Satalītu status" msgid "NMEA Data" msgstr "NMEA Dati" msgid "car_shortest" msgstr "Auto - ātrākais ceļš" msgid "car_avoid_tolls" msgstr "Auto - izvairīties no maksas ceļiem" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "zirgs" msgid "Truck" msgstr "Kravas automašīna" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Jā" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit sāknēts" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit darbojas" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Sveicināti Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Paldies ka instalējāt Navit!\n" "\n" "Lai sāktu, izvēlaties \"Lejuplādēt kartes\" no izvēlnes, lai lejuplādētu " "kartes. Piezīme: Karšu izmērs var būt lilāks par (>50MB) - wifi savienojums " "ir rekomendēts.\n" "\n" "Karšu dati: (c) OpenStreetMap contributors\n" "\n" "Lai noder!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "Labi" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Vairāk informācijas" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Tuvināt" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Tālināt" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Lejuplādēt kartes" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Iespējot IP" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Iziet no Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Rezerves kopija/Atjaunot" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Dzēst šo karti?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Lejuplādē:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Kļūda lejuplādējot karti." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Kartes lejupielāde atcelta" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Nav atrašaās vietas. Atvriet vēlreiz kad noteikta tarašanās vieta" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Kartes satur pasŗeizējo atrašanās vietu" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Meklēt adresi" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Ievadiet galamērķi" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Daļēja adreses sakritība" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Meklē..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adrese nav atrasta" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Saņem meklēšanas rezultātus" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Ielādē meklēšanas rezultātus" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Nekas nav atrasts" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Nav ivadīts teksts" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Iestata galamērķi:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Izvēlaties darbību" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Ievietojiet SD karti" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Rezerves kopēšana..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Atjauno..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Neizdevās izveidot rezerves kopijas mapi" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Rezerves kopēšana neizdevās" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Rezerves kopija nav atrsta" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Neizdevās atjunot" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Rezerves kopēšana veiksmīga" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Atjaunošana veiksmīga\n" "Lūdzu pārstartējiet Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Rezerves kopija nav atrasta" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Atjaunošana neizdevās" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Izvēlaties rezerves kopiju" #. Android resource: @strings/backup msgid "Backup" msgstr "Rezerves kopija" #. Android resource: @strings/restore msgid "Restore" msgstr "Atjaunot" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "pēc tam izbraukt no apļa pa %1$s %2$s" navit-0.5.0+dfsg.1/po/mk.po.in000066400000000000000000001347431264204753600157320ustar00rootroot00000000000000# Macedonian (mk) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Dejan Angelov https://launchpad.net/~dejanangelov # Michael von Glasow https://launchpad.net/~michael-vonglasow # Naum Spaseski https://launchpad.net/~naum-spaseski-gmail # Robert Mileski https://launchpad.net/~mileski # goran.cvetkovski https://launchpad.net/~goran-cvetkovski msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Macedonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" "Language: mk\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Работи од основниот директориум\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "смени '%s' во '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулти" msgid "first" msgstr "прв" msgid "second" msgstr "втор" msgid "third" msgstr "трет" msgid "fourth" msgstr "четврт" msgid "fifth" msgstr "петти" msgid "sixth" msgstr "шести" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нема излез" msgid "first exit" msgstr "прв излез" msgid "second exit" msgstr "втор излез" msgid "third exit" msgstr "трет излез" msgid "fourth exit" msgstr "четврт излез" msgid "fifth exit" msgstr "петти излез" msgid "sixth exit" msgstr "шести излез" #, c-format msgid "%d feet" msgstr "%d стапки" #, c-format msgid "in %d feet" msgstr "за %d стапки" #, c-format msgid "%d.%d miles" msgstr "%d.%d милји" #, c-format msgid "in %d.%d miles" msgstr "за %d.%d милји" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "%d милји" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "за %d милји" #, c-format msgid "%d meters" msgstr "%d метри" #, c-format msgid "in %d meters" msgstr "после %d метра" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d километри" #, c-format msgid "in %d.%d kilometers" msgstr "после %d.%d километри" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d километри" msgstr[1] "%d километри" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "после %d километри" msgstr[1] "после %d километри" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "на рампа" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sна %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sна %s" msgid "When possible, please turn around" msgstr "Кога можете, свртете" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Следете го патот следните %s" msgid "Enter the roundabout soon" msgstr "Наскоро влегувате во кружен тек" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Излегувате од кружен тек на %1$s %2$s" msgid "soon" msgstr "наскоро" msgid "now" msgstr "сега" msgid "then" msgstr "тогаш" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "на десно" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "на лево" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "лесно " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "силно " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Продолжи по %1$s патот до %2$s" #, c-format msgid "after %i roads" msgstr "после %i патишта" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Свртете %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "тогаш свртете" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Свртете %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "тогаш свртете" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Свртете %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "потоа пристигате на одредиштето." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Стигнавте на целта %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Излез" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиция" msgid "Command" msgstr "Програма" msgid "Length" msgstr "Length" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Време" msgid "Destination Length" msgstr "Растојание до целта" msgid "Destination Time" msgstr "Време до целта" msgid "Roadbook" msgstr "Патна книга" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "Посети пред..." msgid "Set as position" msgstr "Зададете како позиција" msgid "Set as destination" msgstr "Зададете како цел" msgid "Add as bookmark" msgstr "Додадете како место" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Координати на екранот: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Обединети Арапски Емирати" #. 004 msgid "Afghanistan" msgstr "Авганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигва и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангила" #. 008 msgid "Albania" msgstr "Албанија" #. 051 msgid "Armenia" msgstr "Ерменија" #. 530 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Американска Самоа" #. 040 msgid "Austria" msgstr "Австрија" #. 036 msgid "Australia" msgstr "Австралија" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Аландски острови" #. 031 msgid "Azerbaijan" msgstr "Азербејџан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Белгија" #. 854 msgid "Burkina Faso" msgstr "Буркина Фасо" #. 100 msgid "Bulgaria" msgstr "Бугарија" #. 048 msgid "Bahrain" msgstr "Бахреин" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Свети Бартоломеј" #. 060 msgid "Bermuda" msgstr "Бермуда" #. 096 msgid "Brunei Darussalam" msgstr "Брунеи Дар ес Салам" #. 068 msgid "Bolivia" msgstr "Боливија" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Бониаре, Св. Еустатиус и Саба" #. 076 msgid "Brazil" msgstr "Бразил" #. 044 msgid "Bahamas" msgstr "Бахами" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Остров Буве" #. 072 msgid "Botswana" msgstr "Боцвана" #. 112 msgid "Belarus" msgstr "Белорусија" #. 084 msgid "Belize" msgstr "Белизе" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосови (Килинг) острови" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Конго, Демократска Република" #. 140 msgid "Central African Republic" msgstr "Централна Африканска Република" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швајцарија" #. 384 msgid "Cote d'Ivoire" msgstr "Брегот на Слоновата коска" #. 184 msgid "Cook Islands" msgstr "Кук острови" #. 152 msgid "Chile" msgstr "Чиле" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Кина" #. 170 msgid "Colombia" msgstr "Колумбија" #. 188 msgid "Costa Rica" msgstr "Костарика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кејп Верде" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Велигденски Острови" #. 196 msgid "Cyprus" msgstr "Кипар" #. 203 msgid "Czech Republic" msgstr "Чешка Република" #. 276 msgid "Germany" msgstr "Германија" #. 262 msgid "Djibouti" msgstr "Џибути" #. 208 msgid "Denmark" msgstr "Данска" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканска Република" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естонија" #. 818 msgid "Egypt" msgstr "Египет" #. 732 msgid "Western Sahara" msgstr "Западна Сахара" #. 232 msgid "Eritrea" msgstr "Еритреја" #. 724 msgid "Spain" msgstr "Шпанија" #. 231 msgid "Ethiopia" msgstr "Етиопија" #. 246 msgid "Finland" msgstr "Финска" #. 242 msgid "Fiji" msgstr "Фиџи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фокландски Острови (Малвини)" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронезија, Федеративни Држави на" #. 234 msgid "Faroe Islands" msgstr "Фарски Острови" #. 250 msgid "France" msgstr "Франција" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Обединето Кралство" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузија" #. 254 msgid "French Guiana" msgstr "Француска Гвинеја" #. 831 msgid "Guernsey" msgstr "Гернзи" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренланд" #. 270 msgid "Gambia" msgstr "Гамбија" #. 324 msgid "Guinea" msgstr "Гвинеја" #. 312 msgid "Guadeloupe" msgstr "Гваделупе" #. 226 msgid "Equatorial Guinea" msgstr "Екваторијална Гвинеја" #. 300 msgid "Greece" msgstr "Грција" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Јужна Џорџија и Јужните Сендвич острови" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинеја Бисао" #. 328 msgid "Guyana" msgstr "Гвајана" #. 344 msgid "Hong Kong" msgstr "Хонг Конг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Херд острови и Мекдоналд острови" #. 340 msgid "Honduras" msgstr "Хондурас" #. 191 msgid "Croatia" msgstr "Хрватска" #. 332 msgid "Haiti" msgstr "Хаити" #. 348 msgid "Hungary" msgstr "Унгарија" #. 360 msgid "Indonesia" msgstr "Индонезија" #. 372 msgid "Ireland" msgstr "Ирска" #. 376 msgid "Israel" msgstr "Израел" #. 833 msgid "Isle of Man" msgstr "Островот Ман" #. 356 msgid "India" msgstr "Индија" #. 086 msgid "British Indian Ocean Territory" msgstr "Британска територија на Индиски океан" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Исламска Република" #. 352 msgid "Iceland" msgstr "Исланд" #. 380 msgid "Italy" msgstr "Италија" #. 832 msgid "Jersey" msgstr "Џерси" #. 388 msgid "Jamaica" msgstr "Јамајка" #. 400 msgid "Jordan" msgstr "Јордан" #. 392 msgid "Japan" msgstr "Јапонија" #. 404 msgid "Kenya" msgstr "Кенија" #. 417 msgid "Kyrgyzstan" msgstr "Киргистан" #. 116 msgid "Cambodia" msgstr "Камбоџа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Коморски острови" #. 659 msgid "Saint Kitts and Nevis" msgstr "Свети Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Кореја, Демократска Народна Република" #. 410 msgid "Korea, Republic of" msgstr "Кореја, Република" #. 414 msgid "Kuwait" msgstr "Кувајт" #. 136 msgid "Cayman Islands" msgstr "Кајмански Острови" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Народна Демократска Република Лао" #. 422 msgid "Lebanon" msgstr "Либан" #. 662 msgid "Saint Lucia" msgstr "Света Лусија" #. 438 msgid "Liechtenstein" msgstr "Лихтенштајн" #. 144 msgid "Sri Lanka" msgstr "Шри Ланка" #. 430 msgid "Liberia" msgstr "Либерија" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литванија" #. 442 msgid "Luxembourg" msgstr "Луксембург" #. 428 msgid "Latvia" msgstr "Латвија" #. 434 msgid "Libya" msgstr "Либија" #. 504 msgid "Morocco" msgstr "Мароко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдавија, Република" #. 499 msgid "Montenegro" msgstr "Црна Гора" #. 663 msgid "Saint Martin (French part)" msgstr "Свети Мартин (Француски дел)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалови Острови" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македонија" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мијанмар" #. 496 msgid "Mongolia" msgstr "Монголија" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Северни Маријански острови" #. 474 msgid "Martinique" msgstr "Мартиник" #. 478 msgid "Mauritania" msgstr "Мавританија" #. 500 msgid "Montserrat" msgstr "Монтсерат" #. 470 msgid "Malta" msgstr "Малта" #. 480 msgid "Mauritius" msgstr "Маврициус" #. 462 msgid "Maldives" msgstr "Малдиви" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексико" #. 458 msgid "Malaysia" msgstr "Малезија" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибија" #. 540 msgid "New Caledonia" msgstr "Нова Каледонија" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Норфолк, Остров" #. 566 msgid "Nigeria" msgstr "Нигерија" #. 558 msgid "Nicaragua" msgstr "Никарагва" #. 528 msgid "Netherlands" msgstr "Холандија" #. 578 msgid "Norway" msgstr "Норвешка" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ниуе" #. 554 msgid "New Zealand" msgstr "Нов Зеланд" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Француска Полинезија" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинеја" #. 608 msgid "Philippines" msgstr "Филипини" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Полска" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Свети Пјер и Микелон" #. 612 msgid "Pitcairn" msgstr "Питкерн" #. 630 msgid "Puerto Rico" msgstr "Порто Рико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестинска територија, Окупирана" #. 620 msgid "Portugal" msgstr "Португалија" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвај" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реунион" #. 642 msgid "Romania" msgstr "Романија" #. 688 msgid "Serbia" msgstr "Србија" #. 643 msgid "Russian Federation" msgstr "Руска федерација" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудиска Арабија" #. 090 msgid "Solomon Islands" msgstr "Соломонски Острови" #. 690 msgid "Seychelles" msgstr "Сејшели" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Шведска" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Света Елена" #. 705 msgid "Slovenia" msgstr "Словенија" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Свалбард и Жан Мајен" #. 703 msgid "Slovakia" msgstr "Словачка" #. 694 msgid "Sierra Leone" msgstr "Сиера Леоне" #. 674 msgid "San Marino" msgstr "Сан Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалија" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "Јужен судан" #. 678 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принципе" #. 222 msgid "El Salvador" msgstr "Ел Салвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Свети Мартин (Холандиски дел)" #. 760 msgid "Syrian Arab Republic" msgstr "Сиријска Арапска Република" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Острови Турк и Каикос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Француски Јужни Територии" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Тајланд" #. 762 msgid "Tajikistan" msgstr "Таџикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Тимор-Источен" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турција" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тајван, Кинеска провинција" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзанија, Обединета Република" #. 804 msgid "Ukraine" msgstr "Украина" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Соединетите Држави, Мали додатни острови на" #. 840 msgid "United States" msgstr "Соединетите Американски Држави" #. 858 msgid "Uruguay" msgstr "Уругвај" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Светата Столица (Ватикан, Град - Држава)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Свети Винсент и Гренадините" #. 862 msgid "Venezuela" msgstr "Венецуела" #. 092 msgid "Virgin Islands, British" msgstr "Девствени Острови, Британски" #. 850 msgid "Virgin Islands, U.S." msgstr "Девствени Острови, САД" #. 704 msgid "Viet Nam" msgstr "Виетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Валис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Јемен" #. 175 msgid "Mayotte" msgstr "Мајоти" #. 710 msgid "South Africa" msgstr "Јужна Африка" #. 894 msgid "Zambia" msgstr "Замбија" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "* Непознато, додадете is_in тагови за овие градови" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "Не е пронајден документ за конфигурација navit.xml, navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Грешка при читањето на документот за конфигурирање '%s':%s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Користи документ за конфигурирање '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Внатрешното иницирање не успеа, исклучувам. Проверете ги предходните пораки " "за грешки.\n" msgid "unknown street" msgstr "непозната улица" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Неименувано возило" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карта" msgid "Car" msgstr "Автомобил" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Држава" msgid "Postal" msgstr "Поштенска" msgid "Town" msgstr "Град" msgid "District" msgstr "Област" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Број" msgid "Enter Destination" msgstr "Внесете одредиште" msgid "Zip Code" msgstr "Поштенски број" msgid "City" msgstr "Град" msgid "District/Township" msgstr "Општина" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Омилено место" msgid "Destination" msgstr "Одредиште" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Екран" msgid "_Route" msgstr "Рута" msgid "_Former Destinations" msgstr "Претходни одредишта" msgid "_Bookmarks" msgstr "Омилени места" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Изглед" msgid "_Projection" msgstr "Проекција" msgid "_Vehicle" msgstr "Возило" msgid "Zoom_Out" msgstr "Намали" msgid "Decrease zoom level" msgstr "Намали го зум нивото" msgid "Zoom_In" msgstr "Зголеми" msgid "Increase zoom level" msgstr "Зголеми го зум нивото" msgid "_Recalculate" msgstr "Повторно пресметај" msgid "Redraw map" msgstr "Прецртај ја мапата" msgid "_Info" msgstr "Инфо" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Го отвара прозорот за барање на адреса" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Запирање на навигација" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Заврши" msgid "Quit the application" msgstr "Затвори ја апликацијата" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Придржувај се до патот" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Патна книга" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Авто-зголемување" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "На цел екран" msgid "Data" msgstr "Податоци" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "С" msgid "NE" msgstr "СИ" msgid "E" msgstr "И" msgid "SE" msgstr "ЈИ" msgid "S" msgstr "Ј" msgid "SW" msgstr "ЈЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "Не" msgid "2D" msgstr "2Д" msgid "3D" msgstr "3Д" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Рута %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Рута 0000km 0+00:00 ETA" msgid "Help" msgstr "Помош" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Види во пребарувач" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улици" msgid "House numbers" msgstr "Куќни броеви" msgid "View Attributes" msgstr "Види атрибути" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Интересни точки" msgid "View on map" msgstr "Види на карта" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Отсечи обележувач" msgid "Copy Bookmark" msgstr "Копирај обележувач" msgid "Rename Bookmark" msgstr "Преименувај обележувач" msgid "Paste Bookmark" msgstr "Вметни обележувач" msgid "Delete Bookmark" msgstr "Избриши обележувач" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Омилени места" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Вметни обележувач" #, c-format msgid "Bookmark %s" msgstr "Интересно место %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Покажи статус на сателитите" msgid " Elevation " msgstr " Елевација " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Покажи NMEA податоци" msgid "car" msgstr "автомобил" msgid "bike" msgstr "велосипед" msgid "pedestrian" msgstr "пешак" #, c-format msgid "Current profile: %s" msgstr "Тековен профил: %s" #, c-format msgid "Change profile to: %s" msgstr "Смени профил во: %s" msgid "Set as active" msgstr "Постави како активен" msgid "Show Satellite status" msgstr "Покажи статус на сателитите" msgid "Show NMEA data" msgstr "Покажи NMEA податоци" msgid "Add Bookmark" msgstr "Додај обележувач" msgid "Rename" msgstr "Преименувај" msgid "About Navit" msgstr "За Navit" #. Authors msgid "By" msgstr "Од" #. Contributors msgid "And all the Navit Team" msgstr "И целиот Navit тим" msgid "members and contributors." msgstr "членови и придонесувачи" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Возило" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Придржувај се на патот" msgid "Northing" msgstr "Северен правец" msgid "Map follows Vehicle" msgstr "Картата го следи возилото" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Изгледи" msgid "Layout" msgstr "Изглед" msgid "Height Profile" msgstr "Висински профил" msgid "Route Description" msgstr "Објаснување за патот" msgid "Show Locale" msgstr "Прикажи јазично подесување" msgid "Former Destinations" msgstr "Претходни одредишта" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Порака" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Врати се на картата" msgid "Main Menu" msgstr "Главно мени" msgid "House number" msgstr "Куќен број" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Позиција на возило" msgid "Main menu" msgstr "Главно мени" msgid "" "Show\n" "Map" msgstr "" "Покажи ја\n" "Картата" msgid "Settings" msgstr "Поставувања" msgid "Tools" msgstr "Алатки" msgid "Route" msgstr "Рута" msgid "About" msgstr "За" msgid "Quit" msgstr "Напушти" msgid "Actions" msgstr "Акции" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Сопри ја\n" "Навигацијата" msgid "Display" msgstr "Екран" msgid "Fullscreen" msgstr "На цел екран" msgid "Window Mode" msgstr "Работи во прозорец" msgid "Description" msgstr "Опис" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "коњ" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "потоа излегувате од кружен тек на %1$s %2$s" navit-0.5.0+dfsg.1/po/ml.po.in000066400000000000000000002101231264204753600157160ustar00rootroot00000000000000# Malayalam translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Faju https://launchpad.net/~gotoarunk # Michael von Glasow https://launchpad.net/~michael-vonglasow # Sunil K https://launchpad.net/~sunilk msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Malayalam \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: ml\n" msgid "Running from source directory\n" msgstr "സോര്‍സ് ഡൈരക്ടറിയില് നിന്നും പ്രവര്ത്തിക്കുന്നു\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s'-നെ '%s' ആയി ക്രമീകരിച്ചിരിക്കുന്നു\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "പൂജ്യം" msgid "first" msgstr "ഒന്നാമത്തേ" msgid "second" msgstr "രണ്ടാമത്തെ" msgid "third" msgstr "മൂന്നാമത്തെ" msgid "fourth" msgstr "നാലാമത്തെ" msgid "fifth" msgstr "അഞ്ചാമത്തെ" msgid "sixth" msgstr "ആറാമത്തെ" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "പൂജ്യം വഴി" msgid "first exit" msgstr "ഒന്നാമത്തേ വഴി" msgid "second exit" msgstr "രണ്ടാമത്തേ വഴി" msgid "third exit" msgstr "മൂന്നാമത്തെ വഴി" msgid "fourth exit" msgstr "നാലമത്തേ വഴി" msgid "fifth exit" msgstr "അഞ്ചാമത്തെ വഴി" msgid "sixth exit" msgstr "ആറാമത്തെ വഴി" #, c-format msgid "%d feet" msgstr "%d അടി" #, c-format msgid "in %d feet" msgstr "%d അടിയില്‍" #, c-format msgid "%d.%d miles" msgstr "%d.%d മൈല്‍" #, c-format msgid "in %d.%d miles" msgstr "%d.%d മൈലില്‍" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "ഒരു മൈല്‍" msgstr[1] "%d മൈല്‍" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "ഒരു മൈലില്‍" msgstr[1] "%d മൈലില്‍" #, c-format msgid "%d meters" msgstr "%d മീറ്റര്‍" #, c-format msgid "in %d meters" msgstr "%d മീറ്ററില്‍" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d കിലോമീറ്റര്‍" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d കിലോമീറ്ററില്‍" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ഒരു കിലോമീറ്റര്‍" msgstr[1] "%d കിലോമീറ്റര്‍" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ഒരു കിലോമീറ്ററില്‍" msgstr[1] "%d കിലോമീറ്ററില്‍" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sകഴിഞ്ഞു %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sകഴിഞ്ഞു %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sകഴിഞ്ഞു %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sകഴിഞ്ഞു %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s-ല്‍ %s -ലേക്ക് തിരിയുക" msgid "When possible, please turn around" msgstr "സാധിക്കുന്നിടത്ത് വച്ച്,തിരിച്ചു പോവുക" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "ഈ വഴിയിലുടെ അടുത്ത %s പോവുക" msgid "Enter the roundabout soon" msgstr "റൗണ്ടാനയിലേക്ക് ഉടനെ കയറുക" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "%1$s-ലൂടെ റൗണ്ടാനയില്‍ നിന്നും പുറത്തു പോവുകാ %2$s" msgid "soon" msgstr "അല്പസമയത്തിനുള്ളില്‍" msgid "now" msgstr "ഇപ്പോള്‍" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "വലത്തോട്ട്" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "ഇടത്തോട്ട്" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "ചെറുതായ് " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "നന്നായി " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "%2$s %1$s-മത്തെ പാത എടുക്കുക" #, c-format msgid "after %i roads" msgstr "%i വഴികൾക്കു ശേഷം" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%4$s ലേക്ക് %3$s %2$s %1$s തിരിയുക" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "അപ്പോള്‍ നിങ്ങള്‍ ലക്ഷ്യത്തിലെത്തും" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "നിങ്ങള്‍ %s ലക്ഷ്യത്തിലെത്തിയിരിക്കുന്നു" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "പുറത്തേക്ക്" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "സ്ഥാനം" msgid "Command" msgstr "നിര്‍ദ്ദേശം" msgid "Length" msgstr "ദൂരം" msgid "km" msgstr "കിലോമീറ്റെര്‍" msgid "m" msgstr "മീറ്റര്‍" msgid "Time" msgstr "സമയം" msgid "Destination Length" msgstr "ലക്ഷ്യത്തിലേക്കുള്ള ദൂരം" msgid "Destination Time" msgstr "ലക്ഷ്യത്തിലേക്കുള്ള സമയം" msgid "Roadbook" msgstr "ഭൂപട പുസ്തകം" #, c-format msgid "Waypoint %d" msgstr "%d വഴിത്തിരിവ്" msgid "Visit before..." msgstr "മുന്പെ സന്ദര്‍ശിക്കുക ..." msgid "Set as position" msgstr "സ്ഥാനമായി നിശ്ചയിക്കുക" msgid "Set as destination" msgstr "ഉദ്ദിഷ്ടസ്ഥാനമായി ഉറപ്പിക്കുക" msgid "Add as bookmark" msgstr "ബുക്ക്മാര്‍ക് ചെയ്യുക" #, c-format msgid "Point 0x%x 0x%x" msgstr "സ്ഥാനം 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "സ്ക്രീന് സ്ഥാനം %d %d" #. 020 msgid "Andorra" msgstr "അന്‍ഡോറാ" #. 784 msgid "United Arab Emirates" msgstr "യുണൈറ്റഡ് അറബ് എമിറേറ്റ്സ്" #. 004 msgid "Afghanistan" msgstr "അഫ്ഗാനിസ്ഥാന്‍" #. 028 msgid "Antigua and Barbuda" msgstr "ആന്റിഗ്വാ ബാര്‍ബുഡ" #. 660 msgid "Anguilla" msgstr "ആന്‍ഗ്വില" #. 008 msgid "Albania" msgstr "അല്‍ബേനിയ" #. 051 msgid "Armenia" msgstr "അര്‍മേനിയ" #. 530 msgid "Netherlands Antilles" msgstr "നെതര്‍ലന്‍ഡ്സ് ആന്റിലസ്" #. 024 msgid "Angola" msgstr "അംഗോളാ" #. 010 msgid "Antarctica" msgstr "അന്റാര്‍ട്ടിക്ക" #. 032 msgid "Argentina" msgstr "അര്‍ജന്റീന" #. 016 msgid "American Samoa" msgstr "അമേരിക്കന്‍ സമോവ" #. 040 msgid "Austria" msgstr "ഓസ്ട്രിയാ" #. 036 msgid "Australia" msgstr "ഓസ്ട്രേലിയ" #. 533 msgid "Aruba" msgstr "അറൂബ" #. 248 msgid "Aland Islands" msgstr "ആലന്ഡ് ദീപുകള്‍" #. 031 msgid "Azerbaijan" msgstr "അസ‌ര്‍ബൈജാന്‍" #. 070 msgid "Bosnia and Herzegovina" msgstr "ബോസ്നിയ-ഹെര്‍സെഗോവിന" #. 052 msgid "Barbados" msgstr "ബാര്‍ബഡോസ്" #. 050 msgid "Bangladesh" msgstr "ബംഗ്ലാദേശ്" #. 056 msgid "Belgium" msgstr "ബെൽജിയം" #. 854 msgid "Burkina Faso" msgstr "ബർക്കിനാ ഫാസോ" #. 100 msgid "Bulgaria" msgstr "ബള്‍ഗേറിയ" #. 048 msgid "Bahrain" msgstr "ബഹറിന്‍" #. 108 msgid "Burundi" msgstr "ബറുണ്ടി" #. 204 msgid "Benin" msgstr "ബെനിന്‍" #. 652 msgid "Saint Barthelemy" msgstr "സെന്റ് ബര്‍തെലെമി" #. 060 msgid "Bermuda" msgstr "ബെർമുഡ" #. 096 msgid "Brunei Darussalam" msgstr "ബ്രൂണെയ് ദാറുസ്സലാം" #. 068 msgid "Bolivia" msgstr "ബൊളീവിയ" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "ബോനെയര്, സെന്റ് എഷ്ടാത്യൂസ് സാബ" #. 076 msgid "Brazil" msgstr "ബ്രസീൽ" #. 044 msgid "Bahamas" msgstr "ബഹാമാസ്" #. 064 msgid "Bhutan" msgstr "ഭൂട്ടാന്‍" #. 074 msgid "Bouvet Island" msgstr "ബൌവെ ദ്വീപുകള്‍" #. 072 msgid "Botswana" msgstr "ബോട്സ്വാന" #. 112 msgid "Belarus" msgstr "ബെലാറസ്" #. 084 msgid "Belize" msgstr "ബെലീസ്" #. 124 msgid "Canada" msgstr "കാനഡ" #. 166 msgid "Cocos (Keeling) Islands" msgstr "കോക്കോസ് (കീലിങ്) ദ്വീപുകള്‍" #. 180 msgid "Congo, Democratic Republic of the" msgstr "കോങ്കോ ( ഡിമോക്രാറ്റിക്ക് റിപബ്ലിക്ക് )" #. 140 msgid "Central African Republic" msgstr "മദ്ധ്യ ആഫ്രിക്കൻ റിപ്പബ്ലിക്ക്" #. 178 msgid "Congo" msgstr "കോംഗോ" #. 756 msgid "Switzerland" msgstr "സ്വിറ്റ്സ‌ര്‍ലാന്‍ഡ്" #. 384 msgid "Cote d'Ivoire" msgstr "കോട്ടേ ഡെല്‍‍വോയിര്‍" #. 184 msgid "Cook Islands" msgstr "കുക്ക് ദ്വീപുകള്‍" #. 152 msgid "Chile" msgstr "ചിലി" #. 120 msgid "Cameroon" msgstr "കാമറൂൺ" #. 156 msgid "China" msgstr "ചൈന" #. 170 msgid "Colombia" msgstr "കൊളംബിയ‌" #. 188 msgid "Costa Rica" msgstr "കോസ്റ്റ റീക്ക" #. 192 msgid "Cuba" msgstr "ക്യൂബ" #. 132 msgid "Cape Verde" msgstr "കേപ് വെര്‍ഡെ" #. 531 msgid "Curacao" msgstr "കുറക്കാവൊ" #. 162 msgid "Christmas Island" msgstr "ക്രിസ്തുമസ് ദ്വീപ്" #. 196 msgid "Cyprus" msgstr "സൈപ്രസ്സ്" #. 203 msgid "Czech Republic" msgstr "ചെക്ക്‌ റിപ്പബ്ലിക്ക്‌" #. 276 msgid "Germany" msgstr "ജര്‍മനി" #. 262 msgid "Djibouti" msgstr "ജിബൂട്ടി" #. 208 msgid "Denmark" msgstr "ഡെന്മാർക്ക്" #. 212 msgid "Dominica" msgstr "‌ഡൊമിനിക്ക" #. 214 msgid "Dominican Republic" msgstr "‌ഡൊമിനിക്കന്‍ റിപബ്ലിക്ക്" #. 012 msgid "Algeria" msgstr "അള്‍ജീരിയ" #. 218 msgid "Ecuador" msgstr "ഇക്വഡോര്‍" #. 233 msgid "Estonia" msgstr "എസ്റ്റോണിയ" #. 818 msgid "Egypt" msgstr "ഈജിപ്ത്" #. 732 msgid "Western Sahara" msgstr "പശ്ചിമ സഹാറ" #. 232 msgid "Eritrea" msgstr "എറിട്രിയ" #. 724 msgid "Spain" msgstr "സ്പെയിന്‍" #. 231 msgid "Ethiopia" msgstr "എത്യോപ്യ" #. 246 msgid "Finland" msgstr "ഫിന്‍ലാന്റ്" #. 242 msgid "Fiji" msgstr "ഫിജി" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "ഫാക്‍ലാന്ഡ് ദ്വീപുകള്‍ (മാള്‍വിനാസ്)" #. 583 msgid "Micronesia, Federated States of" msgstr "മൈക്രോനേഷ്യ" #. 234 msgid "Faroe Islands" msgstr "ഫാറോ ദ്വീപുകള്‍" #. 250 msgid "France" msgstr "ഫ്രാന്‍സ്" #. 266 msgid "Gabon" msgstr "ഗാബോണ്‍" #. 826 msgid "United Kingdom" msgstr "യുണൈറ്റഡ് കിങ്ഡം" #. 308 msgid "Grenada" msgstr "ഗ്രനഡ" #. 268 msgid "Georgia" msgstr "ജോര്‍ജിയ" #. 254 msgid "French Guiana" msgstr "ഫ്രഞ്ച് ഗയാന" #. 831 msgid "Guernsey" msgstr "ജേണ്‍സി" #. 288 msgid "Ghana" msgstr "ഘാന" #. 292 msgid "Gibraltar" msgstr "ജിബ്രാള്‍ട്ടര്‍" #. 304 msgid "Greenland" msgstr "ഗ്രീന്‍ലാന്‍ഡ്" #. 270 msgid "Gambia" msgstr "ഗാംബിയ" #. 324 msgid "Guinea" msgstr "ഗിനിയ" #. 312 msgid "Guadeloupe" msgstr "ഗ്വാഡെലോപ്" #. 226 msgid "Equatorial Guinea" msgstr "ഇക്വറ്റോറിയല്‍ ഗിനിയ" #. 300 msgid "Greece" msgstr "ഗ്രീസ്" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "തെക്കന്‍ ജോര്‍ജിയ തെക്കന്‍ സാന്‍ഡ്‌വിച്ച് ദ്വീപുകള്‍" #. 320 msgid "Guatemala" msgstr "ഗ്വാട്ടിമാല" #. 316 msgid "Guam" msgstr "ഗുവാം" #. 624 msgid "Guinea-Bissau" msgstr "ഗിനിയ-ബിസ്സാവു" #. 328 msgid "Guyana" msgstr "ഗയാന" #. 344 msgid "Hong Kong" msgstr "ഹോങ്കോങ്" #. 334 msgid "Heard Island and McDonald Islands" msgstr "ഹെര്‍ഡ് ദ്വീപും മക്ഡൊണാള്‍ഡ് ദ്വീപുകളും" #. 340 msgid "Honduras" msgstr "ഹോണ്ടുറാസ്" #. 191 msgid "Croatia" msgstr "ക്രോയേഷ്യ" #. 332 msgid "Haiti" msgstr "ഹെയ്‌തി" #. 348 msgid "Hungary" msgstr "ഹംഗറി" #. 360 msgid "Indonesia" msgstr "ഇന്തോനേഷ്യ" #. 372 msgid "Ireland" msgstr "അയർലണ്ട്" #. 376 msgid "Israel" msgstr "ഇസ്രയേൽ" #. 833 msgid "Isle of Man" msgstr "ഐല്‍ ഓഫ് മാന്‍" #. 356 msgid "India" msgstr "ഇന്ത്യ" #. 086 msgid "British Indian Ocean Territory" msgstr "ബ്രിട്ടീഷ് ഇന്ത്യന്‍ ഓഷ്യന്‍ ടെറിട്ടറി" #. 368 msgid "Iraq" msgstr "ഇറാഖ്‌" #. 364 msgid "Iran, Islamic Republic of" msgstr "ഇറാന്‍, ഇസ്ലാമിക് റിപ്പബ്ലിക് ഓഫ്" #. 352 msgid "Iceland" msgstr "ഐസ്‌ലാന്റ്" #. 380 msgid "Italy" msgstr "ഇറ്റലി‌" #. 832 msgid "Jersey" msgstr "ജേര്‍സി" #. 388 msgid "Jamaica" msgstr "ജമൈക്ക" #. 400 msgid "Jordan" msgstr "ജോര്‍ദാന്‍" #. 392 msgid "Japan" msgstr "ജപ്പാൻ" #. 404 msgid "Kenya" msgstr "കെനിയ" #. 417 msgid "Kyrgyzstan" msgstr "കിർഗ്ഗിസ്ഥാൻ" #. 116 msgid "Cambodia" msgstr "കമ്പോഡിയ" #. 296 msgid "Kiribati" msgstr "കിരിബാറ്റി" #. 174 msgid "Comoros" msgstr "കൊമോറോസ്" #. 659 msgid "Saint Kitts and Nevis" msgstr "സെയിന്റ് കിറ്റ്സും നെവിസും" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "ഉത്തര കൊറിയ" #. 410 msgid "Korea, Republic of" msgstr "ദക്ഷിണ കൊറിയ" #. 414 msgid "Kuwait" msgstr "കുവൈറ്റ്‌" #. 136 msgid "Cayman Islands" msgstr "കേയ്മാന്‍ ദ്വീപുകള്‍" #. 398 msgid "Kazakhstan" msgstr "കസാഖിസ്ഥാന്‍" #. 418 msgid "Lao People's Democratic Republic" msgstr "ലാവോസ്" #. 422 msgid "Lebanon" msgstr "ലെബനന്‍" #. 662 msgid "Saint Lucia" msgstr "സെയ്ന്റ് ലൂസിയ" #. 438 msgid "Liechtenstein" msgstr "ലീച്ചെന്‍സ്റ്റീന്‍" #. 144 msgid "Sri Lanka" msgstr "ശ്രീലങ്ക" #. 430 msgid "Liberia" msgstr "ലൈബീരിയ" #. 426 msgid "Lesotho" msgstr "ലെസോത്തോ" #. 440 msgid "Lithuania" msgstr "ലിത്വാനിയ" #. 442 msgid "Luxembourg" msgstr "ലക്സംബർഗ്" #. 428 msgid "Latvia" msgstr "ലാത്‌വിയ" #. 434 msgid "Libya" msgstr "ലിബിയ" #. 504 msgid "Morocco" msgstr "മൊറോക്കോ" #. 492 msgid "Monaco" msgstr "മൊണാക്കോ" #. 498 msgid "Moldova, Republic of" msgstr "മോള്‍ഡോവ" #. 499 msgid "Montenegro" msgstr "മോണ്ടിനെഗ്രോ" #. 663 msgid "Saint Martin (French part)" msgstr "സെയിന്റ് മാര്‍ട്ടിന്‍ (ഫ്രഞ്ച് ഭാഗം)" #. 450 msgid "Madagascar" msgstr "മഡഗാസ്കര്‍" #. 584 msgid "Marshall Islands" msgstr "മാര്‍ഷല്‍ ദ്വീപുകള്‍" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "മാസിഡോണിയ (പഴയ യൂകൊസ്ളാവിയ)" #. 466 msgid "Mali" msgstr "മാലി" #. 104 msgid "Myanmar" msgstr "മ്യാന്‍മര്‍" #. 496 msgid "Mongolia" msgstr "മംഗോളിയ" #. 446 msgid "Macao" msgstr "മാക്കാവോ" #. 580 msgid "Northern Mariana Islands" msgstr "വടക്കന്‍ മരിയാന ദ്വീപുകള്‍" #. 474 msgid "Martinique" msgstr "മാര്ട്ടിനിക്ക്" #. 478 msgid "Mauritania" msgstr "മൌറിറ്റാനിയ" #. 500 msgid "Montserrat" msgstr "മോണ്ട്സെറാറ്റ്" #. 470 msgid "Malta" msgstr "മാള്‍ട്ട" #. 480 msgid "Mauritius" msgstr "മൗറീഷ്യസ്" #. 462 msgid "Maldives" msgstr "മാലിദ്വീപ്" #. 454 msgid "Malawi" msgstr "മലാവി" #. 484 msgid "Mexico" msgstr "മെക്സിക്കോ" #. 458 msgid "Malaysia" msgstr "മലേഷ്യ" #. 508 msgid "Mozambique" msgstr "മൊസാംബിക്ക്" #. 516 msgid "Namibia" msgstr "നമീബിയ" #. 540 msgid "New Caledonia" msgstr "ന്യൂ കാലിഡോണിയാ" #. 562 msgid "Niger" msgstr "നൈജര്‍" #. 574 msgid "Norfolk Island" msgstr "നോര്‍ഫോക്ക് ദ്വീപു്" #. 566 msgid "Nigeria" msgstr "നൈജീരിയ" #. 558 msgid "Nicaragua" msgstr "നിക്കരാഗ്വ" #. 528 msgid "Netherlands" msgstr "നെതര്‍ലാന്റ്സ് ( ഹോളണ്ട് )" #. 578 msgid "Norway" msgstr "നോർവെ" #. 524 msgid "Nepal" msgstr "നേപ്പാള്‍" #. 520 msgid "Nauru" msgstr "നൌറു" #. 570 msgid "Niue" msgstr "നിയൂ" #. 554 msgid "New Zealand" msgstr "ന്യൂസീലൻഡ്" #. 512 msgid "Oman" msgstr "ഒമാന്‍" #. 591 msgid "Panama" msgstr "പനാമ" #. 604 msgid "Peru" msgstr "പെറു" #. 258 msgid "French Polynesia" msgstr "ഫ്രഞ്ച് പോളിനേഷ്യ" #. 598 msgid "Papua New Guinea" msgstr "പപുവ ന്യൂ ഗിനിയ" #. 608 msgid "Philippines" msgstr "ഫിലിപ്പീന്‍സ്" #. 586 msgid "Pakistan" msgstr "പാക്കിസ്ഥാന്‍" #. 616 msgid "Poland" msgstr "പോളണ്ട്" #. 666 msgid "Saint Pierre and Miquelon" msgstr "സെയിന്റ് പിയറി ആന്‍ഡ് മിക്വിലണ്‍" #. 612 msgid "Pitcairn" msgstr "പിറ്റ്കെയിന്‍" #. 630 msgid "Puerto Rico" msgstr "പ്യൂര്‍ട്ടോ റികോ" #. 275 msgid "Palestinian Territory, Occupied" msgstr "പാലസ്തീന്‍" #. 620 msgid "Portugal" msgstr "പോ‌ര്‍ച്ചുഗല്‍" #. 585 msgid "Palau" msgstr "പലാവു" #. 600 msgid "Paraguay" msgstr "പരാഗ്വെ" #. 634 msgid "Qatar" msgstr "ഖത്ത‌ര്‍‍" #. 638 msgid "Reunion" msgstr "റീയൂണിയന്‍" #. 642 msgid "Romania" msgstr "റൊമേനിയ" #. 688 msgid "Serbia" msgstr "സെർബിയ" #. 643 msgid "Russian Federation" msgstr "റഷ്യന്‍ ഫെഡറേഷന്‍" #. 646 msgid "Rwanda" msgstr "റുവാണ്ട" #. 682 msgid "Saudi Arabia" msgstr "സൗദി അറേബ്യ" #. 090 msgid "Solomon Islands" msgstr "സോളമൻ ദ്വീപുകൾ" #. 690 msgid "Seychelles" msgstr "സെയ്‌ഷെൽസ്" #. 736 msgid "Sudan" msgstr "സുഡാൻ" #. 752 msgid "Sweden" msgstr "സ്വീഡൻ" #. 702 msgid "Singapore" msgstr "സിംഗപ്പൂർ" #. 654 msgid "Saint Helena" msgstr "സെയിന്റ് ഹെലേന" #. 705 msgid "Slovenia" msgstr "സ്ലോവേനിയ" #. 744 msgid "Svalbard and Jan Mayen" msgstr "സ്വാല്‍ബാര്‍ഡും ജാന്‍ മായെനും" #. 703 msgid "Slovakia" msgstr "സ്ലോവാക്ക്യ" #. 694 msgid "Sierra Leone" msgstr "സിയറ ലിയോണ്‍" #. 674 msgid "San Marino" msgstr "സാന്‍ മരീനൊ" #. 686 msgid "Senegal" msgstr "സെനഗല്‍" #. 706 msgid "Somalia" msgstr "സോമാലിയ" #. 740 msgid "Suriname" msgstr "സുരിനാം" #. 728 msgid "South Sudan" msgstr "തെക്കന്‍ സുഡാന്‍" #. 678 msgid "Sao Tome and Principe" msgstr "സാവോ ടോമും പ്രിന്‍സിപ്പിയും" #. 222 msgid "El Salvador" msgstr "എൽ സാൽവദോർ" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "സെന്റ് മാര്‍ട്ടിന്‍ (ഡച്ച്)" #. 760 msgid "Syrian Arab Republic" msgstr "സിറിയന്‍ അറബ് റിപ്പബ്ലിക്" #. 748 msgid "Swaziland" msgstr "സ്വാസിലാന്റ്" #. 796 msgid "Turks and Caicos Islands" msgstr "ടർക്സ്-കൈകോസ് ദ്വീപുകൾ" #. 148 msgid "Chad" msgstr "ഛാഡ്" #. 260 msgid "French Southern Territories" msgstr "ഫ്രഞ്ച് തെക്കന്‍ പ്രദേശങ്ങള്‍" #. 768 msgid "Togo" msgstr "ടോഗോ" #. 764 msgid "Thailand" msgstr "തായ്‌ലാന്റ്" #. 762 msgid "Tajikistan" msgstr "താജിക്കിസ്ഥാന്‍" #. 772 msgid "Tokelau" msgstr "ടോക്‌ലവ്" #. 626 msgid "Timor-Leste" msgstr "ടിമോര്‍-ലെസ്ത്തേ" #. 795 msgid "Turkmenistan" msgstr "തുര്‍ക്‌മേനിസ്ഥാന്‍" #. 788 msgid "Tunisia" msgstr "ടുണീഷ്യ" #. 776 msgid "Tonga" msgstr "ടോംഗ" #. 792 msgid "Turkey" msgstr "തുർക്കി" #. 780 msgid "Trinidad and Tobago" msgstr "ട്രിനിഡാഡും ടൊബാഗോയും" #. 798 msgid "Tuvalu" msgstr "ടുവാലു" #. 158 msgid "Taiwan, Province of China" msgstr "തായ്‌വാന്‍" #. 834 msgid "Tanzania, United Republic of" msgstr "ടാന്‍സാനിയ" #. 804 msgid "Ukraine" msgstr "യുക്രെയിൻ" #. 800 msgid "Uganda" msgstr "ഉഗാണ്ട" #. 581 msgid "United States Minor Outlying Islands" msgstr "യുണൈറ്റഡ് സ്റ്റേറ്റ്സിലെ പുറത്തു് കിടക്കുന്ന ചെറിയ ദ്വീപുകള്‍" #. 840 msgid "United States" msgstr "ആമേരിക്കന്‍ ഐക്യനാടുകള്‍" #. 858 msgid "Uruguay" msgstr "ഉറുഗ്വേ" #. 860 msgid "Uzbekistan" msgstr "ഉസ്ബെക്കിസ്ഥാൻ" #. 336 msgid "Holy See (Vatican City State)" msgstr "വത്തിക്കാന്‍" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "സെയിന്റ് വിന്സന്റും ഗ്രനഡൈന്സും" #. 862 msgid "Venezuela" msgstr "വെനിസ്വേല" #. 092 msgid "Virgin Islands, British" msgstr "ബ്രിട്ടീഷ് വിര്‍ജിന്‍ ദ്വീപുകള്‍" #. 850 msgid "Virgin Islands, U.S." msgstr "യു.എസ്. വിര്‍ജിന്‍ ദ്വീപുകള്‍" #. 704 msgid "Viet Nam" msgstr "വിയറ്റ്നാം" #. 548 msgid "Vanuatu" msgstr "വാന്വാട്ടു" #. 876 msgid "Wallis and Futuna" msgstr "വോളിസ് ആന്റ് ഫുട്ടാന" #. 882 msgid "Samoa" msgstr "സമോവ" #. 887 msgid "Yemen" msgstr "യെമൻ" #. 175 msgid "Mayotte" msgstr "മയോട്ടെ" #. 710 msgid "South Africa" msgstr "ദക്ഷിണാഫ്രിക്ക‌" #. 894 msgid "Zambia" msgstr "സാംബിയ" #. 716 msgid "Zimbabwe" msgstr "സിംബാബ്‌വെ" msgid "* Unknown, add is_in tags to those cities" msgstr "* അറിയില്ല, ദയവായി is_in ടാഗ് സിറ്റികളില്‍ ചേര്‍ക്കുക" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "കോണ്‍ഫിഗറേഷന്‍ ഫയലുകള്‍ (navit.xml, navit.xml.local) കാണുന്നില്ല\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "'%s': %s കോണ്‍ഫിഗറേഷന്‍ ഫയല്‍ വായിക്കത്തില്ല \\n\n" #, c-format msgid "Using config file '%s'\n" msgstr "%s കോണ്‍ഫിഗറേഷന്‍ ഫയല്‍ ഉപയോഗിക്കുന്നു.\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "'%s' കോണ്‍ഫിഗറേഷന്‍ ഫയലില്‍ വിവരങ്ങള്‍ ലഭ്യമല്ല\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "പിഴവ് സംഭവിച്ചു. നിര്‍ത്തുന്നു. ദയവായ് മുന് സന്ദേശങ്ങള്‍ പരിശോധിക്കുക\n" msgid "unknown street" msgstr "പേരില്ലാത്ത തെരുവ്" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "പേരില്ലാത്ത വാഹനം" msgid "Failed to write bookmarks file" msgstr "ബൂക്ക്മാര്‍ക്ക് എഴുതാന്‍ പറ്റുന്നില്ലാ" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "ഭൂപടസ്ഥാനം" msgid "Car" msgstr "കാര്‍" msgid "Iso2" msgstr "ഐ എസ് ഓ 2 (ISO2)" msgid "Iso3" msgstr "ഐ. എസ്. ഒ 3" msgid "Country" msgstr "രാജ്യം" msgid "Postal" msgstr "തപാല്‍" msgid "Town" msgstr "പട്ടണം" msgid "District" msgstr "ജില്ല" msgid "Street" msgstr "തെരുവ്" msgid "Number" msgstr "അക്കം" msgid "Enter Destination" msgstr "ഉദ്ദിഷ്ടസ്ഥാനം ചേര്‍ക്കുക" msgid "Zip Code" msgstr "പിന്‍ കോഡ്" msgid "City" msgstr "നഗരം" msgid "District/Township" msgstr "ജില്ല/ടൗണ്ഷിപ്പ്" msgid "Map" msgstr "മാപ്പ്" msgid "Bookmark" msgstr "സൂചിതസ്ഥാനം(bookmark)" msgid "Destination" msgstr "ലക്ഷ്യസ്ഥാനം" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "പ്രദര്‍ശനം" msgid "_Route" msgstr "വഴി" msgid "_Former Destinations" msgstr "മുന്‍ ഉദ്ദിഷ്ട സ്ഥാനങ്ങള്‍" msgid "_Bookmarks" msgstr "_ഓര്‍മ്മക്കുറിപ്പുകള്‍" msgid "_Map" msgstr "_ഭൂപടം" msgid "_Layout" msgstr "_ക്രമീകരണം" msgid "_Projection" msgstr "_പ്രൊജക്ഷന്‍" msgid "_Vehicle" msgstr "‌‌‌_വാഹനം" msgid "Zoom_Out" msgstr "ചെറുതാക്കുക" msgid "Decrease zoom level" msgstr "ചെറുതാക്കുക" msgid "Zoom_In" msgstr "വലുതാക്കുക" msgid "Increase zoom level" msgstr "വലുതാക്കുക" msgid "_Recalculate" msgstr "_വീണ്ടും കണക്കാക്കുക" msgid "Redraw map" msgstr "മാപ് വീണ്ടും വരക്കുക" msgid "_Info" msgstr "വിവരം (_I)" msgid "Set _destination" msgstr "ലക്ഷ്യസ്ഥാനം ഉറപ്പിക്കുക" msgid "Opens address search dialog" msgstr "മേല്‍വിലാസം തിരയാന്‍ തുറക്കുക" msgid "_POI search" msgstr "_സ്ഥലങ്ങള്‍ തിരയുക" msgid "Opens POI search dialog" msgstr "സ്ഥലങ്ങള്‍ തിരയാനുള്ള താള്‍ തുറക്കുക" msgid "_Stop Navigation" msgstr "_വഴികാട്ടി നിറുത്തുക" msgid "Test" msgstr "പരീക്ഷണം" msgid "_Quit" msgstr "പുറത്ത് കടക്കുക" msgid "Quit the application" msgstr "നാവിറ്റില്‍ നിന്ന് പുറത്ത് പോവുക" msgid "Show position _cursor" msgstr "സ്ഥാനം കാണിക്കുക" msgid "_Lock on Road" msgstr "വീഥിയില്‍ നിറുത്തുക" msgid "_Keep orientation to the North" msgstr "വടക്കോട്ട് ദര്‍ശനം" msgid "Switches map orientation to the north or the vehicle" msgstr "വടക്കോട്ട് ദര്‍ശനം/സഞ്ചാര ദിശ" msgid "_Roadbook" msgstr "_ഭൂപടപുസ്തകം" msgid "Show/hide route description" msgstr "വഴി വിവരണം കാണിക്കുക/മറക്കുക" msgid "_Autozoom" msgstr "ശരിയായ വലിപ്പം തന്നത്താന്‍ കണക്കാക്കുക" msgid "Enable/disable automatic zoom level changing" msgstr "തന്നത്താന്‍ വലിപ്പം അനുവദിക്കുക/നിരസിക്കുക" msgid "_Fullscreen" msgstr "സ്ക്രീന്‍ പൂര്‍ണ്ണ വലിപ്പത്തില്‍ (_F)" msgid "Data" msgstr "വിവരങ്ങള്‍" msgid "Pharmacy" msgstr "മരുന്നു കട" msgid "Restaurant" msgstr "ഹോട്ടല്‍" msgid "Restaurant. Fast food" msgstr "തട്ടുകട" msgid "Hotel" msgstr "ഹോട്ടല്‍" msgid "Car parking" msgstr "കാര്‍ പാര്‍ക്കിങ്ങ്" msgid "Fuel station" msgstr "പെട്രോള്‍ പമ്പ്" msgid "Bank" msgstr "ബാങ്ക്" msgid "Hospital" msgstr "ആശുപത്രി" msgid "Cinema" msgstr "സിനിമ തിയറ്റര്‍" msgid "Train station" msgstr "റയില്‍വെ സ്ടേഷന്‍" msgid "School" msgstr "സ്കൂള്‍" msgid "Police" msgstr "പോലീസ് സ്ടേഷന്‍" msgid "Justice" msgstr "കോടതി" msgid "Taxi" msgstr "ടാക്സി സ്റ്റാന്റ്" msgid "Shopping" msgstr "കച്ചവടസ്ഥാപനം" msgid "Distance from screen center (km)" msgstr "സ്ക്രീനിന്റെ നടുവില്‍ നിന്നുള്ള ദൂരം (കി. മി. )" #, c-format msgid "POI %s. %s" msgstr "പി. ഓ. ഐ (ഇഷ്ടപെട്ട സ്ഥലങ്ങള്‍) %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "%ld, %ld ലക്ഷ്യസ്ഥാനമാക്കുക \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "%ld, %ld -നെ മാപ്പില്‍ ക്രമീകരിക്കുക \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "%ld, %ld നെ അടുത്ത ലക്ഷ്യമാക്കുക \n" msgid "POI search" msgstr "സ്ഥലങ്ങള്‍ (POI) തിരയുക" msgid "Select a category" msgstr "ഒരു വിഭാഗം തെരഞ്ഞെടുക്കുക" msgid "Select a distance to look for (km)" msgstr "ഇത്ര ദൂരത്തിനുള്ളില്‍ തെരയുക" msgid "Select a POI" msgstr "സ്ഥലങ്ങള്‍ (POI) തിരഞ്ഞെടുക്കുക" msgid " " msgstr " " msgid "Category" msgstr "വിഭാഗങ്ങള്‍" msgid "Direction" msgstr "ദിശ" msgid "Distance(m)" msgstr "ദൂരം" msgid "Name" msgstr "പേരു്" msgid "Visit Before" msgstr "ഉദ്ദിഷ്ടസ്ഥാനത്തിന് മുന്പ് സന്ദര്‍ശിക്കുക" msgid "N" msgstr "വടക്ക് (N)" msgid "NE" msgstr "വടക്കുകിഴക്കു്" msgid "E" msgstr "കിഴക്ക് (E)" msgid "SE" msgstr "തെക്കുകിഴക്കു്" msgid "S" msgstr "തെക്ക് (S)" msgid "SW" msgstr "തെക്കുപടിഞ്ഞാറു്" msgid "W" msgstr "പടിഞ്ഞാറ് (W)" msgid "NW" msgstr "വടക്കുപടിഞ്ഞാറു്" #. Android resource: @strings/no msgid "No" msgstr "വേണ്ട" msgid "2D" msgstr "ദ്വിമാനം" msgid "3D" msgstr "ത്രിമാനം" msgid "OT" msgstr "ഓ റ്റി" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "%4.0f കി.മി ദൂരം %02d:%02d സമയത്ത് എത്തും" msgid "Route 0000km 0+00:00 ETA" msgstr "0000km ദൂരം 0+00:00 സമയത്ത് എത്തും" msgid "Help" msgstr "സഹായം" #, c-format msgid "Waypoint %s" msgstr "%s വഴിത്തിരിവ്" msgid "Select waypoint to insert the new one before" msgstr "പുതിയവഴിതിരിവിന്റെ സ്ഥാനം (മുന്പില്‍)" msgid "View in Browser" msgstr "ബ്രൌസരില്‍ കാണുക" msgid "Item type" msgstr "ഇന വിവരം" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "തെരുവ്" msgid "House numbers" msgstr "വീട്ട് നമ്പര്‍" msgid "View Attributes" msgstr "ആട്രിബ്യൂട്ടുകള്‍" msgid "Set as position (and deactivate vehicle)" msgstr "സ്ഥാനമായ് ക്രമീകരിക്കുക (വാഹനം നിര്‍ജീവമാക്കുക)" msgid "POIs" msgstr "സ്ഥലങ്ങള്‍ (POIs)" msgid "View on map" msgstr "ഭൂപടത്തില്‍ കാണുക" msgid "Remove search results from the map" msgstr "ഭൂപടത്തില്‍ നിന്നും തെരച്ചില്‍ ഫലങ്ങള്‍ കളയുക" msgid "Show results on the map" msgstr "തിരച്ചില്‍ ഫലങ്ങള്‍ ഭൂപടത്തില്‍ കാണിക്കുക" msgid "Cut Bookmark" msgstr "ബുക്ക്മാര്‍ക്ക് കട്ട് ചെയ്യുക" msgid "Copy Bookmark" msgstr "ബുക്ക്മാര്‍ക്ക് കട്ട് ചെയ്യുക" msgid "Rename Bookmark" msgstr "അടയാളക്കുറിപ്പിന്റെ പേരു് മാറ്റുക" msgid "Paste Bookmark" msgstr "ബുക്ക്മാര്‍ക്ക് പേസ്റ്റ് ചെയ്യുക" msgid "Delete Bookmark" msgstr "അടയാളക്കുറിപ്പ് നീക്കം ചെയ്യുക" msgid "Delete waypoint" msgstr "വഴിത്തിരിവ് കളയുക" msgid "Bookmarks" msgstr "അടയാളക്കുറിപ്പുകള്‍" msgid "Bookmarks as waypoints" msgstr "വഴിതിരിവായി ബുക്ക്മാര്‍ക്ക് ചെയ്യുക" msgid "Save waypoints" msgstr "വഴിതിരിവ് സൂക്ഷിച്ചു വക്കുക" msgid "Replace with waypoints" msgstr "വഴിത്തിരിവുപയോഗിച്ച് മാറ്റുക" msgid "Delete Folder" msgstr "ഫോള്‍ഡര്‍ വെട്ടി മാറ്റുക" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "ബുക്ക്മാര്‍ക്ക് ഫോള്‍ഡര്‍ ചേര്‍ക്കുക" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "ബുക്ക്മാര്‍ക്ക് പേസ്റ്റ് ചെയ്യുക" #, c-format msgid "Bookmark %s" msgstr "അടയാളക്കുറിപ്പുകള്‍ %s" #, c-format msgid "Download %s" msgstr "%s ഡൗണ്‍ലോഡ് ചെയ്യുക" msgid "Map Download" msgstr "ഭൂപടം ഡൗണ്‍ലോഡ് ചെയ്യുക" msgid "Active" msgstr "സജ്ജമാണ്" msgid "Download Enabled" msgstr "ഡൗണ്‍ലോഡ് അനുവദിച്ചിരിക്കുന്നു" msgid "Download completely" msgstr "മുഴുവന്‍ ഡൗണ്‍ലോഡ് ചെയ്യുക" msgid "Show Satellite Status" msgstr "ഉപഗ്രഹ നിലവാരം കാണിക്കുക" msgid " Elevation " msgstr " ഉയരം " msgid " Azimuth " msgstr " ഉയരം " msgid "Show NMEA Data" msgstr "NMEA വിവരം കാണുക" msgid "car" msgstr "കാര്‍" msgid "bike" msgstr "ബൈക്ക്" msgid "pedestrian" msgstr "കാല്‍നടയാത്രക്കാരന്‍" #, c-format msgid "Current profile: %s" msgstr "നിലവിലെ പ്രോഫൈല്‍ : %s" #, c-format msgid "Change profile to: %s" msgstr "%s ലേക്ക് പ്രൊഫൈല്‍ മാറ്റുക" msgid "Set as active" msgstr "സജീവമാക്കുക" msgid "Show Satellite status" msgstr "ഉപഗ്രഹ നിലവാരം കാണിക്കുക" msgid "Show NMEA data" msgstr "എന്‍. എം. ഇ. ഏ (NMEA) വിവരങ്ങള്‍" msgid "Add Bookmark" msgstr "അടയാളക്കുറിപ്പു് ചേര്‍ക്കുക" msgid "Rename" msgstr "പേരു് മാറ്റുക" msgid "About Navit" msgstr "നാവിറ്റിനെ കുറിച്ച്" #. Authors msgid "By" msgstr "എഴുത്തുകാര്‍" #. Contributors msgid "And all the Navit Team" msgstr "നാവിറ്റിന്റെ ടീം" msgid "members and contributors." msgstr "അംഗങ്ങള്‍, സഹകാരികാള്‍" msgid "Waypoints" msgstr "വഴിത്തിരിവുകള്‍" msgid "Enter Coordinates" msgstr "കോഓര്‍ഡിനേറ്റുകള്‍ ചേര്‍ക്കുക" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "അക്ഷാംശം രേകാംശം" msgid "Enter coordinates, for example:" msgstr "കോഓര്‍ഡിനേറ്റുകള്‍ ചേര്‍ക്കുക, ഉദാഹരണം" msgid "Vehicle" msgstr "വാഹനം" msgid "Rules" msgstr "നിയമങ്ങള്‍" msgid "Lock on road" msgstr "പാതയില്‍ തന്നെ നിര്‍ത്തുക" msgid "Northing" msgstr "വടക്കോട്ട് ദര്‍ശനം" msgid "Map follows Vehicle" msgstr "വാഹനത്തോടൊപ്പം സഞ്ചരിക്കുക" msgid "Plan with Waypoints" msgstr "വഴിത്തിരിവുകളോടെ പ്ളാന്‍ ചെയ്യുക" msgid "Maps" msgstr "ഭൂപടങ്ങള്‍" msgid "Layout" msgstr "വിന്യാസം" msgid "Height Profile" msgstr "ഉയര വിവരങ്ങള്‍" msgid "Route Description" msgstr "പാത വിവരണം" msgid "Show Locale" msgstr "ഭാഷ വിവരം" msgid "Former Destinations" msgstr "മുന്‍ ലക്ഷ്യസ്ഥാനങ്ങള്‍" msgid "- No former destinations available -" msgstr "- മുന്‍ ലക്ഷ്യസ്ഥാനങ്ങള്‍ സജ്ജീകരിച്ചിട്ടില്ല -" msgid "Message" msgstr "സന്ദേശം" msgid "Back" msgstr "പിന്നോട്ട്" msgid "Back to map" msgstr "ഭൂപടത്തിലോട്ട് തിരിച്ചു പോവുക" msgid "Main Menu" msgstr "പ്രധാന പട്ടിക" msgid "House number" msgstr "വീട്ടു നംബര്‍" msgid "Next" msgstr "അടുത്തത്" msgid "Prev" msgstr "പുറകോട്ട്" msgid "Return to route!" msgstr "പാതയിലോട്ട് തിരിച്ചു പോവുക" #. warning told msgid "Look out! Camera!" msgstr "സ്പീഡ് ക്യാമറ : ശ്രദ്ധിക്കുക" #. warning told msgid "Please decrease your speed" msgstr "ദയവായി വേഗത കുറക്കുക" msgid "partial match" msgstr "ഭാഗിക പൊരുത്തം" #. Android resource: @strings/address_search_button msgid "Search" msgstr "തിരയുക" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "പട്ടണങ്ങള്‍" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "ഇവിടെ വരെയുള്ള വഴി കാട്ടുക" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "ഭൂപട വിവരങ്ങള്‍ (3) ഓപ്പണ്‍സ്റ്റ്രീറ്റ് മാപ്" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "ഡൗണ്‍ലോഡ് ചെയ്ത ഭൂപടങ്ങള്‍" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "റദ്ദാക്കുക" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "ഭൂലോകം മുഴുവന്‍" msgid "Africa" msgstr "ആഫ്രിക്ക" msgid "Canary Islands" msgstr "കാനറി ഐലന്‍ഡുകള്‍" msgid "Asia" msgstr "ഏഷ്യ" msgid "Korea" msgstr "കൊറിയ" msgid "Taiwan" msgstr "തായ്‌വാൻ" msgid "UAE+Other" msgstr "യൂ ഏ ഈ" msgid "Oceania" msgstr "ഓഷ്യാനിയ" msgid "Tasmania" msgstr "ടാസ്മാനിയ" msgid "Victoria" msgstr "വിക്ടോറിയ" msgid "New South Wales" msgstr "ന്യൂ സൌത്ത് വേയില്‍സ്" msgid "Europe" msgstr "യൂറോപ്പ്" msgid "Western Europe" msgstr "പടിഞ്ഞാറന്‍ യൂറോപ്പ്" msgid "Azores" msgstr "ആസൊറെസ്" msgid "BeNeLux" msgstr "ബെനെലക്സ്" msgid "Alsace" msgstr "അല്‍സേസ്" msgid "Aquitaine" msgstr "അക്വിറ്റയിന്‍" msgid "Auvergne" msgstr "ഓവെര്‍ണെ" msgid "Basse-Normandie" msgstr "ബസ്സെ-നോര്‍മന്ഡി" msgid "Bourgogne" msgstr "ബുര്‍ഗോണേ" msgid "Bretagne" msgstr "ബ്രെട്ടാനെ" msgid "Centre" msgstr "നടുവില്‍" msgid "Champagne-Ardenne" msgstr "ഷാംപേന്-ആര്ഡെന്നെ" msgid "Corse" msgstr "കോര്‍സ്" msgid "Franche-Comte" msgstr "ഫ്രെഞ്ചു - കോമ്തെ" msgid "Haute-Normandie" msgstr "ഹോടെ- നോര്‍മന്ഡി" msgid "Ile-de-France" msgstr "ഐല്‍-ഡെ-ഫ്രന്‍സ്" msgid "Languedoc-Roussillon" msgstr "ലാങ്ങ്യുഡോക് - റോസ്സില്ലന്‍" msgid "Limousin" msgstr "ലിമോസിന്‍" msgid "Lorraine" msgstr "ലൊറൈന്‍" msgid "Midi-Pyrenees" msgstr "മിഡി-പൈറെന്നീസ് - ഫ്രാന്‍സ്" msgid "Nord-pas-de-Calais" msgstr "നോഡ്-പാസ്-ഡെ-കലായിസ്" msgid "Pays-de-la-Loire" msgstr "പെയ്സ്-ഡെ-ല-ലോയ്ര്‍" msgid "Picardie" msgstr "പിക്കാര്‍ഡീ" msgid "Poitou-Charentes" msgstr "പോയിറ്റൂ-ചരന്റിസ്" msgid "Provence-Alpes-Cote-d-Azur" msgstr "കോടെ-ഡെ-അസുര്‍" msgid "Rhone-Alpes" msgstr "റോണെ - ആല്പ്സ് (ലിയോണ്‍) ഫ്രാന്‍സ്" msgid "Baden-Wuerttemberg" msgstr "ബഡേന്‍ - വറ്റന്ബര്‍ഗ് - ഫ്രാന്‍സ്" msgid "Bayern" msgstr "ബയെണ്" msgid "Mittelfranken" msgstr "മിറ്റല്‍ഫ്രാങ്കെന്‍" msgid "Niederbayern" msgstr "നീഡെര്‍ബയേര്‍ണ്" msgid "Oberbayern" msgstr "ഓബെര്ബയെണ്" msgid "Oberfranken" msgstr "ഓബെര്‍ഫ്രാങ്കെന്‍" msgid "Oberpfalz" msgstr "ഓബെര്‍ഫാല്‍സ്" msgid "Schwaben" msgstr "ഷ്വബെന്‍" msgid "Unterfranken" msgstr "അന്റെര്ഫ്രാങ്കെന്‍" msgid "Berlin" msgstr "ബെര്‍ലിന്‍" msgid "Brandenburg" msgstr "ബ്രാണ്ടന്‍ബര്‍ഗ്" msgid "Bremen" msgstr "ബ്രെമെന്‍" msgid "Hamburg" msgstr "ഹാംബര്‍ഗ്" msgid "Hessen" msgstr "ഹെസ്സെന്‍" msgid "Mecklenburg-Vorpommern" msgstr "മെകലന്ബര്‍ഗ്-വൊര്പോമ്മെന്‍" msgid "Niedersachsen" msgstr "നീദെര്‍സാച്സെന്‍" msgid "Nordrhein-westfalen" msgstr "നോര്ദീന്-വെസ്റ്റ്ഫാളന്‍" msgid "Rheinland-Pfalz" msgstr "റീന്‍ലാന്റ് -ഫാല്സ്" msgid "Saarland" msgstr "സാര്‍ലാന്റ്" msgid "Sachsen-Anhalt" msgstr "സാച്സെന്‍-ആന്‍ഹാല്ട്" msgid "Sachsen" msgstr "സാഷേന്‍" msgid "Schleswig-Holstein" msgstr "ഷെല്‍സ്വിഗ്-ഹോള്‍സ്റ്റീന്‍" msgid "Thueringen" msgstr "തുരിങ്ങ്ജെന്‍" msgid "Mallorca" msgstr "മല്ലൊര്‍ക്കാ" msgid "Galicia" msgstr "ഗലീസ്യ" msgid "Scandinavia" msgstr "സ്കാന്ഡിനേവിയ" msgid "England" msgstr "ഇംഗ്ലന്ഡ്" msgid "Buckinghamshire" msgstr "ബക്കിങ്ഹാംഷയര്‍" msgid "Cambridgeshire" msgstr "കേംബ്രിഡ്ജ്ഷയര്‍" msgid "Cumbria" msgstr "കംബ്രീയ - ഇംഗ്ലണ്ട്" msgid "East yorkshire with hull" msgstr "കിഴക്കന്‍ യോര്‍ക്ക്ഷെയര്‍" msgid "Essex" msgstr "എസ്സെക്സ്" msgid "Herefordshire" msgstr "ഹെര്‍ഫോര്‍ഡ്ഷയര്‍" msgid "Kent" msgstr "കെന്റ്" msgid "Lancashire" msgstr "ലാങ്കാഷയര്‍" msgid "Leicestershire" msgstr "ലീസസ്റ്റര്‍ഷയര്‍" msgid "Norfolk" msgstr "നോര്‍ഫോക്ക്" msgid "Nottinghamshire" msgstr "നോട്ടിങ്ഹാംഷയര്‍" msgid "Oxfordshire" msgstr "ഓക്സ്‌ഫോര്‍ഡ്ഷയര്‍" msgid "Shropshire" msgstr "ഷ്രോപ്പ്ഷയര്‍" msgid "Somerset" msgstr "സോമര്‍സെറ്റ്" msgid "South yorkshire" msgstr "തെക്കന്‍ യോര്‍ക്ക്ഷെയര്‍" msgid "Suffolk" msgstr "സഫോക്ക്" msgid "Surrey" msgstr "സറ്‌റേ" msgid "Wiltshire" msgstr "വില്‍റ്റ്ഷെയര്‍" msgid "Scotland" msgstr "സ്കോട്ട്‌ലന്റ്" msgid "Wales" msgstr "വെയില്‍സ്" msgid "Crete" msgstr "ക്രീറ്റ്" msgid "North America" msgstr "വടക്കേ അമേരിക്ക" msgid "Alaska" msgstr "അലാസ്ക" msgid "Hawaii" msgstr "ഹവായ്" msgid "USA" msgstr "അമേരിക്കന്‍ ഐക്യനാടുകള്‍" msgid " (except Alaska and Hawaii)" msgstr " (ആലസ്കായും ഹവായിയും ഒഴുകെ" msgid "Midwest" msgstr "മിഡ്-വെസ്ട് (അമേരിക്ക)" msgid "Michigan" msgstr "മിഷിഗന്‍" msgid "Ohio" msgstr "ഓഹായോ" msgid "Northeast" msgstr "വടക്കുകിഴക്കു്" msgid "Massachusetts" msgstr "മാസ്സാച്ചുസെറ്റ്സ്" msgid "Vermont" msgstr "വെര്‍മോണ്ട്" msgid "Pacific" msgstr "പസഫിക്" msgid "South" msgstr "തെക്ക്" msgid "Arkansas" msgstr "അര്‍ക്കന്‍സാസ്" msgid "District of Columbia" msgstr "ഡിസ്ട്രിക്റ്റ് ഓഫ് കൊളംബിയ" msgid "Florida" msgstr "ഫ്ലോറിഡ" msgid "Louisiana" msgstr "ലൂസിയാനാ" msgid "Maryland" msgstr "മേരീലാന്റ്" msgid "Mississippi" msgstr "മിസ്സിസ്സിപ്പി" msgid "Oklahoma" msgstr "ഓക്ക്ലഹാമ" msgid "Texas" msgstr "ടെക്സാസ്" msgid "Virginia" msgstr "വിര്‍ജീനിയ" msgid "West Virginia" msgstr "വെസ്റ്റ് വിര്‍ജീനിയ" msgid "West" msgstr "പടിഞ്ഞാറ്" msgid "Arizona" msgstr "അരിസോണ" msgid "California" msgstr "കാലിഫോര്‍ണിയ" msgid "Colorado" msgstr "കൊളറാഡോ" msgid "Idaho" msgstr "ഇഡാഹോ" msgid "Montana" msgstr "മൊണ്ടാന" msgid "New Mexico" msgstr "ന്യൂ മെക്സിക്കോ" msgid "Nevada" msgstr "നെവാഡ" msgid "Oregon" msgstr "ഒറിഗണ്‍" msgid "Utah" msgstr "യൂട്ട" msgid "Washington State" msgstr "വാഷിംഗ്ടണ്‍" msgid "South+Middle America" msgstr "തെക്ക്-മധ്യ അമേരിക്ക" msgid "Guyane Francaise" msgstr "ഫ്രെന്ജ് ഗയാന" msgid "downloading" msgstr "ഡൌണ്‍ലോഡ്‌ ചെയ്തുകൊണ്ടിരിക്കുന്നു" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "തയ്യാര്‍" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "ആവശ്യത്തിന് സ്ഥലമില്ലാ" msgid "Error downloading map!" msgstr "ഭൂപടം ഡൗണ്‍ലോഡ് ചെയ്തപ്പോള്‍ തെറ്റിപ്പോയ് !" msgid "Error writing map!" msgstr "ഫയല്‍ (ഭൂപടം) എഴുതാന്‍ സ്ഥലമില്ലാ" msgid "Map download aborted!" msgstr "ഭൂപടം ഡൗണ്‍ലോഡ് ചെയ്യുന്നത് നിറുത്തിയിരിക്കുന്നു" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "ഉദ്ദിഷ്ടസമയം" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "ഭൂപടം ഡൗണ്‍ലോഡ് ചെയ്യുക" msgid "Vehicle Position" msgstr "വാഹന സ്ഥാനം" msgid "Main menu" msgstr "പ്രധാനവിവരപട്ടിക" msgid "" "Show\n" "Map" msgstr "" "ഭൂപടം\n" "കാണിക്കുക" msgid "Settings" msgstr "സജ്ജീകരണങ്ങള്‍" msgid "Tools" msgstr "ഉപകരണങ്ങള്‍" msgid "Route" msgstr "മാര്‍ഗം" msgid "About" msgstr "വിവരണം" msgid "Quit" msgstr "പുറത്ത് കടക്കുക" msgid "Actions" msgstr "പ്രവര്‍ത്തികള്‍" msgid "" "Former\n" "Destinations" msgstr "" "മുന്‍\n" "ലക്ഷ്യങ്ങള്‍" msgid "Coordinates" msgstr "കോര്‍ഡിനേറ്റുകള്‍" msgid "" "Stop\n" "Navigation" msgstr "" "വഴികാട്ടി\n" "നിര്‍ത്തുക" msgid "Display" msgstr "പ്രദര്‍ശിപ്പിക്കുക" msgid "Fullscreen" msgstr "മുഴുവന്‍ തിരശ്ശീല" msgid "Window Mode" msgstr "വിന്റൊ മോഡ്" msgid "Description" msgstr "വിവരണം" msgid "" "Drop last \n" "Waypoint" msgstr "" "ആവസാന വഴിത്തിരിവു\n" "എടുത്ത് കളയുക" msgid "" "Drop next \n" "Waypoint" msgstr "" "അടുത്ത വഴിത്തിരിവ്\n" "എടുത്തു കളയുക" msgid "Satellite Status" msgstr "ഉപഗ്രഹസ്ഥിതി" msgid "NMEA Data" msgstr "എന്.എം.ഇ.എ വിവരങ്ങള്‍" msgid "car_shortest" msgstr "കാര്‍ - കുറഞ്ഞ ദൂരം" msgid "car_avoid_tolls" msgstr "കാര്‍ ടോള്‍-ഒഴിവാക്കുക" msgid "car_pedantic" msgstr "കാര്‍ (പെഡാന്റിക്ക് മോഡ്)" msgid "horse" msgstr "കുതിര" msgid "Truck" msgstr "ലോറി" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "ശരി" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "നാവിറ്റ് പ്രവര്‍ത്തനം തുടങ്ങിയിരിക്കുന്നു" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "നാവിറ്റ് ഓടിക്കൊണ്ടിരിക്കുന്നു" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "നാവിറ്റിലേക്കു സ്വാഗതം" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "നാവിറ്റ് ഉപയോഗിക്കുന്നതിനു നന്നീ\n" "\n" "തുടങ്ങുവാന്‍ നാവിറ്റ് മെനുവില്‍ നിന്നും ഭൂപടം ഡൗണ്‍ലോഡ് ചെയ്യാനുള്ള ഓപ്ഷ്ന്‍ " "തെരഞ്ഞെടുക്കുക, (ഫയല്‍ വളരെ വലുതായതിനാല്‍ വൈഫൈ \n" "\n" "കണക്ഷന്‍ ഉപയോഗിക്കുന്നത് ഉചിതമായിരിക്കും)\n" "\n" "മാപ് (c) ഓപണ്‍സ്റ്റ്രീറ്റ്മാപ് സഹകാരികള്‍.\n" "\n" "Enjoy Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "ശരി" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "കൂടുതല്‍ വിവരങ്ങള്‍" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "വലുതാക്കുക" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "ചെറുതാക്കുക" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "ഭൂപടങ്ങള്‍ ഡൗണ്‍ലോഡ് ചെയ്യുക" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "പ്രധാനസ്ഥലങ്ങള്‍ കാണിക്കുക" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "നാവിറ്റില്‍ നിന്നും പുറത്ത് പോവുക" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "സൂക്ഷിക്കുക/പുനസ്ഥാപിക്കുക" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "ഈ ഭൂപടം മായിച്ചു കളയുക" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "ഡൗണ്‍ലോഡ് ചെയ്തു കൊണ്ടിരിക്കുന്നു" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "ഭൂപടം ഡൗണ്‍ലോഡ് ചെയ്യുന്നതില്‍ പിഴവ് സംഭവിച്ചു" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "ഭൂപടം ഡൗണ്‍ലോഡ് ചെയ്യുന്നത് അവസാനിപ്പിചിരിക്കുന്നു" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "സ്ഥാനം അറിയില്ല. സ്ഥാനം ഉറപ്പിച ശേഷം വീണ്ടും വരുക" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "നിലവിലെ സ്ഥാനമുള്ള ഭൂപടം" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "മേല്‍വിലാസം തെരയുക" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "ഉദ്ദിഷ്ടസ്ഥാനം ചേര്‍ക്കുക" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "ഭാഗിക ചേര്‍ച്ചയുള്ള മേല്‍വിലാസം" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "തെരഞ്ഞുകൊണ്ടിരിക്കുന്നു..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "മേല്‍വിലാസം കണ്ടുപിടിക്കാനായില്ല" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "തെരഞ്ഞുകൊണ്ടിരിക്കുന്നു" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "തെരച്ചിലിന്റെ ഫലങ്ങള്‍ അവതരിപ്പിക്കുന്നു" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "ഫലമൊന്നും ലഭ്യമായില്ല" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "വാക്കുകള്‍ തന്നിട്ടില്ല" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "ഉദ്ദിഷ്ടസ്ഥാനം ഉരപ്പിച്ചിരിക്കുന്നു :" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "പ്രവര്‍ത്തികള്‍ തെരഞ്ഞെടുക്കുക" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "ഓരു എസ്. ഡി. (SD) കാര്‍ഡ് ഇടുക" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "ബാക്കപ്പ് കോപി എടുത്തുകൊണ്ടിരിക്കുന്നു" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "പുനസ്ഥാപിച്ചു കൊണ്ടിരിക്കുന്നു" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "ബാക്കപ്പ് ഡൈറക്ടറി ഉണ്ടാക്കാന്‍ സാധിക്കുന്നില്ല" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "വിവരങ്ങള്‍ ശരിയായി പകര്‍ത്താന്‍ കഴിഞ്ഞില്ല" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "പകര്‍പ്പൊന്നും കാണ്മാനില്ല" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "പുനസ്ഥാപനം പരാജയപ്പെട്ടു" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "വിവരങ്ങള്‍ സുരക്ഷിതമാക്കിയിരിക്കുന്നു" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "പകര്‍പ്പ് വിജയകരമായി പുനസ്ഥാപിച്ചിരിക്കുന്നു" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "പകര്‍പ്പൊന്നും കാണ്മാനില്ല" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "പുനസ്ഥാപനം പരാജയപ്പെട്ടിരിക്കുന്നു" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "പകര്‍പ്പ് തെരഞ്ഞെടുക്കുക" #. Android resource: @strings/backup msgid "Backup" msgstr "പകര്‍പ്പ് സൂക്ഷിക്കുക" #. Android resource: @strings/restore msgid "Restore" msgstr "പുനഃസ്ഥാപിക്കുക" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "%1$s- ല്‍ റൗണ്ടാനയില്‍ നിന്നും പുറത്തോട്ട് പോവുക %2$s" navit-0.5.0+dfsg.1/po/mn.po.in000066400000000000000000001102261264204753600157230ustar00rootroot00000000000000# Mongolian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Enkhbold https://launchpad.net/~enkhbold-baatar msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-03-11 06:11+0000\n" "Last-Translator: Enkhbold \n" "Language-Team: Mongolian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: mn\n" msgid "Running from source directory\n" msgstr "Эх байгаа сангаас нь ажиллуулах\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "Тохиргоо '%s' to '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "зеротх" msgid "first" msgstr "эхний" msgid "second" msgstr "2 дахь" msgid "third" msgstr "3 дахь" msgid "fourth" msgstr "4 дэх" msgid "fifth" msgstr "5 дэх" msgid "sixth" msgstr "6 дэх" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "зеротх гарах" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/mr.po.in000066400000000000000000001111731264204753600157310ustar00rootroot00000000000000# Marathi translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # nagesh https://launchpad.net/~nageshpachorkar msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2013-02-18 10:23+0000\n" "Last-Translator: nagesh \n" "Language-Team: Marathi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: mr\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' पासून '%s' सेट करतोय\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "शुन्यवा" msgid "first" msgstr "पहिला" msgid "second" msgstr "दुसरा" msgid "third" msgstr "तिसरा" msgid "fourth" msgstr "चौथा" msgid "fifth" msgstr "पाचवा" msgid "sixth" msgstr "सहावा" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "शुन्यवा बाहेर जाण्याचा मार्ग" msgid "first exit" msgstr "पहिला बाहेर जाण्याचा मार्ग" msgid "second exit" msgstr "दुसरा बाहेर जाण्याचा मार्ग" msgid "third exit" msgstr "तिसरा बाहेर जाण्याचा मार्ग" msgid "fourth exit" msgstr "चौथा बाहेर जाण्याचा मार्ग" msgid "fifth exit" msgstr "पाचवा बाहेर जाण्याचा मार्ग" msgid "sixth exit" msgstr "सहावा बाहेर जाण्याचा मार्ग" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/nb.po.in000066400000000000000000001216461264204753600157200ustar00rootroot00000000000000# Norwegian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Kenneth Langdalen https://launchpad.net/~spam-klnetworks # Kurt Nielsen https://launchpad.net/~kurtn-penguins # Michael von Glasow https://launchpad.net/~michael-vonglasow # Skippern https://launchpad.net/~gay-today # Thor H. Johansen https://launchpad.net/~thorhajo # burner https://launchpad.net/~bendik-xplore msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Bendik Brenne \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: nb\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Kjører fra kildemappen\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "setter '%s' til '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullte" msgid "first" msgstr "første" msgid "second" msgstr "andre" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjerde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjette" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullte avkjørsel" msgid "first exit" msgstr "første avkjøring" msgid "second exit" msgstr "andre avkjøring" msgid "third exit" msgstr "tredje avkjøring" msgid "fourth exit" msgstr "fjerde avkjøring" msgid "fifth exit" msgstr "femte avkjøring" msgid "sixth exit" msgstr "sjette avkjøring" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "om %d,%d kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "en kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om en kilometer" msgstr[1] "om %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "ut på akselerasjonsfeltet" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sinn på gaten %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sinn på %s%s%sen" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sinn på %s%s%sa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sin på %s%s%set" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinn på %s" msgid "When possible, please turn around" msgstr "Snu når det er mulig" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Følg veien de neste %s" msgid "Enter the roundabout soon" msgstr "Kjør inn i rundkjøringen snart" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Kjør inn i rundkjøringen %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Forlat rundkjøringen ut %1$s %2$s" msgid "soon" msgstr "snart" msgid "now" msgstr "nå" msgid "then" msgstr "så" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "høyre" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "venstre" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "slakt " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "skarpt " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ta den %1$s veien mot %2$s" #, c-format msgid "after %i roads" msgstr "etter %i avkjøringer" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Sving %1$s til %2$s om %3$s %4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "snu så" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Snu %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "snu så" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Snu %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "følg" msgid "then you have reached your destination." msgstr "så har du nådd ditt reisemål." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Du har nådd ditt reisemål %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Avkjørsel" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisjon" msgid "Command" msgstr "Instruks" msgid "Length" msgstr "Avstand" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tid" msgid "Destination Length" msgstr "Avstand til målet" msgid "Destination Time" msgstr "Tid til målet" msgid "Roadbook" msgstr "Kjørebok" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Sett som posisjon" msgid "Set as destination" msgstr "Sett som reisemål" msgid "Add as bookmark" msgstr "Legg til som bokmerke" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skjermkoordinat: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "De forente arabiske emirater" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "De nederlandske Antillene" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikansk Samoa" #. 040 msgid "Austria" msgstr "Østerrike" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetøya" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Hviterussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyene" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Den demokratiske republikken" #. 140 msgid "Central African Republic" msgstr "Den sentralafrikanske republikk" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Sveits" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbenskysten" #. 184 msgid "Cook Islands" msgstr "Cookøyene" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kapp Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmasøya" #. 196 msgid "Cyprus" msgstr "Kypros" #. 203 msgid "Czech Republic" msgstr "Tsjekkia" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Den dominikanske republikk" #. 012 msgid "Algeria" msgstr "Algerie" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Vest-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøyene (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesia" #. 234 msgid "Faroe Islands" msgstr "Færøyene" #. 250 msgid "France" msgstr "Frankrike" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Fransk Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorial-Guinea" #. 300 msgid "Greece" msgstr "Hellas" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sør-Georgia og Sør-Sandwichøyene" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- og McDonald-øyene" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Det britiske territoriet i Indiahavet" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. 116 msgid "Cambodia" msgstr "Kambodsja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorene" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Nord-Korea" #. 410 msgid "Korea, Republic of" msgstr "Sør-Korea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Caymanøyene" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Fransk del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalløyene" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Burma" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nord-Marianene" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldivene" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ny-Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkøya" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Norge" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua Ny-Guinea" #. 608 msgid "Philippines" msgstr "Filippinene" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairnøyene" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. 090 msgid "Solomon Islands" msgstr "Salomonøyene" #. 690 msgid "Seychelles" msgstr "Seychellene" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé og Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøyene" #. 148 msgid "Chad" msgstr "Tsjad" #. 260 msgid "French Southern Territories" msgstr "De franske sørterritorier" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadsjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Øst-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Tyrkia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "USAs ytre småøyer" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent og Grenadinene" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Jomfruøyene (Storbritannia)" #. 850 msgid "Virgin Islands, U.S." msgstr "Jomfruøyene (USA)" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- og Futunaøyene" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sør-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Ukjent, legg is_in-tagger til de byene." msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartpunkt" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "Sted" msgid "District" msgstr "Distrikt/Kommune" msgid "Street" msgstr "Gate" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Oppgi reisemålet" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "Sted" msgid "District/Township" msgstr "Distrikt/Kommune" msgid "Map" msgstr "Kart" msgid "Bookmark" msgstr "Bokmerke" msgid "Destination" msgstr "Reisemål" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visning" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "Tidligere reisemål" msgid "_Bookmarks" msgstr "Bokmerker" msgid "_Map" msgstr "Kart" msgid "_Layout" msgstr "Utseende" msgid "_Projection" msgstr "Projeksjon" msgid "_Vehicle" msgstr "Kjøretøy" msgid "Zoom_Out" msgstr "Zoom ut" msgid "Decrease zoom level" msgstr "Zoom inn" msgid "Zoom_In" msgstr "Zoom inn" msgid "Increase zoom level" msgstr "Zoom ut" msgid "_Recalculate" msgstr "Omberegn" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stopp navigasjon" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Avslutt" msgid "Quit the application" msgstr "Avslutt applikasjonen" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lås til vei" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Kjørebok" msgid "Show/hide route description" msgstr "Vis/Sjul rutebeskrivelse" msgid "_Autozoom" msgstr "Auto-zoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Fullskjerm" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NØ" msgid "E" msgstr "Ø" msgid "SE" msgstr "SØ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rute %4.0fkm %02d:%02d estimert tid" msgid "Route 0000km 0+00:00 ETA" msgstr "Rute 0000km 0+00:00 estimert tid" msgid "Help" msgstr "Hjelp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Vis i browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gater" msgid "House numbers" msgstr "Husnummer" msgid "View Attributes" msgstr "Vis attributter" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Landemerker" msgid "View on map" msgstr "Vis på kart" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Klipp bokmerke" msgid "Copy Bookmark" msgstr "Kopier bokmerke" msgid "Rename Bookmark" msgstr "Endre navn på bokmerke" msgid "Paste Bookmark" msgstr "Lim inn bokmerke" msgid "Delete Bookmark" msgstr "Slett bokmerke" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bokmerker" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Legg til bokmerke mappe" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Lim inn bokmerke" #, c-format msgid "Bookmark %s" msgstr "Bokmerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vis satelittstatus" msgid " Elevation " msgstr " Høyde over havet " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Vis NMEA-data" msgid "car" msgstr "bil" msgid "bike" msgstr "sykkel" msgid "pedestrian" msgstr "fotgjenger" #, c-format msgid "Current profile: %s" msgstr "Aktiv profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Bytt profil: %s" msgid "Set as active" msgstr "Sett som aktiv" msgid "Show Satellite status" msgstr "Vis satelittstatus" msgid "Show NMEA data" msgstr "Vis NMEA-data" msgid "Add Bookmark" msgstr "Legg til bokmerke" msgid "Rename" msgstr "Bytt navn" msgid "About Navit" msgstr "Om Navit" #. Authors msgid "By" msgstr "Av" #. Contributors msgid "And all the Navit Team" msgstr "Og alle i Navit teamet" msgid "members and contributors." msgstr "medlemmer og bidragsytere." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Kjøretøy" msgid "Rules" msgstr "Regler" msgid "Lock on road" msgstr "Lås til vei" msgid "Northing" msgstr "Hold nord oppover" msgid "Map follows Vehicle" msgstr "Kart følger kjøretøy" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kart" msgid "Layout" msgstr "Utseende" msgid "Height Profile" msgstr "Høydeprofil" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Tidligere reisemål" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Melding" msgid "Back" msgstr "Tilbake" msgid "Back to map" msgstr "Tilbake til kart" msgid "Main Menu" msgstr "Hovedmeny" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Kjøretøysposisjon" msgid "Main menu" msgstr "Hovedmeny" msgid "" "Show\n" "Map" msgstr "" "Vis\n" "kart" msgid "Settings" msgstr "Innstillinger" msgid "Tools" msgstr "Verktøy" msgid "Route" msgstr "Rute" msgid "About" msgstr "Om" msgid "Quit" msgstr "Avslutt" msgid "Actions" msgstr "Handlinger" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Stopp\n" "navigasjon" msgid "Display" msgstr "Visning" msgid "Fullscreen" msgstr "Fullskjerm" msgid "Window Mode" msgstr "Vindusmodus" msgid "Description" msgstr "Beskrivelse" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "hest" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "forlat så rundkjøringen ut %1$s %2$s" navit-0.5.0+dfsg.1/po/nds.po.in000066400000000000000000001222461264204753600161020ustar00rootroot00000000000000# German, Low translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Christian Moll https://launchpad.net/~christian-chrmoll # KaZeR https://launchpad.net/~kazer # Lars Hennig https://launchpad.net/~elhennig # Michael von Glasow https://launchpad.net/~michael-vonglasow # Roadrunner IN https://launchpad.net/~online # Roschkor https://launchpad.net/~bound-one2000 # everyone https://launchpad.net/~anonymus1338 # fred husche https://launchpad.net/~paidmailacc msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: German, Low \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: nds\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Aus dem Quellverzeichins starten\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "%s zu %s setzen\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "diese" msgid "first" msgstr "erste" msgid "second" msgstr "zweite" msgid "third" msgstr "dritte" msgid "fourth" msgstr "vierte" msgid "fifth" msgstr "fünfte" msgid "sixth" msgstr "sechste" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "diese Ausfahrt" msgid "first exit" msgstr "erste Ausfahrt" msgid "second exit" msgstr "zweite Ausfahrt" msgid "third exit" msgstr "dritte Ausfahrt" msgid "fourth exit" msgstr "vierte Ausfahrt" msgid "fifth exit" msgstr "fünfte Ausfahrt" msgid "sixth exit" msgstr "sechste Ausfahrt" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d Meter" #, c-format msgid "in %d meters" msgstr "in %d Metern" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d Kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "in %d %d Kilometern" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ein Kilometer" msgstr[1] "%d Kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in einem Kilometer" msgstr[1] "in %d Kilometern" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "auf die Auffahrt" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sin die Straße %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sin den %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sin die %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sin das %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sin die %s" msgid "When possible, please turn around" msgstr "Wenn möglich, bitte wenden" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Der Straße %s folgen" msgid "Enter the roundabout soon" msgstr "In Kürze in den Kreisverkehr einfahren" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Den Kreisverkehr an der %1$s %2$s verlassen" msgid "soon" msgstr "in Kürze" msgid "now" msgstr "jetzt" msgid "then" msgstr "dann" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "Rechts" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "links" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "einfach " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "straf " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Die %1$s Straße zur %2$s nehmen" #, c-format msgid "after %i roads" msgstr "nach %i Straßen" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "In %3$s %1$s%2$s %4$s abbiegen" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "Dann haben Sie Ihr Ziel erreicht" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Sie haben Ihr Ziel erreicht %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Ausfahrt" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Länge" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Zeit" msgid "Destination Length" msgstr "Fahrstrecke" msgid "Destination Time" msgstr "Fahrzeit" msgid "Roadbook" msgstr "Straßenatlas" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Als Position setzen" msgid "Set as destination" msgstr "Als Ziel setzen" msgid "Add as bookmark" msgstr "Als Lesezeichen hinzufügen" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinaten der Anzeige: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Vereinigte Arabische Emirate" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua und Barbados" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" #. 530 msgid "Netherlands Antilles" msgstr "Niederländische Antillen" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentinien" #. 016 msgid "American Samoa" msgstr "Amerikanisch Samoa" #. 040 msgid "Austria" msgstr "Österreich" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Aserbaidschan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien und Herzegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesch" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Sankt Bartholomäus" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivien" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Insel Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Weißrussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokos Inseln" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Demokratische Republik Kongo" #. 140 msgid "Central African Republic" msgstr "Zentralafrikanische Republik" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Schweiz" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbeinküste" #. 184 msgid "Cook Islands" msgstr "Insel Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Kolumbien" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Weihnachtsinsel" #. 196 msgid "Cyprus" msgstr "Zypern" #. 203 msgid "Czech Republic" msgstr "Tschechische Republik" #. 276 msgid "Germany" msgstr "Deutschland" #. 262 msgid "Djibouti" msgstr "Dschibuti" #. 208 msgid "Denmark" msgstr "Dänemark" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikanische Republik" #. 012 msgid "Algeria" msgstr "Algerien" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Ägypten" #. 732 msgid "Western Sahara" msgstr "Westsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Äthiopien" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fidschi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Inseln" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien" #. 234 msgid "Faroe Islands" msgstr "Färöer Inseln" #. 250 msgid "France" msgstr "Frankreich" #. 266 msgid "Gabon" msgstr "Gabun" #. 826 msgid "United Kingdom" msgstr "Vereinigtes Königreich" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Französisch Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Äquatorial Guinea" #. 300 msgid "Greece" msgstr "Griechenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Südgeorgien und die Südlichen Sandwichinseln" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Insel und die McDonaldinseln" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Britisches Territorium im Indischen Ozean" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Jordanien" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgisien" #. 116 msgid "Cambodia" msgstr "Kambodscha" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoren" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts und Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Nordkorea" #. 410 msgid "Korea, Republic of" msgstr "Südkorea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kaiman-Inseln" #. 398 msgid "Kazakhstan" msgstr "Kasachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Republik Moldau" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "St. Martin" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallinseln" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Mazedonien" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolei" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nord Mariannen Inseln" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediven" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Neukaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkinsel" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Niederlande" #. 578 msgid "Norway" msgstr "Norwegen" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Neuseeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Französisch Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua Neu Guinea" #. 608 msgid "Philippines" msgstr "Phillippinen" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "St.-Pierre und Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairninseln" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palästina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumänien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabien" #. 090 msgid "Solomon Islands" msgstr "Salomonen" #. 690 msgid "Seychelles" msgstr "Seychellen" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Schweden" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slowenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard und Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakei" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrien" #. 748 msgid "Swaziland" msgstr "Swasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- und Caicosinseln" #. 148 msgid "Chad" msgstr "Tschad" #. 260 msgid "French Southern Territories" msgstr "Französische Süd- und Antarktisgebiete" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadschikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Osttimor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türkei" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad und Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tansania" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Amerikanisch-Ozeanien" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstadt" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent und die Grenadinen" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britische Jungferninseln" #. 850 msgid "Virgin Islands, U.S." msgstr "Amerikanische Jungferninseln" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis und Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Südafrika" #. 894 msgid "Zambia" msgstr "Sambia" #. 716 msgid "Zimbabwe" msgstr "Simbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Unbekannt, fügen sie is_in Tags zu diesen Städten hinzu" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartenpunkt" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Postanschrift" msgid "Town" msgstr "Stadt" msgid "District" msgstr "Bezirk" msgid "Street" msgstr "Straße" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Reiseziel eingeben" msgid "Zip Code" msgstr "Postleitzahl" msgid "City" msgstr "Stadt" msgid "District/Township" msgstr "Ortsteil/Gemeinde" msgid "Map" msgstr "Karte" msgid "Bookmark" msgstr "Lesezeichen" msgid "Destination" msgstr "Reiseziel" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Anzeige" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Vorherige Ziele" msgid "_Bookmarks" msgstr "Lesezeichen" msgid "_Map" msgstr "Karte" msgid "_Layout" msgstr "Erscheinungsbild" msgid "_Projection" msgstr "Darstellung" msgid "_Vehicle" msgstr "Fahrzeug" msgid "Zoom_Out" msgstr "Verkleinern" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Vergrößern" msgid "Increase zoom level" msgstr "näher zoomen" msgid "_Recalculate" msgstr "Neu berechnen" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Information" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Navigation beenden" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Beenden" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Auf Straße zeigen" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Straßenatlas" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "automatischer Zoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Vollbild" msgid "Data" msgstr "Daten" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "SO" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nein" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 ETA" msgid "Help" msgstr "Hilfe" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Im Browser anzeigen" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Straßen" msgid "House numbers" msgstr "Hausnummern" msgid "View Attributes" msgstr "Attribute anzeigen" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POI" msgid "View on map" msgstr "Auf der Karte zeigen" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Lesezeichen ausschneiden" msgid "Copy Bookmark" msgstr "Lesezeichen kopieren" msgid "Rename Bookmark" msgstr "Lesezeichen umbenennen" msgid "Paste Bookmark" msgstr "Lesezeichen einfügen" msgid "Delete Bookmark" msgstr "Lesezeichen löschen" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Lesezeichen" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Lesezeichen einfügen" #, c-format msgid "Bookmark %s" msgstr "Lesezeichen %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Satellitenstatus anzeigen" msgid " Elevation " msgstr " Höhe " msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "zeige NMEA Daten" msgid "car" msgstr "Auto" msgid "bike" msgstr "Riejwiel" msgid "pedestrian" msgstr "Voetganger" #, c-format msgid "Current profile: %s" msgstr "Aktuelles Profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Profil wechseln nach: %s" msgid "Set as active" msgstr "Als Aktiv setzen" msgid "Show Satellite status" msgstr "Satellitenstatus anzeigen" msgid "Show NMEA data" msgstr "NMEA Daten anzeigen" msgid "Add Bookmark" msgstr "Lesezeichen hinzufügen" msgid "Rename" msgstr "Umbenennen" msgid "About Navit" msgstr "Über Navit" #. Authors msgid "By" msgstr "Von" #. Contributors msgid "And all the Navit Team" msgstr "Und dem gesamten Navit-Team" msgid "members and contributors." msgstr "Mitglieder und Beitragende" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Fahrzeug" msgid "Rules" msgstr "Regeln" msgid "Lock on road" msgstr "Auf Straße zeigen" msgid "Northing" msgstr "Einnorden" msgid "Map follows Vehicle" msgstr "Karte folgt Fahrzeug" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Karten" msgid "Layout" msgstr "Erscheinungsbild" msgid "Height Profile" msgstr "Höhenprofil" msgid "Route Description" msgstr "Routenbeschreibung" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Vorherige Ziele" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Nachricht" msgid "Back" msgstr "Zurück" msgid "Back to map" msgstr "Zurück zur Karte" msgid "Main Menu" msgstr "Hauptmenü" msgid "House number" msgstr "Huisnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Fahrzeugposition" msgid "Main menu" msgstr "Hauptmenü" msgid "" "Show\n" "Map" msgstr "" "Karte\n" "anzeigen" msgid "Settings" msgstr "Einstellungen" msgid "Tools" msgstr "Werkzeuge" msgid "Route" msgstr "Route" msgid "About" msgstr "Über" msgid "Quit" msgstr "Beenden" msgid "Actions" msgstr "Aktionen" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Navigation\n" "beenden" msgid "Display" msgstr "Anzeige" msgid "Fullscreen" msgstr "Vollbild" msgid "Window Mode" msgstr "Fenstermodus" msgid "Description" msgstr "Beschreibung" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "Pferd" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "dann den Kreisverkehr an der %1$s %2$s verlassen" navit-0.5.0+dfsg.1/po/nl.po.in000066400000000000000000001365461264204753600157370ustar00rootroot00000000000000# Dutch translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Bert de Bruijn https://launchpad.net/~lpdebruijn # Christ van Willegen https://launchpad.net/~cvwillegen+launchpad # Christopher https://launchpad.net/~cstandaert # Ed Kapitein https://launchpad.net/~ed-kapitein # Frenzel https://launchpad.net/~f-heinen-nl # Guus https://launchpad.net/~gsnijders # Hieronymousch https://launchpad.net/~jeroen-leptonics # Jeffrey Rongen https://launchpad.net/~jeffrey-rongen # KaZeR https://launchpad.net/~kazer # Roadrunner IN https://launchpad.net/~online # Sander Deryckere https://launchpad.net/~sanderd17 # Sybren Stüvel https://launchpad.net/~sybren-stuvel # Willem Sonke https://launchpad.net/~willem-sonke # bafplus https://launchpad.net/~bart-cockheyt # jan https://launchpad.net/~jandegr1 # rob https://launchpad.net/~rvdb # worldcitizen https://launchpad.net/~joop-boonen msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-10-05 13:45+0000\n" "Last-Translator: jan \n" "Language-Team: afaber\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: nl\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "soon" msgstr "straks" msgid "Running from source directory\n" msgstr "Gestart vanuit de bronmap\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' instellen als '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nulde" msgid "first" msgstr "eerste" msgid "second" msgstr "tweede" msgid "third" msgstr "derde" msgid "fourth" msgstr "vierde" msgid "fifth" msgstr "vijfde" msgid "sixth" msgstr "zesde" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nulde afrit" msgid "first exit" msgstr "eerste afslag" msgid "second exit" msgstr "tweede afslag" msgid "third exit" msgstr "derde afslag" msgid "fourth exit" msgstr "vierde afslag" msgid "fifth exit" msgstr "vijfde afslag" msgid "sixth exit" msgstr "zesde afslag" #, c-format msgid "%d feet" msgstr "%d voet" #, c-format msgid "in %d feet" msgstr "na %d voet" #, c-format msgid "%d.%d miles" msgstr "%d.%d. mijl" #, c-format msgid "in %d.%d miles" msgstr "na %d.%d mijl" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d mijl" msgstr[1] "%d mijl" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "na %d mijl" msgstr[1] "na %d mijl" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "na %d meter" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "na %d,%d kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "één kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "na één kilometer" msgstr[1] "na %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$sde %2$s%3$s%4$s op" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$s de %2$s op" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$s de %2$s op" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$s de %2$s op" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$s de %2$s op" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "naar de oprit" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sde %s%s%s in" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sde %s%s%s in" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sde %s%s%s in" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sde %s%s%s in" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%snaar de %s" msgid "When possible, please turn around" msgstr "Indien mogelijk omkeren" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "richting %s" #, c-format msgid "Follow the road for the next %s" msgstr "Volg de weg gedurende %s" msgid "Enter the roundabout soon" msgstr "straks de rotonde oprijden" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "%s de rotonde oprijden" msgid "then enter the roundabout" msgstr "daarna rij de rotonde op" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Verlaat de rotonde bij de %1$s %2$s" msgid "now" msgstr "nu" msgid "then" msgstr "daarna" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "daarna rechts invoegen%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "%1$s rechts invoegen%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "daarna links invoegen%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "%1$s links invoegen%2$s" msgid "on your left" msgstr "links" msgid "on your right" msgstr "rechts" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "neem afslag %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "neem de afslag %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "bij" msgid "at exit" msgstr "bij aflsag" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "daarna ga rechtdoor%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "%1$s ga rechtdoor %2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "daarna rechts aanhouden%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "%1$s rechts aanhouden %2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "daarna links aanhouden%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "%1$s links aanhouden %2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "rechts" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "links" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "flauw " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "scherp " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "neem daarna de %1$s straat naar %2$s" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Neem de %1$s straat naar %2$s" #, c-format msgid "after %i roads" msgstr "na %i wegen" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Ga %3$s %1$s naar %2$s %4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "daarna maak linksomkeer" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "%1$s linksomkeren" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "daarna rechtsomkeren" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "%1$s rechtsomkeren" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "volg" msgid "then you have reached your destination." msgstr "daarna heeft u uw bestemming bereikt." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Bestemming %s bereikt" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Knooppunt" msgid "Exit" msgstr "Afslag" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Positie" msgid "Command" msgstr "Opdracht" msgid "Length" msgstr "Afstand" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tijd" msgid "Destination Length" msgstr "Afstand" msgid "Destination Time" msgstr "Aankomsttijd" msgid "Roadbook" msgstr "route beschrijving" #, c-format msgid "Waypoint %d" msgstr "route punt %d" msgid "Visit before..." msgstr "bezoek voor" msgid "Set as position" msgstr "Als positie instellen" msgid "Set as destination" msgstr "Als bestemming instellen" msgid "Add as bookmark" msgstr "Opnemen als favoriet" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Schermcoörd: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Verenigde Arabische Emiraten" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua en Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanië" #. 051 msgid "Armenia" msgstr "Armenië" #. 530 msgid "Netherlands Antilles" msgstr "Nederlandse Antillen" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentinië" #. 016 msgid "American Samoa" msgstr "Samoa" #. 040 msgid "Austria" msgstr "Oostenrijk" #. 036 msgid "Australia" msgstr "Australië" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Eilanden" #. 031 msgid "Azerbaijan" msgstr "Azerbeidzjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnië en Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "België" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarije" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius en Saba" #. 076 msgid "Brazil" msgstr "Brazilië" #. 044 msgid "Bahamas" msgstr "Bahama's" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet eiland" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Wit-Rusland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocoseilanden" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo-Kinshasa" #. 140 msgid "Central African Republic" msgstr "Centraal Afrikaanse Republiek" #. 178 msgid "Congo" msgstr "Congo-Brazzaville" #. 756 msgid "Switzerland" msgstr "Zwitserland" #. 384 msgid "Cote d'Ivoire" msgstr "Ivoorkust" #. 184 msgid "Cook Islands" msgstr "Cookeilanden" #. 152 msgid "Chile" msgstr "Chili" #. 120 msgid "Cameroon" msgstr "Kameroen" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Kaap Verdië" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Kersteiland" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Tsjechië" #. 276 msgid "Germany" msgstr "Duitsland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Denemarken" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominicaanse Republiek" #. 012 msgid "Algeria" msgstr "Algerije" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypte" #. 732 msgid "Western Sahara" msgstr "Westsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanje" #. 231 msgid "Ethiopia" msgstr "Ethiopië" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Eilanden" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesië" #. 234 msgid "Faroe Islands" msgstr "Färöer" #. 250 msgid "France" msgstr "Frankrijk" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Verenigd Koninkrijk" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgië" #. 254 msgid "French Guiana" msgstr "Frans Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinee" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equitoriaal Guinea" #. 300 msgid "Greece" msgstr "Griekenland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Zuid Georgia en de zuidelijke Sandwich eilanden" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinee-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard en McDonald eilanden" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatië" #. 332 msgid "Haiti" msgstr "Haïti" #. 348 msgid "Hungary" msgstr "Hongarije" #. 360 msgid "Indonesia" msgstr "Indonesië" #. 372 msgid "Ireland" msgstr "Ierland" #. 376 msgid "Israel" msgstr "Israël" #. 833 msgid "Isle of Man" msgstr "Eiland Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Brits Territorium in de Indische Oceaan" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "IJsland" #. 380 msgid "Italy" msgstr "Italië" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordanie" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizië" #. 116 msgid "Cambodia" msgstr "Cambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoren" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts en Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "ZuidKorea" #. 410 msgid "Korea, Republic of" msgstr "Noord-Korea" #. 414 msgid "Kuwait" msgstr "Koeweit" #. 136 msgid "Cayman Islands" msgstr "Caymaneilanden" #. 398 msgid "Kazakhstan" msgstr "Kazachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litouwen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Letland" #. 434 msgid "Libya" msgstr "Libië" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavië" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Sint-Maarten (Franse Antillen)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Marshall eilanden" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonië" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolië" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Noordelijke Marianen" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanië" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiven" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Maleisië" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibië" #. 540 msgid "New Caledonia" msgstr "Nieuw Caledonië" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "NIcaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Noorwegen" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nieuw Zeeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Frans Polynesië" #. 598 msgid "Papua New Guinea" msgstr "Papoea-Nieuw-Guinea" #. 608 msgid "Philippines" msgstr "Filipijnen" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre en Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairneilanden" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestijns Gebied, Bezet" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Roemenië" #. 688 msgid "Serbia" msgstr "Servië" #. 643 msgid "Russian Federation" msgstr "Rusland" #. 646 msgid "Rwanda" msgstr "Rwanda" # #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabië" #. 090 msgid "Solomon Islands" msgstr "Salomonseilanden" #. 690 msgid "Seychelles" msgstr "Seychellen" #. 736 msgid "Sudan" msgstr "Soedan" #. 752 msgid "Sweden" msgstr "Zweden" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sint-Helena" #. 705 msgid "Slovenia" msgstr "Slovenië" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Spitsbergen en Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slowakije" #. 694 msgid "Sierra Leone" msgstr "Siërra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalië" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "Zuid-Soedan" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tomé en Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (Nederlands deel)" #. 760 msgid "Syrian Arab Republic" msgstr "Syrië" #. 748 msgid "Swaziland" msgstr "Swasiland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- en Caicoseilanden" #. 148 msgid "Chad" msgstr "Tjaad" #. 260 msgid "French Southern Territories" msgstr "Franse Zuidelijke en Antarctische Gebieden" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadzjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau-eilanden" #. 626 msgid "Timor-Leste" msgstr "Oost-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunesië" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkije" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad en Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Oekraïne" #. 800 msgid "Uganda" msgstr "Oeganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Kleine Pacifische eilanden van de Verenigde Staten" #. 840 msgid "United States" msgstr "Verenigde Staten" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Oezbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vaticaanstad" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent en de Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britse Maagdeneilanden" #. 850 msgid "Virgin Islands, U.S." msgstr "Maagdeneilanden, USA" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis en Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Zuid-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Onbekend, voeg een is_in-label toe aan deze steden" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Geen configuratiebestand navit.xml of navit.xml.local gevonden\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Foutieve waarde in het configuratie bestand '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Gebruikte configuratie bestand: '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Fout: Geen configuratie gevonden in configuratiebestand '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Interne initialisatie is mislukt, programma wordt afgesloten. Controleer de " "vorafgaande foutmeldingen.\n" msgid "unknown street" msgstr "onbekende weg" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "naamloos voertuig" msgid "Failed to write bookmarks file" msgstr "opslaan van het bladwijzer bestand is mislukt." #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punt op de kaart" msgid "Car" msgstr "Auto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" # msgid "Postal" msgstr "Postcode" msgid "Town" msgstr "Plaats" # msgid "District" msgstr "District" msgid "Street" msgstr "Straat" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "voer bestemming in" msgid "Zip Code" msgstr "Postcode" msgid "City" msgstr "Stad" msgid "District/Township" msgstr "Gebied" msgid "Map" msgstr "Kaart" msgid "Bookmark" msgstr "Favoriet" msgid "Destination" msgstr "Bestemming" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Display" msgid "_Route" msgstr "Route" msgid "_Former Destinations" msgstr "Vorige bestemmingen" msgid "_Bookmarks" msgstr "Favorieten" msgid "_Map" msgstr "Kaart" msgid "_Layout" msgstr "Opmaak" msgid "_Projection" msgstr "Projectie" msgid "_Vehicle" msgstr "Voertuig" msgid "Zoom_Out" msgstr "Verkleinen" msgid "Decrease zoom level" msgstr "Zoomniveau verlagen" msgid "Zoom_In" msgstr "Vergroten" msgid "Increase zoom level" msgstr "Zoomniveau vehogen" msgid "_Recalculate" msgstr "Herberekenen" msgid "Redraw map" msgstr "Ververs kaart" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "stel bestemming in" msgid "Opens address search dialog" msgstr "Opent het venster om adressen te zoeken" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "POI zoekscherm openen" msgid "_Stop Navigation" msgstr "Stop navigatie" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "Het programma afsluiten" msgid "Show position _cursor" msgstr "laat positie zien" msgid "_Lock on Road" msgstr "Huidige locatie altijd op de weg" msgid "_Keep orientation to the North" msgstr "houd het kaart noorden boven" msgid "Switches map orientation to the north or the vehicle" msgstr "Schakelt kaartoriëntatie naar het noorden of het voertuig" msgid "_Roadbook" msgstr "route beschrijving" msgid "Show/hide route description" msgstr "Routebeschrijving tonen/verbergen" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Aan-/uitzetten van het automatisch veranderen van het zoomniveau" msgid "_Fullscreen" msgstr "Beeldvullend" msgid "Data" msgstr "Gegevens" msgid "Pharmacy" msgstr "Apotheek" msgid "Restaurant" msgstr "Restaurant" msgid "Restaurant. Fast food" msgstr "Fastfoodrestaurant" msgid "Hotel" msgstr "Hotel" msgid "Car parking" msgstr "parking" msgid "Fuel station" msgstr "Tankstation" msgid "Bank" msgstr "Bank" msgid "Hospital" msgstr "Ziekenhuis" msgid "Cinema" msgstr "Bioscoop" msgid "Train station" msgstr "Treinstation" msgid "School" msgstr "School" msgid "Police" msgstr "Politie" msgid "Justice" msgstr "gerechtshof" msgid "Taxi" msgstr "Taxi" msgid "Shopping" msgstr "Winkelen" msgid "Distance from screen center (km)" msgstr "Afstand vanaf schem midden (km)" #, c-format msgid "POI %s. %s" msgstr "POI %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "POI zoeken" msgid "Select a category" msgstr "Kies een categorie" msgid "Select a distance to look for (km)" msgstr "Zoekafstand kiezen (km)" msgid "Select a POI" msgstr "POI selecteren" msgid " " msgstr " " msgid "Category" msgstr "Categorie" msgid "Direction" msgstr "Richting" msgid "Distance(m)" msgstr "Afstand(m)" msgid "Name" msgstr "Naam" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NO" msgid "E" msgstr "O" msgid "SE" msgstr "ZO" msgid "S" msgstr "Z" msgid "SW" msgstr "ZW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nee" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fkm %02d:%02d Aankomsttijd" msgid "Route 0000km 0+00:00 ETA" msgstr "Route 0000km 0+00:00 Aankomsttijd" msgid "Help" msgstr "Hulp" #, c-format msgid "Waypoint %s" msgstr "route punt %s" msgid "Select waypoint to insert the new one before" msgstr "selecteer een routepunt om in te voegen voor de nieuwe" msgid "View in Browser" msgstr "Bekijk in browser" msgid "Item type" msgstr "Item type" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Straten" msgid "House numbers" msgstr "Huisnummers" msgid "View Attributes" msgstr "Bekijk eigenschappen" msgid "Set as position (and deactivate vehicle)" msgstr "zet positie en deactiveer voertuig" msgid "POIs" msgstr "Nuttige punten" msgid "View on map" msgstr "Bekijk op de kaart" msgid "Remove search results from the map" msgstr "Verwijder zoek resultaten van de kaart" msgid "Show results on the map" msgstr "laat de resultaten op de kaart zien" msgid "Cut Bookmark" msgstr "Favoriet knippen" msgid "Copy Bookmark" msgstr "Favoriet kopiëren" msgid "Rename Bookmark" msgstr "Favoriet hernoemen" msgid "Paste Bookmark" msgstr "Plak Favoriet" msgid "Delete Bookmark" msgstr "Verwijder favoriet" msgid "Delete waypoint" msgstr "verwijder route punt" msgid "Bookmarks" msgstr "Favorieten" msgid "Bookmarks as waypoints" msgstr "Favoriet(en) als routepunten" msgid "Save waypoints" msgstr "sla op als favoriet" msgid "Replace with waypoints" msgstr "vervang door route punten" msgid "Delete Folder" msgstr "Map verwijderen" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Favorietenmap toevoegen" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Plak favoriet" #, c-format msgid "Bookmark %s" msgstr "Favoriet %s" #, c-format msgid "Download %s" msgstr "Download %s" msgid "Map Download" msgstr "Kaart downloaden" msgid "Active" msgstr "Actief" msgid "Download Enabled" msgstr "Download ingeschakeld" msgid "Download completely" msgstr "in zijn geheel ophalen" msgid "Show Satellite Status" msgstr "Satellietstatus weergeven" msgid " Elevation " msgstr " Hoogte " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "NMEA-gegevens weergeven" msgid "car" msgstr "auto" msgid "bike" msgstr "fiets" msgid "pedestrian" msgstr "voetganger" #, c-format msgid "Current profile: %s" msgstr "Huidig profiel: %s" #, c-format msgid "Change profile to: %s" msgstr "Profiel veranderen naar: % s" msgid "Set as active" msgstr "Activeren" msgid "Show Satellite status" msgstr "Satellietstatus weergeven" msgid "Show NMEA data" msgstr "Toon NMEA-gegevens" msgid "Add Bookmark" msgstr "Favoriet toevoegen" msgid "Rename" msgstr "Hernoem" msgid "About Navit" msgstr "Over Navit" #. Authors msgid "By" msgstr "Door" #. Contributors msgid "And all the Navit Team" msgstr "En het hele Navit Team" msgid "members and contributors." msgstr "leden en bijdragers" msgid "Waypoints" msgstr "route punten" msgid "Enter Coordinates" msgstr "voer coordinaten in" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Breedtegraad Lengtegraad" msgid "Enter coordinates, for example:" msgstr "voer coordinaat in, bijvorbeeld:" msgid "Vehicle" msgstr "Voertuig" msgid "Rules" msgstr "Voorschrift" msgid "Lock on road" msgstr "Op weg houden" msgid "Northing" msgstr "Noord boven" msgid "Map follows Vehicle" msgstr "Kaart volgt voertuig" msgid "Plan with Waypoints" msgstr "Plan met route punten" msgid "Maps" msgstr "Kaarten" msgid "Layout" msgstr "Opmaak" msgid "Height Profile" msgstr "Hoogteprofiel" msgid "Route Description" msgstr "Routebeschrijving" msgid "Show Locale" msgstr "Toon taal" msgid "Former Destinations" msgstr "Vorige bestemmingen" msgid "- No former destinations available -" msgstr "- Geen vorige bestemmingen -" msgid "Message" msgstr "Boodschap" msgid "Back" msgstr "Terug" msgid "Back to map" msgstr "Terug naar de kaart" msgid "Main Menu" msgstr "Hoofdmenu" msgid "House number" msgstr "Huisnummer" msgid "Next" msgstr "Volgende" msgid "Prev" msgstr "Vorige" msgid "Return to route!" msgstr "Terugkeren naar route!" #. warning told msgid "Look out! Camera!" msgstr "Pas op! Camera!" #. warning told msgid "Please decrease your speed" msgstr "Verminder snelheid" msgid "partial match" msgstr "gedeeltelijke overeenkomst" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Zoek" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Steden" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "route hiernaartoe" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "kaart gegevens (c) OpenStreetMap contributeurs, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" "Huidige locatie %s voor opslag van de kaart is niet beschikbaar.\n" "Herstart Navit na dat U een SD kaart heeft geplaatst of een andere\n" "locatie voor opslag heeft gekozen." msgid "Downloaded maps" msgstr "Gedownloade kaarten" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" "Kaarten gorter dan 3,8GB zijn momenteel niet ondersteund op Android.\r\n" "Kies a.u.b. een kleinere kaart." msgid "Cancel" msgstr "Annuleer" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" "%s is als nieuwe locatie ingesteld.\n" "Herstart a.u.b. Navit om de wijzigingen door te voeren." msgid "Whole Planet" msgstr "de hele aarde" msgid "Africa" msgstr "Afrika" msgid "Canary Islands" msgstr "Canarische Eilanden" msgid "Asia" msgstr "Azië" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "Verenigde Arabische Emiraten + andere" msgid "Oceania" msgstr "Oceanië" msgid "Tasmania" msgstr "Tasmanië" msgid "Victoria" msgstr "Victoria" msgid "New South Wales" msgstr "Nieuw-Zuid-Wales" msgid "Europe" msgstr "Europa" msgid "Western Europe" msgstr "West-Europa" msgid "Azores" msgstr "Azoren" msgid "BeNeLux" msgstr "Benelux" msgid "Alsace" msgstr "Elzas" msgid "Aquitaine" msgstr "Aquitanië" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Basse-Normandie" msgid "Bourgogne" msgstr "Bourgondië" msgid "Bretagne" msgstr "Bretagne" msgid "Centre" msgstr "Midden-Frankrijk" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Corsica" msgid "Franche-Comte" msgstr "Franche-Comté" msgid "Haute-Normandie" msgstr "Haute-Normandie" msgid "Ile-de-France" msgstr "Île-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lotharingen" msgid "Midi-Pyrenees" msgstr "Midi-Pyrénées" msgid "Nord-pas-de-Calais" msgstr "Nord-Pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays de la Loire" msgid "Picardie" msgstr "Picardië" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provence-Alpes-Côte d'Azur" msgid "Rhone-Alpes" msgstr "Rhône-Alpes" msgid "Baden-Wuerttemberg" msgstr "Baden-Württemberg" msgid "Bayern" msgstr "Beieren" msgid "Mittelfranken" msgstr "Mittelfranken" msgid "Niederbayern" msgstr "Niederbayern" msgid "Oberbayern" msgstr "Oberbayern" msgid "Oberfranken" msgstr "Oberfranken" msgid "Oberpfalz" msgstr "Oberpfalz" msgid "Schwaben" msgstr "Schwaben" msgid "Unterfranken" msgstr "Unterfranken" msgid "Berlin" msgstr "Berlijn" msgid "Brandenburg" msgstr "Brandenburg" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hessen" msgid "Mecklenburg-Vorpommern" msgstr "Mecklenburg-Voor-Pommeren" msgid "Niedersachsen" msgstr "Nedersaksen" msgid "Nordrhein-westfalen" msgstr "Noordrijn-Westfalen" msgid "Rheinland-Pfalz" msgstr "Rijnland-Palts" msgid "Saarland" msgstr "Saarland" msgid "Sachsen-Anhalt" msgstr "Saksen-Anhalt" msgid "Sachsen" msgstr "Saksen" msgid "Schleswig-Holstein" msgstr "Sleeswijk-Holstein" msgid "Thueringen" msgstr "Thüringen" msgid "Mallorca" msgstr "Mallorca" msgid "Galicia" msgstr "Galicië" msgid "Scandinavia" msgstr "Scandinavië" msgid "England" msgstr "Engeland" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "East Yorkshire en Hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "South Yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Schotland" msgid "Wales" msgstr "Wales" msgid "Crete" msgstr "Kreta" msgid "North America" msgstr "Noord-Amerika" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawaï" msgid "USA" msgstr "VS" msgid " (except Alaska and Hawaii)" msgstr " (behalve Alaska en Hawaï)" msgid "Midwest" msgstr "Midwest" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Northeast" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacific" msgid "South" msgstr "South" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "District Columbia" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginia" msgid "West Virginia" msgstr "West Virginia" msgid "West" msgstr "West" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Californië" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nieuw-Mexico" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Washington State" msgid "South+Middle America" msgstr "Zuid- en Midden-Amerika" msgid "Guyane Francaise" msgstr "Frans Guyana" msgid "downloading" msgstr "aan het downloaden" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "klaar" msgid "Media selected for map storage is not available" msgstr "De gekozen locatie voor opslag van de kaarten is niet beschikbaar." #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Niet genoeg vrije ruimte" msgid "Error downloading map!" msgstr "Kaart downloaden mislukt!" msgid "Error writing map!" msgstr "Wegschrijven van kaart mislukt!" msgid "Map download aborted!" msgstr "Kaart-download afgebroken!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Resterende tijd" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Kaart downloaden" msgid "Vehicle Position" msgstr "Voertuigpositie" msgid "Main menu" msgstr "Hoofdmenu" msgid "" "Show\n" "Map" msgstr "" "Kaart\n" "Weergeven" msgid "Settings" msgstr "Instellingen" msgid "Tools" msgstr "Gereedschappen" msgid "Route" msgstr "Route" msgid "About" msgstr "Info" msgid "Quit" msgstr "Afsluiten" msgid "Actions" msgstr "Navigatieopties" msgid "" "Former\n" "Destinations" msgstr "" "Vorige\n" "bestemmingen" msgid "Coordinates" msgstr "Coördinaten" msgid "" "Stop\n" "Navigation" msgstr "" "Stop\n" "navigatie" msgid "Display" msgstr "Display" msgid "Fullscreen" msgstr "Beeldvullend" msgid "Window Mode" msgstr "Venstermodus" msgid "Description" msgstr "Beschrijving" msgid "" "Drop last \n" "Waypoint" msgstr "" "Laatste routepunt \n" "verwijderen" msgid "" "Drop next \n" "Waypoint" msgstr "" "Volgende routepunt \n" "verwijderen" msgid "Satellite Status" msgstr "GPS-status" msgid "NMEA Data" msgstr "NMEA-gegevens" msgid "car_shortest" msgstr "auto_kortste_weg" msgid "car_avoid_tolls" msgstr "auto_vermijd_tolwegen" msgid "car_pedantic" msgstr "auto (incl. kleine wegen)" msgid "horse" msgstr "paard" msgid "Truck" msgstr "Vrachtwagen" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Ja" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit gestart" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit actief" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Welkom bij Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Dank u voor het installeren van Navit!\n" "\n" "Om te beginnen, selecteer \"Download kaarten\" uit het menu en download een " "kaart van je regio. De kaarten zijn groot, dus is het aangeraden om een " "ongelimiteerde internetverbinding te hebben!\n" "\n" "Kaartendata: (c) OpenStreetMap contributors\n" "\n" "Nog veel plezier met Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Meer info" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Zoom in" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Zoom uit" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Download kaarten" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Schakel POIs" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Verlaat Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Back-up maken / terugzetten" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "Kaart locatie kiezen" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Verwijder deze kaart?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Downloading:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Fout met kaart downloaden" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Kaart downloaden afgebroken" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Geen locatie. Heropen nadat er een locatie-fix is." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Kaarten die de huidige locatie bevatten" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Zoek een adres" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Uwe bestemming" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "gedeelte van adres" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Zoeken..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adres niet gevonden" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Zoekresultaten krijgen" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Zoekresultaten laden" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Geen resultaten gevonden" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Geen tekst ingevoerd" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Bestemming ingesteld:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Kies een actie" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Voer een SD-kaart in" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Back-up maken..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Terugzetten..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Aanmaken back-up-map mislukt" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Back-up mislukt" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Geen back-up gevonden" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Terugzetten mislukt" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Back-up succesvol" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "De back-up is succesvol teruggezet.\n" "Herstart nu Navit." #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Back-up niet gevonden" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Terugzetten mislukt" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Selecteer een back-up" #. Android resource: @strings/backup msgid "Backup" msgstr "Back-up" #. Android resource: @strings/restore msgid "Restore" msgstr "Terugzetten" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "geen tekst naar spraak aanwezig" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" "Navit kan elke tekst naar spraak-engine geïnstalleerd op uw apparaat " "gebruiken. De momenteel geselecteerde engine meldt dat het niet in uw taal " "kan spreken. Wil U de spraak download dialoog van Uw toestel starten?" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "daarna de rotonde verlaten bij de %1$s %2$s" navit-0.5.0+dfsg.1/po/nn.po.in000066400000000000000000001167731264204753600157410ustar00rootroot00000000000000# Norwegian Nynorsk translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # Skippern https://launchpad.net/~gay-today msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 03:59+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Norwegian Nynorsk \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: nn\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nullte" msgid "first" msgstr "fyrste" msgid "second" msgstr "andre" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjerde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjette" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nullte avkjøyring" msgid "first exit" msgstr "første avkjøyring" msgid "second exit" msgstr "andre avkjøyring" msgid "third exit" msgstr "tredje avkjøyring" msgid "fourth exit" msgstr "fjerde avkjøyring" msgid "fifth exit" msgstr "femte avkjøyring" msgid "sixth exit" msgstr "sjette avkjøyring" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "om %d,%d kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ein kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om ein kilometer" msgstr[1] "om %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sinn på %s" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "snart" msgid "now" msgstr "no" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "høgre" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "venstre" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "slakt " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "krapt " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ta den %1$s vegen mot %2$s" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Avkjøyring" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posisjon" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Avstand" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Dei sameinte arabiske emirata" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Dei nederlandske Antillane" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikansk Samoa" #. 040 msgid "Austria" msgstr "Austerrike" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Aserbadjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetøya" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Kviterussland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyane" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Den demokratiske republikken" #. 140 msgid "Central African Republic" msgstr "Den sentralafrikanske republikken" #. 178 msgid "Congo" msgstr "Kongo-Brazzaville" #. 756 msgid "Switzerland" msgstr "Sveits" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbeinskysten" #. 184 msgid "Cook Islands" msgstr "Cookøyane" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kapp Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Juløya" #. 196 msgid "Cyprus" msgstr "Kypros" #. 203 msgid "Czech Republic" msgstr "Tsjekkiske republikk" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Den dominikanske republikken" #. 012 msgid "Algeria" msgstr "Algerie" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Vest-Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finnland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøyane" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesiaføderasjonen" #. 234 msgid "Faroe Islands" msgstr "Færøyane" #. 250 msgid "France" msgstr "Frankrike" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannia" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Fransk Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grønnland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadelope" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorial-Guinea" #. 300 msgid "Greece" msgstr "Hellas" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sør-Georgia og Sør-Sandwichøyane" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- og McDonaldøyane" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatsia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungarn" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Britiske territorier i det indiske hav" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Den islamske republikk" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodsja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorane" #. 659 msgid "Saint Kitts and Nevis" msgstr "St. Kitts og Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, Den demokratiske folkerepublikk" #. 410 msgid "Korea, Republic of" msgstr "Sør-Korea" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Kayman-øyane" #. 398 msgid "Kazakhstan" msgstr "Kasakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "St. Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marokko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Fransk del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshalløyane" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nord-Marianane" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldivane" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mosambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Ny-Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkøya" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Nederland" #. 578 msgid "Norway" msgstr "Noreg" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Ny-Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransk Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua Ny-Guinea" #. 608 msgid "Philippines" msgstr "Fillipinane" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre og Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairnøyane" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Russland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. 090 msgid "Solomon Islands" msgstr "Salomonøyane" #. 690 msgid "Seychelles" msgstr "Seychellane" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "St. Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome og Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøyane" #. 148 msgid "Chad" msgstr "Tsjad" #. 260 msgid "French Southern Territories" msgstr "Dei franske sørterritoria" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadsjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Aust-Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunis" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Tyrkia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Mindre utenforliggende øyar til USA" #. 840 msgid "United States" msgstr "Dei forenede statar" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Usbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent og Grenadinane" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Jomfruøyane (Storbritannia)" #. 850 msgid "Virgin Islands, U.S." msgstr "Jomfruøyane (USA)" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis- og Futunaøyane" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sør-Afrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "Ukjend, legg is_in-tagger til dei byane." msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "Sted" msgid "District" msgstr "Distrikt/Kommune" msgid "Street" msgstr "Gate" msgid "Number" msgstr "Tal" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "Sted" msgid "District/Township" msgstr "Distrikt/Kommune" msgid "Map" msgstr "Kart" msgid "Bookmark" msgstr "Bokmerke" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visning" msgid "_Route" msgstr "Rute" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "Bokmerker" msgid "_Map" msgstr "Kart" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "Projeksjon" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "Zoom ut" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "Zoom inn" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "Berekne på nytt" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "Opplysningar" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Stopp navigasjon" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lås til veg" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "Auto-zoom" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Heile skjermen" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NØ" msgid "E" msgstr "Ø" msgid "SE" msgstr "SØ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nei" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Hjelp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Vegar" msgid "House numbers" msgstr "Husnummer" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bokmerker" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Bokmerk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Vis satelittstatus" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "Vis NMEA-data" msgid "car" msgstr "bil" msgid "bike" msgstr "sykkel" msgid "pedestrian" msgstr "fotgjengar" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "Vis satelittstatus" msgid "Show NMEA data" msgstr "Vis NMEA-data" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "Reglar" msgid "Lock on road" msgstr "Lås til veg" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kart" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "Høgdeprofil" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Melding" msgid "Back" msgstr "Tilbake" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "Hovudmenyen" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "Hovudmeny" msgid "" "Show\n" "Map" msgstr "" "Vis\n" "kart" msgid "Settings" msgstr "Innstillingar" msgid "Tools" msgstr "Verkty" msgid "Route" msgstr "Rute" msgid "About" msgstr "" msgid "Quit" msgstr "Avslutt" msgid "Actions" msgstr "Handlingar" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Stopp\n" "navigasjon" msgid "Display" msgstr "Visning" msgid "Fullscreen" msgstr "Heile skjermen" msgid "Window Mode" msgstr "" msgid "Description" msgstr "Beskriving" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/pl.po.in000066400000000000000000001332151264204753600157270ustar00rootroot00000000000000# Polish translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Bartosz Kaszubowski https://launchpad.net/~simek # DarkAlexis https://launchpad.net/~alex-ludyga # Jarosław Ogrodnik https://launchpad.net/~goz # KaZeR https://launchpad.net/~kazer # Marcin Ostajewski (panszpik) https://launchpad.net/~panszpik # Michael von Glasow https://launchpad.net/~michael-vonglasow # Mineque https://launchpad.net/~mineque # Patryk "LeadMan" Benderz https://launchpad.net/~leadman # S0Cool https://launchpad.net/~mareksok # TSr https://launchpad.net/~tsr # Wojtek https://launchpad.net/~wojtek-pol # skrzat https://launchpad.net/~skrzat # Łukasz Semler https://launchpad.net/~lukasz-semler msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "Language: pl\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Uruchamiam z katalogu źródłowego\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ustawiam '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zerowy" msgid "first" msgstr "pierwszy" msgid "second" msgstr "drugi" msgid "third" msgstr "trzeci" msgid "fourth" msgstr "czwarty" msgid "fifth" msgstr "piąty" msgid "sixth" msgstr "szósty" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "zerowym wyjeździe" msgid "first exit" msgstr "pierwszym wyjeździe" msgid "second exit" msgstr "drugim wyjeździe" msgid "third exit" msgstr "trzecim wyjeździe" msgid "fourth exit" msgstr "czwartym wyjeździe" msgid "fifth exit" msgstr "piątym wyjeździe" msgid "sixth exit" msgstr "szóstym wyjeździe" #, c-format msgid "%d feet" msgstr "%d stopa" #, c-format msgid "in %d feet" msgstr "za %d stóp" #, c-format msgid "%d.%d miles" msgstr "%d.%d mil" #, c-format msgid "in %d.%d miles" msgstr "za %d.%d mil" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "jedna mila" msgstr[1] "%d mile" msgstr[2] "%d mil" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "za jedną milę" msgstr[1] "za %d mile" msgstr[2] "za %d mil" #, c-format msgid "%d meters" msgstr "%d metrów" #, c-format msgid "in %d meters" msgstr "za %d metrów" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrów" #, c-format msgid "in %d.%d kilometers" msgstr "za %d.%d kilometrów" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "jeden kilometr" msgstr[1] "%d kilometry" msgstr[2] "%d kilometrów" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "za jeden kilometr" msgstr[1] "za %d kilometry" msgstr[2] "za %d kilometrów" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "na wjazd" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sw %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sw %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sw %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sw %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s do %s" msgid "When possible, please turn around" msgstr "Zawróc, gdy będzie to możliwe" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Jedź tą drogą do następnego %s" msgid "Enter the roundabout soon" msgstr "Wjazd na rondo wkrótce" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Zjedź z ronda na %1$s %2$s" msgid "soon" msgstr "wkrótce" msgid "now" msgstr "teraz" msgid "then" msgstr "następnie" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "w prawo" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "w lewo" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "lekko " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "silnie " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Jedź drogą %1$s do %2$s" #, c-format msgid "after %i roads" msgstr "po drodze %i" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Skręć %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "następnie zawróc" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Zawróc %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "następnie zawróc" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Zawróc %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "następnie dojechałeś do celu." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Dotarłeś do celu %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Węzeł" msgid "Exit" msgstr "Zjazd" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Położenie" msgid "Command" msgstr "Polecenie" msgid "Length" msgstr "Odległość" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Czas" msgid "Destination Length" msgstr "Odległość do celu" msgid "Destination Time" msgstr "Czas do celu" msgid "Roadbook" msgstr "Szczegóły trasy" #, c-format msgid "Waypoint %d" msgstr "Punkt trasy %d" msgid "Visit before..." msgstr "Odwiedź najpierw..." msgid "Set as position" msgstr "Ustaw jako pozycję" msgid "Set as destination" msgstr "Ustaw jako cel" msgid "Add as bookmark" msgstr "Dodaj jako zakładkę" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Współrzędne ekranu: %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Zjednoczone Emiraty Arabskie" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antyle Holenderskie" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktyka" #. 032 msgid "Argentina" msgstr "Argentyna" #. 016 msgid "American Samoa" msgstr "Samoa Amerykańskie" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Wyspy Alandzkie" #. 031 msgid "Azerbaijan" msgstr "Azerbejdżan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bośnia i Hercegowina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesz" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bułgaria" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Republika Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermudy" #. 096 msgid "Brunei Darussalam" msgstr "Państwo Brunei Siedziba Pokoju" #. 068 msgid "Bolivia" msgstr "Boliwia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius i Saba" #. 076 msgid "Brazil" msgstr "Brazylia" #. 044 msgid "Bahamas" msgstr "Bahamy" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Wyspa Bouveta" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Białoruś" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Wyspy Kokosowe (Keelinga)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Demokratyczna Republika Konga" #. 140 msgid "Central African Republic" msgstr "Republika Środkowej Afryki" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Szwajcaria" #. 384 msgid "Cote d'Ivoire" msgstr "Wybrzeże Kości Słoniowej" #. 184 msgid "Cook Islands" msgstr "Wyspy Cook'a" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Chiny" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Kostaryka" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Republika Zielonego Przylądka" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Wyspy Bożego Narodzenia" #. 196 msgid "Cyprus" msgstr "Cypr" #. 203 msgid "Czech Republic" msgstr "Republika Czeska" #. 276 msgid "Germany" msgstr "Niemcy" #. 262 msgid "Djibouti" msgstr "Dżibuti" #. 208 msgid "Denmark" msgstr "Dania" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Republika Dominikańska" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ekwador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipt" #. 732 msgid "Western Sahara" msgstr "Zachodnia Sahara" #. 232 msgid "Eritrea" msgstr "Erytrea" #. 724 msgid "Spain" msgstr "Hiszpania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "Fidżi" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandy (Malwiny)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezja" #. 234 msgid "Faroe Islands" msgstr "Wyspy Faroe" #. 250 msgid "France" msgstr "Francja" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Wielka Brytania" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Gujana Francuska" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grenlandia" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Gwinea" #. 312 msgid "Guadeloupe" msgstr "Gwadelupa" #. 226 msgid "Equatorial Guinea" msgstr "Gwinea Równikowa" #. 300 msgid "Greece" msgstr "Grecja" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Wyspy Południowa Georgia i Sandwich Południowy" #. 320 msgid "Guatemala" msgstr "Gwatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gwinea-Bissau" #. 328 msgid "Guyana" msgstr "Gujana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Wyspa Heard i Wyspy McDonalda" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Chorwacja" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Węgry" #. 360 msgid "Indonesia" msgstr "Indonezja" #. 372 msgid "Ireland" msgstr "Irlandia" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Wyspa Man" #. 356 msgid "India" msgstr "Indie" #. 086 msgid "British Indian Ocean Territory" msgstr "Brytyjskie Terytorium Oceanu Indyjskiego" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Islandia" #. 380 msgid "Italy" msgstr "Włochy" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordania" #. 392 msgid "Japan" msgstr "Japonia" #. 404 msgid "Kenya" msgstr "Kenia" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistan" #. 116 msgid "Cambodia" msgstr "Kambodża" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komory" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts i Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea Północna" #. 410 msgid "Korea, Republic of" msgstr "Korea Południowa" #. 414 msgid "Kuwait" msgstr "Kuwejt" #. 136 msgid "Cayman Islands" msgstr "Kajmany" #. 398 msgid "Kazakhstan" msgstr "Kazachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos, Laotańska Republika Ludowo-Demokratyczna" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litwa" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Łotwa" #. 434 msgid "Libya" msgstr "Libia" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Mołdawia" #. 499 msgid "Montenegro" msgstr "Czarnogóra" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (część francuska)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Wyspy Marshalla" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Republika Macedonii" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Związek Myanmar (Birma)" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Makau" #. 580 msgid "Northern Mariana Islands" msgstr "Mariany Północne" #. 474 msgid "Martinique" msgstr "Martynika" #. 478 msgid "Mauritania" msgstr "Mauretania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Malediwy" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksyk" #. 458 msgid "Malaysia" msgstr "Malezja" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nowa Kaledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Wyspa Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Holandia" #. 578 msgid "Norway" msgstr "Norwegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nowa Zelandia" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Polinezja Francuska" #. 598 msgid "Papua New Guinea" msgstr "Papua Nowa Gwinea" #. 608 msgid "Philippines" msgstr "Filipiny" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polska" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre i Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Portoryko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Terytorium Palestyńskie, okupowane" #. 620 msgid "Portugal" msgstr "Portugalia" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragwaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumunia" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federacja Rosyjska" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudyjska" #. 090 msgid "Solomon Islands" msgstr "Wyspy Salomona" #. 690 msgid "Seychelles" msgstr "Seszele" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Szwecja" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Święta Helena" #. 705 msgid "Slovenia" msgstr "Słowenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard i Jan Mayen" #. 703 msgid "Slovakia" msgstr "Słowacja" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Sudan Południowy" #. 678 msgid "Sao Tome and Principe" msgstr "Wyspy Świętego Tomasza i Książęca" #. 222 msgid "El Salvador" msgstr "Salwador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (część holenderska)" #. 760 msgid "Syrian Arab Republic" msgstr "Syryjska Republika Arabska" #. 748 msgid "Swaziland" msgstr "Suazi" #. 796 msgid "Turks and Caicos Islands" msgstr "Wyspy Turks i Caicos" #. 148 msgid "Chad" msgstr "Czad" #. 260 msgid "French Southern Territories" msgstr "Francuskie Terytoria Południowe" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tajlandia" #. 762 msgid "Tajikistan" msgstr "Tadżykistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor Wschodni" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunezja" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turcja" #. 780 msgid "Trinidad and Tobago" msgstr "Trynidad i Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tajwan, Republika Chińska" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, Zjednoczona Republika" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Dalekie Wyspy Mniejsze Stanów Zjednoczonych" #. 840 msgid "United States" msgstr "Stany Zjednoczone" #. 858 msgid "Uruguay" msgstr "Urugwaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Watykan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent i Grenadyny" #. 862 msgid "Venezuela" msgstr "Wenezuela" #. 092 msgid "Virgin Islands, British" msgstr "Brytyjskie Wyspy Dziewicze" #. 850 msgid "Virgin Islands, U.S." msgstr "Wyspy Dziewicze Stanów Zjednoczonych" #. 704 msgid "Viet Nam" msgstr "Wietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis i Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Majotta" #. 710 msgid "South Africa" msgstr "Republika Południowej Afryki" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Nieznane, dodaj is w tagach dla tych miast" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Brak pliku konfiguracji navit.xml, znaleziony navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Błąd przetworzenia pliku config '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Użycie pliku konfiguracji '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Nieudana wewnętrzna inicjalizacja, wychodzenie. Sprawdź poprzednie " "komunikaty błędu.\n" msgid "unknown street" msgstr "nieznana ulica" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Nienazwany pojazd" msgid "Failed to write bookmarks file" msgstr "Nieudany zapis pliku zakładek" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Punkt na mapie" msgid "Car" msgstr "Samochód" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Państwo" msgid "Postal" msgstr "Kod Pocztowy" msgid "Town" msgstr "Miasto" msgid "District" msgstr "Dzielnica" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Numer" msgid "Enter Destination" msgstr "Podaj cel" msgid "Zip Code" msgstr "Kod Pocztowy" msgid "City" msgstr "Miasto" msgid "District/Township" msgstr "Dzielnica/Okręg miejski" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Zakładka" msgid "Destination" msgstr "Cel" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Wyświetl" msgid "_Route" msgstr "_Trasa" msgid "_Former Destinations" msgstr "_Poprzednie cele" msgid "_Bookmarks" msgstr "_Zakładki" msgid "_Map" msgstr "_Mapa" msgid "_Layout" msgstr "_Układ kolorów" msgid "_Projection" msgstr "_Odwzorowanie" msgid "_Vehicle" msgstr "_Pojazd" msgid "Zoom_Out" msgstr "Oddal" msgid "Decrease zoom level" msgstr "Zmniejsz poziom powiększenia" msgid "Zoom_In" msgstr "Zbliż" msgid "Increase zoom level" msgstr "Zwiększ poziom powiększenia" msgid "_Recalculate" msgstr "_Oblicz ponownie" msgid "Redraw map" msgstr "Przerysuj mapę" msgid "_Info" msgstr "_Info" msgid "Set _destination" msgstr "Ustaw _cel" msgid "Opens address search dialog" msgstr "Otwórz okno dialogowe wyszukiwania adresu" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "_Zatrzymaj nawigację" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Zakończ" msgid "Quit the application" msgstr "Wyjście z aplikacji" msgid "Show position _cursor" msgstr "Pokaż pozycję _kursora" msgid "_Lock on Road" msgstr "_Trzymaj się drogi" msgid "_Keep orientation to the North" msgstr "_Zachowaj orientację na Północ" msgid "Switches map orientation to the north or the vehicle" msgstr "Przełącz orientację mapy na północ lub pojazd" msgid "_Roadbook" msgstr "_Szczegóły trasy" msgid "Show/hide route description" msgstr "Pokaż/ukryj opis drogi" msgid "_Autozoom" msgstr "_Automatyczne przybliżenie" msgid "Enable/disable automatic zoom level changing" msgstr "Włącz/wyłącz automatyczną zmianę poziomu powiększenia" msgid "_Fullscreen" msgstr "_Pełny ekran" msgid "Data" msgstr "Dane" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SW" msgid "W" msgstr "W" msgid "NW" msgstr "NW" #. Android resource: @strings/no msgid "No" msgstr "Nie" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Trasa %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Trasa 0000km 0+00:00 ETA" msgid "Help" msgstr "Pomoc" #, c-format msgid "Waypoint %s" msgstr "Punkt trasy %s" msgid "Select waypoint to insert the new one before" msgstr "Wybierz punkt trasy aby wstawić przed nowy" msgid "View in Browser" msgstr "Zobacz w przeglądarce" msgid "Item type" msgstr "Typ pozycji" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "Numery domów" msgid "View Attributes" msgstr "Zobacz właściwości" msgid "Set as position (and deactivate vehicle)" msgstr "Ustaw jako pozycję (i deaktywuj pojazd)" msgid "POIs" msgstr "Użyteczne miejsca" msgid "View on map" msgstr "Zobacz na mapie" msgid "Remove search results from the map" msgstr "Usuń wyniki wyszukiwania z mapy" msgid "Show results on the map" msgstr "Pokaż wyniki na mapie" msgid "Cut Bookmark" msgstr "Wytnij zakładkę" msgid "Copy Bookmark" msgstr "Kopiuj zakładkę" msgid "Rename Bookmark" msgstr "Zmień nazwę zakładki" msgid "Paste Bookmark" msgstr "Wklej zakładkę" msgid "Delete Bookmark" msgstr "Usuń zakładkę" msgid "Delete waypoint" msgstr "Usuń punkt trasy" msgid "Bookmarks" msgstr "Zakładki" msgid "Bookmarks as waypoints" msgstr "Zakładki jako punkty trasy" msgid "Save waypoints" msgstr "Zapisz punkty trasy" msgid "Replace with waypoints" msgstr "Zamień punktami trasy" msgid "Delete Folder" msgstr "Usuń Katalog" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Dodaj folder zakładek" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Wklej zakładkę" #, c-format msgid "Bookmark %s" msgstr "Zakładka %s" #, c-format msgid "Download %s" msgstr "Pobieranie %s" msgid "Map Download" msgstr "Pobieranie Mapy" msgid "Active" msgstr "Aktywny" msgid "Download Enabled" msgstr "Włączone pobieranie" msgid "Download completely" msgstr "Pobieranie kompletne" msgid "Show Satellite Status" msgstr "Pokaż status satelitów" msgid " Elevation " msgstr " Wysokość n.p.m. " msgid " Azimuth " msgstr " Azymut " msgid "Show NMEA Data" msgstr "Pokaż dane NMEA" msgid "car" msgstr "auto" msgid "bike" msgstr "motor" msgid "pedestrian" msgstr "pieszy" #, c-format msgid "Current profile: %s" msgstr "Aktualny profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Zmień profil na: %s" msgid "Set as active" msgstr "Ustaw jako aktywny" msgid "Show Satellite status" msgstr "Pokaż status satelitów" msgid "Show NMEA data" msgstr "Pokaż dane NMEA" msgid "Add Bookmark" msgstr "Dodaj zakładkę" msgid "Rename" msgstr "Zmień nazwę" msgid "About Navit" msgstr "O Navit" #. Authors msgid "By" msgstr "Przez" #. Contributors msgid "And all the Navit Team" msgstr "I cały zespół Navit" msgid "members and contributors." msgstr "członkowie oraz współtwórcy." msgid "Waypoints" msgstr "Punkty trasy" msgid "Enter Coordinates" msgstr "Wprowadź współrzędne" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "Wprowadź współrzędne, na przykład:" msgid "Vehicle" msgstr "Pojazd" msgid "Rules" msgstr "Reguły" msgid "Lock on road" msgstr "Trzymaj się drogi" msgid "Northing" msgstr "Północ zawsze na górze" msgid "Map follows Vehicle" msgstr "Wyśrodkuj mapę" msgid "Plan with Waypoints" msgstr "Plan z punktami trasy" msgid "Maps" msgstr "Mapy" msgid "Layout" msgstr "Układ kolorów" msgid "Height Profile" msgstr "Profil wysokości" msgid "Route Description" msgstr "Opis trasy" msgid "Show Locale" msgstr "Pokaż ustawienia regionalne" msgid "Former Destinations" msgstr "Poprzednie cele" msgid "- No former destinations available -" msgstr "- Brak dostępnych poprzednich celów -" msgid "Message" msgstr "Wiadomość" msgid "Back" msgstr "Wróć" msgid "Back to map" msgstr "Wróć do mapy" msgid "Main Menu" msgstr "Menu główne" msgid "House number" msgstr "Numer domu" msgid "Next" msgstr "Następny" msgid "Prev" msgstr "Poprzedni" msgid "Return to route!" msgstr "Powróć do drogi!" #. warning told msgid "Look out! Camera!" msgstr "Uważaj! Radar!" #. warning told msgid "Please decrease your speed" msgstr "Proszę zmniejszyć szybkość" msgid "partial match" msgstr "częściowe dopasowanie" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Wyszukaj" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Miasta" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Prowadź z tąd" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Dane Mapy (c) OpenStreetMap contributors, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Pobrane Mapy" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Anuluj" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Cały Ś" msgid "Africa" msgstr "Afryka" msgid "Canary Islands" msgstr "Wyspy Kanaryjskie" msgid "Asia" msgstr "Azja" msgid "Korea" msgstr "Korea" msgid "Taiwan" msgstr "Tajwan" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "Oceania" msgid "Tasmania" msgstr "Tasmania" msgid "Victoria" msgstr "Wiktoria" msgid "New South Wales" msgstr "Nowa Południowa Walia" msgid "Europe" msgstr "Europa" msgid "Western Europe" msgstr "Europa Zachodnia" msgid "Azores" msgstr "Azores" msgid "BeNeLux" msgstr "Benelux" msgid "Alsace" msgstr "Alaska" msgid "Aquitaine" msgstr "Akwitania" msgid "Auvergne" msgstr "Owernia" msgid "Basse-Normandie" msgstr "Dolna Normandia" msgid "Bourgogne" msgstr "Burgundia" msgid "Bretagne" msgstr "Bretania" msgid "Centre" msgstr "Środek" msgid "Champagne-Ardenne" msgstr "Szampania-Ardeny" msgid "Corse" msgstr "Korsyka" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "Górna Normandia" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "Langwedocja-Roussillon" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "Lotaryngia" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "Pikardia" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "Bawaria" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "Szwabia" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "Brandenburgia" msgid "Bremen" msgstr "Brema (Bremen)" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hesja" msgid "Mecklenburg-Vorpommern" msgstr "Meklemburgia-Pomorze Przednie" msgid "Niedersachsen" msgstr "Dolna Saksonia" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "Nadrenia-Palatynat" msgid "Saarland" msgstr "Saara" msgid "Sachsen-Anhalt" msgstr "Saksonia-Anhalt" msgid "Sachsen" msgstr "Saksonia" msgid "Schleswig-Holstein" msgstr "Szlezwik-Holsztyn" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "Galicja" msgid "Scandinavia" msgstr "Skandynawia" msgid "England" msgstr "Anglia" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "Kumbria" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "Szkocja" msgid "Wales" msgstr "Walia" msgid "Crete" msgstr "Kreta" msgid "North America" msgstr "Ameryka Północna" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawaje" msgid "USA" msgstr "Stany Zjednoczone Ameryki" msgid " (except Alaska and Hawaii)" msgstr " (z wyjątkiem Alaski i Hawaji)" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Północny wschód" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacyfik" msgid "South" msgstr "Południe" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Dystrykt Kolumbii" msgid "Florida" msgstr "Floryda" msgid "Louisiana" msgstr "Luizjana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Wirginia" msgid "West Virginia" msgstr "Zachodnia Wirginia" msgid "West" msgstr "Zachód" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Kalifornia" msgid "Colorado" msgstr "Kolorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nowy Meksyk (New Mexico)" msgid "Nevada" msgstr "Newada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Stan Waszyngton" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "Gujana Francuska" msgid "downloading" msgstr "Pobieranie" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "gotowe" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Za mało wolnego miejsca" msgid "Error downloading map!" msgstr "Błąd przy pobieraniu map" msgid "Error writing map!" msgstr "Bład przy zapisywaniu mapy!" msgid "Map download aborted!" msgstr "Pobieranie mapy anulowane!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Pozostało" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Pobierz mape" msgid "Vehicle Position" msgstr "Pozycja pojazdu" msgid "Main menu" msgstr "Menu główne" msgid "" "Show\n" "Map" msgstr "" "Pokaż\n" "mapę" msgid "Settings" msgstr "Ustawienia" msgid "Tools" msgstr "Narzędzia" msgid "Route" msgstr "Trasa" msgid "About" msgstr "O" msgid "Quit" msgstr "Zakończ" msgid "Actions" msgstr "Akcje" msgid "" "Former\n" "Destinations" msgstr "" "Poprzednie\n" "Cele" msgid "Coordinates" msgstr "Współrzędne" msgid "" "Stop\n" "Navigation" msgstr "" "Przerwij\n" "nawigację" msgid "Display" msgstr "Pokaż" msgid "Fullscreen" msgstr "Pełny ekran" msgid "Window Mode" msgstr "Tryb Widoku" msgid "Description" msgstr "Opis" msgid "" "Drop last \n" "Waypoint" msgstr "" "Opuść ostatni \n" "Punkt trasy" msgid "" "Drop next \n" "Waypoint" msgstr "" "Opuść następny \n" "Punkt trasy" msgid "Satellite Status" msgstr "Status satelity" msgid "NMEA Data" msgstr "Dane NMEA" msgid "car_shortest" msgstr "samochód_najkrótsza" msgid "car_avoid_tolls" msgstr "samochód_unikanie_opłat" msgid "car_pedantic" msgstr "samochód _pedantyczny" msgid "horse" msgstr "koń" msgid "Truck" msgstr "Ciężarówka" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Tak" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit wystartował" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit uruchomiony" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Witaj w Navit :)" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Dziękujemy za instalacje Navit!\n" "\n" "Aby rozpocząć, wybierz \"Pobierz Mapy\" z menu aby pobrać mapę. Uwaga: Mapa " "może być duża (>50MB) - połączenie WIFI zalecane.\n" "\n" "Dane Mapy: (c) OpenStreetMap contributors\n" "\n" "Życzymy miłego użytkowania!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Więcej informacji" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Przybliż (+)" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Oddal (-)" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Pobierz Mapy" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Wyjdź z Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Zarchiwizuj / Przywróć" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Skasować tą mape?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Pobieram:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Błąd przy pobieraniu mapy." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Pobieranie mapy anulowane" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mapy zawierające obecną lokalizacje" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Wyszukiwanie Adresu" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Podaj punkt docelowy" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Częściowe dopasowanie adresu" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Wyszukiwanie..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adres nie znaleziony" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Pobieranie wyników wyszukiwania" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Ładowanie wyników wyszukiwania" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Brak wyników" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Nie wpisano tekstu" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Ustawiam punkt docelowy na:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Wybierz akcje" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Prosze włożyć karte SD" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Tworzenie kopii zapasowej..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Przywracanie..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Bład przy tworzeniu folderu kopii zapasowej" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Kopia zapasowa nie została wykonana" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Nie znaleziono kopii zapasowej" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Błąd przy przywracaniu" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Kopia zapasowa wykonana" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Przywracanie wykonano pomyślnie\n" "Prosze zrestartować Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Nie znaleziono kopii zapasowej" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Przywracanie zakończyło się niepowodzeniem" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Wybierz kopiie zapasową" #. Android resource: @strings/backup msgid "Backup" msgstr "Kopia zapasowa" #. Android resource: @strings/restore msgid "Restore" msgstr "Przywróć" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "następnie zjedź z ronda na %1$s %2$s" navit-0.5.0+dfsg.1/po/pms.po.in000066400000000000000000001102451264204753600161110ustar00rootroot00000000000000# Piemontese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Simone Briatore https://launchpad.net/~simone-bri msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Simone Briatore \n" "Language-Team: Piemontese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: pms\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "a prima" msgid "second" msgstr "a sgunda" msgid "third" msgstr "a tersa" msgid "fourth" msgstr "a quarta" msgid "fifth" msgstr "a quinta" msgid "sixth" msgstr "a sescia" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "prima surtia" msgid "second exit" msgstr "sgunda surtia" msgid "third exit" msgstr "tersa surtia" msgid "fourth exit" msgstr "quarta surtia" msgid "fifth exit" msgstr "quinta surtia" msgid "sixth exit" msgstr "sescia surtia" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d chilometer" #, c-format msgid "in %d.%d kilometers" msgstr "tra %d.%d chilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "in tla rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "" msgid "now" msgstr "" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Surtia" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/pt.po.in000066400000000000000000001407741264204753600157470ustar00rootroot00000000000000# Portuguese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # CaioNavas https://launchpad.net/~webmaster-caiomnavas # Carla Pita https://launchpad.net/~carla-pita # Diogo Lavareda https://launchpad.net/~diogolavareda # Ivo Xavier https://launchpad.net/~ivoxavier # Joel Patrão https://launchpad.net/~jpatrao # João Pirralha https://launchpad.net/~joaopirralha # Rui Correia https://launchpad.net/~rds-correia # Skippern https://launchpad.net/~gay-today # Sérgio Marques https://launchpad.net/~sergio+marques # Tiago Silva https://launchpad.net/~tiagosilva # TopoLusitania https://launchpad.net/~topolusitania # brukutu https://launchpad.net/~brukutu99 # eSkiSo https://launchpad.net/~wise-gdr # lezurdis https://launchpad.net/~f-dos-santos msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-09-19 14:04+0000\n" "Last-Translator: João Pirralha \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: pt\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando do diretório de origem\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "definindo %s para %s\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "primeira" msgid "second" msgstr "segunda" msgid "third" msgstr "terceira" msgid "fourth" msgstr "quarta" msgid "fifth" msgstr "quinta" msgid "sixth" msgstr "sexta" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "saída zero" msgid "first exit" msgstr "primeira saída" msgid "second exit" msgstr "segunda saída" msgid "third exit" msgstr "terceira saída" msgid "fourth exit" msgstr "quarta saída" msgid "fifth exit" msgstr "quinta saída" msgid "sixth exit" msgstr "sexta saída" #, c-format msgid "%d feet" msgstr "%d pés" #, c-format msgid "in %d feet" msgstr "em %d pés" #, c-format msgid "%d.%d miles" msgstr "%d.%d milhas" #, c-format msgid "in %d.%d miles" msgstr "em %d.%d milhas" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "uma milha" msgstr[1] "%d milhas" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "em uma milha" msgstr[1] "em %d milhas" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "em %d metros" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d quilómetro" #, c-format msgid "in %d.%d kilometers" msgstr "em %d.%d quilómetros" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "um quilómetro" msgstr[1] "%d quilómetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "em um quilómetro" msgstr[1] "em %d quilómetros" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$spara %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$spara %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$spara o %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$spara a %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$spara %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "no acesso à auto-estrada" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sem %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sno %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sem %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sna %s" msgid "When possible, please turn around" msgstr "Quando for possível, inverta o sentido de marcha" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "rumo a %s" #, c-format msgid "Follow the road for the next %s" msgstr "Siga a estrada para a próxima %s" msgid "Enter the roundabout soon" msgstr "Entre na próxima rotunda" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Entre na rotunda %s" msgid "then enter the roundabout" msgstr "e entre na rotunda" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Saia da rotunda na %1$s %2$s" msgid "soon" msgstr "logo" msgid "now" msgstr "agora" msgid "then" msgstr "e depois" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "e juntar à direita%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Juntar à direita %1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "e juntar à esquerda%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Juntar à esquerda %1$s%2$s" msgid "on your left" msgstr "à sua esquerda" msgid "on your right" msgstr "à sua direita" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Saia %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Saia na saída %1$s %2$s%3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "no trevo" msgid "at exit" msgstr "na saída" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "e avance%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "Avance %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "e continue à direita%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "Continue à direita %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "e continue à esquerda%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "Continue à esquerda %1$s%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "à direita" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "à esquerda" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "ligeiramente " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "apertadamente " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "depois apanhe a %1$s estrada para %2$s" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Apanhe a %1$s estrada para a %2$s" #, c-format msgid "after %i roads" msgstr "depois de %i estradas" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Vire %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "e dê meia-volta à esquerda" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Dê meia-volta à esquerda %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "e dê meia-volta à direita" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Dê meia-volta à direita %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "siga" msgid "then you have reached your destination." msgstr "depois chegou ao seu destino." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Chega ao seu destino %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Trevo" msgid "Exit" msgstr "Saída" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posição" msgid "Command" msgstr "Instrução" msgid "Length" msgstr "Distância" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Duração" msgid "Destination Length" msgstr "Distância ao destino" msgid "Destination Time" msgstr "Duração até ao destino" msgid "Roadbook" msgstr "Descrição da rota" #, c-format msgid "Waypoint %d" msgstr "Ponto %d" msgid "Visit before..." msgstr "Visitar antes de..." msgid "Set as position" msgstr "Definir como posição" msgid "Set as destination" msgstr "Definir como destino" msgid "Add as bookmark" msgstr "Adicionar como marcador" #, c-format msgid "Point 0x%x 0x%x" msgstr "Ponto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordenadas: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emirados Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afeganistão" #. 028 msgid "Antigua and Barbuda" msgstr "Antígua e Barbados" #. 660 msgid "Anguilla" msgstr "Anguilha" #. 008 msgid "Albania" msgstr "Albânia" #. 051 msgid "Armenia" msgstr "Arménia" #. 530 msgid "Netherlands Antilles" msgstr "Antilhas Holandesas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Áustria" #. 036 msgid "Australia" msgstr "Austrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ilhas Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbeijão" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bósnia e Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgária" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benim" #. 652 msgid "Saint Barthelemy" msgstr "São Bartolomeu" #. 060 msgid "Bermuda" msgstr "Bermudas" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius e Saba" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butão" #. 074 msgid "Bouvet Island" msgstr "Ilha Bouvet" #. 072 msgid "Botswana" msgstr "Botsuana" #. 112 msgid "Belarus" msgstr "Bielorrússia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Ilhas Cocos" #. 180 msgid "Congo, Democratic Republic of the" msgstr "República Democrática do Congo" #. 140 msgid "Central African Republic" msgstr "República Centro Africana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suíça" #. 384 msgid "Cote d'Ivoire" msgstr "Costa do Marfim" #. 184 msgid "Cook Islands" msgstr "Ilhas Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camarões" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colômbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "Coração" #. 162 msgid "Christmas Island" msgstr "Ilha Natal" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Checa" #. 276 msgid "Germany" msgstr "Alemanha" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Argélia" #. 218 msgid "Ecuador" msgstr "Equador" #. 233 msgid "Estonia" msgstr "Estónia" #. 818 msgid "Egypt" msgstr "Egito" #. 732 msgid "Western Sahara" msgstr "Sahara Ocidental" #. 232 msgid "Eritrea" msgstr "Eritreia" #. 724 msgid "Spain" msgstr "Espanha" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Finlândia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Ilhas Falkland (Maldinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Estados Federados da Micronésia" #. 234 msgid "Faroe Islands" msgstr "Ilhas Faroé" #. 250 msgid "France" msgstr "França" #. 266 msgid "Gabon" msgstr "Gabão" #. 826 msgid "United Kingdom" msgstr "Reino Unido" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Geórgia" #. 254 msgid "French Guiana" msgstr "Guiana Francesa" #. 831 msgid "Guernsey" msgstr "Guernesei" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Gronelândia" #. 270 msgid "Gambia" msgstr "Gâmbia" #. 324 msgid "Guinea" msgstr "Guiné" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guiné Equatorial" #. 300 msgid "Greece" msgstr "Grécia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Geórgia do Sul e Ilhas Sandwich do Sul" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guiné Bissau" #. 328 msgid "Guyana" msgstr "Guiana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Ilha Heard e Ilhas McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croácia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungria" #. 360 msgid "Indonesia" msgstr "Indonésia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Ilha de Man" #. 356 msgid "India" msgstr "Índia" #. 086 msgid "British Indian Ocean Territory" msgstr "Território Britânico do Oceano Índico" #. 368 msgid "Iraq" msgstr "Iraque" #. 364 msgid "Iran, Islamic Republic of" msgstr "República Islâmica do Irão" #. 352 msgid "Iceland" msgstr "Islândia" #. 380 msgid "Italy" msgstr "Itália" #. 832 msgid "Jersey" msgstr "Jérsia" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordânia" #. 392 msgid "Japan" msgstr "Japão" #. 404 msgid "Kenya" msgstr "Quénia" #. 417 msgid "Kyrgyzstan" msgstr "Quirgistão" #. 116 msgid "Cambodia" msgstr "Cambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "São Cristóvão e Neves" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "República Popular Democrática da Coreia" #. 410 msgid "Korea, Republic of" msgstr "República da Coreia" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Ilhas Caimão" #. 398 msgid "Kazakhstan" msgstr "Kazaquistão" #. 418 msgid "Lao People's Democratic Republic" msgstr "Républica Democrática Popular do Laos" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Lúcia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lituânia" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letónia" #. 434 msgid "Libya" msgstr "Líbia" #. 504 msgid "Morocco" msgstr "Marrocos" #. 492 msgid "Monaco" msgstr "Mónaco" #. 498 msgid "Moldova, Republic of" msgstr "República da Moldávia" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "São Martim (Território Francês)" #. 450 msgid "Madagascar" msgstr "Madagáscar" #. 584 msgid "Marshall Islands" msgstr "Ilhas Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedónia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Birmânia" #. 496 msgid "Mongolia" msgstr "Mongólia" #. 446 msgid "Macao" msgstr "Macau" #. 580 msgid "Northern Mariana Islands" msgstr "Ilhas Marianas do Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritânia" #. 500 msgid "Montserrat" msgstr "Monserrate" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Maurícias" #. 462 msgid "Maldives" msgstr "Maldivas" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malásia" #. 508 msgid "Mozambique" msgstr "Moçambique" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nova Caledónia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Ilha Norfolk" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nicarágua" #. 528 msgid "Netherlands" msgstr "Holanda" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Zelândia" #. 512 msgid "Oman" msgstr "Omã" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinésia Francesa" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Guiné" #. 608 msgid "Philippines" msgstr "Filipinas" #. 586 msgid "Pakistan" msgstr "Paquistão" #. 616 msgid "Poland" msgstr "Polónia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre e Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Territórios Palestinos, Ocupados" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Catar" #. 638 msgid "Reunion" msgstr "Reunião" #. 642 msgid "Romania" msgstr "Roménia" #. 688 msgid "Serbia" msgstr "Sérvia" #. 643 msgid "Russian Federation" msgstr "Federação Russa" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arábia Saudita" #. 090 msgid "Solomon Islands" msgstr "Ilhas Salomão" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudão" #. 752 msgid "Sweden" msgstr "Suécia" #. 702 msgid "Singapore" msgstr "Singapura" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovénia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslováquia" #. 694 msgid "Sierra Leone" msgstr "Serra Leoa" #. 674 msgid "San Marino" msgstr "São Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somália" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "Sudão do Sul" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (Território Holandês)" #. 760 msgid "Syrian Arab Republic" msgstr "República Árabe da Síria" #. 748 msgid "Swaziland" msgstr "Suazilândia" #. 796 msgid "Turks and Caicos Islands" msgstr "Ilhas Turcas e Caicos" #. 148 msgid "Chad" msgstr "Chade" #. 260 msgid "French Southern Territories" msgstr "Territórios Franceses do Sul" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailândia" #. 762 msgid "Tajikistan" msgstr "Tajiquistão" #. 772 msgid "Tokelau" msgstr "Toquelau" #. 626 msgid "Timor-Leste" msgstr "Timor Leste" #. 795 msgid "Turkmenistan" msgstr "Turquemenistão" #. 788 msgid "Tunisia" msgstr "Tunísia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidade e Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, Província da China" #. 834 msgid "Tanzania, United Republic of" msgstr "República Unida da Tânzania" #. 804 msgid "Ukraine" msgstr "Ucrânia" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Ilhas Menores Exteriores dos Estados Unidos" #. 840 msgid "United States" msgstr "Estados Unidos da América" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbequistão" #. 336 msgid "Holy See (Vatican City State)" msgstr "Santa Sé (Estado Cidade do Vaticano)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "São Vicente e Grenadinas" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Ilhas Virgens Britânicas" #. 850 msgid "Virgin Islands, U.S." msgstr "Ilhas Virgens Americanas" #. 704 msgid "Viet Nam" msgstr "Vietname" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Iémen" #. 175 msgid "Mayotte" msgstr "Maiote" #. 710 msgid "South Africa" msgstr "Africa do Sul" #. 894 msgid "Zambia" msgstr "Zâmbia" #. 716 msgid "Zimbabwe" msgstr "Zimbabué" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconhecido, adicione tags \"is_in\" para estas cidades" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" "Utilização do Navit:\n" "navit [opções] [ficheiro de configuração]\n" "\t-c : usar como ficheiro de configuração, em vez de " "usar o ficheiro pré-definido.\n" "\t-d : define o nível global de saída de depuração para (0=erro, " "1=aviso, 2=informação, 3=depuração).\n" "\tDefinições do ficheiro de configuração irão ter efeito mesmo quando " "definiram um nível superior.\n" "\t-h: imprimir esta informação de utilização e sair.\n" "\t-v: imprimir a versão e sair.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "Ficheiros de configuração navit.xml, navit.xml.local não encontrados\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Erro ao processar o ficheiro '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Utilizando o ficheiro '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" "Erro: Nenhuma configuração encontrada no ficheiro de configuração '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "Erro ao iniciar a aplicação. Verifique as mensagens de erro.\n" msgid "unknown street" msgstr "rua desconhecida" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Veículo sem nome" msgid "Failed to write bookmarks file" msgstr "Erro ao escrever os marcadores" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Ponto do mapa" msgid "Car" msgstr "Carro" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Cidade" msgid "District" msgstr "Distrito" msgid "Street" msgstr "Rua" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Introduza o destino" msgid "Zip Code" msgstr "Código postal" msgid "City" msgstr "Cidade" msgid "District/Township" msgstr "Distrito/Concelho" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Marcador" msgid "Destination" msgstr "Destino" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "_Exibir" msgid "_Route" msgstr "_Rota" msgid "_Former Destinations" msgstr "Destinos _anteriores" msgid "_Bookmarks" msgstr "_Marcadores" msgid "_Map" msgstr "_Mapa" msgid "_Layout" msgstr "_Esquema" msgid "_Projection" msgstr "_Projeção" msgid "_Vehicle" msgstr "_Veículo" msgid "Zoom_Out" msgstr "_Reduzir" msgid "Decrease zoom level" msgstr "Diminuir nível de ampliação" msgid "Zoom_In" msgstr "_Ampliar" msgid "Increase zoom level" msgstr "Aumentar nível de ampliação" msgid "_Recalculate" msgstr "_Recalcular" msgid "Redraw map" msgstr "Redesenhar mapa" msgid "_Info" msgstr "_Informação" msgid "Set _destination" msgstr "_Definir destino" msgid "Opens address search dialog" msgstr "Abre o diálogo de procura de destino" msgid "_POI search" msgstr "_Pesquisar POI" msgid "Opens POI search dialog" msgstr "Abre o diálogo de pesquisa de POI" msgid "_Stop Navigation" msgstr "Parar _navegação" msgid "Test" msgstr "Teste" msgid "_Quit" msgstr "_Sair" msgid "Quit the application" msgstr "Sair da aplicação" msgid "Show position _cursor" msgstr "Mostrar _cursor de posição" msgid "_Lock on Road" msgstr "_Bloqueio na estrada" msgid "_Keep orientation to the North" msgstr "Manter orientação ao _norte" msgid "Switches map orientation to the north or the vehicle" msgstr "Muda a orientação do mapa para o norte ou para o veículo" msgid "_Roadbook" msgstr "_Descrição da rota" msgid "Show/hide route description" msgstr "Mostrar/ocultar descrição da rota" msgid "_Autozoom" msgstr "_Tamanho automático" msgid "Enable/disable automatic zoom level changing" msgstr "Ativar/desativar tamanho automático da ampliação" msgid "_Fullscreen" msgstr "_Ecrã completo" msgid "Data" msgstr "Dados" msgid "Pharmacy" msgstr "Farmácia" msgid "Restaurant" msgstr "Restaurante" msgid "Restaurant. Fast food" msgstr "Restaurante. Comida rápida" msgid "Hotel" msgstr "Hotel" msgid "Car parking" msgstr "Estacionamento para carros" msgid "Fuel station" msgstr "Posto de abastecimento" msgid "Bank" msgstr "Banco" msgid "Hospital" msgstr "Hospital" msgid "Cinema" msgstr "Cinema" msgid "Train station" msgstr "Estação de comboios" msgid "School" msgstr "Escola" msgid "Police" msgstr "Polícia" msgid "Justice" msgstr "Justiça" msgid "Taxi" msgstr "Táxi" msgid "Shopping" msgstr "Compras" msgid "Distance from screen center (km)" msgstr "Distância ao centro do ecrã (km)" #, c-format msgid "POI %s. %s" msgstr "POI %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Definir destino para %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Definir mapa para %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "Definir próxima visita para %ld, %ld \n" msgid "POI search" msgstr "Pesquisar POIs" msgid "Select a category" msgstr "Selecione uma categoria" msgid "Select a distance to look for (km)" msgstr "Selecione a distância a pesquisar (km)" msgid "Select a POI" msgstr "Selecione um POI" msgid " " msgstr " " msgid "Category" msgstr "Categoria" msgid "Direction" msgstr "Direção" msgid "Distance(m)" msgstr "Distância (m)" msgid "Name" msgstr "Nome" msgid "Visit Before" msgstr "Visitar antes" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Não" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rota %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Rota 0000km 0+00:00 ETA" msgid "Help" msgstr "Ajuda" #, c-format msgid "Waypoint %s" msgstr "Ponto %s" msgid "Select waypoint to insert the new one before" msgstr "Selecione o ponto a inserir ao anterior" msgid "View in Browser" msgstr "Ver no navegador" msgid "Item type" msgstr "Tipo de item" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ruas" msgid "House numbers" msgstr "Números da casa" msgid "View Attributes" msgstr "Atributos de vista" msgid "Set as position (and deactivate vehicle)" msgstr "Definir como posição (desativar veículo)" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Ver no mapa" msgid "Remove search results from the map" msgstr "Remover resultados do mapa" msgid "Show results on the map" msgstr "Mostrar resultados no mapa" msgid "Cut Bookmark" msgstr "Cortar marcador" msgid "Copy Bookmark" msgstr "Copiar marcador" msgid "Rename Bookmark" msgstr "Mudar nome do marcador" msgid "Paste Bookmark" msgstr "Colar marcador" msgid "Delete Bookmark" msgstr "Eliminar marcador" msgid "Delete waypoint" msgstr "Eliminar ponto" msgid "Bookmarks" msgstr "Marcadores" msgid "Bookmarks as waypoints" msgstr "Marcadores como pontos" msgid "Save waypoints" msgstr "Gravar ponto" msgid "Replace with waypoints" msgstr "Substituir por pontos" msgid "Delete Folder" msgstr "Eliminar pasta" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Adicionar pasta de marcadores" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Colar marcador" #, c-format msgid "Bookmark %s" msgstr "Marcador %s" #, c-format msgid "Download %s" msgstr "Transferir %s" msgid "Map Download" msgstr "Transferência de mapas" msgid "Active" msgstr "Ativo" msgid "Download Enabled" msgstr "Transferência ativa" msgid "Download completely" msgstr "Transferência terminada" msgid "Show Satellite Status" msgstr "Mostrar estado do satélite" msgid " Elevation " msgstr " Elevação " msgid " Azimuth " msgstr " Azimute " msgid "Show NMEA Data" msgstr "Mostrar Dados NMEA" msgid "car" msgstr "carro" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "pé" #, c-format msgid "Current profile: %s" msgstr "Perfil atual: %s" #, c-format msgid "Change profile to: %s" msgstr "Alterar perfil para: %s" msgid "Set as active" msgstr "Definir como ativo" msgid "Show Satellite status" msgstr "Mostrar estado do satélite" msgid "Show NMEA data" msgstr "Mostrar dados NMEA" msgid "Add Bookmark" msgstr "Adicionar marcador" msgid "Rename" msgstr "Mudar nome" msgid "About Navit" msgstr "Sobre o Navit" #. Authors msgid "By" msgstr "De" #. Contributors msgid "And all the Navit Team" msgstr "E toda a equipa do Navit" msgid "members and contributors." msgstr "membros e contribuidores." msgid "Waypoints" msgstr "Pontos" msgid "Enter Coordinates" msgstr "Introduzir coordenadas" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Latitude Longitude" msgid "Enter coordinates, for example:" msgstr "Introduza as coordenadas, por exemplo:" msgid "Vehicle" msgstr "Veículo" msgid "Rules" msgstr "Regras" msgid "Lock on road" msgstr "Bloqueio na estrada" msgid "Northing" msgstr "Para Norte" msgid "Map follows Vehicle" msgstr "Mapa segue veículo" msgid "Plan with Waypoints" msgstr "Plano com pontos" msgid "Maps" msgstr "Mapas" msgid "Layout" msgstr "Esquema" msgid "Height Profile" msgstr "Perfil de altitude" msgid "Route Description" msgstr "Descrição da rota" msgid "Show Locale" msgstr "Exibir região e idioma" msgid "Former Destinations" msgstr "Destinos anteriores" msgid "- No former destinations available -" msgstr "- Não existem destinos anteriores -" msgid "Message" msgstr "Mensagem" msgid "Back" msgstr "Recuar" msgid "Back to map" msgstr "Voltar ao mapa" msgid "Main Menu" msgstr "Menu principal" msgid "House number" msgstr "Número de porta" msgid "Next" msgstr "Próximo" msgid "Prev" msgstr "Anterior" msgid "Return to route!" msgstr "Volte à sua rota!" #. warning told msgid "Look out! Camera!" msgstr "Atenção! Radar!" #. warning told msgid "Please decrease your speed" msgstr "Diminua a velocidade" msgid "partial match" msgstr "ocorrência parcial" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Procura" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Cidades" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Rota para aqui" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Dados do mapa (c) Colaboradores OpenStreetMap, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" "A atual localização do mapa %s não está disponível\n" "Por favor reinicie o Navit após introduzir um cartão SD ou selecionar uma " "localização do mapa diferente." msgid "Downloaded maps" msgstr "Mapas transferidos" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" "Infelizmente não suportamos mapas maiores que 3.8G no Android, por favor " "selecione um mais pequeno." msgid "Cancel" msgstr "Cancelar" msgid "filenamePath" msgstr "nomedoficheiroCaminho" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" "Nova localização definida para %s\n" "Reinicie o Navit para aplicar as alterações." msgid "Whole Planet" msgstr "Planeta" msgid "Africa" msgstr "África" msgid "Canary Islands" msgstr "Ilhas Canárias" msgid "Asia" msgstr "Ásia" msgid "Korea" msgstr "Coreia" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "EAU e outros" msgid "Oceania" msgstr "Oceania" msgid "Tasmania" msgstr "Tasmânia" msgid "Victoria" msgstr "Vitória" msgid "New South Wales" msgstr "Nova Gales do Sul" msgid "Europe" msgstr "Europa" msgid "Western Europe" msgstr "Europa Ocidental" msgid "Azores" msgstr "Açores" msgid "BeNeLux" msgstr "BeNeLux" msgid "Alsace" msgstr "Alsácia" msgid "Aquitaine" msgstr "Aquitaine" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Normandia" msgid "Bourgogne" msgstr "Burgonha" msgid "Bretagne" msgstr "Bretanha" msgid "Centre" msgstr "Centro" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Córsega" msgid "Franche-Comte" msgstr "Franche-Comte" msgid "Haute-Normandie" msgstr "Alta Normandia" msgid "Ile-de-France" msgstr "Ilha de França" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lorraine" msgid "Midi-Pyrenees" msgstr "Midi-Pyrenees" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Picardie" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provença-Alpes-Cote-d-Azur" msgid "Rhone-Alpes" msgstr "Rhone-Alpes" msgid "Baden-Wuerttemberg" msgstr "Baden-Wuerttemberg" msgid "Bayern" msgstr "Bayern" msgid "Mittelfranken" msgstr "Mittelfranken" msgid "Niederbayern" msgstr "Niederbayern" msgid "Oberbayern" msgstr "Oberbayern" msgid "Oberfranken" msgstr "Oberfranken" msgid "Oberpfalz" msgstr "Oberpfalz" msgid "Schwaben" msgstr "Schwaben" msgid "Unterfranken" msgstr "Unterfranken" msgid "Berlin" msgstr "Berlim" msgid "Brandenburg" msgstr "Brandenburgo" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburgo" msgid "Hessen" msgstr "Hessen" msgid "Mecklenburg-Vorpommern" msgstr "Mecklenburg-Vorpommern" msgid "Niedersachsen" msgstr "Niedersachsen" msgid "Nordrhein-westfalen" msgstr "Nordrhein-westfalen" msgid "Rheinland-Pfalz" msgstr "Rheinland-Pfalz" msgid "Saarland" msgstr "Saarland" msgid "Sachsen-Anhalt" msgstr "Sachsen-Anhalt" msgid "Sachsen" msgstr "Sachsen" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Thueringen" msgid "Mallorca" msgstr "Maiorca" msgid "Galicia" msgstr "Galiza" msgid "Scandinavia" msgstr "Escandinávia" msgid "England" msgstr "Inglaterra" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "Yorkshire do Sul com hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Yorkshire do Sul" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Escócia" msgid "Wales" msgstr "Gales" msgid "Crete" msgstr "Creta" msgid "North America" msgstr "América do Norte" msgid "Alaska" msgstr "Alasca" msgid "Hawaii" msgstr "Havai" msgid "USA" msgstr "EUA" msgid " (except Alaska and Hawaii)" msgstr " (exceto Alasca e Havai)" msgid "Midwest" msgstr "Midwest" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Nordeste" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacífico" msgid "South" msgstr "Sul" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Distrito de Columbia" msgid "Florida" msgstr "Flórida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virgínia" msgid "West Virginia" msgstr "Virginia Ocidental" msgid "West" msgstr "Oeste" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Califórnia" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Novo México" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Washington" msgid "South+Middle America" msgstr "América Central e América do Sul" msgid "Guyane Francaise" msgstr "Guiana Francesa" msgid "downloading" msgstr "a transferir" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "pronto" msgid "Media selected for map storage is not available" msgstr "A unidade selecionada para armazenar mapas não está dispoível" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Não existe espaço suficiente" msgid "Error downloading map!" msgstr "Erro ao transferir o mapa!" msgid "Error writing map!" msgstr "Erro ao escrever o mapa!" msgid "Map download aborted!" msgstr "Transferência interrompida!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Duração estimada" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Transferência do mapa" msgid "Vehicle Position" msgstr "Posição do veículo" msgid "Main menu" msgstr "Menu principal" msgid "" "Show\n" "Map" msgstr "" "Mostrar\n" "mapa" msgid "Settings" msgstr "Definições" msgid "Tools" msgstr "Ferramentas" msgid "Route" msgstr "Rota" msgid "About" msgstr "Sobre" msgid "Quit" msgstr "Sair" msgid "Actions" msgstr "Ações" msgid "" "Former\n" "Destinations" msgstr "" "Destinos\n" "anteriores" msgid "Coordinates" msgstr "Coordenadas" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "navegação" msgid "Display" msgstr "Visualização" msgid "Fullscreen" msgstr "Ecrã completo" msgid "Window Mode" msgstr "Modo de janela" msgid "Description" msgstr "Descrição" msgid "" "Drop last \n" "Waypoint" msgstr "" "Descartar\n" "ponto anterior" msgid "" "Drop next \n" "Waypoint" msgstr "" "Descartar\n" "próximo ponto" msgid "Satellite Status" msgstr "Estado do satélite" msgid "NMEA Data" msgstr "Dados NMEA" msgid "car_shortest" msgstr "carro_mais_curto" msgid "car_avoid_tolls" msgstr "carro_evitar_portagens" msgid "car_pedantic" msgstr "carro_pedante" msgid "horse" msgstr "cavalo" msgid "Truck" msgstr "Camião" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Sim" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit iniciado" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit em execução" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Bem-vindo ao Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Obrigado por instalar o Navit!\n" "\n" "Para começar, selecione \"Transferir mapas\" no menu para transferir um " "mapa. Nota: o tamanho do ficheiro de mapa pode ser bastante grande (>50MB) - " "recomenda-se a utilização de uma rede wifi.\n" "\n" "Dados do mapa: (c) colaboradores OpenStreetMap\n" "\n" "Esperamos que goste do Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "Sim" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Mais informações" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Ampliar" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Reduzir" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Transferir mapas" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Ativar POIs" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Sair" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Cópia seg. / Restauro" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "Definir localização do mapa" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Eliminar mapa?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "A transferir:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Erro ao transferir o mapa." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Transferência cancelada" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" "Localização indisponível. Abra novamente após determinar a localização." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mapas que contêm a posição atual" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Procura de endereço" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Introduza o destino" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Ocorrências parciais" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "A procurar..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Endereço não encontrado" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "A obter resultados" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Carregando resultados" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Nenhum resultado encontrado" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Nenhum texto introduzido" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Definir destino para:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Escolha uma ação" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Por favor insira um cartão SD" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "A criar cópia de segurança..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "A restaurar..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Falha ao criar o diretório da cópia de segurança" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "A cópia de segurança falhou" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Nenhuma cópia de segurança encontrada" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Falha ao restaurar" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Cópia de segurança efetuada com sucesso" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Restauro efetuado\n" "Reinicie o Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Cópia de segurança não encontrada" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Erro ao restaurar" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Escolha a cópia de segurança" #. Android resource: @strings/backup msgid "Backup" msgstr "Cópia de segurança" #. Android resource: @strings/restore msgid "Restore" msgstr "Restauro" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "Dados do motor de síntese de voz em falta no sistema" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" "O Navit pode usar qualquer motor de síntese de voz no dispositivo. O motor " "atualmente selecionado reporta não suportar o seu idioma. Pedir ao sistema " "para exibir o diálogo de transferência de voz?" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "e saia da rotunda na %1$s %2$s" navit-0.5.0+dfsg.1/po/pt_BR.po.in000066400000000000000000001371461264204753600163310ustar00rootroot00000000000000# Brazilian Portuguese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Carla Pita https://launchpad.net/~carla-pita # Francois Thunus https://launchpad.net/~thunus # Gustavo Guidorizzi https://launchpad.net/~gguido # Helder Santana https://launchpad.net/~helder-bs-santana # Jairo Roberto Duarte https://launchpad.net/~jairo58 # Julio Alexander Sieg https://launchpad.net/~julio-sieg # Leonardo Hamada https://launchpad.net/~leonardohamada # Luzemário https://launchpad.net/~luzemario # Matheus Cavalcante https://launchpad.net/~suetamac # Píndaro GBarbosa https://launchpad.net/~diecavallax # Rafael Nossal https://launchpad.net/~rafaelnossal # Roger https://launchpad.net/~rogerio-souza # Skippern https://launchpad.net/~gay-today # guilherme https://launchpad.net/~guidicavalcanti # hvera https://launchpad.net/~hamilton-listas # paulohm https://launchpad.net/~paulohm # pingflood https://launchpad.net/~pingflood msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-27 11:44+0000\n" "Last-Translator: Julio Alexander Sieg \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "Language: pt_BR\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Executando do diretório de origem\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ajustando de '%s' para '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "primeira" msgid "second" msgstr "segunda" msgid "third" msgstr "terceira" msgid "fourth" msgstr "quarta" msgid "fifth" msgstr "quinta" msgid "sixth" msgstr "sexta" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "saída zero" msgid "first exit" msgstr "primeira saída" msgid "second exit" msgstr "segunda saída" msgid "third exit" msgstr "terceira saída" msgid "fourth exit" msgstr "quarta saída" msgid "fifth exit" msgstr "quinta saída" msgid "sixth exit" msgstr "sexta saída" #, c-format msgid "%d feet" msgstr "%d pés" #, c-format msgid "in %d feet" msgstr "em %d pés" #, c-format msgid "%d.%d miles" msgstr "%d.%d milhas" #, c-format msgid "in %d.%d miles" msgstr "em %d.%d milhas" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "uma milha" msgstr[1] "%d milhas" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "em uma milha" msgstr[1] "em %d milhas" #, c-format msgid "%d meters" msgstr "%d metros" #, c-format msgid "in %d meters" msgstr "em %d metros" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d quilômetros" #, c-format msgid "in %d.%d kilometers" msgstr "em %d.%d quilômetros" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "um quilômetro" msgstr[1] "%d quilômetros" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "em um quilômetro" msgstr[1] "em %d quilômetros" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$sno %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "na rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sno %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sem %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sna %s" msgid "When possible, please turn around" msgstr "Quando possível, favor retornar" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "em direção a %s" #, c-format msgid "Follow the road for the next %s" msgstr "Continue na via por %s" msgid "Enter the roundabout soon" msgstr "Entre na rotatória em seguida" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Entre na rotatória %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Deixe a rotatória na %1$s %2$s" msgid "soon" msgstr "em breve" msgid "now" msgstr "agora" msgid "then" msgstr "em seguida" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "em seguida vire a %1$s|esquerda" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Vire a %1$s%2$s|esquerda" msgid "on your left" msgstr "à sua esquerda" msgid "on your right" msgstr "à sua direita" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Pegue a saída %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Pegue a saída %1$s %2$s %3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "no cruzamento" msgid "at exit" msgstr "na saída" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "em seguinda, siga%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "Siga %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "então mantenha a direita%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "Mantenha a direita %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "então mantenha a esquerda%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "Mantenha a esquerda %1$s%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "à direita" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "à esquerda" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "levemente " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "fortemente " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Pegue a %1$s via para a %2$s" #, c-format msgid "after %i roads" msgstr "após %i vias" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Vire a %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "então faça o retorno" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Faça o retorno a esquerda %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "então faça o retorno a direita" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Faça o retorno a direita %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "siga por" msgid "then you have reached your destination." msgstr "então você chegará ao destino." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Você chegará ao destino %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Trevo" msgid "Exit" msgstr "Saída" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Posição" msgid "Command" msgstr "Comando" msgid "Length" msgstr "Distância" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tempo" msgid "Destination Length" msgstr "Distância até o Destino" msgid "Destination Time" msgstr "Tempo até o Destino" msgid "Roadbook" msgstr "Guia de estrada" #, c-format msgid "Waypoint %d" msgstr "Ponto %d" msgid "Visit before..." msgstr "Adicionar à rota" msgid "Set as position" msgstr "Definir como posição" msgid "Set as destination" msgstr "Definir como destino" msgid "Add as bookmark" msgstr "Adicionar como favorito" #, c-format msgid "Point 0x%x 0x%x" msgstr "Ponto 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordenada na tela : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Emirados Árabes Unidos" #. 004 msgid "Afghanistan" msgstr "Afeganistão" #. 028 msgid "Antigua and Barbuda" msgstr "Antígua e Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albânia" #. 051 msgid "Armenia" msgstr "Armênia" #. 530 msgid "Netherlands Antilles" msgstr "Antilhas Holandesas" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antártida" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americana" #. 040 msgid "Austria" msgstr "Áustria" #. 036 msgid "Australia" msgstr "Austrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ilhas Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaijão" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bósnia e Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bélgica" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgária" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "São Bartolomeu" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, São Eustácio e Saba" #. 076 msgid "Brazil" msgstr "Brasil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butão" #. 074 msgid "Bouvet Island" msgstr "Ilha Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorrússia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canadá" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Ilhas Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "República Democrática do Congo" #. 140 msgid "Central African Republic" msgstr "República Centro-Africana" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Suíça" #. 384 msgid "Cote d'Ivoire" msgstr "Costa do Marfim" #. 184 msgid "Cook Islands" msgstr "Ilhas Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camarões" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Colômbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cabo Verde" #. 531 msgid "Curacao" msgstr "Curaçau" #. 162 msgid "Christmas Island" msgstr "Ilha Christmas" #. 196 msgid "Cyprus" msgstr "Chipre" #. 203 msgid "Czech Republic" msgstr "República Tcheca" #. 276 msgid "Germany" msgstr "Alemanha" #. 262 msgid "Djibouti" msgstr "Djibuti" #. 208 msgid "Denmark" msgstr "Dinamarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "República Dominicana" #. 012 msgid "Algeria" msgstr "Argélia" #. 218 msgid "Ecuador" msgstr "Equador" #. 233 msgid "Estonia" msgstr "Estônia" #. 818 msgid "Egypt" msgstr "Egito" #. 732 msgid "Western Sahara" msgstr "Saara Ocidental" #. 232 msgid "Eritrea" msgstr "Eritréia" #. 724 msgid "Spain" msgstr "Espanha" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Finlândia" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Ilhas Falkland (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronésia" #. 234 msgid "Faroe Islands" msgstr "Ilhas Faroé" #. 250 msgid "France" msgstr "França" #. 266 msgid "Gabon" msgstr "Gabão" #. 826 msgid "United Kingdom" msgstr "Reino Unido" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Geórgia" #. 254 msgid "French Guiana" msgstr "Guiana Francesa" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groelândia" #. 270 msgid "Gambia" msgstr "Gâmbia" #. 324 msgid "Guinea" msgstr "Guiné" #. 312 msgid "Guadeloupe" msgstr "Guadalupe" #. 226 msgid "Equatorial Guinea" msgstr "Guiné Equatorial" #. 300 msgid "Greece" msgstr "Grécia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Ilhas Geórgia e Sanduíche do Sul" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guiné-Bissau" #. 328 msgid "Guyana" msgstr "Guiana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Ilha Heard e Ilhas McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croácia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungria" #. 360 msgid "Indonesia" msgstr "Indonésia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Ilha de Man" #. 356 msgid "India" msgstr "Índia" #. 086 msgid "British Indian Ocean Territory" msgstr "Território Britânico do Oceano Índico" #. 368 msgid "Iraq" msgstr "Iraque" #. 364 msgid "Iran, Islamic Republic of" msgstr "Irã" #. 352 msgid "Iceland" msgstr "Islândia" #. 380 msgid "Italy" msgstr "Itália" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordânia" #. 392 msgid "Japan" msgstr "Japão" #. 404 msgid "Kenya" msgstr "Quênia" #. 417 msgid "Kyrgyzstan" msgstr "Quirguistão" #. 116 msgid "Cambodia" msgstr "Camboja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comores" #. 659 msgid "Saint Kitts and Nevis" msgstr "São Cristóvão e Névis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Coréia do Norte" #. 410 msgid "Korea, Republic of" msgstr "Coréia do Sul" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Ilhas Caiman" #. 398 msgid "Kazakhstan" msgstr "Cazaquistão" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laos" #. 422 msgid "Lebanon" msgstr "Líbano" #. 662 msgid "Saint Lucia" msgstr "Santa Lúcia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Siri Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Lituânia" #. 442 msgid "Luxembourg" msgstr "Luxemburgo" #. 428 msgid "Latvia" msgstr "Letônia" #. 434 msgid "Libya" msgstr "Líbia" #. 504 msgid "Morocco" msgstr "Marrocos" #. 492 msgid "Monaco" msgstr "Mônaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldávia" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "São Martin (parte francesa)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Ilhas Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedônia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mianmar" #. 496 msgid "Mongolia" msgstr "Mongólia" #. 446 msgid "Macao" msgstr "Macau" #. 580 msgid "Northern Mariana Islands" msgstr "Ilhas Marianas do Norte" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritânia" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Ilhas Maurício" #. 462 msgid "Maldives" msgstr "Ilhas Maldivas" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "México" #. 458 msgid "Malaysia" msgstr "Malásia" #. 508 msgid "Mozambique" msgstr "Moçambique" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nova Caledônia" #. 562 msgid "Niger" msgstr "Níger" #. 574 msgid "Norfolk Island" msgstr "Ilha Norfolk" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nicarágua" #. 528 msgid "Netherlands" msgstr "Holanda" #. 578 msgid "Norway" msgstr "Noruega" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Naurú" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Zelândia" #. 512 msgid "Oman" msgstr "Omã" #. 591 msgid "Panama" msgstr "Panamá" #. 604 msgid "Peru" msgstr "Perú" #. 258 msgid "French Polynesia" msgstr "Polinésia francesa" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Guiné" #. 608 msgid "Philippines" msgstr "Filipinas" #. 586 msgid "Pakistan" msgstr "Paquistão" #. 616 msgid "Poland" msgstr "Polônia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "São Pedro e Miquelão" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestina" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguai" #. 634 msgid "Qatar" msgstr "Catar" #. 638 msgid "Reunion" msgstr "Ilhas Reunião" #. 642 msgid "Romania" msgstr "Romênia" #. 688 msgid "Serbia" msgstr "Sérvia" #. 643 msgid "Russian Federation" msgstr "Rússia" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arábia Saudita" #. 090 msgid "Solomon Islands" msgstr "Ilhas Salomão" #. 690 msgid "Seychelles" msgstr "Seicheles" #. 736 msgid "Sudan" msgstr "Sudão" #. 752 msgid "Sweden" msgstr "Suécia" #. 702 msgid "Singapore" msgstr "Singapura" #. 654 msgid "Saint Helena" msgstr "Santa Helena" #. 705 msgid "Slovenia" msgstr "Eslovênia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. 703 msgid "Slovakia" msgstr "Eslováquia" #. 694 msgid "Sierra Leone" msgstr "Serra Leoa" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somália" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "Sudão do Sul" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "São Martinho" #. 760 msgid "Syrian Arab Republic" msgstr "Síria" #. 748 msgid "Swaziland" msgstr "Suazilândia" #. 796 msgid "Turks and Caicos Islands" msgstr "Ilhas Turcas e Caicos" #. 148 msgid "Chad" msgstr "Chade" #. 260 msgid "French Southern Territories" msgstr "Territórios Franceses do Sul" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailândia" #. 762 msgid "Tajikistan" msgstr "Tajiquistão" #. 772 msgid "Tokelau" msgstr "Toquelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turcomenistão" #. 788 msgid "Tunisia" msgstr "Tunísia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turquia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad e Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzânia" #. 804 msgid "Ukraine" msgstr "Ucrânia" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Ilhas Menores Distantes dos Estados Unidos" #. 840 msgid "United States" msgstr "Estados Unidos" #. 858 msgid "Uruguay" msgstr "Uruguai" #. 860 msgid "Uzbekistan" msgstr "Uzbequistão" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vaticano" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "São Vicente e Granadinas" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Ilhas Virgens Britânicas" #. 850 msgid "Virgin Islands, U.S." msgstr "Ilhas Virgens (Estados Unidos)" #. 704 msgid "Viet Nam" msgstr "Vietnã" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Iêmen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "África do Sul" #. 894 msgid "Zambia" msgstr "Zâmbia" #. 716 msgid "Zimbabwe" msgstr "Zimbábue" msgid "* Unknown, add is_in tags to those cities" msgstr "* Desconhecido, adicione tags \"is_in\" para essas cidades" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" "empregado no navit:\n" "navit [opções] [arquivo de configuração]\n" "\t-c : uso como arquivo de configuração, em vez de usar " "arquivo padrão.\n" "\t-d : definir o nível de saída de depuração global para (0=erro, " "1=aviso, 2=info, 3=depuração).\n" "\tConfigurações de arquivo de configuração ainda terão efeito quando " "montados num nível superior.\n" "\t-h: imprimir esta informação de utilização e sair.\n" "\t-v: imprimir a versão e sair.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "Nenhum arquivo de configuração navit.xml, navit.xml.local foi encontrado\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Erro ao analizar o arquivo de configuração '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Utilizando arquivo de configuração '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Erro: Nenhuma configuração encontrada no arquivo '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Inicialização interna falhou, finalizando. Verifique mensagens de erro " "anteriores.\n" msgid "unknown street" msgstr "rua desconhecida" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Veículo sem nome" msgid "Failed to write bookmarks file" msgstr "Falha ao gravar o arquivo de favoritos" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Ponto no Mapa" msgid "Car" msgstr "Carro" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "País" msgid "Postal" msgstr "Postal" msgid "Town" msgstr "Cidade" msgid "District" msgstr "Distrito" msgid "Street" msgstr "Rua" msgid "Number" msgstr "Número" msgid "Enter Destination" msgstr "Digite o destino" msgid "Zip Code" msgstr "CEP" msgid "City" msgstr "Cidade" msgid "District/Township" msgstr "Distrito/Comunidade" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Favorito" msgid "Destination" msgstr "Destino" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "E_xibição" msgid "_Route" msgstr "Ro_ta" msgid "_Former Destinations" msgstr "Destinos _Anteriores" msgid "_Bookmarks" msgstr "Mar_cadores" msgid "_Map" msgstr "_Mapa" msgid "_Layout" msgstr "Dis_posição" msgid "_Projection" msgstr "Pro_jeção" msgid "_Vehicle" msgstr "_Veículo" msgid "Zoom_Out" msgstr "A_fastar" msgid "Decrease zoom level" msgstr "Diminuir o nível de aproximação" msgid "Zoom_In" msgstr "Aproximar" msgid "Increase zoom level" msgstr "Aumentar o nível de aproximação" msgid "_Recalculate" msgstr "_Recalcular" msgid "Redraw map" msgstr "Redesenhar mapa" msgid "_Info" msgstr "_lnformação" msgid "Set _destination" msgstr "Estabelecer _destino" msgid "Opens address search dialog" msgstr "Abre a busca de endereço" msgid "_POI search" msgstr "_Pesquisar POI" msgid "Opens POI search dialog" msgstr "Abre a busca de POIs" msgid "_Stop Navigation" msgstr "_Cessar a Navegação" msgid "Test" msgstr "Teste" msgid "_Quit" msgstr "_Sair" msgid "Quit the application" msgstr "Sair da aplicação" msgid "Show position _cursor" msgstr "Mostrar a posição _cursor" msgid "_Lock on Road" msgstr "_Bloqueio na estrada" msgid "_Keep orientation to the North" msgstr "_Manter orientação para o Norte" msgid "Switches map orientation to the north or the vehicle" msgstr "Muda a orientação do mapa para o norte ou o veículo" msgid "_Roadbook" msgstr "_Guia de estrada" msgid "Show/hide route description" msgstr "Mostrar/ocultar descrição da rota" msgid "_Autozoom" msgstr "Aproximação Automática" msgid "Enable/disable automatic zoom level changing" msgstr "Ativar/desativar a mudança automática do nível de aproximação" msgid "_Fullscreen" msgstr "Tela _Cheia" msgid "Data" msgstr "Dados" msgid "Pharmacy" msgstr "Farmácia" msgid "Restaurant" msgstr "Restaurante" msgid "Restaurant. Fast food" msgstr "Restaurante Fast Food" msgid "Hotel" msgstr "Hotel" msgid "Car parking" msgstr "Estacionamento" msgid "Fuel station" msgstr "Posto de combustível" msgid "Bank" msgstr "Banco" msgid "Hospital" msgstr "Hospital" msgid "Cinema" msgstr "Cinema" msgid "Train station" msgstr "Estação de trem" msgid "School" msgstr "Escola" msgid "Police" msgstr "Polícia" msgid "Justice" msgstr "Justiça" msgid "Taxi" msgstr "Táxi" msgid "Shopping" msgstr "Comprando" msgid "Distance from screen center (km)" msgstr "Distância do centro da tela (km)" #, c-format msgid "POI %s. %s" msgstr "POI %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Definir destino para %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Definir mapa para o %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "Definir próxima parada parao %ld, %ld \n" msgid "POI search" msgstr "Pesquisar POI" msgid "Select a category" msgstr "Selecione uma categoria" msgid "Select a distance to look for (km)" msgstr "Selecione a distância para pesquisar (km)" msgid "Select a POI" msgstr "Selecione um POI" msgid " " msgstr " " msgid "Category" msgstr "Categori­a" msgid "Direction" msgstr "Direção" msgid "Distance(m)" msgstr "Distância (m)" msgid "Name" msgstr "Nome" msgid "Visit Before" msgstr "Visitar Antes" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "L" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Não" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rota %4.0fkm TEC %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Rota 0000km TEC 0+00:00" msgid "Help" msgstr "Ajuda" #, c-format msgid "Waypoint %s" msgstr "Ponto %s" msgid "Select waypoint to insert the new one before" msgstr "Selecione o ponto para inserir o novo antes" msgid "View in Browser" msgstr "Ver no Navegador" msgid "Item type" msgstr "Tipo do item" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ruas" msgid "House numbers" msgstr "Números das casas" msgid "View Attributes" msgstr "Ver Atributos" msgid "Set as position (and deactivate vehicle)" msgstr "Definir como posição (e desativar veículo)" msgid "POIs" msgstr "Pontos de Interesse" msgid "View on map" msgstr "Ver no mapa" msgid "Remove search results from the map" msgstr "Remover resultados da pesquisa do mapa" msgid "Show results on the map" msgstr "Exibir resultados no mapa" msgid "Cut Bookmark" msgstr "Recortar Favorito" msgid "Copy Bookmark" msgstr "Copiar Favorito" msgid "Rename Bookmark" msgstr "Renomear Favorito" msgid "Paste Bookmark" msgstr "Colar Favorito" msgid "Delete Bookmark" msgstr "Apagar Favorito" msgid "Delete waypoint" msgstr "Apagar ponto" msgid "Bookmarks" msgstr "Favoritos" msgid "Bookmarks as waypoints" msgstr "Favoritos como pontos" msgid "Save waypoints" msgstr "Salvar pontos" msgid "Replace with waypoints" msgstr "Substituir com pontos" msgid "Delete Folder" msgstr "Excluir pasta" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Adicionar pasta de Favoritos" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Colar favorito" #, c-format msgid "Bookmark %s" msgstr "Favorito %s" #, c-format msgid "Download %s" msgstr "Baixar %s" msgid "Map Download" msgstr "Baixar Mapa" msgid "Active" msgstr "Ativo" msgid "Download Enabled" msgstr "Habilitado para Baixar" msgid "Download completely" msgstr "Baixe completamente" msgid "Show Satellite Status" msgstr "Mostrar Estado do Satélite" msgid " Elevation " msgstr " Elevação " msgid " Azimuth " msgstr " Azimute " msgid "Show NMEA Data" msgstr "Mostrar Dados NMEA" msgid "car" msgstr "carro" msgid "bike" msgstr "bicicleta" msgid "pedestrian" msgstr "pedestre" #, c-format msgid "Current profile: %s" msgstr "Perfil atual: %s" #, c-format msgid "Change profile to: %s" msgstr "Alterar perfil para: %s" msgid "Set as active" msgstr "Definir como ativo" msgid "Show Satellite status" msgstr "Mostrar estado do Satélite" msgid "Show NMEA data" msgstr "Mostrar dados NMEA" msgid "Add Bookmark" msgstr "Adicionar Favorito" msgid "Rename" msgstr "Renomear" msgid "About Navit" msgstr "Sobre Navit" #. Authors msgid "By" msgstr "Por" #. Contributors msgid "And all the Navit Team" msgstr "E toda a equipe Navit" msgid "members and contributors." msgstr "membros e colaboradores." msgid "Waypoints" msgstr "Pontos da via" msgid "Enter Coordinates" msgstr "Digite as coordenadas" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Latitude Longitude" msgid "Enter coordinates, for example:" msgstr "Digite as coordenadas, por exemplo:" msgid "Vehicle" msgstr "Veículo" msgid "Rules" msgstr "Regulamento" msgid "Lock on road" msgstr "Bloqueio na estrada" msgid "Northing" msgstr "Ao Norte" msgid "Map follows Vehicle" msgstr "Mapa segue Veículo" msgid "Plan with Waypoints" msgstr "Planeje com pontos" msgid "Maps" msgstr "Mapas" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Perfil de Altitude" msgid "Route Description" msgstr "Descrição da Rota" msgid "Show Locale" msgstr "Inf. Regionais" msgid "Former Destinations" msgstr "Destinos Anteriores" msgid "- No former destinations available -" msgstr "- Destinos anteriores indisponíveis -" msgid "Message" msgstr "Mensagem" msgid "Back" msgstr "Voltar" msgid "Back to map" msgstr "Voltar ao mapa" msgid "Main Menu" msgstr "Menu Principal" msgid "House number" msgstr "Número da casa" msgid "Next" msgstr "Próximo" msgid "Prev" msgstr "Anterior" msgid "Return to route!" msgstr "Retorne para a rota!" #. warning told msgid "Look out! Camera!" msgstr "Cuidado! Radar!" #. warning told msgid "Please decrease your speed" msgstr "Por favor, reduza a velocidade" msgid "partial match" msgstr "resultado parcial" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Pesquisar" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Cidades" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Rota até aqui" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Dados do mapa (c) colaboradores OpenStreetMap, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Mapas baixados" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Cancelar" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Todo o Planeta" msgid "Africa" msgstr "África" msgid "Canary Islands" msgstr "Ilhas Canárias" msgid "Asia" msgstr "Ásia" msgid "Korea" msgstr "Coréia" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "UAE + Outros" msgid "Oceania" msgstr "Oceania" msgid "Tasmania" msgstr "Tasmânia" msgid "Victoria" msgstr "Vitória" msgid "New South Wales" msgstr "Nova Gales do Sul" msgid "Europe" msgstr "Europa" msgid "Western Europe" msgstr "Europa Ocidental" msgid "Azores" msgstr "Açores" msgid "BeNeLux" msgstr "Países Baixos" msgid "Alsace" msgstr "Alsácia" msgid "Aquitaine" msgstr "Aquitânia" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Baixa-Normandia" msgid "Bourgogne" msgstr "Borgonha" msgid "Bretagne" msgstr "Bretanha" msgid "Centre" msgstr "Centro" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Córsega" msgid "Franche-Comte" msgstr "Franche-Comte" msgid "Haute-Normandie" msgstr "Alta-Normandia" msgid "Ile-de-France" msgstr "Ile-deFrance" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lorena" msgid "Midi-Pyrenees" msgstr "Médio Pirineus" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "País do Loire" msgid "Picardie" msgstr "Picardia" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provença-Alpes-Costa Azul" msgid "Rhone-Alpes" msgstr "Rhone-Alpes" msgid "Baden-Wuerttemberg" msgstr "Baden-Wuerttemberg" msgid "Bayern" msgstr "Bayern" msgid "Mittelfranken" msgstr "Mittelfranken" msgid "Niederbayern" msgstr "Baixa Bavária" msgid "Oberbayern" msgstr "Alta Bavária" msgid "Oberfranken" msgstr "Alta Franconia" msgid "Oberpfalz" msgstr "Alto Palatinado" msgid "Schwaben" msgstr "Suábia" msgid "Unterfranken" msgstr "Baixa Francônia" msgid "Berlin" msgstr "Berlim" msgid "Brandenburg" msgstr "Brandenburg" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburgo" msgid "Hessen" msgstr "Hesse" msgid "Mecklenburg-Vorpommern" msgstr "Mecklenburgo-Pomerânia Ocidental" msgid "Niedersachsen" msgstr "Baixa Saxônia" msgid "Nordrhein-westfalen" msgstr "Renânia do Norte-Vestfália" msgid "Rheinland-Pfalz" msgstr "Renânia-Palatinado" msgid "Saarland" msgstr "Sarre" msgid "Sachsen-Anhalt" msgstr "Saxônia-Anhalt" msgid "Sachsen" msgstr "Saxônia" msgid "Schleswig-Holstein" msgstr "Schleswig-Holstein" msgid "Thueringen" msgstr "Turíngia" msgid "Mallorca" msgstr "Maiorca" msgid "Galicia" msgstr "Galicia" msgid "Scandinavia" msgstr "Escandinávia" msgid "England" msgstr "Inglaterra" msgid "Buckinghamshire" msgstr "Condado de Buckingham" msgid "Cambridgeshire" msgstr "Condado de Cambridge" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "Condado de York a leste do Hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Condado de Hereford" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "condado de Lanca" msgid "Leicestershire" msgstr "Condado de Leichester" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Condado de Nottinham" msgid "Oxfordshire" msgstr "Condado de Oxford" msgid "Shropshire" msgstr "Condado de Shrop" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Condado York do Sul" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "condado de Wilt" msgid "Scotland" msgstr "Escócia" msgid "Wales" msgstr "País de Gales" msgid "Crete" msgstr "Creta" msgid "North America" msgstr "América do Norte" msgid "Alaska" msgstr "Alasca" msgid "Hawaii" msgstr "Havaí" msgid "USA" msgstr "EUA" msgid " (except Alaska and Hawaii)" msgstr " (exceto Alasca e Havaí)" msgid "Midwest" msgstr "Meio Oeste" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Nordeste" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacífico" msgid "South" msgstr "Sul" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Distrito de Columbia" msgid "Florida" msgstr "Flórida" msgid "Louisiana" msgstr "Luisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virginia" msgid "West Virginia" msgstr "Virgínia Ocidental" msgid "West" msgstr "Oeste" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Califórnia" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Novo México" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Washington" msgid "South+Middle America" msgstr "Sul + América Central" msgid "Guyane Francaise" msgstr "Guiana Francesa" msgid "downloading" msgstr "baixando" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "pronto" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Não há espaço livre suficiente" msgid "Error downloading map!" msgstr "Erro ao baixar o mapa!" msgid "Error writing map!" msgstr "Erro escrevendo mapa!" msgid "Map download aborted!" msgstr "Baixa do mapa abortada!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "ETA" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Baixa do mapa" msgid "Vehicle Position" msgstr "Posição do Veículo" msgid "Main menu" msgstr "Menu principal" msgid "" "Show\n" "Map" msgstr "" "Mostrar\n" "Mapa" msgid "Settings" msgstr "Configurações" msgid "Tools" msgstr "Ferramentas" msgid "Route" msgstr "Rota" msgid "About" msgstr "Sobre" msgid "Quit" msgstr "Sair" msgid "Actions" msgstr "Ações" msgid "" "Former\n" "Destinations" msgstr "" "Destinos\n" "Anteriores" msgid "Coordinates" msgstr "Coordenadas" msgid "" "Stop\n" "Navigation" msgstr "" "Parar\n" "Navegação" msgid "Display" msgstr "Exibição" msgid "Fullscreen" msgstr "Tela cheia" msgid "Window Mode" msgstr "Modo de Janela" msgid "Description" msgstr "Descrição" msgid "" "Drop last \n" "Waypoint" msgstr "" "Remover último\n" "Ponto" msgid "" "Drop next \n" "Waypoint" msgstr "" "Remover próximo\n" "Ponto" msgid "Satellite Status" msgstr "Estado do Satélite" msgid "NMEA Data" msgstr "Dados NMEA" msgid "car_shortest" msgstr "carro_pequeno" msgid "car_avoid_tolls" msgstr "Evitar pedágios" msgid "car_pedantic" msgstr "detalhe do carro" msgid "horse" msgstr "cavalo" msgid "Truck" msgstr "Caminhão" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Sim" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit iniciou" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit rodando" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Bem-vindo ao Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Obrigado por instalar Navit!\n" "\n" "Para começar, selecione \"Importar mapas\" no menu para fazer o download de " "um mapa. Nota: O tamanho do arquivo do mapa pode ser grande (> 50MB) - uma " "conexão Wi-Fi é recomendada.\n" "\n" "Mapdata: (c) contribuidores OpenStreetMap\n" "\n" "Desfrute do Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Mais informações" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Aumentar zoom" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Diminuir zoom" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Baixar mapas" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Alternar POIs" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Sair do Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Backup / Restauração" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Excluir este mapa?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Baixando:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Erro ao baixar mapa." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Baixa do mapa abortada" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Nenhum local. Reabrir após corrigir localização" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mapas contendo localização atual" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Pesquisar endereço" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Digite o destino" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Combine endereço parcial" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Procurando..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Endereço não encontrado" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Obtendo resultados de busca" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Carregando resultados da busca" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Nenhum resultado encontrado" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Nenhum texto digitado" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Definir destino para:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Escolha uma ação" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Por favor insira um cartão SD" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Cópia de Segurança em andamento..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Restaurando ..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Falha ao criar o diretório da cópia de segurança" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Cópia de segurança falhou" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Não encontrou a cópia de segurança" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Falha ao restaurar" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Cópia de segurança bem-sucedida" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Restauração bem-sucedida\n" "Por favor, reinicie Navit" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Cópia de segurança não encontrada" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Falha na restauração" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Selecione a cópia de segurança" #. Android resource: @strings/backup msgid "Backup" msgstr "Cópia de segurança" #. Android resource: @strings/restore msgid "Restore" msgstr "Restaurar" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "então deixe a rotatória na %1$s %2$s" navit-0.5.0+dfsg.1/po/ro.po.in000066400000000000000000001241651264204753600157400ustar00rootroot00000000000000# Romanian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Ciprian https://launchpad.net/~c1pr1ancip # Eddy Petrisor https://launchpad.net/~eddy-petrisor-gmail # KaZeR https://launchpad.net/~kazer # Lucian Adrian Grijincu https://launchpad.net/~lucian.grijincu # Michael von Glasow https://launchpad.net/~michael-vonglasow # Nostriel https://launchpad.net/~nostriel # Ursache Dogariu Daniel https://launchpad.net/~danniel # dodobird https://launchpad.net/~dorinnirod # fasiol https://launchpad.net/~fasiol2 # igorashu https://launchpad.net/~ionut-soare msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "Language: ro\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Rulează din directorul sursă\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "se setează „%s” ca „%s”\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zero" msgid "first" msgstr "prima" msgid "second" msgstr "a doua" msgid "third" msgstr "a treia" msgid "fourth" msgstr "a patra" msgid "fifth" msgstr "a cincea" msgid "sixth" msgstr "a șasea" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "ieșirea zero" msgid "first exit" msgstr "prima ieșire" msgid "second exit" msgstr "a doua ieșire" msgid "third exit" msgstr "a treia ieșire" msgid "fourth exit" msgstr "a patra ieșire" msgid "fifth exit" msgstr "a cincea ieșire" msgid "sixth exit" msgstr "a șasea ieșire" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metri" #, c-format msgid "in %d meters" msgstr "în %d metri" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometri" #, c-format msgid "in %d.%d kilometers" msgstr "în %d.%d kilometri" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "un kilometru" msgstr[1] "%d kilometri" msgstr[2] "%d de kilometri" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "într-un kilometru" msgstr[1] "în %d kilometri" msgstr[2] "în %d de kilometri" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "pe rampă" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%spe %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%spe %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%spe %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%spe %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sspre %s" msgid "When possible, please turn around" msgstr "Când este posibil, întoarceţi" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Urmați drumul pentru încă %s" msgid "Enter the roundabout soon" msgstr "Intrați în curând în giratoriu" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Intrați în giratoriu %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Ieșiți din giratoriu la %1$s %2$s" msgid "soon" msgstr "curând" msgid "now" msgstr "acum" msgid "then" msgstr "apoi" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "la dreapta" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "la stânga" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "uşor " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "strâns " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Virați %2s pe %1s stradă" #, c-format msgid "after %i roads" msgstr "după %i străzi" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Virați %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "apoi întoarceţi" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Întoarceţi %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "apoi întoarceţi" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Întoarceţi %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "apoi ajungeți la destinație." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Ați ajuns la destinație %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Nod" msgid "Exit" msgstr "Ieșire" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Poziție" msgid "Command" msgstr "Comandă" msgid "Length" msgstr "Lungime" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Timp" msgid "Destination Length" msgstr "Lungimea până la destinaţie" msgid "Destination Time" msgstr "Timpul până la destinaţie" msgid "Roadbook" msgstr "Drum blocat" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Configurează ca poziție" msgid "Set as destination" msgstr "Configurează ca destinație" msgid "Add as bookmark" msgstr "Adaugă la semnele de carte" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punctul 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordonate ecran : %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Emiratele Arabe Unite" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua şi Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antilele Olandeze" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Samoa Americană" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia și Herțegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeș" #. 056 msgid "Belgium" msgstr "Belgia" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Sfântul Bartolomeu" #. 060 msgid "Bermuda" msgstr "Bermude" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilia" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Insula Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorusia" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Insulele Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Republica Democrată" #. 140 msgid "Central African Republic" msgstr "Republica Centrafricană" #. 178 msgid "Congo" msgstr "Congo" #. 756 msgid "Switzerland" msgstr "Elveția" #. 384 msgid "Cote d'Ivoire" msgstr "Coasta de Azur" #. 184 msgid "Cook Islands" msgstr "Insulele Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Camerun" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Columbia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Capul Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Insula Crăciunului" #. 196 msgid "Cyprus" msgstr "Cipru" #. 203 msgid "Czech Republic" msgstr "Republica Cehă" #. 276 msgid "Germany" msgstr "Germania" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danemarca" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Republica Dominicană" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Egipt" #. 732 msgid "Western Sahara" msgstr "Sahara de Vest" #. 232 msgid "Eritrea" msgstr "Eritreea" #. 724 msgid "Spain" msgstr "Spania" #. 231 msgid "Ethiopia" msgstr "Etiopia" #. 246 msgid "Finland" msgstr "Finlanda" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Insulele Falkland (Malvine)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Statele Federale ale" #. 234 msgid "Faroe Islands" msgstr "Insulele Feroe" #. 250 msgid "France" msgstr "Franţa" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Regatul Unit al Marii Britanii" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "Guiana Franceză" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Groenlanda" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guineea" #. 312 msgid "Guadeloupe" msgstr "Guadalupa" #. 226 msgid "Equatorial Guinea" msgstr "Guineea Ecuatorială" #. 300 msgid "Greece" msgstr "Grecia" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia de Sud şi Insulele Sudice Sandwich" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guineea-Bissau" #. 328 msgid "Guyana" msgstr "Guiana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Insulele Heard şi McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croaţia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungaria" #. 360 msgid "Indonesia" msgstr "Indonezia" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Insula Omului" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Teritoriul Britanic al Oceanului Indian" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Republica Islamică" #. 352 msgid "Iceland" msgstr "Islanda" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Iordan" #. 392 msgid "Japan" msgstr "Japonia" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirghistan" #. 116 msgid "Cambodia" msgstr "Cambogia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts şi Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Republica Democrată Poapulară Coreea" #. 410 msgid "Korea, Republic of" msgstr "Republica Coreea" #. 414 msgid "Kuwait" msgstr "Kuweit" #. 136 msgid "Cayman Islands" msgstr "Insulele Caiman" #. 398 msgid "Kazakhstan" msgstr "Kazahstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Republica Populară Democrată Lao" #. 422 msgid "Lebanon" msgstr "Liban" #. 662 msgid "Saint Lucia" msgstr "Sfânta Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Letonia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroc" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Republica Moldovă" #. 499 msgid "Montenegro" msgstr "Muntenegru" #. 663 msgid "Saint Martin (French part)" msgstr "Sfântul Martin (partea franceză)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Insulele Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Fosta Republică Iugoslavă Macedonia" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Insulele Mariane de Nord" #. 474 msgid "Martinique" msgstr "Martinica" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritania" #. 462 msgid "Maldives" msgstr "Maldive" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexic" #. 458 msgid "Malaysia" msgstr "Malaezia" #. 508 msgid "Mozambique" msgstr "Mozambic" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Noua Caledonie" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Insula Norfolk" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Olanda" #. 578 msgid "Norway" msgstr "Norvegia" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Noua Zeelandă" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Polinezia Franceză" #. 598 msgid "Papua New Guinea" msgstr "Papua Noua Guinee" #. 608 msgid "Philippines" msgstr "Filipine" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Sfântul Pierre şi Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Teritoriile Palestiniene, Ocupate" #. 620 msgid "Portugal" msgstr "Portugalia" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "România" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Federaţia Rusă" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudită" #. 090 msgid "Solomon Islands" msgstr "Insulele Solomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Suedia" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Insulele Svalbard şi Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovacia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome și Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Republica Araba Siria" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Insulele Turks şi Caicos" #. 148 msgid "Chad" msgstr "Ciad" #. 260 msgid "French Southern Territories" msgstr "Teritoriile Franceze de Sud" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tailanda" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timorul de Est" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turcia" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad şi Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Provincia Chineză Taiwan" #. 834 msgid "Tanzania, United Republic of" msgstr "Republica Unită Tanzania" #. 804 msgid "Ukraine" msgstr "Ucraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Insulele de Coasta ale Statelor Unite" #. 840 msgid "United States" msgstr "Statele Unite" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatican (Oraşul Stat Vatican)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent şi Grenadin" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Insulele Virgine (Britanice)" #. 850 msgid "Virgin Islands, U.S." msgstr "Insulele Virgine (SUA)" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis şi Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Africa de Sud" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Necunoscut, adaugă eticheta is_in tags acestor orașe" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Locație pe hartă" msgid "Car" msgstr "Maşină" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Ţară" msgid "Postal" msgstr "Poştal" msgid "Town" msgstr "Oraş" msgid "District" msgstr "Cartier" msgid "Street" msgstr "Stradă" msgid "Number" msgstr "Număr" msgid "Enter Destination" msgstr "Introduceți destinaţia" msgid "Zip Code" msgstr "Cod poștal" msgid "City" msgstr "Oraș" msgid "District/Township" msgstr "District/Reședință" msgid "Map" msgstr "Hartă" msgid "Bookmark" msgstr "Semn de carte" msgid "Destination" msgstr "Destinaţie" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Ecran" msgid "_Route" msgstr "Traseu" msgid "_Former Destinations" msgstr "Destinații anterioare" msgid "_Bookmarks" msgstr "Semne de carte" msgid "_Map" msgstr "Hartă" msgid "_Layout" msgstr "Dispunere" msgid "_Projection" msgstr "Proiecție" msgid "_Vehicle" msgstr "Vehicul" msgid "Zoom_Out" msgstr "Depărtează" msgid "Decrease zoom level" msgstr "Scade nivelul de zoom" msgid "Zoom_In" msgstr "Apropie" msgid "Increase zoom level" msgstr "Creste nivelul de zoom" msgid "_Recalculate" msgstr "Recalculează" msgid "Redraw map" msgstr "Reînnoieste harta" msgid "_Info" msgstr "Informații" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Deschide căutare adresa" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Oprește navigarea" msgid "Test" msgstr "Testează" msgid "_Quit" msgstr "_Ieșire" msgid "Quit the application" msgstr "Ieşire din aplicaţie" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Fixează strada" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Schimbă orientarea hărtii spre nord sau la vehicul" msgid "_Roadbook" msgstr "Drum blocat" msgid "Show/hide route description" msgstr "Arată/ascunde descrierea rutei" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Activare/Dezactivare a schimbarii automate al zoomului" msgid "_Fullscreen" msgstr "Pe tot ecranul" msgid "Data" msgstr "Date" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nu" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Glob" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rută %4.0f km sosire estimată %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Rută 0000 km sosire estimată 0+00:00" msgid "Help" msgstr "Ajutor" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Arată în navigator" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Străzi" msgid "House numbers" msgstr "Numere case" msgid "View Attributes" msgstr "Arată atributele" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Puncte de interes" msgid "View on map" msgstr "Arată pe hartă" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Taie semnul de carte" msgid "Copy Bookmark" msgstr "Copiază semnul de carte" msgid "Rename Bookmark" msgstr "Redenumește semnul de carte" msgid "Paste Bookmark" msgstr "Lipește semnul de carte" msgid "Delete Bookmark" msgstr "Șterge semnul de carte" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Semne de carte" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Adaugă director pentru semne de carte" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Lipește semn de carte" #, c-format msgid "Bookmark %s" msgstr "%s ca semn de carte" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Arată starea sateliților" msgid " Elevation " msgstr " Înălţime " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Arată datele NMEA" msgid "car" msgstr "mașină" msgid "bike" msgstr "bicicletă" msgid "pedestrian" msgstr "pieton" #, c-format msgid "Current profile: %s" msgstr "Profil curent: %s" #, c-format msgid "Change profile to: %s" msgstr "Schimbă profilul la: %s" msgid "Set as active" msgstr "Activează" msgid "Show Satellite status" msgstr "Arată starea sateliților" msgid "Show NMEA data" msgstr "Arată datele NMEA" msgid "Add Bookmark" msgstr "Adaugă semn de carte" msgid "Rename" msgstr "Redenumește" msgid "About Navit" msgstr "Despre Navit" #. Authors msgid "By" msgstr "De" #. Contributors msgid "And all the Navit Team" msgstr "Și întreaga echipă Navit" msgid "members and contributors." msgstr "membri și colaboratori." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vehicul" msgid "Rules" msgstr "Reguli" msgid "Lock on road" msgstr "Fixează strada" msgid "Northing" msgstr "Nimic" msgid "Map follows Vehicle" msgstr "Harta urmează vehiculul" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Hărți" msgid "Layout" msgstr "Dispunere" msgid "Height Profile" msgstr "Profil înălțime" msgid "Route Description" msgstr "Descrerea traseului" msgid "Show Locale" msgstr "Setări regionale" msgid "Former Destinations" msgstr "Destinații anterioare" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mesaj" msgid "Back" msgstr "Înapoi" msgid "Back to map" msgstr "Înapoi la hartă" msgid "Main Menu" msgstr "Meniu principal" msgid "House number" msgstr "Număr casă" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Poziția vehiculului" msgid "Main menu" msgstr "Meniu principal" msgid "" "Show\n" "Map" msgstr "" "Afișează\n" "hartă" msgid "Settings" msgstr "Configurații" msgid "Tools" msgstr "Unelte" msgid "Route" msgstr "Traseu" msgid "About" msgstr "Despre" msgid "Quit" msgstr "Ieși" msgid "Actions" msgstr "Acțiuni" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Oprește\n" "navigația" msgid "Display" msgstr "Ecran" msgid "Fullscreen" msgstr "Pe tot ecranul" msgid "Window Mode" msgstr "Mod „fereastră”" msgid "Description" msgstr "Descriere" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "cal" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "apoi ieșiți din giratoriu la %1$s %2$s" navit-0.5.0+dfsg.1/po/ru.po.in000066400000000000000000001626451264204753600157530ustar00rootroot00000000000000# Russian (ru) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Alexey Reztsov https://launchpad.net/~ariafan # Artem Anufrij https://launchpad.net/~artem-anufrij # Artiom https://launchpad.net/~ar-molchanov # AsstZD https://launchpad.net/~eskaer-spamsink # Budim https://launchpad.net/~budmitry # Denis Chapligin https://launchpad.net/~akashihi # Evgeny Kabinov https://launchpad.net/~ekabinov # KaZeR https://launchpad.net/~kazer # Lupin de mid https://launchpad.net/~lupin-de-mid # Nick Gorbunov https://launchpad.net/~intsurfer # Nkolay Parukhin https://launchpad.net/~parukhin # Roadrunner IN https://launchpad.net/~online # Sergey Sedov https://launchpad.net/~serg-sedov # Sergey Shilov https://launchpad.net/~sss-s-s-s # Takuto https://launchpad.net/~takutoatmorgue # Usul https://launchpad.net/~usul1 # cmdrhenner https://launchpad.net/~cmdrhenner # jmb_kz https://launchpad.net/~jmb-kz # kisaa https://launchpad.net/~alex-kisaa # kisaa https://launchpad.net/~kisaa-mail # tryagain https://launchpad.net/~mdankov # Павел https://launchpad.net/~pavel-sgn msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-11-15 20:38+0000\n" "Last-Translator: tryagain \n" "Language-Team: Rustam T. Usmanov\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "Language: ru\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Запуск в исходном каталоге\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "установка '%s' в '%s'\\n\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулевую" msgid "first" msgstr "первую" msgid "second" msgstr "вторую" msgid "third" msgstr "третью" msgid "fourth" msgstr "четвертую" msgid "fifth" msgstr "пятую" msgid "sixth" msgstr "шестую" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нулевой съезд" msgid "first exit" msgstr "первый съезд" msgid "second exit" msgstr "второй съезд" msgid "third exit" msgstr "третий съезд" msgid "fourth exit" msgstr "четвертый съезд" msgid "fifth exit" msgstr "пятый съезд" msgid "sixth exit" msgstr "шестой съезд" #, c-format msgid "%d feet" msgstr "%d футов" #, c-format msgid "in %d feet" msgstr "через %d футов" #, c-format msgid "%d.%d miles" msgstr "%d,%d миль" #, c-format msgid "in %d.%d miles" msgstr "через %d,%d миль" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d миля" msgstr[1] "%d мили" msgstr[2] "%d миль" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "через %d милю" msgstr[1] "через %d мили" msgstr[2] "через %d миль" #, c-format msgid "%d meters" msgstr "%d метров" #, c-format msgid "in %d meters" msgstr "через %d метров" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d километров" #, c-format msgid "in %d.%d kilometers" msgstr "через %d,%d километров" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d километр" msgstr[1] "%d километра" msgstr[2] "%d километров" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "через %d километр" msgstr[1] "через %d километра" msgstr[2] "через %d километров" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$s на трассу %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$s на трассу %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$s на трассу %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$s на трассу %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$s на трассу %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "на рампу" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s, цель - %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s, цель - %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s, цель - %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s, цель - %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s, цель - %s" msgid "When possible, please turn around" msgstr "Развернитесь, пожалуйста, если это возможно" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "по указателю %s" #, c-format msgid "Follow the road for the next %s" msgstr "Двигайтесь по дороге следующие %s" msgid "Enter the roundabout soon" msgstr "Скоро круговое движение" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "%s круговое движение" msgid "then enter the roundabout" msgstr "затем круговое движение" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Круговое движение, %1$s %2$s" msgid "soon" msgstr "скоро" msgid "now" msgstr "сейчас" msgid "then" msgstr "после чего" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "затем выезд вправо %1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "%1$s выезд вправо %2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "затем выезжайте влево %1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "%1$s выезд влево %2$s" msgid "on your left" msgstr "влево" msgid "on your right" msgstr "вправо" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "%3$s съезжайте %2$s %1$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "%2$s съезжайте %1$s %3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "на развязке" msgid "at exit" msgstr "на съезде" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "затем проезжайте развилку прямо %1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "%1$s проезжайте развилку прямо %2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "затем возмите правее%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "%1$s возмите правее %2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "затем возмите левее%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "%1$s возмите левее %2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "направо" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "налево" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "немного " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "круто " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "затем выезжайте на дорогу %1$s в направлении %2$s" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Выезжайте на %1$s дорогу в направлении %2$s" #, c-format msgid "after %i roads" msgstr "после %i дорог" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s сверните %1$s%2$s %4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "затем развернитесь влево" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "%1$s разворот налево" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "затем развернитесь вправо" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "%1$s разворот направо" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "следуйте" msgid "then you have reached your destination." msgstr "после чего вы прибудете в пункт назначения" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Вы прибыли в пункт назначения %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Развязка" msgid "Exit" msgstr "Съезд" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиция" msgid "Command" msgstr "Команда" msgid "Length" msgstr "Длина" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Время" msgid "Destination Length" msgstr "Дистанция до пункта назначения" msgid "Destination Time" msgstr "Время до пункта назначения" msgid "Roadbook" msgstr "Дорожный справочник" #, c-format msgid "Waypoint %d" msgstr "Точка %d" msgid "Visit before..." msgstr "Заехать перед..." msgid "Set as position" msgstr "Установить как пункт отправления" msgid "Set as destination" msgstr "Установить как пункт назначения" msgid "Add as bookmark" msgstr "Добавить закладку" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Экран %d %d" #. 020 msgid "Andorra" msgstr "Андорра" #. 784 msgid "United Arab Emirates" msgstr "Объединенные Арабские Эмираты" #. 004 msgid "Afghanistan" msgstr "Афганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигуа и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангилья" #. 008 msgid "Albania" msgstr "Албания" #. 051 msgid "Armenia" msgstr "Армения" #. 530 msgid "Netherlands Antilles" msgstr "Антильские (Нидерланские) острова" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Америк. Самоа" #. 040 msgid "Austria" msgstr "Австрия" #. 036 msgid "Australia" msgstr "Австралия" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Фарерские Острова" #. 031 msgid "Azerbaijan" msgstr "Азербайджан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босния и Герцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Бельгия" #. 854 msgid "Burkina Faso" msgstr "Буркина-Фасо" #. 100 msgid "Bulgaria" msgstr "Болгария" #. 048 msgid "Bahrain" msgstr "Бахрейн" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Сен-Бартелемей" #. 060 msgid "Bermuda" msgstr "Бермудские острова" #. 096 msgid "Brunei Darussalam" msgstr "Бруней Даруссалам" #. 068 msgid "Bolivia" msgstr "Боливия" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Бонэйр, Синт-Эстатиус и Саба" #. 076 msgid "Brazil" msgstr "Бразилия" #. 044 msgid "Bahamas" msgstr "Багамы" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Остров Буве" #. 072 msgid "Botswana" msgstr "Ботсвана" #. 112 msgid "Belarus" msgstr "Белоруссия" #. 084 msgid "Belize" msgstr "Белиз" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосовые (Килинг) острова" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Конго, Демократическая Республика" #. 140 msgid "Central African Republic" msgstr "Центральноафриканская Республика" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швейцария" #. 384 msgid "Cote d'Ivoire" msgstr "Кот-д'Ивуар" #. 184 msgid "Cook Islands" msgstr "Кука Острова" #. 152 msgid "Chile" msgstr "Чили" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Китай" #. 170 msgid "Colombia" msgstr "Колумбия" #. 188 msgid "Costa Rica" msgstr "Коста-Рика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кабо-Верде" #. 531 msgid "Curacao" msgstr "Кюрасао" #. 162 msgid "Christmas Island" msgstr "Остров Рождества" #. 196 msgid "Cyprus" msgstr "Кипр" #. 203 msgid "Czech Republic" msgstr "Чешская Республика" #. 276 msgid "Germany" msgstr "Германия" #. 262 msgid "Djibouti" msgstr "Джибути" #. 208 msgid "Denmark" msgstr "Дания" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканская Республика" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Эквадор" #. 233 msgid "Estonia" msgstr "Эстония" #. 818 msgid "Egypt" msgstr "Египет" #. 732 msgid "Western Sahara" msgstr "Западная Сахара" #. 232 msgid "Eritrea" msgstr "Эритрея" #. 724 msgid "Spain" msgstr "Испания" #. 231 msgid "Ethiopia" msgstr "Эфиопия" #. 246 msgid "Finland" msgstr "Финляндия" #. 242 msgid "Fiji" msgstr "Фиджи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендские (Мальвинские) острова" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронэзия, Федеративные Штаты" #. 234 msgid "Faroe Islands" msgstr "Фарерские Острова" #. 250 msgid "France" msgstr "Франция" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Великобритания" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузия" #. 254 msgid "French Guiana" msgstr "Французская Гвиана" #. 831 msgid "Guernsey" msgstr "Гернси" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренландия" #. 270 msgid "Gambia" msgstr "Гамбия" #. 324 msgid "Guinea" msgstr "Гвинея" #. 312 msgid "Guadeloupe" msgstr "Гваделупа" #. 226 msgid "Equatorial Guinea" msgstr "Экваториальная Гвинея" #. 300 msgid "Greece" msgstr "Греция" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Южная Георгия и Южные Сандвичевы Острова" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинея-Бисау" #. 328 msgid "Guyana" msgstr "Гайана" #. 344 msgid "Hong Kong" msgstr "Гонконг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Острова Херд и Макдональд" #. 340 msgid "Honduras" msgstr "Гондурас" #. 191 msgid "Croatia" msgstr "Хорватия" #. 332 msgid "Haiti" msgstr "Гаити" #. 348 msgid "Hungary" msgstr "Венгрия" #. 360 msgid "Indonesia" msgstr "Индонезия" #. 372 msgid "Ireland" msgstr "Ирландия" #. 376 msgid "Israel" msgstr "Израиль" #. 833 msgid "Isle of Man" msgstr "Остров Мэн" #. 356 msgid "India" msgstr "Индия" #. 086 msgid "British Indian Ocean Territory" msgstr "Британская территория в Индийском океане" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Исламская Республика" #. 352 msgid "Iceland" msgstr "Исландия" #. 380 msgid "Italy" msgstr "Италия" #. 832 msgid "Jersey" msgstr "Джерси" #. 388 msgid "Jamaica" msgstr "Ямайка" #. 400 msgid "Jordan" msgstr "Иордания" #. 392 msgid "Japan" msgstr "Япония" #. 404 msgid "Kenya" msgstr "Кения" #. 417 msgid "Kyrgyzstan" msgstr "Кыргызстан" #. 116 msgid "Cambodia" msgstr "Камбоджа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Коморские Острова" #. 659 msgid "Saint Kitts and Nevis" msgstr "Сент-Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Корея, Народная Демократическая Республика" #. 410 msgid "Korea, Republic of" msgstr "Корея, Республика" #. 414 msgid "Kuwait" msgstr "Кувейт" #. 136 msgid "Cayman Islands" msgstr "Каймановы острова" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаос, Народно-Демократическая Республика" #. 422 msgid "Lebanon" msgstr "Ливан" #. 662 msgid "Saint Lucia" msgstr "Сент-Люсия" #. 438 msgid "Liechtenstein" msgstr "Лихтенштейн" #. 144 msgid "Sri Lanka" msgstr "Шри-Ланка" #. 430 msgid "Liberia" msgstr "Либерия" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литва" #. 442 msgid "Luxembourg" msgstr "Люксембург" #. 428 msgid "Latvia" msgstr "Латвия" #. 434 msgid "Libya" msgstr "Ливия" #. 504 msgid "Morocco" msgstr "Марокко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдовия, Республика" #. 499 msgid "Montenegro" msgstr "Черногория" #. 663 msgid "Saint Martin (French part)" msgstr "Сен-Мартин (Французкая часть)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалловы Острова" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македония, бывшая республика Югославии" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мьянма" #. 496 msgid "Mongolia" msgstr "Монголия" #. 446 msgid "Macao" msgstr "Мокао" #. 580 msgid "Northern Mariana Islands" msgstr "Северные Марианские Острова" #. 474 msgid "Martinique" msgstr "Мартиника" #. 478 msgid "Mauritania" msgstr "Мавритания" #. 500 msgid "Montserrat" msgstr "Монтсеррат" #. 470 msgid "Malta" msgstr "Мальта" #. 480 msgid "Mauritius" msgstr "Маврикий" #. 462 msgid "Maldives" msgstr "Мальдивы" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексика" #. 458 msgid "Malaysia" msgstr "Малайзия" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибия" #. 540 msgid "New Caledonia" msgstr "Новая Каледония" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Норфолк Остров" #. 566 msgid "Nigeria" msgstr "Нигерия" #. 558 msgid "Nicaragua" msgstr "Никарагуа" #. 528 msgid "Netherlands" msgstr "Нидерланды" #. 578 msgid "Norway" msgstr "Норвегия" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ниуэ" #. 554 msgid "New Zealand" msgstr "Новая Зеландия" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Французская Полинезия" #. 598 msgid "Papua New Guinea" msgstr "Папуа - Новая Гвинея" #. 608 msgid "Philippines" msgstr "Филиппины" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Польша" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Сен-Пьер и Микелон" #. 612 msgid "Pitcairn" msgstr "Питкэрн" #. 630 msgid "Puerto Rico" msgstr "Пуэрто Рико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестина" #. 620 msgid "Portugal" msgstr "Португалия" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвай" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реюньон" #. 642 msgid "Romania" msgstr "Румыния" #. 688 msgid "Serbia" msgstr "Сербия" #. 643 msgid "Russian Federation" msgstr "Российская Федерация" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудовская Аравия" #. 090 msgid "Solomon Islands" msgstr "Соломоновы Острова" #. 690 msgid "Seychelles" msgstr "Сейшельские Острова" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Швеция" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Сент-Хелен" #. 705 msgid "Slovenia" msgstr "Словения" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Свальбард и Ян Майен" #. 703 msgid "Slovakia" msgstr "Словакия" #. 694 msgid "Sierra Leone" msgstr "Сьерра-Леоне" #. 674 msgid "San Marino" msgstr "Сан-Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомали" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "Южный Судан" #. 678 msgid "Sao Tome and Principe" msgstr "Сан-Томе и Принсипи" #. 222 msgid "El Salvador" msgstr "Сальвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Синт-Мартен (Нидерланды)" #. 760 msgid "Syrian Arab Republic" msgstr "Сирийская Арабская Республика" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Тёркс и Кайкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Французские Южные территории" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Таиланд" #. 762 msgid "Tajikistan" msgstr "Таджикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Восточный Тимор" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турция" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тайвань, Провинция Китая" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзия, Объедененная Республика" #. 804 msgid "Ukraine" msgstr "Украина" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Внешние Малые Острова Соединённых Штатов" #. 840 msgid "United States" msgstr "США" #. 858 msgid "Uruguay" msgstr "Уругвай" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ватикан" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Сент-Винсент и Гренадины" #. 862 msgid "Venezuela" msgstr "Венесуэла" #. 092 msgid "Virgin Islands, British" msgstr "Виргинские Острова, Британия" #. 850 msgid "Virgin Islands, U.S." msgstr "Виргинские Острова, США" #. 704 msgid "Viet Nam" msgstr "Вьетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Уоллис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Йемен" #. 175 msgid "Mayotte" msgstr "Майотта" #. 710 msgid "South Africa" msgstr "Южная Африка" #. 894 msgid "Zambia" msgstr "Замбия" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "* Неизвестный, для выбора городов добавьте теги is_in" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Не найдено ни одного файла настроек: navit.xml, navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Ошибка в файле настройки '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Используется файл настроек '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Ошибка: Отсутствует конфигурация в файле '%s'\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Ошибка инициализации, выход из программы. Проверьте предыдущие сообщения об " "ошибках.\n" msgid "unknown street" msgstr "неизвестная улица" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Неизв. транспорт" msgid "Failed to write bookmarks file" msgstr "Не удалось сохранить файл закладок" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карте" msgid "Car" msgstr "Авто" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Страна" msgid "Postal" msgstr "Индекс" msgid "Town" msgstr "Город" msgid "District" msgstr "Район" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Номер" msgid "Enter Destination" msgstr "Введите пункт назначения" msgid "Zip Code" msgstr "Индекс" msgid "City" msgstr "Город" msgid "District/Township" msgstr "Район" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Закладка" msgid "Destination" msgstr "Пункт назначения" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Дисплей" msgid "_Route" msgstr "Маршрут" msgid "_Former Destinations" msgstr "Старые маршруты" msgid "_Bookmarks" msgstr "Закладки" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Схема" msgid "_Projection" msgstr "Проекция" msgid "_Vehicle" msgstr "Т/с" msgid "Zoom_Out" msgstr "Уменьшить" msgid "Decrease zoom level" msgstr "Уменьшить масштаб" msgid "Zoom_In" msgstr "Увеличить" msgid "Increase zoom level" msgstr "Увеличить масштаб" msgid "_Recalculate" msgstr "Пересчитать" msgid "Redraw map" msgstr "Обновить карту" msgid "_Info" msgstr "Информация" msgid "Set _destination" msgstr "Установить пункт назначения" msgid "Opens address search dialog" msgstr "Диалог поиска по адресу" msgid "_POI search" msgstr "Поиск _POI" msgid "Opens POI search dialog" msgstr "Открыть диалог поиска точек интереса" msgid "_Stop Navigation" msgstr "Остановить навигацию" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Выход" msgid "Quit the application" msgstr "Выйти из программы" msgid "Show position _cursor" msgstr "Показать/скрыть отметку текущей позиции" msgid "_Lock on Road" msgstr "Заблокировать дорогу" msgid "_Keep orientation to the North" msgstr "Ориентировать карту на север" msgid "Switches map orientation to the north or the vehicle" msgstr "Переключить ориентацию карты на север или по ходу движения" msgid "_Roadbook" msgstr "Дорожный справочник" msgid "Show/hide route description" msgstr "Показать описание маршрута" msgid "_Autozoom" msgstr "Автомасштабирование" msgid "Enable/disable automatic zoom level changing" msgstr "Включить/выключить автоматическое масштабирование" msgid "_Fullscreen" msgstr "Во весь экран" msgid "Data" msgstr "Данные" msgid "Pharmacy" msgstr "Аптека" msgid "Restaurant" msgstr "Ресторан" msgid "Restaurant. Fast food" msgstr "Ресторан. Фастфуд" msgid "Hotel" msgstr "Гостиница" msgid "Car parking" msgstr "Стоянка" msgid "Fuel station" msgstr "Заправочная станция" msgid "Bank" msgstr "Банк" msgid "Hospital" msgstr "Больница" msgid "Cinema" msgstr "Кинотеатр" msgid "Train station" msgstr "Железнодорожная станция" msgid "School" msgstr "Школа" msgid "Police" msgstr "Полиция" msgid "Justice" msgstr "Суды" msgid "Taxi" msgstr "Такси" msgid "Shopping" msgstr "Магазин" msgid "Distance from screen center (km)" msgstr "Расстояние от центра экрана (км)" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "Поиск POI" msgid "Select a category" msgstr "Выберите категорию" msgid "Select a distance to look for (km)" msgstr "Выберите расстояние для поиска (км)" msgid "Select a POI" msgstr "Выберите POI" msgid " " msgstr " " msgid "Category" msgstr "Категория" msgid "Direction" msgstr "Направление" msgid "Distance(m)" msgstr "Расстояние (м)" msgid "Name" msgstr "Название" msgid "Visit Before" msgstr "Заехать перед..." msgid "N" msgstr "С" msgid "NE" msgstr "СВ" msgid "E" msgstr "В" msgid "SE" msgstr "ЮВ" msgid "S" msgstr "Ю" msgid "SW" msgstr "ЮЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "Нет" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Другой" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Маршрут %4.0fкм %02d:%02d РВП" msgid "Route 0000km 0+00:00 ETA" msgstr "Маршрут 0000км 0+00:00 РВП" msgid "Help" msgstr "Справка" #, c-format msgid "Waypoint %s" msgstr "Точка %s" msgid "Select waypoint to insert the new one before" msgstr "Выберите точку, перед которой вставить новую" msgid "View in Browser" msgstr "Просмотреть в браузере" msgid "Item type" msgstr "Тип объекта" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улицы" msgid "House numbers" msgstr "Номера домов" msgid "View Attributes" msgstr "Просмотреть Атрибуты" msgid "Set as position (and deactivate vehicle)" msgstr "Задать как текущую позицию и деактивировать ТС" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Показать на карте" msgid "Remove search results from the map" msgstr "Удалить результаты поиска с карты" msgid "Show results on the map" msgstr "Показать результаты поиска на карте" msgid "Cut Bookmark" msgstr "Вырезать закладку" msgid "Copy Bookmark" msgstr "Скопировать закладку" msgid "Rename Bookmark" msgstr "Переименовать закладку" msgid "Paste Bookmark" msgstr "Вставить закладку" msgid "Delete Bookmark" msgstr "Удалить закладку" msgid "Delete waypoint" msgstr "Удалить маршрутную точку" msgid "Bookmarks" msgstr "Закладки" msgid "Bookmarks as waypoints" msgstr "Маршрут по закладкам" msgid "Save waypoints" msgstr "Сохранить маршрутные точки" msgid "Replace with waypoints" msgstr "Заменить маршрутными точками" msgid "Delete Folder" msgstr "Удалить папку" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Добавить папку закладок" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Вставить закладку" #, c-format msgid "Bookmark %s" msgstr "Закладка %s" #, c-format msgid "Download %s" msgstr "Загрузка %s" msgid "Map Download" msgstr "Загрузка карты" msgid "Active" msgstr "Активна" msgid "Download Enabled" msgstr "Загрузка разрешена" msgid "Download completely" msgstr "Загрузить полностью" msgid "Show Satellite Status" msgstr "Показать Состояние Спутников" msgid " Elevation " msgstr " Высота " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Показать Данные NMEA" msgid "car" msgstr "машина" msgid "bike" msgstr "велосипед" msgid "pedestrian" msgstr "пешеход" #, c-format msgid "Current profile: %s" msgstr "Текущий профиль: %s" #, c-format msgid "Change profile to: %s" msgstr "Сменить профиль на: %s" msgid "Set as active" msgstr "Сделать активным" msgid "Show Satellite status" msgstr "Показать состояние Спутников" msgid "Show NMEA data" msgstr "Показать данные NMEA" msgid "Add Bookmark" msgstr "Добавить закладку" msgid "Rename" msgstr "Переименовать" msgid "About Navit" msgstr "О Navit" #. Authors msgid "By" msgstr "Авторы:" #. Contributors msgid "And all the Navit Team" msgstr "И все участники команды Navit" msgid "members and contributors." msgstr "и лица внесшие вклад" msgid "Waypoints" msgstr "Маршрутные точки" msgid "Enter Coordinates" msgstr "Введите координаты" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Широта Долгота" msgid "Enter coordinates, for example:" msgstr "Введите координаты, например:" msgid "Vehicle" msgstr "Т/с" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Придерживаться дороги" msgid "Northing" msgstr "на север" msgid "Map follows Vehicle" msgstr "Карта следует за машиной" msgid "Plan with Waypoints" msgstr "Множество точек назначения" msgid "Maps" msgstr "Карты" msgid "Layout" msgstr "Схема" msgid "Height Profile" msgstr "Профиль высот" msgid "Route Description" msgstr "Описание маршрута" msgid "Show Locale" msgstr "Проверить локализацию" msgid "Former Destinations" msgstr "Старые маршруты" msgid "- No former destinations available -" msgstr "- Нет старых маршрутов -" msgid "Message" msgstr "Сообщение" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Назад к карте" msgid "Main Menu" msgstr "Главное меню" msgid "House number" msgstr "Номер дома" msgid "Next" msgstr "Далее" msgid "Prev" msgstr "Назад" msgid "Return to route!" msgstr "Возвращайтесь на маршрут!" #. warning told msgid "Look out! Camera!" msgstr "Внимание! Камера!" #. warning told msgid "Please decrease your speed" msgstr "Снизьте скорость, пожалуйста" msgid "partial match" msgstr "нестрогое соответствие" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Поиск" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Города" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Ехать сюда" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Данные карты (c) участники OpenStreetMap, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" "Папка %s, выбранная для хранения карт, недоступна.\n" "Пожалуйста, перезагрузите Navit после подключения SD карты, или выберите " "другую папку." msgid "Downloaded maps" msgstr "Загруженные карты" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" "К сожалению, карты свыше 3.8 Гб не поддерживаются в Android версии. Выберите " "другую карту." msgid "Cancel" msgstr "Отмена" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" "Выбрана папка %s\n" "Перезапустите Navit для применения изменений." msgid "Whole Planet" msgstr "Вся планета" msgid "Africa" msgstr "Африка" msgid "Canary Islands" msgstr "Канарские острова" msgid "Asia" msgstr "Азия" msgid "Korea" msgstr "Корея" msgid "Taiwan" msgstr "Тайвань" msgid "UAE+Other" msgstr "ОАЭ и прилегающие" msgid "Oceania" msgstr "Океания" msgid "Tasmania" msgstr "Тасмания" msgid "Victoria" msgstr "Виктория" msgid "New South Wales" msgstr "Новый Южный Уэльс" msgid "Europe" msgstr "Европа" msgid "Western Europe" msgstr "Западная Европа" msgid "Azores" msgstr "Азорские о-ва" msgid "BeNeLux" msgstr "Страны Бенелюкса" msgid "Alsace" msgstr "Эльзас" msgid "Aquitaine" msgstr "Аквитания" msgid "Auvergne" msgstr "Овернь" msgid "Basse-Normandie" msgstr "Нижняя Нормандия" msgid "Bourgogne" msgstr "Бургундия" msgid "Bretagne" msgstr "Бретань" msgid "Centre" msgstr "Центр" msgid "Champagne-Ardenne" msgstr "Шампань — Арденны" msgid "Corse" msgstr "Корсика" msgid "Franche-Comte" msgstr "Франш-Конте" msgid "Haute-Normandie" msgstr "Верхняя Нормандия" msgid "Ile-de-France" msgstr "Иль-де-Франс" msgid "Languedoc-Roussillon" msgstr "Лангедок — Руссильон" msgid "Limousin" msgstr "Лимузен" msgid "Lorraine" msgstr "Лотарингия" msgid "Midi-Pyrenees" msgstr "Юг — Пиренеи" msgid "Nord-pas-de-Calais" msgstr "Нор — Па-де-Кале" msgid "Pays-de-la-Loire" msgstr "Пеи-де-ла-Луар" msgid "Picardie" msgstr "Пикардия" msgid "Poitou-Charentes" msgstr "Пуату-Шарант" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Прованс — Альпы — Лазурный берег" msgid "Rhone-Alpes" msgstr "Рона — Альпы" msgid "Baden-Wuerttemberg" msgstr "Баден-Вюртемберг" msgid "Bayern" msgstr "Бавария" msgid "Mittelfranken" msgstr "Средняя Франкония" msgid "Niederbayern" msgstr "Нижняя Бавария" msgid "Oberbayern" msgstr "Верхняя Бавария" msgid "Oberfranken" msgstr "Верхняя Франкония" msgid "Oberpfalz" msgstr "Верхний Пфальц" msgid "Schwaben" msgstr "Швабия" msgid "Unterfranken" msgstr "Нижняя Франкония" msgid "Berlin" msgstr "Берлин" msgid "Brandenburg" msgstr "Бранденбург" msgid "Bremen" msgstr "Бремен" msgid "Hamburg" msgstr "Гамбург" msgid "Hessen" msgstr "Гессен" msgid "Mecklenburg-Vorpommern" msgstr "Мекленбург-Передняя Померания" msgid "Niedersachsen" msgstr "Нижняя Саксония" msgid "Nordrhein-westfalen" msgstr "Северный Рейн-Вестфалия" msgid "Rheinland-Pfalz" msgstr "Рейнланд-Пфальц" msgid "Saarland" msgstr "Саар" msgid "Sachsen-Anhalt" msgstr "Саксония-Анхальт" msgid "Sachsen" msgstr "Саксония" msgid "Schleswig-Holstein" msgstr "Шлезвиг-Гольштейн" msgid "Thueringen" msgstr "Тюрингия" msgid "Mallorca" msgstr "Мальорка" msgid "Galicia" msgstr "Галисия" msgid "Scandinavia" msgstr "Скандинавия" msgid "England" msgstr "Англия" msgid "Buckinghamshire" msgstr "Бакингемшир" msgid "Cambridgeshire" msgstr "Кембриджшир" msgid "Cumbria" msgstr "Камбрия" msgid "East yorkshire with hull" msgstr "Восточный Йоркшир и Халл" msgid "Essex" msgstr "Эссекс" msgid "Herefordshire" msgstr "Херефордшир" msgid "Kent" msgstr "Кент" msgid "Lancashire" msgstr "Ланкашир" msgid "Leicestershire" msgstr "Лестершир" msgid "Norfolk" msgstr "Норфолк" msgid "Nottinghamshire" msgstr "Ноттингемшир" msgid "Oxfordshire" msgstr "Оксфордшир" msgid "Shropshire" msgstr "Шропшир" msgid "Somerset" msgstr "Сомерсет" msgid "South yorkshire" msgstr "Южный Йоркшир" msgid "Suffolk" msgstr "Саффолк" msgid "Surrey" msgstr "Суррей" msgid "Wiltshire" msgstr "Уилтшир" msgid "Scotland" msgstr "Шотландия" msgid "Wales" msgstr "Уэльс" msgid "Crete" msgstr "Крит" msgid "North America" msgstr "Северная Америка" msgid "Alaska" msgstr "Аляска" msgid "Hawaii" msgstr "Гавайи" msgid "USA" msgstr "США" msgid " (except Alaska and Hawaii)" msgstr " (кроме Аляски и Гавайских о-вов)" msgid "Midwest" msgstr "Средний Запад" msgid "Michigan" msgstr "Мичиган" msgid "Ohio" msgstr "Охайо" msgid "Northeast" msgstr "Северо-восток" msgid "Massachusetts" msgstr "Массачусетс" msgid "Vermont" msgstr "Вермонт" msgid "Pacific" msgstr "Тихоокеанское побережье" msgid "South" msgstr "Юг" msgid "Arkansas" msgstr "Арканзас" msgid "District of Columbia" msgstr "Округ Колумбия" msgid "Florida" msgstr "Флорида" msgid "Louisiana" msgstr "Луизиана" msgid "Maryland" msgstr "Мэриленд" msgid "Mississippi" msgstr "Миссисипи" msgid "Oklahoma" msgstr "Оклахома" msgid "Texas" msgstr "Техас" msgid "Virginia" msgstr "Вирджиния" msgid "West Virginia" msgstr "Западная Вирджиния" msgid "West" msgstr "Запад" msgid "Arizona" msgstr "Аризона" msgid "California" msgstr "Калифорния" msgid "Colorado" msgstr "Колорадо" msgid "Idaho" msgstr "Айдахо" msgid "Montana" msgstr "Монтана" msgid "New Mexico" msgstr "Нью-Мексико" msgid "Nevada" msgstr "Невада" msgid "Oregon" msgstr "Орегон" msgid "Utah" msgstr "Юта" msgid "Washington State" msgstr "штат Вашингтон" msgid "South+Middle America" msgstr "Южная и центральная Америка" msgid "Guyane Francaise" msgstr "Французская Гвиана" msgid "downloading" msgstr "загружаем" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "готово" msgid "Media selected for map storage is not available" msgstr "Устройство для хранения карт недоступно." #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Не достаточно места" msgid "Error downloading map!" msgstr "Ошибка загрузки карты!" msgid "Error writing map!" msgstr "Ошибка записи карты!" msgid "Map download aborted!" msgstr "Загрузка карты отменена!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Осталось" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Загрузка карты" msgid "Vehicle Position" msgstr "Местоположение автомобиля" msgid "Main menu" msgstr "Главное меню" msgid "" "Show\n" "Map" msgstr "" "Показать\n" "Карту" msgid "Settings" msgstr "Настройки" msgid "Tools" msgstr "Инструменты" msgid "Route" msgstr "Маршрут" msgid "About" msgstr "О программе" msgid "Quit" msgstr "Выход" msgid "Actions" msgstr "Команды" msgid "" "Former\n" "Destinations" msgstr "" "Старые\n" "маршруты" msgid "Coordinates" msgstr "Координаты" msgid "" "Stop\n" "Navigation" msgstr "" "Прекращение\n" "навигации" msgid "Display" msgstr "Дисплей" msgid "Fullscreen" msgstr "Во весь экран" msgid "Window Mode" msgstr "Режим окна" msgid "Description" msgstr "Описание" msgid "" "Drop last \n" "Waypoint" msgstr "" "Удалить последнюю \n" "точку" msgid "" "Drop next \n" "Waypoint" msgstr "" "Удалить следующую \n" "точку" msgid "Satellite Status" msgstr "Статус спутников" msgid "NMEA Data" msgstr "Данные NMEA" msgid "car_shortest" msgstr "машина (кратчайший путь)" msgid "car_avoid_tolls" msgstr "машина (избегать платных дорог)" msgid "car_pedantic" msgstr "машина (педантичный)" msgid "horse" msgstr "лошадь" msgid "Truck" msgstr "Грузовик" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Да" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit запущен" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit работает" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Добро пожаловать в Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Спасибо за установку Navit!\n" "\n" "Для начала, выберите \"Загрузить карты\" из меню для загрузки карт. " "Примечание: файл карты может быть очень большим (>50MB) - рекомендуется " "использовать подключениеWi-Fi.\n" "\n" "Картографические данные: (c) участники OpenStreetMap\n" "\n" "Приятного общения с Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "ОК" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Дополнительная информация" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Приблизить" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Отдалить" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Загрузить карты" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Вкл/выкл POI" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Выйти из Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Копировать / Восстановить" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "Выбрать папку для хранения карт" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Удалить эту карту?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Скачиваем:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Ошибка при загрузке карты" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Загрузка карты отменена" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Нет данных GPS. Повторите позже." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Карты, включающие текущее местоположение" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Адресный поиск" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Введите назначение" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Разрешить неполное совпадение" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Ищем..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Адрес не найден" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Получение результатов поиска" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Загрузка результатов поиска" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Ничего не найдено" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Текст не введен" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Устанавливаем точку назначения на:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Выберите действие" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Вставьте SD карту" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Сохраняем..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Восстанавливаем..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Ошибка при создании папки для резервной копии" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Ошибка при резервном копировании" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Резервные копии не найдены" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Ошибка при восстановлении" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Резервное копирование успешно завершено" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Восстановление завершено\n" "Перезапустите Navit, пожалуйста" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Резервные копии не найдены" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Ошибка при восстановлении" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Выберите резервную копию" #. Android resource: @strings/backup msgid "Backup" msgstr "Резервное копирование" #. Android resource: @strings/restore msgid "Restore" msgstr "Восстановление из копии" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "В системе отсутствуют нобходимые голосовые настройки" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" "Navit может использовать любое установленное в системе приложение " "преобразования текста в речь. Выбранное сейчас приложение сообщает о " "невозможности работы на выбранном языке. Попросим систему показать диалог " "загрузки голосовых данных?" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "затем %2$s съезжайте с круга на %1$s" navit-0.5.0+dfsg.1/po/sc.po.in000066400000000000000000001160651264204753600157250ustar00rootroot00000000000000# Sardinian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Michael von Glasow https://launchpad.net/~michael-vonglasow # Rex Sanna https://launchpad.net/~rex-sanna msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Sardinian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n!=1;\n" "Language: sc\n" msgid "Running from source directory\n" msgstr "Leghende dae sos sorgentese\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "imposto '%s' a '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "Nemmoso" msgid "first" msgstr "" msgid "second" msgstr "secundu" msgid "third" msgstr "terzu" msgid "fourth" msgstr "quartu" msgid "fifth" msgstr "quintu" msgid "sixth" msgstr "sestu" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "prima essia" msgid "second exit" msgstr "secunda essia" msgid "third exit" msgstr "terza essia" msgid "fourth exit" msgstr "quarta essia" msgid "fifth exit" msgstr "quinta essia" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metroso" #, c-format msgid "in %d meters" msgstr "in %d metroso" #, c-format msgid "%d.%d kilometers" msgstr "%d, %d chilometroso" #, c-format msgid "in %d.%d kilometers" msgstr "in %d, %d chilometroso" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "unu chilometru" msgstr[1] "%d chilometroso" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "in unu chilometru" msgstr[1] "in %d chilometroso" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "in sa rampa" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sin s\\'istrada %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sin su %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sin sa %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sin su %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sin sa %s" msgid "When possible, please turn around" msgstr "Commente possibile torra in daesecusu" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Sichi s'istrada fintzasa a %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Lassa sa rotatoria a %1$s %2$s" msgid "soon" msgstr "prestu" msgid "now" msgstr "como" msgid "then" msgstr "tando" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "destra" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "manca" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "fatzilmente " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "fortemente " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Pica sa %1$s istrada a %2$s" #, c-format msgid "after %i roads" msgstr "dopu %i istradasa" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Zira %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "tando torra in daesecusu" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Torra in daesecusu %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "tando torra in daesecusu" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Torra in daesecusu %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "sichi" msgid "then you have reached your destination." msgstr "tando ses arribbau" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Ses arribbau a %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Essi" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Positzione" msgid "Command" msgstr "Comandu" msgid "Length" msgstr "Longaria" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tempu" msgid "Destination Length" msgstr "Longaria de destinazione" msgid "Destination Time" msgstr "Tempu de destinazione" msgid "Roadbook" msgstr "Libru de istradasa" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Issepera positzione" msgid "Set as destination" msgstr "Sintza commente destinatzione" msgid "Add as bookmark" msgstr "Sinza commente importante" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punta 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Coordinadasa ischermu: %d %d" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "Emiratoso Araboso" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "Arghentina" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "Belgiu" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "Santu Bartolomeu" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasile" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "Isolasa Bouvet" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "Bielorussia" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Congo, Repubblica Democratica" #. 140 msgid "Central African Republic" msgstr "Repubblica Centrale Africana" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "Svitzera" #. 384 msgid "Cote d'Ivoire" msgstr "Casta de Avoriu" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "Cile" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "Cina" #. 170 msgid "Colombia" msgstr "Columbia" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "Capu Virde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "Cipro" #. 203 msgid "Czech Republic" msgstr "Repubblica Ceca" #. 276 msgid "Germany" msgstr "Germania" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "Danimarca" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "Repubblica Domenicana" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "Egittu" #. 732 msgid "Western Sahara" msgstr "Sahara Ovest" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "Ispagna" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "Finlandia" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "Francia" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "Inghilterra" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "Croatzia" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "Ungheria" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "Irlanda" #. 376 msgid "Israel" msgstr "Israele" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Repubblica Islamica" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "Libanu" #. 662 msgid "Saint Lucia" msgstr "Santa Luchia" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "Lituania" #. 442 msgid "Luxembourg" msgstr "Lussemburgo" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marocco" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "Isolasa Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, Repubblica Yugoslava" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "Maldive" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "Messico" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "Mozambicu" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "Nova Caledonia" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "Nova Zelanda" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "Peru'" #. 258 msgid "French Polynesia" msgstr "Polinesia Frantzese" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "Filippine" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "Polonia" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "Portogallo" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "Federatzione Russa" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "Arabia Saudita" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "Svetzia" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "Slovacchia" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Repubblica Araba de Siria" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "Territorioso Sud Franzesese" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "Tailandia" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "Turchia" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "Sud Africa" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "* Inconnottu, pone sa tag is_in in custas zittadese" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Puntu in sa Mappa" msgid "Car" msgstr "Macchina" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Paese" msgid "Postal" msgstr "Posta" msgid "Town" msgstr "Bidda" msgid "District" msgstr "Bichinau" msgid "Street" msgstr "Istrada" msgid "Number" msgstr "Numeru" msgid "Enter Destination" msgstr "Issepera destinatzione" msgid "Zip Code" msgstr "CAP" msgid "City" msgstr "Cittade" msgid "District/Township" msgstr "Bichinau/Municipiu" msgid "Map" msgstr "Mappa" msgid "Bookmark" msgstr "Sintzau" msgid "Destination" msgstr "Destinatzione" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "Fala su livellu de zoom" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "Artzia su livellu de zoom" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "Torra a mustrare" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Apperi sa bentana pro chircare istradasa" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "_Essi" msgid "Quit the application" msgstr "Essi s'applicatzione" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Pone su nord in daennantisi" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "Pone/Doga sa descrizione de s'istrada" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "Usa/Doga su zoom automaticu" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NE" msgid "E" msgstr "E" msgid "SE" msgstr "SE" msgid "S" msgstr "S" msgid "SW" msgstr "SO" msgid "W" msgstr "O" msgid "NW" msgstr "NO" #. Android resource: @strings/no msgid "No" msgstr "Nono" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Istrada %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Istrada 0000km 0+00:00 ETA" msgid "Help" msgstr "Azzudu" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Bie in su Browser" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Istradasa" msgid "House numbers" msgstr "Numeroso Civicoso" msgid "View Attributes" msgstr "Leghe Attributoso" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "Pompia in sa Mappa" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Moghe" msgid "Copy Bookmark" msgstr "Copia" msgid "Rename Bookmark" msgstr "Torra a nominare" msgid "Paste Bookmark" msgstr "Incolla" msgid "Delete Bookmark" msgstr "Doga" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Locoso Importantese" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Pone tra sos importantese" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Pone inoche" #, c-format msgid "Bookmark %s" msgstr "Importante: %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Pompia s'istatu de su satellite" msgid " Elevation " msgstr " Artaria " msgid " Azimuth " msgstr " Azimuth " msgid "Show NMEA Data" msgstr "Pompia NMEA Data" msgid "car" msgstr "Macchina" msgid "bike" msgstr "Bicicletteda" msgid "pedestrian" msgstr "A pedese" #, c-format msgid "Current profile: %s" msgstr "Profilu currente: %s" #, c-format msgid "Change profile to: %s" msgstr "Cambia profilu a: %s" msgid "Set as active" msgstr "Sintza Attivu" msgid "Show Satellite status" msgstr "Pompia s'istatu de su satellite" msgid "Show NMEA data" msgstr "Pompia NMEA data" msgid "Add Bookmark" msgstr "Sintza Importante" msgid "Rename" msgstr "Torra a lu nominare" msgid "About Navit" msgstr "Itte Navit??" #. Authors msgid "By" msgstr "De" #. Contributors msgid "And all the Navit Team" msgstr "E tottu su Navit Team" msgid "members and contributors." msgstr "zente nostra e azzudantese" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Veicolu" msgid "Rules" msgstr "Regulasa" msgid "Lock on road" msgstr "Pompia in s'istrada" msgid "Northing" msgstr "Versu Nord" msgid "Map follows Vehicle" msgstr "Sa mappa ti sichiti" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Mappa" msgid "Layout" msgstr "Impaghinadura" msgid "Height Profile" msgstr "Profilu de Pesu" msgid "Route Description" msgstr "Descritzione de s'istrada" msgid "Show Locale" msgstr "Mustra limba" msgid "Former Destinations" msgstr "Destinatzionese" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Imperiu" msgid "Back" msgstr "Torra" msgid "Back to map" msgstr "Torra a sa Mappa" msgid "Main Menu" msgstr "Menu Printzipale" msgid "House number" msgstr "Numeru Civicu" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Positzione de su Veicolu" msgid "Main menu" msgstr "Menu Printzipale" msgid "" "Show\n" "Map" msgstr "" "Mustra\n" "Mappa" msgid "Settings" msgstr "Impostatzionese" msgid "Tools" msgstr "Istrumentoso" msgid "Route" msgstr "Viatzu" msgid "About" msgstr "Itte?" msgid "Quit" msgstr "Essi" msgid "Actions" msgstr "Atzionese" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Firma\n" "Navigatzione" msgid "Display" msgstr "Aparèntzia" msgid "Fullscreen" msgstr "A tottu ischermu" msgid "Window Mode" msgstr "Modalidade Bentanedda" msgid "Description" msgstr "Descritzione" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "A cavaddu" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "tando lassa sa rotatoria a %1$s %2$s" navit-0.5.0+dfsg.1/po/si.po.in000066400000000000000000001433501264204753600157300ustar00rootroot00000000000000# Sinhalese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # සපුමල් බණ්ඩාර https://launchpad.net/~sapumalbandaraucsc msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: සපුමල් බණ්ඩාර \n" "Language-Team: Sinhalese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: si\n" msgid "Running from source directory\n" msgstr "මූල ඩිරෙක්ටරියෙන් විචලනය වේ\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' ලෙස '%s' සිටුවීම\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "ශුන්‍යවන" msgid "first" msgstr "පළමු" msgid "second" msgstr "තත්පරය" msgid "third" msgstr "තෙවන" msgid "fourth" msgstr "සිව්වන" msgid "fifth" msgstr "පස්වන" msgid "sixth" msgstr "සයවන" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "ශුන්‍යවන පිටවුම" msgid "first exit" msgstr "පළමු පිටවුම" msgid "second exit" msgstr "දෙවන පිටවුම" msgid "third exit" msgstr "තෙවන පිටවුම" msgid "fourth exit" msgstr "සිව්වන පිටවුම" msgid "fifth exit" msgstr "පස්වන පිටවුම" msgid "sixth exit" msgstr "සයවන පිටවුම" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "මීටර %d" #, c-format msgid "in %d meters" msgstr "මීටර %d කින්" #, c-format msgid "%d.%d kilometers" msgstr "කිලෝ මීටර %d.%d" #, c-format msgid "in %d.%d kilometers" msgstr "කිලෝ මීටර %d.%d කින්" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "කිලෝ මීටරයයි" msgstr[1] "කිලෝ මීටර %d" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "කිලෝ මීටරයකින්" msgstr[1] "කිලෝ මීටර %d කින්" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "රැම්පය තුළට" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s %s %s %s තුළට" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s %s %s %s තුළට" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s %s %s %s තුළට" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s %s %s %s තුළට" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s %s තුළට" msgid "When possible, please turn around" msgstr "හැකියාව ඇතිවිට දී, කරුණාකර හැරෙන්න." #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "මීළඟ %s දක්වා මාර්ගය හඹායන්න." msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "%1$s %2$s හිදී වටරවුමෙන් ඉවත්වන්න." msgid "soon" msgstr "ලඟදීම" msgid "now" msgstr "දැන්" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "දකුණ" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "වම" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "පහසුවෙන් " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "ශක්තිමත් ලෙස " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "ගන්න %1$s මාර්ගය %2$s ට" #, c-format msgid "after %i roads" msgstr "මාර්ග %i පසු" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%1$s%2$s %3$s%4$s හරවන්න" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "එවිට ඔබ ඔබේ ගමනාන්තයට ළඟා වී ඇත." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "ඔබ ඔබේ ගමනාන්තය වන %s ට ළඟා වී ඇත." #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "පිටවුම" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "ස්ථානය" msgid "Command" msgstr "විධානය" msgid "Length" msgstr "දිග" msgid "km" msgstr "කිලෝ මිටර" msgid "m" msgstr "මි." msgid "Time" msgstr "වේලාව" msgid "Destination Length" msgstr "ගමනාන්තයට දුර" msgid "Destination Time" msgstr "ගමනාන්තයට කාලය" msgid "Roadbook" msgstr "මාර්ග පොත" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "ස්ථානය ලෙස සිටුවන්න" msgid "Set as destination" msgstr "ගමනාන්තය ලෙස සිටුවන්න" msgid "Add as bookmark" msgstr "පිටුසනක් ලෙස ඈඳන්න" #, c-format msgid "Point 0x%x 0x%x" msgstr "පොයින්ට් 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "තිර ඛණ්ඩාංක : %d %d" #. 020 msgid "Andorra" msgstr "ඇන්ඩොර්රා" #. 784 msgid "United Arab Emirates" msgstr "එක්සත් අරාබි එමිර් රාජ්‍යය" #. 004 msgid "Afghanistan" msgstr "ඇෆ්ගනිස්ථානය" #. 028 msgid "Antigua and Barbuda" msgstr "ඇන්ටිගුවා සහ බාර්බඩා" #. 660 msgid "Anguilla" msgstr "ඇන්ගියුලාව" #. 008 msgid "Albania" msgstr "ඇල්බෙනියාව" #. 051 msgid "Armenia" msgstr "අර්මෙනියාව" #. 530 msgid "Netherlands Antilles" msgstr "නෙදර්ලන්ත ඇන්ටිලීස්" #. 024 msgid "Angola" msgstr "ඇන්ගෝලාව" #. 010 msgid "Antarctica" msgstr "ඇන්ටාක්ටිකාව" #. 032 msgid "Argentina" msgstr "ආජන්ටිනාව" #. 016 msgid "American Samoa" msgstr "ඇමරිකානු සැමෝවා" #. 040 msgid "Austria" msgstr "ඔස්ට්‍රියාව" #. 036 msgid "Australia" msgstr "ඔස්ට්‍රේලියාව" #. 533 msgid "Aruba" msgstr "අරුබාව" #. 248 msgid "Aland Islands" msgstr "අලෑන්ඩ් දූපත්" #. 031 msgid "Azerbaijan" msgstr "අසර්බයිජානය" #. 070 msgid "Bosnia and Herzegovina" msgstr "බොස්නියාව සහ හෙසෙගවිනා" #. 052 msgid "Barbados" msgstr "බාබඩෝසය" #. 050 msgid "Bangladesh" msgstr "බංග්ලාදේශය" #. 056 msgid "Belgium" msgstr "බෙල්ජියම" #. 854 msgid "Burkina Faso" msgstr "බර්කිනා ෆාසෝ" #. 100 msgid "Bulgaria" msgstr "බල්ගේරියාව" #. 048 msgid "Bahrain" msgstr "බහරේනය" #. 108 msgid "Burundi" msgstr "බුරුන්ඩි" #. 204 msgid "Benin" msgstr "බෙනින්" #. 652 msgid "Saint Barthelemy" msgstr "සාන්ත බාතලෙමේය" #. 060 msgid "Bermuda" msgstr "බර්මියුඩාව" #. 096 msgid "Brunei Darussalam" msgstr "බෘනායි දරුස්සලාම්" #. 068 msgid "Bolivia" msgstr "බොලීවියාව" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "බ්‍රසීලය" #. 044 msgid "Bahamas" msgstr "බහමාස්" #. 064 msgid "Bhutan" msgstr "භුතානය" #. 074 msgid "Bouvet Island" msgstr "බොවෙ දිවයින" #. 072 msgid "Botswana" msgstr "බොට්ස්වානා" #. 112 msgid "Belarus" msgstr "බෙලරුසය" #. 084 msgid "Belize" msgstr "බෙලිසිය" #. 124 msgid "Canada" msgstr "කැනඩාව" #. 166 msgid "Cocos (Keeling) Islands" msgstr "කොකෝවා (කීලිං) දූපත්" #. 180 msgid "Congo, Democratic Republic of the" msgstr "කොංගෝව, ප්‍රජාතාන්ත්‍රික සමූහාණ්ඩුව" #. 140 msgid "Central African Republic" msgstr "මධ්‍යම අප්‍රිකානු ජනරජය" #. 178 msgid "Congo" msgstr "කොන්ගෝව" #. 756 msgid "Switzerland" msgstr "ස්විට්සර්ලන්තය" #. 384 msgid "Cote d'Ivoire" msgstr "කොට් ඩි'ඉවොයර්" #. 184 msgid "Cook Islands" msgstr "කුක් දූපත්" #. 152 msgid "Chile" msgstr "චිලී" #. 120 msgid "Cameroon" msgstr "කැමරූන්" #. 156 msgid "China" msgstr "චීනය" #. 170 msgid "Colombia" msgstr "කොලොම්බියාව" #. 188 msgid "Costa Rica" msgstr "කොස්ට රිකා" #. 192 msgid "Cuba" msgstr "කියුබාව" #. 132 msgid "Cape Verde" msgstr "කේප් තුඩුව" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "ක්‍රිස්ම්ස් දූපත" #. 196 msgid "Cyprus" msgstr "සයිප්‍රසය" #. 203 msgid "Czech Republic" msgstr "චෙක් ජනරජය" #. 276 msgid "Germany" msgstr "ජර්මනිය" #. 262 msgid "Djibouti" msgstr "ජිබුටි" #. 208 msgid "Denmark" msgstr "ඩෙන්මාකය" #. 212 msgid "Dominica" msgstr "ඩොමිනිකාව" #. 214 msgid "Dominican Republic" msgstr "ඩොමිනිකන් ජනරජය" #. 012 msgid "Algeria" msgstr "ඇල්ජීරියාව" #. 218 msgid "Ecuador" msgstr "ඉක්වදෝරය" #. 233 msgid "Estonia" msgstr "එස්ටෝනියාව" #. 818 msgid "Egypt" msgstr "ඊජිප්තුව" #. 732 msgid "Western Sahara" msgstr "බටහිර සහරා" #. 232 msgid "Eritrea" msgstr "එරිත්‍රියාව" #. 724 msgid "Spain" msgstr "ස්පාඤ්ඤය" #. 231 msgid "Ethiopia" msgstr "ඉතියෝපියාව" #. 246 msgid "Finland" msgstr "පින්ලන්තය" #. 242 msgid "Fiji" msgstr "ෆීජි" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "ෆෝක්ලන්ඩ් දූපත් (මල්විනාස්)" #. 583 msgid "Micronesia, Federated States of" msgstr "මයික්‍රොනීසියානු සමූහාණ්ඩුව" #. 234 msgid "Faroe Islands" msgstr "ෆැරෝයි දූපත්" #. 250 msgid "France" msgstr "ප්‍රංශය" #. 266 msgid "Gabon" msgstr "ගැබෝනය" #. 826 msgid "United Kingdom" msgstr "එක්සත් රාජධානිය" #. 308 msgid "Grenada" msgstr "ග්‍රෙනාඩා" #. 268 msgid "Georgia" msgstr "ජොර්ජියාව" #. 254 msgid "French Guiana" msgstr "ප්‍රංශ ගයනාව" #. 831 msgid "Guernsey" msgstr "ගුවන්සි" #. 288 msgid "Ghana" msgstr "ඝානාව" #. 292 msgid "Gibraltar" msgstr "ජිබ්‍රොල්ටා" #. 304 msgid "Greenland" msgstr "ග්‍රීන්ලන්තය" #. 270 msgid "Gambia" msgstr "ගැම්බියාව" #. 324 msgid "Guinea" msgstr "ගිනියා" #. 312 msgid "Guadeloupe" msgstr "‍ගෝඩිලෝප්" #. 226 msgid "Equatorial Guinea" msgstr "එක්වටෝරියල් ගිනියා" #. 300 msgid "Greece" msgstr "ග්‍රීසිය" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "දකුණු ජොර්ජියාව සහ දකුණු සැන්විච් දූපත්" #. 320 msgid "Guatemala" msgstr "ගෝතමාලාව" #. 316 msgid "Guam" msgstr "ගුවාම්" #. 624 msgid "Guinea-Bissau" msgstr "ගිනි - බිසව්" #. 328 msgid "Guyana" msgstr "ගුයානා" #. 344 msgid "Hong Kong" msgstr "හොං කොං" #. 334 msgid "Heard Island and McDonald Islands" msgstr "හර්ඩ් දූපත සහ මැක්ඩොනල්ඩ් දූපත්" #. 340 msgid "Honduras" msgstr "හොන්ඩුරාස්" #. 191 msgid "Croatia" msgstr "ක්‍රොඒෂියාව" #. 332 msgid "Haiti" msgstr "හයිටි" #. 348 msgid "Hungary" msgstr "හංගේරියාව" #. 360 msgid "Indonesia" msgstr "ඉන්දුනීසියාව" #. 372 msgid "Ireland" msgstr "අයර්ලන්තය" #. 376 msgid "Israel" msgstr "ඊශ්‍රායලය" #. 833 msgid "Isle of Man" msgstr "අයිල් ඔෆ් මෑන්" #. 356 msgid "India" msgstr "ඉන්දියාව" #. 086 msgid "British Indian Ocean Territory" msgstr "බ්‍රිතාන්‍යයේ ඉන්දියානු සාගර බල ප්‍රදේශය" #. 368 msgid "Iraq" msgstr "ඉරාකය" #. 364 msgid "Iran, Islamic Republic of" msgstr "ඉරාන ඉස්ලාමීය ජනරජය" #. 352 msgid "Iceland" msgstr "අයිස්ලන්තය" #. 380 msgid "Italy" msgstr "ඉතාලිය" #. 832 msgid "Jersey" msgstr "ජර්සි" #. 388 msgid "Jamaica" msgstr "ජැමෙයිකාව" #. 400 msgid "Jordan" msgstr "ජොර්දානය" #. 392 msgid "Japan" msgstr "ජපානය" #. 404 msgid "Kenya" msgstr "කෙන්යාව" #. 417 msgid "Kyrgyzstan" msgstr "කිර්ගිස්තානය" #. 116 msgid "Cambodia" msgstr "කාම්බෝජියාව" #. 296 msgid "Kiribati" msgstr "කිරිබටි" #. 174 msgid "Comoros" msgstr "කොමොරොස්" #. 659 msgid "Saint Kitts and Nevis" msgstr "ශාන්ත කිට්ස් සහ නෙවිස්" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "කොරියානු ප්‍රජාතාන්ත්‍රික ජනරජය" #. 410 msgid "Korea, Republic of" msgstr "කොරියානු ජනරජය" #. 414 msgid "Kuwait" msgstr "කුවේටය" #. 136 msgid "Cayman Islands" msgstr "කේමන් දූපත්" #. 398 msgid "Kazakhstan" msgstr "කසකස්තානය" #. 418 msgid "Lao People's Democratic Republic" msgstr "ලාඕ ප්‍රජාතාන්ත්‍රික ජනරජය" #. 422 msgid "Lebanon" msgstr "ලෙබනනය" #. 662 msgid "Saint Lucia" msgstr "ශාන්ත ලුසියා" #. 438 msgid "Liechtenstein" msgstr "ලීච්ටෙන්ස්ටයින්" #. 144 msgid "Sri Lanka" msgstr "ශ්‍රී ලංකාව" #. 430 msgid "Liberia" msgstr "ලයිබීරියාව" #. 426 msgid "Lesotho" msgstr "ලෙසතෝව" #. 440 msgid "Lithuania" msgstr "ලිතුවේනියාව" #. 442 msgid "Luxembourg" msgstr "ලක්සම්බර්ග්" #. 428 msgid "Latvia" msgstr "ලැට්වියාව" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "මොරොක්කෝව" #. 492 msgid "Monaco" msgstr "මොනකෝව" #. 498 msgid "Moldova, Republic of" msgstr "මෝල්ඩෝවා ජනරජය" #. 499 msgid "Montenegro" msgstr "මොන්ටෙන්ග්‍රෝව" #. 663 msgid "Saint Martin (French part)" msgstr "සාන්ත මාටින් ( ප්‍රංශ කොටස )" #. 450 msgid "Madagascar" msgstr "මැඩගස්කරය" #. 584 msgid "Marshall Islands" msgstr "මාෂල් දූපත්" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "මැසිඩෝනියාව ( පෙර යුගෝස්ලෝවියනු ජනරජය )" #. 466 msgid "Mali" msgstr "මාලි" #. 104 msgid "Myanmar" msgstr "මියන්මාරය" #. 496 msgid "Mongolia" msgstr "මොංගෝලියාව" #. 446 msgid "Macao" msgstr "මැකෝ" #. 580 msgid "Northern Mariana Islands" msgstr "උතුරු මරියානා දූපත්" #. 474 msgid "Martinique" msgstr "මාටිනික්" #. 478 msgid "Mauritania" msgstr "මවුරිටේනියා" #. 500 msgid "Montserrat" msgstr "මොන්ට්සෙරට්" #. 470 msgid "Malta" msgstr "මොල්ටාව" #. 480 msgid "Mauritius" msgstr "මොරිෂස්" #. 462 msgid "Maldives" msgstr "මාලදිවයින" #. 454 msgid "Malawi" msgstr "මලාවී" #. 484 msgid "Mexico" msgstr "මෙක්සිකෝව" #. 458 msgid "Malaysia" msgstr "මැලේසියාව" #. 508 msgid "Mozambique" msgstr "මොසැම්බික්" #. 516 msgid "Namibia" msgstr "නැමීබියාව" #. 540 msgid "New Caledonia" msgstr "නිව් සෙලිඩෝනියාව" #. 562 msgid "Niger" msgstr "නයිජර්" #. 574 msgid "Norfolk Island" msgstr "නෝෆෝක් දූපත" #. 566 msgid "Nigeria" msgstr "නයිජීරියාව" #. 558 msgid "Nicaragua" msgstr "නිකරගුවාව" #. 528 msgid "Netherlands" msgstr "නෙදර්ලන්තය" #. 578 msgid "Norway" msgstr "නෝර්වේ" #. 524 msgid "Nepal" msgstr "නේපාලය" #. 520 msgid "Nauru" msgstr "නාවුරු" #. 570 msgid "Niue" msgstr "නිඌ" #. 554 msgid "New Zealand" msgstr "නවසීලන්තය" #. 512 msgid "Oman" msgstr "ඕමානය" #. 591 msgid "Panama" msgstr "පැනමාව" #. 604 msgid "Peru" msgstr "පේරු" #. 258 msgid "French Polynesia" msgstr "ප්‍රංශ පොලිනීසියාව" #. 598 msgid "Papua New Guinea" msgstr "පැපුවා නිව් ගිනියාව" #. 608 msgid "Philippines" msgstr "පිලිපීනය" #. 586 msgid "Pakistan" msgstr "පකිස්තානය" #. 616 msgid "Poland" msgstr "පෝලන්තය" #. 666 msgid "Saint Pierre and Miquelon" msgstr "සාන්ත පියරෙ ඇන්ඩ් මැක්‍ලන්" #. 612 msgid "Pitcairn" msgstr "පිට්කෙයාන්" #. 630 msgid "Puerto Rico" msgstr "පෝටො රිකෝ" #. 275 msgid "Palestinian Territory, Occupied" msgstr "පලස්තීනියානු බල ප්‍රදේශය, සන්තක" #. 620 msgid "Portugal" msgstr "පෘතුගාලය" #. 585 msgid "Palau" msgstr "පාවුලු" #. 600 msgid "Paraguay" msgstr "පැරගුවේ" #. 634 msgid "Qatar" msgstr "කටාරය" #. 638 msgid "Reunion" msgstr "රියුනියන්" #. 642 msgid "Romania" msgstr "රොමේනියාව" #. 688 msgid "Serbia" msgstr "සර්බියාව" #. 643 msgid "Russian Federation" msgstr "රුසියානු සමූහාණ්ඩුව" #. 646 msgid "Rwanda" msgstr "ර්වන්ඩා" #. 682 msgid "Saudi Arabia" msgstr "සවුදි අරාබිය" #. 090 msgid "Solomon Islands" msgstr "සොලමන් දූපත්" #. 690 msgid "Seychelles" msgstr "සී ශෙල්ස්" #. 736 msgid "Sudan" msgstr "සුඩානය" #. 752 msgid "Sweden" msgstr "ස්වීඩනය" #. 702 msgid "Singapore" msgstr "සිංගප්පූරුව" #. 654 msgid "Saint Helena" msgstr "සාන්ත හෙලේනා" #. 705 msgid "Slovenia" msgstr "ස්ලෝවේනියා" #. 744 msgid "Svalbard and Jan Mayen" msgstr "ස්වල්බාඩ් සහ ජන් මයෙන්" #. 703 msgid "Slovakia" msgstr "ස්ලෝවැකියාව" #. 694 msgid "Sierra Leone" msgstr "සියෙරා ලියොන්" #. 674 msgid "San Marino" msgstr "සැන් මරීනෝ" #. 686 msgid "Senegal" msgstr "සෙනගාලය" #. 706 msgid "Somalia" msgstr "සෝමාලියාව" #. 740 msgid "Suriname" msgstr "සුරිනේම්" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "සාඕ ටොමේ සහ ප්‍රින්සිපේ" #. 222 msgid "El Salvador" msgstr "එල් සැල්වදෝරය" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "සිරියානු අරාබි ජනරජය" #. 748 msgid "Swaziland" msgstr "ස්වාසිලන්තය" #. 796 msgid "Turks and Caicos Islands" msgstr "ටර්ක්ස් සහ කයිකොස් දූපත්" #. 148 msgid "Chad" msgstr "චැඩ්" #. 260 msgid "French Southern Territories" msgstr "ප්‍රංශ දකුණු බලප්‍රදේශය" #. 768 msgid "Togo" msgstr "ටෝගෝව" #. 764 msgid "Thailand" msgstr "තායිලන්තය" #. 762 msgid "Tajikistan" msgstr "ටජිකිස්තානය" #. 772 msgid "Tokelau" msgstr "ටොකෙලෝව" #. 626 msgid "Timor-Leste" msgstr "ටිමෝර්-ලෙස්ටේ" #. 795 msgid "Turkmenistan" msgstr "ටර්ක්මනිස්ථාන්" #. 788 msgid "Tunisia" msgstr "ටියුනීසියාව" #. 776 msgid "Tonga" msgstr "ටොන්ගා" #. 792 msgid "Turkey" msgstr "තුර්කිය" #. 780 msgid "Trinidad and Tobago" msgstr "ට්‍රිනිඩෑඩ් සහ ටොබේගෝ" #. 798 msgid "Tuvalu" msgstr "ටුවාලු" #. 158 msgid "Taiwan, Province of China" msgstr "තායිවානය, චීන පළාත" #. 834 msgid "Tanzania, United Republic of" msgstr "ටැන්සානියා එක්සත් ජනරජය" #. 804 msgid "Ukraine" msgstr "යුක්රේනය" #. 800 msgid "Uganda" msgstr "උගන්ඩාව" #. 581 msgid "United States Minor Outlying Islands" msgstr "එක්සත් ජනපදයේ දුරින් පිහිටි කුඩා දූපත්" #. 840 msgid "United States" msgstr "එක්සත් ජනපදය" #. 858 msgid "Uruguay" msgstr "උරුගුවේ" #. 860 msgid "Uzbekistan" msgstr "උස්බකිස්තානය" #. 336 msgid "Holy See (Vatican City State)" msgstr "ශුද්ධ වූ බැලීම ( වතිකානු නගර ජනපදය )" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "සාන්ත වින්සන්ට් සහ ද ග්‍රිනැඩින්ස්" #. 862 msgid "Venezuela" msgstr "වෙනිසියුලාව" #. 092 msgid "Virgin Islands, British" msgstr "වර්ජින් දූපත්, බ්‍රිතාන්‍යය" #. 850 msgid "Virgin Islands, U.S." msgstr "වර්ජින් දූපත්, එ.ජ." #. 704 msgid "Viet Nam" msgstr "වියට්නාමය" #. 548 msgid "Vanuatu" msgstr "වැනෝටු" #. 876 msgid "Wallis and Futuna" msgstr "වෝලිස් සහ ෆුටුනා" #. 882 msgid "Samoa" msgstr "සැමෝවා" #. 887 msgid "Yemen" msgstr "යේමනය" #. 175 msgid "Mayotte" msgstr "මයෝ" #. 710 msgid "South Africa" msgstr "දකුණු අප්‍රිකාව" #. 894 msgid "Zambia" msgstr "සැම්බියාව" #. 716 msgid "Zimbabwe" msgstr "සිම්බාබ්වේ" msgid "* Unknown, add is_in tags to those cities" msgstr "*නොදන්නා, යි_යේ ලේබල එම නගර වලට ඈඳන්න" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "සිතියමේ පොයින්ට්" msgid "Car" msgstr "මෝටර් රථය" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "රට" msgid "Postal" msgstr "තැපැල්" msgid "Town" msgstr "සුළු නගරය" msgid "District" msgstr "දිස්ත්‍රික්කය" msgid "Street" msgstr "වීදිය" msgid "Number" msgstr "අංකය" msgid "Enter Destination" msgstr "ගමනාන්තය ඇතුල් කරන්න" msgid "Zip Code" msgstr "තැපැල් අංකය" msgid "City" msgstr "නගරය" msgid "District/Township" msgstr "දිස්ත්‍රික්කය/සුළු නගරභාවය" msgid "Map" msgstr "සිතියම" msgid "Bookmark" msgstr "පිටුසන" msgid "Destination" msgstr "ගමනාන්තය" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "විශාලන මට්ටම අඩුකරන්න" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "විශාලන මට්ටම වැඩිකරන්න" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "නැවත සිතියම අඳින්න" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "ලිපින සෙවුම් සංවාදය විවෘත කරයි" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "පිරික්සුම" msgid "_Quit" msgstr "_ඉවත් වෙන්න" msgid "Quit the application" msgstr "යෙදුමෙන් ඉවත් වෙන්න" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "සිතියම් දිශානතිය උතුරට හෝ වාහනයට විචලනය කරයි" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "පෙන්වන්න/සඟවන්න රවුට් විස්තරය" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "සක්‍රීය/ අක්‍රීය කරන්න ස්වයංක්‍රීය විශාලන මට්ටම් වෙනස" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "දත්ත" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "උ" msgid "NE" msgstr "උ නැ" msgid "E" msgstr "නැ" msgid "SE" msgstr "ද නැ" msgid "S" msgstr "ද" msgid "SW" msgstr "ද බ" msgid "W" msgstr "බ" msgid "NW" msgstr "උ බ" #. Android resource: @strings/no msgid "No" msgstr "නැත" msgid "2D" msgstr "ද්විමාන" msgid "3D" msgstr "ත්‍රිමාන" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "රවුට් කරන්න %4.0f කි.මී. %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "රවුට් කරන්න 0000 කි.මී. 0+00:00 ETA" msgid "Help" msgstr "සහාය" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "බ්‍රවුසරයේ දක්වන්න" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "වීදි" msgid "House numbers" msgstr "ගෘහ අංක" msgid "View Attributes" msgstr "උප ලක්ෂණ දක්වන්න" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "POIs" msgid "View on map" msgstr "සිතියමේ දක්වන්න" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "පිටුසන කපන්න" msgid "Copy Bookmark" msgstr "පිටුසන පිටපත් කරන්න" msgid "Rename Bookmark" msgstr "පිටුසන ප්‍රතිනාම කරන්න" msgid "Paste Bookmark" msgstr "පිටුසන අලවන්න" msgid "Delete Bookmark" msgstr "පිටුසන මකන්න" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "පිටුසන්" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "පිටුසන් ෆෝල්ඩරය ඈඳන්න" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "පිටුසන අලවන්න" #, c-format msgid "Bookmark %s" msgstr "පිටුසන් කරන්න %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "චන්ද්‍රිකා තත්වය පෙන්වන්න" msgid " Elevation " msgstr " උන්නතිය " msgid " Azimuth " msgstr " දිගංශය " msgid "Show NMEA Data" msgstr "NMEA දත්ත පෙන්වන්න" msgid "car" msgstr "මෝටර් රථය" msgid "bike" msgstr "යතුරු පැදිය" msgid "pedestrian" msgstr "පදික" #, c-format msgid "Current profile: %s" msgstr "දැන් පවත්නා පැතිකඩ: %s" #, c-format msgid "Change profile to: %s" msgstr "පැතිකඩ වෙනස් කරන්න : %s" msgid "Set as active" msgstr "ක්‍රියාකාරී ලෙස සිටුවන්න" msgid "Show Satellite status" msgstr "චන්ද්‍රිකා තත්වය පෙන්වන්න" msgid "Show NMEA data" msgstr "NMEA දත්ත පෙන්වන්න" msgid "Add Bookmark" msgstr "පිටුසනක් ඈඳන්න" msgid "Rename" msgstr "නම වෙනස් කරන්න" msgid "About Navit" msgstr "Navit පිළිබඳව" #. Authors msgid "By" msgstr "කර්තෘ:" #. Contributors msgid "And all the Navit Team" msgstr "Navit කණ්ඩායමේ සියලුම දෙනා" msgid "members and contributors." msgstr "සාමාජිකයන් සහ දායකයන්" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "වාහනය" msgid "Rules" msgstr "නීති" msgid "Lock on road" msgstr "මාර්ගය අගුළුලන්න" msgid "Northing" msgstr "උතුරු දිශාගත" msgid "Map follows Vehicle" msgstr "සිතියම වාහනය අනුගමනය කරයි" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "සිතියම්" msgid "Layout" msgstr "පිරිසැලසුම" msgid "Height Profile" msgstr "උසේ පැතිපෙනුම" msgid "Route Description" msgstr "රවුට් විස්තරය" msgid "Show Locale" msgstr "පෙදෙසිය පෙන්වන්න" msgid "Former Destinations" msgstr "පූර්ව ගමනාන්ත" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "පණිවිඩය" msgid "Back" msgstr "ආපසු" msgid "Back to map" msgstr "ආපසු සිතියමට" msgid "Main Menu" msgstr "ප්‍රධාන මෙනුව" msgid "House number" msgstr "ගෘහ අංකය" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "වාහනයේ පිහිටීම" msgid "Main menu" msgstr "ප්‍රධාන මෙනුව" msgid "" "Show\n" "Map" msgstr "" "පෙන්වන්න\n" "මෙනුව" msgid "Settings" msgstr "සිටුවීම්" msgid "Tools" msgstr "මෙවලම්" msgid "Route" msgstr "රවුට්" msgid "About" msgstr "පිළිබඳව" msgid "Quit" msgstr "ඉවත්වන්න" msgid "Actions" msgstr "ක්‍රියා" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "සංචාලනය\n" "නවත්වන්න" msgid "Display" msgstr "සංදර්ශකය" msgid "Fullscreen" msgstr "මුළු තිරය" msgid "Window Mode" msgstr "කවුළු ප්‍රකාරය" msgid "Description" msgstr "විස්තරය" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "අශ්ව" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "එවිට %1$s %2$s හිදී වටරවුමෙන් ඉවත්වන්න." navit-0.5.0+dfsg.1/po/sk.po.in000066400000000000000000001337131264204753600157340ustar00rootroot00000000000000# Slovak translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Eduard DRUSA https://launchpad.net/~ventyl86 # František Horínek https://launchpad.net/~frantisekhorinek # GizmoSK https://launchpad.net/~gizmosk # KaZeR https://launchpad.net/~kazer # Miroslav Ďurian https://launchpad.net/~aasami # helix84 https://launchpad.net/~helix84 # kayle.sk https://launchpad.net/~kayle.sk # laznik https://launchpad.net/~orders-strings msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: GizmoSK \n" "Language-Team: Slovenčina\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "Language: sk\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Beží zo zdrojového adresára\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nastavuje sa „%s“ na „%s“\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nultý" msgid "first" msgstr "prvý" msgid "second" msgstr "druhý" msgid "third" msgstr "tretí" msgid "fourth" msgstr "štvrtý" msgid "fifth" msgstr "piaty" msgid "sixth" msgstr "šiesty" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "nultý výjazd" msgid "first exit" msgstr "prvý výjazd" msgid "second exit" msgstr "druhý výjazd" msgid "third exit" msgstr "tretí výjazd" msgid "fourth exit" msgstr "štvrtý výjazd" msgid "fifth exit" msgstr "piaty výjazd" msgid "sixth exit" msgstr "šiesty výjazd" #, c-format msgid "%d feet" msgstr "%d stôp" #, c-format msgid "in %d feet" msgstr "o %d stôp" #, c-format msgid "%d.%d miles" msgstr "%d.%d míľ" #, c-format msgid "in %d.%d miles" msgstr "o %d.%d míľ" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d míľa" msgstr[1] "%d míle" msgstr[2] "%d míľ" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "o %d míľu" msgstr[1] "o %d míle" msgstr[2] "o %d míľ" #, c-format msgid "%d meters" msgstr "%d metrov" #, c-format msgid "in %d meters" msgstr "o %d metrov" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometrov" #, c-format msgid "in %d.%d kilometers" msgstr "o %d.%d kilometrov" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometrov" msgstr[1] "jeden kilometer" msgstr[2] "%d kilometre" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "o %d kilometrov" msgstr[1] "o jeden kilometer" msgstr[2] "o %d kilometre" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "na privádzač" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sdo %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sdo %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sdo %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sdo %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s na %s" msgid "When possible, please turn around" msgstr "Ak to bude možné, prosím, otočte sa" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Pokračujte naďalej po ceste %s" msgid "Enter the roundabout soon" msgstr "Vstúpte do kruhového objazdu onedlho" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Opustite kruhový objazd na %1$s %2$s" msgid "soon" msgstr "onedlho" msgid "now" msgstr "teraz" msgid "then" msgstr "potom" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "vpravo" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "vľavo" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "mierne " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "prudko " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Choďte %1$s cestou na %2$s" #, c-format msgid "after %i roads" msgstr "po %i cestách" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Odbočte %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "potom otočte sa" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Otočte sa %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "potom otočte sa" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Otočte sa %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "potom dosiahnete svoj cieľ cesty" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Dorazili ste do svojho cieľa %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Križovatka" msgid "Exit" msgstr "Výjazd" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Pozícia" msgid "Command" msgstr "Príkaz" msgid "Length" msgstr "Dĺžka" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Čas" msgid "Destination Length" msgstr "Cieľová vzdialenosť" msgid "Destination Time" msgstr "Čas k cieľu" msgid "Roadbook" msgstr "Plán trasy" #, c-format msgid "Waypoint %d" msgstr "Bod trasy %d" msgid "Visit before..." msgstr "Predtým navštíviť..." msgid "Set as position" msgstr "Nastaviť ako pozíciu" msgid "Set as destination" msgstr "Nastaviť ako cieľ" msgid "Add as bookmark" msgstr "Pridať ako záložku" #, c-format msgid "Point 0x%x 0x%x" msgstr "Bod 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Súradnice obrazovky: %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Spojené arabské emiráty" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua a Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albánsko" #. 051 msgid "Armenia" msgstr "Arménsko" #. 530 msgid "Netherlands Antilles" msgstr "Holandské Antily" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktída" #. 032 msgid "Argentina" msgstr "Argentína" #. 016 msgid "American Samoa" msgstr "Americká Samoa" #. 040 msgid "Austria" msgstr "Rakúsko" #. 036 msgid "Australia" msgstr "Austrália" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Alandy" #. 031 msgid "Azerbaijan" msgstr "Azerbajdžan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna a Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladéž" #. 056 msgid "Belgium" msgstr "Belgicko" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulharsko" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Svátý Bartolomej" #. 060 msgid "Bermuda" msgstr "Bermudy" #. 096 msgid "Brunei Darussalam" msgstr "Brunejský Darussalam" #. 068 msgid "Bolivia" msgstr "Bolívia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius and Saba" #. 076 msgid "Brazil" msgstr "Brazília" #. 044 msgid "Bahamas" msgstr "Bahamy" #. 064 msgid "Bhutan" msgstr "Bután" #. 074 msgid "Bouvet Island" msgstr "Bouvetov ostrov" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Bielorusko" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosové (Keeling) ostrovy" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Konžská demokratická republika" #. 140 msgid "Central African Republic" msgstr "Stredoafrická republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švajčiarsko" #. 384 msgid "Cote d'Ivoire" msgstr "Pobrežie slonoviny" #. 184 msgid "Cook Islands" msgstr "Cookove ostrovy" #. 152 msgid "Chile" msgstr "Čile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Čína" #. 170 msgid "Colombia" msgstr "Kolumbia" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "Curacao" #. 162 msgid "Christmas Island" msgstr "Vianočné ostrovy" #. 196 msgid "Cyprus" msgstr "Cyprus" #. 203 msgid "Czech Republic" msgstr "Česká republika" #. 276 msgid "Germany" msgstr "Nemecko" #. 262 msgid "Djibouti" msgstr "Džibutsko" #. 208 msgid "Denmark" msgstr "Dánsko" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikánska republika" #. 012 msgid "Algeria" msgstr "Alžírsko" #. 218 msgid "Ecuador" msgstr "Ekvádor" #. 233 msgid "Estonia" msgstr "Estónsko" #. 818 msgid "Egypt" msgstr "Egypt" #. 732 msgid "Western Sahara" msgstr "Západná Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Španielsko" #. 231 msgid "Ethiopia" msgstr "Etiópia" #. 246 msgid "Finland" msgstr "Fínsko" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkandské ostrovy (Malvíny)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronézske federatívne štáty" #. 234 msgid "Faroe Islands" msgstr "Faerské ostrovy" #. 250 msgid "France" msgstr "Francúzsko" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Spojené kráľovstvo" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzínsko" #. 254 msgid "French Guiana" msgstr "Francúzska Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltár" #. 304 msgid "Greenland" msgstr "Grónsko" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Rovníková Guinea" #. 300 msgid "Greece" msgstr "Grécko" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Južná Georgia a Južné Sandwitchové ostrovy" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heardov a McDonaldove ostrovy" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Chorvátsko" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Maďarsko" #. 360 msgid "Indonesia" msgstr "Indonézia" #. 372 msgid "Ireland" msgstr "Írsko" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Ostrov Man" #. 356 msgid "India" msgstr "India" #. 086 msgid "British Indian Ocean Territory" msgstr "Britské teritórium Indického oceánu" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iránska islamská republika" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Taliansko" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordánsko" #. 392 msgid "Japan" msgstr "Japonsko" #. 404 msgid "Kenya" msgstr "Keňa" #. 417 msgid "Kyrgyzstan" msgstr "Kirgistán" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komory" #. 659 msgid "Saint Kitts and Nevis" msgstr "Svätý Krištof a Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Kórejská ľudovodemokratická republika" #. 410 msgid "Korea, Republic of" msgstr "Kórejská republika" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanské ostrovy" #. 398 msgid "Kazakhstan" msgstr "Kazachstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoská ľudovodemokratická republika" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Svätá Lucia" #. 438 msgid "Liechtenstein" msgstr "Lichtenštajnsko" #. 144 msgid "Sri Lanka" msgstr "Srí Lanka" #. 430 msgid "Liberia" msgstr "Libéria" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litva" #. 442 msgid "Luxembourg" msgstr "Luxembursko" #. 428 msgid "Latvia" msgstr "Lotyšsko" #. 434 msgid "Libya" msgstr "Líbya" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavská republika" #. 499 msgid "Montenegro" msgstr "Čierna hora" #. 663 msgid "Saint Martin (French part)" msgstr "Svátý martin (Francúzska časť)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Maršalové ostrovy" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedónsko" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mjanmarsko" #. 496 msgid "Mongolia" msgstr "Mongolsko" #. 446 msgid "Macao" msgstr "Makao" #. 580 msgid "Northern Mariana Islands" msgstr "Severné Mariány" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mauretánia" #. 500 msgid "Montserrat" msgstr "Monserat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauricius" #. 462 msgid "Maldives" msgstr "Maledivy" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malajzia" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namíbia" #. 540 msgid "New Caledonia" msgstr "Nová Kaledónia" #. 562 msgid "Niger" msgstr "Nigér" #. 574 msgid "Norfolk Island" msgstr "Ostrov Norfolk" #. 566 msgid "Nigeria" msgstr "Nigéria" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Holandsko" #. 578 msgid "Norway" msgstr "Nórsko" #. 524 msgid "Nepal" msgstr "Nepál" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nový Zéland" #. 512 msgid "Oman" msgstr "Omán" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francúzska Polynézia" #. 598 msgid "Papua New Guinea" msgstr "Papua Nová Guinea" #. 608 msgid "Philippines" msgstr "Filipíny" #. 586 msgid "Pakistan" msgstr "Pakistán" #. 616 msgid "Poland" msgstr "Poľsko" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Svätý Piere a Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Portoriko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestínske územie, okupované" #. 620 msgid "Portugal" msgstr "Portugalsko" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Réunion" #. 642 msgid "Romania" msgstr "Rumunsko" #. 688 msgid "Serbia" msgstr "Srbsko" #. 643 msgid "Russian Federation" msgstr "Ruská federácia" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudská Arábia" #. 090 msgid "Solomon Islands" msgstr "Šalamúnove Ostrovy" #. 690 msgid "Seychelles" msgstr "Seychelské ostrovy" #. 736 msgid "Sudan" msgstr "Sudán" #. 752 msgid "Sweden" msgstr "Švédsko" #. 702 msgid "Singapore" msgstr "Singapúr" #. 654 msgid "Saint Helena" msgstr "Svätá Helena" #. 705 msgid "Slovenia" msgstr "Slovinsko" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Špicbergy a Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovenská republika" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Maríno" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somálsko" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Južný Sudán" #. 678 msgid "Sao Tome and Principe" msgstr "Svatý Tomáš" #. 222 msgid "El Salvador" msgstr "Salvádor" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (holandská časť)" #. 760 msgid "Syrian Arab Republic" msgstr "Sýrska arabská republika" #. 748 msgid "Swaziland" msgstr "Svazijsko" #. 796 msgid "Turks and Caicos Islands" msgstr "Turkské a kaikoské ostrovy" #. 148 msgid "Chad" msgstr "Čad" #. 260 msgid "French Southern Territories" msgstr "Francúzske južné a antarktické územia" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thajsko" #. 762 msgid "Tajikistan" msgstr "Tadžikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkménsko" #. 788 msgid "Tunisia" msgstr "Tunisko" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turecko" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad a Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, provincia Číny" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzánijská zjednotená republika" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Spojené štáty drobných odľahlých ostrovov" #. 840 msgid "United States" msgstr "Spojené štáty americké" #. 858 msgid "Uruguay" msgstr "Uruguaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Svätá stolica (Vatikánsky mestský štát)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Svätý Vincent a Grenadíny" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Panenské ostrovy, Britské" #. 850 msgid "Virgin Islands, U.S." msgstr "Panenské ostrovy, Americké" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis a Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Juhoafrická republika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Neznáme, pridajte is_in tag v týchto mestách." msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "Nenašiel sa žiaden z konfiguračných súborov navit.xml, navit.xml.local\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "Chyba parsovania konfiguračného súboru '%s': %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Používa sa konfiguračný súbor '%s'\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Vnútorná inicializácia zlyhala, ukončujem. Skontrolujte predchádzajúce " "chybové hlásenia.\n" msgid "unknown street" msgstr "neznáma ulica" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Nepomenované vozidlo" msgid "Failed to write bookmarks file" msgstr "Zápis zlyhal" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Bod na mape" msgid "Car" msgstr "Vozidlo" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Krajina" msgid "Postal" msgstr "PSČ" msgid "Town" msgstr "Mesto" msgid "District" msgstr "Kraj" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Číslo" msgid "Enter Destination" msgstr "Uveďte cieľ" msgid "Zip Code" msgstr "PSČ" msgid "City" msgstr "Mesto" msgid "District/Township" msgstr "Kraj/Okres" msgid "Map" msgstr "Mapa" msgid "Bookmark" msgstr "Záložka" msgid "Destination" msgstr "Cieľ" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Displej" msgid "_Route" msgstr "Trasa" msgid "_Former Destinations" msgstr "Predošlé cieľe" msgid "_Bookmarks" msgstr "Záložky" msgid "_Map" msgstr "Mapa" msgid "_Layout" msgstr "Značenie" msgid "_Projection" msgstr "Projekcia" msgid "_Vehicle" msgstr "Vozidlo" msgid "Zoom_Out" msgstr "Oddialiť" msgid "Decrease zoom level" msgstr "Oddialiť" msgid "Zoom_In" msgstr "Priblížiť" msgid "Increase zoom level" msgstr "Priblížiť" msgid "_Recalculate" msgstr "Prepočítať" msgid "Redraw map" msgstr "Prekresliť mapu" msgid "_Info" msgstr "Informácie" msgid "Set _destination" msgstr "Nastaviť _destination" msgid "Opens address search dialog" msgstr "Otvorí dialóg hľadania adresy" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Zastaviť navigáciu" msgid "Test" msgstr "Otestovať" msgid "_Quit" msgstr "_Koniec" msgid "Quit the application" msgstr "Ukončiť aplikáciu" msgid "Show position _cursor" msgstr "Zobraziť pozíciu _cursor" msgid "_Lock on Road" msgstr "Uzamknúť na cesty" msgid "_Keep orientation to the North" msgstr "_Keep orientáciu na sever" msgid "Switches map orientation to the north or the vehicle" msgstr "Prepína medzi severom na vrchu a smerom jazdy na vrchu" msgid "_Roadbook" msgstr "Plán trasy" msgid "Show/hide route description" msgstr "Zobraziť / skryť popis trasy" msgid "_Autozoom" msgstr "Automatické zväčšenie" msgid "Enable/disable automatic zoom level changing" msgstr "Povoliť / zakázať automatickú zmenu priblíženia" msgid "_Fullscreen" msgstr "Celá obrazovka" msgid "Data" msgstr "Dáta" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "S" msgid "NE" msgstr "SV" msgid "E" msgstr "V" msgid "SE" msgstr "JV" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Nie" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Cesta %4.0fkm čas %02d:%02d" msgid "Route 0000km 0+00:00 ETA" msgstr "Cesta 0000km čas 0+00:00" msgid "Help" msgstr "Pomoc" #, c-format msgid "Waypoint %s" msgstr "Bod trasy %s" msgid "Select waypoint to insert the new one before" msgstr "Zvoľte bod trasy pred ktorý sa vloží nový" msgid "View in Browser" msgstr "Zobraziť v prehliadači" msgid "Item type" msgstr "Typ položky" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ulice" msgid "House numbers" msgstr "Čísla domov" msgid "View Attributes" msgstr "Zobraziť atribúty" msgid "Set as position (and deactivate vehicle)" msgstr "Nastaviť ako pozíciu (a deaktivovať vozidlo)" msgid "POIs" msgstr "POI" msgid "View on map" msgstr "Zobraziť na mape" msgid "Remove search results from the map" msgstr "Odstrániť výsledky vyhľadávania z mapy" msgid "Show results on the map" msgstr "Zobraziť výsledky vyhľadávania na mape" msgid "Cut Bookmark" msgstr "Vystrihnúť záložku" msgid "Copy Bookmark" msgstr "Kopírovať záložku" msgid "Rename Bookmark" msgstr "Premenovať záložku" msgid "Paste Bookmark" msgstr "Vložiť záložku" msgid "Delete Bookmark" msgstr "Odstrániť záložku" msgid "Delete waypoint" msgstr "Zmazať bod trasy" msgid "Bookmarks" msgstr "Záložky" msgid "Bookmarks as waypoints" msgstr "Záložky ako body trasy" msgid "Save waypoints" msgstr "Uložiť body trasy" msgid "Replace with waypoints" msgstr "Nahradiť bodmi trasy" msgid "Delete Folder" msgstr "Odstrániť zdresár" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Pridať priečinok pre záložky" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Vložiť záložku" #, c-format msgid "Bookmark %s" msgstr "Záložka %s" #, c-format msgid "Download %s" msgstr "Sťahujem %s" msgid "Map Download" msgstr "Stiahnutie máp" msgid "Active" msgstr "Aktívny" msgid "Download Enabled" msgstr "Sťahovanie povolené" msgid "Download completely" msgstr "Sťahovanie dokončené" msgid "Show Satellite Status" msgstr "Zobraziť stav satelitov" msgid " Elevation " msgstr " Prevýšenie " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "Zobraziť NMEA data" msgid "car" msgstr "auto" msgid "bike" msgstr "bicykel" msgid "pedestrian" msgstr "chodec" #, c-format msgid "Current profile: %s" msgstr "Aktuálny profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Zmeniť profil na: %s" msgid "Set as active" msgstr "Nastaviť ako aktívny" msgid "Show Satellite status" msgstr "Zobraziť stav satelitov" msgid "Show NMEA data" msgstr "Zobraziť NMEA data" msgid "Add Bookmark" msgstr "Pridať záložku" msgid "Rename" msgstr "Premenovať" msgid "About Navit" msgstr "O Navite" #. Authors msgid "By" msgstr "Od" #. Contributors msgid "And all the Navit Team" msgstr "A všetci členovia týmu Navitu" msgid "members and contributors." msgstr "členovia a prispievatelia" msgid "Waypoints" msgstr "Body trasy" msgid "Enter Coordinates" msgstr "Vložte súradnice" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "Vložte súradnice, napríklad:" msgid "Vehicle" msgstr "Vozidlo" msgid "Rules" msgstr "Pravidlá" msgid "Lock on road" msgstr "Prichytiť k ceste" msgid "Northing" msgstr "Sever vždy hore" msgid "Map follows Vehicle" msgstr "Mapa sleduje vozidlo" msgid "Plan with Waypoints" msgstr "Plánovať s bodmi trasy" msgid "Maps" msgstr "Mapy" msgid "Layout" msgstr "Značenie" msgid "Height Profile" msgstr "Výškovy Profil" msgid "Route Description" msgstr "Popis trasy" msgid "Show Locale" msgstr "Zobraziť jazyk" msgid "Former Destinations" msgstr "Predošlé cieľe" msgid "- No former destinations available -" msgstr "- Nie sú k dispozícii žiadne predchádzajúce destinácie -" msgid "Message" msgstr "Správa" msgid "Back" msgstr "Späť" msgid "Back to map" msgstr "Späť na mapu" msgid "Main Menu" msgstr "Hlavné menu" msgid "House number" msgstr "Číslo domu" msgid "Next" msgstr "Ďalej" msgid "Prev" msgstr "späť" msgid "Return to route!" msgstr "Návrat k trase!" #. warning told msgid "Look out! Camera!" msgstr "Pozor! Radar!" #. warning told msgid "Please decrease your speed" msgstr "Znížte rýchlosť proím" msgid "partial match" msgstr "čiastočná zhoda" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Hľadať" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Mestá" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Trasovať tu" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Mapové dáta (c) OpenStreetMap contributors, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Stiahnuté mapy" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Zrušiť" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Celá zemeguľa" msgid "Africa" msgstr "Afrika" msgid "Canary Islands" msgstr "Kanárske ostrovy" msgid "Asia" msgstr "Ázia" msgid "Korea" msgstr "Kórea" msgid "Taiwan" msgstr "Taiwan" msgid "UAE+Other" msgstr "UAE+Iné" msgid "Oceania" msgstr "Oceánia" msgid "Tasmania" msgstr "Tazmánia" msgid "Victoria" msgstr "Viktória" msgid "New South Wales" msgstr "Nový Južný Wales" msgid "Europe" msgstr "Európa" msgid "Western Europe" msgstr "Západná Európa" msgid "Azores" msgstr "Azory" msgid "BeNeLux" msgstr "Benelux" msgid "Alsace" msgstr "Alsasko" msgid "Aquitaine" msgstr "Akvitánsko" msgid "Auvergne" msgstr "Auvergne" msgid "Basse-Normandie" msgstr "Basse-Normandia" msgid "Bourgogne" msgstr "Burgundsko" msgid "Bretagne" msgstr "Bretónsko" msgid "Centre" msgstr "Vycentrovať" msgid "Champagne-Ardenne" msgstr "Champagne-Ardenne" msgid "Corse" msgstr "Corse" msgid "Franche-Comte" msgstr "Franche-Comte" msgid "Haute-Normandie" msgstr "Haute-Normandia" msgid "Ile-de-France" msgstr "Ile-de-France" msgid "Languedoc-Roussillon" msgstr "Languedoc-Roussillon" msgid "Limousin" msgstr "Limousin" msgid "Lorraine" msgstr "Lotrinsko" msgid "Midi-Pyrenees" msgstr "Midi-Pyrenees" msgid "Nord-pas-de-Calais" msgstr "Nord-pas-de-Calais" msgid "Pays-de-la-Loire" msgstr "Pays-de-la-Loire" msgid "Picardie" msgstr "Pikardia" msgid "Poitou-Charentes" msgstr "Poitou-Charentes" msgid "Provence-Alpes-Cote-d-Azur" msgstr "Provence-Alpes-Cote-d-Azur" msgid "Rhone-Alpes" msgstr "Rhone-Alpes" msgid "Baden-Wuerttemberg" msgstr "Bádensko-Württembersko" msgid "Bayern" msgstr "Bavorsko" msgid "Mittelfranken" msgstr "Mittelfranken" msgid "Niederbayern" msgstr "Niederbayern" msgid "Oberbayern" msgstr "Oberbayern" msgid "Oberfranken" msgstr "Oberfranken" msgid "Oberpfalz" msgstr "Oberpfalz" msgid "Schwaben" msgstr "Schwaben" msgid "Unterfranken" msgstr "Unterfranken" msgid "Berlin" msgstr "Berlín" msgid "Brandenburg" msgstr "Brandenbursko" msgid "Bremen" msgstr "Brémy" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hesensko" msgid "Mecklenburg-Vorpommern" msgstr "Mecklenburg-Vorpommern" msgid "Niedersachsen" msgstr "Dolné Sasko" msgid "Nordrhein-westfalen" msgstr "Nordrhein-westfalen" msgid "Rheinland-Pfalz" msgstr "Porýnie-Falcko" msgid "Saarland" msgstr "Sársko" msgid "Sachsen-Anhalt" msgstr "Sasko-Anhaltsko" msgid "Sachsen" msgstr "Sasko" msgid "Schleswig-Holstein" msgstr "Šlezvicko-Holštajnsko" msgid "Thueringen" msgstr "Durínsko" msgid "Mallorca" msgstr "Malorka" msgid "Galicia" msgstr "Galícia" msgid "Scandinavia" msgstr "Škandinávia" msgid "England" msgstr "Anglicko" msgid "Buckinghamshire" msgstr "Buckinghamshire" msgid "Cambridgeshire" msgstr "Cambridgeshire" msgid "Cumbria" msgstr "Cumbria" msgid "East yorkshire with hull" msgstr "East yorkshire with hull" msgid "Essex" msgstr "Essex" msgid "Herefordshire" msgstr "Herefordshire" msgid "Kent" msgstr "Kent" msgid "Lancashire" msgstr "Lancashire" msgid "Leicestershire" msgstr "Leicestershire" msgid "Norfolk" msgstr "Norfolk" msgid "Nottinghamshire" msgstr "Nottinghamshire" msgid "Oxfordshire" msgstr "Oxfordshire" msgid "Shropshire" msgstr "Shropshire" msgid "Somerset" msgstr "Somerset" msgid "South yorkshire" msgstr "Južný yorkshire" msgid "Suffolk" msgstr "Suffolk" msgid "Surrey" msgstr "Surrey" msgid "Wiltshire" msgstr "Wiltshire" msgid "Scotland" msgstr "Škótsko" msgid "Wales" msgstr "Wales" msgid "Crete" msgstr "Kréta" msgid "North America" msgstr "Severná Amerika" msgid "Alaska" msgstr "Alijaška" msgid "Hawaii" msgstr "Havaj" msgid "USA" msgstr "USA" msgid " (except Alaska and Hawaii)" msgstr " (okrem Alijašky a Havaja)" msgid "Midwest" msgstr "Stredný západ" msgid "Michigan" msgstr "Michigan" msgid "Ohio" msgstr "Ohio" msgid "Northeast" msgstr "Severovýchod" msgid "Massachusetts" msgstr "Massachusetts" msgid "Vermont" msgstr "Vermont" msgid "Pacific" msgstr "Pacifik" msgid "South" msgstr "Juh" msgid "Arkansas" msgstr "Arkansas" msgid "District of Columbia" msgstr "Oblasť Columbia" msgid "Florida" msgstr "Florida" msgid "Louisiana" msgstr "Louisiana" msgid "Maryland" msgstr "Maryland" msgid "Mississippi" msgstr "Mississippi" msgid "Oklahoma" msgstr "Oklahoma" msgid "Texas" msgstr "Texas" msgid "Virginia" msgstr "Virgínia" msgid "West Virginia" msgstr "Západná Virgínia" msgid "West" msgstr "Západ" msgid "Arizona" msgstr "Arizona" msgid "California" msgstr "Kalifornia" msgid "Colorado" msgstr "Colorado" msgid "Idaho" msgstr "Idaho" msgid "Montana" msgstr "Montana" msgid "New Mexico" msgstr "Nové Mexiko" msgid "Nevada" msgstr "Nevada" msgid "Oregon" msgstr "Oregon" msgid "Utah" msgstr "Utah" msgid "Washington State" msgstr "Štát Washington" msgid "South+Middle America" msgstr "Južná + Stredná Amerika" msgid "Guyane Francaise" msgstr "Guyane Francaise" msgid "downloading" msgstr "Sťahuje sa" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "pripravený" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Nedostatok voľného miesta" msgid "Error downloading map!" msgstr "Chyba počas sťahovania mapy!" msgid "Error writing map!" msgstr "Chyba pri zápise mapy!" msgid "Map download aborted!" msgstr "Sťahovanie mapy prerušené!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Zostáva" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Sťahovanie máp" msgid "Vehicle Position" msgstr "Pozícia vozidla" msgid "Main menu" msgstr "Hlavné menu" msgid "" "Show\n" "Map" msgstr "" "Zobraziť\n" "mapu" msgid "Settings" msgstr "Nastavenia" msgid "Tools" msgstr "Nástroje" msgid "Route" msgstr "Trasa" msgid "About" msgstr "O programe" msgid "Quit" msgstr "Koniec" msgid "Actions" msgstr "Akcie" msgid "" "Former\n" "Destinations" msgstr "" "Bývalé\n" "Ciele" msgid "Coordinates" msgstr "Súradnice" msgid "" "Stop\n" "Navigation" msgstr "" "Zastaviť\n" "navigáciu" msgid "Display" msgstr "Displej" msgid "Fullscreen" msgstr "Celá obrazovka" msgid "Window Mode" msgstr "V okne" msgid "Description" msgstr "Popis" msgid "" "Drop last \n" "Waypoint" msgstr "" "Vložiť posledný\n" "bod trasy" msgid "" "Drop next \n" "Waypoint" msgstr "" "Vložiť nasledujúci\n" "bod trasy" msgid "Satellite Status" msgstr "Stav satelitov" msgid "NMEA Data" msgstr "Dáta NMEA" msgid "car_shortest" msgstr "car_shortest" msgid "car_avoid_tolls" msgstr "car_avoid_tolls" msgid "car_pedantic" msgstr "car_pedantic" msgid "horse" msgstr "kôň" msgid "Truck" msgstr "Kamión" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Áno" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit spustený" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit beží" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Vitajte v Navit" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Ďakujem, že ste si nainštalovali Navit!\n" "\n" "Pre začatie zvoľte z hlavného menu \"Stiahnuť mapy\" pre stiahnutie máp . " "Poznámka: Veľkosť mapy môže byť väčšia (>50MB) - a odporúča sa wifi " "pripojenie.\n" "\n" "Mapové dáta: (c) OpenStreetMap contributors\n" "\n" "Užívajte Navit!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "OK" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Viac informácií" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Priblížiť" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Oddialiť" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Sťahovanie máp" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Prepnúť body záujmu" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Ukončiť Navit" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Záloha / Obnova" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Zmazať túto mapu?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Sťahovanie:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Chyba sťahovania mapy" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Sťahovanie mapy prerušené" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Bez lokácie. Po opravení lokácia otvorte znova." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Mapy obsahujúce aktuálnu polohu" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Vyhľadávanie adresy" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Vložte cieľ" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Zhoda čiastočnej adresy" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Vyhľadávam..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adresa nenájdená" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Získavam výsledky vyhľadávania" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Nahrávam výsledky vyhľadávania" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Nič nenájdené" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Nevložený žiaden text" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Nastaviť cieľ do:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Zvoľte akciu" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Vložte prosím SD kartu" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Zálohujem..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Obnovujem..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Vytvorenie záložného adresára zlyhalo" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Zálohovanie zlyhalo" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Záloha nenájdená" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Obnova zlyhala" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Obnova úspešná" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Obnova úspešná\n" "Reštartujte Navit prosím" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Záloha nenájdená" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Obnova zlyhala" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Zvoľte zálohu" #. Android resource: @strings/backup msgid "Backup" msgstr "Záloha" #. Android resource: @strings/restore msgid "Restore" msgstr "Obnova" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "potom opustite kruhový objazd na %1$s %2$s" navit-0.5.0+dfsg.1/po/sl.po.in000066400000000000000000001210621264204753600157270ustar00rootroot00000000000000# Slovenian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Gregor Koporec https://launchpad.net/~gregork8 # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # Štefan Baebler https://launchpad.net/~stefanba msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "Language: sl\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Zagon iz mape z izvorno kodo\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "nastavljam '%s' na '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "ničt" msgid "first" msgstr "prv" msgid "second" msgstr "drug" msgid "third" msgstr "tretj" msgid "fourth" msgstr "četrt" msgid "fifth" msgstr "pet" msgid "sixth" msgstr "šest" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "ničti izhod" msgid "first exit" msgstr "prvi izhod" msgid "second exit" msgstr "drugi izhod" msgid "third exit" msgstr "tretji izhod" msgid "fourth exit" msgstr "četrti izhod" msgid "fifth exit" msgstr "peti izhod" msgid "sixth exit" msgstr "šesti izhod" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d metrov" #, c-format msgid "in %d meters" msgstr "Čez %d metrov" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilometrov" #, c-format msgid "in %d.%d kilometers" msgstr "Čez %d.%d kilometov" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometrov" msgstr[1] "%d kilometer" msgstr[2] "%d kilometra" msgstr[3] "%d kilometri" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "Čez %d kilometrov" msgstr[1] "Čez %d kilometer" msgstr[2] "Čez %d kilometra" msgstr[3] "Čez %d kilometre" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sna %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sna %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sna %s" msgid "When possible, please turn around" msgstr "Obrnite čim bo to mogoče" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Ostanite na tej cesti naslednjih %s" msgid "Enter the roundabout soon" msgstr "Kmalu zapeljite v krožišče" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "kmalu" msgid "now" msgstr "sedaj" msgid "then" msgstr "nato" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "desno" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "levo" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "rahlo " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "ostro " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Zavijte na %2$s v %1$so cesto" #, c-format msgid "after %i roads" msgstr "čez %i cest" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%3$s zavijte %1$s%2$s %4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "nato obrnite čim" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Obrnite čim %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "nato obrnite čim" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Obrnite čim %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "in ste na cilju." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "%s ste na cilju" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Razcep" msgid "Exit" msgstr "Odcep" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Položaj" msgid "Command" msgstr "Navodilo" msgid "Length" msgstr "Razdalja" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Čas" msgid "Destination Length" msgstr "Razdalja do cilja" msgid "Destination Time" msgstr "Čas do cilja" msgid "Roadbook" msgstr "Načrt poti" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Nastavi kot položaj" msgid "Set as destination" msgstr "Nastavi kot cilj" msgid "Add as bookmark" msgstr "Dodaj zaznamek" #, c-format msgid "Point 0x%x 0x%x" msgstr "Točka 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinate zaslona: %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Združeni arabski emirati" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigva in Barbuda" #. 660 msgid "Anguilla" msgstr "Angvila" #. 008 msgid "Albania" msgstr "Albanija" #. 051 msgid "Armenia" msgstr "Armenija" #. 530 msgid "Netherlands Antilles" msgstr "Nizozemski Antili" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Ameriška Samoa" #. 040 msgid "Austria" msgstr "Avstrija" #. 036 msgid "Australia" msgstr "Avstralija" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbajdžan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna in Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeš" #. 056 msgid "Belgium" msgstr "Belgija" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bolgarija" #. 048 msgid "Bahrain" msgstr "Bahrajn" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermudi" #. 096 msgid "Brunei Darussalam" msgstr "Brunej" #. 068 msgid "Bolivia" msgstr "Bolivija" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazilija" #. 044 msgid "Bahamas" msgstr "Bahami" #. 064 msgid "Bhutan" msgstr "Butan" #. 074 msgid "Bouvet Island" msgstr "Bouvetov otok" #. 072 msgid "Botswana" msgstr "Bocvana" #. 112 msgid "Belarus" msgstr "Belorusija" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosovi otoki" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratična Republika" #. 140 msgid "Central African Republic" msgstr "Srednjeafriška Republika" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Švica" #. 384 msgid "Cote d'Ivoire" msgstr "Slonokoščena obala" #. 184 msgid "Cook Islands" msgstr "Cookovi otoki" #. 152 msgid "Chile" msgstr "Čile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kitajska" #. 170 msgid "Colombia" msgstr "Kolumbija" #. 188 msgid "Costa Rica" msgstr "Kostarika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Zelenortski otoki" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Božični otok" #. 196 msgid "Cyprus" msgstr "Ciper" #. 203 msgid "Czech Republic" msgstr "Češka" #. 276 msgid "Germany" msgstr "Nemčija" #. 262 msgid "Djibouti" msgstr "Džibuti" #. 208 msgid "Denmark" msgstr "Danska" #. 212 msgid "Dominica" msgstr "Dominika" #. 214 msgid "Dominican Republic" msgstr "Dominikanska republika" #. 012 msgid "Algeria" msgstr "Alžirija" #. 218 msgid "Ecuador" msgstr "Ekvador" #. 233 msgid "Estonia" msgstr "Estonija" #. 818 msgid "Egypt" msgstr "Egipt" #. 732 msgid "Western Sahara" msgstr "Zahodna Sahara" #. 232 msgid "Eritrea" msgstr "Eritreja" #. 724 msgid "Spain" msgstr "Španija" #. 231 msgid "Ethiopia" msgstr "Etiopija" #. 246 msgid "Finland" msgstr "Finska" #. 242 msgid "Fiji" msgstr "Fidži" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandski otoki" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezija" #. 234 msgid "Faroe Islands" msgstr "Ferski otoki" #. 250 msgid "France" msgstr "Francija" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Združeno kraljestvo" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Gruzija" #. 254 msgid "French Guiana" msgstr "Francoska Gvajana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grenlandija" #. 270 msgid "Gambia" msgstr "Gambija" #. 324 msgid "Guinea" msgstr "Gvineja" #. 312 msgid "Guadeloupe" msgstr "Gvadelup" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorialna Gvineja" #. 300 msgid "Greece" msgstr "Grčija" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Južna Georgia in Južni Sandwichevi otoki" #. 320 msgid "Guatemala" msgstr "Gvatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gvineja-Bissau" #. 328 msgid "Guyana" msgstr "Gvajana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Otoki Heard in McDonald" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Hrvaška" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Madžarska" #. 360 msgid "Indonesia" msgstr "Indonezija" #. 372 msgid "Ireland" msgstr "Irska" #. 376 msgid "Israel" msgstr "Izrael" #. 833 msgid "Isle of Man" msgstr "Otok Man" #. 356 msgid "India" msgstr "Indija" #. 086 msgid "British Indian Ocean Territory" msgstr "Britansko ozemlje v Indijskem oceanu" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran" #. 352 msgid "Iceland" msgstr "Islandija" #. 380 msgid "Italy" msgstr "Italija" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamajka" #. 400 msgid "Jordan" msgstr "Jordanija" #. 392 msgid "Japan" msgstr "Japonska" #. 404 msgid "Kenya" msgstr "Kenija" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizistan" #. 116 msgid "Cambodia" msgstr "Kambodža" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komori" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts in Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Severna Koreja" #. 410 msgid "Korea, Republic of" msgstr "Južna Koreja" #. 414 msgid "Kuwait" msgstr "Kuvajt" #. 136 msgid "Cayman Islands" msgstr "Kajmanski otoki" #. 398 msgid "Kazakhstan" msgstr "Kazahstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Laoška ljudska demokratična republika" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Šrilanka" #. 430 msgid "Liberia" msgstr "Liberija" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litva" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "Latvija" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Maroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldavija" #. 499 msgid "Montenegro" msgstr "Črna Gora" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Francoski del)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallovi otoki" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonija" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Mjanmar" #. 496 msgid "Mongolia" msgstr "Mongolija" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Severni Marianski otoki" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Mavretanija" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mavricij" #. 462 msgid "Maldives" msgstr "Maldivi" #. 454 msgid "Malawi" msgstr "Malavi" #. 484 msgid "Mexico" msgstr "Mehika" #. 458 msgid "Malaysia" msgstr "Malezija" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibija" #. 540 msgid "New Caledonia" msgstr "Nova Kaledonija" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolški otok" #. 566 msgid "Nigeria" msgstr "Nigerija" #. 558 msgid "Nicaragua" msgstr "Nikaragva" #. 528 msgid "Netherlands" msgstr "Nizozemska" #. 578 msgid "Norway" msgstr "Norveška" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nova Zelandija" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Francoska Polinezija" #. 598 msgid "Papua New Guinea" msgstr "Papua Nova Gvineja" #. 608 msgid "Philippines" msgstr "Filipini" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poljska" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre in Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Portoriko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinsko ozemlje, okupirano" #. 620 msgid "Portugal" msgstr "Portugalska" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paragvaj" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romunija" #. 688 msgid "Serbia" msgstr "Srbija" #. 643 msgid "Russian Federation" msgstr "Ruska federacija" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Saudska Arabija" #. 090 msgid "Solomon Islands" msgstr "Solomonovi otoki" #. 690 msgid "Seychelles" msgstr "Sejšeli" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Švedska" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Sveta Helena" #. 705 msgid "Slovenia" msgstr "Slovenija" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard in Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovaška" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalija" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome in Principe" #. 222 msgid "El Salvador" msgstr "Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Sirska arabska republika" #. 748 msgid "Swaziland" msgstr "Svazi" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks in Caicoški otoki" #. 148 msgid "Chad" msgstr "Čad" #. 260 msgid "French Southern Territories" msgstr "Francoska južna ozemlja" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tajska" #. 762 msgid "Tajikistan" msgstr "Tadžikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Vzhodni Timor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunizija" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turčija" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad in Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tajvan, provinca Kitajske" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanija" #. 804 msgid "Ukraine" msgstr "Ukrajina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "manjši otoki Združenih držav Amerike" #. 840 msgid "United States" msgstr "Združene države Amerike" #. 858 msgid "Uruguay" msgstr "Urugvaj" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Sveti sedež (Vatikanska mestna država)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent in Grenadini" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Britanski Deviški otoki" #. 850 msgid "Virgin Islands, U.S." msgstr "Ameriški Deviški otoki" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis in Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Južnoafriška Republika" #. 894 msgid "Zambia" msgstr "Zambija" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "*Neznan dodatek v oznakah za ta mesta" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "Avto" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Država" msgid "Postal" msgstr "Pošta" msgid "Town" msgstr "Mesto" msgid "District" msgstr "Regija" msgid "Street" msgstr "Ulica" msgid "Number" msgstr "Številka" msgid "Enter Destination" msgstr "Vpišite cilj" msgid "Zip Code" msgstr "Poštna številka" msgid "City" msgstr "Mesto" msgid "District/Township" msgstr "Regija" msgid "Map" msgstr "Zemljevid" msgid "Bookmark" msgstr "Zaznamek" msgid "Destination" msgstr "Cilj" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Prikaz" msgid "_Route" msgstr "Načrt poti" msgid "_Former Destinations" msgstr "Prejšnji cilji" msgid "_Bookmarks" msgstr "Zaznamki" msgid "_Map" msgstr "Zemljevid" msgid "_Layout" msgstr "Razporeditev" msgid "_Projection" msgstr "Projekcija" msgid "_Vehicle" msgstr "Vozilo" msgid "Zoom_Out" msgstr "Pomanjšava" msgid "Decrease zoom level" msgstr "Zmanjšaj stopnjo povečave" msgid "Zoom_In" msgstr "Povečava" msgid "Increase zoom level" msgstr "Povečaj stopnjo povečave" msgid "_Recalculate" msgstr "Preračunaj" msgid "Redraw map" msgstr "Osveži zemljevid" msgid "_Info" msgstr "Podrobnosti" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Odpre dialog za iskanje naslova" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Ustavi navigacijo" msgid "Test" msgstr "Preizkus" msgid "_Quit" msgstr "_Izhod" msgid "Quit the application" msgstr "Končaj program" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Ostani na cesti" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Načrt poti" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "Celozaslonski način" msgid "Data" msgstr "Podatki" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "S" msgid "NE" msgstr "SV" msgid "E" msgstr "V" msgid "SE" msgstr "JV" msgid "S" msgstr "J" msgid "SW" msgstr "JZ" msgid "W" msgstr "Z" msgid "NW" msgstr "SZ" #. Android resource: @strings/no msgid "No" msgstr "Ne" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Načrt poti %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Načrt poti 0000km 0+00:00 ETA" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Prikaz v brskalniku" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Ceste" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "Prikaz lastnosti" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "Prikaz na zemljevidu" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Zaznamki" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "Zaznamuj %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Vozilo" msgid "Rules" msgstr "Pravila" msgid "Lock on road" msgstr "Prikleni na cesto" msgid "Northing" msgstr "Sever zgoraj" msgid "Map follows Vehicle" msgstr "Zemljevid sledi vozilu" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Zemljevidi" msgid "Layout" msgstr "Razporeditev" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "Prejšnji cilji" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "Nazaj na zemljevid" msgid "Main Menu" msgstr "Glavni meni" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Položaj vozila" msgid "Main menu" msgstr "Glavni meni" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "Nastavitve" msgid "Tools" msgstr "Orodja" msgid "Route" msgstr "Načrt poti" msgid "About" msgstr "" msgid "Quit" msgstr "Izhod" msgid "Actions" msgstr "Dejanja" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "Prikaz" msgid "Fullscreen" msgstr "Celozaslonski način" msgid "Window Mode" msgstr "Okenski način" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/sq.po.in000066400000000000000000001141641264204753600157410ustar00rootroot00000000000000# Albanian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Denis Ju https://launchpad.net/~deblenden msgid "" msgstr "" "Project-Id-Version: navit\n" "Report-Msgid-Bugs-To: FULL NAME \n" "PO-Revision-Date: 2015-08-16 18:51+0000\n" "Last-Translator: Denis Ju \n" "Language-Team: Albanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgid "Running from source directory\n" msgstr "Fillo nga lista preardhëse\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "vendos '%s' tek '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "zerim" msgid "first" msgstr "i pari" msgid "second" msgstr "i dyti" msgid "third" msgstr "i treti" msgid "fourth" msgstr "i katërti" msgid "fifth" msgstr "i pesti" msgid "sixth" msgstr "i gjashti" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "dalje e zeruar" msgid "first exit" msgstr "dalja e parë" msgid "second exit" msgstr "dalja e dytë" msgid "third exit" msgstr "dalja e tretë" msgid "fourth exit" msgstr "dalja e katërt" msgid "fifth exit" msgstr "dalja e pestë" msgid "sixth exit" msgstr "dalja e gjashtë" #, c-format msgid "%d feet" msgstr "%d këmbë" #, c-format msgid "in %d feet" msgstr "në %d këmbë" #, c-format msgid "%d.%d miles" msgstr "%d.%d milje" #, c-format msgid "in %d.%d miles" msgstr "në %d.%d milje" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "një milje" msgstr[1] "%d milje" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "në një milje" msgstr[1] "në %d milje" #, c-format msgid "%d meters" msgstr "%d metra" #, c-format msgid "in %d meters" msgstr "në %d metra" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometra" #, c-format msgid "in %d.%d kilometers" msgstr "në %d.%d kilometra" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "një kilometër" msgstr[1] "%d kilometra" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "në një kilometër" msgstr[1] "në %d kilometra" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "%1$smbi tek %2$s%3$s%4$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "%1$smbi %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "%1$smbi %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "%1$smbi %2$s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "%1$smbi %2$s" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "mbi hyrjen e autostradës" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%snë %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%snë %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%snë %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%snë %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%snë %s" msgid "When possible, please turn around" msgstr "Nqs është e mundur, ju lutem kthehuni mbrapsht" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "në drejtim të %s" #, c-format msgid "Follow the road for the next %s" msgstr "Ndjekni rrugën për tjetrën %s" msgid "Enter the roundabout soon" msgstr "Hyni në rrethrrotullim së shpejti" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "Hyni në rrethrrotullimin %s" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Dilni nga rrethrrotullimi tek %1$s %2$s" msgid "soon" msgstr "së shpejti" msgid "now" msgstr "tani" msgid "then" msgstr "pastaj" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "pastaj futuni%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "Udhëtoni tek %1$s%2$s" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "pastaj udhëtoni tek%1$s" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "Udhëtoni tek %1$s%2$s" msgid "on your left" msgstr "në të majtën" msgid "on your right" msgstr "në të djathtën" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "Merrni daljen %1$s %2$s %3$s" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "Merrni daljen %1$s %2$s %3$s" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "tek ndërrimi i autostradës" msgid "at exit" msgstr "në dalje" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "pastaj udhëtoni drejt%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "Vazhdoni drejt %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "pastaj mbani krahun e djathtë%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "Mbani krahun e djathtë %1$s%2$s%3$s" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "pastaj mbani krahun e majtë%1$s" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "Mbani krahun e majtë%1$s%2$s%3$s" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "djathtas" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "majtas" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "lehtë " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "fuqishëm " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Merrni rrugën %1$s për tek rruga %2$s" #, c-format msgid "after %i roads" msgstr "pas rrugës %i" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Kthehuni %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "pastaj bëni një U-kthim" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Bëni një U-kthim %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "pastaj bëni një U-kthim" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Bëni një U-kthim %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "ndiqni" msgid "then you have reached your destination." msgstr "pastaj ju keni arritur pikëmbërritjen" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Ju e keni arritur pikëmbërritjen tuaj %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Dalje" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Vendndodhja" msgid "Command" msgstr "Komanda" msgid "Length" msgstr "Zgjatja" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Koha" msgid "Destination Length" msgstr "Gjatësia deri në arritje" msgid "Destination Time" msgstr "Kohëzgjatja deri në arritje" msgid "Roadbook" msgstr "Përshkrimi i rrugës" #, c-format msgid "Waypoint %d" msgstr "Pikëzim rruge %d" msgid "Visit before..." msgstr "Vendos si pikëzim rruge ..." msgid "Set as position" msgstr "Vendosni si pozicion" msgid "Set as destination" msgstr "Vendosni si vendarritje" msgid "Add as bookmark" msgstr "Shtoni një shenjim" #, c-format msgid "Point 0x%x 0x%x" msgstr "Pikë 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Koordinatat e ekranit %d %d" #. 020 msgid "Andorra" msgstr "Andora" #. 784 msgid "United Arab Emirates" msgstr "Emiratet e Bashkuara Arabe" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua dhe Barbuda" #. 660 msgid "Anguilla" msgstr "Anguila" #. 008 msgid "Albania" msgstr "Shqipëri" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Antilet Hollandeze" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktidë" #. 032 msgid "Argentina" msgstr "Argjentina" #. 016 msgid "American Samoa" msgstr "Samoa Amerikane" #. 040 msgid "Austria" msgstr "Austri" #. 036 msgid "Australia" msgstr "Australi" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Ishujt Aland" #. 031 msgid "Azerbaijan" msgstr "Azerbaixhan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnjë-Hercegovinë" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgjikë" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bullgari" #. 048 msgid "Bahrain" msgstr "Bahrein" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. 068 msgid "Bolivia" msgstr "Bolivi" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "Bonaire, Sint Eustatius dhe Saba" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "pastaj dilni nga rrethrrotullimi tek %1$s %2$s" navit-0.5.0+dfsg.1/po/sr.po.in000066400000000000000000001515241264204753600157430ustar00rootroot00000000000000# Serbian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Ivan Janjić https://launchpad.net/~milandd # KaZeR https://launchpad.net/~kazer # Slobodan Simić https://launchpad.net/~slsimic # momcilo https://launchpad.net/~momcilo-majic # Мирослав Николић https://launchpad.net/~lipek # Саша Петровић https://launchpad.net/~salepetronije msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Саша Петровић \n" "Language-Team: српски \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "Language: \n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Покренут из изворне фасцикле\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "постављам вредност '%s' на '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нулти" msgid "first" msgstr "прво" msgid "second" msgstr "друго" msgid "third" msgstr "треће" msgid "fourth" msgstr "четврто" msgid "fifth" msgstr "пето" msgid "sixth" msgstr "шесто" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нулти излаз" msgid "first exit" msgstr "први излаз" msgid "second exit" msgstr "други излаз" msgid "third exit" msgstr "трећи излаз" msgid "fourth exit" msgstr "четврти излаз" msgid "fifth exit" msgstr "пети излаз" msgid "sixth exit" msgstr "шести излаз" #, c-format msgid "%d feet" msgstr "%d стопа" #, c-format msgid "in %d feet" msgstr "за %d стопе" #, c-format msgid "%d.%d miles" msgstr "%d.%d миља" #, c-format msgid "in %d.%d miles" msgstr "за %d.%d миља" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "%d миља" msgstr[1] "%d миље" msgstr[2] "%d миља" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "кроз %d миља" msgstr[1] "кроз %d миље" msgstr[2] "кроз %d миља" #, c-format msgid "%d meters" msgstr "%d метара" #, c-format msgid "in %d meters" msgstr "за %d метара" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d километара" #, c-format msgid "in %d.%d kilometers" msgstr "за %d.%d километара" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d километара" msgstr[1] "%d километара" msgstr[2] "%d километара" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "за %d километара" msgstr[1] "за %d километара" msgstr[2] "за %d километара" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "на нагибу" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sу %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sу %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sу %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sу %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sна %s" msgid "When possible, please turn around" msgstr "Када буде могуће, променити смер" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Прати пут до следећег %s" msgid "Enter the roundabout soon" msgstr "Ускоро прелазак на обилазницу" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Напуштање обилазнице за %1$s %2$s" msgid "soon" msgstr "ускоро" msgid "now" msgstr "сад" msgid "then" msgstr "потом" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "десно" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "лево" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "лако " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "јако " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Прати %1$s пут до %2$s" #, c-format msgid "after %i roads" msgstr "после %i путева" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Скрени %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "потом променити смер" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Променити смер %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "потом променити смер" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Променити смер %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "потом сте стигли на своје одредиште." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Стигли сте на одредиште %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Излаз" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Положај" msgid "Command" msgstr "Наредба" msgid "Length" msgstr "Дужина" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Време" msgid "Destination Length" msgstr "Одредишна дужина" msgid "Destination Time" msgstr "Одредишно време" msgid "Roadbook" msgstr "План пута" #, c-format msgid "Waypoint %d" msgstr "Пролазна тачка %d" msgid "Visit before..." msgstr "Посети пре..." msgid "Set as position" msgstr "Постави као положај" msgid "Set as destination" msgstr "Постави као одредиште" msgid "Add as bookmark" msgstr "Додај као забелешку" #, c-format msgid "Point 0x%x 0x%x" msgstr "Тачка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Екранске координате: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Уједињени Арапски Емирати" #. 004 msgid "Afghanistan" msgstr "Авганистан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигва и Барбуда" #. 660 msgid "Anguilla" msgstr "Ангвила" #. 008 msgid "Albania" msgstr "Албанија" #. 051 msgid "Armenia" msgstr "Јерменија" #. 530 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктик" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Америчка Самоа" #. 040 msgid "Austria" msgstr "Аустрија" #. 036 msgid "Australia" msgstr "Аустралија" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Оландска острва" #. 031 msgid "Azerbaijan" msgstr "Азербејџан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Белгија" #. 854 msgid "Burkina Faso" msgstr "Буркина Фасо" #. 100 msgid "Bulgaria" msgstr "Бугарска" #. 048 msgid "Bahrain" msgstr "Бахреин" #. 108 msgid "Burundi" msgstr "Бурунди" #. 204 msgid "Benin" msgstr "Бенин" #. 652 msgid "Saint Barthelemy" msgstr "Свети Бартоломеј" #. 060 msgid "Bermuda" msgstr "Бермуди" #. 096 msgid "Brunei Darussalam" msgstr "Брунеј" #. 068 msgid "Bolivia" msgstr "Боливија" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразил" #. 044 msgid "Bahamas" msgstr "Бахами" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Бувеова острва" #. 072 msgid "Botswana" msgstr "Боцвана" #. 112 msgid "Belarus" msgstr "Белорусија" #. 084 msgid "Belize" msgstr "Белизе" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosova ostrva" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Демократска република Конго" #. 140 msgid "Central African Republic" msgstr "Централноафричка Република" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швајцарска" #. 384 msgid "Cote d'Ivoire" msgstr "Обала Слоноваче" #. 184 msgid "Cook Islands" msgstr "Кукова острва" #. 152 msgid "Chile" msgstr "Чиле" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Кина" #. 170 msgid "Colombia" msgstr "Колумбија" #. 188 msgid "Costa Rica" msgstr "Костарика" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Зеленортска острва" #. 531 msgid "Curacao" msgstr "Куракао" #. 162 msgid "Christmas Island" msgstr "Божићна острва" #. 196 msgid "Cyprus" msgstr "Кипар" #. 203 msgid "Czech Republic" msgstr "Чешка" #. 276 msgid "Germany" msgstr "Немачка" #. 262 msgid "Djibouti" msgstr "Џибути" #. 208 msgid "Denmark" msgstr "Данска" #. 212 msgid "Dominica" msgstr "Доминика" #. 214 msgid "Dominican Republic" msgstr "Доминиканска Република" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естонија" #. 818 msgid "Egypt" msgstr "Египат" #. 732 msgid "Western Sahara" msgstr "Западна Сахара" #. 232 msgid "Eritrea" msgstr "Еритреја" #. 724 msgid "Spain" msgstr "Шпанија" #. 231 msgid "Ethiopia" msgstr "Етиопија" #. 246 msgid "Finland" msgstr "Финска" #. 242 msgid "Fiji" msgstr "Фиџи" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фокландска острва (Малвини)" #. 583 msgid "Micronesia, Federated States of" msgstr "Микронезија, Федеративне државе" #. 234 msgid "Faroe Islands" msgstr "Фарска острва" #. 250 msgid "France" msgstr "Француска" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Уједињено краљевство" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузија" #. 254 msgid "French Guiana" msgstr "Француска Гвајана" #. 831 msgid "Guernsey" msgstr "Генрзи" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гибралтар" #. 304 msgid "Greenland" msgstr "Гренланд" #. 270 msgid "Gambia" msgstr "Гамбија" #. 324 msgid "Guinea" msgstr "Гвинеја" #. 312 msgid "Guadeloupe" msgstr "Гваделуп" #. 226 msgid "Equatorial Guinea" msgstr "Екваторијална Гвинеја" #. 300 msgid "Greece" msgstr "Грчка" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Јужна Џорџија и Јужна Сендвичка острва" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвинеја Бисао" #. 328 msgid "Guyana" msgstr "Гвајана" #. 344 msgid "Hong Kong" msgstr "Хонг Конг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Херд острво и Мекдоналд острва" #. 340 msgid "Honduras" msgstr "Хондурас" #. 191 msgid "Croatia" msgstr "Хрватска" #. 332 msgid "Haiti" msgstr "Хаити" #. 348 msgid "Hungary" msgstr "Мађарска" #. 360 msgid "Indonesia" msgstr "Индонезија" #. 372 msgid "Ireland" msgstr "Ирска" #. 376 msgid "Israel" msgstr "Израел" #. 833 msgid "Isle of Man" msgstr "Острво Ман" #. 356 msgid "India" msgstr "Индија" #. 086 msgid "British Indian Ocean Territory" msgstr "Британска Индијска Океанска Територија" #. 368 msgid "Iraq" msgstr "Ирак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Иран, Исламска Република" #. 352 msgid "Iceland" msgstr "Исланд" #. 380 msgid "Italy" msgstr "Италија" #. 832 msgid "Jersey" msgstr "Џерси" #. 388 msgid "Jamaica" msgstr "Јамајка" #. 400 msgid "Jordan" msgstr "Јордан" #. 392 msgid "Japan" msgstr "Јапан" #. 404 msgid "Kenya" msgstr "Кенија" #. 417 msgid "Kyrgyzstan" msgstr "Киргистан" #. 116 msgid "Cambodia" msgstr "Камбоџа" #. 296 msgid "Kiribati" msgstr "Кирибати" #. 174 msgid "Comoros" msgstr "Комори" #. 659 msgid "Saint Kitts and Nevis" msgstr "Свети Китс и Невис" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Кореја, Демократска Народна Република" #. 410 msgid "Korea, Republic of" msgstr "Република Кореја" #. 414 msgid "Kuwait" msgstr "Кувајт" #. 136 msgid "Cayman Islands" msgstr "Кајманска острва" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаос" #. 422 msgid "Lebanon" msgstr "Либан" #. 662 msgid "Saint Lucia" msgstr "Света Луција" #. 438 msgid "Liechtenstein" msgstr "Лихтенштајн" #. 144 msgid "Sri Lanka" msgstr "Шри Ланка" #. 430 msgid "Liberia" msgstr "Либерија" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литванија" #. 442 msgid "Luxembourg" msgstr "Луксембург" #. 428 msgid "Latvia" msgstr "Летонија" #. 434 msgid "Libya" msgstr "Либија" #. 504 msgid "Morocco" msgstr "Мароко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Молдавија, Република" #. 499 msgid "Montenegro" msgstr "Црна Гора" #. 663 msgid "Saint Martin (French part)" msgstr "Свети Мартин (француски део)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршалска острва" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македонија" #. 466 msgid "Mali" msgstr "Мали" #. 104 msgid "Myanmar" msgstr "Мијанмар" #. 496 msgid "Mongolia" msgstr "Монголија" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Северна Маријанска острва" #. 474 msgid "Martinique" msgstr "Мартиник" #. 478 msgid "Mauritania" msgstr "Мауританија" #. 500 msgid "Montserrat" msgstr "Монсерат" #. 470 msgid "Malta" msgstr "Малта" #. 480 msgid "Mauritius" msgstr "Маурицијус" #. 462 msgid "Maldives" msgstr "Малдиви" #. 454 msgid "Malawi" msgstr "Малави" #. 484 msgid "Mexico" msgstr "Мексико" #. 458 msgid "Malaysia" msgstr "Малезија" #. 508 msgid "Mozambique" msgstr "Мозамбик" #. 516 msgid "Namibia" msgstr "Намибија" #. 540 msgid "New Caledonia" msgstr "Нова Каледонија" #. 562 msgid "Niger" msgstr "Нигер" #. 574 msgid "Norfolk Island" msgstr "Острво Норфок" #. 566 msgid "Nigeria" msgstr "Нигерија" #. 558 msgid "Nicaragua" msgstr "Никарагва" #. 528 msgid "Netherlands" msgstr "Холандија" #. 578 msgid "Norway" msgstr "Норвешка" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Нијуе" #. 554 msgid "New Zealand" msgstr "Нови Зеланд" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Француска Полинезија" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинеја" #. 608 msgid "Philippines" msgstr "Филипини" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Пољска" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Свети Пјер и Микелон" #. 612 msgid "Pitcairn" msgstr "Острва Питкерн" #. 630 msgid "Puerto Rico" msgstr "Порторико" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Палестинска Територија, Окупирана" #. 620 msgid "Portugal" msgstr "Португал" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвај" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реинион" #. 642 msgid "Romania" msgstr "Румунија" #. 688 msgid "Serbia" msgstr "Србија" #. 643 msgid "Russian Federation" msgstr "Руска федерација" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудијска Арабија" #. 090 msgid "Solomon Islands" msgstr "Соломонска острва" #. 690 msgid "Seychelles" msgstr "Сејшели" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Шведска" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Света Јелена" #. 705 msgid "Slovenia" msgstr "Словенија" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Свалбард и Јан Мајен" #. 703 msgid "Slovakia" msgstr "Словачка" #. 694 msgid "Sierra Leone" msgstr "Сијера Леоне" #. 674 msgid "San Marino" msgstr "Сан Марино" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалија" #. 740 msgid "Suriname" msgstr "Суринам" #. 728 msgid "South Sudan" msgstr "Јужни Судан" #. 678 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принципе" #. 222 msgid "El Salvador" msgstr "Салвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Свети Мартин (Холандски део)" #. 760 msgid "Syrian Arab Republic" msgstr "Сиријска арапска република" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Туркс и Кајкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Француске jужне tериторије" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Тајланд" #. 762 msgid "Tajikistan" msgstr "Таџикистан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Источни Тимор" #. 795 msgid "Turkmenistan" msgstr "Туркменистан" #. 788 msgid "Tunisia" msgstr "Тунис" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Турска" #. 780 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Тајван, Кинеска Провинција" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзанија, Уједињена република" #. 804 msgid "Ukraine" msgstr "Украјна" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Спољна ивична острва САД" #. 840 msgid "United States" msgstr "Sjedinjene Američke Države" #. 858 msgid "Uruguay" msgstr "Уругвај" #. 860 msgid "Uzbekistan" msgstr "Узбекистан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Ватикан" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Свети Винсент и Гренадини" #. 862 msgid "Venezuela" msgstr "Венецуела" #. 092 msgid "Virgin Islands, British" msgstr "Девичанска острва, Британска" #. 850 msgid "Virgin Islands, U.S." msgstr "Девичанска острва, САД" #. 704 msgid "Viet Nam" msgstr "Вијетнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Валис и Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Јемен" #. 175 msgid "Mayotte" msgstr "Мајот" #. 710 msgid "South Africa" msgstr "Јужноафричка република" #. 894 msgid "Zambia" msgstr "Замбија" #. 716 msgid "Zimbabwe" msgstr "Зимбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "* Непознато, додатак је у is_in ознакама ових градова" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" "Нема датотеке подешавања navit.xml, navit.xml.сопствени је пронађен\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" "Десила се грешка приликом рашчлањивања датотеке подешавања „%s“: %s\n" #, c-format msgid "Using config file '%s'\n" msgstr "Користим датотеку подешавања „%s“\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "ГРЕШКА: Нису пронађене поставке у датотеци подешавања „%s“\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" "Није успело унутрашње покретање, излазим. Проверите претходне поруке " "грешака.\n" msgid "unknown street" msgstr "непозната улица" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "Неимановано возила" msgid "Failed to write bookmarks file" msgstr "Нисам успео да пишем у датотеци забелешки" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Тачка на карти" msgid "Car" msgstr "Кола" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Држава" msgid "Postal" msgstr "Поштански" msgid "Town" msgstr "Град" msgid "District" msgstr "Општина" msgid "Street" msgstr "Улица" msgid "Number" msgstr "Број" msgid "Enter Destination" msgstr "Унесите одредиште" msgid "Zip Code" msgstr "Поштански број" msgid "City" msgstr "Град" msgid "District/Township" msgstr "Општрина/Град" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Обележивач" msgid "Destination" msgstr "Одредиште" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Приказ" msgid "_Route" msgstr "рута" msgid "_Former Destinations" msgstr "Претходна одредишта" msgid "_Bookmarks" msgstr "Обележивачи" msgid "_Map" msgstr "_Карта" msgid "_Layout" msgstr "Распоред" msgid "_Projection" msgstr "Пројекција" msgid "_Vehicle" msgstr "Возило" msgid "Zoom_Out" msgstr "Умањи" msgid "Decrease zoom level" msgstr "Умањите ниво увећања" msgid "Zoom_In" msgstr "Увећај" msgid "Increase zoom level" msgstr "Увећајте ниво увећања" msgid "_Recalculate" msgstr "Прерачунај" msgid "Redraw map" msgstr "Освежи карту" msgid "_Info" msgstr "Подаци" msgid "Set _destination" msgstr "Постави _одредиште" msgid "Opens address search dialog" msgstr "Отвара дијалог претраге адресе" msgid "_POI search" msgstr "Претрага занимљивих тачака_" msgid "Opens POI search dialog" msgstr "Отвори прозор претраге занимљивих тачака" msgid "_Stop Navigation" msgstr "Заустави навигацију" msgid "Test" msgstr "Проба" msgid "_Quit" msgstr "_Изађи" msgid "Quit the application" msgstr "Изађите из програма" msgid "Show position _cursor" msgstr "Прикажи _показивач положаја" msgid "_Lock on Road" msgstr "Прати пут" msgid "_Keep orientation to the North" msgstr "_Држи усмерење према северу" msgid "Switches map orientation to the north or the vehicle" msgstr "Пребацује усмерење карте на север или на правац возила" msgid "_Roadbook" msgstr "План пута" msgid "Show/hide route description" msgstr "Прикажи/сакриј опис руте" msgid "_Autozoom" msgstr "Аутоматски увећавање" msgid "Enable/disable automatic zoom level changing" msgstr "Укључи/искључи аутоматско увећање" msgid "_Fullscreen" msgstr "Цео екран" msgid "Data" msgstr "Подаци" msgid "Pharmacy" msgstr "Апотека" msgid "Restaurant" msgstr "Одмориште" msgid "Restaurant. Fast food" msgstr "Одмориште. Брза храна" msgid "Hotel" msgstr "Хотел" msgid "Car parking" msgstr "Паркинг" msgid "Fuel station" msgstr "Бензинска пумпа" msgid "Bank" msgstr "Банка" msgid "Hospital" msgstr "Болница" msgid "Cinema" msgstr "Биоскоп" msgid "Train station" msgstr "Возна станица" msgid "School" msgstr "Школа" msgid "Police" msgstr "Полиција" msgid "Justice" msgstr "Суд" msgid "Taxi" msgstr "Такси" msgid "Shopping" msgstr "Куповина" msgid "Distance from screen center (km)" msgstr "Растојање од средишта екрана (km)" #, c-format msgid "POI %s. %s" msgstr "Занимљива тачка %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Постави одредиште на %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Постави карту на %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "Постави следећу посету на %ld, %ld \n" msgid "POI search" msgstr "Претрага занимљивих тачака" msgid "Select a category" msgstr "Изаберите врсту" msgid "Select a distance to look for (km)" msgstr "Изаберите даљину претраге (km)" msgid "Select a POI" msgstr "Изаберите занимљиву тачку" msgid " " msgstr " " msgid "Category" msgstr "Врста" msgid "Direction" msgstr "Правац" msgid "Distance(m)" msgstr "Растојање(m)" msgid "Name" msgstr "Име" msgid "Visit Before" msgstr "Посети пре" msgid "N" msgstr "С" msgid "NE" msgstr "СИ" msgid "E" msgstr "И" msgid "SE" msgstr "ЈИ" msgid "S" msgstr "Ј" msgid "SW" msgstr "ЈЗ" msgid "W" msgstr "З" msgid "NW" msgstr "СЗ" #. Android resource: @strings/no msgid "No" msgstr "Не" msgid "2D" msgstr "2D" msgid "3D" msgstr "3Д" msgid "OT" msgstr "ОТ" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Рута %4.0fкм %02d:%02d ПВД" msgid "Route 0000km 0+00:00 ETA" msgstr "Рута 0000км 0+00:00 ПВД" msgid "Help" msgstr "Помоћ" #, c-format msgid "Waypoint %s" msgstr "Пролазна тачка %s" msgid "Select waypoint to insert the new one before" msgstr "Изаберите пролазну тачку за унос пре претходне" msgid "View in Browser" msgstr "Погледај у претраживачу" msgid "Item type" msgstr "Врста ставке" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Улице" msgid "House numbers" msgstr "Кућни бројеви" msgid "View Attributes" msgstr "Преглед особина" msgid "Set as position (and deactivate vehicle)" msgstr "Постави као положај (и искључи возило)" msgid "POIs" msgstr "Тачке интересовања" msgid "View on map" msgstr "Погледај на карти" msgid "Remove search results from the map" msgstr "Уклони излазе из претраге са карте" msgid "Show results on the map" msgstr "Прикажи излазе претраге на карти" msgid "Cut Bookmark" msgstr "Исеци обележивач" msgid "Copy Bookmark" msgstr "Умножи обележивач" msgid "Rename Bookmark" msgstr "Преименуј обележивач" msgid "Paste Bookmark" msgstr "Прилепи обележивач" msgid "Delete Bookmark" msgstr "Обриши обележивач" msgid "Delete waypoint" msgstr "Избриши пролазну тачку" msgid "Bookmarks" msgstr "Обележивачи" msgid "Bookmarks as waypoints" msgstr "Обележивачи као пролазне тачке" msgid "Save waypoints" msgstr "Сачувај пролазне тачке" msgid "Replace with waypoints" msgstr "Замени пролазним тачкама" msgid "Delete Folder" msgstr "Избриши фасциклу" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Додај фасциклу са обележивачима" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Прилепи обележивач" #, c-format msgid "Bookmark %s" msgstr "Обележи %s" #, c-format msgid "Download %s" msgstr "Преузми %s" msgid "Map Download" msgstr "Преузимање карте" msgid "Active" msgstr "Радно" msgid "Download Enabled" msgstr "Преузимање је омогућено" msgid "Download completely" msgstr "Преузми потпуно" msgid "Show Satellite Status" msgstr "Прикажи стање сателита" msgid " Elevation " msgstr " Висина " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Приказ NMEA података" msgid "car" msgstr "кола" msgid "bike" msgstr "бицикл" msgid "pedestrian" msgstr "пешак" #, c-format msgid "Current profile: %s" msgstr "Тренутни профил: %s" #, c-format msgid "Change profile to: %s" msgstr "Примени профил: %s" msgid "Set as active" msgstr "Примени као активан" msgid "Show Satellite status" msgstr "Прикажи стање сателита" msgid "Show NMEA data" msgstr "Прикажи NMEA податке" msgid "Add Bookmark" msgstr "Додавање обележивача" msgid "Rename" msgstr "Преименуј" msgid "About Navit" msgstr "О програму Навит" #. Authors msgid "By" msgstr "Од" #. Contributors msgid "And all the Navit Team" msgstr "И цео Navit тим" msgid "members and contributors." msgstr "чланови и доприносиоци" msgid "Waypoints" msgstr "Пролазне тачке" msgid "Enter Coordinates" msgstr "Унесите координате" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Географска ширина и дужина" msgid "Enter coordinates, for example:" msgstr "Унесите координате, на пример:" msgid "Vehicle" msgstr "Возило" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Прати пут" msgid "Northing" msgstr "Управљање по северу" msgid "Map follows Vehicle" msgstr "Карта прати возило" msgid "Plan with Waypoints" msgstr "Планирање уз помоћ пролазних тачака" msgid "Maps" msgstr "Карте" msgid "Layout" msgstr "Распоред" msgid "Height Profile" msgstr "Висински профил" msgid "Route Description" msgstr "Опис путање" msgid "Show Locale" msgstr "Прикажи име превода" msgid "Former Destinations" msgstr "Претходна одредишта" msgid "- No former destinations available -" msgstr "- Нису доступна претходна одредишта -" msgid "Message" msgstr "Порука" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Назад на карту" msgid "Main Menu" msgstr "Главни мени" msgid "House number" msgstr "Кућни број" msgid "Next" msgstr "Следеће" msgid "Prev" msgstr "Претходно" msgid "Return to route!" msgstr "Врати се на путању!" #. warning told msgid "Look out! Camera!" msgstr "Пажња! Камера!" #. warning told msgid "Please decrease your speed" msgstr "Молим, смањите брзину" msgid "partial match" msgstr "делимично поклапање" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Претражи" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "Градове" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "Путања довде" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Подаци карте (c) доприносиоци Отворене карте улица, ОДБЛ" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "Преузете карте" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "Откажи" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Читава планета" msgid "Africa" msgstr "Африка" msgid "Canary Islands" msgstr "Канарска Острва" msgid "Asia" msgstr "Азија" msgid "Korea" msgstr "Кореја" msgid "Taiwan" msgstr "Тајван" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "Океанија" msgid "Tasmania" msgstr "Тасманија" msgid "Victoria" msgstr "Викторија" msgid "New South Wales" msgstr "Нови Јужни Велс" msgid "Europe" msgstr "Европа" msgid "Western Europe" msgstr "Западна Европа" msgid "Azores" msgstr "Азори" msgid "BeNeLux" msgstr "Бенелукс" msgid "Alsace" msgstr "Алзас" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "Бретања" msgid "Centre" msgstr "Средиште" msgid "Champagne-Ardenne" msgstr "Шампањ-Арден" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "Лорена" msgid "Midi-Pyrenees" msgstr "Средњи Пиринеји" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "Берлин" msgid "Brandenburg" msgstr "Бранденбург" msgid "Bremen" msgstr "Бремен" msgid "Hamburg" msgstr "Хамбург" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "Сарланд" msgid "Sachsen-Anhalt" msgstr "Саксонија-Анхалт" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "Галиција" msgid "Scandinavia" msgstr "Скандинавија" msgid "England" msgstr "Енглеска" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "Есекс" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "Кент" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "Норфолк" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "Сомерсет" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "Шкотска" msgid "Wales" msgstr "Велс" msgid "Crete" msgstr "" msgid "North America" msgstr "Северна Америка" msgid "Alaska" msgstr "Аљаска" msgid "Hawaii" msgstr "Хаваји" msgid "USA" msgstr "САД" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "Мичиген" msgid "Ohio" msgstr "Охајо" msgid "Northeast" msgstr "Североисток" msgid "Massachusetts" msgstr "Масачусец" msgid "Vermont" msgstr "Вермонт" msgid "Pacific" msgstr "Пацифик" msgid "South" msgstr "" msgid "Arkansas" msgstr "Арканзас" msgid "District of Columbia" msgstr "Колумбијски округ" msgid "Florida" msgstr "Флорида" msgid "Louisiana" msgstr "Луизијана" msgid "Maryland" msgstr "Мериленд" msgid "Mississippi" msgstr "Мисисипи" msgid "Oklahoma" msgstr "Оклахома" msgid "Texas" msgstr "Тексас" msgid "Virginia" msgstr "Вирџинија" msgid "West Virginia" msgstr "Западна Вирџинија" msgid "West" msgstr "Запад" msgid "Arizona" msgstr "Аризона" msgid "California" msgstr "Калифорнија" msgid "Colorado" msgstr "Колорадо" msgid "Idaho" msgstr "Ајдахо" msgid "Montana" msgstr "Монтана" msgid "New Mexico" msgstr "Нови Мексико" msgid "Nevada" msgstr "Невада" msgid "Oregon" msgstr "Орегон" msgid "Utah" msgstr "Јута" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "преузимање" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "спремно" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Нема довољно расположивог простора" msgid "Error downloading map!" msgstr "Десила се грешка приликом преузимања карте!" msgid "Error writing map!" msgstr "Десила се грешка при упису карте!" msgid "Map download aborted!" msgstr "Преузимање карте је прекинуто!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Преузимање карте" msgid "Vehicle Position" msgstr "Позиција возила" msgid "Main menu" msgstr "Главни мени" msgid "" "Show\n" "Map" msgstr "" "Прикажи\n" "карту" msgid "Settings" msgstr "Подешавања" msgid "Tools" msgstr "Алати" msgid "Route" msgstr "рута" msgid "About" msgstr "O" msgid "Quit" msgstr "Заврши" msgid "Actions" msgstr "Поступци" msgid "" "Former\n" "Destinations" msgstr "" "Претходна\n" "одредишта" msgid "Coordinates" msgstr "Координате" msgid "" "Stop\n" "Navigation" msgstr "" "Заустави\n" "навигацију" msgid "Display" msgstr "Приказ" msgid "Fullscreen" msgstr "Цео екран" msgid "Window Mode" msgstr "Режим прозора" msgid "Description" msgstr "Опис" msgid "" "Drop last \n" "Waypoint" msgstr "" "Одбаци последњу\n" "пролазну тачку" msgid "" "Drop next \n" "Waypoint" msgstr "" "Одбаци следећу\n" "пролазну тачку" msgid "Satellite Status" msgstr "Стање сателита" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "најкраћим_колима" msgid "car_avoid_tolls" msgstr "алати_избегавања_колима" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "коњ" msgid "Truck" msgstr "Камион" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Да" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Навит је покренут" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Навит је покренут" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Добродошли у Навит" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Хвала што уградисте Навит!\n" "\n" "За почетак, изаберите „Преузмите карте“ из изборника ради преузимања карте. " "Примедба: Карта може бити велика (>50MB) - бежична веза је препоручена.\n" "\n" "Подаци о картама: доприносиоци (c) OpenStreetMap-а\n" "\n" "Уживајте у Навиту!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "У реду" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Још података" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Приближи" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Удаљи" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Преузми карте" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "Прекидач употребе занимљивих тачака" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Изађи из Навита" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Остава / повратак са ње" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Да ли избрисати ову карту?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "Преузимам:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Десила се грешка при преузимању карте." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Преузимање карте је отказано" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Нема положаја. Отварам поново по исправци положаја." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Карте које садрже тренутни положај" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Претрага адреса" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Унесите одредиште" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "Упореди непотпуну адресу" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Претрага..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Није пронађена адреса" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Добављам излазе претраге" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Учитавам излазе претраге" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Нема излаза претраге" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Нема унетог текста" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Постављам одредиште на:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Изаберите радњу" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Молим, утакните СД картицу" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Чувам у оставу..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Враћам из оставе..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Нисам успео да образујем фасциклу оставе" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Чување у оставу није успело" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Нисам пронашао оставу" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Нисам успео да вратим податке из оставе" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Чување у оставу је успешно" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Враћање из оставе је успешно\n" "Молим, поново покрените Навит" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Није пронађена остава" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Није успео повраћај из оставе" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Изаберите податке за повраћај" #. Android resource: @strings/backup msgid "Backup" msgstr "Остава" #. Android resource: @strings/restore msgid "Restore" msgstr "Поврати" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "потом напутстите обилазницу на %1$s %2$s" navit-0.5.0+dfsg.1/po/sv.po.in000066400000000000000000001224161264204753600157450ustar00rootroot00000000000000# Swedish translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Erik Lundin https://launchpad.net/~erik-lundin # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # Mikael Olofsson https://launchpad.net/~michlos # Mikko Virkkilä https://launchpad.net/~virkkila # Squall Leonhart https://launchpad.net/~webmaster-square-one # nairobie https://launchpad.net/~samuel-ostman # pipe https://launchpad.net/~pipatron msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: sv\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Körs från källkodsbiblioteket\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "sätter '%s' till '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "nollte" msgid "first" msgstr "första" msgid "second" msgstr "andra" msgid "third" msgstr "tredje" msgid "fourth" msgstr "fjärde" msgid "fifth" msgstr "femte" msgid "sixth" msgstr "sjätte" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "ingen avfart" msgid "first exit" msgstr "första avfarten" msgid "second exit" msgstr "andra avfarten" msgid "third exit" msgstr "tredje avfarten" msgid "fourth exit" msgstr "fjärde avfarten" msgid "fifth exit" msgstr "femte avfarten" msgid "sixth exit" msgstr "sjätte avfarten" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d meter" #, c-format msgid "in %d meters" msgstr "om %d meter" #, c-format msgid "%d.%d kilometers" msgstr "%d,%d kilometer" #, c-format msgid "in %d.%d kilometers" msgstr "om %d,%d kilometer" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "en kilometer" msgstr[1] "%d kilometer" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "om en kilometer" msgstr[1] "om %d kilometer" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "ut på påfarten" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sin på %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sin på %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sin på %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sin på %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sut på %s" msgid "When possible, please turn around" msgstr "Vänd när det går" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Följ vägen i %s" msgid "Enter the roundabout soon" msgstr "Kör snart in i rondellen" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Kör ut ur rondellen mot %1$s %2$s" msgid "soon" msgstr "snart" msgid "now" msgstr "nu" msgid "then" msgstr "sedan" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "höger" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "vänster" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "lätt " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "tvärt " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Ta %1$s vägen mot %2$s" #, c-format msgid "after %i roads" msgstr "efter %i vägar" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Sväng %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "vänd sedan" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "Vänd %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "vänd sedan" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "Vänd %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "följ" msgid "then you have reached your destination." msgstr "sedan har du nått din destination." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Du har nått din destination %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Korsning" msgid "Exit" msgstr "Avfart" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Position" msgid "Command" msgstr "Kommando" msgid "Length" msgstr "Sträcka" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Tid" msgid "Destination Length" msgstr "Sträcka kvar" msgid "Destination Time" msgstr "Restid" msgid "Roadbook" msgstr "Vägbok" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Ange som position" msgid "Set as destination" msgstr "Ange som destination" msgid "Add as bookmark" msgstr "Lägg till som bokmärke" #, c-format msgid "Point 0x%x 0x%x" msgstr "Punkt 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Skärm koordinat : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Förenade Arabemiraten" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua och Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albanien" #. 051 msgid "Armenia" msgstr "Armenien" #. 530 msgid "Netherlands Antilles" msgstr "Nederländska Antillerna" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktis" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "Amerikanska Samoa" #. 040 msgid "Austria" msgstr "Österrike" #. 036 msgid "Australia" msgstr "Australien" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Åland" #. 031 msgid "Azerbaijan" msgstr "Azerbajdzjan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Hercegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Belgien" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgarien" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint-Barthélemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Brunei" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brasilien" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvetön" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Vitryssland" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kokosöarna" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo, Demokratiska republiken" #. 140 msgid "Central African Republic" msgstr "Centralafrikanska republiken" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Schweiz" #. 384 msgid "Cote d'Ivoire" msgstr "Elfenbenskusten" #. 184 msgid "Cook Islands" msgstr "Cooköarna" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Kina" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "Kap Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Julön" #. 196 msgid "Cyprus" msgstr "Cypern" #. 203 msgid "Czech Republic" msgstr "Tjeckien" #. 276 msgid "Germany" msgstr "Tyskland" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Danmark" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominikanska republiken" #. 012 msgid "Algeria" msgstr "Algeriet" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estland" #. 818 msgid "Egypt" msgstr "Egypten" #. 732 msgid "Western Sahara" msgstr "Västsahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Spanien" #. 231 msgid "Ethiopia" msgstr "Etiopien" #. 246 msgid "Finland" msgstr "Finland" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsöarna" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronesien, federala staterna" #. 234 msgid "Faroe Islands" msgstr "Färöarna" #. 250 msgid "France" msgstr "Frankrike" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Storbritannien" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgien" #. 254 msgid "French Guiana" msgstr "Franska Guyana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Ekvatorialguinea" #. 300 msgid "Greece" msgstr "Grekland" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Sydgeorgien och Sydsandwichöarna" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard- och McDonaldsöarna" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Kroatien" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Ungern" #. 360 msgid "Indonesia" msgstr "Indonesien" #. 372 msgid "Ireland" msgstr "Irland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Indien" #. 086 msgid "British Indian Ocean Territory" msgstr "Brittiska territoriet i Indiska Oceanen" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, islamiska republiken" #. 352 msgid "Iceland" msgstr "Island" #. 380 msgid "Italy" msgstr "Italien" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordanien" #. 392 msgid "Japan" msgstr "Japan" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kirgizistan" #. 116 msgid "Cambodia" msgstr "Kambodja" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komorerna" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts och Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea, demokratiska folkrepubliken" #. 410 msgid "Korea, Republic of" msgstr "Korea, Republiken" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Caymanöarna" #. 398 msgid "Kazakhstan" msgstr "Kazakstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Demokratiska folkrepubliken Laos" #. 422 msgid "Lebanon" msgstr "Libanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Litauen" #. 442 msgid "Luxembourg" msgstr "Luxemburg" #. 428 msgid "Latvia" msgstr "Lettland" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Marocko" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldavien, republiken" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (Franksa delen)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshallöarna" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonien, republiken" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Burma (Myanmar)" #. 496 msgid "Mongolia" msgstr "Mongoliet" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Nordmarianerna" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauretanien" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldiverna" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexiko" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Moçambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "Nya Kaledonien" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolkön" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Nederländerna" #. 578 msgid "Norway" msgstr "Norge" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Nya Zeeland" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Franska Polynesien" #. 598 msgid "Papua New Guinea" msgstr "Papua Nya Guinea" #. 608 msgid "Philippines" msgstr "Filippinerna" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polen" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre och Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinska självstyret" #. 620 msgid "Portugal" msgstr "Portugal" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Rumänien" #. 688 msgid "Serbia" msgstr "Serbien" #. 643 msgid "Russian Federation" msgstr "Ryssland" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudiarabien" #. 090 msgid "Solomon Islands" msgstr "Salomonöarna" #. 690 msgid "Seychelles" msgstr "Seychellerna" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Sverige" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Sankta Helena" #. 705 msgid "Slovenia" msgstr "Slovenien" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard och Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakien" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "São Tomé och Príncipe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrien" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks- och Caicosöarna" #. 148 msgid "Chad" msgstr "Tchad" #. 260 msgid "French Southern Territories" msgstr "Franska sydterritorierna" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thailand" #. 762 msgid "Tajikistan" msgstr "Tadzjikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Östtimor" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisien" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Turkiet" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad och Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Taiwan, provins i Kina" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania" #. 804 msgid "Ukraine" msgstr "Ukraina" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Förenta staternas avlägset belägna öar" #. 840 msgid "United States" msgstr "USA" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent och Grenadinerna" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Jungfruöarna, brittiska" #. 850 msgid "Virgin Islands, U.S." msgstr "Jungfruöarna, amerikanska" #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis och Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Jemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Sydafrika" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Okänt, lägg till is_in-taggar till dessa städer" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Kartpunkt" msgid "Car" msgstr "Bil" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Land" msgid "Postal" msgstr "Post" msgid "Town" msgstr "Stad" msgid "District" msgstr "Distrikt" msgid "Street" msgstr "Gata" msgid "Number" msgstr "Nummer" msgid "Enter Destination" msgstr "Ange destination" msgid "Zip Code" msgstr "Postnummer" msgid "City" msgstr "Stad" msgid "District/Township" msgstr "Distrikt" msgid "Map" msgstr "Karta" msgid "Bookmark" msgstr "Bokmärke" msgid "Destination" msgstr "Destination" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Visa" msgid "_Route" msgstr "Rutt" msgid "_Former Destinations" msgstr "Tidigare destinationer" msgid "_Bookmarks" msgstr "Bokmärken" msgid "_Map" msgstr "Karta" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Projektion" msgid "_Vehicle" msgstr "Fordon" msgid "Zoom_Out" msgstr "Zooma ut" msgid "Decrease zoom level" msgstr "Zooma ut" msgid "Zoom_In" msgstr "Zooma in" msgid "Increase zoom level" msgstr "Zooma in" msgid "_Recalculate" msgstr "Gör ny beräkning" msgid "Redraw map" msgstr "Rita om kartan" msgid "_Info" msgstr "Info" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Öppna adressökning" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Avsluta navigering" msgid "Test" msgstr "Testa" msgid "_Quit" msgstr "_Avsluta" msgid "Quit the application" msgstr "Avsluta programmet" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Lås till vägen" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Växlar orientering mot norr eller enligt rörelse" msgid "_Roadbook" msgstr "Vägbok" msgid "Show/hide route description" msgstr "Visa/dölj vägbeskrivning" msgid "_Autozoom" msgstr "Autozoom" msgid "Enable/disable automatic zoom level changing" msgstr "Växla automatisk zoomnivå" msgid "_Fullscreen" msgstr "Helskärm" msgid "Data" msgstr "Data" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "N" msgid "NE" msgstr "NÖ" msgid "E" msgstr "Ö" msgid "SE" msgstr "SÖ" msgid "S" msgstr "S" msgid "SW" msgstr "SV" msgid "W" msgstr "V" msgid "NW" msgstr "NV" #. Android resource: @strings/no msgid "No" msgstr "Nej" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rutt %4.0fkm %02d:%02d Ankomsttid" msgid "Route 0000km 0+00:00 ETA" msgstr "Rutt 0000km 0+00:00 Ankomsttid" msgid "Help" msgstr "Hjälp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Visa i webbläsare" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Gator" msgid "House numbers" msgstr "Husnummer" msgid "View Attributes" msgstr "Visa attribut" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Intressepunkter" msgid "View on map" msgstr "Visa på karta" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Klipp ut bokmärke" msgid "Copy Bookmark" msgstr "Kopiera bokmärke" msgid "Rename Bookmark" msgstr "Byt namn på bokmärke" msgid "Paste Bookmark" msgstr "Klistra in bokmärke" msgid "Delete Bookmark" msgstr "Ta bort bokmärke" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Bokmärken" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Lägg till bokmärkesmapp" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Klistra in bokmärke" #, c-format msgid "Bookmark %s" msgstr "Bokmärk %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Visa satellitstatus" msgid " Elevation " msgstr " Höjd " msgid " Azimuth " msgstr " Riktning " msgid "Show NMEA Data" msgstr "Visa NMEA-data" msgid "car" msgstr "bil" msgid "bike" msgstr "cykel" msgid "pedestrian" msgstr "fotgängare" #, c-format msgid "Current profile: %s" msgstr "Aktuell profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Byt profil till: %s" msgid "Set as active" msgstr "Sätt som aktiv" msgid "Show Satellite status" msgstr "Visa satellitstatus" msgid "Show NMEA data" msgstr "Visa NMEA-data" msgid "Add Bookmark" msgstr "Lägg till bokmärke" msgid "Rename" msgstr "Byt namn" msgid "About Navit" msgstr "Om Navit" #. Authors msgid "By" msgstr "Av" #. Contributors msgid "And all the Navit Team" msgstr "Och alla bakom Navit" msgid "members and contributors." msgstr "medlemmar och alla som bidragit." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Fordon" msgid "Rules" msgstr "Regler" msgid "Lock on road" msgstr "Lås till väg" msgid "Northing" msgstr "Håll norr uppåt" msgid "Map follows Vehicle" msgstr "Kartan följer fordonet" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Kartor" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Höjdprofil" msgid "Route Description" msgstr "Vägbeskrivning" msgid "Show Locale" msgstr "Visa språk" msgid "Former Destinations" msgstr "Tidigare destinationer" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Meddelande" msgid "Back" msgstr "Tillbaka" msgid "Back to map" msgstr "Tillbaka till kartan" msgid "Main Menu" msgstr "Huvudmeny" msgid "House number" msgstr "Husnummer" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Fordonsposition" msgid "Main menu" msgstr "Huvudmeny" msgid "" "Show\n" "Map" msgstr "" "Visa\n" "Karta" msgid "Settings" msgstr "Inställningar" msgid "Tools" msgstr "Verktyg" msgid "Route" msgstr "Rutt" msgid "About" msgstr "Om" msgid "Quit" msgstr "Avsluta" msgid "Actions" msgstr "Åtgärder" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Stoppa\n" "Navigering" msgid "Display" msgstr "Visa" msgid "Fullscreen" msgstr "Helskärm" msgid "Window Mode" msgstr "Fönsterläge" msgid "Description" msgstr "Beskrivning" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "häst" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "kör sedan ut ur rondellen mot %1$s %2$s" navit-0.5.0+dfsg.1/po/sw.po.in000066400000000000000000001144151264204753600157460ustar00rootroot00000000000000# Swahili translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # HinzundKunz https://launchpad.net/~martin-tlustos # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:00+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Swahili \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: sw\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "ya sifuri" msgid "first" msgstr "ya kwanza" msgid "second" msgstr "ya pili" msgid "third" msgstr "ya tatu" msgid "fourth" msgstr "ya nne" msgid "fifth" msgstr "ya tano" msgid "sixth" msgstr "ya sita" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "exit ya kwanza" msgid "second exit" msgstr "exit ya pili" msgid "third exit" msgstr "exit ya tatu" msgid "fourth exit" msgstr "exit ya nne" msgid "fifth exit" msgstr "exit ya tano" msgid "sixth exit" msgstr "exit ya sita" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "mita %d" #, c-format msgid "in %d meters" msgstr "baada ya mita %d" #, c-format msgid "%d.%d kilometers" msgstr "kilomita %d.%d" #, c-format msgid "in %d.%d kilometers" msgstr "baada ya kilomita %d.%d" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "kilomita %d" msgstr[1] "kilomita %d" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "baada ya kilomita %d" msgstr[1] "baada ya kilomita %d" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%skufuata %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%skufuata %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%skufuata %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%skufuata %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%skufuata %s" msgid "When possible, please turn around" msgstr "Geuka na kurudi nyuma inapowezekana" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Buata barabara kwa %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Toka kutoka kwenye kipilefti kwenye %1$s %2$s" msgid "soon" msgstr "karibuni" msgid "now" msgstr "sasa" msgid "then" msgstr "halafu" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "kulia" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "kushoto" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "fuata %1$s hadi %2$s" #, c-format msgid "after %i roads" msgstr "baada ya barabara %i" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "piga kona %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "halafu utakuwa umefika" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "umelifikia lengo lako %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Ondoka" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "ulipo" msgid "Command" msgstr "Amri" msgid "Length" msgstr "Urefu" msgid "km" msgstr "kilomita" msgid "m" msgstr "mita" msgid "Time" msgstr "Muda" msgid "Destination Length" msgstr "umbali mpaka lengo" msgid "Destination Time" msgstr "saa ya kufika" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "ndipo ulipo" msgid "Set as destination" msgstr "chagua kama lengo" msgid "Add as bookmark" msgstr "hifadhi kama bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Muungano wa Falme za Nchi za Kiarabu" #. 004 msgid "Afghanistan" msgstr "Afghanistani" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "Antaktika" #. 032 msgid "Argentina" msgstr "Ajentina" #. 016 msgid "American Samoa" msgstr "Marekani ya Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "Viziwa vya Alandi" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia na Herzegovina" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "Ubelgiji" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "Visiwa vya Bahama" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "Kisiwa cha Bouvet" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Kisiwa cha Cocos (Keeling)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "Jamhuri ya Afrika ya Kati" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "Uswisi" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "China" #. 170 msgid "Colombia" msgstr "Kolombia" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Kuba" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Kisiwa cha Christmas" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "Jamhuri ya Czech" #. 276 msgid "Germany" msgstr "Ujerumani" #. 262 msgid "Djibouti" msgstr "Jibuti" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "Jamhuri ya Dominikan" #. 012 msgid "Algeria" msgstr "Aljeria" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "Misri" #. 732 msgid "Western Sahara" msgstr "Sahara ya magharibi" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "Uhispania" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "Ufaransa" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "Uingereza" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "Guinea ya Ikweta" #. 300 msgid "Greece" msgstr "Ugiriki" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungaria" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "Uhindi" #. 086 msgid "British Indian Ocean Territory" msgstr "Uingereza katika Bahari Hindi" #. 368 msgid "Iraq" msgstr "Iraki" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "Italia" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "Ujapani" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "Kampuchea" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Visiwa vya Komoro" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Korea ya Kaskazini" #. 410 msgid "Korea, Republic of" msgstr "Korea ya Kusini" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "Luksemburg" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Moroko" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "Mongolia" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksiko" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "Msumbiji" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "Uholanzi" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "eneo kwenye ramani" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "Wilaya" msgid "Street" msgstr "mtaa" msgid "Number" msgstr "Namba" msgid "Enter Destination" msgstr "andika lengo" msgid "Zip Code" msgstr "" msgid "City" msgstr "Mji" msgid "District/Township" msgstr "" msgid "Map" msgstr "ramani" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "lengo" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "chora ramani kwa upya" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "fungua pa kutafutia lengo" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "jaribisha" msgid "_Quit" msgstr "funga" msgid "Quit the application" msgstr "funga app" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "onyesha orodha ya maelekezo" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "njia %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "Msaada" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "barabara" msgid "House numbers" msgstr "namba za nyumba" msgid "View Attributes" msgstr "angalia sifa" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "angalia kwenye ramani" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "onyesha mawasiliano ya gps" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "gari" msgid "bike" msgstr "baiskeli" msgid "pedestrian" msgstr "mtembeaji" #, c-format msgid "Current profile: %s" msgstr "mbinu inayotumiwa: %s" #, c-format msgid "Change profile to: %s" msgstr "badilisha mbinu kwenda %s" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "onyesha mawasiliano ya gps" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "Badilisha jina" msgid "About Navit" msgstr "kuhusu navit" #. Authors msgid "By" msgstr "kwa" #. Contributors msgid "And all the Navit Team" msgstr "na timu yote ya navit" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "gari" msgid "Rules" msgstr "kanuni" msgid "Lock on road" msgstr "fungisha kwenye barabara" msgid "Northing" msgstr "angalia kaskazini" msgid "Map follows Vehicle" msgstr "ramani inafuata kisafirisho" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "ramani" msgid "Layout" msgstr "Mpangilio" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "maelekezo ya njia" msgid "Show Locale" msgstr "onyesha lugha" msgid "Former Destinations" msgstr "malengo yaliyopita" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Ujumbe" msgid "Back" msgstr "Nyuma" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "menyu kuu" msgid "House number" msgstr "namba ya nyumba" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "mahali pa kisafirisho" msgid "Main menu" msgstr "menyu kuu" msgid "" "Show\n" "Map" msgstr "onyesha ramani" msgid "Settings" msgstr "" msgid "Tools" msgstr "vifaa" msgid "Route" msgstr "njia" msgid "About" msgstr "Kuhusu" msgid "Quit" msgstr "Aga" msgid "Actions" msgstr "Vitendo" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "simamisha kuelekeza" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "Skrini-yote" msgid "Window Mode" msgstr "" msgid "Description" msgstr "Ufafanuzi" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "farasi" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "halafu toka kutoka kwenye kipilefti kwenye %1$s %2$s" navit-0.5.0+dfsg.1/po/ta.po.in000066400000000000000000001122631264204753600157200ustar00rootroot00000000000000# Tamil translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Dinesh Ramalingam https://launchpad.net/~dinodinu+navit # Rajiv Subrahmanyam https://launchpad.net/~rajiv-public msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2013-09-04 00:29+0000\n" "Last-Translator: Dinesh Ramalingam \n" "Language-Team: Tamil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: ta\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s', '%s' ஆக மாற்றபடுகின்றது\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "முதல்" msgid "second" msgstr "இரண்டாவது" msgid "third" msgstr "மூன்றாவது" msgid "fourth" msgstr "நான்காவது" msgid "fifth" msgstr "ஐந்தாவது" msgid "sixth" msgstr "ஆறாவது" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "முதல் வெளியேற்றம்" msgid "second exit" msgstr "இரண்டாவது வெளியேற்றம்" msgid "third exit" msgstr "மூன்றாவது வெளியேற்றம்" msgid "fourth exit" msgstr "நான்காவது வெளியேற்றம்" msgid "fifth exit" msgstr "ஐந்தாவது வெளியேற்றம்" msgid "sixth exit" msgstr "ஐந்தாவது வெளியேற்றம்" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d மீட்டர்கள்" #, c-format msgid "in %d meters" msgstr "%d மீட்டருக்குள்" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d கிலோமீட்டர்கள்." #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d கிலோமீட்டருக்குள்" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ஒரு கிலோமீட்டர்" msgstr[1] "%d கிலோமீட்டர்கள்" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ஒரு கிலோமீட்டருக்குள்" msgstr[1] "%d கிலோமீட்டர்களுக்குள்" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "%s க்கு இதே தெருவில் செல்லவும்" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "சீக்கிரமாக" msgid "now" msgstr "இப்பொழுது" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "இயல்பாக " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "" msgid "Length" msgstr "" msgid "km" msgstr "" msgid "m" msgstr "" msgid "Time" msgstr "" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "" #. 784 msgid "United Arab Emirates" msgstr "" #. 004 msgid "Afghanistan" msgstr "" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "" #. 051 msgid "Armenia" msgstr "" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "" #. 010 msgid "Antarctica" msgstr "" #. 032 msgid "Argentina" msgstr "" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "" #. 056 msgid "Belgium" msgstr "" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "" #. 044 msgid "Bahamas" msgstr "" #. 064 msgid "Bhutan" msgstr "" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "" #. 178 msgid "Congo" msgstr "" #. 756 msgid "Switzerland" msgstr "" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "" #. 120 msgid "Cameroon" msgstr "" #. 156 msgid "China" msgstr "" #. 170 msgid "Colombia" msgstr "" #. 188 msgid "Costa Rica" msgstr "" #. 192 msgid "Cuba" msgstr "" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "" #. 212 msgid "Dominica" msgstr "" #. 214 msgid "Dominican Republic" msgstr "" #. 012 msgid "Algeria" msgstr "" #. 218 msgid "Ecuador" msgstr "" #. 233 msgid "Estonia" msgstr "" #. 818 msgid "Egypt" msgstr "" #. 732 msgid "Western Sahara" msgstr "" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "" #. 231 msgid "Ethiopia" msgstr "" #. 246 msgid "Finland" msgstr "" #. 242 msgid "Fiji" msgstr "" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "" #. 254 msgid "French Guiana" msgstr "" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "" #. 270 msgid "Gambia" msgstr "" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "" #. 344 msgid "Hong Kong" msgstr "" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "" #. 360 msgid "Indonesia" msgstr "" #. 372 msgid "Ireland" msgstr "" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "" #. 400 msgid "Jordan" msgstr "" #. 392 msgid "Japan" msgstr "" #. 404 msgid "Kenya" msgstr "" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "" #. 136 msgid "Cayman Islands" msgstr "" #. 398 msgid "Kazakhstan" msgstr "" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "" #. 492 msgid "Monaco" msgstr "" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "" #. 496 msgid "Mongolia" msgstr "" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "" #. 480 msgid "Mauritius" msgstr "" #. 462 msgid "Maldives" msgstr "" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "" #. 458 msgid "Malaysia" msgstr "" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "" #. 524 msgid "Nepal" msgstr "" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "" #. 604 msgid "Peru" msgstr "" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "" #. 586 msgid "Pakistan" msgstr "" #. 616 msgid "Poland" msgstr "" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "" #. 634 msgid "Qatar" msgstr "" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "" #. 688 msgid "Serbia" msgstr "" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "" #. 682 msgid "Saudi Arabia" msgstr "" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "" #. 752 msgid "Sweden" msgstr "" #. 702 msgid "Singapore" msgstr "" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "" #. 764 msgid "Thailand" msgstr "" #. 762 msgid "Tajikistan" msgstr "" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "" #. 800 msgid "Uganda" msgstr "" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "" #. 858 msgid "Uruguay" msgstr "" #. 860 msgid "Uzbekistan" msgstr "" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "" #. 894 msgid "Zambia" msgstr "" #. 716 msgid "Zimbabwe" msgstr "" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "" msgid "Postal" msgstr "" msgid "Town" msgstr "" msgid "District" msgstr "" msgid "Street" msgstr "" msgid "Number" msgstr "" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "" msgid "District/Township" msgstr "" msgid "Map" msgstr "" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "" msgid "Data" msgstr "" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/te.po.in000066400000000000000000001170071264204753600157250ustar00rootroot00000000000000# Telugu translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # వీవెన్ https://launchpad.net/~veeven msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2013-09-27 21:48+0000\n" "Last-Translator: KaZeR \n" "Language-Team: Telugu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: te\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d మీటర్లు" #, c-format msgid "in %d meters" msgstr "" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ఒక కిలోమీటరు" msgstr[1] "%d కిలోమీటర్లు" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "త్వరలో" msgid "now" msgstr "ఇప్పుడు" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "కుడి" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "ఎడమ" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "తేలికగా " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "మీరు మీ గమ్యస్థానం %s చేరారు" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "ఆదేశం" msgid "Length" msgstr "పొడవు" msgid "km" msgstr "కిమీ" msgid "m" msgstr "" msgid "Time" msgstr "సమయం" msgid "Destination Length" msgstr "" msgid "Destination Time" msgstr "" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "" msgid "Set as destination" msgstr "" msgid "Add as bookmark" msgstr "" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "" #. 020 msgid "Andorra" msgstr "అండోరా" #. 784 msgid "United Arab Emirates" msgstr "యునైటెడ్ అరబ్ ఎమిరేట్స్" #. 004 msgid "Afghanistan" msgstr "ఆఫ్ఘనిస్తాన్" #. 028 msgid "Antigua and Barbuda" msgstr "" #. 660 msgid "Anguilla" msgstr "" #. 008 msgid "Albania" msgstr "అల్బేనియా" #. 051 msgid "Armenia" msgstr "అర్మేనియా" #. 530 msgid "Netherlands Antilles" msgstr "" #. 024 msgid "Angola" msgstr "అంగోలా" #. 010 msgid "Antarctica" msgstr "అంటార్కిటికా" #. 032 msgid "Argentina" msgstr "అర్జెంటీనా" #. 016 msgid "American Samoa" msgstr "" #. 040 msgid "Austria" msgstr "" #. 036 msgid "Australia" msgstr "" #. 533 msgid "Aruba" msgstr "" #. 248 msgid "Aland Islands" msgstr "" #. 031 msgid "Azerbaijan" msgstr "" #. 070 msgid "Bosnia and Herzegovina" msgstr "" #. 052 msgid "Barbados" msgstr "" #. 050 msgid "Bangladesh" msgstr "బంగ్లాదేశ్" #. 056 msgid "Belgium" msgstr "బెల్జియం" #. 854 msgid "Burkina Faso" msgstr "" #. 100 msgid "Bulgaria" msgstr "బల్గేరియా" #. 048 msgid "Bahrain" msgstr "" #. 108 msgid "Burundi" msgstr "" #. 204 msgid "Benin" msgstr "" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "బెర్ముడా" #. 096 msgid "Brunei Darussalam" msgstr "" #. 068 msgid "Bolivia" msgstr "బొలీవియా" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "బ్రెజిల్" #. 044 msgid "Bahamas" msgstr "బహమాస్" #. 064 msgid "Bhutan" msgstr "భూటాన్" #. 074 msgid "Bouvet Island" msgstr "" #. 072 msgid "Botswana" msgstr "" #. 112 msgid "Belarus" msgstr "బెలారస్" #. 084 msgid "Belize" msgstr "" #. 124 msgid "Canada" msgstr "కెనడా" #. 166 msgid "Cocos (Keeling) Islands" msgstr "" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "మధ్య ఆఫ్రికన్ రిపబ్లిక్" #. 178 msgid "Congo" msgstr "కాంగో" #. 756 msgid "Switzerland" msgstr "స్విట్జర్లాండ్" #. 384 msgid "Cote d'Ivoire" msgstr "" #. 184 msgid "Cook Islands" msgstr "" #. 152 msgid "Chile" msgstr "చిలీ" #. 120 msgid "Cameroon" msgstr "కామెరూన్" #. 156 msgid "China" msgstr "చైనా" #. 170 msgid "Colombia" msgstr "కొలంబియా" #. 188 msgid "Costa Rica" msgstr "కోస్టారికా" #. 192 msgid "Cuba" msgstr "క్యూబా" #. 132 msgid "Cape Verde" msgstr "" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "" #. 196 msgid "Cyprus" msgstr "సైప్రస్" #. 203 msgid "Czech Republic" msgstr "" #. 276 msgid "Germany" msgstr "జర్మనీ" #. 262 msgid "Djibouti" msgstr "" #. 208 msgid "Denmark" msgstr "డెన్మార్క్" #. 212 msgid "Dominica" msgstr "డొమినికా" #. 214 msgid "Dominican Republic" msgstr "డొమినికన్ రిపబ్లిక్" #. 012 msgid "Algeria" msgstr "అల్జీరియా" #. 218 msgid "Ecuador" msgstr "ఈక్విడార్" #. 233 msgid "Estonia" msgstr "ఎస్టోనియా" #. 818 msgid "Egypt" msgstr "ఈజిప్ట్" #. 732 msgid "Western Sahara" msgstr "పశ్చిమ సహారా" #. 232 msgid "Eritrea" msgstr "" #. 724 msgid "Spain" msgstr "స్పెయిన్" #. 231 msgid "Ethiopia" msgstr "ఇథియోపియా" #. 246 msgid "Finland" msgstr "ఫిన్లాండ్" #. 242 msgid "Fiji" msgstr "ఫిజీ" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "" #. 583 msgid "Micronesia, Federated States of" msgstr "" #. 234 msgid "Faroe Islands" msgstr "" #. 250 msgid "France" msgstr "ఫ్రాన్స్" #. 266 msgid "Gabon" msgstr "" #. 826 msgid "United Kingdom" msgstr "" #. 308 msgid "Grenada" msgstr "" #. 268 msgid "Georgia" msgstr "జార్జియా" #. 254 msgid "French Guiana" msgstr "ఫ్రెంచ్ గయానా" #. 831 msgid "Guernsey" msgstr "" #. 288 msgid "Ghana" msgstr "ఘనా" #. 292 msgid "Gibraltar" msgstr "" #. 304 msgid "Greenland" msgstr "గ్రీన్‌లాండ్" #. 270 msgid "Gambia" msgstr "జాంబియా" #. 324 msgid "Guinea" msgstr "" #. 312 msgid "Guadeloupe" msgstr "" #. 226 msgid "Equatorial Guinea" msgstr "" #. 300 msgid "Greece" msgstr "గ్రీస్" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. 320 msgid "Guatemala" msgstr "" #. 316 msgid "Guam" msgstr "" #. 624 msgid "Guinea-Bissau" msgstr "" #. 328 msgid "Guyana" msgstr "గయానా" #. 344 msgid "Hong Kong" msgstr "హాంకాంగ్" #. 334 msgid "Heard Island and McDonald Islands" msgstr "" #. 340 msgid "Honduras" msgstr "" #. 191 msgid "Croatia" msgstr "క్రోయేషియా" #. 332 msgid "Haiti" msgstr "" #. 348 msgid "Hungary" msgstr "హంగరీ" #. 360 msgid "Indonesia" msgstr "ఇండోనేషియా" #. 372 msgid "Ireland" msgstr "ఐర్లాండ్" #. 376 msgid "Israel" msgstr "" #. 833 msgid "Isle of Man" msgstr "" #. 356 msgid "India" msgstr "భారతదేశం" #. 086 msgid "British Indian Ocean Territory" msgstr "" #. 368 msgid "Iraq" msgstr "ఇరాక్" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "" #. 380 msgid "Italy" msgstr "ఇటలీ" #. 832 msgid "Jersey" msgstr "" #. 388 msgid "Jamaica" msgstr "జమైకా" #. 400 msgid "Jordan" msgstr "జోర్డాన్" #. 392 msgid "Japan" msgstr "జపాన్" #. 404 msgid "Kenya" msgstr "కెన్యా" #. 417 msgid "Kyrgyzstan" msgstr "" #. 116 msgid "Cambodia" msgstr "కాంబోడియా" #. 296 msgid "Kiribati" msgstr "" #. 174 msgid "Comoros" msgstr "" #. 659 msgid "Saint Kitts and Nevis" msgstr "" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "" #. 410 msgid "Korea, Republic of" msgstr "" #. 414 msgid "Kuwait" msgstr "కువైట్" #. 136 msgid "Cayman Islands" msgstr "కేమన్ దీవులు" #. 398 msgid "Kazakhstan" msgstr "కజకిస్తాన్" #. 418 msgid "Lao People's Democratic Republic" msgstr "" #. 422 msgid "Lebanon" msgstr "లెబనాన్" #. 662 msgid "Saint Lucia" msgstr "" #. 438 msgid "Liechtenstein" msgstr "" #. 144 msgid "Sri Lanka" msgstr "శ్రీలంక" #. 430 msgid "Liberia" msgstr "" #. 426 msgid "Lesotho" msgstr "" #. 440 msgid "Lithuania" msgstr "" #. 442 msgid "Luxembourg" msgstr "" #. 428 msgid "Latvia" msgstr "లాత్వియా" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "మొరాకో" #. 492 msgid "Monaco" msgstr "మొనాకో" #. 498 msgid "Moldova, Republic of" msgstr "" #. 499 msgid "Montenegro" msgstr "" #. 663 msgid "Saint Martin (French part)" msgstr "" #. 450 msgid "Madagascar" msgstr "మడగాస్కర్" #. 584 msgid "Marshall Islands" msgstr "" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "" #. 104 msgid "Myanmar" msgstr "మియన్మార్" #. 496 msgid "Mongolia" msgstr "మంగోలియా" #. 446 msgid "Macao" msgstr "" #. 580 msgid "Northern Mariana Islands" msgstr "" #. 474 msgid "Martinique" msgstr "" #. 478 msgid "Mauritania" msgstr "" #. 500 msgid "Montserrat" msgstr "" #. 470 msgid "Malta" msgstr "మాల్టా" #. 480 msgid "Mauritius" msgstr "మారిషస్" #. 462 msgid "Maldives" msgstr "మాల్దీవులు" #. 454 msgid "Malawi" msgstr "" #. 484 msgid "Mexico" msgstr "మెక్సికో" #. 458 msgid "Malaysia" msgstr "మలేషియా" #. 508 msgid "Mozambique" msgstr "" #. 516 msgid "Namibia" msgstr "నమీబియా" #. 540 msgid "New Caledonia" msgstr "" #. 562 msgid "Niger" msgstr "" #. 574 msgid "Norfolk Island" msgstr "" #. 566 msgid "Nigeria" msgstr "నైజీరియా" #. 558 msgid "Nicaragua" msgstr "" #. 528 msgid "Netherlands" msgstr "" #. 578 msgid "Norway" msgstr "నార్వే" #. 524 msgid "Nepal" msgstr "నేపాల్" #. 520 msgid "Nauru" msgstr "" #. 570 msgid "Niue" msgstr "" #. 554 msgid "New Zealand" msgstr "న్యూజిలాండ్" #. 512 msgid "Oman" msgstr "" #. 591 msgid "Panama" msgstr "పనామా" #. 604 msgid "Peru" msgstr "పెరూ" #. 258 msgid "French Polynesia" msgstr "" #. 598 msgid "Papua New Guinea" msgstr "" #. 608 msgid "Philippines" msgstr "ఫిలిప్ఫీన్స్" #. 586 msgid "Pakistan" msgstr "పాకిస్తాన్" #. 616 msgid "Poland" msgstr "పోలాండ్" #. 666 msgid "Saint Pierre and Miquelon" msgstr "" #. 612 msgid "Pitcairn" msgstr "" #. 630 msgid "Puerto Rico" msgstr "" #. 275 msgid "Palestinian Territory, Occupied" msgstr "" #. 620 msgid "Portugal" msgstr "పోర్చుగల్" #. 585 msgid "Palau" msgstr "" #. 600 msgid "Paraguay" msgstr "పరాగ్వే" #. 634 msgid "Qatar" msgstr "ఖతార్" #. 638 msgid "Reunion" msgstr "" #. 642 msgid "Romania" msgstr "రొమేనియా" #. 688 msgid "Serbia" msgstr "సెర్బియా" #. 643 msgid "Russian Federation" msgstr "" #. 646 msgid "Rwanda" msgstr "రువాండా" #. 682 msgid "Saudi Arabia" msgstr "సౌది అరేబియా" #. 090 msgid "Solomon Islands" msgstr "" #. 690 msgid "Seychelles" msgstr "" #. 736 msgid "Sudan" msgstr "సూడాన్" #. 752 msgid "Sweden" msgstr "స్వీడన్" #. 702 msgid "Singapore" msgstr "సింగపూర్" #. 654 msgid "Saint Helena" msgstr "" #. 705 msgid "Slovenia" msgstr "" #. 744 msgid "Svalbard and Jan Mayen" msgstr "" #. 703 msgid "Slovakia" msgstr "స్లొవేకియా" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "" #. 686 msgid "Senegal" msgstr "" #. 706 msgid "Somalia" msgstr "సోమాలియా" #. 740 msgid "Suriname" msgstr "" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "" #. 222 msgid "El Salvador" msgstr "" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "" #. 748 msgid "Swaziland" msgstr "స్వాజిలాండ్" #. 796 msgid "Turks and Caicos Islands" msgstr "" #. 148 msgid "Chad" msgstr "" #. 260 msgid "French Southern Territories" msgstr "" #. 768 msgid "Togo" msgstr "టోగో" #. 764 msgid "Thailand" msgstr "థాయిలాండ్" #. 762 msgid "Tajikistan" msgstr "తజకిస్తాన్" #. 772 msgid "Tokelau" msgstr "" #. 626 msgid "Timor-Leste" msgstr "" #. 795 msgid "Turkmenistan" msgstr "" #. 788 msgid "Tunisia" msgstr "" #. 776 msgid "Tonga" msgstr "" #. 792 msgid "Turkey" msgstr "" #. 780 msgid "Trinidad and Tobago" msgstr "" #. 798 msgid "Tuvalu" msgstr "" #. 158 msgid "Taiwan, Province of China" msgstr "" #. 834 msgid "Tanzania, United Republic of" msgstr "" #. 804 msgid "Ukraine" msgstr "ఉక్రేయిన్" #. 800 msgid "Uganda" msgstr "ఉగాండా" #. 581 msgid "United States Minor Outlying Islands" msgstr "" #. 840 msgid "United States" msgstr "యునైటెడ్ స్టేట్స్ ఆఫ్ అమెరికా" #. 858 msgid "Uruguay" msgstr "ఉరూగ్వే" #. 860 msgid "Uzbekistan" msgstr "ఉజ్బెకిస్తాన్" #. 336 msgid "Holy See (Vatican City State)" msgstr "" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "" #. 862 msgid "Venezuela" msgstr "వెనిజులా" #. 092 msgid "Virgin Islands, British" msgstr "" #. 850 msgid "Virgin Islands, U.S." msgstr "" #. 704 msgid "Viet Nam" msgstr "వియత్నాం" #. 548 msgid "Vanuatu" msgstr "" #. 876 msgid "Wallis and Futuna" msgstr "" #. 882 msgid "Samoa" msgstr "" #. 887 msgid "Yemen" msgstr "" #. 175 msgid "Mayotte" msgstr "" #. 710 msgid "South Africa" msgstr "దక్షిణ ఆఫ్రికా" #. 894 msgid "Zambia" msgstr "జాంబియా" #. 716 msgid "Zimbabwe" msgstr "జింబాబ్వే" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "దేశం" msgid "Postal" msgstr "తపాలా" msgid "Town" msgstr "పట్టణం" msgid "District" msgstr "జిల్లా" msgid "Street" msgstr "వీధి" msgid "Number" msgstr "సంఖ్య" msgid "Enter Destination" msgstr "" msgid "Zip Code" msgstr "" msgid "City" msgstr "నగరం" msgid "District/Township" msgstr "" msgid "Map" msgstr "పటం" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "గమ్యం" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "" msgid "_Route" msgstr "" msgid "_Former Destinations" msgstr "" msgid "_Bookmarks" msgstr "పేజీకలు" msgid "_Map" msgstr "పటం" msgid "_Layout" msgstr "కూర్పు" msgid "_Projection" msgstr "" msgid "_Vehicle" msgstr "వాహనం" msgid "Zoom_Out" msgstr "" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "సమాచారం" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "" msgid "Test" msgstr "పరీక్ష" msgid "_Quit" msgstr "" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "నిండు తెర" msgid "Data" msgstr "దత్తాంశం" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "" msgid "NE" msgstr "" msgid "E" msgstr "" msgid "SE" msgstr "" msgid "S" msgstr "" msgid "SW" msgstr "" msgid "W" msgstr "" msgid "NW" msgstr "" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "" msgid "Route 0000km 0+00:00 ETA" msgstr "" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "పేజీకలు" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "వాహనం" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "కూర్పు" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "" msgid "Fullscreen" msgstr "నిండు తెర" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/th.po.in000066400000000000000000001327741264204753600157400ustar00rootroot00000000000000# Thai translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # mansv68 https://launchpad.net/~mansv68 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:01+0000\n" "Last-Translator: mansv68 \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: th\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "กำหนด '%s' ถึง '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "" msgid "first" msgstr "" msgid "second" msgstr "" msgid "third" msgstr "" msgid "fourth" msgstr "" msgid "fifth" msgstr "" msgid "sixth" msgstr "" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "" msgid "first exit" msgstr "" msgid "second exit" msgstr "" msgid "third exit" msgstr "" msgid "fourth exit" msgstr "" msgid "fifth exit" msgstr "" msgid "sixth exit" msgstr "" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d เมตร" #, c-format msgid "in %d meters" msgstr "อีก %d เมตร" #, c-format msgid "%d.%d kilometers" msgstr "" #, c-format msgid "in %d.%d kilometers" msgstr "อีก %d.%d กิโลเมตร" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d กิโลเมตร" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "อีก %d กิโลเมตร" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sเข้าสู่ถนน %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sเข้าสู่ %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sเข้าสู %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sเข้าสู่ %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "" msgid "When possible, please turn around" msgstr "ถ้าเป็นไปได้ ให้กลับรถ" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "ตรงไปตามถนน แล้ว %s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "" msgid "soon" msgstr "ในไม่ช้า" msgid "now" msgstr "เดี๋ยวนี้" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "ขวา" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "ซ้าย" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "" #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "อย่างเคร่งคัด " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "" #, c-format msgid "after %i roads" msgstr "" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "คุณได้ถึงที่หมายแล้ว %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "ทางออก" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "" msgid "Command" msgstr "คำสั่ง" msgid "Length" msgstr "ความยาว" msgid "km" msgstr "กม." msgid "m" msgstr "เมตร" msgid "Time" msgstr "เวลา" msgid "Destination Length" msgstr "ระยะทาง ถึงที่หมาย" msgid "Destination Time" msgstr "เวลา ถึงที่หมาย" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "กำหนดตำแหน่ง" msgid "Set as destination" msgstr "กำหนดเป็นที่หมาย" msgid "Add as bookmark" msgstr "เพิ่มใน บุกมาร์ก" #, c-format msgid "Point 0x%x 0x%x" msgstr "จุด 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "พิกัดหน้าจอ : %d %d" #. 020 msgid "Andorra" msgstr "แอนโดรา" #. 784 msgid "United Arab Emirates" msgstr "สหรัฐอาหรับอีมิเรตส์" #. 004 msgid "Afghanistan" msgstr "อาฟกานิสถาน" #. 028 msgid "Antigua and Barbuda" msgstr "อันทิกัว และ บาร์บูดา" #. 660 msgid "Anguilla" msgstr "แองกีลา" #. 008 msgid "Albania" msgstr "อัลเบเนีย" #. 051 msgid "Armenia" msgstr "อาร์เมเนีย" #. 530 msgid "Netherlands Antilles" msgstr "เนเธอร์แลนด์ แอนทิลีส" #. 024 msgid "Angola" msgstr "แองโกลา" #. 010 msgid "Antarctica" msgstr "แอนตาร์กติกา" #. 032 msgid "Argentina" msgstr "อาร์เจนตินา" #. 016 msgid "American Samoa" msgstr "อเมริกัน ซามัว" #. 040 msgid "Austria" msgstr "ออสเตรีย" #. 036 msgid "Australia" msgstr "ออสเตรเลีย" #. 533 msgid "Aruba" msgstr "อรูบา" #. 248 msgid "Aland Islands" msgstr "เกาะ เอแลนด์" #. 031 msgid "Azerbaijan" msgstr "อาร์เซอร์ไบจัน" #. 070 msgid "Bosnia and Herzegovina" msgstr "บอสเนียและเฮอร์เซโกวินา" #. 052 msgid "Barbados" msgstr "บาร์บาดอส" #. 050 msgid "Bangladesh" msgstr "บังคลาเทศ" #. 056 msgid "Belgium" msgstr "เบลเยียม" #. 854 msgid "Burkina Faso" msgstr "เบอร์กินาฟาโซ" #. 100 msgid "Bulgaria" msgstr "บัลแกเรีย" #. 048 msgid "Bahrain" msgstr "บาห์เรียน" #. 108 msgid "Burundi" msgstr "บูรันดิ" #. 204 msgid "Benin" msgstr "เบนิน" #. 652 msgid "Saint Barthelemy" msgstr "" #. 060 msgid "Bermuda" msgstr "เบอร์มิวดา" #. 096 msgid "Brunei Darussalam" msgstr "บรูไนดูรัสซาลาม" #. 068 msgid "Bolivia" msgstr "โบลิเวีย" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "บราซิล" #. 044 msgid "Bahamas" msgstr "บาฮามา" #. 064 msgid "Bhutan" msgstr "ภูฏาน" #. 074 msgid "Bouvet Island" msgstr "เกาะบูเวต์" #. 072 msgid "Botswana" msgstr "บอทสวานา" #. 112 msgid "Belarus" msgstr "เบลารุส" #. 084 msgid "Belize" msgstr "เบลไลซ์" #. 124 msgid "Canada" msgstr "แคนาดา" #. 166 msgid "Cocos (Keeling) Islands" msgstr "หมู่เกาะโคโคส (คีลิง)" #. 180 msgid "Congo, Democratic Republic of the" msgstr "" #. 140 msgid "Central African Republic" msgstr "สาธารณรัฐอัฟริกากลาง" #. 178 msgid "Congo" msgstr "คองโก" #. 756 msgid "Switzerland" msgstr "สวิสเซอร์แลนด์" #. 384 msgid "Cote d'Ivoire" msgstr "โกตดิวัวร์" #. 184 msgid "Cook Islands" msgstr "หมู่เกาะคุ้ก" #. 152 msgid "Chile" msgstr "ชิลี" #. 120 msgid "Cameroon" msgstr "คาเมรูน" #. 156 msgid "China" msgstr "จีน" #. 170 msgid "Colombia" msgstr "โคลัมเบีย" #. 188 msgid "Costa Rica" msgstr "คอสตาริกา" #. 192 msgid "Cuba" msgstr "คิวบา" #. 132 msgid "Cape Verde" msgstr "แหลมเวอร์ดี" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "เกาะคริสต์มาส" #. 196 msgid "Cyprus" msgstr "ไซปรัส" #. 203 msgid "Czech Republic" msgstr "สาธารณรัฐเชค" #. 276 msgid "Germany" msgstr "เยอรมันนี" #. 262 msgid "Djibouti" msgstr "จิบูติ" #. 208 msgid "Denmark" msgstr "เดนมาร์ก" #. 212 msgid "Dominica" msgstr "โดมินากัน" #. 214 msgid "Dominican Republic" msgstr "สาธารณรัฐโดมินิกัน" #. 012 msgid "Algeria" msgstr "อัลจีเรีย" #. 218 msgid "Ecuador" msgstr "เอกวาดอร์" #. 233 msgid "Estonia" msgstr "เอสโทเนีย" #. 818 msgid "Egypt" msgstr "อียิปต์" #. 732 msgid "Western Sahara" msgstr "ซาฮาร่าตะวันตก" #. 232 msgid "Eritrea" msgstr "เอริเทรีย" #. 724 msgid "Spain" msgstr "สเปน" #. 231 msgid "Ethiopia" msgstr "เอธิโอเปีย" #. 246 msgid "Finland" msgstr "ฟินแลนด์" #. 242 msgid "Fiji" msgstr "ฟิจิ" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "หมู่เกาะฟอล์กแลนด์ (มาลบีนาส)" #. 583 msgid "Micronesia, Federated States of" msgstr "ไมโครนีเซีย" #. 234 msgid "Faroe Islands" msgstr "หมู่เกาะแฟโร" #. 250 msgid "France" msgstr "ฝรั่งเศส" #. 266 msgid "Gabon" msgstr "กาบอน" #. 826 msgid "United Kingdom" msgstr "อังกฤษ" #. 308 msgid "Grenada" msgstr "เกรนาดา" #. 268 msgid "Georgia" msgstr "จอร์เจีย" #. 254 msgid "French Guiana" msgstr "เฟรนช์เกียนา" #. 831 msgid "Guernsey" msgstr "เกิร์นซีย์" #. 288 msgid "Ghana" msgstr "กานา" #. 292 msgid "Gibraltar" msgstr "ยิบรอลตา" #. 304 msgid "Greenland" msgstr "กรีนแลนด์" #. 270 msgid "Gambia" msgstr "แกมเบีย" #. 324 msgid "Guinea" msgstr "กินี" #. 312 msgid "Guadeloupe" msgstr "กวาเดอลูป" #. 226 msgid "Equatorial Guinea" msgstr "กินี ตรงเส้นศูนย์สูตร" #. 300 msgid "Greece" msgstr "กรีซ" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช" #. 320 msgid "Guatemala" msgstr "กัวเตมาลา" #. 316 msgid "Guam" msgstr "กวม" #. 624 msgid "Guinea-Bissau" msgstr "กินี - บิสซอ" #. 328 msgid "Guyana" msgstr "กูยาน่า" #. 344 msgid "Hong Kong" msgstr "ฮ่องกง" #. 334 msgid "Heard Island and McDonald Islands" msgstr "เกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์" #. 340 msgid "Honduras" msgstr "ฮอนดูรัส" #. 191 msgid "Croatia" msgstr "โครเอเธีย" #. 332 msgid "Haiti" msgstr "ไฮติ" #. 348 msgid "Hungary" msgstr "ฮังการี" #. 360 msgid "Indonesia" msgstr "อินโดนีเซีย" #. 372 msgid "Ireland" msgstr "ไอร์แลนด์" #. 376 msgid "Israel" msgstr "อิสราเอล" #. 833 msgid "Isle of Man" msgstr "เกาะแมน" #. 356 msgid "India" msgstr "อินเดีย" #. 086 msgid "British Indian Ocean Territory" msgstr "บริติชอินเดียนโอเชียนเทร์ริทอรี" #. 368 msgid "Iraq" msgstr "อิรัก" #. 364 msgid "Iran, Islamic Republic of" msgstr "" #. 352 msgid "Iceland" msgstr "ไอซ์แลนด์" #. 380 msgid "Italy" msgstr "อิตาลี" #. 832 msgid "Jersey" msgstr "เจอร์ซีย์" #. 388 msgid "Jamaica" msgstr "จาไมก้า" #. 400 msgid "Jordan" msgstr "จอร์แดน" #. 392 msgid "Japan" msgstr "ญี่ปุ่น" #. 404 msgid "Kenya" msgstr "เคนยา" #. 417 msgid "Kyrgyzstan" msgstr "คีร์กีซสถาน" #. 116 msgid "Cambodia" msgstr "กัมพูชา" #. 296 msgid "Kiribati" msgstr "คิริบาติ" #. 174 msgid "Comoros" msgstr "โคโมรอส" #. 659 msgid "Saint Kitts and Nevis" msgstr "เซนต์คิตส์และเนวิส" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "เกาหลีเหนือ" #. 410 msgid "Korea, Republic of" msgstr "เกาหลีใต้" #. 414 msgid "Kuwait" msgstr "คูเวต" #. 136 msgid "Cayman Islands" msgstr "หมู่เกาะเคย์แมน" #. 398 msgid "Kazakhstan" msgstr "คาซัคสถาน" #. 418 msgid "Lao People's Democratic Republic" msgstr "สาธารณรัฐประชาธิปไตยประชาชนลาว" #. 422 msgid "Lebanon" msgstr "เลบานอน" #. 662 msgid "Saint Lucia" msgstr "เซนต์ลูเซีย" #. 438 msgid "Liechtenstein" msgstr "ลิชเทนสไตน์" #. 144 msgid "Sri Lanka" msgstr "ศรีลังกา" #. 430 msgid "Liberia" msgstr "ไลบีเรีย" #. 426 msgid "Lesotho" msgstr "เลโซโต" #. 440 msgid "Lithuania" msgstr "ลิธัวเนีย" #. 442 msgid "Luxembourg" msgstr "ลักเซมเบอร์ก" #. 428 msgid "Latvia" msgstr "ลัธเวีย" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "โมร็อคโค" #. 492 msgid "Monaco" msgstr "โมนาโค" #. 498 msgid "Moldova, Republic of" msgstr "มอลโดวา, สาธารณรัฐ" #. 499 msgid "Montenegro" msgstr "มอนเตเนโกร" #. 663 msgid "Saint Martin (French part)" msgstr "แซงมาร์แตง (ส่วนของฝรั่งเศส)" #. 450 msgid "Madagascar" msgstr "มาดากัสกา" #. 584 msgid "Marshall Islands" msgstr "หมู่เกาะมาแชล" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" #. 466 msgid "Mali" msgstr "มาลี" #. 104 msgid "Myanmar" msgstr "พม่า" #. 496 msgid "Mongolia" msgstr "มองโกเลีย" #. 446 msgid "Macao" msgstr "มาเก๊า" #. 580 msgid "Northern Mariana Islands" msgstr "หมู่เกาะมาเรียน่เหนือ" #. 474 msgid "Martinique" msgstr "มาทินิค" #. 478 msgid "Mauritania" msgstr "มอริทาเนีย" #. 500 msgid "Montserrat" msgstr "มอนต์เซอร์รัท" #. 470 msgid "Malta" msgstr "มอลตา" #. 480 msgid "Mauritius" msgstr "มอริเชียส" #. 462 msgid "Maldives" msgstr "มัลดิฟ" #. 454 msgid "Malawi" msgstr "มาลาวี" #. 484 msgid "Mexico" msgstr "เม็กซิโก" #. 458 msgid "Malaysia" msgstr "มาเลเซีย" #. 508 msgid "Mozambique" msgstr "โมแซมบิก" #. 516 msgid "Namibia" msgstr "นามิเบีย" #. 540 msgid "New Caledonia" msgstr "นิวคาเลโดเนีย" #. 562 msgid "Niger" msgstr "ไนเจอร์" #. 574 msgid "Norfolk Island" msgstr "เกาะนอร์ฟอล์ค" #. 566 msgid "Nigeria" msgstr "ไนจีเรีย" #. 558 msgid "Nicaragua" msgstr "นิคารากัว" #. 528 msgid "Netherlands" msgstr "เนเธอร์แลนด์" #. 578 msgid "Norway" msgstr "นอร์เวย์" #. 524 msgid "Nepal" msgstr "เนปาล" #. 520 msgid "Nauru" msgstr "นาวรู" #. 570 msgid "Niue" msgstr "นิอุเอ" #. 554 msgid "New Zealand" msgstr "นิวซีแลนด์" #. 512 msgid "Oman" msgstr "โอมาน" #. 591 msgid "Panama" msgstr "ปานามา" #. 604 msgid "Peru" msgstr "เปรู" #. 258 msgid "French Polynesia" msgstr "ฝรั่งเศสโพลีนีเซีย" #. 598 msgid "Papua New Guinea" msgstr "ปาปัวนิวกินี" #. 608 msgid "Philippines" msgstr "ฟิลิปปินส์" #. 586 msgid "Pakistan" msgstr "ปากีสถาน" #. 616 msgid "Poland" msgstr "โปแลนด์" #. 666 msgid "Saint Pierre and Miquelon" msgstr "แซงปีแยร์และมีเกอลง" #. 612 msgid "Pitcairn" msgstr "พิตแคร์น" #. 630 msgid "Puerto Rico" msgstr "เปอร์โตริโก" #. 275 msgid "Palestinian Territory, Occupied" msgstr "ปาเลสไตน์, ดินแดนยึดครอง" #. 620 msgid "Portugal" msgstr "โปรตุเกส" #. 585 msgid "Palau" msgstr "เกาะพาเลา" #. 600 msgid "Paraguay" msgstr "ปารากวัย" #. 634 msgid "Qatar" msgstr "กาตาร์" #. 638 msgid "Reunion" msgstr "รียูเนียน" #. 642 msgid "Romania" msgstr "โรมาเนีย" #. 688 msgid "Serbia" msgstr "เซอร์เบีย" #. 643 msgid "Russian Federation" msgstr "สมาพันธรัฐรัสเซีย" #. 646 msgid "Rwanda" msgstr "รวันด้า" #. 682 msgid "Saudi Arabia" msgstr "ซาอุดิอาระเบีย" #. 090 msgid "Solomon Islands" msgstr "หมู่เกาะโซโลมอน" #. 690 msgid "Seychelles" msgstr "ซีเชลล์" #. 736 msgid "Sudan" msgstr "ซูดาน" #. 752 msgid "Sweden" msgstr "สวีเดน" #. 702 msgid "Singapore" msgstr "สิงคโปร์" #. 654 msgid "Saint Helena" msgstr "เซนต์เฮเลนา" #. 705 msgid "Slovenia" msgstr "สโลเวเนีย" #. 744 msgid "Svalbard and Jan Mayen" msgstr "สฟาลบาร์ และ ยานไมเอน" #. 703 msgid "Slovakia" msgstr "สโลวาเกีย" #. 694 msgid "Sierra Leone" msgstr "" #. 674 msgid "San Marino" msgstr "ซานมาริโน" #. 686 msgid "Senegal" msgstr "เซนีกัล" #. 706 msgid "Somalia" msgstr "โซมาเลีย" #. 740 msgid "Suriname" msgstr "ซูรีนามิ" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "ซาวโทม และ พรินซิป" #. 222 msgid "El Salvador" msgstr "เอลซัลวาดอร์" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "สาธารณรัฐอาหรับซีเรีย" #. 748 msgid "Swaziland" msgstr "สวาซิแลนด์" #. 796 msgid "Turks and Caicos Islands" msgstr "เกาะดติร์กและเคคอส" #. 148 msgid "Chad" msgstr "ชาด" #. 260 msgid "French Southern Territories" msgstr "เฟรนช์เซาเทิร์นเทร์ริทอรีส์" #. 768 msgid "Togo" msgstr "โตโก" #. 764 msgid "Thailand" msgstr "ราชอาณาจักรไทย" #. 762 msgid "Tajikistan" msgstr "ธาจีกิสถาน" #. 772 msgid "Tokelau" msgstr "โตเกเลา" #. 626 msgid "Timor-Leste" msgstr "ติมอร์ตะวันออก" #. 795 msgid "Turkmenistan" msgstr "เตอร์กเมนิสถาน" #. 788 msgid "Tunisia" msgstr "ตูนีเซีย" #. 776 msgid "Tonga" msgstr "ตองก้า" #. 792 msgid "Turkey" msgstr "ตุรกี" #. 780 msgid "Trinidad and Tobago" msgstr "ตรีนิแดดและโทบาโก" #. 798 msgid "Tuvalu" msgstr "ตูวาลู" #. 158 msgid "Taiwan, Province of China" msgstr "ไต้หวัน, จังหวัดของจีน" #. 834 msgid "Tanzania, United Republic of" msgstr "แทนซาเนีย, สหสาธารณรัฐ" #. 804 msgid "Ukraine" msgstr "ยูเครน" #. 800 msgid "Uganda" msgstr "ยูกันดา" #. 581 msgid "United States Minor Outlying Islands" msgstr "เกาะเล็กรอบนอกของสหรัฐอเมริกา" #. 840 msgid "United States" msgstr "สหรัฐ" #. 858 msgid "Uruguay" msgstr "อุรุกวัย" #. 860 msgid "Uzbekistan" msgstr "อุซเบกิสถาน" #. 336 msgid "Holy See (Vatican City State)" msgstr "นครรัฐวาติกัน" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "เซนต์วินเซนต์และเกรนาดีนส์" #. 862 msgid "Venezuela" msgstr "เวเนซุเอลา" #. 092 msgid "Virgin Islands, British" msgstr "หมู่เกาะบริติชเวอร์จิน" #. 850 msgid "Virgin Islands, U.S." msgstr "หมู่เกาะเวอร์จินของสหรัฐอเมริกา" #. 704 msgid "Viet Nam" msgstr "เวียตนาม" #. 548 msgid "Vanuatu" msgstr "แวนัวตู" #. 876 msgid "Wallis and Futuna" msgstr "หมู่เกาะวาลลิสและหมู่เกาะฟูตูนา" #. 882 msgid "Samoa" msgstr "ซามัว" #. 887 msgid "Yemen" msgstr "เยเมน" #. 175 msgid "Mayotte" msgstr "เมโยเต้" #. 710 msgid "South Africa" msgstr "แอฟริกาใต้" #. 894 msgid "Zambia" msgstr "แซมเบีย" #. 716 msgid "Zimbabwe" msgstr "ซิมบับเว" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "รถยนต์" msgid "Iso2" msgstr "ISO2" msgid "Iso3" msgstr "ISO3" msgid "Country" msgstr "ประเทศ" msgid "Postal" msgstr "ไปรษณีย์" msgid "Town" msgstr "เมือง" msgid "District" msgstr "เขต" msgid "Street" msgstr "ถนน" msgid "Number" msgstr "หมายเลข" msgid "Enter Destination" msgstr "กำหนด ที่หมาย" msgid "Zip Code" msgstr "รหัสไปรษณีย์" msgid "City" msgstr "เมือง" msgid "District/Township" msgstr "" msgid "Map" msgstr "แผนที่" msgid "Bookmark" msgstr "" msgid "Destination" msgstr "จุดหมาย" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "แสดง" msgid "_Route" msgstr "เส้นทาง" msgid "_Former Destinations" msgstr "ก่อนถึง ที่หมาย" msgid "_Bookmarks" msgstr "บุ๊กมาร์ก" msgid "_Map" msgstr "แผนที่" msgid "_Layout" msgstr "การจัดเรียง" msgid "_Projection" msgstr "การฉายแผนที่" msgid "_Vehicle" msgstr "ยานพาหนะ" msgid "Zoom_Out" msgstr "ขยายออก" msgid "Decrease zoom level" msgstr "" msgid "Zoom_In" msgstr "ขยายเข้า" msgid "Increase zoom level" msgstr "" msgid "_Recalculate" msgstr "คำนวนใหม่" msgid "Redraw map" msgstr "" msgid "_Info" msgstr "ข้อมูล" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "หยุดการนำทาง" msgid "Test" msgstr "ทดสอบ" msgid "_Quit" msgstr "_ออกจากโปรแกรม" msgid "Quit the application" msgstr "" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "" msgid "_Fullscreen" msgstr "แสดงผลเต็มจอภาพ" msgid "Data" msgstr "ข้อมูล" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "เหนือ" msgid "NE" msgstr "ตะวันออกเฉียงเหนือ" msgid "E" msgstr "ตะวันออก" msgid "SE" msgstr "ตะวันออกเฉียงใต้" msgid "S" msgstr "ใต้" msgid "SW" msgstr "ตะวันตกเฉียงใต้" msgid "W" msgstr "ตะวันตก" msgid "NW" msgstr "ตะวันออกเฉียงเหนือ" #. Android resource: @strings/no msgid "No" msgstr "" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "เส้นทาง %4.0f กม. %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "เส้นทาง 0000km 0+00:00 ETA" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "" msgid "House numbers" msgstr "" msgid "View Attributes" msgstr "" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "" msgid "Copy Bookmark" msgstr "" msgid "Rename Bookmark" msgstr "" msgid "Paste Bookmark" msgstr "" msgid "Delete Bookmark" msgstr "" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "บุ๊กมาร์ก" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "" #, c-format msgid "Bookmark %s" msgstr "" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr "" msgid "Show NMEA Data" msgstr "" msgid "car" msgstr "" msgid "bike" msgstr "" msgid "pedestrian" msgstr "" #, c-format msgid "Current profile: %s" msgstr "" #, c-format msgid "Change profile to: %s" msgstr "" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "" msgid "Show NMEA data" msgstr "" msgid "Add Bookmark" msgstr "" msgid "Rename" msgstr "" msgid "About Navit" msgstr "" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "ยานพาหนะ" msgid "Rules" msgstr "" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "ทางทิศเหนือ" msgid "Map follows Vehicle" msgstr "" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "" msgid "Layout" msgstr "การจัดเรียง" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "" msgid "Show Locale" msgstr "" msgid "Former Destinations" msgstr "ก่อนถึง ที่หมาย" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "" msgid "Back" msgstr "" msgid "Back to map" msgstr "" msgid "Main Menu" msgstr "" msgid "House number" msgstr "" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "" msgid "Main menu" msgstr "" msgid "" "Show\n" "Map" msgstr "" msgid "Settings" msgstr "" msgid "Tools" msgstr "" msgid "Route" msgstr "เส้นทาง" msgid "About" msgstr "" msgid "Quit" msgstr "" msgid "Actions" msgstr "" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" msgid "Display" msgstr "แสดง" msgid "Fullscreen" msgstr "แสดงผลเต็มจอภาพ" msgid "Window Mode" msgstr "" msgid "Description" msgstr "" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" navit-0.5.0+dfsg.1/po/tr.po.in000066400000000000000000001322631264204753600157430ustar00rootroot00000000000000# Turkish (tr) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Abesis https://launchpad.net/~izzetaykutkocak # Angel Spy https://launchpad.net/~dilara.ekinci # Bawer Yekta https://launchpad.net/~e-peyam # Bekir DURAK https://launchpad.net/~bekir-durak # Koray Löker https://launchpad.net/~loker # Kudret EMRE https://launchpad.net/~kudretemre # ViZiT https://launchpad.net/~vizit # dentist76 https://launchpad.net/~pilatin # eMVP https://launchpad.net/~ercan-i # seqizz (gurkanGur) https://launchpad.net/~seqizz # tinyos https://launchpad.net/~eygu-mindikoglu # Şahin Alp Taşkaya https://launchpad.net/~sahin msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:01+0000\n" "Last-Translator: Kudret EMRE \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: tr\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Kaynak klasörden çalıştırılıyor\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' , '%s' değerine ayarlanıyor\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "sıfırıncı" msgid "first" msgstr "birinci" msgid "second" msgstr "ikinci" msgid "third" msgstr "üçüncü" msgid "fourth" msgstr "dördüncü" msgid "fifth" msgstr "beşinci" msgid "sixth" msgstr "altıncı" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "sıfırıncı çıkış" msgid "first exit" msgstr "ilk çıkış" msgid "second exit" msgstr "ikinci çıkış" msgid "third exit" msgstr "üçüncü çıkış" msgid "fourth exit" msgstr "dördüncü çıkış" msgid "fifth exit" msgstr "beşinci çıkış" msgid "sixth exit" msgstr "altıncı çıkış" #, c-format msgid "%d feet" msgstr "%d feet" #, c-format msgid "in %d feet" msgstr "%d feet içinde" #, c-format msgid "%d.%d miles" msgstr "%d.%d mil" #, c-format msgid "in %d.%d miles" msgstr "%d.%d mil içinde" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "bir mil" msgstr[1] "%d mil" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "bir mil içinde" msgstr[1] "%d mil içinde" #, c-format msgid "%d meters" msgstr "%d metre" #, c-format msgid "in %d meters" msgstr "%d metrede" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d kilometre" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d kilometrede" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d kilometre" msgstr[1] "%d kilometre" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "%d kilometrede" msgstr[1] "%d kilometrede" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "rampada" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%scaddesine %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%scaddesine %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%scaddesine %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%scaddesine %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s%s yoluna" msgid "When possible, please turn around" msgstr "Müsait olduğunda lütfen yönünü değiştir" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Gelecek %s için yolu takip et" msgid "Enter the roundabout soon" msgstr "Yakındaki kavşağa girin" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "%1$s'de kavşaktan çıkın %2$s" msgid "soon" msgstr "yakında" msgid "now" msgstr "şimdi" msgid "then" msgstr "sonra" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "solunuzda" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "kesişiminde" msgid "at exit" msgstr "çıkışta" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "Sağa" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "Sola" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "kolayca " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "sertçe " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "%1$s yolunda %2$s yönüne dönün" #, c-format msgid "after %i roads" msgstr "%i yol sonra" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Dönüş %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "takip edin" msgid "then you have reached your destination." msgstr "ardından hedefinize ulaşacaksınız" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Hedefinize ulaştınız, %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Kesişim" msgid "Exit" msgstr "Çıkış" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Konum" msgid "Command" msgstr "Komut" msgid "Length" msgstr "Uzaklık" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Zaman" msgid "Destination Length" msgstr "Hedef Uzaklığı" msgid "Destination Time" msgstr "Varış Zamanı" msgid "Roadbook" msgstr "Yol Haritası" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Pozisyon olarak ayarla" msgid "Set as destination" msgstr "Hedef olarak ayarla" msgid "Add as bookmark" msgstr "Yer imi olarak ayarla" #, c-format msgid "Point 0x%x 0x%x" msgstr "Nokta 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Ekran koordinatları :%d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "Birleşik Arap Emirlikleri" #. 004 msgid "Afghanistan" msgstr "Afganistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua ve Barbuda" #. 660 msgid "Anguilla" msgstr "Angola" #. 008 msgid "Albania" msgstr "Arnavutluk" #. 051 msgid "Armenia" msgstr "Ermenistan" #. 530 msgid "Netherlands Antilles" msgstr "Hollanda Antilleri" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarktika" #. 032 msgid "Argentina" msgstr "Arjantin" #. 016 msgid "American Samoa" msgstr "Amerikan Samoa" #. 040 msgid "Austria" msgstr "Avusturya" #. 036 msgid "Australia" msgstr "Avustralya" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Adaları" #. 031 msgid "Azerbaijan" msgstr "Azerbeycan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosna Hersek" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladeş" #. 056 msgid "Belgium" msgstr "Belçika" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaristan" #. 048 msgid "Bahrain" msgstr "Bahreyn" #. 108 msgid "Burundi" msgstr "Brundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Bruney" #. 068 msgid "Bolivia" msgstr "Bolivya" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brezilya" #. 044 msgid "Bahamas" msgstr "Bahamalar" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Bouvet Adası" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Beyaz Rusya" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Kanada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Adaları" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Kongo Demokratik Cumhuriyeti" #. 140 msgid "Central African Republic" msgstr "Merkezi Afrika Cumhuriyeti" #. 178 msgid "Congo" msgstr "Kongo" #. 756 msgid "Switzerland" msgstr "İsviçre" #. 384 msgid "Cote d'Ivoire" msgstr "Cote d'Ivoire" #. 184 msgid "Cook Islands" msgstr "Cook Adaları" #. 152 msgid "Chile" msgstr "Şili" #. 120 msgid "Cameroon" msgstr "Kamerun" #. 156 msgid "China" msgstr "Çin" #. 170 msgid "Colombia" msgstr "Kolombiya" #. 188 msgid "Costa Rica" msgstr "Kosta Rika" #. 192 msgid "Cuba" msgstr "Küba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Christmas Island" #. 196 msgid "Cyprus" msgstr "Kıbrıs" #. 203 msgid "Czech Republic" msgstr "Çek Cumhuriyeti" #. 276 msgid "Germany" msgstr "Almanya" #. 262 msgid "Djibouti" msgstr "Cibuti" #. 208 msgid "Denmark" msgstr "Danimarka" #. 212 msgid "Dominica" msgstr "Dominik" #. 214 msgid "Dominican Republic" msgstr "Dominik Cumhuriyeti" #. 012 msgid "Algeria" msgstr "Cezayir" #. 218 msgid "Ecuador" msgstr "Ekvator" #. 233 msgid "Estonia" msgstr "Estonya" #. 818 msgid "Egypt" msgstr "Mısır" #. 732 msgid "Western Sahara" msgstr "Batı Sahra" #. 232 msgid "Eritrea" msgstr "Eritre" #. 724 msgid "Spain" msgstr "İspanya" #. 231 msgid "Ethiopia" msgstr "Etyopya" #. 246 msgid "Finland" msgstr "Finlandiya" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Adaları (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Mikronezya, Federe Devletleri" #. 234 msgid "Faroe Islands" msgstr "Faroe Adaları" #. 250 msgid "France" msgstr "Fransa" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Birleşik Krallık" #. 308 msgid "Grenada" msgstr "Granada" #. 268 msgid "Georgia" msgstr "Gürcistan" #. 254 msgid "French Guiana" msgstr "Fransız Guyanası" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Gana" #. 292 msgid "Gibraltar" msgstr "Cebelitarık" #. 304 msgid "Greenland" msgstr "Grönland" #. 270 msgid "Gambia" msgstr "Gambiya" #. 324 msgid "Guinea" msgstr "Gine" #. 312 msgid "Guadeloupe" msgstr "Guadalup" #. 226 msgid "Equatorial Guinea" msgstr "Ekvator Ginesi" #. 300 msgid "Greece" msgstr "Yunanistan" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Güney Gürcistan ve Güney Sandoviç Adaları" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Gine-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hong Kong" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Adası ve McDonald Adaları" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Hırvatistan" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Macaristan" #. 360 msgid "Indonesia" msgstr "Endonezya" #. 372 msgid "Ireland" msgstr "İrlanda" #. 376 msgid "Israel" msgstr "İsrail" #. 833 msgid "Isle of Man" msgstr "Man adası" #. 356 msgid "India" msgstr "Hindistan" #. 086 msgid "British Indian Ocean Territory" msgstr "Hint Okyanusu İngiliz Bölgesi" #. 368 msgid "Iraq" msgstr "Irak" #. 364 msgid "Iran, Islamic Republic of" msgstr "İran, İslâm Cumhuriyeti" #. 352 msgid "Iceland" msgstr "İzlanda" #. 380 msgid "Italy" msgstr "İtalya" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaika" #. 400 msgid "Jordan" msgstr "Ürdün" #. 392 msgid "Japan" msgstr "Japonya" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kırgızistan" #. 116 msgid "Cambodia" msgstr "Kamboçya" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Komoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Sen Kitts ve Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Kore, Demokratik Halk Cumhuriyeti" #. 410 msgid "Korea, Republic of" msgstr "Kore Cumhuriyeti" #. 414 msgid "Kuwait" msgstr "Kuveyt" #. 136 msgid "Cayman Islands" msgstr "Seyman Adaları" #. 398 msgid "Kazakhstan" msgstr "Kazakistan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Lao, Demokratik Halk Cumhuriyeti" #. 422 msgid "Lebanon" msgstr "Lübnan" #. 662 msgid "Saint Lucia" msgstr "Sen Lusia" #. 438 msgid "Liechtenstein" msgstr "Lihtenştayn" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberya" #. 426 msgid "Lesotho" msgstr "Lesoto" #. 440 msgid "Lithuania" msgstr "Litvanya" #. 442 msgid "Luxembourg" msgstr "Lüksemburg" #. 428 msgid "Latvia" msgstr "Letonya" #. 434 msgid "Libya" msgstr "Libya" #. 504 msgid "Morocco" msgstr "Fas" #. 492 msgid "Monaco" msgstr "Monako" #. 498 msgid "Moldova, Republic of" msgstr "Moldova Cumhuriyeti" #. 499 msgid "Montenegro" msgstr "Karadağ" #. 663 msgid "Saint Martin (French part)" msgstr "Sen Martin (Fransız kısmı)" #. 450 msgid "Madagascar" msgstr "Madagaskar" #. 584 msgid "Marshall Islands" msgstr "Marshall Adaları" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Makedonya" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Moğolistan" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Adaları" #. 474 msgid "Martinique" msgstr "Martinik" #. 478 msgid "Mauritania" msgstr "Moritanya" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldivler" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Meksika" #. 458 msgid "Malaysia" msgstr "Malezya" #. 508 msgid "Mozambique" msgstr "Mozambik" #. 516 msgid "Namibia" msgstr "Namibiya" #. 540 msgid "New Caledonia" msgstr "Yeni Kaledonya" #. 562 msgid "Niger" msgstr "Nijer" #. 574 msgid "Norfolk Island" msgstr "Norfolk Adası" #. 566 msgid "Nigeria" msgstr "Nijerya" #. 558 msgid "Nicaragua" msgstr "Nikaragua" #. 528 msgid "Netherlands" msgstr "Hollanda" #. 578 msgid "Norway" msgstr "Norveç" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "Yeni Zelanda" #. 512 msgid "Oman" msgstr "Umman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "Fransız Polinezyası" #. 598 msgid "Papua New Guinea" msgstr "Papua Yeni Gine" #. 608 msgid "Philippines" msgstr "Filipinler" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Polonya" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre ve Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Porto Riko" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Filistin Özerk Bölgesi" #. 620 msgid "Portugal" msgstr "Portekiz" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Katar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romanya" #. 688 msgid "Serbia" msgstr "Sırbistan" #. 643 msgid "Russian Federation" msgstr "Rusya Federasyonu" #. 646 msgid "Rwanda" msgstr "Ruanda" #. 682 msgid "Saudi Arabia" msgstr "Suudi Arabistan" #. 090 msgid "Solomon Islands" msgstr "Solomon Adaları" #. 690 msgid "Seychelles" msgstr "Seyşel Adaları" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "İsveç" #. 702 msgid "Singapore" msgstr "Singapur" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenya" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ve Jan Mayen Adaları" #. 703 msgid "Slovakia" msgstr "Slovakya" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somali" #. 740 msgid "Suriname" msgstr "Surinam" #. 728 msgid "South Sudan" msgstr "Güney Sudan" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome ve Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "Sint Maarten (Hollanda bölümü)" #. 760 msgid "Syrian Arab Republic" msgstr "Suriye" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks ve Kaykos Adaları" #. 148 msgid "Chad" msgstr "Çad" #. 260 msgid "French Southern Territories" msgstr "Güney Fransa Bölgeleri" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Tayland" #. 762 msgid "Tajikistan" msgstr "Tacikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Türkmenistan" #. 788 msgid "Tunisia" msgstr "Tunus" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Türkiye" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad ve Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Tayvan, Çin Eyaleti" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzanya, Birleşik Cumhuriyeti" #. 804 msgid "Ukraine" msgstr "Ukrayna" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "Küçük Birleşik Devletler adaları" #. 840 msgid "United States" msgstr "Birleşik Devletler" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Özbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Vatikan" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Sen Vinsınt ve Granadalar" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Adaları, İngiliz" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Adaları, A.B.D." #. 704 msgid "Viet Nam" msgstr "Vietnam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis ve Futuna Adaları" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "Güney Afrika" #. 894 msgid "Zambia" msgstr "Zambiya" #. 716 msgid "Zimbabwe" msgstr "Zimbabve" msgid "* Unknown, add is_in tags to those cities" msgstr "* tanınmıyor, bu yerleşime bir etiket ekleyin" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" "navit kullanımı:\n" "navit [seçenekler] [yapılandırma dosyası]\n" "\t-c : argümanını varsayılan dosyayı kullanmak yerine " "yapılandırma dosyası olarak kullanabilirsiniz.\n" "\t-d : hata ayıklama seviyesini ayarlayın (0=hata, 1=uyarı, 2=bilgi, " "3=hata ayıklama).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: bu kullanım bilgisini göster ve çık.\n" "\t-v: sürümü göster ve çık.\n" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "Hiçbir navit.xml, navit.xml.locak yapılandırma dosyası bulunamadı\n" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "'%s' yapılandırma dosyası kullanılıyor\n" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "Hata: '%s' yapılandırma dosyasında hiçbir yapılandırma bulunamadı\n" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "bilinmeyen sokak" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "İsimsiz araç" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Harita Noktası" msgid "Car" msgstr "Araç" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Isa3" msgid "Country" msgstr "Ülke" msgid "Postal" msgstr "Posta" msgid "Town" msgstr "Şehir" msgid "District" msgstr "Bölge" msgid "Street" msgstr "Cadde" msgid "Number" msgstr "Numara" msgid "Enter Destination" msgstr "Hedefi Giriniz" msgid "Zip Code" msgstr "Zip Kodu" msgid "City" msgstr "Şehir" msgid "District/Township" msgstr "Bölge/Mahal" msgid "Map" msgstr "Harita" msgid "Bookmark" msgstr "Yer imi" msgid "Destination" msgstr "Hedef" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Görüntüle" msgid "_Route" msgstr "Rota" msgid "_Former Destinations" msgstr "önceki istikamet" msgid "_Bookmarks" msgstr "Yer İmleri" msgid "_Map" msgstr "Harita" msgid "_Layout" msgstr "Yerleşim" msgid "_Projection" msgstr "İzdüşüm" msgid "_Vehicle" msgstr "Araç" msgid "Zoom_Out" msgstr "Uzaklaştır" msgid "Decrease zoom level" msgstr "Uzaklaştır" msgid "Zoom_In" msgstr "Yakınlaştır" msgid "Increase zoom level" msgstr "Yakınlaştır" msgid "_Recalculate" msgstr "Yeniden hesapla" msgid "Redraw map" msgstr "Haritayı tekrar çiz" msgid "_Info" msgstr "Bilgi" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Adres aramayı açar" msgid "_POI search" msgstr "_POI arama" msgid "Opens POI search dialog" msgstr "POI arama penceresini açar" msgid "_Stop Navigation" msgstr "Dolaşmayı Durdur" msgid "Test" msgstr "Test" msgid "_Quit" msgstr "Çı_kış" msgid "Quit the application" msgstr "Uygulamadan çık" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Kapalı yol" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "" msgid "_Roadbook" msgstr "Yol Haritası" msgid "Show/hide route description" msgstr "Rota tanımını Göster/Gizle" msgid "_Autozoom" msgstr "Oto-yaklaş" msgid "Enable/disable automatic zoom level changing" msgstr "Otomatik yakınlaştırmayı açar/kapatır" msgid "_Fullscreen" msgstr "Tam Ekran" msgid "Data" msgstr "Veri" msgid "Pharmacy" msgstr "Eczane" msgid "Restaurant" msgstr "Restoran" msgid "Restaurant. Fast food" msgstr "Restoran. Hazır gıda" msgid "Hotel" msgstr "Otel" msgid "Car parking" msgstr "Otopark" msgid "Fuel station" msgstr "Akaryakıt istasyonu" msgid "Bank" msgstr "Banka" msgid "Hospital" msgstr "Hastane" msgid "Cinema" msgstr "Sinema" msgid "Train station" msgstr "Tren istasyonu" msgid "School" msgstr "Okul" msgid "Police" msgstr "Polis" msgid "Justice" msgstr "Adaley Sarayı" msgid "Taxi" msgstr "Taksi" msgid "Shopping" msgstr "Alışveriş" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "POI %s. %s" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "Hedefi buraya ayarla %ld, %ld \n" #, c-format msgid "Set map to %ld, %ld \n" msgstr "Haritayı buraya ayarla %ld, %ld \n" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "POI arama" msgid "Select a category" msgstr "Bir kategori seç" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "Bir POI se." msgid " " msgstr " " msgid "Category" msgstr "Kategori" msgid "Direction" msgstr "Yön" msgid "Distance(m)" msgstr "Mesafe(m)" msgid "Name" msgstr "İsim" msgid "Visit Before" msgstr "" msgid "N" msgstr "K" msgid "NE" msgstr "KD" msgid "E" msgstr "D" msgid "SE" msgstr "GD" msgid "S" msgstr "G" msgid "SW" msgstr "GB" msgid "W" msgstr "B" msgid "NW" msgstr "Kuzey-Batı" #. Android resource: @strings/no msgid "No" msgstr "Hayır" msgid "2D" msgstr "2B" msgid "3D" msgstr "3B" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Rota %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Rota 0000km 0+00:00 ETA" msgid "Help" msgstr "Yardım" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Tarayıcıda Bak" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Sokaklar" msgid "House numbers" msgstr "Ev numaraları" msgid "View Attributes" msgstr "Özniteliklere Bak" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "İlgi Noktaları" msgid "View on map" msgstr "Haritada bak" msgid "Remove search results from the map" msgstr "Arama sonuçlarını haritadan sil" msgid "Show results on the map" msgstr "Sonuçları haritada göster" msgid "Cut Bookmark" msgstr "Yer İmini Kes" msgid "Copy Bookmark" msgstr "Yer İmini Kopyala" msgid "Rename Bookmark" msgstr "Yer İmini Yeniden Adlandır" msgid "Paste Bookmark" msgstr "Yer İmini Yapıştır" msgid "Delete Bookmark" msgstr "Yer İmini Sil" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Yer İmleri" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "Dizini Sil" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Yer İmi Klasörünü Ekle" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Yer imini yapıştır" #, c-format msgid "Bookmark %s" msgstr "Yerimi ata %s" #, c-format msgid "Download %s" msgstr "%s İndir" msgid "Map Download" msgstr "Harita İndirme" msgid "Active" msgstr "Etkin" msgid "Download Enabled" msgstr "İndirme Etkinleştirildi" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Uydu durumunu göster" msgid " Elevation " msgstr " Yükseklik " msgid " Azimuth " msgstr " Azimut " msgid "Show NMEA Data" msgstr "NMEA verisi göster" msgid "car" msgstr "araba" msgid "bike" msgstr "bisiklet" msgid "pedestrian" msgstr "yaya" #, c-format msgid "Current profile: %s" msgstr "Geçerli profil: %s" #, c-format msgid "Change profile to: %s" msgstr "Yeni profil: %s" msgid "Set as active" msgstr "Etkin olarak ata" msgid "Show Satellite status" msgstr "Uydu durumunuı göster" msgid "Show NMEA data" msgstr "NMEA verisi göster" msgid "Add Bookmark" msgstr "Yer İmi Ekle" msgid "Rename" msgstr "Yeniden İsimlendir" msgid "About Navit" msgstr "Navit Hakkında" #. Authors msgid "By" msgstr "Yazar" #. Contributors msgid "And all the Navit Team" msgstr "Ve tüm Navit takımı" msgid "members and contributors." msgstr "üyeler ve katkıda bulunanlar." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "Koordinat Gir" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "Enlem Boylam" msgid "Enter coordinates, for example:" msgstr "Koordinat gir, örneğin:" msgid "Vehicle" msgstr "Araç" msgid "Rules" msgstr "Kurallar" msgid "Lock on road" msgstr "Yola Kilitlen" msgid "Northing" msgstr "Kuzey mesafesi" msgid "Map follows Vehicle" msgstr "Harita aracı takip etsin" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Haritalar" msgid "Layout" msgstr "Yerleşim" msgid "Height Profile" msgstr "Yükseklik Profili" msgid "Route Description" msgstr "Rota Açıklaması" msgid "Show Locale" msgstr "Yerel Ayarlar" msgid "Former Destinations" msgstr "önceki istikamet" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Mesaj" msgid "Back" msgstr "Geri" msgid "Back to map" msgstr "Haritaya dön" msgid "Main Menu" msgstr "Ana Menü" msgid "House number" msgstr "Ev no:" msgid "Next" msgstr "İleri" msgid "Prev" msgstr "Geri" msgid "Return to route!" msgstr "Rotaya dön!" #. warning told msgid "Look out! Camera!" msgstr "Dikkat! Kamera!" #. warning told msgid "Please decrease your speed" msgstr "Lütfen hızınızı düşürünüz" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "Ara" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "Harita verisi (c) OpenStreetMap destekçileri, ODBL" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" "Geçerli harita konumu %s kullanılabilir değil\n" "Lütfen bir SD kart taktıktan sonra Navit'i yeniden başlatın veya başka bir " "harita konumu seçin." msgid "Downloaded maps" msgstr "İndirilen haritalar" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "İptal" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "Tüm Dünya" msgid "Africa" msgstr "Afrika" msgid "Canary Islands" msgstr "Kanarya Adaları" msgid "Asia" msgstr "Asya" msgid "Korea" msgstr "Kore" msgid "Taiwan" msgstr "Tayvan" msgid "UAE+Other" msgstr "UAE+Diğer" msgid "Oceania" msgstr "Okyanusya" msgid "Tasmania" msgstr "Tazmanya" msgid "Victoria" msgstr "Viktoria" msgid "New South Wales" msgstr "Yeni Güney Galler" msgid "Europe" msgstr "Avrupa" msgid "Western Europe" msgstr "Batı Avrupa" msgid "Azores" msgstr "Azorlar" msgid "BeNeLux" msgstr "BeNeLux" msgid "Alsace" msgstr "Alsas" msgid "Aquitaine" msgstr "Akitanya" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "Aşağı Normandiya" msgid "Bourgogne" msgstr "Burgonya" msgid "Bretagne" msgstr "Britanya" msgid "Centre" msgstr "Merkez" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "Korsika" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "Yukarı Normandiya" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "Aşağı Bavyera" msgid "Oberbayern" msgstr "Yukarı Bavyera" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "Berlin" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "Bremen" msgid "Hamburg" msgstr "Hamburg" msgid "Hessen" msgstr "Hesse" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "Aşağı Saksonya" msgid "Nordrhein-westfalen" msgstr "Kuzey Ren-Vestfalya" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "Saksonya" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "Galiçya" msgid "Scandinavia" msgstr "İskandinavya" msgid "England" msgstr "İngiltere" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "İskoçya" msgid "Wales" msgstr "Galler" msgid "Crete" msgstr "" msgid "North America" msgstr "Kuzey Amerika" msgid "Alaska" msgstr "Alaska" msgid "Hawaii" msgstr "Hawaii" msgid "USA" msgstr "ABD" msgid " (except Alaska and Hawaii)" msgstr " (Alaska ve Hawaii hariç)" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "Kuzeydoğu" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "Güney" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "Teksas" msgid "Virginia" msgstr "Virjinya" msgid "West Virginia" msgstr "Batı Virjinya" msgid "West" msgstr "Batı" msgid "Arizona" msgstr "" msgid "California" msgstr "Kaliforniya" msgid "Colorado" msgstr "Kolorado" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "Güney+Orta Amerika" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "indiriliyor" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "hazır" msgid "Media selected for map storage is not available" msgstr "Harita saklama için seçilen ortam kullanılabilir değil" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "Yeterli boş alan yok" msgid "Error downloading map!" msgstr "Harita indirirken hata oluştu!" msgid "Error writing map!" msgstr "Harita yazılırken hata oluştu!" msgid "Map download aborted!" msgstr "Harita indirmesi iptal edildi!" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "Kalan Süre" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "Harita indirme" msgid "Vehicle Position" msgstr "Araç Konumu" msgid "Main menu" msgstr "Ana menü" msgid "" "Show\n" "Map" msgstr "Haritayı Göster" msgid "Settings" msgstr "Ayarlar" msgid "Tools" msgstr "Araçlar" msgid "Route" msgstr "Rota" msgid "About" msgstr "Hakkında" msgid "Quit" msgstr "Çık" msgid "Actions" msgstr "Eylemler" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "Koordinatlar" msgid "" "Stop\n" "Navigation" msgstr "" "Navigasyonu\n" "Durdur" msgid "Display" msgstr "Görüntüle" msgid "Fullscreen" msgstr "Tam Ekran" msgid "Window Mode" msgstr "Pencere Modu" msgid "Description" msgstr "Açıklama" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "Uydu Durumu" msgid "NMEA Data" msgstr "NMEA Verisi" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "at" msgid "Truck" msgstr "Kamyon" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "Evet" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "Navit başladı" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "Navit çalışıyor" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "Navit'e Hoşgeldiniz" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" "Navit'i yüklediğiniz için teşekkürler!\n" "\n" "Başlamak için menüden \"Harita indir\"i seçin. Not: Harita dosya boyutu " "büyük olabilir (>50MB) - kablosuz bağlantı önerilir.\n" "\n" "Harita verisi: (c) OpenStreetMap destekçileri\n" "\n" "Navit keyfini çıkarın!" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "Tamam" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "Daha fazla bilgi" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "Yaklaştır" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "Uzaklaştır" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "Harita indir" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "Navit'ten Çık" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "Yedekle / Geri Yükle" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "Harita konumunu ayarla" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "Bu harita silinsin mi?" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "İndiriliyor:" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "Harita indirilirken hata oluştu." #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "Harita indirmesi iptal edildi" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "Konum yok. Konum alındıktan sonra tekrar açın." #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "Geçerli konumu içeren haritalar" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "Adres arama" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "Hedef girin" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "Arıyor..." #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "Adres bulunamadı" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "Arama sonuçları alınıyor" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "Arama sonuçları yükleniyor" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "Hiçbir sonuç bulunamadı" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "Hiçbir metin girilmedi" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "Hedef buraya ayarlanıyor:" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "Bir eylem seçin" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "Lütfen bir SD Kart takın" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "Yedekleniyor..." #. Android resource: @strings/restoring msgid "Restoring..." msgstr "Geri yükleniyor..." #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "Yedekleme dizini oluşturulamadı" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "Yedekleme başarısız" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "Hiçbir yedek bulunamadı" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "Geri yükleme başarısız" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "Yedekleme başarılı" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" "Geri yükleme başarılı\n" "Lütfen Navit'i yeniden başlatın" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "Yedek bulunamadı" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "Geri yükleme başarısız" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "Yedek seçin" #. Android resource: @strings/backup msgid "Backup" msgstr "Yedekle" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "ardından %1$s'de kavşaktan çıkın %2$s" navit-0.5.0+dfsg.1/po/uk.po.in000066400000000000000000001351421264204753600157340ustar00rootroot00000000000000# Ukrainian translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Knedlyk https://launchpad.net/~yupadmin # Michael von Glasow https://launchpad.net/~michael-vonglasow # andygol https://launchpad.net/~andygol # serg_stetsuk https://launchpad.net/~serg-stetsuk msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:01+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "Language: uk\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Запуск з початкового каталогу\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "настройка '%s' до '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "нульовий" msgid "first" msgstr "перший" msgid "second" msgstr "другий" msgid "third" msgstr "третій" msgid "fourth" msgstr "четвертий" msgid "fifth" msgstr "п’ятий" msgid "sixth" msgstr "шостий" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "нульовий виїзд" msgid "first exit" msgstr "перший виїзд" msgid "second exit" msgstr "другий виїзд" msgid "third exit" msgstr "третій виїзд" msgid "fourth exit" msgstr "четвертий виїзд" msgid "fifth exit" msgstr "п’ятий виїзд" msgid "sixth exit" msgstr "шостий виїзд" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d метрів" #, c-format msgid "in %d meters" msgstr "за %d метрів" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d кілометрів" #, c-format msgid "in %d.%d kilometers" msgstr "за %d.%d кілометрів" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d кілометр" msgstr[1] "%d кілометри" msgstr[2] "%d кілометрів" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "за %d кілометр" msgstr[1] "за %d кілометри" msgstr[2] "за %d кілометрів" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "з'їзд на" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sна %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sна %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sв %s" msgid "When possible, please turn around" msgstr "Якщо це можливо, то розверніться" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Їдьте дорогою наступні %s" msgid "Enter the roundabout soon" msgstr "Скоро виїзд на дорогу з кільцевим рухом" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Виїдьте з кільця через %1$s %2$s" msgid "soon" msgstr "скоро" msgid "now" msgstr "зараз" msgid "then" msgstr "тоді" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "праворуч" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "ліворуч" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "легко " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "круто " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "З’їдьте на дорогу %1$s до %2$s" #, c-format msgid "after %i roads" msgstr "після %i дороги" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Поверніть на %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "тоді то розверніться" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "То розверніться %1$s" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "тоді то розверніться" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "То розверніться %1$s" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "і тоді Ви прибудете в місце призначення." #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Ви досягли місця призначення %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "Розв'язка" msgid "Exit" msgstr "Виїзд" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Позиція" msgid "Command" msgstr "Команда" msgid "Length" msgstr "Довжина" msgid "km" msgstr "км" msgid "m" msgstr "м" msgid "Time" msgstr "Час" msgid "Destination Length" msgstr "Відстань до місця призначення" msgid "Destination Time" msgstr "Час до місця призначення" msgid "Roadbook" msgstr "Атлас доріг" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Встановити як початкове положення" msgid "Set as destination" msgstr "Встановити як місце призначення" msgid "Add as bookmark" msgstr "Додати як закладку" #, c-format msgid "Point 0x%x 0x%x" msgstr "Точка 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Координати екрану: %d %d" #. 020 msgid "Andorra" msgstr "Андора" #. 784 msgid "United Arab Emirates" msgstr "Об’єднані Арабські Емірати" #. 004 msgid "Afghanistan" msgstr "Афганістан" #. 028 msgid "Antigua and Barbuda" msgstr "Антигуа і Барбуда" #. 660 msgid "Anguilla" msgstr "Ангілья" #. 008 msgid "Albania" msgstr "Албанія" #. 051 msgid "Armenia" msgstr "Вірменія" #. 530 msgid "Netherlands Antilles" msgstr "Антильські острови (Нідерланди)" #. 024 msgid "Angola" msgstr "Ангола" #. 010 msgid "Antarctica" msgstr "Антарктика" #. 032 msgid "Argentina" msgstr "Аргентина" #. 016 msgid "American Samoa" msgstr "Американське Самоа" #. 040 msgid "Austria" msgstr "Австрія" #. 036 msgid "Australia" msgstr "Австралія" #. 533 msgid "Aruba" msgstr "Аруба" #. 248 msgid "Aland Islands" msgstr "Аландські острови" #. 031 msgid "Azerbaijan" msgstr "Азербайджан" #. 070 msgid "Bosnia and Herzegovina" msgstr "Боснія і Герцеговина" #. 052 msgid "Barbados" msgstr "Барбадос" #. 050 msgid "Bangladesh" msgstr "Бангладеш" #. 056 msgid "Belgium" msgstr "Бельгія" #. 854 msgid "Burkina Faso" msgstr "Буркіна Фасо" #. 100 msgid "Bulgaria" msgstr "Болгарія" #. 048 msgid "Bahrain" msgstr "Бахрейн" #. 108 msgid "Burundi" msgstr "Бурунді" #. 204 msgid "Benin" msgstr "Бенін" #. 652 msgid "Saint Barthelemy" msgstr "Сен Бартельмі" #. 060 msgid "Bermuda" msgstr "Бермудські острови" #. 096 msgid "Brunei Darussalam" msgstr "Бруней-Даруссалам" #. 068 msgid "Bolivia" msgstr "Болівія" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Бразілія" #. 044 msgid "Bahamas" msgstr "Багамські острови" #. 064 msgid "Bhutan" msgstr "Бутан" #. 074 msgid "Bouvet Island" msgstr "Острів Буве" #. 072 msgid "Botswana" msgstr "Ботсвана" #. 112 msgid "Belarus" msgstr "Білорусь" #. 084 msgid "Belize" msgstr "Беліз" #. 124 msgid "Canada" msgstr "Канада" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Кокосові острови" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Конго, Демократична Республіка" #. 140 msgid "Central African Republic" msgstr "Центрально-Африканська Республіка" #. 178 msgid "Congo" msgstr "Конго" #. 756 msgid "Switzerland" msgstr "Швейцарія" #. 384 msgid "Cote d'Ivoire" msgstr "Кот д’Івуар" #. 184 msgid "Cook Islands" msgstr "Острови Кука" #. 152 msgid "Chile" msgstr "Чілі" #. 120 msgid "Cameroon" msgstr "Камерун" #. 156 msgid "China" msgstr "Китай" #. 170 msgid "Colombia" msgstr "Колумбія" #. 188 msgid "Costa Rica" msgstr "Коста Ріка" #. 192 msgid "Cuba" msgstr "Куба" #. 132 msgid "Cape Verde" msgstr "Кабо-Верде" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Острів Різдва" #. 196 msgid "Cyprus" msgstr "Кіпр" #. 203 msgid "Czech Republic" msgstr "Чеська Республіка" #. 276 msgid "Germany" msgstr "Німеччина" #. 262 msgid "Djibouti" msgstr "Джибуті" #. 208 msgid "Denmark" msgstr "Данія" #. 212 msgid "Dominica" msgstr "Домініка" #. 214 msgid "Dominican Republic" msgstr "Домініканська республіка" #. 012 msgid "Algeria" msgstr "Алжир" #. 218 msgid "Ecuador" msgstr "Еквадор" #. 233 msgid "Estonia" msgstr "Естонія" #. 818 msgid "Egypt" msgstr "Єгипет" #. 732 msgid "Western Sahara" msgstr "Західна Сахара" #. 232 msgid "Eritrea" msgstr "Еритрея" #. 724 msgid "Spain" msgstr "Іспанія" #. 231 msgid "Ethiopia" msgstr "Ефіопія" #. 246 msgid "Finland" msgstr "Фінляндія" #. 242 msgid "Fiji" msgstr "Фіджі" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендські острови (Британія)" #. 583 msgid "Micronesia, Federated States of" msgstr "Мікронезія, федеративні штати" #. 234 msgid "Faroe Islands" msgstr "Фарерські острови" #. 250 msgid "France" msgstr "Франція" #. 266 msgid "Gabon" msgstr "Габон" #. 826 msgid "United Kingdom" msgstr "Об’єднане Королівство (Великобританія)" #. 308 msgid "Grenada" msgstr "Гренада" #. 268 msgid "Georgia" msgstr "Грузія" #. 254 msgid "French Guiana" msgstr "Французька Гвіана" #. 831 msgid "Guernsey" msgstr "Гернсі" #. 288 msgid "Ghana" msgstr "Гана" #. 292 msgid "Gibraltar" msgstr "Гібралтар" #. 304 msgid "Greenland" msgstr "Гренландія" #. 270 msgid "Gambia" msgstr "Гамбія" #. 324 msgid "Guinea" msgstr "Гвінея" #. 312 msgid "Guadeloupe" msgstr "Гваделупа" #. 226 msgid "Equatorial Guinea" msgstr "Екваторіальна Гвінея" #. 300 msgid "Greece" msgstr "Греція" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "Південна Джорджія та Південні Сандвічеві Острови" #. 320 msgid "Guatemala" msgstr "Гватемала" #. 316 msgid "Guam" msgstr "Гуам" #. 624 msgid "Guinea-Bissau" msgstr "Гвінея-Біссау" #. 328 msgid "Guyana" msgstr "Гайана" #. 344 msgid "Hong Kong" msgstr "Гонконг" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Острів Херд і Острови Макдональд" #. 340 msgid "Honduras" msgstr "Гондурас" #. 191 msgid "Croatia" msgstr "Хорватія" #. 332 msgid "Haiti" msgstr "Гаїті" #. 348 msgid "Hungary" msgstr "Угорщина" #. 360 msgid "Indonesia" msgstr "Індонезія" #. 372 msgid "Ireland" msgstr "Ірландія" #. 376 msgid "Israel" msgstr "Ізраїль" #. 833 msgid "Isle of Man" msgstr "Острів Мен" #. 356 msgid "India" msgstr "Індія" #. 086 msgid "British Indian Ocean Territory" msgstr "Британські території у Індійському океані" #. 368 msgid "Iraq" msgstr "Ірак" #. 364 msgid "Iran, Islamic Republic of" msgstr "Іран, Ісламська Республіка" #. 352 msgid "Iceland" msgstr "Ісландія" #. 380 msgid "Italy" msgstr "Італія" #. 832 msgid "Jersey" msgstr "Джерсі" #. 388 msgid "Jamaica" msgstr "Ямайка" #. 400 msgid "Jordan" msgstr "Йорданія" #. 392 msgid "Japan" msgstr "Японія" #. 404 msgid "Kenya" msgstr "Кенія" #. 417 msgid "Kyrgyzstan" msgstr "Киргизстан" #. 116 msgid "Cambodia" msgstr "Камбоджа" #. 296 msgid "Kiribati" msgstr "Кірибаті" #. 174 msgid "Comoros" msgstr "Коморські острови" #. 659 msgid "Saint Kitts and Nevis" msgstr "Сент-Кіттс і Невіс" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Корея, Демократична Республіка" #. 410 msgid "Korea, Republic of" msgstr "Корея, Республіка" #. 414 msgid "Kuwait" msgstr "Кувейт" #. 136 msgid "Cayman Islands" msgstr "Кайманові острови" #. 398 msgid "Kazakhstan" msgstr "Казахстан" #. 418 msgid "Lao People's Democratic Republic" msgstr "Лаоська Народно-Демократична Республіка" #. 422 msgid "Lebanon" msgstr "Ліван" #. 662 msgid "Saint Lucia" msgstr "Санта Лючія" #. 438 msgid "Liechtenstein" msgstr "Ліхтенштейн" #. 144 msgid "Sri Lanka" msgstr "Шрі Ланка" #. 430 msgid "Liberia" msgstr "Ліберія" #. 426 msgid "Lesotho" msgstr "Лесото" #. 440 msgid "Lithuania" msgstr "Литва" #. 442 msgid "Luxembourg" msgstr "Люксембург" #. 428 msgid "Latvia" msgstr "Латвія" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Марокко" #. 492 msgid "Monaco" msgstr "Монако" #. 498 msgid "Moldova, Republic of" msgstr "Республіка Молдова" #. 499 msgid "Montenegro" msgstr "Чорногорія" #. 663 msgid "Saint Martin (French part)" msgstr "Сен-Мартен (французька частина)" #. 450 msgid "Madagascar" msgstr "Мадагаскар" #. 584 msgid "Marshall Islands" msgstr "Маршаллові Острови" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Македонія, колишня республіка Югославії" #. 466 msgid "Mali" msgstr "Малі" #. 104 msgid "Myanmar" msgstr "М'янма" #. 496 msgid "Mongolia" msgstr "Монголія" #. 446 msgid "Macao" msgstr "Макао" #. 580 msgid "Northern Mariana Islands" msgstr "Північні Маріанські Острови" #. 474 msgid "Martinique" msgstr "Мартиніка" #. 478 msgid "Mauritania" msgstr "Мавританія" #. 500 msgid "Montserrat" msgstr "Монтсеррат" #. 470 msgid "Malta" msgstr "Мальта" #. 480 msgid "Mauritius" msgstr "Маврикій" #. 462 msgid "Maldives" msgstr "Мальдиви" #. 454 msgid "Malawi" msgstr "Малаві" #. 484 msgid "Mexico" msgstr "Мексика" #. 458 msgid "Malaysia" msgstr "Малайзія" #. 508 msgid "Mozambique" msgstr "Мозамбік" #. 516 msgid "Namibia" msgstr "Намібія" #. 540 msgid "New Caledonia" msgstr "Нова Каледонія" #. 562 msgid "Niger" msgstr "Нігер" #. 574 msgid "Norfolk Island" msgstr "Норфолкські острови" #. 566 msgid "Nigeria" msgstr "Нігерія" #. 558 msgid "Nicaragua" msgstr "Нікарагуа" #. 528 msgid "Netherlands" msgstr "Нідерланди" #. 578 msgid "Norway" msgstr "Норвегія" #. 524 msgid "Nepal" msgstr "Непал" #. 520 msgid "Nauru" msgstr "Науру" #. 570 msgid "Niue" msgstr "Ніуе" #. 554 msgid "New Zealand" msgstr "Нова Зеландія" #. 512 msgid "Oman" msgstr "Оман" #. 591 msgid "Panama" msgstr "Панама" #. 604 msgid "Peru" msgstr "Перу" #. 258 msgid "French Polynesia" msgstr "Французька Полінезія" #. 598 msgid "Papua New Guinea" msgstr "Папуа Нова Гвінея" #. 608 msgid "Philippines" msgstr "Філіппіни" #. 586 msgid "Pakistan" msgstr "Пакистан" #. 616 msgid "Poland" msgstr "Польща" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Сен-П'єр і Мікелон" #. 612 msgid "Pitcairn" msgstr "Піткерн" #. 630 msgid "Puerto Rico" msgstr "Пуерто Ріко" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Окуповані Палестинські Території" #. 620 msgid "Portugal" msgstr "Португалія" #. 585 msgid "Palau" msgstr "Палау" #. 600 msgid "Paraguay" msgstr "Парагвай" #. 634 msgid "Qatar" msgstr "Катар" #. 638 msgid "Reunion" msgstr "Реюньйон" #. 642 msgid "Romania" msgstr "Румунія" #. 688 msgid "Serbia" msgstr "Сербія" #. 643 msgid "Russian Federation" msgstr "Російська Федерація" #. 646 msgid "Rwanda" msgstr "Руанда" #. 682 msgid "Saudi Arabia" msgstr "Саудівська Аравія" #. 090 msgid "Solomon Islands" msgstr "Соломонові острови" #. 690 msgid "Seychelles" msgstr "Сейшельські острови" #. 736 msgid "Sudan" msgstr "Судан" #. 752 msgid "Sweden" msgstr "Швеція" #. 702 msgid "Singapore" msgstr "Сингапур" #. 654 msgid "Saint Helena" msgstr "Острів Святої Єлени" #. 705 msgid "Slovenia" msgstr "Словенія" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Острови Свальбард та Ян-Маєн" #. 703 msgid "Slovakia" msgstr "Словаччина" #. 694 msgid "Sierra Leone" msgstr "Сьєрра-Леоне" #. 674 msgid "San Marino" msgstr "Сан Маріно" #. 686 msgid "Senegal" msgstr "Сенегал" #. 706 msgid "Somalia" msgstr "Сомалі" #. 740 msgid "Suriname" msgstr "Сурінам" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Сан-Томе і Принсипі" #. 222 msgid "El Salvador" msgstr "Сальвадор" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Сирійська Арабська Республіка" #. 748 msgid "Swaziland" msgstr "Свазиленд" #. 796 msgid "Turks and Caicos Islands" msgstr "Острови Теркс і Кайкос" #. 148 msgid "Chad" msgstr "Чад" #. 260 msgid "French Southern Territories" msgstr "Французькі Південні Території" #. 768 msgid "Togo" msgstr "Того" #. 764 msgid "Thailand" msgstr "Таїланд" #. 762 msgid "Tajikistan" msgstr "Таджикістан" #. 772 msgid "Tokelau" msgstr "Токелау" #. 626 msgid "Timor-Leste" msgstr "Східний Тімор" #. 795 msgid "Turkmenistan" msgstr "Туркменістан" #. 788 msgid "Tunisia" msgstr "Тунізія" #. 776 msgid "Tonga" msgstr "Тонга" #. 792 msgid "Turkey" msgstr "Туреччина" #. 780 msgid "Trinidad and Tobago" msgstr "Тринідад і Тобаго" #. 798 msgid "Tuvalu" msgstr "Тувалу" #. 158 msgid "Taiwan, Province of China" msgstr "Иайвань, провінція Китаю" #. 834 msgid "Tanzania, United Republic of" msgstr "Танзанія, Об’єднана Республіка" #. 804 msgid "Ukraine" msgstr "Україна" #. 800 msgid "Uganda" msgstr "Уганда" #. 581 msgid "United States Minor Outlying Islands" msgstr "Сполучені Штати Малих Віддалених Островів" #. 840 msgid "United States" msgstr "Сполучені Штати Америки" #. 858 msgid "Uruguay" msgstr "Уругвай" #. 860 msgid "Uzbekistan" msgstr "Узбекістан" #. 336 msgid "Holy See (Vatican City State)" msgstr "Святий Престіл (Ватикан, Місто-Держава)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Сент-Вінсент і Гренадини" #. 862 msgid "Venezuela" msgstr "Венесуела" #. 092 msgid "Virgin Islands, British" msgstr "Віргінські острови (Британія)" #. 850 msgid "Virgin Islands, U.S." msgstr "Віргінські острови (США)" #. 704 msgid "Viet Nam" msgstr "В’єтнам" #. 548 msgid "Vanuatu" msgstr "Вануату" #. 876 msgid "Wallis and Futuna" msgstr "Уолліс і Футуна" #. 882 msgid "Samoa" msgstr "Самоа" #. 887 msgid "Yemen" msgstr "Йемен" #. 175 msgid "Mayotte" msgstr "Майотта" #. 710 msgid "South Africa" msgstr "Південна Африка" #. 894 msgid "Zambia" msgstr "Замбія" #. 716 msgid "Zimbabwe" msgstr "Зімбабве" msgid "* Unknown, add is_in tags to those cities" msgstr "Новідомо, додайте is_in теґ до цих міст" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Точка на карті" msgid "Car" msgstr "Машина" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Країна" msgid "Postal" msgstr "Поштова адреса" msgid "Town" msgstr "Місто" msgid "District" msgstr "Округ" msgid "Street" msgstr "Вулиця" msgid "Number" msgstr "Номер" msgid "Enter Destination" msgstr "Введіть пункт призначення" msgid "Zip Code" msgstr "Поштовий індекс" msgid "City" msgstr "Місто" msgid "District/Township" msgstr "Округ/Селище" msgid "Map" msgstr "Карта" msgid "Bookmark" msgstr "Закладка" msgid "Destination" msgstr "Пункт призначення" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Показати" msgid "_Route" msgstr "Дорога" msgid "_Former Destinations" msgstr "Минулий пункт призначення" msgid "_Bookmarks" msgstr "Закладки" msgid "_Map" msgstr "Карта" msgid "_Layout" msgstr "Розкладка" msgid "_Projection" msgstr "Проекція" msgid "_Vehicle" msgstr "Транспортний засіб" msgid "Zoom_Out" msgstr "Зменшити" msgid "Decrease zoom level" msgstr "Зменшити масштаб" msgid "Zoom_In" msgstr "Збільшити" msgid "Increase zoom level" msgstr "Збільшити масштаб" msgid "_Recalculate" msgstr "Перерахувати" msgid "Redraw map" msgstr "Оновити мапу" msgid "_Info" msgstr "Інформація" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Відкриває діалог пошуку адреси" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Зупинити навігацію" msgid "Test" msgstr "Тест" msgid "_Quit" msgstr "_Вийти" msgid "Quit the application" msgstr "Вийти з програми" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Триматися дороги" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Переключає орієнтацію мапи на північ або по ходу руху" msgid "_Roadbook" msgstr "Атлас доріг" msgid "Show/hide route description" msgstr "Показати/сховати опис маршруту" msgid "_Autozoom" msgstr "Авторозмір" msgid "Enable/disable automatic zoom level changing" msgstr "Ввімкнути/вимкнути автоматичне масштабування" msgid "_Fullscreen" msgstr "На весь екран" msgid "Data" msgstr "Дата" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "Пн" msgid "NE" msgstr "ПнСх" msgid "E" msgstr "Сх" msgid "SE" msgstr "ПдСх" msgid "S" msgstr "Пд" msgid "SW" msgstr "ПдЗ" msgid "W" msgstr "З" msgid "NW" msgstr "ПнЗ" #. Android resource: @strings/no msgid "No" msgstr "№" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "Інший" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Дорога %4.0fкм %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Дорога 0000км 0+00:00 ETA" msgid "Help" msgstr "Допомога" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Показати в переглядачі" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Вулиці" msgid "House numbers" msgstr "Номери будинків" msgid "View Attributes" msgstr "Показати атрибути" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Інформація про об’єкти" msgid "View on map" msgstr "Показати на карті" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Вирізати закладку" msgid "Copy Bookmark" msgstr "Копіювати закладку" msgid "Rename Bookmark" msgstr "Перейменувати закладку" msgid "Paste Bookmark" msgstr "Вставити закладку" msgid "Delete Bookmark" msgstr "Вилучити закладку" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Закладки" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Додати папку закладок" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Вставити закладку" #, c-format msgid "Bookmark %s" msgstr "Закладка %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Показати статус супутника" msgid " Elevation " msgstr " Висота " msgid " Azimuth " msgstr " Азимут " msgid "Show NMEA Data" msgstr "Показати дані NMEA" msgid "car" msgstr "автомобіль" msgid "bike" msgstr "велосипед" msgid "pedestrian" msgstr "пішохід" #, c-format msgid "Current profile: %s" msgstr "Поточний профіль: %s" #, c-format msgid "Change profile to: %s" msgstr "Змінити профіль на: %s" msgid "Set as active" msgstr "Встановити активним" msgid "Show Satellite status" msgstr "Показати статус супутника" msgid "Show NMEA data" msgstr "Показати дані NMEA" msgid "Add Bookmark" msgstr "Додати закладку" msgid "Rename" msgstr "Перейменувати" msgid "About Navit" msgstr "Про Navit" #. Authors msgid "By" msgstr "від" #. Contributors msgid "And all the Navit Team" msgstr "Все про Navit Team" msgid "members and contributors." msgstr "члени та учасникі." msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Транспортний засіб" msgid "Rules" msgstr "Правила" msgid "Lock on road" msgstr "Триматися дороги" msgid "Northing" msgstr "Північніше" msgid "Map follows Vehicle" msgstr "Карта слідує за транспортним засобом" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Карти" msgid "Layout" msgstr "Розкладка" msgid "Height Profile" msgstr "Профіль висот" msgid "Route Description" msgstr "Опис маршруту" msgid "Show Locale" msgstr "Перевірити локалізацію" msgid "Former Destinations" msgstr "Минулий пункт призначення" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Повідомлення" msgid "Back" msgstr "Назад" msgid "Back to map" msgstr "Повернутися до карти" msgid "Main Menu" msgstr "Головне меню" msgid "House number" msgstr "Номер будинку" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Положення транспорту" msgid "Main menu" msgstr "Головне меню" msgid "" "Show\n" "Map" msgstr "" "Показати\n" "Карту" msgid "Settings" msgstr "Настройки" msgid "Tools" msgstr "Інструменти" msgid "Route" msgstr "Дорога" msgid "About" msgstr "Про програму..." msgid "Quit" msgstr "Вийти" msgid "Actions" msgstr "Дія" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "Зупинити\n" "Навігацію" msgid "Display" msgstr "Показати" msgid "Fullscreen" msgstr "На весь екран" msgid "Window Mode" msgstr "Режим вікна" msgid "Description" msgstr "Опис" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "кінь" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "тоді виїдьте з кільця через %1$s %2$s" navit-0.5.0+dfsg.1/po/ur.po.in000066400000000000000000001305501264204753600157410ustar00rootroot00000000000000# Urdu translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Michael von Glasow https://launchpad.net/~michael-vonglasow # Waqar Ahmed https://launchpad.net/~waqar-17a # asghar https://launchpad.net/~asghar144 msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-10-10 13:42+0000\n" "Last-Translator: Waqar Ahmed \n" "Language-Team: Urdu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "Language: ur\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "سورس ڈایرکٹری سے چلا ر ہے ہیں\n" msgid "first" msgstr "پہلا" msgid "second" msgstr "دوسرا" msgid "third" msgstr "تیسرا" msgid "fourth" msgstr "چوتھا" msgid "fifth" msgstr "پانچواں" msgid "sixth" msgstr "چھٹا" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "صفر سے خارج" msgid "first exit" msgstr "پہلا اخراج" msgid "second exit" msgstr "دوسرا اخراج" msgid "third exit" msgstr "تیسرا اخراج" msgid "fourth exit" msgstr "چوتھا اخراج" msgid "fifth exit" msgstr "پانچواں اخراج" msgid "sixth exit" msgstr "چھٹا اخراج" #, c-format msgid "%d meters" msgstr "%d میٹر" #, c-format msgid "in %d meters" msgstr "%d میٹر میں" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d کلومیٹر" #, c-format msgid "in %d.%d kilometers" msgstr "%d.%d کلومیٹر میں" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%sپر %s" msgid "When possible, please turn around" msgstr "جب ممکن ہو گھومیں" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "دایئں" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "بایئں" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "آسانی سے " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "سختی سے " msgid "Set as destination" msgstr "بطور منزل انتخاب" msgid "Enter Destination" msgstr "منزل داخل کریں" msgid "Enable/disable automatic zoom level changing" msgstr "فعال/غیر فعال کریں زوم کی خود کار تبدیلی" msgid " Elevation " msgstr " ارتفاع " #, c-format msgid "Current profile: %s" msgstr "موجودہ پروفائل: %s" msgid "Add Bookmark" msgstr "بک مارک میں شامل" #, c-format msgid "setting '%s' to '%s'\n" msgstr "ترتیب '%s' سے '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "صفر سے" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "ایک کلومیٹر" msgstr[1] "%d کلومیٹر" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "ایک کلومیٹر میں" msgstr[1] "%d کلومیٹر میں" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "ڈھلان میں" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%sمیں سے %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%sمیں سے %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%sمیں سے %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%sمیں سے %s%s%s" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "%s تک سڑک کے مطابق جایئں" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "گول چوراہے کو %1$s %2$s پے چھوڑ دیں" msgid "soon" msgstr "جلد ہی" msgid "now" msgstr "اب" msgid "then" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "سڑک تک %1$s سے %2$s" #, c-format msgid "after %i roads" msgstr "%i سڑکوں کے بعد" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%1$s%2$s %3$s%4$s گومیں" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "پھر آپ اپنی منزل پہ پہنچ جایئں گے" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "آپ اپنی منزل %s پے پہنچ کئے ہیں" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "اخراج" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "مقام" msgid "Command" msgstr "کمانڈ" msgid "Length" msgstr "لمبایئ" msgid "km" msgstr "کلومیٹر" msgid "m" msgstr "میٹر" msgid "Time" msgstr "وقت" msgid "Destination Length" msgstr "منزل تک دوری" msgid "Destination Time" msgstr "منزل تک وقت" msgid "Roadbook" msgstr "روڈ بک" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "بطور موجودہ مقام انتخاب" msgid "Add as bookmark" msgstr "بک مارک میں محفوظ کریں" #, c-format msgid "Point 0x%x 0x%x" msgstr "0x%x 0x%x مقام" #, c-format msgid "Screen coord : %d %d" msgstr "سکرین کورڈینیٹ : %d %d" #. 020 msgid "Andorra" msgstr "اندوررا" #. 784 msgid "United Arab Emirates" msgstr "متحدہ عرب امارات" #. 004 msgid "Afghanistan" msgstr "افغانستان" #. 028 msgid "Antigua and Barbuda" msgstr "انٹگووا اور باربوڈا" #. 660 msgid "Anguilla" msgstr "انگویلا" #. 008 msgid "Albania" msgstr "البانیا" #. 051 msgid "Armenia" msgstr "ارمینیا" #. 530 msgid "Netherlands Antilles" msgstr "نیدرلینڈز انٹیلس" #. 024 msgid "Angola" msgstr "انگولا" #. 010 msgid "Antarctica" msgstr "انٹارٹیکا" #. 032 msgid "Argentina" msgstr "ارجنٹینا" #. 016 msgid "American Samoa" msgstr "امیریکن ساموا" #. 040 msgid "Austria" msgstr "آسٹریا" #. 036 msgid "Australia" msgstr "آسٹریلیا" #. 533 msgid "Aruba" msgstr "آروبا" #. 248 msgid "Aland Islands" msgstr "آلینڈ آئسلینڈ" #. 031 msgid "Azerbaijan" msgstr "آذر بائجان" #. 070 msgid "Bosnia and Herzegovina" msgstr "بوسنیا حرذےگوینیا" #. 052 msgid "Barbados" msgstr "باربادوس" #. 050 msgid "Bangladesh" msgstr "بنگلادیش" #. 056 msgid "Belgium" msgstr "بلجیئم" #. 854 msgid "Burkina Faso" msgstr "برکینا فازو" #. 100 msgid "Bulgaria" msgstr "بلغاریہ" #. 048 msgid "Bahrain" msgstr "بحرین" #. 108 msgid "Burundi" msgstr "برنڈی" #. 204 msgid "Benin" msgstr "بینن" #. 652 msgid "Saint Barthelemy" msgstr "سینٹ باتھیلیمی" #. 060 msgid "Bermuda" msgstr "برمودا" #. 096 msgid "Brunei Darussalam" msgstr "برونائی دارالسلام" #. 068 msgid "Bolivia" msgstr "بولیویا" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "برازیل" #. 044 msgid "Bahamas" msgstr "بھاماس" #. 064 msgid "Bhutan" msgstr "بھوٹان" #. 074 msgid "Bouvet Island" msgstr "بووٹ آئیسلیڈ" #. 072 msgid "Botswana" msgstr "بوٹسوانا" #. 112 msgid "Belarus" msgstr "بیلارس" #. 084 msgid "Belize" msgstr "بلیذ" #. 124 msgid "Canada" msgstr "کینیڈا" #. 166 msgid "Cocos (Keeling) Islands" msgstr "کوکوس آئیسلینڈز" #. 180 msgid "Congo, Democratic Republic of the" msgstr "کونگو ڈیموکریٹک" #. 140 msgid "Central African Republic" msgstr "مرکزی جمہوریہ افریقہ" #. 178 msgid "Congo" msgstr "کونگو" #. 756 msgid "Switzerland" msgstr "سوئیزرلینڈ" #. 384 msgid "Cote d'Ivoire" msgstr "کوٹے ڈلوویر" #. 184 msgid "Cook Islands" msgstr "کک آئیسلینڈ" #. 152 msgid "Chile" msgstr "چیلی" #. 120 msgid "Cameroon" msgstr "کامیرون" #. 156 msgid "China" msgstr "چین" #. 170 msgid "Colombia" msgstr "کولمبیا" #. 188 msgid "Costa Rica" msgstr "کوسٹا ریکا" #. 192 msgid "Cuba" msgstr "کیوبا" #. 132 msgid "Cape Verde" msgstr "کاپے ویردے" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "کرسمس آئیسلینڈ" #. 196 msgid "Cyprus" msgstr "سائپرس" #. 203 msgid "Czech Republic" msgstr "چیک ریپبلک" #. 276 msgid "Germany" msgstr "جرمن" #. 262 msgid "Djibouti" msgstr "ڈیجیبوٹی" #. 208 msgid "Denmark" msgstr "ڈنمارک" #. 212 msgid "Dominica" msgstr "ڈومینیکا" #. 214 msgid "Dominican Republic" msgstr "ڈومینیکن ریپبلک" #. 012 msgid "Algeria" msgstr "الجیریا" #. 218 msgid "Ecuador" msgstr "ایکواڈور" #. 233 msgid "Estonia" msgstr "استونیا" #. 818 msgid "Egypt" msgstr "مصر" #. 732 msgid "Western Sahara" msgstr "مغربی سحارا" #. 232 msgid "Eritrea" msgstr "اریٹیریا" #. 724 msgid "Spain" msgstr "سپین" #. 231 msgid "Ethiopia" msgstr "ایتھوپیا" #. 246 msgid "Finland" msgstr "فنلینڈ" #. 242 msgid "Fiji" msgstr "فیجی" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "فیکلینڈ آئیسلینڈ" #. 583 msgid "Micronesia, Federated States of" msgstr "میکرونیسیا فیڈرل سٹیٹ" #. 234 msgid "Faroe Islands" msgstr "فاروے آئیسلینڈز" #. 250 msgid "France" msgstr "فرانس" #. 266 msgid "Gabon" msgstr "گابون" #. 826 msgid "United Kingdom" msgstr "برطانیا" #. 308 msgid "Grenada" msgstr "گریناڈا" #. 268 msgid "Georgia" msgstr "جورجیا" #. 254 msgid "French Guiana" msgstr "فرینچ گویانا" #. 831 msgid "Guernsey" msgstr "گویرنسے" #. 288 msgid "Ghana" msgstr "گھانا" #. 292 msgid "Gibraltar" msgstr "جبرالٹر" #. 304 msgid "Greenland" msgstr "گرینلینڈ" #. 270 msgid "Gambia" msgstr "گامبیا" #. 324 msgid "Guinea" msgstr "گوینیا" #. 312 msgid "Guadeloupe" msgstr "گوادیلوپے" #. 226 msgid "Equatorial Guinea" msgstr "ایکواٹوریال گوینا" #. 300 msgid "Greece" msgstr "یونان" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "جنوبی جورجیا اور جنوبی سنڈوچ آئیسلینڈ" #. 320 msgid "Guatemala" msgstr "گوئٹیمالا" #. 316 msgid "Guam" msgstr "گوام" #. 624 msgid "Guinea-Bissau" msgstr "گواینیا-بیسساو" #. 328 msgid "Guyana" msgstr "گویانا" #. 344 msgid "Hong Kong" msgstr "ہانگ کانگ" #. 334 msgid "Heard Island and McDonald Islands" msgstr "ھیرڈ آئیسلینڈ اور میکڈونلڈ آئیسلینڈس" #. 340 msgid "Honduras" msgstr "حونڈورس" #. 191 msgid "Croatia" msgstr "کروشیا" #. 332 msgid "Haiti" msgstr "حایٹی" #. 348 msgid "Hungary" msgstr "ھنگری" #. 360 msgid "Indonesia" msgstr "انڈونیشیا" #. 372 msgid "Ireland" msgstr "آئرلینڈ" #. 376 msgid "Israel" msgstr "اسرائیل" #. 833 msgid "Isle of Man" msgstr "ایسلے آف مین" #. 356 msgid "India" msgstr "ہندوستان" #. 086 msgid "British Indian Ocean Territory" msgstr "برٹش انڈین اوشین ٹریٹوری" #. 368 msgid "Iraq" msgstr "عراق" #. 364 msgid "Iran, Islamic Republic of" msgstr "ایران ، اسلامی جمہوریہ" #. 352 msgid "Iceland" msgstr "آئیسلینڈ" #. 380 msgid "Italy" msgstr "اٹلی" #. 832 msgid "Jersey" msgstr "جرسی" #. 388 msgid "Jamaica" msgstr "جامائیکا" #. 400 msgid "Jordan" msgstr "اردن" #. 392 msgid "Japan" msgstr "جاپان" #. 404 msgid "Kenya" msgstr "کینیا" #. 417 msgid "Kyrgyzstan" msgstr "کرگزستان" #. 116 msgid "Cambodia" msgstr "کمبوڈیا" #. 296 msgid "Kiribati" msgstr "کیریباٹی" #. 174 msgid "Comoros" msgstr "کوموروس" #. 659 msgid "Saint Kitts and Nevis" msgstr "سینٹ کٹس اور نوس" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "کوریا ، ڈیموکریٹک" #. 410 msgid "Korea, Republic of" msgstr "کوریا، عوامی" #. 414 msgid "Kuwait" msgstr "کویت" #. 136 msgid "Cayman Islands" msgstr "کایمین آئیسلینڈز" #. 398 msgid "Kazakhstan" msgstr "کزاکستان" #. 418 msgid "Lao People's Democratic Republic" msgstr "لاو عوامی جمہوری ڈیموکریٹک" #. 422 msgid "Lebanon" msgstr "لبنان" #. 662 msgid "Saint Lucia" msgstr "سینٹ لوچیا" #. 438 msgid "Liechtenstein" msgstr "لیخٹنسخٹین" #. 144 msgid "Sri Lanka" msgstr "سری لنکا" #. 430 msgid "Liberia" msgstr "لیبیریا" #. 426 msgid "Lesotho" msgstr "لیسودو" #. 440 msgid "Lithuania" msgstr "لیتھوانیا" #. 442 msgid "Luxembourg" msgstr "لیسمبرگ" #. 428 msgid "Latvia" msgstr "لاتویا" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "مراکش" #. 492 msgid "Monaco" msgstr "موناکو" #. 498 msgid "Moldova, Republic of" msgstr "مولدوا، عوامی" #. 499 msgid "Montenegro" msgstr "مونٹے نیگرو" #. 663 msgid "Saint Martin (French part)" msgstr "سینٹ مارٹن فرانسیسی حصہ" #. 450 msgid "Madagascar" msgstr "ماڈاگاسکر" #. 584 msgid "Marshall Islands" msgstr "مارشل آئیسلینڈ" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "ماچیدونیا" #. 466 msgid "Mali" msgstr "مالی" #. 104 msgid "Myanmar" msgstr "میانمار" #. 496 msgid "Mongolia" msgstr "مونگولیا" #. 446 msgid "Macao" msgstr "ماکاؤ" #. 580 msgid "Northern Mariana Islands" msgstr "شمالی ماریانا آئیسلینڈز" #. 474 msgid "Martinique" msgstr "مارٹینیقئے" #. 478 msgid "Mauritania" msgstr "ماوریتانیا" #. 500 msgid "Montserrat" msgstr "ماؤنٹسیراٹ" #. 470 msgid "Malta" msgstr "مالٹا" #. 480 msgid "Mauritius" msgstr "ماؤریٹیوس" #. 462 msgid "Maldives" msgstr "مالدیپ" #. 454 msgid "Malawi" msgstr "مالاوی" #. 484 msgid "Mexico" msgstr "میکسیکو" #. 458 msgid "Malaysia" msgstr "مالائیشیا" #. 508 msgid "Mozambique" msgstr "موزمبیک" #. 516 msgid "Namibia" msgstr "نمیبیا" #. 540 msgid "New Caledonia" msgstr "نیو کالیدونیا" #. 562 msgid "Niger" msgstr "نیگر" #. 574 msgid "Norfolk Island" msgstr "نورفوک آئیسلینڈ" #. 566 msgid "Nigeria" msgstr "نائجیریا" #. 558 msgid "Nicaragua" msgstr "نکاراگوا" #. 528 msgid "Netherlands" msgstr "ہالینڈ" #. 578 msgid "Norway" msgstr "ناروے" #. 524 msgid "Nepal" msgstr "نیپال" #. 520 msgid "Nauru" msgstr "ناؤرو" #. 570 msgid "Niue" msgstr "نیوئے" #. 554 msgid "New Zealand" msgstr "نیوزیلینڈ" #. 512 msgid "Oman" msgstr "عمان" #. 591 msgid "Panama" msgstr "پاناما" #. 604 msgid "Peru" msgstr "پیرو" #. 258 msgid "French Polynesia" msgstr "فرنچ پولینسیا" #. 598 msgid "Papua New Guinea" msgstr "پاپوا نیو گویبیا" #. 608 msgid "Philippines" msgstr "فلپائن" #. 586 msgid "Pakistan" msgstr "پاکستان" #. 616 msgid "Poland" msgstr "پولینڈ" #. 666 msgid "Saint Pierre and Miquelon" msgstr "سینٹ پیعرر اور میقوئےلون" #. 612 msgid "Pitcairn" msgstr "پٹکائرن" #. 630 msgid "Puerto Rico" msgstr "پوئرٹو ریکو" #. 275 msgid "Palestinian Territory, Occupied" msgstr "فلسطین" #. 620 msgid "Portugal" msgstr "پرتگال" #. 585 msgid "Palau" msgstr "پالاؤ" #. 600 msgid "Paraguay" msgstr "پیراگوائے" #. 634 msgid "Qatar" msgstr "قطر" #. 638 msgid "Reunion" msgstr "ریونین" #. 642 msgid "Romania" msgstr "رومانیا" #. 688 msgid "Serbia" msgstr "سربیا" #. 643 msgid "Russian Federation" msgstr "روس" #. 646 msgid "Rwanda" msgstr "روانڈا" #. 682 msgid "Saudi Arabia" msgstr "سعودی عرب" #. 090 msgid "Solomon Islands" msgstr "سولومون آئیسلینڈز" #. 690 msgid "Seychelles" msgstr "سعیچیلز" #. 736 msgid "Sudan" msgstr "سوڈان" #. 752 msgid "Sweden" msgstr "سویڈن" #. 702 msgid "Singapore" msgstr "سنگاپور" #. 654 msgid "Saint Helena" msgstr "سیٹ حیلنا" #. 705 msgid "Slovenia" msgstr "سلوینیا" #. 744 msgid "Svalbard and Jan Mayen" msgstr "سویلبرڈ اور جان میان" #. 703 msgid "Slovakia" msgstr "سلواکیہ" #. 694 msgid "Sierra Leone" msgstr "سیعرا لیعون" #. 674 msgid "San Marino" msgstr "سان مارینو" #. 686 msgid "Senegal" msgstr "سینیگال" #. 706 msgid "Somalia" msgstr "صومالیہ" #. 740 msgid "Suriname" msgstr "سرینیم" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "ساو ٹوم اور پرینسپ" #. 222 msgid "El Salvador" msgstr "ال سالواڈور" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "ال سالواڈور" #. 748 msgid "Swaziland" msgstr "سوازیلینڈ" #. 796 msgid "Turks and Caicos Islands" msgstr "ٹرکس اور کایکس آئیسلینڈز" #. 148 msgid "Chad" msgstr "چاڈ" #. 260 msgid "French Southern Territories" msgstr "فرینچ جنوبی علاقہ جات" #. 768 msgid "Togo" msgstr "ٹوگو" #. 764 msgid "Thailand" msgstr "تھائی لینڈ" #. 762 msgid "Tajikistan" msgstr "تاجکستان" #. 772 msgid "Tokelau" msgstr "ٹوکلاؤ" #. 626 msgid "Timor-Leste" msgstr "ٹیمور-لیسٹے" #. 795 msgid "Turkmenistan" msgstr "ترکمانستان" #. 788 msgid "Tunisia" msgstr "تونس" #. 776 msgid "Tonga" msgstr "ٹونگا" #. 792 msgid "Turkey" msgstr "ترکی" #. 780 msgid "Trinidad and Tobago" msgstr "ٹرینیداد اور ٹوباگو" #. 798 msgid "Tuvalu" msgstr "ٹوالا" #. 158 msgid "Taiwan, Province of China" msgstr "تائیوان چائینہ کا صوبہ" #. 834 msgid "Tanzania, United Republic of" msgstr "تنزانیہ، عوامی متحدہ" #. 804 msgid "Ukraine" msgstr "یوکرائن" #. 800 msgid "Uganda" msgstr "یوگنڈا" #. 581 msgid "United States Minor Outlying Islands" msgstr "یونائیٹد سٹیٹ مائنر آوٹلیئنگ آئیسلینڈز" #. 840 msgid "United States" msgstr "امریکہ" #. 858 msgid "Uruguay" msgstr "اوروگوائے" #. 860 msgid "Uzbekistan" msgstr "ازبکستان" #. 336 msgid "Holy See (Vatican City State)" msgstr "مقدس شہر (ویٹیکن سٹی)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "سینٹ ونسنٹ اور گریناڈنز" #. 862 msgid "Venezuela" msgstr "ونزویلا" #. 092 msgid "Virgin Islands, British" msgstr "ورجن آئیسلینڈ، برطانیہ" #. 850 msgid "Virgin Islands, U.S." msgstr "ورجن آئیسلینڈ، امریکہ" #. 704 msgid "Viet Nam" msgstr "ویت نام" #. 548 msgid "Vanuatu" msgstr "وانوعاتو" #. 876 msgid "Wallis and Futuna" msgstr "والیز اور فوٹونا" #. 882 msgid "Samoa" msgstr "ساموا" #. 887 msgid "Yemen" msgstr "یمن" #. 175 msgid "Mayotte" msgstr "مائیوٹے" #. 710 msgid "South Africa" msgstr "جنوبی افریقہ" #. 894 msgid "Zambia" msgstr "زمبیا" #. 716 msgid "Zimbabwe" msgstr "زمبابوے" msgid "* Unknown, add is_in tags to those cities" msgstr "* نامعلوم شہروں کیلیئے" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "نقشہ کا نقطہ" msgid "Car" msgstr "کار" msgid "Iso2" msgstr "اسو 2" msgid "Iso3" msgstr "اسو 3" msgid "Country" msgstr "ملک" msgid "Postal" msgstr "ڈاک" msgid "Town" msgstr "ٹاؤن" msgid "District" msgstr "ضلع" msgid "Street" msgstr "سڑک" msgid "Number" msgstr "نمبر" msgid "Zip Code" msgstr "زپ کوڈ" msgid "City" msgstr "شہر" msgid "District/Township" msgstr "ضلع/قصبہ" msgid "Map" msgstr "نقشہ" msgid "Bookmark" msgstr "بک مارک" msgid "Destination" msgstr "منزل" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "ڈسپلئے" msgid "_Route" msgstr "راستہ" msgid "_Former Destinations" msgstr "سابقہ منازل" msgid "_Bookmarks" msgstr "بک مارکس" msgid "_Map" msgstr "نقشہ" msgid "_Layout" msgstr "بناوٹ" msgid "_Projection" msgstr "پروجیکشن" msgid "_Vehicle" msgstr "گاڑی" msgid "Zoom_Out" msgstr "چھوٹا کریں" msgid "Decrease zoom level" msgstr "زوم لیول کم کریں" msgid "Zoom_In" msgstr "بڑا کریں" msgid "Increase zoom level" msgstr "زوم لیول بڑہائیں" msgid "_Recalculate" msgstr "دوبارہ حساب" msgid "Redraw map" msgstr "نقشہ دوبارہ بنائیں" msgid "_Info" msgstr "معلومات" msgid "Set _destination" msgstr "منزل منتخب کریں" msgid "Opens address search dialog" msgstr "پتہ تلاش والا خانہ کھولیں" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "نیویگیشن بند کریں" msgid "Test" msgstr "ٹیسٹ" msgid "_Quit" msgstr "_بند" msgid "Quit the application" msgstr "پروگرام بند کریں" msgid "Show position _cursor" msgstr "کرسر کا مقام دکھائیں" msgid "_Lock on Road" msgstr "سڑک پر گرفت" msgid "_Keep orientation to the North" msgstr "قطب نما کو شمال کی طرف رکھیں" msgid "Switches map orientation to the north or the vehicle" msgstr "قطب نما کو شمال یا گاڑی کی طرف کریں" msgid "_Roadbook" msgstr "روڈ بک" msgid "Show/hide route description" msgstr "دکھیں/نہ دیکھیں سفر کی تفصیل" msgid "_Autozoom" msgstr "خودکار زوم" msgid "_Fullscreen" msgstr "پوری سکرین" msgid "Data" msgstr "ڈیٹا" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "شمال" msgid "NE" msgstr "شمال مشرق" msgid "E" msgstr "مشرق" msgid "SE" msgstr "جنوب مشرق" msgid "S" msgstr "جنوب" msgid "SW" msgstr "جنوب مغرب" msgid "W" msgstr "مغرب" msgid "NW" msgstr "شمال مغرب" #. Android resource: @strings/no msgid "No" msgstr "نہیں" msgid "2D" msgstr "2ڈی" msgid "3D" msgstr "3ڈی" msgid "OT" msgstr "او ٹی" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Route %4.0fكلومیٹر %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "سفر 0000 کلومیٹر 0+00:00 ETA" msgid "Help" msgstr "مدد" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "براؤزر میں دیکھیں" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "سڑکیں" msgid "House numbers" msgstr "مکان نمبر" msgid "View Attributes" msgstr "خصوصیات دیکھں" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "پسندیدہ جگہیں" msgid "View on map" msgstr "نقشہ پہ دیکھیں" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "بک مارک کو کاٹیں" msgid "Copy Bookmark" msgstr "بک مارک کو کاپی کریں" msgid "Rename Bookmark" msgstr "بک مارک کا نام تبدیل کریں" msgid "Paste Bookmark" msgstr "بک مارک پیسٹ کریں" msgid "Delete Bookmark" msgstr "ڈیلیٹ بک مارک" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "بک مارکس" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "بک مارک فولڈر میں شامل" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "بک مارک پیسٹ کریں" #, c-format msgid "Bookmark %s" msgstr "بک مارک %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "سٹلائٹ کی حالت دیکھیں" msgid " Azimuth " msgstr " سمت " msgid "Show NMEA Data" msgstr "NMEA ڈیٹا دیکھیں" msgid "car" msgstr "کار" msgid "bike" msgstr "سائیکل" msgid "pedestrian" msgstr "پیدل" #, c-format msgid "Change profile to: %s" msgstr "پروفائل کو :%s میں بدلیں" msgid "Set as active" msgstr "فعال کریں" msgid "Show Satellite status" msgstr "سٹلائٹ کی حالت دیکھیں" msgid "Show NMEA data" msgstr "NMEA ڈیٹا دیکھیں" msgid "Rename" msgstr "تبدیل نام" msgid "About Navit" msgstr "ناوٹ کے مطعلق" #. Authors msgid "By" msgstr "بنانے والے" #. Contributors msgid "And all the Navit Team" msgstr "اور ناوٹ کی ساری ٹیم" msgid "members and contributors." msgstr "ممبر اور حصہ دار" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "گاڑی" msgid "Rules" msgstr "قوانین" msgid "Lock on road" msgstr "سڑک پہ مرکوز" msgid "Northing" msgstr "شمالی سمت" msgid "Map follows Vehicle" msgstr "نقشہ گاڑی کا تعاقب کرے" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "نقشے" msgid "Layout" msgstr "بناوٹ" msgid "Height Profile" msgstr "اونچائی کی پروفائل" msgid "Route Description" msgstr "سفر کی تفصیل" msgid "Show Locale" msgstr "مقامی دیکھیں" msgid "Former Destinations" msgstr "سابقہ منازل" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "پیغام" msgid "Back" msgstr "واپس" msgid "Back to map" msgstr "نقشہ پہ واپس" msgid "Main Menu" msgstr "مین مینو" msgid "House number" msgstr "مکان نمبر" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "گاڑی کی حالت" msgid "Main menu" msgstr "مین مینو" msgid "" "Show\n" "Map" msgstr "" "دیکھیں\n" "نقشہ" msgid "Settings" msgstr "تراتیب" msgid "Tools" msgstr "ہتھیار" msgid "Route" msgstr "راستہ" msgid "About" msgstr "متعلق" msgid "Quit" msgstr "بند" msgid "Actions" msgstr "ایکشن" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "روکیں\n" "نیویگیشن" msgid "Display" msgstr "ڈسپلئے" msgid "Fullscreen" msgstr "پوری سکرین" msgid "Window Mode" msgstr "ونڈو موڈ" msgid "Description" msgstr "تفصیل" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "گھوڑا" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "پھر گول چوراہے کو %1$s %2$s پے چھوڑ دیں" navit-0.5.0+dfsg.1/po/vi.po.in000066400000000000000000001240501264204753600157270ustar00rootroot00000000000000# Vietnamese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Hoàng Đỗ Can Trực https://launchpad.net/~truc294 # Le Viet Thanh https://launchpad.net/~lethanhx2k # Michael von Glasow https://launchpad.net/~michael-vonglasow # Saki https://launchpad.net/~nhkhoi msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:01+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: vi\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "Đang chạy từ thư mục nguồn\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "thiết lập '%s' đến '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "Thứ 0" msgid "first" msgstr "thứ nhắt" msgid "second" msgstr "giây" msgid "third" msgstr "thứ ba" msgid "fourth" msgstr "thứ tư" msgid "fifth" msgstr "thứ năm" msgid "sixth" msgstr "thứ sáu" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "Thoát thứ 0" msgid "first exit" msgstr "Thoát thứ 1" msgid "second exit" msgstr "Thoát thứ 2" msgid "third exit" msgstr "Thoát thứ 3" msgid "fourth exit" msgstr "Thoát thứ 4" msgid "fifth exit" msgstr "Thoát thứ 5" msgid "sixth exit" msgstr "Thoát thứ 6" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d mét" #, c-format msgid "in %d meters" msgstr "trong %d mét" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d cây số" #, c-format msgid "in %d.%d kilometers" msgstr "trong %d.%d km" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d km" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "trong %d km" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "vào dốc" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%svào %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%svào %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%svào %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%svào %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%svào %s" msgid "When possible, please turn around" msgstr "Khi có thể, hãy quay vòng" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "Đường tiếp theo %s" msgid "Enter the roundabout soon" msgstr "Sắp tới chỗ vòng" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "Ra khỏi đường vòng tại %1$s %2$s" msgid "soon" msgstr "ngay" msgid "now" msgstr "bây giờ" msgid "then" msgstr "sau đó" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "phải" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "trái" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "dễ dàng " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "mạnh " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "Có %1$s đường đến %2$s" #, c-format msgid "after %i roads" msgstr "sau %i đường" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "Rẽ %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "sau đó bạn tới điểm đích" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "Bạn vừa tới điểm đích: %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "Thoát" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "Vị trí" msgid "Command" msgstr "Lệnh" msgid "Length" msgstr "Chiều dài" msgid "km" msgstr "km" msgid "m" msgstr "m" msgid "Time" msgstr "Thời gian" msgid "Destination Length" msgstr "Chiều dài tới" msgid "Destination Time" msgstr "Thời gian tới" msgid "Roadbook" msgstr "Roadbook" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "Thiết lập thành vị trí" msgid "Set as destination" msgstr "Thiết lập thành điểm tới" msgid "Add as bookmark" msgstr "Thêm thành Bookmark" #, c-format msgid "Point 0x%x 0x%x" msgstr "Điểm 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "Tọa độ : %d %d" #. 020 msgid "Andorra" msgstr "Andorra" #. 784 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. 004 msgid "Afghanistan" msgstr "Afghanistan" #. 028 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. 660 msgid "Anguilla" msgstr "Anguilla" #. 008 msgid "Albania" msgstr "Albania" #. 051 msgid "Armenia" msgstr "Armenia" #. 530 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. 024 msgid "Angola" msgstr "Angola" #. 010 msgid "Antarctica" msgstr "Antarctica" #. 032 msgid "Argentina" msgstr "Argentina" #. 016 msgid "American Samoa" msgstr "American Samoa" #. 040 msgid "Austria" msgstr "Austria" #. 036 msgid "Australia" msgstr "Australia" #. 533 msgid "Aruba" msgstr "Aruba" #. 248 msgid "Aland Islands" msgstr "Aland Islands" #. 031 msgid "Azerbaijan" msgstr "Azerbaijan" #. 070 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. 052 msgid "Barbados" msgstr "Barbados" #. 050 msgid "Bangladesh" msgstr "Bangladesh" #. 056 msgid "Belgium" msgstr "Bỉ" #. 854 msgid "Burkina Faso" msgstr "Burkina Faso" #. 100 msgid "Bulgaria" msgstr "Bulgaria" #. 048 msgid "Bahrain" msgstr "Bahrain" #. 108 msgid "Burundi" msgstr "Burundi" #. 204 msgid "Benin" msgstr "Benin" #. 652 msgid "Saint Barthelemy" msgstr "Saint Barthelemy" #. 060 msgid "Bermuda" msgstr "Bermuda" #. 096 msgid "Brunei Darussalam" msgstr "Bru nây" #. 068 msgid "Bolivia" msgstr "Bolivia" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "Brazil" #. 044 msgid "Bahamas" msgstr "Bahamas" #. 064 msgid "Bhutan" msgstr "Bhutan" #. 074 msgid "Bouvet Island" msgstr "Đảo Bu-vê" #. 072 msgid "Botswana" msgstr "Botswana" #. 112 msgid "Belarus" msgstr "Belarus" #. 084 msgid "Belize" msgstr "Belize" #. 124 msgid "Canada" msgstr "Canada" #. 166 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. 180 msgid "Congo, Democratic Republic of the" msgstr "Cộng Hoà Dân Chủ Công-gô" #. 140 msgid "Central African Republic" msgstr "Cộng Hoà Trung Phi" #. 178 msgid "Congo" msgstr "Công-gô" #. 756 msgid "Switzerland" msgstr "Thụy Sĩ" #. 384 msgid "Cote d'Ivoire" msgstr "Bờ biển ngà" #. 184 msgid "Cook Islands" msgstr "Quần đảo Cook" #. 152 msgid "Chile" msgstr "Chile" #. 120 msgid "Cameroon" msgstr "Cameroon" #. 156 msgid "China" msgstr "Trung Quốc" #. 170 msgid "Colombia" msgstr "Colombia" #. 188 msgid "Costa Rica" msgstr "Costa Rica" #. 192 msgid "Cuba" msgstr "Cuba" #. 132 msgid "Cape Verde" msgstr "Cape Verde" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "Đảo Christmas" #. 196 msgid "Cyprus" msgstr "Đảo Síp" #. 203 msgid "Czech Republic" msgstr "Cộng hoà Séc" #. 276 msgid "Germany" msgstr "Đức" #. 262 msgid "Djibouti" msgstr "Djibouti" #. 208 msgid "Denmark" msgstr "Đan Mạch" #. 212 msgid "Dominica" msgstr "Dominica" #. 214 msgid "Dominican Republic" msgstr "Dominican Republic" #. 012 msgid "Algeria" msgstr "Algeria" #. 218 msgid "Ecuador" msgstr "Ecuador" #. 233 msgid "Estonia" msgstr "Estonia" #. 818 msgid "Egypt" msgstr "Ai Cập" #. 732 msgid "Western Sahara" msgstr "Tây Sahara" #. 232 msgid "Eritrea" msgstr "Eritrea" #. 724 msgid "Spain" msgstr "Tây Ban Nha" #. 231 msgid "Ethiopia" msgstr "Ethiopia" #. 246 msgid "Finland" msgstr "Phần Lan" #. 242 msgid "Fiji" msgstr "Fiji" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. 583 msgid "Micronesia, Federated States of" msgstr "Micronesia, Federated States of" #. 234 msgid "Faroe Islands" msgstr "Faroe Islands" #. 250 msgid "France" msgstr "Pháp" #. 266 msgid "Gabon" msgstr "Gabon" #. 826 msgid "United Kingdom" msgstr "Vương quốc Anh" #. 308 msgid "Grenada" msgstr "Grenada" #. 268 msgid "Georgia" msgstr "Georgia" #. 254 msgid "French Guiana" msgstr "French Guiana" #. 831 msgid "Guernsey" msgstr "Guernsey" #. 288 msgid "Ghana" msgstr "Ghana" #. 292 msgid "Gibraltar" msgstr "Gibraltar" #. 304 msgid "Greenland" msgstr "Greenland" #. 270 msgid "Gambia" msgstr "Gambia" #. 324 msgid "Guinea" msgstr "Guinea" #. 312 msgid "Guadeloupe" msgstr "Guadeloupe" #. 226 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. 300 msgid "Greece" msgstr "Hy Lạp" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. 320 msgid "Guatemala" msgstr "Guatemala" #. 316 msgid "Guam" msgstr "Guam" #. 624 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. 328 msgid "Guyana" msgstr "Guyana" #. 344 msgid "Hong Kong" msgstr "Hồng Kông" #. 334 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. 340 msgid "Honduras" msgstr "Honduras" #. 191 msgid "Croatia" msgstr "Croatia" #. 332 msgid "Haiti" msgstr "Haiti" #. 348 msgid "Hungary" msgstr "Hungary" #. 360 msgid "Indonesia" msgstr "Indonesia" #. 372 msgid "Ireland" msgstr "Ireland" #. 376 msgid "Israel" msgstr "Israel" #. 833 msgid "Isle of Man" msgstr "Isle of Man" #. 356 msgid "India" msgstr "Ấn Độ" #. 086 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. 368 msgid "Iraq" msgstr "Iraq" #. 364 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamic Republic of" #. 352 msgid "Iceland" msgstr "Iceland" #. 380 msgid "Italy" msgstr "Ý" #. 832 msgid "Jersey" msgstr "Jersey" #. 388 msgid "Jamaica" msgstr "Jamaica" #. 400 msgid "Jordan" msgstr "Jordan" #. 392 msgid "Japan" msgstr "Nhật bản" #. 404 msgid "Kenya" msgstr "Kenya" #. 417 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. 116 msgid "Cambodia" msgstr "Campuchia" #. 296 msgid "Kiribati" msgstr "Kiribati" #. 174 msgid "Comoros" msgstr "Comoros" #. 659 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "Bắc Triều Tiên" #. 410 msgid "Korea, Republic of" msgstr "Hàn quốc" #. 414 msgid "Kuwait" msgstr "Kuwait" #. 136 msgid "Cayman Islands" msgstr "Quần đảo Cayman" #. 398 msgid "Kazakhstan" msgstr "Kazakhstan" #. 418 msgid "Lao People's Democratic Republic" msgstr "Cộng hoà Nhân dân Dân chủ Lào" #. 422 msgid "Lebanon" msgstr "Lebanon" #. 662 msgid "Saint Lucia" msgstr "Saint Lucia" #. 438 msgid "Liechtenstein" msgstr "Liechtenstein" #. 144 msgid "Sri Lanka" msgstr "Sri Lanka" #. 430 msgid "Liberia" msgstr "Liberia" #. 426 msgid "Lesotho" msgstr "Lesotho" #. 440 msgid "Lithuania" msgstr "Lithuania" #. 442 msgid "Luxembourg" msgstr "Luxembourg" #. 428 msgid "Latvia" msgstr "Latvia" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "Morocco" #. 492 msgid "Monaco" msgstr "Monaco" #. 498 msgid "Moldova, Republic of" msgstr "Moldova, Republic of" #. 499 msgid "Montenegro" msgstr "Montenegro" #. 663 msgid "Saint Martin (French part)" msgstr "Saint Martin (French part)" #. 450 msgid "Madagascar" msgstr "Madagascar" #. 584 msgid "Marshall Islands" msgstr "Quần đảo Marshall" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "Macedonia, the former Yugoslav Republic of" #. 466 msgid "Mali" msgstr "Mali" #. 104 msgid "Myanmar" msgstr "Myanmar" #. 496 msgid "Mongolia" msgstr "Mông Cổ" #. 446 msgid "Macao" msgstr "Macao" #. 580 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. 474 msgid "Martinique" msgstr "Martinique" #. 478 msgid "Mauritania" msgstr "Mauritania" #. 500 msgid "Montserrat" msgstr "Montserrat" #. 470 msgid "Malta" msgstr "Malta" #. 480 msgid "Mauritius" msgstr "Mauritius" #. 462 msgid "Maldives" msgstr "Maldives" #. 454 msgid "Malawi" msgstr "Malawi" #. 484 msgid "Mexico" msgstr "Mexico" #. 458 msgid "Malaysia" msgstr "Malaysia" #. 508 msgid "Mozambique" msgstr "Mozambique" #. 516 msgid "Namibia" msgstr "Namibia" #. 540 msgid "New Caledonia" msgstr "New Caledonia" #. 562 msgid "Niger" msgstr "Niger" #. 574 msgid "Norfolk Island" msgstr "Norfolk Island" #. 566 msgid "Nigeria" msgstr "Nigeria" #. 558 msgid "Nicaragua" msgstr "Nicaragua" #. 528 msgid "Netherlands" msgstr "Hà Lan" #. 578 msgid "Norway" msgstr "Na Uy" #. 524 msgid "Nepal" msgstr "Nepal" #. 520 msgid "Nauru" msgstr "Nauru" #. 570 msgid "Niue" msgstr "Niue" #. 554 msgid "New Zealand" msgstr "New Zealand" #. 512 msgid "Oman" msgstr "Oman" #. 591 msgid "Panama" msgstr "Panama" #. 604 msgid "Peru" msgstr "Peru" #. 258 msgid "French Polynesia" msgstr "French Polynesia" #. 598 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. 608 msgid "Philippines" msgstr "Philippines" #. 586 msgid "Pakistan" msgstr "Pakistan" #. 616 msgid "Poland" msgstr "Poland" #. 666 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. 612 msgid "Pitcairn" msgstr "Pitcairn" #. 630 msgid "Puerto Rico" msgstr "Puerto Rico" #. 275 msgid "Palestinian Territory, Occupied" msgstr "Palestinian Territory, Occupied" #. 620 msgid "Portugal" msgstr "Bồ Đào Nha" #. 585 msgid "Palau" msgstr "Palau" #. 600 msgid "Paraguay" msgstr "Paraguay" #. 634 msgid "Qatar" msgstr "Qatar" #. 638 msgid "Reunion" msgstr "Reunion" #. 642 msgid "Romania" msgstr "Romania" #. 688 msgid "Serbia" msgstr "Serbia" #. 643 msgid "Russian Federation" msgstr "Liên bang Nga" #. 646 msgid "Rwanda" msgstr "Rwanda" #. 682 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. 090 msgid "Solomon Islands" msgstr "Quần đảo Solomon" #. 690 msgid "Seychelles" msgstr "Seychelles" #. 736 msgid "Sudan" msgstr "Sudan" #. 752 msgid "Sweden" msgstr "Thụy Điển" #. 702 msgid "Singapore" msgstr "Singapore" #. 654 msgid "Saint Helena" msgstr "Saint Helena" #. 705 msgid "Slovenia" msgstr "Slovenia" #. 744 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. 703 msgid "Slovakia" msgstr "Slovakia" #. 694 msgid "Sierra Leone" msgstr "Sierra Leone" #. 674 msgid "San Marino" msgstr "San Marino" #. 686 msgid "Senegal" msgstr "Senegal" #. 706 msgid "Somalia" msgstr "Somalia" #. 740 msgid "Suriname" msgstr "Suriname" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. 222 msgid "El Salvador" msgstr "El Salvador" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "Syrian Arab Republic" #. 748 msgid "Swaziland" msgstr "Swaziland" #. 796 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. 148 msgid "Chad" msgstr "Chad" #. 260 msgid "French Southern Territories" msgstr "French Southern Territories" #. 768 msgid "Togo" msgstr "Togo" #. 764 msgid "Thailand" msgstr "Thái Lan" #. 762 msgid "Tajikistan" msgstr "Tajikistan" #. 772 msgid "Tokelau" msgstr "Tokelau" #. 626 msgid "Timor-Leste" msgstr "Timor-Leste" #. 795 msgid "Turkmenistan" msgstr "Turkmenistan" #. 788 msgid "Tunisia" msgstr "Tunisia" #. 776 msgid "Tonga" msgstr "Tonga" #. 792 msgid "Turkey" msgstr "Thổ nhĩ kỳ" #. 780 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. 798 msgid "Tuvalu" msgstr "Tuvalu" #. 158 msgid "Taiwan, Province of China" msgstr "Đài loan" #. 834 msgid "Tanzania, United Republic of" msgstr "Tanzania, United Republic of" #. 804 msgid "Ukraine" msgstr "Ukraine" #. 800 msgid "Uganda" msgstr "Uganda" #. 581 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. 840 msgid "United States" msgstr "Mỹ" #. 858 msgid "Uruguay" msgstr "Uruguay" #. 860 msgid "Uzbekistan" msgstr "Uzbekistan" #. 336 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. 862 msgid "Venezuela" msgstr "Venezuela" #. 092 msgid "Virgin Islands, British" msgstr "Virgin Islands, British" #. 850 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. 704 msgid "Viet Nam" msgstr "Việt Nam" #. 548 msgid "Vanuatu" msgstr "Vanuatu" #. 876 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. 882 msgid "Samoa" msgstr "Samoa" #. 887 msgid "Yemen" msgstr "Yemen" #. 175 msgid "Mayotte" msgstr "Mayotte" #. 710 msgid "South Africa" msgstr "South Africa" #. 894 msgid "Zambia" msgstr "Zambia" #. 716 msgid "Zimbabwe" msgstr "Zimbabwe" msgid "* Unknown, add is_in tags to those cities" msgstr "* Không xác định, gán thẻ \"is_in\" cho những thành phố đó" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "Map Point" msgid "Car" msgstr "Ô tô" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "Quốc gia" msgid "Postal" msgstr "Bưu điện" msgid "Town" msgstr "Thị trấn" msgid "District" msgstr "Huyện" msgid "Street" msgstr "Phố" msgid "Number" msgstr "Số" msgid "Enter Destination" msgstr "Nhập nơi đến" msgid "Zip Code" msgstr "Mã bưu điện" msgid "City" msgstr "Thành phố" msgid "District/Township" msgstr "Huyện/Thị trấn nhỏ" msgid "Map" msgstr "Bản đồ" msgid "Bookmark" msgstr "Đánh dấu" msgid "Destination" msgstr "Điểm đến" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "Hiển thị" msgid "_Route" msgstr "Tuyến" msgid "_Former Destinations" msgstr "Điểm đến trước" msgid "_Bookmarks" msgstr "Đánh dấu" msgid "_Map" msgstr "Bản đồ" msgid "_Layout" msgstr "Layout" msgid "_Projection" msgstr "Phép chiếu" msgid "_Vehicle" msgstr "Phương tiện" msgid "Zoom_Out" msgstr "Thu nhỏ" msgid "Decrease zoom level" msgstr "Giảm độ phóng đại" msgid "Zoom_In" msgstr "Phóng to" msgid "Increase zoom level" msgstr "Tăng độ phóng đại" msgid "_Recalculate" msgstr "Tính lại" msgid "Redraw map" msgstr "Vẽ lại bản đồ" msgid "_Info" msgstr "Thông tin" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "Mở hộp thoại tìm địa chỉ" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "Dừng dẫn đường" msgid "Test" msgstr "Kiểm tra" msgid "_Quit" msgstr "_Thoát" msgid "Quit the application" msgstr "Thoát ứng dụng" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "Bám vào đường" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "Hiển thị hướng của bản đồ theo hướng bắc hay hướng của phương tiện" msgid "_Roadbook" msgstr "Roadbook" msgid "Show/hide route description" msgstr "Hiển thị/ẩn mô tả về hành trình" msgid "_Autozoom" msgstr "Tự động thu phóng" msgid "Enable/disable automatic zoom level changing" msgstr "Bật/tắt tự động thay đổi độ phóng đại" msgid "_Fullscreen" msgstr "Toàn màn hình" msgid "Data" msgstr "Dữ liệu" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "Bắc" msgid "NE" msgstr "Đông Bắc" msgid "E" msgstr "Đông" msgid "SE" msgstr "Đông Nam" msgid "S" msgstr "Nam" msgid "SW" msgstr "Tây Nam" msgid "W" msgstr "Tây" msgid "NW" msgstr "Tây Bắc" #. Android resource: @strings/no msgid "No" msgstr "Không" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "Tuyến %4.0fkm %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "Tuyến 0000km 0+00:00 ETA" msgid "Help" msgstr "Trợ giúp" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "Xem trong trình duyệt" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "Phố" msgid "House numbers" msgstr "Số nhà" msgid "View Attributes" msgstr "Xem thuộc tính" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "Điểm hữu ích (POI)" msgid "View on map" msgstr "Xem trên bản đồ" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "Cắt điểm đánh dấu (bookmark)" msgid "Copy Bookmark" msgstr "Sao chép điểm đánh dấu (bookmark)" msgid "Rename Bookmark" msgstr "Đổi tên điểm đánh dấu (bookmark)" msgid "Paste Bookmark" msgstr "Dán điểm đánh dấu (bookmark) từ bộ nhớ" msgid "Delete Bookmark" msgstr "Xóa điểm đánh dấu (bookmark)" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "Đánh dấu" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "Thêm thư mục điểm đánh dấu (Bookmark)" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "Dán điểm đánh dấu (bookmark) từ bộ nhớ" #, c-format msgid "Bookmark %s" msgstr "Đánh dấu %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "Xem thông tin vệ tinh" msgid " Elevation " msgstr " Cao độ " msgid " Azimuth " msgstr " Góc phương vị " msgid "Show NMEA Data" msgstr "Xem dữ liệu dạng NMEA" msgid "car" msgstr "ôtô" msgid "bike" msgstr "gắn máy" msgid "pedestrian" msgstr "khách bộ hành" #, c-format msgid "Current profile: %s" msgstr "Hồ sơ hiện hành: %s" #, c-format msgid "Change profile to: %s" msgstr "Đổi thành hồ sơ: %s" msgid "Set as active" msgstr "Kích hoạt" msgid "Show Satellite status" msgstr "Xem thông tin vệ tinh" msgid "Show NMEA data" msgstr "Xem dữ liệu dạng NMEA" msgid "Add Bookmark" msgstr "Thêm điểm đánh dấu (bookmark)" msgid "Rename" msgstr "Đổi tên" msgid "About Navit" msgstr "Về Navit" #. Authors msgid "By" msgstr "Bởi" #. Contributors msgid "And all the Navit Team" msgstr "Và toàn thể Đội Ngũ Navit" msgid "members and contributors." msgstr "thành viên và những người đóng góp" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "Phương tiện" msgid "Rules" msgstr "Quy tắc" msgid "Lock on road" msgstr "Bám vào đường" msgid "Northing" msgstr "Hướng Bắc" msgid "Map follows Vehicle" msgstr "Dịch bản đồ theo phương tiện khi di chuyển" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "Bản đồ" msgid "Layout" msgstr "Layout" msgid "Height Profile" msgstr "Thông tin chiều cao" msgid "Route Description" msgstr "Mô tả hành trình" msgid "Show Locale" msgstr "Hiển thị hệ ngôn ngữ" msgid "Former Destinations" msgstr "Điểm đến trước" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "Thông điệp" msgid "Back" msgstr "Quay lại" msgid "Back to map" msgstr "Quay lại bản đồ" msgid "Main Menu" msgstr "Trình đơn chính" msgid "House number" msgstr "Số nhà" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "Vị trí phương tiện" msgid "Main menu" msgstr "Trình đơn chính" msgid "" "Show\n" "Map" msgstr "Xem bản đồ" msgid "Settings" msgstr "Thiết lập" msgid "Tools" msgstr "Công cụ" msgid "Route" msgstr "Tuyến" msgid "About" msgstr "Về" msgid "Quit" msgstr "Thoát" msgid "Actions" msgstr "Thao tác" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "Dừng dẫn đường" msgid "Display" msgstr "Hiển thị" msgid "Fullscreen" msgstr "Toàn màn hình" msgid "Window Mode" msgstr "Chế độ cửa sổ" msgid "Description" msgstr "Mô tả" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "ngựa" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "sau đó ra khỏi đường vòng tại %1$s %2$s" navit-0.5.0+dfsg.1/po/zh_CN.po.in000066400000000000000000001226451264204753600163220ustar00rootroot00000000000000# Simplified Chinese translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # Feng Chao https://launchpad.net/~chaofeng # Kakurady Drakenar https://launchpad.net/~kakurady # Kyle https://launchpad.net/~kylelover # Kyle WANG https://launchpad.net/~osfans # Lele Long https://launchpad.net/~schemacs # Li Jin https://launchpad.net/~lijin # kelvin https://launchpad.net/~kelvinz msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:01+0000\n" "Last-Translator: Kyle WANG \n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: zh_CN\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "从根目录执行\n" #, c-format msgid "setting '%s' to '%s'\n" msgstr "'%s' 设置为 '%s'\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "第零个" msgid "first" msgstr "第一个" msgid "second" msgstr "第二个" msgid "third" msgstr "第三个" msgid "fourth" msgstr "第四个" msgid "fifth" msgstr "第五个" msgid "sixth" msgstr "第六个" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "第零个退出" msgid "first exit" msgstr "第一个退出" msgid "second exit" msgstr "第二个退出" msgid "third exit" msgstr "第三个退出" msgid "fourth exit" msgstr "第四个退出" msgid "fifth exit" msgstr "第五个退出" msgid "sixth exit" msgstr "第六个退出" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d米" #, c-format msgid "in %d meters" msgstr "距离%d米" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d千米" #, c-format msgid "in %d.%d kilometers" msgstr "距离%d.%d千米" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d千米" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "距离%d千米" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "进入坡道" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s到达 %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s到达 %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s到达 %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s到达 %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s到达 %s" msgid "When possible, please turn around" msgstr "当遇到路口的时候,请转弯" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "沿路继续行驶%s" msgid "Enter the roundabout soon" msgstr "不久将进入环形交叉路口" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "还有%1$s %2$s就将驶离环形区" msgid "soon" msgstr "不久" msgid "now" msgstr "现在" msgid "then" msgstr "然后" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "右" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "左" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "缓 " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "急转 " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "可以经由道路 %1$s 到 %2$s" #, c-format msgid "after %i roads" msgstr "之后有 %i 条道路" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "转向 %1$s%2$s %3$s%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "然后你就到达您的目的地" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "您已经抵达您的目的地 %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "交流道" msgid "Exit" msgstr "退出" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "位置" msgid "Command" msgstr "命令" msgid "Length" msgstr "长度" msgid "km" msgstr "千米" msgid "m" msgstr "米" msgid "Time" msgstr "时间" msgid "Destination Length" msgstr "目的地距离" msgid "Destination Time" msgstr "距目的地时间" msgid "Roadbook" msgstr "路线指南" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "设置为起始位置" msgid "Set as destination" msgstr "设置为目的地" msgid "Add as bookmark" msgstr "添加为书签" #, c-format msgid "Point 0x%x 0x%x" msgstr "位置 0x%x 0x%x" #, c-format msgid "Screen coord : %d %d" msgstr "屏幕坐标:%d %d" #. 020 msgid "Andorra" msgstr "安道尔" #. 784 msgid "United Arab Emirates" msgstr "阿拉伯联合酋长国" #. 004 msgid "Afghanistan" msgstr "阿富汗" #. 028 msgid "Antigua and Barbuda" msgstr "安提瓜和巴布达" #. 660 msgid "Anguilla" msgstr "安圭拉" #. 008 msgid "Albania" msgstr "阿尔巴尼亚" #. 051 msgid "Armenia" msgstr "亚美尼亚" #. 530 msgid "Netherlands Antilles" msgstr "荷兰安地列斯" #. 024 msgid "Angola" msgstr "安哥拉" #. 010 msgid "Antarctica" msgstr "南极洲" #. 032 msgid "Argentina" msgstr "阿根廷" #. 016 msgid "American Samoa" msgstr "美属萨摩亚" #. 040 msgid "Austria" msgstr "奥地利" #. 036 msgid "Australia" msgstr "澳大利亚" #. 533 msgid "Aruba" msgstr "阿鲁巴岛" #. 248 msgid "Aland Islands" msgstr "奥兰群岛" #. 031 msgid "Azerbaijan" msgstr "阿塞拜疆" #. 070 msgid "Bosnia and Herzegovina" msgstr "波黑" #. 052 msgid "Barbados" msgstr "巴巴多斯" #. 050 msgid "Bangladesh" msgstr "孟加拉国" #. 056 msgid "Belgium" msgstr "比利时" #. 854 msgid "Burkina Faso" msgstr "布基纳法索" #. 100 msgid "Bulgaria" msgstr "保加利亚" #. 048 msgid "Bahrain" msgstr "巴林" #. 108 msgid "Burundi" msgstr "布隆迪" #. 204 msgid "Benin" msgstr "贝宁" #. 652 msgid "Saint Barthelemy" msgstr "圣巴泰勒米岛" #. 060 msgid "Bermuda" msgstr "百慕大群岛" #. 096 msgid "Brunei Darussalam" msgstr "文莱达鲁萨兰国" #. 068 msgid "Bolivia" msgstr "玻利维亚" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "巴西" #. 044 msgid "Bahamas" msgstr "巴哈马群岛" #. 064 msgid "Bhutan" msgstr "不丹" #. 074 msgid "Bouvet Island" msgstr "布维岛" #. 072 msgid "Botswana" msgstr "博茨瓦那" #. 112 msgid "Belarus" msgstr "白俄罗斯" #. 084 msgid "Belize" msgstr "伯利兹" #. 124 msgid "Canada" msgstr "加拿大" #. 166 msgid "Cocos (Keeling) Islands" msgstr "科科斯群岛" #. 180 msgid "Congo, Democratic Republic of the" msgstr "刚果" #. 140 msgid "Central African Republic" msgstr "中非共和国" #. 178 msgid "Congo" msgstr "刚果" #. 756 msgid "Switzerland" msgstr "瑞士" #. 384 msgid "Cote d'Ivoire" msgstr "科特迪瓦" #. 184 msgid "Cook Islands" msgstr "库克群岛" #. 152 msgid "Chile" msgstr "智利" #. 120 msgid "Cameroon" msgstr "喀麦隆" #. 156 msgid "China" msgstr "中国" #. 170 msgid "Colombia" msgstr "哥伦比亚" #. 188 msgid "Costa Rica" msgstr "哥斯达黎加" #. 192 msgid "Cuba" msgstr "古巴" #. 132 msgid "Cape Verde" msgstr "佛得角" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "圣诞岛" #. 196 msgid "Cyprus" msgstr "塞浦路斯" #. 203 msgid "Czech Republic" msgstr "捷克" #. 276 msgid "Germany" msgstr "德国" #. 262 msgid "Djibouti" msgstr "吉布提" #. 208 msgid "Denmark" msgstr "丹麦" #. 212 msgid "Dominica" msgstr "多米尼克" #. 214 msgid "Dominican Republic" msgstr "多米尼亚共和国" #. 012 msgid "Algeria" msgstr "阿尔及利亚" #. 218 msgid "Ecuador" msgstr "厄瓜多尔" #. 233 msgid "Estonia" msgstr "爱沙尼亚" #. 818 msgid "Egypt" msgstr "埃及" #. 732 msgid "Western Sahara" msgstr "西萨哈拉" #. 232 msgid "Eritrea" msgstr "厄立特里亚" #. 724 msgid "Spain" msgstr "西班牙" #. 231 msgid "Ethiopia" msgstr "埃塞额比亚" #. 246 msgid "Finland" msgstr "芬兰" #. 242 msgid "Fiji" msgstr "斐济" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "弗克兰群岛" #. 583 msgid "Micronesia, Federated States of" msgstr "密克罗尼西亚联邦" #. 234 msgid "Faroe Islands" msgstr "法罗群岛" #. 250 msgid "France" msgstr "法国" #. 266 msgid "Gabon" msgstr "加蓬" #. 826 msgid "United Kingdom" msgstr "英国" #. 308 msgid "Grenada" msgstr "格林纳达岛" #. 268 msgid "Georgia" msgstr "格鲁吉亚" #. 254 msgid "French Guiana" msgstr "法属圭亚那" #. 831 msgid "Guernsey" msgstr "格恩西岛" #. 288 msgid "Ghana" msgstr "加纳" #. 292 msgid "Gibraltar" msgstr "直布罗陀" #. 304 msgid "Greenland" msgstr "格陵兰岛" #. 270 msgid "Gambia" msgstr "冈比亚" #. 324 msgid "Guinea" msgstr "几内亚" #. 312 msgid "Guadeloupe" msgstr "瓜德罗普岛" #. 226 msgid "Equatorial Guinea" msgstr "赤道几内亚" #. 300 msgid "Greece" msgstr "希腊" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "南乔治亚岛和南桑德韦奇岛" #. 320 msgid "Guatemala" msgstr "危地马拉" #. 316 msgid "Guam" msgstr "关岛" #. 624 msgid "Guinea-Bissau" msgstr "几内亚比绍共和国" #. 328 msgid "Guyana" msgstr "盖亚那" #. 344 msgid "Hong Kong" msgstr "香港" #. 334 msgid "Heard Island and McDonald Islands" msgstr "赫德和麦克唐纳群岛" #. 340 msgid "Honduras" msgstr "洪都拉斯" #. 191 msgid "Croatia" msgstr "克罗地亚" #. 332 msgid "Haiti" msgstr "海地" #. 348 msgid "Hungary" msgstr "匈牙利" #. 360 msgid "Indonesia" msgstr "印度尼西亚" #. 372 msgid "Ireland" msgstr "爱尔兰" #. 376 msgid "Israel" msgstr "以色列" #. 833 msgid "Isle of Man" msgstr "马恩岛" #. 356 msgid "India" msgstr "印度" #. 086 msgid "British Indian Ocean Territory" msgstr "英属印度洋领地" #. 368 msgid "Iraq" msgstr "伊拉克" #. 364 msgid "Iran, Islamic Republic of" msgstr "伊朗伊斯兰共和国" #. 352 msgid "Iceland" msgstr "冰岛" #. 380 msgid "Italy" msgstr "意大利" #. 832 msgid "Jersey" msgstr "泽西岛" #. 388 msgid "Jamaica" msgstr "牙买加" #. 400 msgid "Jordan" msgstr "约旦" #. 392 msgid "Japan" msgstr "日本" #. 404 msgid "Kenya" msgstr "肯尼亚" #. 417 msgid "Kyrgyzstan" msgstr "吉尔吉斯斯坦" #. 116 msgid "Cambodia" msgstr "柬埔寨" #. 296 msgid "Kiribati" msgstr "基里巴斯" #. 174 msgid "Comoros" msgstr "科摩罗" #. 659 msgid "Saint Kitts and Nevis" msgstr "圣基茨和尼维斯" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "朝鲜" #. 410 msgid "Korea, Republic of" msgstr "韩国" #. 414 msgid "Kuwait" msgstr "科威特" #. 136 msgid "Cayman Islands" msgstr "开曼群岛" #. 398 msgid "Kazakhstan" msgstr "哈萨克斯坦" #. 418 msgid "Lao People's Democratic Republic" msgstr "老挝人民民主共和国" #. 422 msgid "Lebanon" msgstr "黎巴嫩" #. 662 msgid "Saint Lucia" msgstr "圣卢西亚" #. 438 msgid "Liechtenstein" msgstr "列支敦士登" #. 144 msgid "Sri Lanka" msgstr "斯里兰卡" #. 430 msgid "Liberia" msgstr "利比里亚" #. 426 msgid "Lesotho" msgstr "莱索托" #. 440 msgid "Lithuania" msgstr "立陶宛" #. 442 msgid "Luxembourg" msgstr "卢森堡" #. 428 msgid "Latvia" msgstr "拉脱维亚" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "摩洛哥" #. 492 msgid "Monaco" msgstr "摩纳哥" #. 498 msgid "Moldova, Republic of" msgstr "摩尔多瓦共和国" #. 499 msgid "Montenegro" msgstr "黑山" #. 663 msgid "Saint Martin (French part)" msgstr "圣马丁" #. 450 msgid "Madagascar" msgstr "马达加斯加" #. 584 msgid "Marshall Islands" msgstr "马绍尔群岛" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "马其顿" #. 466 msgid "Mali" msgstr "马里" #. 104 msgid "Myanmar" msgstr "缅甸" #. 496 msgid "Mongolia" msgstr "蒙古" #. 446 msgid "Macao" msgstr "澳门" #. 580 msgid "Northern Mariana Islands" msgstr "北马里亚纳群岛" #. 474 msgid "Martinique" msgstr "马提尼克" #. 478 msgid "Mauritania" msgstr "毛里塔尼亚" #. 500 msgid "Montserrat" msgstr "蒙特萨拉特岛" #. 470 msgid "Malta" msgstr "马尔他" #. 480 msgid "Mauritius" msgstr "毛里求斯" #. 462 msgid "Maldives" msgstr "马尔代夫" #. 454 msgid "Malawi" msgstr "马拉威" #. 484 msgid "Mexico" msgstr "墨西哥" #. 458 msgid "Malaysia" msgstr "马来西亚" #. 508 msgid "Mozambique" msgstr "莫桑比克" #. 516 msgid "Namibia" msgstr "纳米比亚" #. 540 msgid "New Caledonia" msgstr "新喀里多尼亚" #. 562 msgid "Niger" msgstr "尼日尔" #. 574 msgid "Norfolk Island" msgstr "诺福克岛" #. 566 msgid "Nigeria" msgstr "尼日利亚" #. 558 msgid "Nicaragua" msgstr "尼加拉瓜" #. 528 msgid "Netherlands" msgstr "荷兰" #. 578 msgid "Norway" msgstr "挪威" #. 524 msgid "Nepal" msgstr "尼泊尔" #. 520 msgid "Nauru" msgstr "瑙鲁" #. 570 msgid "Niue" msgstr "纽埃岛" #. 554 msgid "New Zealand" msgstr "新西兰" #. 512 msgid "Oman" msgstr "阿曼" #. 591 msgid "Panama" msgstr "巴拿马" #. 604 msgid "Peru" msgstr "秘鲁" #. 258 msgid "French Polynesia" msgstr "法属波利尼西亚" #. 598 msgid "Papua New Guinea" msgstr "巴布亚新几内亚" #. 608 msgid "Philippines" msgstr "菲律宾" #. 586 msgid "Pakistan" msgstr "巴基斯坦" #. 616 msgid "Poland" msgstr "波兰" #. 666 msgid "Saint Pierre and Miquelon" msgstr "圣皮埃尔和密克隆" #. 612 msgid "Pitcairn" msgstr "皮特凯恩" #. 630 msgid "Puerto Rico" msgstr "波多黎各" #. 275 msgid "Palestinian Territory, Occupied" msgstr "巴勒斯坦领土被占领" #. 620 msgid "Portugal" msgstr "葡萄牙" #. 585 msgid "Palau" msgstr "帕劳" #. 600 msgid "Paraguay" msgstr "巴拉圭" #. 634 msgid "Qatar" msgstr "卡塔尔" #. 638 msgid "Reunion" msgstr "法属留尼旺岛" #. 642 msgid "Romania" msgstr "罗马尼亚" #. 688 msgid "Serbia" msgstr "塞尔维亚" #. 643 msgid "Russian Federation" msgstr "俄罗斯联邦" #. 646 msgid "Rwanda" msgstr "卢旺达" #. 682 msgid "Saudi Arabia" msgstr "沙特阿拉伯" #. 090 msgid "Solomon Islands" msgstr "所罗门群岛" #. 690 msgid "Seychelles" msgstr "塞舌尔" #. 736 msgid "Sudan" msgstr "苏丹" #. 752 msgid "Sweden" msgstr "瑞典" #. 702 msgid "Singapore" msgstr "新加坡" #. 654 msgid "Saint Helena" msgstr "圣赫勒拿" #. 705 msgid "Slovenia" msgstr "斯洛文尼亚" #. 744 msgid "Svalbard and Jan Mayen" msgstr "斯瓦尔巴群岛" #. 703 msgid "Slovakia" msgstr "斯洛伐克" #. 694 msgid "Sierra Leone" msgstr "塞拉利昂" #. 674 msgid "San Marino" msgstr "圣马力诺" #. 686 msgid "Senegal" msgstr "塞内加尔" #. 706 msgid "Somalia" msgstr "索马里" #. 740 msgid "Suriname" msgstr "苏里南" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "圣多美及普林西比" #. 222 msgid "El Salvador" msgstr "萨尔瓦多" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "阿拉伯叙利亚共和国" #. 748 msgid "Swaziland" msgstr "斯威士兰" #. 796 msgid "Turks and Caicos Islands" msgstr "特克斯和凯科斯群岛" #. 148 msgid "Chad" msgstr "乍得" #. 260 msgid "French Southern Territories" msgstr "法属南部占领地" #. 768 msgid "Togo" msgstr "多哥" #. 764 msgid "Thailand" msgstr "泰国" #. 762 msgid "Tajikistan" msgstr "塔吉克斯坦" #. 772 msgid "Tokelau" msgstr "托克劳" #. 626 msgid "Timor-Leste" msgstr "东帝汶" #. 795 msgid "Turkmenistan" msgstr "土库曼斯坦" #. 788 msgid "Tunisia" msgstr "突尼斯" #. 776 msgid "Tonga" msgstr "汤加" #. 792 msgid "Turkey" msgstr "土耳其" #. 780 msgid "Trinidad and Tobago" msgstr "特立尼达和多巴哥" #. 798 msgid "Tuvalu" msgstr "图瓦卢" #. 158 msgid "Taiwan, Province of China" msgstr "台湾(中国)" #. 834 msgid "Tanzania, United Republic of" msgstr "坦桑尼亚联合共和国" #. 804 msgid "Ukraine" msgstr "乌克兰" #. 800 msgid "Uganda" msgstr "乌干达" #. 581 msgid "United States Minor Outlying Islands" msgstr "美国本土外小岛屿" #. 840 msgid "United States" msgstr "美国" #. 858 msgid "Uruguay" msgstr "乌拉圭" #. 860 msgid "Uzbekistan" msgstr "乌兹别克斯坦" #. 336 msgid "Holy See (Vatican City State)" msgstr "圣座" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "圣文森特和格林纳丁斯" #. 862 msgid "Venezuela" msgstr "委内瑞拉" #. 092 msgid "Virgin Islands, British" msgstr "英属维京群岛" #. 850 msgid "Virgin Islands, U.S." msgstr "美属维京群岛" #. 704 msgid "Viet Nam" msgstr "越南" #. 548 msgid "Vanuatu" msgstr "瓦努阿图" #. 876 msgid "Wallis and Futuna" msgstr "瓦利斯和富图纳群岛" #. 882 msgid "Samoa" msgstr "萨摩亚群岛" #. 887 msgid "Yemen" msgstr "也门" #. 175 msgid "Mayotte" msgstr "马约特岛" #. 710 msgid "South Africa" msgstr "南非" #. 894 msgid "Zambia" msgstr "赞比亚" #. 716 msgid "Zimbabwe" msgstr "津巴布韦" msgid "* Unknown, add is_in tags to those cities" msgstr "* 未知,添加标签" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "地图位置点" msgid "Car" msgstr "汽车" msgid "Iso2" msgstr "Iso2" msgid "Iso3" msgstr "Iso3" msgid "Country" msgstr "国家" msgid "Postal" msgstr "邮编" msgid "Town" msgstr "区/镇" msgid "District" msgstr "城区" msgid "Street" msgstr "街区" msgid "Number" msgstr "门牌号" msgid "Enter Destination" msgstr "进入目标区域" msgid "Zip Code" msgstr "区号(邮编)" msgid "City" msgstr "城市" msgid "District/Township" msgstr "市区/区镇" msgid "Map" msgstr "地图" msgid "Bookmark" msgstr "书签" msgid "Destination" msgstr "目的地" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "显示" msgid "_Route" msgstr "路线" msgid "_Former Destinations" msgstr "前一目的地" msgid "_Bookmarks" msgstr "书签" msgid "_Map" msgstr "地图" msgid "_Layout" msgstr "布局" msgid "_Projection" msgstr "规划" msgid "_Vehicle" msgstr "车辆" msgid "Zoom_Out" msgstr "缩小" msgid "Decrease zoom level" msgstr "减小放大级别" msgid "Zoom_In" msgstr "放大" msgid "Increase zoom level" msgstr "增加放大级别" msgid "_Recalculate" msgstr "重新计算" msgid "Redraw map" msgstr "重绘地图" msgid "_Info" msgstr "信息" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "打开地址搜索对话框" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "停止导航" msgid "Test" msgstr "测试" msgid "_Quit" msgstr "退出(_Q)" msgid "Quit the application" msgstr "退出应用程序" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "锁定路线" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "切换地图向上指北或前进方向" msgid "_Roadbook" msgstr "路线指南" msgid "Show/hide route description" msgstr "显示/隐藏路线描述" msgid "_Autozoom" msgstr "自动缩放" msgid "Enable/disable automatic zoom level changing" msgstr "启用/禁用 自动改变放大级别" msgid "_Fullscreen" msgstr "全屏" msgid "Data" msgstr "数据" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "北" msgid "NE" msgstr "东北" msgid "E" msgstr "东" msgid "SE" msgstr "东南" msgid "S" msgstr "南" msgid "SW" msgstr "西南" msgid "W" msgstr "西" msgid "NW" msgstr "西北" #. Android resource: @strings/no msgid "No" msgstr "否" msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" msgid "OT" msgstr "OT" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "路线 %4.0f千米 %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "路线 0000千米 0+00:00 ETA" msgid "Help" msgstr "帮助" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "在浏览器中查看" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "街道" msgid "House numbers" msgstr "编号" msgid "View Attributes" msgstr "查看属性" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "您可能感兴趣的位置" msgid "View on map" msgstr "在地图中查看" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "剪切标签" msgid "Copy Bookmark" msgstr "复制标签" msgid "Rename Bookmark" msgstr "重命名标签" msgid "Paste Bookmark" msgstr "粘帖标签" msgid "Delete Bookmark" msgstr "删除标签" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "书签" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "添加书签文件夹" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "粘帖标签" #, c-format msgid "Bookmark %s" msgstr "书签 %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "显示卫星状态" msgid " Elevation " msgstr " 海拔 " msgid " Azimuth " msgstr " 地平经度 " msgid "Show NMEA Data" msgstr "显示NMEA数据" msgid "car" msgstr "汽车" msgid "bike" msgstr "自行车" msgid "pedestrian" msgstr "步行" #, c-format msgid "Current profile: %s" msgstr "当前设定:%s" #, c-format msgid "Change profile to: %s" msgstr "更改设定到: %s" msgid "Set as active" msgstr "保存生效" msgid "Show Satellite status" msgstr "显示卫星状态" msgid "Show NMEA data" msgstr "显示NMEA数据" msgid "Add Bookmark" msgstr "增加书签" msgid "Rename" msgstr "重命名" msgid "About Navit" msgstr "关于Navit" #. Authors msgid "By" msgstr "作者" #. Contributors msgid "And all the Navit Team" msgstr "和整个的Navit组" msgid "members and contributors." msgstr "成员和贡献者" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "车辆" msgid "Rules" msgstr "规则" msgid "Lock on road" msgstr "锁定路线" msgid "Northing" msgstr "总指向北" msgid "Map follows Vehicle" msgstr "随车显示地图" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "地图" msgid "Layout" msgstr "布局" msgid "Height Profile" msgstr "高度设定" msgid "Route Description" msgstr "到目的地的路线" msgid "Show Locale" msgstr "显示本地" msgid "Former Destinations" msgstr "前一目的地" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "信息" msgid "Back" msgstr "返回" msgid "Back to map" msgstr "返回到地图" msgid "Main Menu" msgstr "主菜单" msgid "House number" msgstr "房屋编号(门牌号)" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "车辆位置" msgid "Main menu" msgstr "主菜单" msgid "" "Show\n" "Map" msgstr "显示地图" msgid "Settings" msgstr "设置" msgid "Tools" msgstr "工具" msgid "Route" msgstr "路线" msgid "About" msgstr "关于" msgid "Quit" msgstr "退出" msgid "Actions" msgstr "动作" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "停止导航" msgid "Display" msgstr "显示" msgid "Fullscreen" msgstr "全屏" msgid "Window Mode" msgstr "窗口模式" msgid "Description" msgstr "描述" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "骑马" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "然后在%1$s %2$s处驶出环形区" navit-0.5.0+dfsg.1/po/zh_HK.po.in000066400000000000000000001214571264204753600163240ustar00rootroot00000000000000# Chinese (Hong Kong) translations for navit # Copyright (C) 2006-2015 The Navit Team # This file is distributed under the same license as the navit package. # Many thanks to the contributors of this translation: # KaZeR https://launchpad.net/~kazer # Kyle https://launchpad.net/~kylelover # Michael von Glasow https://launchpad.net/~michael-vonglasow # Walter Cheuk https://launchpad.net/~wwycheuk msgid "" msgstr "" "Project-Id-Version: navit 0.5.0\n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: 2015-07-19 04:01+0000\n" "Last-Translator: Michael von Glasow \n" "Language-Team: Chinese (Hong Kong) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: zh_HK\n" "X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" msgid "Running from source directory\n" msgstr "" #, c-format msgid "setting '%s' to '%s'\n" msgstr "將「%s」設為「%s」\n" #. TRANSLATORS: the following counts refer to streets msgid "zeroth" msgstr "附近" msgid "first" msgstr "第一條" msgid "second" msgstr "第二條" msgid "third" msgstr "第三條" msgid "fourth" msgstr "第四條" msgid "fifth" msgstr "第五條" msgid "sixth" msgstr "第六條" #. TRANSLATORS: the following counts refer to roundabout exits msgid "zeroth exit" msgstr "附近出口" msgid "first exit" msgstr "第一個出口" msgid "second exit" msgstr "第二個出口" msgid "third exit" msgstr "第三個出口" msgid "fourth exit" msgstr "第四個出口" msgid "fifth exit" msgstr "第五個出口" msgid "sixth exit" msgstr "第六個出口" #, c-format msgid "%d feet" msgstr "" #, c-format msgid "in %d feet" msgstr "" #, c-format msgid "%d.%d miles" msgstr "" #, c-format msgid "in %d.%d miles" msgstr "" #, c-format msgid "one mile" msgid_plural "%d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "in one mile" msgid_plural "in %d miles" msgstr[0] "" msgstr[1] "" #, c-format msgid "%d meters" msgstr "%d 米" #, c-format msgid "in %d meters" msgstr "在 %d 米內" #, c-format msgid "%d.%d kilometers" msgstr "%d.%d 千米" #, c-format msgid "in %d.%d kilometers" msgstr "在 %d.%d 千米內" #, c-format msgid "one kilometer" msgid_plural "%d kilometers" msgstr[0] "%d 千米" #, c-format msgid "in one kilometer" msgid_plural "in %d kilometers" msgstr[0] "在 %d 千米內" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Systematic Street Name 3: Separator (Space if required), 4: Street Name #, c-format msgid "%1$sonto the %2$s%3$s%4$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name #, c-format msgid "%1$sonto %2$s" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|masculine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|feminine form" msgstr "" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%1$sonto %2$s|neuter form" msgstr "" #. TRANSLATORS: motorway ramp refers to the slip road for entering a motorway. msgid "onto the motorway ramp" msgstr "進入斜路" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name #, c-format msgid "%sinto %s%s%s" msgstr "%s進入 %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Masculine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|masculine form" msgstr "%s進入 %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Feminine form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|feminine form" msgstr "%s進入 %s%s%s" #. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neuter form. The stuff after | doesn't have to be included #, c-format msgid "%sinto %s%s%s|neuter form" msgstr "%s進入 %s%s%s" #. TRANSLATORS: gives the name of the next road to turn into (into the E17) #, c-format msgid "%sinto the %s" msgstr "%s進入 %s" msgid "When possible, please turn around" msgstr "如可以請掉頭" #. TRANSLATORS: the argument is the destination to follow #, c-format msgid "towards %s" msgstr "" #, c-format msgid "Follow the road for the next %s" msgstr "直走到下一个%s" msgid "Enter the roundabout soon" msgstr "" #. TRANSLATORS: %s is the distance to the roundabout #, c-format msgid "Enter the roundabout %s" msgstr "" msgid "then enter the roundabout" msgstr "" #. TRANSLATORS: first arg. is the manieth exit, second arg. is the destination to follow #, c-format msgid "Leave the roundabout at the %1$s %2$s" msgstr "在 %1$s %2$s 離開迴旋處" msgid "soon" msgstr "即將" msgid "now" msgstr "現在" msgid "then" msgstr "然後" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|right" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Right merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|right" msgstr "" #. TRANSLATORS: the arg. is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "then merge%1$s|left" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is the phrase 'onto ...'. Left merge, the stuff after | doesn't have to be included. #, c-format msgid "Merge %1$s%2$s|left" msgstr "" msgid "on your left" msgstr "" msgid "on your right" msgstr "" #. TRANSLATORS: the first arg. is exit ref and/or name, the second is the direction of exit and the third is distance #, c-format msgid "Take exit %1$s %2$s %3$s" msgstr "" #. TRANSLATORS: the first arg. is the direction of exit, the second is distance, the third is destination #, c-format msgid "Take the exit %1$s %2$s%3$s" msgstr "" #. TRANSLATORS: as in "Keep right at interchange 42 Greenmond-West" msgid "at interchange" msgstr "" msgid "at exit" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then continue straight%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Continue straight %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep right%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep right %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: the arg. is where to do the maneuver #, c-format msgid "then keep left%1$s" msgstr "" #. TRANSLATORS: the first arg. is distance, the second is where to do the maneuver, the third is destination #, c-format msgid "Keep left %1$s%2$s%3$s" msgstr "" #. TRANSLATORS: "right" as in "turn right" msgid "right" msgstr "右" #. TRANSLATORS: "left" as in "turn left" msgid "left" msgstr "左" #. TRANSLATORS: as in "turn easily right" msgid "easily " msgstr "简单 " #. TRANSLATORS: as in "turn strongly right" msgid "strongly " msgstr "大力轉 " #, c-format msgid "then take the %1$s road to the %2$s" msgstr "" #, c-format msgid "Take the %1$s road to the %2$s" msgstr "取 %1$s 路往%2$s方向" #, c-format msgid "after %i roads" msgstr "%i 條路之後" #. TRANSLATORS: the first arg. is strength, the second is direction, the third is distance, the fourth is destination #, c-format msgid "Turn %1$s%2$s %3$s%4$s" msgstr "%1$s转向%2$s %3$s至%4$s" #. TRANSLATORS: Left U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|left" msgstr "" #. TRANSLATORS: the arg. is distance. Left U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|left" msgstr "" #. TRANSLATORS: Right U-turn, the stuff after | doesn't have to be included. msgid "then make a U-turn|right" msgstr "" #. TRANSLATORS: the arg. is distance. Right U-turn, the stuff after | doesn't have to be included. #, c-format msgid "Make a U-turn %1$s|right" msgstr "" #. An empty placeholder that we can use in the future for #. * some motorway commands that are now suppressed but we #. * can in some cases make it say here : #. * 'follow destination blabla' without any further driving instructions, #. * in cases where relevant destination info is available. #. * Even if there is no driving command to be announced, in some cases #. * there is an overhead roadsign in preparation of an upcoming road-split, #. * and then we can give useful info to the driver. #. * #. * UNTESTED ! #. * #. msgid "follow" msgstr "" msgid "then you have reached your destination." msgstr "然後會到達目的地" #. TRANSLATORS: the arg. is distance #, c-format msgid "You have reached your destination %s" msgstr "已到達目的地 %s" #. TRANSLATORS: Exit as a noun, as in "Exit 43 Greenmound-East" msgid "Interchange" msgstr "" msgid "Exit" msgstr "退出" #. Android resource: @strings/position_popup_title msgid "Position" msgstr "位置" msgid "Command" msgstr "指令" msgid "Length" msgstr "長度" msgid "km" msgstr "公里" msgid "m" msgstr "米" msgid "Time" msgstr "時間" msgid "Destination Length" msgstr "抵达终点距离" msgid "Destination Time" msgstr "抵达终点时间" msgid "Roadbook" msgstr "" #, c-format msgid "Waypoint %d" msgstr "" msgid "Visit before..." msgstr "" msgid "Set as position" msgstr "设置您所在位置" msgid "Set as destination" msgstr "设置目的地地址" msgid "Add as bookmark" msgstr "添加书签" #, c-format msgid "Point 0x%x 0x%x" msgstr "" #, c-format msgid "Screen coord : %d %d" msgstr "螢幕座標 : %d %d" #. 020 msgid "Andorra" msgstr "安道爾" #. 784 msgid "United Arab Emirates" msgstr "阿聯酋" #. 004 msgid "Afghanistan" msgstr "阿富汗" #. 028 msgid "Antigua and Barbuda" msgstr "安提瓜和巴布達" #. 660 msgid "Anguilla" msgstr "安圭拉" #. 008 msgid "Albania" msgstr "阿爾巴尼亞" #. 051 msgid "Armenia" msgstr "亞美尼亞" #. 530 msgid "Netherlands Antilles" msgstr "荷屬安的列斯羣島" #. 024 msgid "Angola" msgstr "安哥拉" #. 010 msgid "Antarctica" msgstr "南極洲" #. 032 msgid "Argentina" msgstr "阿根廷" #. 016 msgid "American Samoa" msgstr "美屬薩摩亞" #. 040 msgid "Austria" msgstr "奧地利" #. 036 msgid "Australia" msgstr "澳大利亞" #. 533 msgid "Aruba" msgstr "阿盧巴島" #. 248 msgid "Aland Islands" msgstr "亞蘭羣島" #. 031 msgid "Azerbaijan" msgstr "阿塞拜疆" #. 070 msgid "Bosnia and Herzegovina" msgstr "波斯尼亞" #. 052 msgid "Barbados" msgstr "巴巴多斯" #. 050 msgid "Bangladesh" msgstr "孟加拉" #. 056 msgid "Belgium" msgstr "比利時" #. 854 msgid "Burkina Faso" msgstr "布基納法索" #. 100 msgid "Bulgaria" msgstr "保加利亞" #. 048 msgid "Bahrain" msgstr "巴林" #. 108 msgid "Burundi" msgstr "蒲隆地" #. 204 msgid "Benin" msgstr "貝寧" #. 652 msgid "Saint Barthelemy" msgstr "聖巴泰勒米島" #. 060 msgid "Bermuda" msgstr "百慕達" #. 096 msgid "Brunei Darussalam" msgstr "汶萊" #. 068 msgid "Bolivia" msgstr "玻利維亞" #. 535 msgid "Bonaire, Sint Eustatius and Saba" msgstr "" #. 076 msgid "Brazil" msgstr "巴西" #. 044 msgid "Bahamas" msgstr "巴哈馬" #. 064 msgid "Bhutan" msgstr "不丹" #. 074 msgid "Bouvet Island" msgstr "鮑威特島" #. 072 msgid "Botswana" msgstr "博茨瓦納" #. 112 msgid "Belarus" msgstr "白俄羅斯" #. 084 msgid "Belize" msgstr "伯利茲" #. 124 msgid "Canada" msgstr "加拿大" #. 166 msgid "Cocos (Keeling) Islands" msgstr "可可斯(基林)羣島" #. 180 msgid "Congo, Democratic Republic of the" msgstr "剛果民主共和國" #. 140 msgid "Central African Republic" msgstr "中非共和國" #. 178 msgid "Congo" msgstr "剛果" #. 756 msgid "Switzerland" msgstr "瑞士" #. 384 msgid "Cote d'Ivoire" msgstr "象牙海岸" #. 184 msgid "Cook Islands" msgstr "庫克羣島" #. 152 msgid "Chile" msgstr "智利" #. 120 msgid "Cameroon" msgstr "喀麥隆" #. 156 msgid "China" msgstr "中國" #. 170 msgid "Colombia" msgstr "哥倫比亞" #. 188 msgid "Costa Rica" msgstr "哥斯達黎加" #. 192 msgid "Cuba" msgstr "古巴" #. 132 msgid "Cape Verde" msgstr "佛得角" #. 531 msgid "Curacao" msgstr "" #. 162 msgid "Christmas Island" msgstr "聖誕島" #. 196 msgid "Cyprus" msgstr "塞浦路斯" #. 203 msgid "Czech Republic" msgstr "捷克共和國" #. 276 msgid "Germany" msgstr "德國" #. 262 msgid "Djibouti" msgstr "吉布提" #. 208 msgid "Denmark" msgstr "丹麥" #. 212 msgid "Dominica" msgstr "多米尼克" #. 214 msgid "Dominican Republic" msgstr "多明尼加" #. 012 msgid "Algeria" msgstr "阿爾及利亞" #. 218 msgid "Ecuador" msgstr "厄瓜多爾" #. 233 msgid "Estonia" msgstr "爱尔沙尼亚" #. 818 msgid "Egypt" msgstr "埃及" #. 732 msgid "Western Sahara" msgstr "西撒哈拉" #. 232 msgid "Eritrea" msgstr "厄立特里亞" #. 724 msgid "Spain" msgstr "西班牙" #. 231 msgid "Ethiopia" msgstr "埃塞俄比亞" #. 246 msgid "Finland" msgstr "芬蘭" #. 242 msgid "Fiji" msgstr "斐濟群島" #. 238 msgid "Falkland Islands (Malvinas)" msgstr "福克蘭羣島" #. 583 msgid "Micronesia, Federated States of" msgstr "密克羅尼西亞聯邦" #. 234 msgid "Faroe Islands" msgstr "法羅羣島" #. 250 msgid "France" msgstr "法國" #. 266 msgid "Gabon" msgstr "加彭" #. 826 msgid "United Kingdom" msgstr "英國" #. 308 msgid "Grenada" msgstr "格林纳达" #. 268 msgid "Georgia" msgstr "喬治亞州" #. 254 msgid "French Guiana" msgstr "法屬圭亞那" #. 831 msgid "Guernsey" msgstr "根息" #. 288 msgid "Ghana" msgstr "加納" #. 292 msgid "Gibraltar" msgstr "直布羅陀" #. 304 msgid "Greenland" msgstr "格陵蘭" #. 270 msgid "Gambia" msgstr "岡比亞" #. 324 msgid "Guinea" msgstr "几内亚" #. 312 msgid "Guadeloupe" msgstr "瓜德魯普島" #. 226 msgid "Equatorial Guinea" msgstr "赤道畿內亞" #. 300 msgid "Greece" msgstr "希腊" #. 239 msgid "South Georgia and the South Sandwich Islands" msgstr "南喬治亞島和南桑威奇羣島" #. 320 msgid "Guatemala" msgstr "危地馬拉" #. 316 msgid "Guam" msgstr "關島" #. 624 msgid "Guinea-Bissau" msgstr "畿內亞比索" #. 328 msgid "Guyana" msgstr "圭亞那" #. 344 msgid "Hong Kong" msgstr "香港" #. 334 msgid "Heard Island and McDonald Islands" msgstr "赫德島與麥當勞群島" #. 340 msgid "Honduras" msgstr "洪都拉斯" #. 191 msgid "Croatia" msgstr "克羅地亞" #. 332 msgid "Haiti" msgstr "海地" #. 348 msgid "Hungary" msgstr "匈牙利" #. 360 msgid "Indonesia" msgstr "印尼" #. 372 msgid "Ireland" msgstr "愛爾蘭" #. 376 msgid "Israel" msgstr "以色列" #. 833 msgid "Isle of Man" msgstr "曼島" #. 356 msgid "India" msgstr "印度" #. 086 msgid "British Indian Ocean Territory" msgstr "英屬印度洋地區" #. 368 msgid "Iraq" msgstr "伊拉克" #. 364 msgid "Iran, Islamic Republic of" msgstr "伊朗" #. 352 msgid "Iceland" msgstr "冰島" #. 380 msgid "Italy" msgstr "意大利" #. 832 msgid "Jersey" msgstr "澤西島" #. 388 msgid "Jamaica" msgstr "牙買加" #. 400 msgid "Jordan" msgstr "約旦" #. 392 msgid "Japan" msgstr "日本" #. 404 msgid "Kenya" msgstr "肯尼亞" #. 417 msgid "Kyrgyzstan" msgstr "吉爾吉斯" #. 116 msgid "Cambodia" msgstr "柬埔寨" #. 296 msgid "Kiribati" msgstr "基里巴斯" #. 174 msgid "Comoros" msgstr "科摩羅" #. 659 msgid "Saint Kitts and Nevis" msgstr "聖基茨和尼維斯聯邦" #. 408 msgid "Korea, Democratic People's Republic of" msgstr "北朝鲜" #. 410 msgid "Korea, Republic of" msgstr "南韓" #. 414 msgid "Kuwait" msgstr "科威特" #. 136 msgid "Cayman Islands" msgstr "開曼羣島" #. 398 msgid "Kazakhstan" msgstr "哈薩克" #. 418 msgid "Lao People's Democratic Republic" msgstr "老撾" #. 422 msgid "Lebanon" msgstr "黎巴嫩" #. 662 msgid "Saint Lucia" msgstr "聖盧西亞" #. 438 msgid "Liechtenstein" msgstr "列支敦士登" #. 144 msgid "Sri Lanka" msgstr "斯里蘭卡" #. 430 msgid "Liberia" msgstr "利比里亞" #. 426 msgid "Lesotho" msgstr "萊索托" #. 440 msgid "Lithuania" msgstr "立陶宛" #. 442 msgid "Luxembourg" msgstr "卢森堡" #. 428 msgid "Latvia" msgstr "拉脫維亞" #. 434 msgid "Libya" msgstr "" #. 504 msgid "Morocco" msgstr "摩洛哥" #. 492 msgid "Monaco" msgstr "摩納哥" #. 498 msgid "Moldova, Republic of" msgstr "摩爾多瓦" #. 499 msgid "Montenegro" msgstr "黑山" #. 663 msgid "Saint Martin (French part)" msgstr "法屬聖馬田" #. 450 msgid "Madagascar" msgstr "馬達加斯加" #. 584 msgid "Marshall Islands" msgstr "馬紹爾羣島" #. 807 msgid "Macedonia, the former Yugoslav Republic of" msgstr "馬其頓" #. 466 msgid "Mali" msgstr "馬里" #. 104 msgid "Myanmar" msgstr "緬甸" #. 496 msgid "Mongolia" msgstr "蒙古" #. 446 msgid "Macao" msgstr "澳門" #. 580 msgid "Northern Mariana Islands" msgstr "北馬里亞納羣島" #. 474 msgid "Martinique" msgstr "法屬馬丁尼克" #. 478 msgid "Mauritania" msgstr "毛里塔尼亞" #. 500 msgid "Montserrat" msgstr "蒙的塞拉特" #. 470 msgid "Malta" msgstr "馬耳他" #. 480 msgid "Mauritius" msgstr "毛里求斯" #. 462 msgid "Maldives" msgstr "马尔代夫" #. 454 msgid "Malawi" msgstr "馬拉維" #. 484 msgid "Mexico" msgstr "墨西哥" #. 458 msgid "Malaysia" msgstr "马來西亚" #. 508 msgid "Mozambique" msgstr "莫三鼻給" #. 516 msgid "Namibia" msgstr "纳米比亚" #. 540 msgid "New Caledonia" msgstr "新喀里多尼亞" #. 562 msgid "Niger" msgstr "尼日尔" #. 574 msgid "Norfolk Island" msgstr "諾福克羣島" #. 566 msgid "Nigeria" msgstr "尼日利亚" #. 558 msgid "Nicaragua" msgstr "尼加拉瓜" #. 528 msgid "Netherlands" msgstr "荷兰" #. 578 msgid "Norway" msgstr "挪威" #. 524 msgid "Nepal" msgstr "尼泊尔" #. 520 msgid "Nauru" msgstr "瑙魯" #. 570 msgid "Niue" msgstr "紐威島" #. 554 msgid "New Zealand" msgstr "新西兰" #. 512 msgid "Oman" msgstr "阿曼" #. 591 msgid "Panama" msgstr "巴拿馬" #. 604 msgid "Peru" msgstr "秘魯" #. 258 msgid "French Polynesia" msgstr "法屬玻利尼西亞" #. 598 msgid "Papua New Guinea" msgstr "巴布亞新畿內亞" #. 608 msgid "Philippines" msgstr "菲律賓" #. 586 msgid "Pakistan" msgstr "巴基斯坦" #. 616 msgid "Poland" msgstr "波兰" #. 666 msgid "Saint Pierre and Miquelon" msgstr "聖皮耶與密克隆羣島" #. 612 msgid "Pitcairn" msgstr "皮特康島" #. 630 msgid "Puerto Rico" msgstr "波多黎各" #. 275 msgid "Palestinian Territory, Occupied" msgstr "巴勒斯坦" #. 620 msgid "Portugal" msgstr "葡萄牙" #. 585 msgid "Palau" msgstr "帛琉羣島" #. 600 msgid "Paraguay" msgstr "巴拉圭" #. 634 msgid "Qatar" msgstr "卡塔尔" #. 638 msgid "Reunion" msgstr "留尼旺" #. 642 msgid "Romania" msgstr "罗马尼亚" #. 688 msgid "Serbia" msgstr "塞尔维亚" #. 643 msgid "Russian Federation" msgstr "俄罗斯" #. 646 msgid "Rwanda" msgstr "卢旺达" #. 682 msgid "Saudi Arabia" msgstr "沙特阿拉伯" #. 090 msgid "Solomon Islands" msgstr "所罗门群島" #. 690 msgid "Seychelles" msgstr "塞舌爾" #. 736 msgid "Sudan" msgstr "苏丹" #. 752 msgid "Sweden" msgstr "瑞典" #. 702 msgid "Singapore" msgstr "新加坡" #. 654 msgid "Saint Helena" msgstr "聖海倫娜島" #. 705 msgid "Slovenia" msgstr "斯洛文尼亞" #. 744 msgid "Svalbard and Jan Mayen" msgstr "斯瓦爾巴特和揚馬延島" #. 703 msgid "Slovakia" msgstr "斯洛伐克" #. 694 msgid "Sierra Leone" msgstr "塞拉利昂" #. 674 msgid "San Marino" msgstr "聖馬力諾" #. 686 msgid "Senegal" msgstr "塞內加爾" #. 706 msgid "Somalia" msgstr "索馬里" #. 740 msgid "Suriname" msgstr "蘇里南" #. 728 msgid "South Sudan" msgstr "" #. 678 msgid "Sao Tome and Principe" msgstr "聖多美和普林西比" #. 222 msgid "El Salvador" msgstr "薩爾瓦多" #. 534 msgid "Sint Maarten (Dutch part)" msgstr "" #. 760 msgid "Syrian Arab Republic" msgstr "敍利亞" #. 748 msgid "Swaziland" msgstr "斯威士兰" #. 796 msgid "Turks and Caicos Islands" msgstr "特克斯和凱科斯羣島" #. 148 msgid "Chad" msgstr "乍得" #. 260 msgid "French Southern Territories" msgstr "法屬南方領土" #. 768 msgid "Togo" msgstr "多哥" #. 764 msgid "Thailand" msgstr "泰國" #. 762 msgid "Tajikistan" msgstr "塔吉克斯坦" #. 772 msgid "Tokelau" msgstr "托克勞羣島" #. 626 msgid "Timor-Leste" msgstr "東帝汶" #. 795 msgid "Turkmenistan" msgstr "土庫曼" #. 788 msgid "Tunisia" msgstr "突尼斯" #. 776 msgid "Tonga" msgstr "汤加" #. 792 msgid "Turkey" msgstr "土耳其" #. 780 msgid "Trinidad and Tobago" msgstr "千里達" #. 798 msgid "Tuvalu" msgstr "圖瓦盧" #. 158 msgid "Taiwan, Province of China" msgstr "台湾" #. 834 msgid "Tanzania, United Republic of" msgstr "坦桑尼亞" #. 804 msgid "Ukraine" msgstr "乌克兰" #. 800 msgid "Uganda" msgstr "乌干达" #. 581 msgid "United States Minor Outlying Islands" msgstr "美屬邊疆羣島" #. 840 msgid "United States" msgstr "美國" #. 858 msgid "Uruguay" msgstr "乌拉圭" #. 860 msgid "Uzbekistan" msgstr "乌兹别克斯坦" #. 336 msgid "Holy See (Vatican City State)" msgstr "梵蒂岡" #. 670 msgid "Saint Vincent and the Grenadines" msgstr "聖文森特和格林納丁斯" #. 862 msgid "Venezuela" msgstr "委內瑞拉" #. 092 msgid "Virgin Islands, British" msgstr "處女羣島 (英屬)" #. 850 msgid "Virgin Islands, U.S." msgstr "處女羣島 (美屬)" #. 704 msgid "Viet Nam" msgstr "越南" #. 548 msgid "Vanuatu" msgstr "瓦努阿圖" #. 876 msgid "Wallis and Futuna" msgstr "瓦利斯及富圖納羣島" #. 882 msgid "Samoa" msgstr "Samoa (薩摩亞)" #. 887 msgid "Yemen" msgstr "也门" #. 175 msgid "Mayotte" msgstr "馬約特" #. 710 msgid "South Africa" msgstr "南非" #. 894 msgid "Zambia" msgstr "赞比亚" #. 716 msgid "Zimbabwe" msgstr "津巴布韦" msgid "* Unknown, add is_in tags to those cities" msgstr "" msgid "" "navit usage:\n" "navit [options] [configfile]\n" "\t-c : use as config file, instead of using the default file.\n" "\t-d : set the global debug output level to (0=error, 1=warning, " "2=info, 3=debug).\n" "\tSettings from config file will still take effect where they set a higher " "level.\n" "\t-h: print this usage info and exit.\n" "\t-v: print the version and exit.\n" msgstr "" #. We have not found an existing config file from all possibilities msgid "No config file navit.xml, navit.xml.local found\n" msgstr "" #, c-format msgid "Error parsing config file '%s': %s\n" msgstr "" #, c-format msgid "Using config file '%s'\n" msgstr "" #, c-format msgid "Error: No configuration found in config file '%s'\n" msgstr "" msgid "" "Internal initialization failed, exiting. Check previous error messages.\n" msgstr "" msgid "unknown street" msgstr "" #. Safe cast: attr_generic_set_attr does not modify its parameter. msgid "Unnamed vehicle" msgstr "" msgid "Failed to write bookmarks file" msgstr "" #. Strings from navit_shipped.xml msgid "Map Point" msgstr "" msgid "Car" msgstr "汽車" msgid "Iso2" msgstr "" msgid "Iso3" msgstr "" msgid "Country" msgstr "国家" msgid "Postal" msgstr "郵遞區號" msgid "Town" msgstr "城镇" msgid "District" msgstr "行政区" msgid "Street" msgstr "街" msgid "Number" msgstr "号" msgid "Enter Destination" msgstr "输入目的地" msgid "Zip Code" msgstr "邮政编码" msgid "City" msgstr "城市" msgid "District/Township" msgstr "區/鎮/鄉" msgid "Map" msgstr "地圖" msgid "Bookmark" msgstr "书签" msgid "Destination" msgstr "目的地" #. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). msgid "_Display" msgstr "显示" msgid "_Route" msgstr "路" msgid "_Former Destinations" msgstr "前一个目的地" msgid "_Bookmarks" msgstr "" msgid "_Map" msgstr "" msgid "_Layout" msgstr "" msgid "_Projection" msgstr "投影" msgid "_Vehicle" msgstr "机动车" msgid "Zoom_Out" msgstr "放大" msgid "Decrease zoom level" msgstr "減少放大層次" msgid "Zoom_In" msgstr "缩小" msgid "Increase zoom level" msgstr "增加放大層次" msgid "_Recalculate" msgstr "" msgid "Redraw map" msgstr "重畫地圖" msgid "_Info" msgstr "信息" msgid "Set _destination" msgstr "" msgid "Opens address search dialog" msgstr "" msgid "_POI search" msgstr "" msgid "Opens POI search dialog" msgstr "" msgid "_Stop Navigation" msgstr "停止浏览" msgid "Test" msgstr "测试" msgid "_Quit" msgstr "退出" msgid "Quit the application" msgstr "結束這個程式" msgid "Show position _cursor" msgstr "" msgid "_Lock on Road" msgstr "" msgid "_Keep orientation to the North" msgstr "" msgid "Switches map orientation to the north or the vehicle" msgstr "將地圖向着北面或車輛前進方向" msgid "_Roadbook" msgstr "" msgid "Show/hide route description" msgstr "顯示或隱藏路線說明" msgid "_Autozoom" msgstr "" msgid "Enable/disable automatic zoom level changing" msgstr "啟用或停用自動放大" msgid "_Fullscreen" msgstr "全屏" msgid "Data" msgstr "資料" msgid "Pharmacy" msgstr "" msgid "Restaurant" msgstr "" msgid "Restaurant. Fast food" msgstr "" msgid "Hotel" msgstr "" msgid "Car parking" msgstr "" msgid "Fuel station" msgstr "" msgid "Bank" msgstr "" msgid "Hospital" msgstr "" msgid "Cinema" msgstr "" msgid "Train station" msgstr "" msgid "School" msgstr "" msgid "Police" msgstr "" msgid "Justice" msgstr "" msgid "Taxi" msgstr "" msgid "Shopping" msgstr "" msgid "Distance from screen center (km)" msgstr "" #, c-format msgid "POI %s. %s" msgstr "" #, c-format msgid "Set destination to %ld, %ld \n" msgstr "" #, c-format msgid "Set map to %ld, %ld \n" msgstr "" #, c-format msgid "Set next visit to %ld, %ld \n" msgstr "" msgid "POI search" msgstr "" msgid "Select a category" msgstr "" msgid "Select a distance to look for (km)" msgstr "" msgid "Select a POI" msgstr "" msgid " " msgstr "" msgid "Category" msgstr "" msgid "Direction" msgstr "" msgid "Distance(m)" msgstr "" msgid "Name" msgstr "" msgid "Visit Before" msgstr "" msgid "N" msgstr "北" msgid "NE" msgstr "北偏东(东北)" msgid "E" msgstr "東" msgid "SE" msgstr "南偏东(东南)" msgid "S" msgstr "南" msgid "SW" msgstr "南偏西(西南)" msgid "W" msgstr "西" msgid "NW" msgstr "北偏西" #. Android resource: @strings/no msgid "No" msgstr "否" msgid "2D" msgstr "" msgid "3D" msgstr "" msgid "OT" msgstr "" #, c-format msgid "Route %4.0fkm %02d:%02d ETA" msgstr "路線 %4.0f千米 %02d:%02d ETA" msgid "Route 0000km 0+00:00 ETA" msgstr "路線 0000千米 0+00:00 ETA" msgid "Help" msgstr "" #, c-format msgid "Waypoint %s" msgstr "" msgid "Select waypoint to insert the new one before" msgstr "" msgid "View in Browser" msgstr "於瀏覽器檢視" msgid "Item type" msgstr "" #. Android resource: @strings/address_search_streets msgid "Streets" msgstr "街道" msgid "House numbers" msgstr "門牌號" msgid "View Attributes" msgstr "檢視屬性" msgid "Set as position (and deactivate vehicle)" msgstr "" msgid "POIs" msgstr "" msgid "View on map" msgstr "於地圖檢視" msgid "Remove search results from the map" msgstr "" msgid "Show results on the map" msgstr "" msgid "Cut Bookmark" msgstr "剪下書籤" msgid "Copy Bookmark" msgstr "複製書籤" msgid "Rename Bookmark" msgstr "更改書籤名稱" msgid "Paste Bookmark" msgstr "貼上書籤" msgid "Delete Bookmark" msgstr "刪除書籤" msgid "Delete waypoint" msgstr "" msgid "Bookmarks" msgstr "書籤" msgid "Bookmarks as waypoints" msgstr "" msgid "Save waypoints" msgstr "" msgid "Replace with waypoints" msgstr "" msgid "Delete Folder" msgstr "" #. Adds the Bookmark folders msgid "Add Bookmark folder" msgstr "添加書籤夾" #. Pastes the Bookmark msgid "Paste bookmark" msgstr "貼上書籤" #, c-format msgid "Bookmark %s" msgstr "書籤 %s" #, c-format msgid "Download %s" msgstr "" msgid "Map Download" msgstr "" msgid "Active" msgstr "" msgid "Download Enabled" msgstr "" msgid "Download completely" msgstr "" msgid "Show Satellite Status" msgstr "顯示衛星狀況" msgid " Elevation " msgstr "" msgid " Azimuth " msgstr " 方位角 " msgid "Show NMEA Data" msgstr "顯示 NMEA 資料" msgid "car" msgstr "汽車" msgid "bike" msgstr "單車" msgid "pedestrian" msgstr "行人" #, c-format msgid "Current profile: %s" msgstr "當前設定組合:%s" #, c-format msgid "Change profile to: %s" msgstr "將設定組合改為:%s" msgid "Set as active" msgstr "" msgid "Show Satellite status" msgstr "顯示衛星狀況" msgid "Show NMEA data" msgstr "顯示 NMEA 資料" msgid "Add Bookmark" msgstr "添加書籤" msgid "Rename" msgstr "改名" msgid "About Navit" msgstr "關於 Navit" #. Authors msgid "By" msgstr "" #. Contributors msgid "And all the Navit Team" msgstr "" msgid "members and contributors." msgstr "" msgid "Waypoints" msgstr "" msgid "Enter Coordinates" msgstr "" #. #. w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill) #. gui_internal_widget_append(wb, w) #. #. we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill) #. gui_internal_widget_append(w, we) msgid "Latitude Longitude" msgstr "" msgid "Enter coordinates, for example:" msgstr "" msgid "Vehicle" msgstr "机动车" msgid "Rules" msgstr "規則" msgid "Lock on road" msgstr "" msgid "Northing" msgstr "向北" msgid "Map follows Vehicle" msgstr "地圖跟隨車輛前進方向" msgid "Plan with Waypoints" msgstr "" msgid "Maps" msgstr "地圖" msgid "Layout" msgstr "" msgid "Height Profile" msgstr "" msgid "Route Description" msgstr "路線說明" msgid "Show Locale" msgstr "顯示地區" msgid "Former Destinations" msgstr "前一个目的地" msgid "- No former destinations available -" msgstr "" msgid "Message" msgstr "訊息" msgid "Back" msgstr "返回" msgid "Back to map" msgstr "返回地圖" msgid "Main Menu" msgstr "主選單" msgid "House number" msgstr "屋號" msgid "Next" msgstr "" msgid "Prev" msgstr "" msgid "Return to route!" msgstr "" #. warning told msgid "Look out! Camera!" msgstr "" #. warning told msgid "Please decrease your speed" msgstr "" msgid "partial match" msgstr "" #. Android resource: @strings/address_search_button msgid "Search" msgstr "" #. Android resource: @strings/address_search_towns msgid "Towns" msgstr "" #. Android resource: @strings/position_popup_drive_here msgid "Route to here" msgstr "" msgid "Map data (c) OpenStreetMap contributors, ODBL" msgstr "" msgid "" "Current map location %s is not available\n" "Please restart Navit after you attach an SD card or select a different map " "location." msgstr "" msgid "Downloaded maps" msgstr "" msgid "" "Sorry, we currently do not support maps above 3.8G on Android, please select " "a smaller one." msgstr "" msgid "Cancel" msgstr "" msgid "filenamePath" msgstr "" msgid "" "New location set to %s\n" "Restart Navit to apply the changes." msgstr "" msgid "Whole Planet" msgstr "" msgid "Africa" msgstr "" msgid "Canary Islands" msgstr "" msgid "Asia" msgstr "" msgid "Korea" msgstr "" msgid "Taiwan" msgstr "" msgid "UAE+Other" msgstr "" msgid "Oceania" msgstr "" msgid "Tasmania" msgstr "" msgid "Victoria" msgstr "" msgid "New South Wales" msgstr "" msgid "Europe" msgstr "" msgid "Western Europe" msgstr "" msgid "Azores" msgstr "" msgid "BeNeLux" msgstr "" msgid "Alsace" msgstr "" msgid "Aquitaine" msgstr "" msgid "Auvergne" msgstr "" msgid "Basse-Normandie" msgstr "" msgid "Bourgogne" msgstr "" msgid "Bretagne" msgstr "" msgid "Centre" msgstr "" msgid "Champagne-Ardenne" msgstr "" msgid "Corse" msgstr "" msgid "Franche-Comte" msgstr "" msgid "Haute-Normandie" msgstr "" msgid "Ile-de-France" msgstr "" msgid "Languedoc-Roussillon" msgstr "" msgid "Limousin" msgstr "" msgid "Lorraine" msgstr "" msgid "Midi-Pyrenees" msgstr "" msgid "Nord-pas-de-Calais" msgstr "" msgid "Pays-de-la-Loire" msgstr "" msgid "Picardie" msgstr "" msgid "Poitou-Charentes" msgstr "" msgid "Provence-Alpes-Cote-d-Azur" msgstr "" msgid "Rhone-Alpes" msgstr "" msgid "Baden-Wuerttemberg" msgstr "" msgid "Bayern" msgstr "" msgid "Mittelfranken" msgstr "" msgid "Niederbayern" msgstr "" msgid "Oberbayern" msgstr "" msgid "Oberfranken" msgstr "" msgid "Oberpfalz" msgstr "" msgid "Schwaben" msgstr "" msgid "Unterfranken" msgstr "" msgid "Berlin" msgstr "" msgid "Brandenburg" msgstr "" msgid "Bremen" msgstr "" msgid "Hamburg" msgstr "" msgid "Hessen" msgstr "" msgid "Mecklenburg-Vorpommern" msgstr "" msgid "Niedersachsen" msgstr "" msgid "Nordrhein-westfalen" msgstr "" msgid "Rheinland-Pfalz" msgstr "" msgid "Saarland" msgstr "" msgid "Sachsen-Anhalt" msgstr "" msgid "Sachsen" msgstr "" msgid "Schleswig-Holstein" msgstr "" msgid "Thueringen" msgstr "" msgid "Mallorca" msgstr "" msgid "Galicia" msgstr "" msgid "Scandinavia" msgstr "" msgid "England" msgstr "" msgid "Buckinghamshire" msgstr "" msgid "Cambridgeshire" msgstr "" msgid "Cumbria" msgstr "" msgid "East yorkshire with hull" msgstr "" msgid "Essex" msgstr "" msgid "Herefordshire" msgstr "" msgid "Kent" msgstr "" msgid "Lancashire" msgstr "" msgid "Leicestershire" msgstr "" msgid "Norfolk" msgstr "" msgid "Nottinghamshire" msgstr "" msgid "Oxfordshire" msgstr "" msgid "Shropshire" msgstr "" msgid "Somerset" msgstr "" msgid "South yorkshire" msgstr "" msgid "Suffolk" msgstr "" msgid "Surrey" msgstr "" msgid "Wiltshire" msgstr "" msgid "Scotland" msgstr "" msgid "Wales" msgstr "" msgid "Crete" msgstr "" msgid "North America" msgstr "" msgid "Alaska" msgstr "" msgid "Hawaii" msgstr "" msgid "USA" msgstr "" msgid " (except Alaska and Hawaii)" msgstr "" msgid "Midwest" msgstr "" msgid "Michigan" msgstr "" msgid "Ohio" msgstr "" msgid "Northeast" msgstr "" msgid "Massachusetts" msgstr "" msgid "Vermont" msgstr "" msgid "Pacific" msgstr "" msgid "South" msgstr "" msgid "Arkansas" msgstr "" msgid "District of Columbia" msgstr "" msgid "Florida" msgstr "" msgid "Louisiana" msgstr "" msgid "Maryland" msgstr "" msgid "Mississippi" msgstr "" msgid "Oklahoma" msgstr "" msgid "Texas" msgstr "" msgid "Virginia" msgstr "" msgid "West Virginia" msgstr "" msgid "West" msgstr "" msgid "Arizona" msgstr "" msgid "California" msgstr "" msgid "Colorado" msgstr "" msgid "Idaho" msgstr "" msgid "Montana" msgstr "" msgid "New Mexico" msgstr "" msgid "Nevada" msgstr "" msgid "Oregon" msgstr "" msgid "Utah" msgstr "" msgid "Washington State" msgstr "" msgid "South+Middle America" msgstr "" msgid "Guyane Francaise" msgstr "" msgid "downloading" msgstr "" #. Android resource: @strings/map_download_ready msgid "ready" msgstr "" msgid "Media selected for map storage is not available" msgstr "" #. Android resource: @strings/map_download_not_enough_free_space msgid "Not enough free space" msgstr "" msgid "Error downloading map!" msgstr "" msgid "Error writing map!" msgstr "" msgid "Map download aborted!" msgstr "" #. Android resource: @strings/map_download_eta msgid "ETA" msgstr "" #. Android resource: @strings/map_download_title msgid "Map download" msgstr "" msgid "Vehicle Position" msgstr "車輛位置" msgid "Main menu" msgstr "主選單" msgid "" "Show\n" "Map" msgstr "" "顯示\n" "地圖" msgid "Settings" msgstr "設定" msgid "Tools" msgstr "工具" msgid "Route" msgstr "路" msgid "About" msgstr "關於" msgid "Quit" msgstr "結束" msgid "Actions" msgstr "行動" msgid "" "Former\n" "Destinations" msgstr "" msgid "Coordinates" msgstr "" msgid "" "Stop\n" "Navigation" msgstr "" "停止\n" "導航" msgid "Display" msgstr "显示" msgid "Fullscreen" msgstr "全屏" msgid "Window Mode" msgstr "視窗模式" msgid "Description" msgstr "說明" msgid "" "Drop last \n" "Waypoint" msgstr "" msgid "" "Drop next \n" "Waypoint" msgstr "" msgid "Satellite Status" msgstr "" msgid "NMEA Data" msgstr "" msgid "car_shortest" msgstr "" msgid "car_avoid_tolls" msgstr "" msgid "car_pedantic" msgstr "" msgid "horse" msgstr "馬" msgid "Truck" msgstr "" #. Strings from android/res/values/strings.xml #. Android resource: @strings/yes msgid "Yes" msgstr "" #. Android resource: @strings/notification_ticker msgid "Navit started" msgstr "" #. Android resource: @strings/notification_event_default msgid "Navit running" msgstr "" #. Android resource: @strings/initial_info_box_title msgid "Welcome to Navit" msgstr "" #. Android resource: @strings/initial_info_box_message msgid "" "Thank you for installing Navit!\n" "\n" "To start, select \"Download maps\" from the menu to download a map. Note: " "The map filesize may be large (>50MB) - a wifi connection is recommended.\n" "\n" "Mapdata: (c) OpenStreetMap contributors\n" "\n" "Enjoy Navit!" msgstr "" #. Android resource: @strings/initial_info_box_OK msgid "OK" msgstr "" #. Android resource: @strings/initial_info_box_more_info msgid "More info" msgstr "" #. Android resource: @strings/optionsmenu_zoom_in msgid "Zoom in" msgstr "" #. Android resource: @strings/optionsmenu_zoom_out msgid "Zoom out" msgstr "" #. Android resource: @strings/optionsmenu_download_maps msgid "Download maps" msgstr "" #. Android resource: @strings/optionsmenu_toggle_poi msgid "Toggle POIs" msgstr "" #. Android resource: @strings/optionsmenu_exit_navit msgid "Exit Navit" msgstr "" #. Android resource: @strings/optionsmenu_backup_restore msgid "Backup / Restore" msgstr "" #. Android resource: @strings/optionsmenu_set_map_location msgid "Set map location" msgstr "" #. Android resource: @strings/map_delete msgid "Delete this map?" msgstr "" #. Android resource: @strings/map_download_downloading msgid "Downloading:" msgstr "" #. Android resource: @strings/map_download_download_error msgid "Error downloading map." msgstr "" #. Android resource: @strings/map_download_download_aborted msgid "Map download aborted" msgstr "" #. Android resource: @strings/map_no_fix msgid "No location. Reopen after location fix." msgstr "" #. Android resource: @strings/maps_for_current_location msgid "Maps containing current location" msgstr "" #. Android resource: @strings/address_search_title msgid "Address search" msgstr "" #. Android resource: @strings/address_enter_destination msgid "Enter destination" msgstr "" #. Android resource: @strings/address_partial_match msgid "Match partial address" msgstr "" #. Android resource: @strings/address_search_searching msgid "Searching..." msgstr "" #. Android resource: @strings/address_search_not_found msgid "Address not found" msgstr "" #. Android resource: @strings/address_search_getting_results msgid "Getting search results" msgstr "" #. Android resource: @strings/address_search_loading_results msgid "Loading search results" msgstr "" #. Android resource: @strings/address_search_no_results msgid "No results found" msgstr "" #. Android resource: @strings/address_search_no_text_entered msgid "No text entered" msgstr "" #. Android resource: @strings/address_search_set_destination msgid "Setting destination to:" msgstr "" #. Android resource: @strings/choose_an_action msgid "Choose an action" msgstr "" #. Android resource: @strings/please_insert_an_sd_card msgid "Please insert an SD Card" msgstr "" #. Android resource: @strings/backing_up msgid "Backing up..." msgstr "" #. Android resource: @strings/restoring msgid "Restoring..." msgstr "" #. Android resource: @strings/failed_to_create_backup_directory msgid "Failed to create backup directory" msgstr "" #. Android resource: @strings/backup_failed msgid "Backup failed" msgstr "" #. Android resource: @strings/no_backup_found msgid "No backup found" msgstr "" #. Android resource: @strings/failed_to_restore msgid "Failed to restore" msgstr "" #. Android resource: @strings/backup_successful msgid "Backup successful" msgstr "" #. Android resource: @strings/restore_successful_please_restart_navit msgid "" "Restore Successful\n" "Please restart Navit" msgstr "" #. Android resource: @strings/backup_not_found msgid "Backup not found" msgstr "" #. Android resource: @strings/restore_failed msgid "Restore failed" msgstr "" #. Android resource: @strings/select_backup msgid "Select backup" msgstr "" #. Android resource: @strings/backup msgid "Backup" msgstr "" #. Android resource: @strings/restore msgid "Restore" msgstr "" #. Android resource: @strings/TTS_title_data_missing msgid "System text to speech engine data is missing" msgstr "" #. Android resource: @strings/TTS_qery_install_data msgid "" "Navit can use any text to speech engine installed on your device. The " "currently selected engine reports it is unable to speak in your language. " "Should we ask the system to show voice download dialog?" msgstr "" #, c-format #~ msgid "then leave the roundabout at the %1$s %2$s" #~ msgstr "然後在 %1$s %2$s 離開迴旋處"